summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore11
-rw-r--r--ChangeLog.21156
-rw-r--r--Makefile.in50
-rw-r--r--admin/charsets/cp51932.awk2
-rw-r--r--admin/charsets/eucjp-ms.awk2
-rw-r--r--admin/notes/hydra2
-rw-r--r--admin/notes/unicode8
-rwxr-xr-xadmin/update_autogen16
-rwxr-xr-xbuild-aux/gitlog-to-changelog5
-rwxr-xr-xbuild-aux/gitlog-to-emacslog53
-rw-r--r--configure.ac33
-rw-r--r--doc/emacs/Makefile.in1
-rw-r--r--doc/emacs/docstyle.texi10
-rw-r--r--doc/emacs/emacs-xtra.texi3
-rw-r--r--doc/emacs/emacs.texi5
-rw-r--r--doc/emacs/maintaining.texi36
-rw-r--r--doc/emacs/mule.texi7
-rw-r--r--doc/lispintro/Makefile.in4
-rw-r--r--doc/lispintro/emacs-lisp-intro.texi2
-rw-r--r--doc/lispref/Makefile.in3
-rw-r--r--doc/lispref/back.texi2
-rw-r--r--doc/lispref/book-spine.texi2
-rw-r--r--doc/lispref/debugging.texi1
-rw-r--r--doc/lispref/elisp.texi3
-rw-r--r--doc/lispref/keymaps.texi6
-rw-r--r--doc/lispref/lay-flat.texi2
-rw-r--r--doc/lispref/modes.texi6
-rw-r--r--doc/lispref/nonascii.texi4
-rw-r--r--doc/lispref/objects.texi10
-rw-r--r--doc/lispref/positions.texi8
-rw-r--r--doc/lispref/sequences.texi38
-rw-r--r--doc/misc/Makefile.in18
-rw-r--r--doc/misc/ada-mode.texi2
-rw-r--r--doc/misc/auth.texi2
-rw-r--r--doc/misc/autotype.texi2
-rw-r--r--doc/misc/bovine.texi2
-rw-r--r--doc/misc/calc.texi24
-rw-r--r--doc/misc/cc-mode.texi2
-rw-r--r--doc/misc/cl.texi2
-rw-r--r--doc/misc/dbus.texi4
-rw-r--r--doc/misc/dired-x.texi2
-rw-r--r--doc/misc/ebrowse.texi2
-rw-r--r--doc/misc/ede.texi2
-rw-r--r--doc/misc/ediff.texi6
-rw-r--r--doc/misc/edt.texi2
-rw-r--r--doc/misc/efaq-w32.texi4
-rw-r--r--doc/misc/efaq.texi2
-rw-r--r--doc/misc/eieio.texi2
-rw-r--r--doc/misc/emacs-gnutls.texi2
-rw-r--r--doc/misc/emacs-mime.texi2
-rw-r--r--doc/misc/epa.texi2
-rw-r--r--doc/misc/erc.texi2
-rw-r--r--doc/misc/ert.texi2
-rw-r--r--doc/misc/eshell.texi2
-rw-r--r--doc/misc/eudc.texi2
-rw-r--r--doc/misc/eww.texi2
-rw-r--r--doc/misc/flymake.texi2
-rw-r--r--doc/misc/forms.texi2
-rw-r--r--doc/misc/gnus-coding.texi2
-rw-r--r--doc/misc/gnus-faq.texi2
-rw-r--r--doc/misc/gnus.texi11
-rw-r--r--doc/misc/htmlfontify.texi2
-rw-r--r--doc/misc/idlwave.texi2
-rw-r--r--doc/misc/ido.texi2
-rw-r--r--doc/misc/info.texi2
-rw-r--r--doc/misc/mairix-el.texi3
-rw-r--r--doc/misc/message.texi2
-rw-r--r--doc/misc/mh-e.texi2
-rw-r--r--doc/misc/newsticker.texi2
-rw-r--r--doc/misc/nxml-mode.texi2
-rw-r--r--doc/misc/octave-mode.texi2
-rw-r--r--doc/misc/org.texi6
-rw-r--r--doc/misc/pcl-cvs.texi2
-rw-r--r--doc/misc/pgg.texi3
-rw-r--r--doc/misc/rcirc.texi2
-rw-r--r--doc/misc/reftex.texi2
-rw-r--r--doc/misc/remember.texi4
-rw-r--r--doc/misc/sasl.texi3
-rw-r--r--doc/misc/sc.texi2
-rw-r--r--doc/misc/semantic.texi2
-rw-r--r--doc/misc/ses.texi2
-rw-r--r--doc/misc/sieve.texi2
-rw-r--r--doc/misc/smtpmail.texi2
-rw-r--r--doc/misc/speedbar.texi2
-rw-r--r--doc/misc/srecode.texi2
-rw-r--r--doc/misc/texinfo.tex45
-rw-r--r--doc/misc/todo-mode.texi2
-rw-r--r--doc/misc/tramp.texi6
-rw-r--r--doc/misc/url.texi3
-rw-r--r--doc/misc/vhdl-mode.texi2
-rw-r--r--doc/misc/vip.texi3
-rw-r--r--doc/misc/viper.texi3
-rw-r--r--doc/misc/widget.texi2
-rw-r--r--doc/misc/wisent.texi2
-rw-r--r--doc/misc/woman.texi2
-rw-r--r--etc/NEWS49
-rw-r--r--etc/refcards/cs-dired-ref.tex2
-rw-r--r--etc/refcards/cs-refcard.tex2
-rw-r--r--etc/refcards/cs-survival.tex2
-rw-r--r--etc/refcards/sk-dired-ref.tex2
-rw-r--r--etc/refcards/sk-refcard.tex2
-rw-r--r--etc/refcards/sk-survival.tex2
-rw-r--r--etc/themes/tsdh-light-theme.el3
-rw-r--r--lib-src/etags.c26
-rw-r--r--lisp/allout.el4
-rw-r--r--lisp/calc/calc.el1
-rw-r--r--lisp/cedet/ede.el2
-rw-r--r--lisp/cedet/ede/config.el8
-rw-r--r--lisp/cedet/ede/generic.el2
-rw-r--r--lisp/cedet/ede/locate.el2
-rw-r--r--lisp/cedet/pulse.el76
-rw-r--r--lisp/cedet/semantic/bovine/c.el4
-rw-r--r--lisp/cedet/semantic/bovine/gcc.el15
-rw-r--r--lisp/cedet/semantic/db-el.el10
-rw-r--r--lisp/cedet/semantic/grammar.el90
-rw-r--r--lisp/cedet/semantic/symref.el8
-rw-r--r--lisp/cedet/semantic/symref/grep.el62
-rw-r--r--lisp/cedet/semantic/symref/idutils.el2
-rw-r--r--lisp/cedet/semantic/symref/list.el10
-rw-r--r--lisp/cedet/srecode/compile.el17
-rw-r--r--lisp/cedet/srecode/dictionary.el4
-rw-r--r--lisp/cedet/srecode/insert.el52
-rw-r--r--lisp/cus-start.el1
-rw-r--r--lisp/dired-aux.el3
-rw-r--r--lisp/dired.el2
-rw-r--r--lisp/dom.el1
-rw-r--r--lisp/emacs-lisp/bytecomp.el80
-rw-r--r--lisp/emacs-lisp/chart.el4
-rw-r--r--lisp/emacs-lisp/check-declare.el7
-rw-r--r--lisp/emacs-lisp/cl-generic.el270
-rw-r--r--lisp/emacs-lisp/cl-lib.el7
-rw-r--r--lisp/emacs-lisp/cl-seq.el2
-rw-r--r--lisp/emacs-lisp/cl.el3
-rw-r--r--lisp/emacs-lisp/debug.el3
-rw-r--r--lisp/emacs-lisp/eieio-core.el24
-rw-r--r--lisp/emacs-lisp/eieio-custom.el14
-rw-r--r--lisp/emacs-lisp/eieio-opt.el3
-rw-r--r--lisp/emacs-lisp/eieio.el4
-rw-r--r--lisp/emacs-lisp/eldoc.el27
-rw-r--r--lisp/emacs-lisp/ert.el6
-rw-r--r--lisp/emacs-lisp/lisp.el15
-rw-r--r--lisp/emacs-lisp/package-x.el1
-rw-r--r--lisp/emacs-lisp/package.el274
-rw-r--r--lisp/emacs-lisp/pcase.el10
-rw-r--r--lisp/emacs-lisp/seq.el104
-rw-r--r--lisp/emacs-lisp/subr-x.el3
-rw-r--r--lisp/emacs-lisp/tabulated-list.el30
-rw-r--r--lisp/emacs-lisp/testcover.el27
-rw-r--r--lisp/emulation/cua-base.el2
-rw-r--r--lisp/eshell/em-cmpl.el10
-rw-r--r--lisp/eshell/esh-ext.el17
-rw-r--r--lisp/ffap.el2
-rw-r--r--lisp/files.el12
-rw-r--r--lisp/foldout.el24
-rw-r--r--lisp/font-lock.el2
-rw-r--r--lisp/frame.el1
-rw-r--r--lisp/gnus/gnus-art.el3
-rw-r--r--lisp/gnus/gnus-async.el3
-rw-r--r--lisp/gnus/gnus-sync.el9
-rw-r--r--lisp/gnus/gnus-util.el4
-rw-r--r--lisp/gnus/message.el4
-rw-r--r--lisp/gnus/mm-archive.el5
-rw-r--r--lisp/gnus/mm-decode.el2
-rw-r--r--lisp/gnus/mm-util.el9
-rw-r--r--lisp/gnus/mm-view.el2
-rw-r--r--lisp/gnus/mml-smime.el43
-rw-r--r--lisp/gnus/mml.el2
-rw-r--r--lisp/gnus/nnir.el23
-rw-r--r--lisp/gnus/nnmail.el3
-rw-r--r--lisp/gnus/nnrss.el2
-rw-r--r--lisp/gnus/spam.el9
-rw-r--r--lisp/help-fns.el5
-rw-r--r--lisp/help-mode.el2
-rw-r--r--lisp/help.el3
-rw-r--r--lisp/info.el43
-rw-r--r--lisp/international/cp51932.el2
-rw-r--r--lisp/international/eucjp-ms.el2
-rw-r--r--lisp/international/iso-transl.el31
-rw-r--r--lisp/international/mule-cmds.el10
-rw-r--r--lisp/international/quail.el3
-rw-r--r--lisp/international/robin.el2
-rw-r--r--lisp/isearch.el6
-rw-r--r--lisp/language/ethio-util.el2
-rw-r--r--lisp/language/japanese.el4
-rw-r--r--lisp/ldefs-boot.el2433
-rw-r--r--lisp/linum.el3
-rw-r--r--lisp/loadup.el35
-rw-r--r--lisp/mail/rmail.el142
-rw-r--r--lisp/mail/rmailedit.el2
-rw-r--r--lisp/mail/rmailmm.el14
-rw-r--r--lisp/mail/rmailsum.el37
-rw-r--r--lisp/midnight.el95
-rw-r--r--lisp/mouse-copy.el4
-rw-r--r--lisp/net/eudc-vars.el6
-rw-r--r--lisp/net/eww.el2
-rw-r--r--lisp/net/mairix.el43
-rw-r--r--lisp/net/net-utils.el2
-rw-r--r--lisp/net/nsm.el5
-rw-r--r--lisp/net/rcirc.el34
-rw-r--r--lisp/net/secrets.el10
-rw-r--r--lisp/net/shr.el34
-rw-r--r--lisp/obsolete/mouse-sel.el2
-rw-r--r--lisp/org/org-list.el68
-rw-r--r--lisp/org/org-macs.el55
-rw-r--r--lisp/org/ox-ascii.el2
-rw-r--r--lisp/play/dunnet.el2
-rw-r--r--lisp/play/gametree.el12
-rw-r--r--lisp/progmodes/cc-awk.el1
-rw-r--r--lisp/progmodes/cc-cmds.el3
-rw-r--r--lisp/progmodes/cmacexp.el4
-rw-r--r--lisp/progmodes/elisp-mode.el143
-rw-r--r--lisp/progmodes/etags.el23
-rw-r--r--lisp/progmodes/idlw-shell.el14
-rw-r--r--lisp/progmodes/js.el4
-rw-r--r--lisp/progmodes/python.el3
-rw-r--r--lisp/progmodes/tcl.el3
-rw-r--r--lisp/progmodes/verilog-mode.el282
-rw-r--r--lisp/progmodes/xref.el181
-rw-r--r--lisp/saveplace.el71
-rw-r--r--lisp/simple.el50
-rw-r--r--lisp/subr.el21
-rw-r--r--lisp/term/common-win.el2
-rw-r--r--lisp/term/ns-win.el15
-rw-r--r--lisp/term/rxvt.el142
-rw-r--r--lisp/term/screen.el17
-rw-r--r--lisp/term/x-win.el12
-rw-r--r--lisp/term/xterm.el175
-rw-r--r--lisp/textmodes/bibtex.el2
-rw-r--r--lisp/textmodes/ispell.el21
-rw-r--r--lisp/textmodes/reftex-cite.el9
-rw-r--r--lisp/textmodes/reftex-toc.el145
-rw-r--r--lisp/textmodes/reftex.el4
-rw-r--r--lisp/textmodes/sgml-mode.el43
-rw-r--r--lisp/textmodes/text-mode.el3
-rw-r--r--lisp/url/url-handlers.el4
-rw-r--r--lisp/url/url-http.el2
-rw-r--r--lisp/vc/ediff-util.el2
-rw-r--r--lisp/vc/log-edit.el32
-rw-r--r--lisp/vc/vc-bzr.el52
-rw-r--r--lisp/vc/vc-cvs.el2
-rw-r--r--lisp/vc/vc-dir.el10
-rw-r--r--lisp/vc/vc-git.el77
-rw-r--r--lisp/vc/vc-hg.el83
-rw-r--r--lisp/vc/vc-hooks.el6
-rw-r--r--lisp/vc/vc-mtn.el2
-rw-r--r--lisp/vc/vc-rcs.el2
-rw-r--r--lisp/vc/vc.el36
-rw-r--r--lisp/w32-fns.el2
-rw-r--r--lisp/whitespace.el53
-rw-r--r--lisp/window.el6
-rw-r--r--lwlib/Makefile.in20
-rw-r--r--lwlib/autodeps.mk5
-rw-r--r--lwlib/deps.mk2
-rw-r--r--m4/acl.m424
-rw-r--r--m4/extern-inline.m45
-rwxr-xr-xmake-dist20
-rw-r--r--oldXMenu/Makefile.in20
-rw-r--r--oldXMenu/autodeps.mk5
-rw-r--r--oldXMenu/deps.mk2
-rw-r--r--src/Makefile.in77
-rw-r--r--src/alloc.c4
-rw-r--r--src/autodeps.mk5
-rw-r--r--src/buffer.c92
-rw-r--r--src/buffer.h188
-rw-r--r--src/category.c2
-rw-r--r--src/cmds.c2
-rw-r--r--src/deps.mk2
-rw-r--r--src/editfns.c10
-rw-r--r--src/filelock.c49
-rw-r--r--src/gtkutil.c90
-rw-r--r--src/image.c4
-rw-r--r--src/keyboard.c28
-rw-r--r--src/keyboard.h52
-rw-r--r--src/lisp.h4
-rw-r--r--src/lisp.mk174
-rw-r--r--src/lread.c6
-rw-r--r--src/macfont.h6
-rw-r--r--src/nsfns.m31
-rw-r--r--src/nsimage.m104
-rw-r--r--src/nsmenu.m6
-rw-r--r--src/nsterm.h9
-rw-r--r--src/nsterm.m211
-rw-r--r--src/process.c4
-rw-r--r--src/syntax.c2
-rw-r--r--src/window.c6
-rw-r--r--src/xdisp.c11
-rw-r--r--src/xterm.c15
-rw-r--r--test/automated/cl-generic-tests.el10
-rw-r--r--test/automated/cl-lib-tests.el41
-rw-r--r--test/automated/elisp-mode-tests.el129
-rw-r--r--test/automated/package-test.el7
-rw-r--r--test/automated/seq-tests.el21
-rw-r--r--test/etags/CTAGS.good4530
-rw-r--r--test/etags/ETAGS.good_14216
-rw-r--r--test/etags/ETAGS.good_24842
-rw-r--r--test/etags/ETAGS.good_34611
-rw-r--r--test/etags/ETAGS.good_44380
-rw-r--r--test/etags/ETAGS.good_55401
-rw-r--r--test/etags/Makefile79
-rw-r--r--test/etags/a-src/empty.zz0
-rw-r--r--test/etags/a-src/empty.zz.gz0
-rw-r--r--test/etags/ada-src/2ataspri.adb665
-rw-r--r--test/etags/ada-src/2ataspri.ads298
-rw-r--r--test/etags/ada-src/etags-test-for.ada193
-rw-r--r--test/etags/ada-src/waroquiers.ada153
-rw-r--r--test/etags/c-src/a/b/b.c5
-rw-r--r--test/etags/c-src/abbrev.c616
-rw-r--r--test/etags/c-src/c.c169
-rw-r--r--test/etags/c-src/dostorture.c107
-rw-r--r--test/etags/c-src/emacs/src/gmalloc.c2040
-rw-r--r--test/etags/c-src/emacs/src/keyboard.c11960
-rw-r--r--test/etags/c-src/emacs/src/lisp.h4817
-rw-r--r--test/etags/c-src/emacs/src/regex.h630
-rw-r--r--test/etags/c-src/etags.c6563
-rw-r--r--test/etags/c-src/exit.c77
-rw-r--r--test/etags/c-src/exit.strange_suffix77
-rw-r--r--test/etags/c-src/fail.c1
-rw-r--r--test/etags/c-src/getopt.h125
-rw-r--r--test/etags/c-src/h.h119
-rw-r--r--test/etags/c-src/machsyscalls.c10
-rw-r--r--test/etags/c-src/machsyscalls.h31
-rw-r--r--test/etags/c-src/sysdep.h57
-rw-r--r--test/etags/c-src/tab.c112
-rw-r--r--test/etags/c-src/torture.c107
-rw-r--r--test/etags/cp-src/MDiagArray2.h163
-rw-r--r--test/etags/cp-src/Range.h96
-rw-r--r--test/etags/cp-src/burton.cpp14
-rw-r--r--test/etags/cp-src/c.C156
-rw-r--r--test/etags/cp-src/clheir.cpp.gzbin0 -> 408 bytes
-rw-r--r--test/etags/cp-src/clheir.hpp82
-rw-r--r--test/etags/cp-src/conway.cpp95
-rw-r--r--test/etags/cp-src/conway.hpp23
-rw-r--r--test/etags/cp-src/fail.C52
-rw-r--r--test/etags/cp-src/functions.cpp239
-rw-r--r--test/etags/cp-src/screen.cpp62
-rw-r--r--test/etags/cp-src/screen.hpp39
-rw-r--r--test/etags/el-src/TAGTEST.EL31
-rw-r--r--test/etags/el-src/emacs/lisp/progmodes/etags.el2153
-rw-r--r--test/etags/erl-src/gs_dialog.erl271
-rw-r--r--test/etags/f-src/entry.for581
-rw-r--r--test/etags/f-src/entry.strange.gzbin0 -> 3265 bytes
-rw-r--r--test/etags/f-src/entry.strange_suffix581
-rw-r--r--test/etags/forth-src/test-forth.fth53
-rw-r--r--test/etags/html-src/algrthms.html519
-rw-r--r--test/etags/html-src/index.shtml70
-rw-r--r--test/etags/html-src/software.html241
-rw-r--r--test/etags/html-src/softwarelibero.html313
-rw-r--r--test/etags/lua-src/allegro.lua282
-rw-r--r--test/etags/make-src/Makefile226
-rw-r--r--test/etags/objc-src/PackInsp.h120
-rw-r--r--test/etags/objc-src/PackInsp.m505
-rw-r--r--test/etags/objc-src/Subprocess.h81
-rw-r--r--test/etags/objc-src/Subprocess.m343
-rw-r--r--test/etags/objcpp-src/SimpleCalc.H49
-rw-r--r--test/etags/objcpp-src/SimpleCalc.M207
-rw-r--r--test/etags/pas-src/common.pas1545
-rw-r--r--test/etags/perl-src/htlmify-cystic382
-rw-r--r--test/etags/perl-src/kai-test.pl39
-rw-r--r--test/etags/perl-src/yagrip.pl54
-rw-r--r--test/etags/php-src/lce_functions.php699
-rw-r--r--test/etags/php-src/ptest.php18
-rw-r--r--test/etags/php-src/sendmail.php527
-rw-r--r--test/etags/prol-src/natded.prolog1545
-rw-r--r--test/etags/prol-src/ordsets.prolog337
-rw-r--r--test/etags/ps-src/rfc1245.ps2085
-rw-r--r--test/etags/pyt-src/server.py819
-rw-r--r--test/etags/tex-src/gzip.texi479
-rw-r--r--test/etags/tex-src/nonewline.tex1
-rw-r--r--test/etags/tex-src/testenv.tex15
-rw-r--r--test/etags/tex-src/texinfo.tex3350
-rw-r--r--test/etags/y-src/atest.y5
-rw-r--r--test/etags/y-src/cccp.c2202
-rw-r--r--test/etags/y-src/cccp.y1006
-rw-r--r--test/etags/y-src/parse.c2236
-rw-r--r--test/etags/y-src/parse.y875
375 files changed, 88949 insertions, 3644 deletions
diff --git a/.gitignore b/.gitignore
index 9d32e6bafc4..618249c8def 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,11 +39,13 @@ src/config.in
Info.plist
InfoPlist.strings
Makefile
+makefile
!admin/charsets/Makefile
!etc/refcards/Makefile
!test/automated/data/flymake/Makefile
!test/indent/Makefile
-makefile
+!test/etags/Makefile
+!test/etags/make-src/Makefile
/*.cache
/confdefs.h
/config.status
@@ -74,6 +76,7 @@ lib/unistd.h
lib/warn-on-use.h
src/buildobj.h
src/globals.h
+src/lisp.mk
# Lisp-level sources built by 'make'.
*cus-load.el
@@ -145,6 +148,10 @@ src/*.map
# Tests.
test/indent/*.new
test/biditest.txt
+test/etags/srclist
+test/etags/regexfile
+test/etags/ETAGS
+test/etags/CTAGS
# ctags, etags.
TAGS
@@ -200,6 +207,7 @@ lisp/international/uni-*.el
*.fn
*.fns
*.html
+!test/etags/html-src/*.html
*.info
*.ky
*.kys
@@ -215,6 +223,7 @@ lisp/international/uni-*.el
*.pj
*.pjs
*.ps
+!test/etags/ps-src/*.ps
*.sc
*.scs
*.t2d/
diff --git a/ChangeLog.2 b/ChangeLog.2
index 188e3ff5873..d1c9477f146 100644
--- a/ChangeLog.2
+++ b/ChangeLog.2
@@ -1,3 +1,1159 @@
+2015-05-09 Eli Zaretskii <eliz@gnu.org>
+
+ Avoid infloop in ERC
+ * lisp/simple.el (line-move-to-column): Ignore field boundaries
+ while computing line beginning position. (Bug#20498)
+
+2015-05-08 Glenn Morris <rgm@gnu.org>
+
+ * Makefile.in (ChangeLog): No longer pass "srcprefix"; cd instead.
+ * build-aux/gitlog-to-emacslog: Check called from right directory.
+ (srcprefix): Remove.
+
+ * build-aux/gitlog-to-emacslog: Get rid of "distprefix".
+ * Makefile.in (ChangeLog): No longer pass "distprefix".
+ * make-dist: Update "make ChangeLog" syntax for the above change.
+
+ * build-aux/gitlog-to-emacslog: Don't hard-code "ChangeLog.2".
+ * Makefile.in (ChangeLog): Pass -n to gitlog-to-emacslog.
+
+ * build-aux/gitlog-to-emacslog: Add "for earlier changes" to footer.
+
+ Add command-line option-parsing to gitlog-to-emacslog.
+ * build-aux/gitlog-to-emacslog: Add command-line options.
+ By default, refuse to remove an existing output file.
+ * Makefile.in (CHANGELOG): Update default.
+ (ChangeLog): Do not test for existing file.
+ (change-history-nocommit): Ensure temp file does not exist.
+
+ Quieten --without-x compilation.
+ * lisp/term/common-win.el: Provide a feature.
+ * lisp/term/x-win.el (term/common-win): Require it.
+
+ * lisp/dired-aux.el (dired-do-print): Require lpr.
+
+ Quieten compilation, eg in --without-x builds.
+ * lisp/dired-aux.el (lpr-printer-switch):
+ * lisp/frame.el (tool-bar-height):
+ * lisp/linum.el (font-info):
+ * lisp/window.el (font-info, overflow-newline-into-fringe)
+ (tool-bar-height):
+ * lisp/emacs-lisp/package-x.el (tar-data-buffer):
+ * lisp/gnus/gnus-util.el (iswitchb-mode):
+ * lisp/mail/rmailmm.el (libxml-parse-html-region):
+ * lisp/net/nsm.el (gnutls-peer-status)
+ (gnutls-peer-status-warning-describe):
+ * lisp/net/shr.el (libxml-parse-xml-region):
+ * lisp/url/url-http.el (gnutls-peer-status): Declare.
+
+2015-05-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ CEDET (srecode-pop, srecode-peek): Don't use `subclass'
+ * lisp/cedet/srecode/insert.el (srecode-pop, srecode-peek): Don't use
+ `subclass' since they're never called with a class.
+ (srecode-insert-method, srecode-insert-subtemplate): Avoid obsolete
+ srecode-dictionary-child-p.
+
+2015-05-08 Nicolas Richard <theonewiththeevillook@yahoo.fr>
+
+ help--binding-locus: Document argument POSITION.
+ * lisp/help.el (help--binding-locus): Document argument POSITION. (bug#20530)
+
+2015-05-08 Paul Eggert <eggert@cs.ucla.edu>
+
+ Merge from gnulib.
+ * doc/misc/texinfo.tex: Get latest version.
+
+2015-05-08 Oleh Krehel <ohwoeowho@gmail.com>
+
+ ffap.el (ffap-read-file-or-url): Fix completing-read call
+ * lisp/ffap.el (ffap-read-file-or-url): The HIST argument of
+ `completing-read' should be a symbol.
+
+2015-05-08 Eli Zaretskii <eliz@gnu.org>
+
+ Verify file modifications by other programs
+ * src/filelock.c (lock_file): Check whether the file was modified
+ since it was visited even if 'create-lockfiles' is nil. (Bug#18828)
+
+ Fix keyboard macros that include function keys
+ * src/keyboard.c (read_char_minibuf_menu_prompt): Record function
+ keys in the macro before returning. (Bug#20454)
+
+2015-05-08 Glenn Morris <rgm@gnu.org>
+
+ * build-aux/gitlog-to-changelog: Treat "Tiny-change" like
+ "Copyright-paperwork-exempt". (Bug#20324)
+
+ * lisp/vc/log-edit.el: Handle "(tiny change)". (Bug#20324)
+ (log-edit-rewrite-tiny-change): New variable.
+ (log-edit-insert-changelog): Maybe add "Copyright-paperwork-exempt".
+ (log-edit-changelog-ours-p): Set log-edit-author to a cons.
+ * etc/NEWS: Mention this.
+
+ * lisp/calc/calc.el (math-zerop): Declare.
+
+ * lisp/emacs-lisp/eieio-opt.el (help-fns-short-filename): Declare.
+
+2015-05-07 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/subr-x.el (if-let): Fix debug spec
+ Support the case when BINDINGS is a single tuple. (Bug#20525)
+
+ * etc/NEWS: Fix typo in commit 14bb519
+
+2015-05-07 Jan D <jan.h.d@swipnet.se>
+
+ Warn for multiple display crash for all Gtk+ versions.
+ * configure.ac: Warn for multiple display crash for all Gtk+
+ versions. Output URL to Gtk+ bug (Bug#20452).
+
+ ns-win.el (ns-paste-secondary): Use gui-get-selection.
+ * ns-win.el (ns-paste-secondary): Use gui-get-selection.
+
+2015-05-07 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: New "external" package status
+ An external package is any installed package that's not built-in
+ and not from `package-user-dir', which usually means it's from an
+ entry in `package-directory-list'. They are treated much like
+ built-in packages, in that they cannot be through the Package Menu
+ deleted and are not considered for upgrades.
+ (package-desc-status): Identify if a package is installed outside
+ `package-user-dir'.
+ (package-menu--print-info-simple)
+ (package-menu--status-predicate): Add support for it.
+ * etc/NEWS: Document it.
+
+2015-05-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/mail/rmail.el: Use lexical-binding
+ (rmail-bury): Remove unused var `buffer-to-bury'.
+ (rmail-get-new-mail): Remove unused vars `opoint' and `success'.
+ (rmail-parse-url): Remove unused var `proto', `user', and `host'.
+ (rmail-unrmail-new-mail-maybe): Remove unused var `new-file'.
+ (rmail-insert-inbox-text): Remove unused var `movemail'.
+ (rmail-add-mbox-headers): Remove unused var `limit'.
+ (rmail-undelete-previous-message): Remove unused var `value'.
+ (rmail-reply): Remove unused vars `resent-to', `resent-cc',
+ `resent-reply-to'.
+ (rmail-mime-mbox-buffer, rmail-mime-view-buffer): Declare.
+ (rmail-restore-desktop-buffer): Rename arguments.
+
+2015-05-06 Glenn Morris <rgm@gnu.org>
+
+ * Makefile.in (change-history-commit): Add missing piece of previous.
+
+ Avoid unnecessary bumping of Makefile.in's timestamp.
+ * Makefile.in (gen_origin): Move to gitlog-to-emacslog.
+ (emacslog): New variable.
+ (ChangeLog): Use $emacslog. Don't pass $gen_origin.
+ (unchanged-history-files): Use $emacslog rather than Makefile.in.
+ (change-history-nocommit): Store hash in $emacslog.
+ * build-aux/gitlog-to-emacslog (gen_origin): Move default here.
+ * admin/update_autogen (changelog_files): Update for the above.
+
+ * Makefile.in: Don't always insist on removing existing "ChangeLog".
+ (CHANGELOG): New variable.
+ (no-ChangeLog): Remove.
+ (ChangeLog): Replace "no-ChangeLog"; pass output file to script.
+ (change-history-nocommit): Use a temp file rather than insisting
+ on deletion of any existing "ChangeLog".
+
+ * build-aux/gitlog-to-emacslog: Allow specification of output.
+
+ * admin/update_autogen: Add option to update ChangeLog.
+ (usage): Mention -H.
+ (changelog_flag, changelog_n, changelog_files): New variables.
+ (main): Check for -H, and maybe run change-history-nocommit.
+
+2015-05-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/subr.el (delete-dups): Pre-size the hashtable.
+
+ (define-modify-macro): Make sure cl--arglist-args is defined
+ * lisp/emacs-lisp/cl.el (define-modify-macro): Make sure
+ cl--arglist-args is defined (bug#20517).
+
+2015-05-06 Glenn Morris <rgm@gnu.org>
+
+ * Makefile.in (change-history-nocommit): New.
+
+2015-05-06 Dmitry Gutov <dgutov@yandex.ru>
+
+ Only cancel timer when it is non-nil
+ * lisp/cedet/pulse.el (pulse-momentary-unhighlight): Only cancel
+ timer when it is non-nil
+ (http://lists.gnu.org/archive/html/emacs-devel/2015-05/msg00223.html).
+
+2015-05-06 Glenn Morris <rgm@gnu.org>
+
+ Quieten cedet compilation
+ * lisp/cedet/semantic/db-el.el (semanticdb-elisp-sym->tag):
+ Invert fboundp test to quieten on current Emacs.
+ * lisp/cedet/ede/config.el (ede-shell-run-something)
+ (semanticdb-file-table-object, semanticdb-needs-refresh-p)
+ (semanticdb-refresh-table): Declare.
+ (ede-preprocessor-map): Require semantic/db.
+
+ Quieten cc-mode compilation
+ * lisp/progmodes/cc-awk.el (c-forward-sws):
+ * lisp/progmodes/cc-cmds.el (c-forward-subword, c-backward-subword):
+ Declare.
+
+2015-05-06 Oleh Krehel <ohwoeowho@gmail.com>
+
+ lisp/subr.el (delete-dups): Avoid nreverse.
+
+2015-05-06 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/subr.el (delete-dups): Make it destructive again.
+
+2015-05-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * doc/lispref/sequences.texi (Sequence Functions): Fix quoting.
+
+2015-05-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/emacs-lisp/testcover.el: Don't use edebug--read (bug#20487)
+ * lisp/emacs-lisp/testcover.el: Use lexical-binding.
+ (testcover--read): Rename from testcover-read. Change calling convention.
+ Use edebug-read-and-maybe-wrap-form now that edebug-read is gone.
+ (testcover-start): Use add-function. Move edebug-all-defs binding to
+ testcover--read.
+ (testcover-this-defun): Tighten scope of edebug-all-defs binding.
+ (testcover-mark): Remove unused var `item'.
+ * src/lread.c (syms_of_lread): Default load-read-function to `read'.
+
+2015-05-06 Oleh Krehel <ohwoeowho@gmail.com>
+
+ lisp/subr.el (delete-dups): Use a hash table
+ * lisp/subr.el (delete-dups): When there are more than 100 candidates,
+ use a hash table. This can result in ~500 times speed-up for typical
+ collections of size 5000, like that of `load-library'.
+
+2015-05-06 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ CEDET: Avoid `oref' on classes in a few more cases
+ * lisp/cedet/ede/generic.el (ede-find-target):
+ * lisp/cedet/ede.el (ede-project-forms-menu): Avoid `oref' on classes.
+ * lisp/cedet/semantic/bovine/gcc.el (semantic-gcc-setup): Remove unused
+ var `prefix'.
+
+ * lisp/cedet/semantic/symref/grep.el: Fix unused var warnings
+ * lisp/cedet/semantic/symref/grep.el (grepflags, greppattern): Declare.
+ (semantic-symref-perform-search): Remove unused var `pat'.
+
+ CEDET (srecode-compile-inserter): Avoid `oref' on classes
+ * lisp/cedet/srecode/compile.el (srecode-compile-inserter):
+ Avoid `oref' on classes (bug#20491).
+ (srecode-compile-split-code): Remove unused var `key'.
+
+2015-05-06 Dmitry Gutov <dgutov@yandex.ru>
+
+ Clean up pulse.el a little
+ * lisp/cedet/pulse.el (pulse): Remove.
+ (pulse-momentary-timer): Save instead of the stop time.
+ (pulse-momentary-highlight-overlay): Call
+ pulse-momentary-unhighlight first thing. Treat
+ pulse-momentary-overlay as a single value, not a list. Save the
+ created timer. Only pass the stop time to the timer.
+ (pulse-tick): Update accordingly.
+ (pulse-momentary-unhighlight): Treat pulse-momentary-overlay as a
+ single value. Cancel the timer.
+
+2015-05-06 Tassilo Horn <tsdh@gnu.org>
+
+ Support the biblatex journaltitle field
+ * lisp/textmodes/reftex-cite.el (reftex-format-bib-entry):
+ Support the biblatex journaltitle field.
+
+2015-05-05 Glenn Morris <rgm@gnu.org>
+
+ Minor declare-function improvement
+ * lisp/emacs-lisp/bytecomp.el
+ (byte-compile-macroexpand-declare-function):
+ Handle declarations after calls. (Bug#20509)
+
+ * lisp/progmodes/js.el (js--optimize-arglist): Remove declaration.
+
+ * lisp/w32-fns.el (w32-shell-name): Silence compiler.
+
+2015-05-05 Dmitry Gutov <dgutov@yandex.ru>
+
+ Pulse using a timer
+ * lisp/cedet/pulse.el (pulse-momentary-stop-time): New variable.
+ (pulse-momentary-highlight-overlay): Set up the timer instead of
+ calling `pulse'
+ (http://lists.gnu.org/archive/html/emacs-devel/2015-05/).
+ (pulse-tick): New function.
+ (pulse-momentary-unhighlight): Cut off the stop time.
+ (pulse-delay): Update the docstring WRT to not using sit-for.
+
+ Add semantic/symref/grep file patterns for ruby-mode
+ * lisp/cedet/semantic/symref/grep.el
+ (semantic-symref-filepattern-alist): Add patterns for
+ ruby-mode. Clarify the docstring.
+
+ Don't require match
+ * lisp/progmodes/xref.el (xref--read-identifier): Don't require
+ match. That doesn't work for every command, and some identifier
+ completion tables are bound to be imperfect anyway.
+
+2015-05-05 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/cedet/semantic/grammar.el: Fix compiler warnings (bug#20505)
+ (semantic-grammar--template-expand): New function.
+ (semantic-grammar-header, semantic-grammar-footer): Use it.
+ (semantic-grammar--lex-block-specs): Remove unused var `block-spec'.
+ (semantic-grammar-file-regexp): Refine regexp.
+ (semantic-grammar-eldoc-get-macro-docstring):
+ Use elisp-get-fnsym-args-string when available.
+ (semantic-idle-summary-current-symbol-info): Use new elisp-* names
+ instead of the old eldoc-* names.
+ * lisp/emacs-lisp/eldoc.el (eldoc-docstring-format-sym-doc): Move back
+ from elisp-mode.el. Tweak calling convention.
+ * lisp/progmodes/elisp-mode.el (package-user-dir): Declare.
+ (elisp-get-fnsym-args-string): Add `prefix' argument. Rename from
+ elisp--get-fnsym-args-string.
+ (elisp--highlight-function-argument): Add `prefix' arg.
+ (elisp-get-var-docstring): Rename from elisp--get-var-docstring.
+ (elisp--docstring-format-sym-doc): Move back to eldoc.el.
+
+2015-05-05 Glenn Morris <rgm@gnu.org>
+
+ * lisp/help-fns.el (describe-function-1):
+ Handle builtins with advertised calling conventions. (Bug#20479)
+
+2015-05-05 Nicolas Petton <nicolas@petton.fr>
+
+ Merge branch 'seq-let'
+
+ Update `seq-let' documentation
+ * doc/lispref/sequences.texi: Update the documentation of `seq-let'
+ with the support of `&rest'.
+
+ Add support for &rest in `seq-let'
+ * lisp/emacs-lisp/seq.el (seq--make-bindings): Add support for `&rest'
+ in the argument list.
+ * test/automated/seq-tests.el: Add a test for parsing and binding
+ `&rest' in `seq-let'.
+
+2015-05-05 Paul Eggert <eggert@cs.ucla.edu>
+
+ Spelling fixes
+
+2015-05-05 (tiny change) Pierre Lorenzon <devel@pollock-nageoire.net>
+
+ * eieio-custom.el (eieio-object-value-get): Add missing increment
+ (Bug#20467)
+
+ (eieio-object-value-create): Adjust to new slots representation
+ (Bug#20467)
+ * eieio-custom.el (eieio-object-value-create):
+ Fix missed adjustment to new representation of slots metadata.
+
+2015-05-05 Nicolas Petton <nicolas@petton.fr>
+
+ * lisp/emacs-lisp/seq.el (seq--make-bindings): Improve the docstring.
+
+2015-05-05 Dmitry Gutov <dgutov@yandex.ru>
+
+ Work around "Attempt to modify read-only object"
+ * lisp/progmodes/elisp-mode.el (elisp--xref-format): Extract from
+ elisp--xref-find-definitions, to work around "Attempt to modify
+ read-only object" error.
+
+ Only skip some variables that have function counterparts
+ * lisp/progmodes/elisp-mode.el (elisp--xref-identifier-location):
+ Only skip minor-mode-named variable if it's defined in a Lisp
+ file, and it's in minor-mode-list (bug#20506).
+ * test/automated/elisp-mode-tests.el
+ (elisp-xref-finds-both-function-and-variable)
+ (elisp-xref-finds-only-function-for-minor-mode): New tests.
+
+2015-05-04 Dmitry Gutov <dgutov@yandex.ru>
+
+ Buttonize the whole line, including the number at the beginning
+ * lisp/progmodes/xref.el (xref--location-at-point): Revert the
+ previous change.
+ (xref--insert-xrefs): Buttonize the whole line, including the
+ number at the beginning.
+
+ Make sure we're inside the let bindings
+ * lisp/progmodes/elisp-mode.el (elisp-completion-at-point):
+ Make sure we're inside the let bindings.
+ * test/automated/elisp-mode-tests.el
+ (elisp-completes-functions-after-let-bindings): New test.
+
+2015-05-04 Glenn Morris <rgm@gnu.org>
+
+ * lisp/cedet/semantic/grammar.el (eldoc-function-argstring)
+ (eldoc-docstring-format-sym-doc, eldoc-last-data-store)
+ (eldoc-get-fnsym-args-string, eldoc-get-var-docstring):
+ Remove outdated declarations.
+
+ Replace instances of "(eval-when-compile (autoload ...))"
+ * lisp/gnus/gnus-art.el (nneething-get-file-name):
+ Declare rather than autoload.
+ * lisp/gnus/gnus-async.el (gnus-html-prefetch-images):
+ Remove pointless autoload.
+ * lisp/gnus/gnus-sync.el (gnus-group-topic): Autoload at run-time.
+ (gnus-topic-create-topic, gnus-topic-enter-dribble):
+ Declare rather than autoload.
+ * lisp/gnus/mm-archive.el (gnus-recursive-directory-files)
+ (mailcap-extension-to-mime): Autoload at run-time.
+ * lisp/gnus/mm-util.el (latin-unity-massage-name)
+ (latin-unity-maybe-remap, latin-unity-representations-feasible-region)
+ (latin-unity-representations-present-region):
+ Declare rather than autoload.
+ * lisp/gnus/mml-smime.el (epg-make-context)
+ (epg-passphrase-callback-function): Autoload at run-time.
+ (epg-context-set-signers, epg-context-result-for)
+ (epg-new-signature-digest-algorithm)
+ (epg-verify-result-to-string, epg-list-keys, epg-verify-string)
+ (epg-sign-string, epg-encrypt-string)
+ (epg-context-set-passphrase-callback, epg-sub-key-fingerprint)
+ (epg-configuration, epg-expand-group, epa-select-keys):
+ Declare rather than autoload.
+ * lisp/gnus/nnir.el (nnimap-change-group, nnimap-make-thread-query):
+ Autoload at run-time.
+ (gnus-group-topic-name, nnimap-buffer, nnimap-command)
+ (gnus-registry-get-id-key, gnus-registry-action):
+ Declare rather than autoload.
+ * lisp/gnus/nnmail.el (mail-send-and-exit): Autoload at run-time.
+ * lisp/gnus/spam.el (spam-stat-buffer-change-to-non-spam)
+ (spam-stat-buffer-change-to-spam, spam-stat-buffer-is-non-spam)
+ (spam-stat-buffer-is-spam, spam-stat-load, spam-stat-save)
+ (spam-stat-split-fancy): Remove pointless autoloads.
+ * lisp/net/mairix.el: Load gnus-util when compiling.
+ (gnus-group-read-ephemeral-group, gnus-summary-toggle-header)
+ (message-field-value): Declare rather than autoload.
+ (mairix-gnus-ephemeral-nndoc, mairix-gnus-fetch-field):
+ Check gnus-alive-p is fbound.
+ (vm-quit, vm-visit-folder, vm-select-folder-buffer)
+ (vm-check-for-killed-summary, vm-error-if-folder-empty)
+ (vm-get-header-contents, vm-select-marked-or-prefixed-messages):
+ Declare rather than autoload.
+
+ * lisp/gnus/mm-view.el (epg-decrypt-string): Autoload.
+
+ * lisp/gnus/mml-smime.el (epg-key-sub-key-list)
+ (epg-sub-key-capability, epg-sub-key-validity): Fix declarations.
+
+ * lisp/progmodes/elisp-mode.el (xref-collect-references): Declare.
+
+ * lisp/emacs-lisp/debug.el (help-xref-interned): Update declaration.
+
+ * lisp/allout.el (epg-user-id-string, epg-key-user-id-list):
+ * lisp/emacs-lisp/package.el (epg-signature-status):
+ Fix declarations.
+
+ * lisp/play/gametree.el (gametree-show-children-and-entry)
+ (gametree-apply-layout, gametree-mouse-show-subtree)
+ (gametree-mouse-hide-subtree): Replace obsolete outline aliases.
+
+ * lisp/emacs-lisp/check-declare.el (check-declare-verify):
+ Handle cl-defgeneric, cl-defmethod.
+
+2015-05-04 Dmitry Gutov <dgutov@yandex.ru>
+
+ Highlight both type and symbol name
+ * lisp/progmodes/elisp-mode.el (elisp--xref-find-definitions):
+ Highlight both type and symbol name.
+
+ Insert, highlight and align line numbers in xref output
+ * lisp/progmodes/etags.el (xref-location-line): Specialize for
+ xref-etags-location.
+ * lisp/progmodes/xref.el (xref-location-line): New generic method.
+ (xref-file-location): Add reader for the line slot.
+ (xref--location-at-point): Skip to the `xref-location' property.
+ (xref--collect-reference): Drop the line number from description.
+ (xref--insert-xrefs): Insert, highlight and align line numbers.
+
+2015-05-04 Daniel Colascione <dancol@dancol.org>
+
+ Fix previous commit
+
+2015-05-04 Dmitry Gutov <dgutov@yandex.ru>
+
+ Don't pulse the indentation, or the newline
+ * lisp/cedet/pulse.el (pulse-lighten-highlight)
+ (pulse-reset-face): Fall back to the inherited background
+ attribute in FACE.
+ (pulse-momentary-highlight-region): Add autoload cookie.
+ * lisp/progmodes/xref.el (xref--maybe-pulse): Don't highlight the
+ indentation, or the newline, if the line's non-empty
+ (http://lists.gnu.org/archive/html/emacs-devel/2015-05/msg00118.html).
+
+2015-05-04 Daniel Colascione <dancol@dancol.org>
+
+ Add `save-mark-and-excursion', which has the old `save-excursion' behavior
+ * doc/lispref/positions.texi (Excursions): Document
+ `save-mark-and-excursion'.
+ * lisp/font-lock.el (font-lock-fontify-block): Use
+ `save-mark-and-excursion' instead of `save-excursion', restoring
+ Emacs 24 behavior.
+ * lisp/simple.el (save-mark-and-excursion--save)
+ (save-mark-and-excursion--restore): New functions.
+ (save-mark-and-excursion): New user macro.
+ * src/editfns.c (Fsave_excursion): Mention
+ `save-mark-and-excursion' in `save-excursion' documentation.
+
+2015-05-04 Dmitry Gutov <dgutov@yandex.ru>
+
+ Classify lone symbol inside let varlist as variable
+ * lisp/progmodes/elisp-mode.el (elisp-completion-at-point):
+ Classify lone symbol inside let varlist as variable.
+ * test/automated/elisp-mode-tests.el (completest-variables-in-let-bindings):
+ New test.
+
+ Add xref-pulse-on-jump
+ * lisp/cedet/pulse.el (pulse-momentary-highlight-one-line):
+ Add autoload cookie.
+ * lisp/progmodes/xref.el (xref-pulse-on-jump): New option.
+ (xref--maybe-pulse): New function.
+ (xref-pop-marker-stack, xref--pop-to-location)
+ (xref--display-position): Use it.
+ (xref--location-at-point): Use back-to-indentation.
+
+2015-05-04 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/org/org-{macs,list}.el: Fix lexical warnings
+ * lisp/org/org-list.el (org-list-struct): Remove unused var `ind'.
+ (org-list-get-next-item, org-list-get-prev-item)
+ (org-list-get-children): Mark unused arg `struct'.
+ (org-list-use-alpha-bul-p): Remove unused var `bul'.
+ (org-toggle-checkbox): Mark unused var.
+ (org-update-checkbox-count): Remove unused var `box-num'.
+ (org-adapt-indentation): Declare.
+ (org-list-parse-list): Declare var instead of adding a dummy duplicate.
+ (org-list-send-list): Remove unused var `txt'.
+ (org-list-to-latex, org-list-to-texinfo): Mark unused arg `params'.
+ (org-list-to-subtree): Add prefix to dyn-bind var, and declare them.
+ * lisp/org/org-macs.el: Use `declare'.
+ (org-with-limited-levels): Declare dyn-bound vars.
+
+2015-05-04 Eli Zaretskii <eliz@gnu.org>
+
+ Fix minor issues with CEDET on MS-Windows
+ * lisp/cedet/semantic/symref/idutils.el
+ (semantic-symref-parse-tool-output-one-line): Fix the search
+ regexp to match MS-Windows file names with drive letters.
+ (Bug#19468)
+ * lisp/cedet/semantic/symref/grep.el
+ (semantic-symref-grep-use-template): Remove "--color=always" from
+ Grep switches on MS-Windows.
+ (semantic-symref-grep-shell): Use shell-file-name as the default
+ value, so this works not only on Posix platforms.
+ (semantic-symref-perform-search): Use shell-quote-argument instead
+ of literal '..' for portable quoting of Grep command-line
+ argument. Use shell-command-switch instead of a literal "-c".
+ * lisp/cedet/semantic/bovine/gcc.el
+ (semantic-gcc-get-include-paths): Use file-name-absolute-p to test
+ for an absolute file name in a portable way.
+
+2015-05-04 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: Remove `package--silence' variable
+ (package-import-keyring, package-refresh-contents)
+ (package-compute-transaction, package--save-selected-packages)
+ (package-install-from-archive, package-delete)
+ (package-menu--perform-transaction): Use `inhibit-message'
+ instead.
+ (package--compile): Set `warning-minimum-level' to :error.
+
+2015-05-03 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/term/screen.el (xterm-screen-extra-capabilities): New custom
+ (terminal-init-screen): Use it (bug#20356).
+ * lisp/term/xterm.el: Provide `term/xterm' instead of `xterm'.
+ (xterm--extra-capabilities-type): New const.
+ (xterm-extra-capabilities): Use it.
+ (xterm--version-handler): Lower the pseudo-version for `screen'.
+
+2015-05-03 Dmitry Gutov <dgutov@yandex.ru>
+
+ xref--insert-xrefs: Tweak the faces
+ * lisp/progmodes/xref.el (xref--insert-xrefs): Tweak the faces.
+ Always insert a newline at the end (to avoid mouse-face background
+ tail at the last line).
+
+ elisp-completion-at-point: Prioritize being quoted over funpos
+ * lisp/progmodes/elisp-mode.el (elisp-completion-at-point):
+ Only consider function position when not inside quoted form
+ (bug#20425).
+ * test/automated/elisp-mode-tests.el: New file.
+
+ Stop vc-print-log from jumping to the top
+ * lisp/vc/vc.el (vc-print-log-internal): Pass nil
+ GOTO-LOCATION-FUNC to vc-log-internal-common when WORKING-REVISION
+ is not specified.
+ (vc-incoming-outgoing-internal): Always pass nil.
+ (vc-log-internal-common): When GOTO-LOCATION-FUNC is nil, don't
+ call it, and don't set vc-sentinel-movepoint (bug#15322).
+ (vc-print-root-log): Don't fetch the root working revision, nor
+ pass it to vc-print-log-internal.
+
+2015-05-02 Michael Vehrs <Michael.Burschik@gmx.de>
+
+ Fix display of keyboard layouts for right-to-left scripts
+ * lisp/international/quail.el (quail-insert-kbd-layout): Force
+ left-to-right paragraph direction.
+
+2015-05-02 K. Handa <handa@gnu.org>
+
+ Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs
+
+ * cmds.c (internal_self_insert): When we insert spaces for
+ padding, set point before the padding spaces, not after them.
+
+2015-05-02 Nicolas Petton <nicolas@petton.fr>
+
+ * lisp/emacs-lisp/seq.el (seq-p): New alias to `sequencep'.
+
+2015-05-02 Dmitry Gutov <dgutov@yandex.ru>
+
+ Fix etags-xref-find for references
+ * lisp/progmodes/elisp-mode.el (elisp--xref-find-references): Use `cl-mapcan'.
+ * lisp/progmodes/etags.el (etags-xref-find): Ditto. Prompt for
+ directory if no tags tables are loaded (bug#19468).
+
+2015-05-02 Philipp Stephani <phst@google.com>
+
+ Update the options in whitespace-style defcustom
+ * lisp/whitespace.el (whitespace-style): Use `set' instead of a
+ `repeat' because the option is really set-like. Add missing
+ options. Reorder options to match the order in the
+ documentation. (Bug#20346)
+
+2015-05-02 Eli Zaretskii <eliz@gnu.org>
+
+ Fix error diagnostics of c-macro-expand
+ * lisp/progmodes/cmacexp.el (c-macro-expansion): Don't bail out
+ too early if no start-marker string was found -- that generally
+ means cpp exited abnormally, and we still want to show its error
+ messages to the user.
+
+ Don't require Texinfo 5.0 for Emacs documentation
+ * doc/emacs/docstyle.texi: Use "@set txicodequoteundirected" and
+ "@set txicodequotebacktick" instead of "@codequotebacktick on" and
+ "@codequoteundirected on", respectively, to avoid requiring
+ Texinfo 5.x for Emacs documentation.
+
+2015-05-01 Simen Heggestøyl <simenheg@gmail.com>
+
+ * lisp/files.el (pwd):
+ When called with a prefix argument, insert the current default
+ directory at point.
+
+2015-05-01 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/isearch.el (isearch-mode-map): Allow backspace remapping
+ * lisp/isearch.el (isearch-mode-map): Don't inhibit
+ function-key-map remapping for backspace (bug#20466).
+
+2015-05-01 Dmitry Gutov <dgutov@yandex.ru>
+
+ Implement xref-find-references in etags and elisp-mode
+ * lisp/progmodes/elisp-mode.el (elisp--xref-find-references): New function.
+ (elisp-xref-find): Use it.
+ * lisp/progmodes/etags.el (etags-xref-find): Use `xref-collect-references'.
+ * lisp/progmodes/xref.el (xref-collect-references):
+ (xref--collect-reference): New functions.
+
+2015-05-01 Paul Eggert <eggert@cs.ucla.edu>
+
+ Prefer plain characters to Texinfo circumlocutions
+ For example, prefer 'François' to 'Fran\c{c}ois', 'Fran\c cois',
+ 'Fran@,{c}ois' or 'Francois' (all of which were used!) in Texinfo sources.
+
+ Fix single-quoting style in PDF manuals
+ The PDF versions of the GNU manuals used curved single quotes to
+ represent grave accent and apostrophe, which made it a pain to cut
+ and paste code examples from them. Fix the PDF versions to use
+ grave accent and apostrophe for Lisp source code, keystrokes, etc.
+ This change does not affect the info files, nor does it affect
+ ordinary uses of curved single quotes in PDF.
+ * doc/emacs/docstyle.texi: New file, which specifies treatment for
+ grave accent and apostrophe, as well as the document encoding.
+ * doc/emacs/emacs-xtra.texi, doc/emacs/emacs.texi:
+ * doc/lispintro/emacs-lisp-intro.texi:
+ * doc/lispref/back.texi, doc/lispref/book-spine.texi:
+ * doc/lispref/elisp.texi, doc/lispref/lay-flat.texi:
+ * doc/misc/ada-mode.texi, doc/misc/auth.texi:
+ * doc/misc/autotype.texi, doc/misc/bovine.texi, doc/misc/calc.texi:
+ * doc/misc/cc-mode.texi, doc/misc/cl.texi, doc/misc/dbus.texi:
+ * doc/misc/dired-x.texi, doc/misc/ebrowse.texi, doc/misc/ede.texi:
+ * doc/misc/ediff.texi, doc/misc/edt.texi, doc/misc/efaq-w32.texi:
+ * doc/misc/efaq.texi, doc/misc/eieio.texi, doc/misc/emacs-gnutls.texi:
+ * doc/misc/emacs-mime.texi, doc/misc/epa.texi, doc/misc/erc.texi:
+ * doc/misc/ert.texi, doc/misc/eshell.texi, doc/misc/eudc.texi:
+ * doc/misc/eww.texi, doc/misc/flymake.texi, doc/misc/forms.texi:
+ * doc/misc/gnus-coding.texi, doc/misc/gnus-faq.texi:
+ * doc/misc/gnus.texi, doc/misc/htmlfontify.texi:
+ * doc/misc/idlwave.texi, doc/misc/ido.texi, doc/misc/info.texi:
+ * doc/misc/mairix-el.texi, doc/misc/message.texi, doc/misc/mh-e.texi:
+ * doc/misc/newsticker.texi, doc/misc/nxml-mode.texi:
+ * doc/misc/octave-mode.texi, doc/misc/org.texi, doc/misc/pcl-cvs.texi:
+ * doc/misc/pgg.texi, doc/misc/rcirc.texi, doc/misc/reftex.texi:
+ * doc/misc/remember.texi, doc/misc/sasl.texi, doc/misc/sc.texi:
+ * doc/misc/semantic.texi, doc/misc/ses.texi, doc/misc/sieve.texi:
+ * doc/misc/smtpmail.texi, doc/misc/speedbar.texi:
+ * doc/misc/srecode.texi, doc/misc/todo-mode.texi, doc/misc/tramp.texi:
+ * doc/misc/url.texi, doc/misc/vhdl-mode.texi, doc/misc/vip.texi:
+ * doc/misc/viper.texi, doc/misc/widget.texi, doc/misc/wisent.texi:
+ * doc/misc/woman.texi:
+ Use it instead of '@documentencoding UTF-8', to lessen the need for
+ global changes like this in the future.
+ * doc/emacs/Makefile.in (EMACS_XTRA):
+ * doc/lispintro/Makefile.in (srcs):
+ * doc/lispref/Makefile.in (srcs):
+ Add dependency on docstyle.texi.
+ * doc/misc/Makefile.in (style): New macro.
+ (${buildinfodir}/%.info, %.dvi, %.pdf, %.html)
+ (${buildinfodir}/ccmode.info, ${buildinfodir}/efaq%.info, gnus_deps):
+ Use it.
+
+2015-05-01 Glenn Morris <rgm@gnu.org>
+
+ * test/automated/cl-lib-tests.el (cl-lib-adjoin-test): Fix it.
+
+ * lisp/emacs-lisp/pcase.el (get-edebug-spec, edebug-match)
+ (help-fns--signature): Declare.
+
+ * lisp/emacs-lisp/pcase.el (pcase--make-docstring): Require help-fns.
+
+2015-05-01 Nicolas Petton <nicolas@petton.fr>
+
+ New macro seq-let, providing destructuring support to seq.el
+ * lisp/emacs-lisp/seq.el (seq-let): New macro. `seq-let' is similar
+ to `cl-destructuring-bind' but works on all sequence types supported
+ by `seq.el'. Bump version number to 1.6.
+ * test/automated/seq-tests.el: Add tests for seq-let.
+ * doc/lispref/sequences.texi: Add documentation for seq-let.
+
+2015-05-01 Pontus Michael <m.pontus@gmail.com>
+
+ * lisp/simple.el (blink-matching-open): Better behavior in minibuffer
+
+2015-05-01 Glenn Morris <rgm@gnu.org>
+
+ * lisp/emacs-lisp/ert.el (ert--special-operator-p): Fix previous.
+
+2015-05-01 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/bytecomp.el: Revert "Silence noninteractive compilations"
+ This reverts commit 9a7ddde977378cb5276a81476ae458889c403267.
+ This reverts commit 3c0ea587daf8b17960b90603a70e3ac4057d883d.
+ With message: "* lisp/emacs-lisp/bytecomp.el: Use `inhibit-message'".
+ (Bug#20445).
+
+2015-05-01 K. Handa <handa@gnu.org>
+
+ * mule-cmds.el (input-method-use-echo-area): Change :type to
+ 'boolean.
+
+2015-05-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ Start using proportional fonts in eww by default
+ * lisp/net/shr.el (shr-use-fonts): Switch the default to t, since
+ it seems to work well.
+
+ Fix links in tables in shr
+ * lisp/net/shr.el: Remove `shr-inhibit-decoration', because that
+ makes (some) links in tables not work.
+
+2015-05-01 Jan D <jan.h.d@swipnet.se>
+
+ (ns-get-cut-buffer-internal): Remove this alias.
+ * lisp/term/ns-win.el (ns-get-cut-buffer-internal): Remove this alias.
+
+2015-04-30 Glenn Morris <rgm@gnu.org>
+
+ * lisp/emacs-lisp/ert.el (ert--special-operator-p):
+ Update for 2015-02-08 change to indirect-function.
+
+ * lisp/term/ns-win.el (ns-get-selection-internal):
+ Remove declaration for function deleted 2014-10-21.
+
+ * lisp/dom.el: Load subr-x when compiling, for when-let.
+
+ Silence some compilation warnings
+ * lisp/emacs-lisp/check-declare.el (compilation-forget-errors):
+ * lisp/emulation/cua-base.el (delete-active-region):
+ * lisp/net/net-utils.el (w32-get-console-output-codepage):
+ * lisp/term/ns-win.el (ns-own-selection-internal)
+ (ns-disown-selection-internal, ns-selection-owner-p)
+ (ns-selection-exists-p, ns-get-selection):
+ Declare for compiler..
+
+ Function declaration updates prompted by 'make check-declare'
+ * lisp/emacs-lisp/package.el (lm-homepage):
+ * lisp/gnus/gnus-util.el (iswitchb-read-buffer):
+ * lisp/gnus/mm-decode.el (libxml-parse-html-region):
+ * lisp/gnus/mml.el (libxml-parse-html-region):
+ * lisp/gnus/nnrss.el (libxml-parse-html-region):
+ * lisp/net/eww.el (libxml-parse-html-region):
+ * lisp/net/shr.el (libxml-parse-html-region):
+ * lisp/vc/vc-bzr.el (vc-annotate-convert-time):
+ * lisp/vc/vc-cvs.el (vc-annotate-convert-time):
+ * lisp/vc/vc-git.el (vc-annotate-convert-time):
+ * lisp/vc/vc-hg.el (vc-annotate-convert-time):
+ * lisp/vc/vc-mtn.el (vc-annotate-convert-time):
+ * lisp/vc/vc-rcs.el (vc-annotate-convert-time):
+ Update declaration.
+
+ Remove compatibility code for 20-year old function renaming
+ * lisp/progmodes/idlw-shell.el (idlwave-shell-comint-filter):
+ Make it an obsolete alias.
+ (idlwave-shell-filter): Change all uses to comint-output-filter.
+
+2015-04-30 Tassilo Horn <tsdh@gnu.org>
+
+ Add ace-window face config
+ * etc/themes/tsdh-light-theme.el (tsdh-light): Add ace-window face
+ configuration.
+
+2015-04-30 Paul Eggert <eggert@cs.ucla.edu>
+
+ Unclutter 'make doc' output a bit
+ * Makefile.in ($(DOCS), $(INSTALL_DOC), $(UNINSTALL_DOC)):
+ Use make subst rather than sh IFS to split target string apart.
+ This makes 'make' output easier to follow.
+
+ Merge from gnulib
+ * doc/misc/texinfo.tex: Update from gnulib.
+
+2015-04-30 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: Some speed optimizations on menu refresh
+ (package-menu--print-info): Obsolete.
+ (package-menu--print-info-simple): New function.
+ (package-menu--refresh): Use it, simplify code, and improve
+ performance.
+ * lisp/emacs-lisp/tabulated-list.el (tabulated-list-print-entry):
+ Tiny performance improvement.
+
+ * lisp/emacs-lisp/package.el (package--message): inhibit-message
+
+2015-04-29 Paul Eggert <eggert@cs.ucla.edu>
+
+ Omit -Wstrict-overflow workaround in GCC 5
+ * src/process.c: Remove workaround for GCC -Wstrict-overflow bug
+ if it's GCC 5 or later, as the bug appears to be fixed in GCC 5.1.
+
+ Merge from gnulib
+ This incorporates:
+ 2015-04-29 extern-inline: no need for workaround in GCC 5.1
+ 2015-04-26 file-has-acl: port to CentOS 6
+ * m4/acl.m4, m4/extern-inline.m4: Update from gnulib.
+
+2015-04-29 Helmut Eller <eller.helmut@gmail.com>
+
+ Set next-error-* in xref--xref-buffer-mode
+ * xref.el (xref--xref-buffer-mode): Set `next-error-function' and
+ `next-error-last-buffer'.
+ (xref--next-error-function): New function.
+ (http://lists.gnu.org/archive/html/emacs-devel/2015-04/msg01311.html)
+
+2015-04-29 Fabián Ezequiel Gallina <fgallina@gnu.org>
+
+ python.el: Fix warnings on looking-back calls missing LIMIT
+ * lisp/progmodes/python.el (python-shell-accept-process-output):
+ Pass LIMIT arg to looking-back.
+
+2015-04-29 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: Use pushnew for downloads in progress
+ (package--download-and-read-archives): Use pushnew instead of
+ append. If something terrible happened during a previous
+ download, simply refreshing should now make things work again.
+
+2015-04-29 Dmitry Gutov <dgutov@yandex.ru>
+
+ Introduce etags-xref-find-definitions-tag-order
+ * lisp/progmodes/etags.el (etags-xref-find-definitions-tag-order):
+ New variable.
+ (etags--xref-find-definitions): Use it (bug#19468).
+
+2015-04-29 Eli Zaretskii <eliz@gnu.org>
+
+ PATH- and completion-related fixes in Eshell on MS-Windows
+ * lisp/eshell/esh-ext.el (eshell-search-path): When running on
+ MS-Windows, prepend "." to list of directories produced from PATH,
+ as Windows always implicitly searches the current directory first.
+ (eshell-force-execution): Make it have a non-nil default value on
+ MS-Windows and MS-DOS.
+ * lisp/eshell/em-cmpl.el (eshell-complete-commands-list): If
+ eshell-force-execution is non-nil, complete on readable files and
+ directories, not only executables. When running on MS-Windows,
+ prepend "." to list of directories produced from PATH, as Windows
+ always implicitly searches the current directory first.
+
+2015-04-29 Sam Steingold <sds@gnu.org>
+
+ bury RCIRC buffers when there is no activity
+ lisp/net/rcirc.el (rcirc-non-irc-buffer): remove
+ (rcirc-bury-buffers): new function
+ (rcirc-next-active-buffer): when there is no new activity, use
+ `rcirc-bury-buffers' to hide all RCIRC buffers
+
+2015-04-29 Michael Albinus <michael.albinus@gmx.de>
+
+ Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs
+
+2015-04-29 Krzysztof Jurewicz <krzysztof.jurewicz@gmail.com> (tiny change)
+
+ Fix DBUS query result parsing for secrets-search-items
+ * lisp/net/secrets.el (secrets-search-items): Fix DBUS query result
+ parsing. The function assumed that return value of the
+ SearchItems method called on a collection is a list of two lists,
+ however this is true only when no collection is specified. GNOME
+ had used to incorrectly return a list of two lists in both cases,
+ but this was already fixed:
+ https://bugzilla.gnome.org/show_bug.cgi?id=695115 . Also fix an
+ incorrect information in the secrets-search-items’ docstring.
+ (Bug#20449)
+
+2015-04-29 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/bytecomp.el: Use `inhibit-message'
+ (byte-compile--message): Use `inhibit-message' instead of hiding
+ the previous message with (message nil).
+
+2015-04-29 Oleh Krehel <ohwoeowho@gmail.com>
+
+ Remove the deprecated INTERNAL_FIELD macro by expanding it
+ * src/lisp.h (INTERNAL_FIELD): Remove.
+ (DEFVAR_KBOARD): Modify accordingly.
+ * alloc.c, buffer.c, buffer.h, category.c, keyboard.c, keyboard.h:
+ * syntax.c: Adjust users.
+ * src/buffer.c (compact_buffer): Use BVAR.
+
+2015-04-29 Glenn Morris <rgm@gnu.org>
+
+ Replace an obsolete function alias
+ * lisp/isearch.el (isearch-yank-x-selection):
+ * lisp/mouse-copy.el (mouse-drag-secondary-pasting)
+ (mouse-drag-secondary-moving):
+ * lisp/obsolete/mouse-sel.el (mouse-sel-get-selection-function):
+ Replace obsolete alias x-get-selection with gui-get-selection.
+
+2015-04-29 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/mail/rmailsum.el: Use lexical-binding.
+
+2015-04-29 Glenn Morris <rgm@gnu.org>
+
+ * test/automated/package-test.el (package-test-update-archives-async):
+ Skip test on hydra.nixos.org.
+
+2015-04-28 Glenn Morris <rgm@gnu.org>
+
+ * lisp/foldout.el: Update for 2015-01-30 outline.el changes.
+ (foldout-zoom-subtree, foldout-exit-fold, foldout-mouse-show)
+ (foldout-mouse-hide-or-exit): Use new names for outline functions.
+
+ * lisp/cedet/semantic/bovine/c.el (semantic-c-do-lex-if):
+ Update for 2014-06-26 hideif.el change.
+
+ * lisp/mail/rmailsum.el: Fix search for encoded subjects. (Bug#19088)
+ (rmail--decode-and-apply): New function.
+ (rmail-message-regexp-p-1, rmail-message-subject-p): Use it.
+
+ * lisp/mail/rmail.el (rmail-highlighted-headers): Fix :type.
+
+2015-04-28 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: Fix priority-hiding corner case
+ (package-menu--refresh): Delegate obsolete-hiding to
+ `package--remove-hidden'.
+ (package--remove-hidden): Disregard high-priority package if it is
+ older than the installed one.
+
+2015-04-28 Paul Eggert <eggert@cs.ucla.edu>
+
+ Update source file encoding list
+ Update admin/notes/unicode, along with coding system cookies in
+ other files, so that the two match each other better.
+ * admin/notes/unicode: lisp/language/ethio-util.el and
+ lisp/language/ethiopic.el also use utf-8-emacs.
+ * admin/notes/hydra, doc/misc/dbus.texi, doc/misc/org.texi:
+ * doc/misc/remember.texi, etc/refcards/cs-dired-ref.tex:
+ * etc/refcards/cs-refcard.tex, etc/refcards/cs-survival.tex:
+ * etc/refcards/sk-dired-ref.tex, etc/refcards/sk-refcard.tex:
+ * etc/refcards/sk-survival.tex:
+ Add "coding: utf-8" so that this file is not mishandled in a
+ Latin-1 or Big-5 locale.
+ * lisp/international/robin.el, lisp/org/ox-ascii.el:
+ Specify utf-8, not utf-8-emacs, as these are plain UTF-8 files.
+ * lisp/language/ethio-util.el: Fix trailer.
+
+2015-04-28 Eli Zaretskii <eliz@gnu.org>
+
+ Fix synchronous invocation of Ispell
+ * lisp/textmodes/ispell.el (ispell-init-process): Assign a non-nil
+ value to ispell-process-directory before calling ispell-init-process.
+ Don't call set-process-coding-system if ispell-async-processp is nil.
+ (Bug#20448)
+
+2015-04-28 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: Skip space and comments in init file
+ (package--ensure-init-file): Insert snippet at first
+ non-whitespace non-comments line. Respects local-vars at the top
+ of the file.
+
+2015-04-28 Glenn Morris <rgm@gnu.org>
+
+ * lisp/mail/rmail.el (rmail-copy-headers):
+ Handle rmail-nonignored-headers being nil. (Bug#18878)
+
+ * lisp/subr.el (delay-mode-hooks): Fix doc typo.
+
+ * lisp/vc/vc-bzr.el (vc-bzr-after-dir-status):
+ Don't get confused by a bzrlib version mismatch warning.
+
+2015-04-27 Thomas Fitzsimmons <fitzsim@fitzsim.org>
+
+ Change default location of EUDC options file
+ * NEWS: Document change to EUDC options file's default location.
+ * lisp/net/eudc-vars.el (eudc-options-file): Use
+ `locate-user-emacs-file' to change default options file location.
+
+2015-04-27 Glenn Morris <rgm@gnu.org>
+
+ * test/automated/package-test.el (package-test-update-archives-async):
+ Try to handle the test server script dying.
+
+2015-04-27 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/saveplace.el (save-place-mode): New minor mode.
+ (save-place): Redefine as an obsolete alias.
+
+ * lisp/midnight.el: Make it a minor mode. Allow predicates.
+ * lisp/midnight.el: Use lexical-binding.
+ (midnight-mode): Make it a proper minor mode.
+ (midnight-buffer-display-time): Make arg non-optional.
+ (midnight-find): Remove.
+ (clean-buffer-list-kill-never-regexps)
+ (clean-buffer-list-kill-regexps): Tweak type for new function choice.
+ (clean-buffer-list-delay): Allow clean-buffer-list-kill-regexps to
+ contain functions.
+ (clean-buffer-list): Use cl-find.
+ Allow clean-buffer-list-kill-never-regexps to contain functions.
+
+2015-04-27 Nicolas Petton <nicolas@petton.fr>
+
+ Bump version of seq.el to 1.5
+ * lisp/emacs-lisp/seq.el (seq-doseq): Remove undocumented return value
+ from seq-doseq. Bump version number of seq.el.
+
+2015-04-27 Glenn Morris <rgm@gnu.org>
+
+ * lisp/mail/rmail.el (rmail-reply):
+ Decode subject before matching "Re:" prefix. (Bug#20396)
+
+2015-04-27 Artur Malabarba <bruce.connor.am@gmail.com>
+
+ * lisp/emacs-lisp/package.el: Small improvements
+ (package--with-work-buffer-async): More informative error.
+ (package-install-user-selected-packages): Rename to
+ `package-install-selected-packages'.
+
+2015-04-27 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/emacs-lisp/eieio-core.el (eieio-defclass-internal): Fix last
+ * lisp/emacs-lisp/eieio-core.el (eieio-defclass-internal): Fix last change.
+ (eieio--class-make): Remove leftover `tag'.
+
+2015-04-27 Glenn Morris <rgm@gnu.org>
+
+ * lisp/gnus/message.el (gnus-extract-address-components):
+ Remove bogus declaration that was masking previous problem.
+
+2015-04-27 Nicolas Graner <nicolas.graner@u-psud.fr> (tiny change)
+
+ * lisp/gnus/message.el (message-insert-formatted-citation-line):
+ Fix typo. (Bug#20318)
+
+2015-04-27 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/emacs-lisp/eieio-core.el (eieio-defclass-internal): Reuse oldc.
+
+ * lisp/textmodes/reftex-toc.el: Improve multi-frame behavior
+ * lisp/textmodes/reftex-toc.el (reftex-toc-revert): Avoid displaying
+ the buffer in yet another frame.
+ (reftex-toc-visit-location): Make sure toc-window has focus at the end
+ when `final' is nil.
+ (reftex--rebuilding-toc): Defvar to avoid `boundp' and
+ silence warnings. Use `--' to clarify that it's internal.
+ (reftex-toc-next, reftex-toc-previous, reftex-toc-demote)
+ (reftex-toc-promote): Clarify unused argument.
+ (reftex--pro-or-de, reftex--start-line, reftex--mark-line):
+ Add `reftex--' prefix. Fix all users.
+ (reftex-toc-promote-prepare): Use _ for dummy variable.
+ (reftex-toc-restore-region): Rename `m
+
+2015-04-27 Eli Zaretskii <eliz@gnu.org>
+
+ Fix a typo in bibtex.el
+ * lisp/textmodes/bibtex.el (bibtex-insert-kill): Fix a typo from
+ last change. (Bug#20429)
+
+ Fix redisplay of frame after loading new fonts
+ * src/xdisp.c (redisplay_internal): When retrying redisplay of a
+ frame because new fonts were loaded, disable all redisplay
+ optimizations on that frame by calling SET_FRAME_GARBAGED.
+ (Bug#20410)
+
+2015-04-27 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * lisp/info.el (Info-menu): Properly provide the `default'
+ (Bug#20391)
+
+ * elisp-mode.el: Catch errors from `documentation'
+ (Bug#20418)
+ * lisp/progmodes/elisp-mode.el (elisp--get-fnsym-args-string):
+ Catch errors from documentation.
+ (emacs-lisp-mode-abbrev-table): Remove redundant defvar.
+
+2015-04-26 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ lisp/emacs-lisp/package.el: Move variables to silence byte-compiler
+ Remove redundant ":group 'package".
+
+2015-04-26 Eli Zaretskii <eliz@gnu.org>
+
+ Fix a typo in rmail.el
+ * lisp/mail/rmail.el (rmail-ensure-blank-line): Fix a typo in the
+ last commit. (Bug#20429)
+
+2015-04-26 Dmitry Gutov <dgutov@yandex.ru>
+
+ Introduce xref-prompt-for-identifier
+ * lisp/progmodes/xref.el (xref-prompt-for-identifier): New option.
+ (xref--read-identifier): Use it
+ (http://lists.gnu.org/archive/html/emacs-devel/2015-04/msg01205.html).
+
+2015-04-26 João Távora <joaotavora@gmail.com>
+
+ `tex-insert-quote' after single `'' opens quotes instead of closing
+ Without this, it's very hard to precede double quotes with the
+ apostrophe character, i.e. insert the sequence '``
+ (quote-backquote-backquote), commonly useful in portuguese, for
+ instance.
+ * tex-mode.el (tex-insert-quote): Add ?' to the list of preceding
+ chars making `tex-insert-quote' be in the "opening" context.
+
+2015-04-25 Dmitry Gutov <dgutov@yandex.ru>
+
+ Pass `id' to `completing-read' as def instead of initial input
+ * xref.el (xref--read-identifier): Pass `id' to `completing-read'
+ as the default value instead of initial input
+ (http://lists.gnu.org/archive/html/emacs-devel/2015-04/msg01182.html).
+
2015-04-25 Paul Eggert <eggert@cs.ucla.edu>
Don't freeze with unreadable processes
diff --git a/Makefile.in b/Makefile.in
index f88a9c5d309..eec6d313524 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -413,7 +413,7 @@ blessmail: Makefile src
# etc. to be built without running into similar recursion problems.
MAKEFILE_NAME = Makefile
$(MAKEFILE_NAME): config.status $(srcdir)/src/config.in \
- $(srcdir)/Makefile.in $(SUBDIR_MAKEFILES_IN) $(srcdir)/src/lisp.mk
+ $(srcdir)/Makefile.in $(SUBDIR_MAKEFILES_IN)
MAKE='$(MAKE)' ./config.status
# Don't erase these files if make is interrupted while refreshing them.
@@ -940,7 +940,7 @@ PSS = lispref-ps lispintro-ps emacs-ps misc-ps
DOCS = $(DVIS) $(HTMLS) $(INFOS) $(PDFS) $(PSS)
$(DOCS):
- t=$@; IFS=-; set $$t; IFS=; $(MAKE) -C doc/$$1 $$2
+ $(MAKE) -C doc/$(subst -, ,$@)
.PHONY: $(DOCS) docs pdf ps
.PHONY: info dvi dist check html info-real info-dir check-info
@@ -997,7 +997,7 @@ INSTALL_DOC = $(INSTALL_DVI) $(INSTALL_HTML) $(INSTALL_PDF) $(INSTALL_PS)
## Install non .info forms of the documentation.
## TODO add etc/refcards.
$(INSTALL_DOC):
- t=$@; IFS=-; set $$t; IFS=; $(MAKE) -C doc/$$2 $$1-$$3
+ $(MAKE) -C doc/$(subst -, install-,$(subst install-,,$@))
.PHONY: $(INSTALL_DOC) install-doc
.PHONY: install-dvi install-html install-pdf install-ps
@@ -1020,7 +1020,7 @@ UNINSTALL_PS = uninstall-emacs-ps uninstall-lispref-ps \
UNINSTALL_DOC = $(UNINSTALL_DVI) $(UNINSTALL_HTML) $(UNINSTALL_PDF) $(UNINSTALL_PS)
$(UNINSTALL_DOC):
- t=$@; IFS=-; set $$t; IFS=; $(MAKE) -C doc/$$2 $$1-$$3
+ $(MAKE) -C doc/$(subst -, uninstall-,$(subst uninstall-,,$@))
.PHONY: $(UNINSTALL_DOC) uninstall-doc
.PHONY: uninstall-dvi uninstall-html uninstall-pdf uninstall-ps
@@ -1088,50 +1088,52 @@ bootstrap: bootstrap-clean
$(MAKE) MAKEFILE_NAME=force-Makefile force-Makefile
$(MAKE) all
-.PHONY: ChangeLog change-history change-history-commit
-.PHONY: master-branch-is-current no-ChangeLog unchanged-history-files
-
-# The newest revision that should not appear in the generated ChangeLog.
-gen_origin = 2c1b8604946efbcd8ec5dd6c6dda7541ce4fc3c0
-
-# Convert git commit log to ChangeLog file. make-dist uses this.
-ChangeLog:
- $(AM_V_GEN)distprefix=$(distprefix) srcprefix=$(srcdir)/ \
- $(srcdir)/build-aux/gitlog-to-emacslog $(gen_origin)
+.PHONY: ChangeLog change-history change-history-commit change-history-nocommit
+.PHONY: master-branch-is-current unchanged-history-files
+CHANGELOG = ChangeLog
+emacslog = build-aux/gitlog-to-emacslog
# The ChangeLog history files are called ChangeLog.1, ChangeLog.2, ...,
# ChangeLog.$(CHANGELOG_HISTORY_INDEX_MAX). $(CHANGELOG_N) stands for
# the newest (highest-numbered) ChangeLog history file.
CHANGELOG_HISTORY_INDEX_MAX = 2
CHANGELOG_N = ChangeLog.$(CHANGELOG_HISTORY_INDEX_MAX)
+# Convert git commit log to ChangeLog file. make-dist uses this.
+# I guess this is PHONY so it always updates?
+ChangeLog:
+ $(AM_V_GEN)cd $(srcdir) && \
+ ./$(emacslog) -o $(CHANGELOG) -n $(CHANGELOG_HISTORY_INDEX_MAX)
+
# Check that we are in a good state for changing history.
-no-ChangeLog:
- test ! -f ChangeLog
master-branch-is-current:
git branch | grep -q '^\* master$$'
unchanged-history-files:
- x=$$(git diff-files --name-only $(CHANGELOG_N) Makefile.in) && \
+ x=$$(git diff-files --name-only $(CHANGELOG_N) $(emacslog)) && \
test -z "$$x"
# Copy newer commit messages to the start of the ChangeLog history file,
# and consider them to be older.
-change-history: no-ChangeLog master-branch-is-current unchanged-history-files \
- ChangeLog
- (sed '/^;; [L]ocal Variables:/,$$d' <ChangeLog && cat $(CHANGELOG_N)) \
+change-history-nocommit: master-branch-is-current unchanged-history-files
+ -rm -f ChangeLog.tmp
+ $(MAKE) ChangeLog CHANGELOG=ChangeLog.tmp
+ (sed '/^See ChangeLog.[0-9]* for earlier/,$$d' <ChangeLog.tmp && cat $(CHANGELOG_N)) \
>$(CHANGELOG_N).tmp
+ rm ChangeLog.tmp
new_origin=$$(git log --pretty=format:%H HEAD^!) && \
- sed 's/^\(gen_origin *= *\).*/\1'"$$new_origin/" \
- <Makefile.in >Makefile.in.tmp
+ sed 's/^\(gen_origin=\).*/\1'"$$new_origin/" \
+ < $(emacslog) > $(emacslog).tmp && chmod +x $(emacslog).tmp
mv $(CHANGELOG_N).tmp $(CHANGELOG_N)
- mv Makefile.in.tmp Makefile.in
+ mv $(emacslog).tmp $(emacslog)
+
+change-history: change-history-nocommit
$(MAKE) $@-commit
# If 'make change-history' fails because the newest ChangeLog history
# file contains invalid text, fix the file by hand and then run
# 'make change-history-commit'.
change-history-commit:
- git commit -m'; make $@' $(CHANGELOG_N) Makefile.in
+ git commit -m'; make $@' $(CHANGELOG_N) $(emacslog)
.PHONY: check-declare
diff --git a/admin/charsets/cp51932.awk b/admin/charsets/cp51932.awk
index c8879b30200..f59e91cdb9c 100644
--- a/admin/charsets/cp51932.awk
+++ b/admin/charsets/cp51932.awk
@@ -52,4 +52,6 @@ END {
print " (setcar x (cdr x)) (setcdr x tmp)))";
print " map)";
print " (define-translation-table 'cp51932-encode map))";
+ print "";
+ print "(provide 'cp51932)";
}
diff --git a/admin/charsets/eucjp-ms.awk b/admin/charsets/eucjp-ms.awk
index 18c19f5fb55..f17222d901e 100644
--- a/admin/charsets/eucjp-ms.awk
+++ b/admin/charsets/eucjp-ms.awk
@@ -106,5 +106,7 @@ END {
print " (setcar x (cdr x)) (setcdr x tmp)))";
print " map)";
print " (define-translation-table 'eucjp-ms-encode map))";
+ print "";
+ print "(provide 'eucjp-ms)";
}
diff --git a/admin/notes/hydra b/admin/notes/hydra
index 7f8615de975..80ce787b6b0 100644
--- a/admin/notes/hydra
+++ b/admin/notes/hydra
@@ -1,4 +1,4 @@
--*- outline -*-
+-*- mode: outline; coding: utf-8 -*-
Copyright (C) 2013-2015 Free Software Foundation, Inc.
See the end of the file for license conditions.
diff --git a/admin/notes/unicode b/admin/notes/unicode
index 13971ef18c0..028bcc187af 100644
--- a/admin/notes/unicode
+++ b/admin/notes/unicode
@@ -167,8 +167,8 @@ nontrivial changes to the build process.
leim/CXTERM-DIC/QJ.tit
leim/CXTERM-DIC/SW.tit
leim/CXTERM-DIC/TONEPY.tit
- leim/MISC-DIC/pinyin.map
leim/MISC-DIC/CTLau.html
+ leim/MISC-DIC/pinyin.map
leim/MISC-DIC/ziranma.cin
* cp850
@@ -237,9 +237,11 @@ nontrivial changes to the build process.
These files contain characters that cannot be encoded in UTF-8.
- lisp/language/tibetan.el
- lisp/language/tibet-util.el
+ lisp/language/ethio-util.el
+ lisp/language/ethiopic.el
lisp/language/ind-util.el
+ lisp/language/tibet-util.el
+ lisp/language/tibetan.el
lisp/leim/quail/ethiopic.el
lisp/leim/quail/tibetan.el
diff --git a/admin/update_autogen b/admin/update_autogen
index 1bd82967c27..27d53035502 100755
--- a/admin/update_autogen
+++ b/admin/update_autogen
@@ -69,6 +69,7 @@ Options:
commit them (caution).
-q: be quiet; only give error messages, not status messages.
-A: only update autotools files, copying into specified dir.
+-H: also update ChangeLog.${changelog_n}
-I: also update info/dir.
-L: also update ldefs-boot.el.
-C: start from a clean state. Slower, but more correct.
@@ -87,10 +88,13 @@ autogendir= # was "autogen"
ldefs_flag=1
lboot_flag=
info_flag=
+changelog_flag=
## Parameters.
ldefs_in=lisp/loaddefs.el
ldefs_out=lisp/ldefs-boot.el
+changelog_n=$(sed -n 's/CHANGELOG_HISTORY_INDEX_MAX *= *//p' Makefile.in)
+changelog_files="ChangeLog.$changelog_n build-aux/gitlog-to-emacslog"
sources="configure.ac lib/Makefile.am"
## Files to copy into autogendir.
## Everything:
@@ -113,7 +117,7 @@ tempfile=/tmp/$PN.$$
trap "rm -f $tempfile 2> /dev/null" EXIT
-while getopts ":hcfqA:CIL" option ; do
+while getopts ":hcfqA:HCIL" option ; do
case $option in
(h) usage ;;
@@ -129,6 +133,8 @@ while getopts ":hcfqA:CIL" option ; do
(C) clean=1 ;;
+ (H) changelog_flag=1 ;;
+
(I) info_flag=1 ;;
(L) lboot_flag=1 ;;
@@ -382,6 +388,14 @@ modified=$(status $genfiles $ldefs_out) || die
commit "loaddefs" $modified || die "commit error"
+## Less important than the other stuff, so do it last.
+[ ! "$changelog_flag" ] || {
+ make change-history-nocommit || die "make change-history error"
+ modified=$(status $changelog_files) || die
+ commit "ChangeLog" $modified || die "commit error"
+}
+
+
exit 0
### update_autogen ends here
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
index 3f4b06a4df1..ad7c2739cbc 100755
--- a/build-aux/gitlog-to-changelog
+++ b/build-aux/gitlog-to-changelog
@@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}'
if 0;
# Convert git log output to ChangeLog format.
-my $VERSION = '2015-04-09 16:03'; # UTC
+my $VERSION = '2015-05-08 06:05'; # UTC
# The definition above must lie within the first 8 lines in order
# for the Emacs time-stamp write hook (at end) to update it.
# If you change this file with Emacs, please let the write hook
@@ -324,7 +324,7 @@ sub git_dir_option($)
# Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
# `(tiny change)' annotation.
- my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
+ my $tiny = (grep (/^(?:Copyright-paperwork-exempt|Tiny-change):\s+[Yy]es$/, @line)
? ' (tiny change)' : '');
my $date_line = sprintf "%s %s$tiny\n",
@@ -335,6 +335,7 @@ sub git_dir_option($)
@line = grep !/^(?:Signed-off-by:[ ].*>$
|Co-authored-by:[ ]
|Copyright-paperwork-exempt:[ ]
+ |Tiny-change:[ ]
)/x, @line;
# Remove leading and trailing blank lines.
diff --git a/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog
index 996f6d0ec7d..e38f8969bfe 100755
--- a/build-aux/gitlog-to-emacslog
+++ b/build-aux/gitlog-to-emacslog
@@ -22,35 +22,59 @@
LC_ALL=C
export LC_ALL
-gen_origin=${1?}
+# The newest revision that should not appear in the generated ChangeLog.
+gen_origin=d2c7e14ac3bd2b517d35a86255c28d5b6d779451
+force=
+output=ChangeLog
+nmax=2
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -g|--gen-origin) gen_origin="$2" ; shift ;;
+ -f|--force) force=1 ;;
+ -n|--nmax) nmax="$2"; shift ;;
+ -o|--output) output="$2" ; shift ;;
+ *) echo "Unrecognized argument: $1" >&2; exit 1 ;;
+ esac
+ shift
+done
+
+if [ ! -f ChangeLog.$nmax ]; then
+ echo "Can't find ChangeLog.$nmax" >&2
+ echo "Must be run from the top source directory" >&2
+ exit 1
+fi
+
+if [ -f "$output" ]; then
+ [ ! "$force" ] && echo "$output exists" >&2 && exit 1
+ rm -f "$output" || exit 1
+fi
# If this is not a Git repository, just generate an empty ChangeLog.
-test -d ${srcprefix}.git || {
- # Remove any old ChangeLog, in case it is a vc-dwim symlink.
- rm -f "${distprefix}ChangeLog" || exit
- >"${distprefix}ChangeLog"
+test -d .git || {
+ >"$output"
exit
}
# Use Gnulib's packaged ChangeLog generator.
-${srcprefix}build-aux/gitlog-to-changelog --ignore-matching='^; ' \
+./build-aux/gitlog-to-changelog --ignore-matching='^; ' \
--format='%B' \
- "$gen_origin.." >"${distprefix}ChangeLog.tmp" || exit
+ "$gen_origin.." >"ChangeLog.tmp" || exit
-if test -s "${distprefix}ChangeLog.tmp"; then
+if test -s "ChangeLog.tmp"; then
# Fix up bug references.
# This would be better as eg a --transform option to gitlog-to-changelog,
# but... effort. FIXME does not handle rare cases like:
# Fixes: debbugs:19434 debbugs:19519
sed 's/ Fixes: \(debbugs:\|bug#\)\([0-9][0-9]*\)/ (Bug#\2)/' \
- "${distprefix}ChangeLog.tmp" > "${distprefix}ChangeLog.tmp2"
- mv "${distprefix}ChangeLog.tmp2" "${distprefix}ChangeLog.tmp"
+ "ChangeLog.tmp" > "ChangeLog.tmp2"
+ mv "ChangeLog.tmp2" "ChangeLog.tmp"
# Find the years covered by the generated ChangeLog, so that
# a proper copyright notice can be output.
years=`
- sed -n 's/^\([0-9][0-9]*\).*/\1/p' "${distprefix}ChangeLog.tmp" |
+ sed -n 's/^\([0-9][0-9]*\).*/\1/p' "ChangeLog.tmp" |
sort -nu
`
start_year=
@@ -70,12 +94,13 @@ if test -s "${distprefix}ChangeLog.tmp"; then
sed -n '
1i\
- /^;; Local Variables:/,${
+ /^See ChangeLog.[0-9]* for earlier/,${
+ s/ChangeLog\.[0-9]*/ChangeLog.'$nmax'/
s/\(Copyright[ (C)]*\)[0-9]*-[0-9]*/\1'"$year_range"'/
p
}
- ' <ChangeLog.2 >>"${distprefix}ChangeLog.tmp" || exit
+ ' <ChangeLog.$nmax >>"ChangeLog.tmp" || exit
fi
# Install the generated ChangeLog.
-mv -i "${distprefix}ChangeLog.tmp" "${distprefix}ChangeLog"
+test "$output" = "ChangeLog.tmp" || mv "ChangeLog.tmp" "$output"
diff --git a/configure.ac b/configure.ac
index bc7081de02b..fff3db90e50 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1662,9 +1662,7 @@ dnl AC_C_BIGENDIAN is done by gnulib.
dnl check for Make feature
-DEPFLAGS=
-MKDEPDIR=":"
-deps_frag=deps.mk
+AUTO_DEPEND=no
dnl check if we have GCC and autodepend is on.
if test "$GCC" = yes && test "$ac_enable_autodepend" = yes; then
AC_MSG_CHECKING([whether gcc understands -MMD -MF])
@@ -1676,24 +1674,10 @@ if test "$GCC" = yes && test "$ac_enable_autodepend" = yes; then
rm -rf deps.d
AC_MSG_RESULT([$ac_enable_autodepend])
if test $ac_enable_autodepend = yes; then
- DEPFLAGS='-MMD -MF ${DEPDIR}/$*.d -MP'
- ## MKDIR_P is documented (see AC_PROG_MKDIR_P) to be parallel-safe.
- MKDEPDIR='${MKDIR_P} ${DEPDIR}'
- deps_frag=autodeps.mk
+ AUTO_DEPEND=yes
fi
fi
-lwlib_deps_frag=$srcdir/lwlib/$deps_frag
-oldxmenu_deps_frag=$srcdir/oldXMenu/$deps_frag
-deps_frag=$srcdir/src/$deps_frag
-AC_SUBST(MKDEPDIR)
-AC_SUBST(DEPFLAGS)
-AC_SUBST_FILE(deps_frag)
-AC_SUBST_FILE(lwlib_deps_frag)
-AC_SUBST_FILE(oldxmenu_deps_frag)
-
-lisp_frag=$srcdir/src/lisp.mk
-AC_SUBST_FILE(lisp_frag)
-
+AC_SUBST(AUTO_DEPEND)
dnl checks for operating system services
AC_SYS_LONG_FILE_NAMES
@@ -2498,15 +2482,12 @@ if test x"$pkg_check_gtk" = xyes; then
GTK_OBJ="gtkutil.o $GTK_OBJ"
term_header=$gtk_term_header
USE_X_TOOLKIT=none
- if "$PKG_CONFIG" --atleast-version=2.10 gtk+-2.0; then
- :
- else
- AC_MSG_WARN([[Your version of Gtk+ will have problems with
+ AC_MSG_WARN([[Your version of Gtk+ will have problems with
closing open displays. This is no problem if you just use
one display, but if you use more than one and close one of them
- Emacs may crash.]])
- sleep 3
- fi
+ Emacs may crash.
+ See http://bugzilla.gnome.org/show_bug.cgi?id=85715]])
+ sleep 3
fi
fi
diff --git a/doc/emacs/Makefile.in b/doc/emacs/Makefile.in
index 9932348ba67..7630780be6c 100644
--- a/doc/emacs/Makefile.in
+++ b/doc/emacs/Makefile.in
@@ -94,6 +94,7 @@ EMACS_XTRA= \
$(srcdir)/arevert-xtra.texi \
$(srcdir)/cal-xtra.texi \
$(srcdir)/dired-xtra.texi \
+ ${srcdir}/docstyle.texi \
$(srcdir)/picture-xtra.texi \
$(srcdir)/emerge-xtra.texi \
$(srcdir)/vc-xtra.texi \
diff --git a/doc/emacs/docstyle.texi b/doc/emacs/docstyle.texi
new file mode 100644
index 00000000000..dfd14306b39
--- /dev/null
+++ b/doc/emacs/docstyle.texi
@@ -0,0 +1,10 @@
+@c Emacs documentation style settings
+@documentencoding UTF-8
+@c These two require Texinfo 5.0 or later, so we use the older
+@c equivalent @set variables supported in 4.11 and hence
+@ignore
+@codequotebacktick on
+@codequoteundirected on
+@end ignore
+@set txicodequoteundirected
+@set txicodequotebacktick
diff --git a/doc/emacs/emacs-xtra.texi b/doc/emacs/emacs-xtra.texi
index fcedf7308a8..3490c08d275 100644
--- a/doc/emacs/emacs-xtra.texi
+++ b/doc/emacs/emacs-xtra.texi
@@ -2,6 +2,7 @@
@comment %**start of header
@setfilename ../../info/emacs-xtra.info
@settitle Specialized Emacs Features
+@include docstyle.texi
@c Merge all functions, variables, and keys into the concept index.
@syncodeindex fn cp
@syncodeindex vr cp
@@ -26,8 +27,6 @@ modify this GNU manual.''
@end quotation
@end copying
-@documentencoding UTF-8
-
@dircategory Emacs
@direntry
* Emacs-Xtra: (emacs-xtra). Specialized Emacs features.
diff --git a/doc/emacs/emacs.texi b/doc/emacs/emacs.texi
index caec373938d..21f645e1570 100644
--- a/doc/emacs/emacs.texi
+++ b/doc/emacs/emacs.texi
@@ -2,6 +2,7 @@
@setfilename ../../info/emacs.info
@settitle GNU Emacs Manual
+@include docstyle.texi
@c The edition number appears in more than one place in this file
@c I don't really know what it means...
@@ -44,8 +45,6 @@ developing GNU and promoting software freedom.''
@end quotation
@end copying
-@documentencoding UTF-8
-
@dircategory Emacs
@direntry
* Emacs: (emacs). The extensible self-documenting text editor.
@@ -832,7 +831,7 @@ VC Directory Mode
Version Control Branches
* Switching Branches:: How to get to another existing branch.
-* VC Pull:: Updating the contents of a branch.
+* Pulling / Pushing:: Receiving/sending changes from/to elsewhere.
* Merging:: Transferring changes between branches.
* Creating Branches:: How to start a new branch.
diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi
index a1298864df6..8ec1cd223c3 100644
--- a/doc/emacs/maintaining.texi
+++ b/doc/emacs/maintaining.texi
@@ -491,10 +491,10 @@ commit. @xref{Log Buffer}.
If committing to a shared repository, the commit may fail if the
repository that has been changed since your last update. In that
case, you must perform an update before trying again. On a
-decentralized version control system, use @kbd{C-x v +} (@pxref{VC
-Pull}) or @kbd{C-x v m} (@pxref{Merging}). On a centralized version
-control system, type @kbd{C-x v v} again to merge in the repository
-changes.
+decentralized version control system, use @kbd{C-x v +}
+(@pxref{Pulling / Pushing}) or @kbd{C-x v m} (@pxref{Merging}).
+On a centralized version control system, type @kbd{C-x v v} again to
+merge in the repository changes.
@item
Finally, if you are using a centralized version control system, check
@@ -942,7 +942,7 @@ revision at point. A second @key{RET} hides it again.
(@code{vc-log-incoming}) command displays a log buffer showing the
changes that will be applied, the next time you run the version
control system's ``pull'' command to get new revisions from another
-repository (@pxref{VC Pull}). This other repository is the default
+repository (@pxref{Pulling / Pushing}). This other repository is the default
one from which changes are pulled, as defined by the version control
system; with a prefix argument, @code{vc-log-incoming} prompts for a
specific repository. Similarly, @kbd{C-x v O}
@@ -1305,7 +1305,7 @@ different branches.
@menu
* Switching Branches:: How to get to another existing branch.
-* VC Pull:: Updating the contents of a branch.
+* Pulling / Pushing:: Receiving/sending changes from/to elsewhere.
* Merging:: Transferring changes between branches.
* Creating Branches:: How to start a new branch.
@end menu
@@ -1349,8 +1349,8 @@ unlocks (write-protects) the working tree.
branch until you switch away; for instance, any VC filesets that you
commit will be committed to that specific branch.
-@node VC Pull
-@subsubsection Pulling Changes into a Branch
+@node Pulling / Pushing
+@subsubsection Pulling/Pushing Changes into/from a Branch
@table @kbd
@item C-x v +
@@ -1359,6 +1359,11 @@ by ``pulling in'' changes from another location.
On a centralized version control system, update the current VC
fileset.
+
+@item C-x v P
+On a decentralized version control system, ``push'' changes from the
+current branch to another location. This concept does not exist
+for centralized version control systems.
@end table
@kindex C-x v +
@@ -1388,6 +1393,21 @@ Log}.
On a centralized version control system like CVS, @kbd{C-x v +}
updates the current VC fileset from the repository.
+@kindex C-x v P
+@findex vc-push
+ On a decentralized version control system, the command @kbd{C-x v P}
+(@code{vc-push}) sends changes from your current branch to another location.
+With a prefix argument, the command prompts for the exact
+version control command to use, which lets you specify where to push
+changes. Otherwise, it pushes to a default location determined
+by the version control system.
+
+ Prior to pushing, you can use @kbd{C-x v O} (@code{vc-log-outgoing})
+to view a log buffer of the changes to be sent. @xref{VC Change Log}.
+
+This command is currently supported only by Bazaar, Git, and Mercurial.
+It signals an error for centralized version control systems.
+
@node Merging
@subsubsection Merging Branches
@cindex merging changes
diff --git a/doc/emacs/mule.texi b/doc/emacs/mule.texi
index a80f942f61a..d929e0947e1 100644
--- a/doc/emacs/mule.texi
+++ b/doc/emacs/mule.texi
@@ -1,3 +1,4 @@
+@c -*- coding: utf-8 -*-
@c This is part of the Emacs manual.
@c Copyright (C) 1997, 1999-2015 Free Software Foundation, Inc.
@c See file emacs.texi for copying conditions.
@@ -214,7 +215,7 @@ faces used to display the character, and any overlays containing it
@smallexample
position: 1 of 1 (0%), column: 0
- character: @^e (displayed as @^e) (codepoint 234, #o352, #xea)
+ character: ê (displayed as ê) (codepoint 234, #o352, #xea)
preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0xEA
script: latin
@@ -1659,8 +1660,8 @@ characters present directly on the keyboard or using @key{Compose} or
@cindex compose character
@cindex dead character
@item
-For Latin-1 only, you can use the key @kbd{C-x 8} as a ``compose
-character'' prefix for entry of non-@acronym{ASCII} Latin-1 printing
+You can use the key @kbd{C-x 8} as a ``compose character'' prefix for
+entry of non-@acronym{ASCII} Latin-1 and a few other printing
characters. @kbd{C-x 8} is good for insertion (in the minibuffer as
well as other buffers), for searching, and in any other context where
a key sequence is allowed.
diff --git a/doc/lispintro/Makefile.in b/doc/lispintro/Makefile.in
index ba63ee80197..d1a696ce2c2 100644
--- a/doc/lispintro/Makefile.in
+++ b/doc/lispintro/Makefile.in
@@ -24,7 +24,7 @@ srcdir = @srcdir@
buildinfodir = $(srcdir)/../../info
# Directory with the (customized) texinfo.tex file.
texinfodir = $(srcdir)/../misc
-# Directory with emacsver.texi.
+# Directory with docstyle.texi and emacsver.texi.
emacsdir = $(srcdir)/../emacs
prefix = @prefix@
@@ -73,7 +73,7 @@ PDF_TARGETS = emacs-lisp-intro.pdf
PS_TARGETS = emacs-lisp-intro.ps
srcs = ${srcdir}/emacs-lisp-intro.texi ${srcdir}/doclicense.texi \
- ${emacsdir}/emacsver.texi
+ ${emacsdir}/docstyle.texi ${emacsdir}/emacsver.texi
## Disable implicit rules.
%.texi: ;
diff --git a/doc/lispintro/emacs-lisp-intro.texi b/doc/lispintro/emacs-lisp-intro.texi
index 46dc41a5a65..83d6022c0a6 100644
--- a/doc/lispintro/emacs-lisp-intro.texi
+++ b/doc/lispintro/emacs-lisp-intro.texi
@@ -4,7 +4,7 @@
@c setfilename emacs-lisp-intro.info
@c sethtmlfilename emacs-lisp-intro.html
@settitle Programming in Emacs Lisp
-@documentencoding UTF-8
+@include docstyle.texi
@syncodeindex vr cp
@syncodeindex fn cp
@finalout
diff --git a/doc/lispref/Makefile.in b/doc/lispref/Makefile.in
index 4c62c703462..94759173dd6 100644
--- a/doc/lispref/Makefile.in
+++ b/doc/lispref/Makefile.in
@@ -28,7 +28,7 @@ srcdir = @srcdir@
buildinfodir = $(srcdir)/../../info
# Directory with the (customized) texinfo.tex file.
texinfodir = $(srcdir)/../misc
-# Directory with emacsver.texi.
+# Directory with docstyle.tex and emacsver.texi.
emacsdir = $(srcdir)/../emacs
prefix = @prefix@
@@ -80,6 +80,7 @@ PS_TARGETS = elisp.ps
srcs = \
$(srcdir)/elisp.texi \
+ $(emacsdir)/docstyle.texi \
$(emacsdir)/emacsver.texi \
$(srcdir)/abbrevs.texi \
$(srcdir)/anti.texi \
diff --git a/doc/lispref/back.texi b/doc/lispref/back.texi
index 5edfb671773..3433277ca0f 100644
--- a/doc/lispref/back.texi
+++ b/doc/lispref/back.texi
@@ -6,7 +6,7 @@
@c %**start of header
@setfilename back-cover
@settitle GNU Emacs Lisp Reference Manual
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
.
@sp 7
diff --git a/doc/lispref/book-spine.texi b/doc/lispref/book-spine.texi
index f58fb77dcc1..8c6381f3d81 100644
--- a/doc/lispref/book-spine.texi
+++ b/doc/lispref/book-spine.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename book-spine
@settitle book-spine
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@include emacsver.texi
diff --git a/doc/lispref/debugging.texi b/doc/lispref/debugging.texi
index 0ccac18057c..47b24997551 100644
--- a/doc/lispref/debugging.texi
+++ b/doc/lispref/debugging.texi
@@ -815,6 +815,7 @@ be cleaner to combine them.
@node Profiling
@section Profiling
@cindex profiling
+@cindex profile
@cindex measuring resource usage
@cindex memory usage
diff --git a/doc/lispref/elisp.texi b/doc/lispref/elisp.texi
index bf1fc4db173..a32c69c1c2f 100644
--- a/doc/lispref/elisp.texi
+++ b/doc/lispref/elisp.texi
@@ -18,6 +18,7 @@
@ifclear volflag
@settitle GNU Emacs Lisp Reference Manual
@end ifclear
+@include docstyle.texi
@c %**end of header
@@ -115,8 +116,6 @@ developing GNU and promoting software freedom.''
@end quotation
@end copying
-@documentencoding UTF-8
-
@dircategory Emacs lisp
@direntry
* Elisp: (elisp). The Emacs Lisp Reference Manual.
diff --git a/doc/lispref/keymaps.texi b/doc/lispref/keymaps.texi
index 7ba45a6023f..7752bf0617c 100644
--- a/doc/lispref/keymaps.texi
+++ b/doc/lispref/keymaps.texi
@@ -1,4 +1,4 @@
-@c -*-texinfo-*-
+@c -*- mode: texinfo; coding: utf-8 -*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990-1994, 1998-2015 Free Software Foundation, Inc.
@c See the file elisp.texi for copying conditions.
@@ -1717,14 +1717,14 @@ they usually will be in a Lisp file (@pxref{Loading Non-ASCII}), you
must type the keys as multibyte too. For instance, if you use this:
@smallexample
-(global-set-key "@"o" 'my-function) ; bind o-umlaut
+(global-set-key "ö" 'my-function) ; bind o-umlaut
@end smallexample
@noindent
or
@smallexample
-(global-set-key ?@"o 'my-function) ; bind o-umlaut
+(global-set-key ?ö 'my-function) ; bind o-umlaut
@end smallexample
@noindent
diff --git a/doc/lispref/lay-flat.texi b/doc/lispref/lay-flat.texi
index 81755b6227f..947beeca23c 100644
--- a/doc/lispref/lay-flat.texi
+++ b/doc/lispref/lay-flat.texi
@@ -6,8 +6,8 @@
@comment %**start of header
@setfilename inner-covers.info
@settitle Inner Covers
+@include docstyle.texi
@smallbook
-@documentencoding UTF-8
@comment %**end of header
@headings off
diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi
index 8cb0f3db246..c325506da11 100644
--- a/doc/lispref/modes.texi
+++ b/doc/lispref/modes.texi
@@ -958,9 +958,9 @@ Menu,,, emacs, The GNU Emacs Manual}).
way, specifying @code{tabulated-list-mode} as the second argument
(@pxref{Derived Modes}). The body of the @code{define-derived-mode}
form should specify the format of the tabulated data, by assigning
-values to the variables documented below; then, it should call the
-function @code{tabulated-list-init-header} to initialize the header
-line.
+values to the variables documented below; optionally, it can then call
+the function @code{tabulated-list-init-header}, which will populate a
+header with the names of the columns.
The derived mode should also define a @dfn{listing command}. This,
not the mode command, is what the user calls (e.g., @kbd{M-x
diff --git a/doc/lispref/nonascii.texi b/doc/lispref/nonascii.texi
index 05d5ca48043..28f90d9567a 100644
--- a/doc/lispref/nonascii.texi
+++ b/doc/lispref/nonascii.texi
@@ -1,4 +1,4 @@
-@c -*-texinfo-*-
+@c -*- mode: texinfo; coding: utf-8 -*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1998-1999, 2001-2015 Free Software Foundation, Inc.
@c See the file elisp.texi for copying conditions.
@@ -1817,7 +1817,7 @@ original text:
@example
@group
(decode-coding-string "Gr\374ss Gott" 'latin-1)
- @result{} #("Gr@"uss Gott" 0 9 (charset iso-8859-1))
+ @result{} #("Grüss Gott" 0 9 (charset iso-8859-1))
@end group
@end example
@end defun
diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi
index c7d71d2aba9..c4c74ec7556 100644
--- a/doc/lispref/objects.texi
+++ b/doc/lispref/objects.texi
@@ -1,4 +1,4 @@
-@c -*-texinfo-*-
+@c -*- mode: texinfo; coding: utf-8 -*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990-1995, 1998-1999, 2001-2015 Free Software
@c Foundation, Inc.
@@ -375,13 +375,7 @@ that, Emacs signals an error.
codes. A hexadecimal escape sequence consists of a backslash,
@samp{x}, and the hexadecimal character code. Thus, @samp{?\x41} is
the character @kbd{A}, @samp{?\x1} is the character @kbd{C-a}, and
-@code{?\xe0} is the character
-@iftex
-@samp{@`a}.
-@end iftex
-@ifnottex
-@samp{a} with grave accent.
-@end ifnottex
+@code{?\xe0} is the character @kbd{à} (@kbd{a} with grave accent).
You can use any number of hex digits, so you can represent any
character code in this way.
diff --git a/doc/lispref/positions.texi b/doc/lispref/positions.texi
index fc47f1c7a78..e7c79d58241 100644
--- a/doc/lispref/positions.texi
+++ b/doc/lispref/positions.texi
@@ -888,6 +888,14 @@ type @code{nil}. @xref{Marker Insertion Types}. Therefore, when the
saved point value is restored, it normally comes before the inserted
text.
+@defmac save-mark-and-excursion body@dots{}
+@cindex mark excursion
+@cindex point excursion
+This macro is like @code{save-excursion}, but also saves and restores
+the mark location and @code{mark-active}. This macro does what
+@code{save-excursion} did before Emacs 25.1.
+@end defmac
+
@node Narrowing
@section Narrowing
@cindex narrowing
diff --git a/doc/lispref/sequences.texi b/doc/lispref/sequences.texi
index b48fae4741f..72976b18952 100644
--- a/doc/lispref/sequences.texi
+++ b/doc/lispref/sequences.texi
@@ -413,7 +413,7 @@ but their relative order is also preserved:
(9 . "aaa") (9 . "zzz") (9 . "ppp") (9 . "fff")]
@end group
@end example
-
+
@xref{Sorting}, for more functions that perform sorting.
See @code{documentation} in @ref{Accessing Documentation}, for a
useful example of @code{sort}.
@@ -797,6 +797,42 @@ vector or string (@pxref{Iteration} for more information about the
@code{dolist} macro). This is primarily useful for side-effects.
@end defmac
+@defmac seq-let arguments sequence body@dots{}
+@cindex sequence destructuring
+ This macro binds the variables in defined in the sequence
+@var{arguments} to the elements of the sequence @var{sequence}.
+@var{arguments} can itself include sequences allowing for nested
+destructuring.
+
+The @var{arguments} sequence can also include the @code{&rest} marker
+followed by a variable name to be bound to the rest of
+@code{sequence}.
+
+@example
+@group
+(seq-let [first second] [1 2 3 4]
+ (list first second))
+@result{} (1 2)
+@end group
+@group
+(seq-let (_ a _ b) '(1 2 3 4)
+ (list a b))
+@result{} (2 4)
+@end group
+@group
+(seq-let [a [b [c]]] [1 [2 [3]]]
+ (list a b c))
+@result{} (1 2 3)
+@end group
+@group
+(seq-let [a b &rest others] [1 2 3 4]
+ others)
+@end group
+@result{} [3 4]
+@end example
+@end defmac
+
+
@node Arrays
@section Arrays
@cindex array
diff --git a/doc/misc/Makefile.in b/doc/misc/Makefile.in
index 1f21f829380..aa35002e85e 100644
--- a/doc/misc/Makefile.in
+++ b/doc/misc/Makefile.in
@@ -29,7 +29,7 @@ srcdir=@srcdir@
## In a tarfile of Emacs, the Info files should be up to date.
buildinfodir = $(srcdir)/../../info
-## Directory with emacsver.texi.
+## Directory with docstyle.texi and emacsver.texi.
emacsdir = $(srcdir)/../emacs
prefix = @prefix@
@@ -108,6 +108,7 @@ ENVADD = $(AM_V_GEN)TEXINPUTS="$(srcdir):$(emacsdir):$(TEXINPUTS)" \
MAKEINFO="$(MAKEINFO) $(MAKEINFO_OPTS)"
gfdl = ${srcdir}/doclicense.texi
+style = ${emacsdir}/docstyle.texi
.PHONY: info dvi html pdf ps echo-info $(INFO_TARGETS)
## Prevent implicit rule triggering for foo.info.
@@ -140,7 +141,7 @@ ${buildinfodir}:
EXTRA_OPTS =
-${buildinfodir}/%.info: ${srcdir}/%.texi ${gfdl} | ${buildinfodir}
+${buildinfodir}/%.info: ${srcdir}/%.texi ${gfdl} ${style} | ${buildinfodir}
$(AM_V_GEN)$(MAKEINFO) $(MAKEINFO_OPTS) $(INFO_OPTS) $(EXTRA_OPTS) \
-o $@ $<
@@ -155,13 +156,13 @@ info.info: $(buildinfodir)/info.info
$(foreach ifile,$(filter-out info.info,$(INFO_TARGETS)),$(eval $(call info_template,$(ifile))))
-%.dvi: ${srcdir}/%.texi ${gfdl}
+%.dvi: ${srcdir}/%.texi ${gfdl} ${style}
$(ENVADD) $(TEXI2DVI) $<
-%.pdf: ${srcdir}/%.texi ${gfdl}
+%.pdf: ${srcdir}/%.texi ${gfdl} ${style}
$(ENVADD) $(TEXI2PDF) $<
-%.html: ${srcdir}/%.texi ${gfdl}
+%.html: ${srcdir}/%.texi ${gfdl} ${style}
$(AM_V_GEN)$(MAKEINFO) $(MAKEINFO_OPTS) $(HTML_OPTS) $(EXTRA_OPTS) \
-o $@ $<
@@ -184,12 +185,13 @@ $(buildinfodir)/semantic.info semantic.dvi semantic.pdf semantic.html: ${srcdir}
## Please can we just rename cc-mode.texi to ccmode.texi...
-${buildinfodir}/ccmode.info: ${srcdir}/cc-mode.texi ${gfdl} | ${buildinfodir}
+${buildinfodir}/ccmode.info: \
+ ${srcdir}/cc-mode.texi ${gfdl} ${style} | ${buildinfodir}
$(AM_V_GEN)$(MAKEINFO) $(MAKEINFO_OPTS) $(INFO_OPTS) -o $@ $<
## efaq, efaq_w32 do not depend on gfdl.
## Maybe we can use .SECONDEXPANSION for this.
-${buildinfodir}/efaq%.info: ${srcdir}/efaq%.texi | ${buildinfodir}
+${buildinfodir}/efaq%.info: ${srcdir}/efaq%.texi ${style} | ${buildinfodir}
$(AM_V_GEN)$(MAKEINFO) $(MAKEINFO_OPTS) $(INFO_OPTS) -o $@ $<
efaq%.dvi: ${srcdir}/efaq%.texi
@@ -203,7 +205,7 @@ efaq%.html: ${srcdir}/efaq%.texi
${buildinfodir}/emacs-mime.info emacs-mime.html: EXTRA_OPTS = --enable-encoding
-gnus_deps = ${srcdir}/gnus.texi ${srcdir}/gnus-faq.texi ${gfdl}
+gnus_deps = ${srcdir}/gnus.texi ${srcdir}/gnus-faq.texi ${gfdl} ${style}
gnus.dvi: $(gnus_deps)
sed -e '/@iflatex/,/@end iflatex/d' $< > gnustmpdvi.texi
$(ENVADD) $(TEXI2DVI) gnustmpdvi.texi
diff --git a/doc/misc/ada-mode.texi b/doc/misc/ada-mode.texi
index 539e2b23fcb..e84ef6eb512 100644
--- a/doc/misc/ada-mode.texi
+++ b/doc/misc/ada-mode.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename ../../info/ada-mode.info
@settitle Ada Mode
-@documentencoding UTF-8
+@include docstyle.texi
@copying
Copyright @copyright{} 1999--2015 Free Software Foundation, Inc.
diff --git a/doc/misc/auth.texi b/doc/misc/auth.texi
index 177f7ccada0..082dc1dacdf 100644
--- a/doc/misc/auth.texi
+++ b/doc/misc/auth.texi
@@ -6,7 +6,7 @@
@setfilename ../../info/auth.info
@settitle Emacs auth-source Library @value{VERSION}
-@documentencoding UTF-8
+@include docstyle.texi
@copying
This file describes the Emacs auth-source library.
diff --git a/doc/misc/autotype.texi b/doc/misc/autotype.texi
index 51880d8afe9..acc98ed2a1b 100644
--- a/doc/misc/autotype.texi
+++ b/doc/misc/autotype.texi
@@ -5,7 +5,7 @@
@c @node Autotypist, Picture, Abbrevs, Top
@c @chapter Features for Automatic Typing
@settitle Features for Automatic Typing
-@documentencoding UTF-8
+@include docstyle.texi
@c @cindex text
@c @cindex selfinserting text
@c @cindex autotypist
diff --git a/doc/misc/bovine.texi b/doc/misc/bovine.texi
index cd2e7365f25..ec11aa896ff 100644
--- a/doc/misc/bovine.texi
+++ b/doc/misc/bovine.texi
@@ -4,7 +4,7 @@
@set TITLE Bovine parser development
@set AUTHOR Eric M. Ludlam, David Ponce, and Richard Y. Kim
@settitle @value{TITLE}
-@documentencoding UTF-8
+@include docstyle.texi
@c *************************************************************************
@c @ Header
diff --git a/doc/misc/calc.texi b/doc/misc/calc.texi
index 84eb274bb49..034f42b1a16 100644
--- a/doc/misc/calc.texi
+++ b/doc/misc/calc.texi
@@ -1,10 +1,10 @@
-\input texinfo @c -*-texinfo-*-
+\input texinfo @c -*- mode: texinfo; coding: utf-8 -*-
@comment %**start of header (This is for running Texinfo on a region.)
@c smallbook
@setfilename ../../info/calc.info
@c [title]
@settitle GNU Emacs Calc Manual
-@documentencoding UTF-8
+@include docstyle.texi
@setchapternewpage odd
@comment %**end of header (This is for running Texinfo on a region.)
@@ -1203,9 +1203,7 @@ algebra system for microcomputers.
Many people have contributed to Calc by reporting bugs and suggesting
features, large and small. A few deserve special mention: Tim Peters,
who helped develop the ideas that led to the selection commands, rewrite
-rules, and many other algebra features;
-@texline Fran\c{c}ois
-@infoline Francois
+rules, and many other algebra features; François
Pinard, who contributed an early prototype of the Calc Summary appendix
as well as providing valuable suggestions in many other areas of Calc;
Carl Witty, whose eagle eyes discovered many typographical and factual
@@ -7218,9 +7216,7 @@ so that the mapping operation works; no prime factor will ever be
zero, so adding zeros on the left and right is safe. From then on
the job is pretty straightforward.
-Incidentally, Calc provides the
-@texline @dfn{M@"obius} @math{\mu}
-@infoline @dfn{Moebius mu}
+Incidentally, Calc provides the @dfn{Möbius μ}
function which is zero if and only if its argument is square-free. It
would be a much more convenient way to do the above test in practice.
@@ -8098,7 +8094,7 @@ argument is exactly what we want to map over:
@end smallexample
@noindent
-Et voil@`a, September 13, 1991 is a Friday.
+Et voilà, September 13, 1991 is a Friday.
@smallexample
@group
@@ -19304,9 +19300,7 @@ are relatively prime to @expr{n}.
@pindex calc-moebius
@tindex moebius
The @kbd{k m} (@code{calc-moebius}) [@code{moebius}] command computes the
-@texline M@"obius @math{\mu}
-@infoline Moebius ``mu''
-function. If the input number is a product of @expr{k}
+Möbius μ function. If the input number is a product of @expr{k}
distinct factors, this is @expr{(-1)^k}. If the input number has any
duplicate factors (i.e., can be divided by the same prime more than once),
the result is zero.
@@ -27698,9 +27692,7 @@ the keyboard macro @kbd{' tri($) @key{RET}} to make a command that applies
@code{tri} to the value on the top of the stack. @xref{Programming}.
@cindex Quaternions
-The following rule set, contributed by
-@texline Fran\c cois
-@infoline Francois
+The following rule set, contributed by François
Pinard, implements @dfn{quaternions}, a generalization of the concept of
complex numbers. Quaternions have four components, and are here
represented by function calls @samp{quat(@var{w}, [@var{x}, @var{y},
@@ -28048,7 +28040,7 @@ based on a fundamental physical process (although there are efforts to
change this) is the kilogram, which was originally defined as the mass
of one liter of water, but is now defined as the mass of the
international prototype of the kilogram (IPK), a cylinder of platinum-iridium
-kept at the Bureau international des poids et mesures in S@`evres,
+kept at the Bureau international des poids et mesures in Sèvres,
France. (There are several copies of the IPK throughout the world.)
The British imperial units, once defined in terms of physical objects,
were redefined in 1963 in terms of SI units. The US customary units,
diff --git a/doc/misc/cc-mode.texi b/doc/misc/cc-mode.texi
index b86df189bd8..5ad29cd79ad 100644
--- a/doc/misc/cc-mode.texi
+++ b/doc/misc/cc-mode.texi
@@ -83,7 +83,7 @@ the second with them pointing to the XEmacs manuals.
@setfilename ../../info/ccmode.info
@settitle CC Mode Manual
-@documentencoding UTF-8
+@include docstyle.texi
@footnotestyle end
@c The following four macros generate the filenames and titles of the
diff --git a/doc/misc/cl.texi b/doc/misc/cl.texi
index 00e47b9f742..d7b3f4a0a68 100644
--- a/doc/misc/cl.texi
+++ b/doc/misc/cl.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename ../../info/cl.info
@settitle Common Lisp Extensions
-@documentencoding UTF-8
+@include docstyle.texi
@include emacsver.texi
@copying
diff --git a/doc/misc/dbus.texi b/doc/misc/dbus.texi
index 2eef4f4e7e7..5dd8bf21c13 100644
--- a/doc/misc/dbus.texi
+++ b/doc/misc/dbus.texi
@@ -1,8 +1,8 @@
-\input texinfo @c -*-texinfo-*-
+\input texinfo @c -*- coding: utf-8 -*-
@setfilename ../../info/dbus.info
@c %**start of header
@settitle Using of D-Bus
-@documentencoding UTF-8
+@include docstyle.texi
@c @setchapternewpage odd
@c %**end of header
diff --git a/doc/misc/dired-x.texi b/doc/misc/dired-x.texi
index 90fb5119511..e6370f3d80b 100644
--- a/doc/misc/dired-x.texi
+++ b/doc/misc/dired-x.texi
@@ -9,7 +9,7 @@
@comment %**start of header (This is for running Texinfo on a region.)
@setfilename ../../info/dired-x.info
@settitle Dired Extra User's Manual
-@documentencoding UTF-8
+@include docstyle.texi
@include emacsver.texi
diff --git a/doc/misc/ebrowse.texi b/doc/misc/ebrowse.texi
index 1b240079b70..74183a4d6a8 100644
--- a/doc/misc/ebrowse.texi
+++ b/doc/misc/ebrowse.texi
@@ -3,7 +3,7 @@
@comment %**start of header
@setfilename ../../info/ebrowse.info
@settitle A Class Browser for C++
-@documentencoding UTF-8
+@include docstyle.texi
@setchapternewpage odd
@syncodeindex fn cp
@comment %**end of header
diff --git a/doc/misc/ede.texi b/doc/misc/ede.texi
index dfe22b7b054..7a824acfed5 100644
--- a/doc/misc/ede.texi
+++ b/doc/misc/ede.texi
@@ -1,7 +1,7 @@
\input texinfo
@setfilename ../../info/ede.info
@settitle Emacs Development Environment
-@documentencoding UTF-8
+@include docstyle.texi
@copying
This file describes EDE, the Emacs Development Environment.
diff --git a/doc/misc/ediff.texi b/doc/misc/ediff.texi
index de54f288146..552e3be6598 100644
--- a/doc/misc/ediff.texi
+++ b/doc/misc/ediff.texi
@@ -1,4 +1,4 @@
-\input texinfo @c -*-texinfo-*-
+\input texinfo @c -*- mode: texinfo; coding: utf-8 -*-
@c documentation for Ediff
@c Written by Michael Kifer
@@ -10,7 +10,7 @@
@setfilename ../../info/ediff.info
@settitle Ediff User's Manual
-@documentencoding UTF-8
+@include docstyle.texi
@synindex vr cp
@synindex fn cp
@synindex pg cp
@@ -2485,7 +2485,7 @@ Ray Nickson (nickson at cs.uq.oz.au),
Dan Nicolaescu (dann at ics.uci.edu),
David Petchey (petchey_david at jpmorgan.com),
Benjamin Pierce (benjamin.pierce at cl.cam.ac.uk),
-Francois Pinard (pinard at iro.umontreal.ca),
+François Pinard (pinard at iro.umontreal.ca),
Tibor Polgar (tlp00 at spg.amdahl.com),
David Prince (dave0d at fegs.co.uk),
Paul Raines (raines at slac.stanford.edu),
diff --git a/doc/misc/edt.texi b/doc/misc/edt.texi
index c72aca27ef9..91f36e6c538 100644
--- a/doc/misc/edt.texi
+++ b/doc/misc/edt.texi
@@ -1,7 +1,7 @@
\input texinfo
@setfilename ../../info/edt.info
@settitle EDT Emulation for Emacs
-@documentencoding UTF-8
+@include docstyle.texi
@copying
This file documents the EDT emulation package for Emacs.
diff --git a/doc/misc/efaq-w32.texi b/doc/misc/efaq-w32.texi
index 566a6d75886..f8a188dba6b 100644
--- a/doc/misc/efaq-w32.texi
+++ b/doc/misc/efaq-w32.texi
@@ -1,6 +1,7 @@
\input texinfo @c -*-coding:utf-8 -*-
@setfilename ../../info/efaq-w32.info
@settitle GNU Emacs FAQ For MS Windows
+@include docstyle.texi
@setchapternewpage odd
@syncodeindex pg cp
@syncodeindex ky cp
@@ -13,9 +14,6 @@ Answers to Frequently asked Questions about using Emacs on Microsoft Windows.
@include emacsver.texi
-@documentencoding utf-8
-@documentlanguage en
-
@copying
Copyright @copyright{} 2008, 2010-2015 Free Software Foundation, Inc.
diff --git a/doc/misc/efaq.texi b/doc/misc/efaq.texi
index 9fc8cfcd33c..3e9109d0924 100644
--- a/doc/misc/efaq.texi
+++ b/doc/misc/efaq.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/efaq.info
@settitle GNU Emacs FAQ
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@include emacsver.texi
diff --git a/doc/misc/eieio.texi b/doc/misc/eieio.texi
index 5d1a8cf0702..fb4e1470016 100644
--- a/doc/misc/eieio.texi
+++ b/doc/misc/eieio.texi
@@ -3,7 +3,7 @@
@set TITLE Enhanced Implementation of Emacs Interpreted Objects
@set AUTHOR Eric M. Ludlam
@settitle @value{TITLE}
-@documentencoding UTF-8
+@include docstyle.texi
@c *************************************************************************
@c @ Header
diff --git a/doc/misc/emacs-gnutls.texi b/doc/misc/emacs-gnutls.texi
index 25bb9d05f3e..4f6ef010ef3 100644
--- a/doc/misc/emacs-gnutls.texi
+++ b/doc/misc/emacs-gnutls.texi
@@ -4,7 +4,7 @@
@setfilename ../../info/emacs-gnutls.info
@settitle Emacs GnuTLS Integration @value{VERSION}
-@documentencoding UTF-8
+@include docstyle.texi
@copying
This file describes the Emacs GnuTLS integration.
diff --git a/doc/misc/emacs-mime.texi b/doc/misc/emacs-mime.texi
index 0147db34fff..3b3df0fa879 100644
--- a/doc/misc/emacs-mime.texi
+++ b/doc/misc/emacs-mime.texi
@@ -4,6 +4,7 @@
@setfilename ../../info/emacs-mime.info
@settitle Emacs MIME Manual
+@include docstyle.texi
@synindex fn cp
@synindex vr cp
@synindex pg cp
@@ -27,7 +28,6 @@ modify this GNU manual.''
@end copying
@c Node ``Interface Functions'' uses non-ASCII characters
-@documentencoding UTF-8
@dircategory Emacs lisp libraries
@direntry
diff --git a/doc/misc/epa.texi b/doc/misc/epa.texi
index 8de8604634a..6830ba7d220 100644
--- a/doc/misc/epa.texi
+++ b/doc/misc/epa.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/epa.info
@settitle EasyPG Assistant User's Manual
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@set VERSION 1.0.0
diff --git a/doc/misc/erc.texi b/doc/misc/erc.texi
index 9cdfe7702e5..9e570da3d1d 100644
--- a/doc/misc/erc.texi
+++ b/doc/misc/erc.texi
@@ -2,9 +2,9 @@
@c %**start of header
@setfilename ../../info/erc.info
@settitle ERC Manual
+@include docstyle.texi
@syncodeindex fn cp
@include emacsver.texi
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/ert.texi b/doc/misc/ert.texi
index 710ebbba454..3192e4bdc0a 100644
--- a/doc/misc/ert.texi
+++ b/doc/misc/ert.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/ert.info
@settitle Emacs Lisp Regression Testing
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@dircategory Emacs misc features
diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi
index b2fbd7ac267..60a1af0678d 100644
--- a/doc/misc/eshell.texi
+++ b/doc/misc/eshell.texi
@@ -2,9 +2,9 @@
@c %**start of header
@setfilename ../../info/eshell.info
@settitle Eshell: The Emacs Shell
+@include docstyle.texi
@defindex cm
@synindex vr fn
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/eudc.texi b/doc/misc/eudc.texi
index 064f5705777..33c9a0eb3a9 100644
--- a/doc/misc/eudc.texi
+++ b/doc/misc/eudc.texi
@@ -2,8 +2,8 @@
@c %**start of header
@setfilename ../../info/eudc.info
@settitle Emacs Unified Directory Client (EUDC) Manual
+@include docstyle.texi
@afourpaper
-@documentencoding UTF-8
@syncodeindex fn cp
@syncodeindex vr cp
@c %**end of header
diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi
index c7f84b5d4f0..f1347b7b3bb 100644
--- a/doc/misc/eww.texi
+++ b/doc/misc/eww.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/eww.info
@settitle Emacs Web Wowser
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@copying
diff --git a/doc/misc/flymake.texi b/doc/misc/flymake.texi
index 31fa1ab26a9..6c924cf9547 100644
--- a/doc/misc/flymake.texi
+++ b/doc/misc/flymake.texi
@@ -4,8 +4,8 @@
@set VERSION 0.3
@set UPDATED April 2004
@settitle GNU Flymake @value{VERSION}
+@include docstyle.texi
@syncodeindex pg cp
-@documentencoding UTF-8
@comment %**end of header
@copying
diff --git a/doc/misc/forms.texi b/doc/misc/forms.texi
index ab284bd99bc..487cebd6cc2 100644
--- a/doc/misc/forms.texi
+++ b/doc/misc/forms.texi
@@ -5,6 +5,7 @@
@comment %**start of header (This is for running Texinfo on a region.)
@setfilename ../../info/forms.info
@settitle Forms Mode User's Manual
+@include docstyle.texi
@syncodeindex vr cp
@syncodeindex fn cp
@syncodeindex ky cp
@@ -14,7 +15,6 @@
@end iftex
@c @smallbook
@comment %**end of header (This is for running Texinfo on a region.)
-@documentencoding UTF-8
@copying
This file documents Forms mode, a form-editing major mode for GNU Emacs.
diff --git a/doc/misc/gnus-coding.texi b/doc/misc/gnus-coding.texi
index bbead6b085b..a3be0edb965 100644
--- a/doc/misc/gnus-coding.texi
+++ b/doc/misc/gnus-coding.texi
@@ -2,7 +2,7 @@
@setfilename gnus-coding.info
@settitle Gnus Coding Style and Maintenance Guide
-@documentencoding UTF-8
+@include docstyle.texi
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex pg cp
diff --git a/doc/misc/gnus-faq.texi b/doc/misc/gnus-faq.texi
index 8126827ffbd..76d1a5275e5 100644
--- a/doc/misc/gnus-faq.texi
+++ b/doc/misc/gnus-faq.texi
@@ -5,7 +5,7 @@
@c
@c @setfilename gnus-faq.info
@c @settitle Frequently Asked Questions
-@c @documentencoding UTF-8
+@c @include docstyle.texi
@c %**end of header
@c
diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 97e56e19cc0..d801031c563 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -4,12 +4,11 @@
@setfilename ../../info/gnus.info
@settitle Gnus Manual
+@include docstyle.texi
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex pg cp
-@documentencoding UTF-8
-
@copying
Copyright @copyright{} 1995--2015 Free Software Foundation, Inc.
@@ -9083,7 +9082,7 @@ CRs into LF (this takes care of Mac line endings)
Treat quoted-printable (@code{gnus-article-de-quoted-unreadable}).
Quoted-Printable is one common @acronym{MIME} encoding employed when
sending non-@acronym{ASCII} (i.e., 8-bit) articles. It typically
-makes strings like @samp{d@'ej@`a vu} look like @samp{d=E9j=E0 vu},
+makes strings like @samp{déjà vu} look like @samp{d=E9j=E0 vu},
which doesn't look very readable to me. Note that this is usually
done automatically by Gnus if the message in question has a
@code{Content-Transfer-Encoding} header that says that this encoding
@@ -16968,7 +16967,7 @@ group as read.
If the search engine changes its output substantially, @code{nnweb}
won't be able to parse it and will fail. One could hardly fault the Web
-providers if they were to do this---their @emph{raison d'@^etre} is to
+providers if they were to do this---their @emph{raison d'être} is to
make money off of advertisements, not to provide services to the
community. Since @code{nnweb} washes the ads off all the articles, one
might think that the providers might be somewhat miffed. We'll see.
@@ -26815,7 +26814,7 @@ David Moore---rewrite of @file{nnvirtual.el} and many other things.
Kevin Davidson---came up with the name @dfn{ding}, so blame him.
@item
-Fran@,{c}ois Pinard---many, many interesting and thorough bug reports, as
+François Pinard---many, many interesting and thorough bug reports, as
well as autoconf support.
@end itemize
@@ -26923,7 +26922,7 @@ Gunnar Horrigmo,
Richard Hoskins,
Brad Howes,
Miguel de Icaza,
-Fran@,{c}ois Felix Ingrand,
+François Felix Ingrand,
Tatsuya Ichikawa, @c Ichikawa
Ishikawa Ichiro, @c Ishikawa
Lee Iverson,
diff --git a/doc/misc/htmlfontify.texi b/doc/misc/htmlfontify.texi
index 8140b43e783..b14f2d3b8fd 100644
--- a/doc/misc/htmlfontify.texi
+++ b/doc/misc/htmlfontify.texi
@@ -2,8 +2,8 @@
@comment %**start of header
@setfilename ../../info/htmlfontify.info
@settitle Htmlfontify User Manual
+@include docstyle.texi
@exampleindent 2
-@documentencoding UTF-8
@comment %**end of header
@copying
diff --git a/doc/misc/idlwave.texi b/doc/misc/idlwave.texi
index ca449e44d0f..7fe8f51d986 100644
--- a/doc/misc/idlwave.texi
+++ b/doc/misc/idlwave.texi
@@ -2,6 +2,7 @@
@c %**start of header
@setfilename ../../info/idlwave.info
@settitle IDLWAVE User Manual
+@include docstyle.texi
@synindex ky cp
@syncodeindex vr cp
@syncodeindex fn cp
@@ -12,7 +13,6 @@
@set DATE April, 2007
@set AUTHOR J.D. Smith & Carsten Dominik
@set MAINTAINER J.D. Smith
-@documentencoding UTF-8
@c %**end of header
@finalout
diff --git a/doc/misc/ido.texi b/doc/misc/ido.texi
index a80620f681f..afc323888c3 100644
--- a/doc/misc/ido.texi
+++ b/doc/misc/ido.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename ../../info/ido.info
@settitle Interactive Do
-@documentencoding UTF-8
+@include docstyle.texi
@include emacsver.texi
@copying
diff --git a/doc/misc/info.texi b/doc/misc/info.texi
index 7337b467156..1439d30ccee 100644
--- a/doc/misc/info.texi
+++ b/doc/misc/info.texi
@@ -5,10 +5,10 @@
@comment %**start of header
@setfilename info.info
@settitle Info
+@include docstyle.texi
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
-@documentencoding UTF-8
@comment %**end of header
@copying
diff --git a/doc/misc/mairix-el.texi b/doc/misc/mairix-el.texi
index 16f490270fd..ef253a0138c 100644
--- a/doc/misc/mairix-el.texi
+++ b/doc/misc/mairix-el.texi
@@ -2,8 +2,7 @@
@setfilename ../../info/mairix-el.info
@settitle Emacs Interface for Mairix
-
-@documentencoding UTF-8
+@include docstyle.texi
@copying
Copyright @copyright{} 2008--2015 Free Software Foundation, Inc.
diff --git a/doc/misc/message.texi b/doc/misc/message.texi
index 884d8299921..d63f7e6a8f6 100644
--- a/doc/misc/message.texi
+++ b/doc/misc/message.texi
@@ -4,7 +4,7 @@
@setfilename ../../info/message.info
@settitle Message Manual
-@documentencoding UTF-8
+@include docstyle.texi
@synindex fn cp
@synindex vr cp
@synindex pg cp
diff --git a/doc/misc/mh-e.texi b/doc/misc/mh-e.texi
index fc2303c60e1..8406a80b3d7 100644
--- a/doc/misc/mh-e.texi
+++ b/doc/misc/mh-e.texi
@@ -5,7 +5,7 @@
@c %**start of header
@setfilename ../../info/mh-e.info
@settitle The MH-E Manual
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@c Version of the software and manual.
diff --git a/doc/misc/newsticker.texi b/doc/misc/newsticker.texi
index dfabb9290dd..9f7b6df1ab5 100644
--- a/doc/misc/newsticker.texi
+++ b/doc/misc/newsticker.texi
@@ -4,10 +4,10 @@
@include emacsver.texi
@set VERSION @value{EMACSVER}
@settitle Newsticker @value{VERSION}
+@include docstyle.texi
@syncodeindex vr cp
@syncodeindex fn cp
@syncodeindex pg cp
-@documentencoding UTF-8
@comment %**end of header
@copying
diff --git a/doc/misc/nxml-mode.texi b/doc/misc/nxml-mode.texi
index d213355b877..e87e6a05619 100644
--- a/doc/misc/nxml-mode.texi
+++ b/doc/misc/nxml-mode.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/nxml-mode.info
@settitle nXML Mode
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@copying
diff --git a/doc/misc/octave-mode.texi b/doc/misc/octave-mode.texi
index 3199ec4d146..34499c2d58c 100644
--- a/doc/misc/octave-mode.texi
+++ b/doc/misc/octave-mode.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/octave-mode.info
@settitle Octave Mode
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@copying
diff --git a/doc/misc/org.texi b/doc/misc/org.texi
index a2cc51ec259..71572f72d7a 100644
--- a/doc/misc/org.texi
+++ b/doc/misc/org.texi
@@ -1,7 +1,8 @@
-\input texinfo
+\input texinfo @c -*- coding: utf-8 -*-
@c %**start of header
@setfilename ../../info/org.info
@settitle The Org Manual
+@include docstyle.texi
@set VERSION 8.2.9
@@ -11,7 +12,6 @@
@set MAINTAINER Carsten Dominik
@set MAINTAINEREMAIL @email{carsten at orgmode dot org}
@set MAINTAINERCONTACT @uref{mailto:carsten at orgmode dot org,contact the maintainer}
-@documentencoding UTF-8
@c %**end of header
@finalout
@@ -18487,7 +18487,7 @@ enabled source code highlighting in Gnus.
Max-Planck-Institute for Neurology. He also inspired the creation of a
concept index for HTML export.
@item
-@i{J@"urgen Vollmer} contributed code generating the table of contents
+@i{Jürgen Vollmer} contributed code generating the table of contents
in HTML output.
@item
@i{Samuel Wales} has provided important feedback and bug reports.
diff --git a/doc/misc/pcl-cvs.texi b/doc/misc/pcl-cvs.texi
index 6970c69c20a..dd2ba388348 100644
--- a/doc/misc/pcl-cvs.texi
+++ b/doc/misc/pcl-cvs.texi
@@ -2,8 +2,8 @@
@c %**start of header
@setfilename ../../info/pcl-cvs.info
@settitle PCL-CVS---Emacs Front-End to CVS
+@include docstyle.texi
@syncodeindex vr fn
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/pgg.texi b/doc/misc/pgg.texi
index a46c0fb8b4a..49a2cfd1851 100644
--- a/doc/misc/pgg.texi
+++ b/doc/misc/pgg.texi
@@ -6,8 +6,7 @@
@set VERSION 0.1
@settitle PGG @value{VERSION}
-
-@documentencoding UTF-8
+@include docstyle.texi
@copying
This file describes PGG @value{VERSION}, an Emacs interface to various
diff --git a/doc/misc/rcirc.texi b/doc/misc/rcirc.texi
index 646122bf897..a707ba5f03e 100644
--- a/doc/misc/rcirc.texi
+++ b/doc/misc/rcirc.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/rcirc.info
@settitle rcirc Manual
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@copying
diff --git a/doc/misc/reftex.texi b/doc/misc/reftex.texi
index 6488ae289a2..726ec4e8521 100644
--- a/doc/misc/reftex.texi
+++ b/doc/misc/reftex.texi
@@ -2,7 +2,7 @@
@c %**start of header
@setfilename ../../info/reftex.info
@settitle RefTeX User Manual
-@documentencoding UTF-8
+@include docstyle.texi
@synindex ky cp
@syncodeindex vr cp
@syncodeindex fn cp
diff --git a/doc/misc/remember.texi b/doc/misc/remember.texi
index 13594d97a97..d5a03b63f22 100644
--- a/doc/misc/remember.texi
+++ b/doc/misc/remember.texi
@@ -1,9 +1,9 @@
-\input texinfo @c -*-texinfo-*-
+\input texinfo @c -*- mode: texinfo; coding: utf-8 -*-
@c %**start of header
@setfilename ../../info/remember.info
@settitle Remember Manual
+@include docstyle.texi
@syncodeindex fn cp
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/sasl.texi b/doc/misc/sasl.texi
index f6f0a98ba62..86bcd1a0a6a 100644
--- a/doc/misc/sasl.texi
+++ b/doc/misc/sasl.texi
@@ -6,8 +6,7 @@
@set VERSION 0.2
@settitle Emacs SASL Library @value{VERSION}
-
-@documentencoding UTF-8
+@include docstyle.texi
@copying
This file describes the Emacs SASL library, version @value{VERSION}.
diff --git a/doc/misc/sc.texi b/doc/misc/sc.texi
index a851fa2d981..ba366722758 100644
--- a/doc/misc/sc.texi
+++ b/doc/misc/sc.texi
@@ -3,7 +3,7 @@
@comment %**start of header (This is for running Texinfo on a region.)
@setfilename ../../info/sc.info
@settitle Supercite User's Manual
-@documentencoding UTF-8
+@include docstyle.texi
@iftex
@finalout
@end iftex
diff --git a/doc/misc/semantic.texi b/doc/misc/semantic.texi
index 5f4a7821fec..71b81e76f9f 100644
--- a/doc/misc/semantic.texi
+++ b/doc/misc/semantic.texi
@@ -3,7 +3,7 @@
@set TITLE Semantic Manual
@set AUTHOR Eric M. Ludlam, David Ponce, and Richard Y. Kim
@settitle @value{TITLE}
-@documentencoding UTF-8
+@include docstyle.texi
@c *************************************************************************
@c @ Header
diff --git a/doc/misc/ses.texi b/doc/misc/ses.texi
index 068505089a3..7017429f063 100644
--- a/doc/misc/ses.texi
+++ b/doc/misc/ses.texi
@@ -2,11 +2,11 @@
@c %**start of header
@setfilename ../../info/ses.info
@settitle @acronym{SES}: Simple Emacs Spreadsheet
+@include docstyle.texi
@setchapternewpage off
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/sieve.texi b/doc/misc/sieve.texi
index ca965e66bdd..e9cd9acb881 100644
--- a/doc/misc/sieve.texi
+++ b/doc/misc/sieve.texi
@@ -4,7 +4,7 @@
@setfilename ../../info/sieve.info
@settitle Emacs Sieve Manual
-@documentencoding UTF-8
+@include docstyle.texi
@synindex fn cp
@synindex vr cp
@synindex pg cp
diff --git a/doc/misc/smtpmail.texi b/doc/misc/smtpmail.texi
index 314e6a03abc..2d4e7f94b16 100644
--- a/doc/misc/smtpmail.texi
+++ b/doc/misc/smtpmail.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename ../../info/smtpmail.info
@settitle Emacs SMTP Library
-@documentencoding UTF-8
+@include docstyle.texi
@syncodeindex vr fn
@copying
Copyright @copyright{} 2003--2015 Free Software Foundation, Inc.
diff --git a/doc/misc/speedbar.texi b/doc/misc/speedbar.texi
index da507dbb83c..6ad369c8609 100644
--- a/doc/misc/speedbar.texi
+++ b/doc/misc/speedbar.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@setfilename ../../info/speedbar.info
@settitle Speedbar: File/Tag summarizing utility
-@documentencoding UTF-8
+@include docstyle.texi
@syncodeindex fn cp
@copying
diff --git a/doc/misc/srecode.texi b/doc/misc/srecode.texi
index b58cc4a204f..98fab5ceafa 100644
--- a/doc/misc/srecode.texi
+++ b/doc/misc/srecode.texi
@@ -4,7 +4,7 @@
@set TITLE SRecoder Manual
@set AUTHOR Eric M. Ludlam
@settitle @value{TITLE}
-@documentencoding UTF-8
+@include docstyle.texi
@c Merge all indexes into a single index for now.
@c We can always separate them later into two or more as needed.
diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex
index 8236d7d2f82..152e9853485 100644
--- a/doc/misc/texinfo.tex
+++ b/doc/misc/texinfo.tex
@@ -3,7 +3,7 @@
% Load plain if necessary, i.e., if running under initex.
\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
%
-\def\texinfoversion{2015-02-05.16}
+\def\texinfoversion{2015-05-06.11}
%
% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -3022,11 +3022,16 @@ end
\TeX
}
-% Some math mode symbols.
-\def\bullet{$\ptexbullet$}
-\def\geq{\ifmmode \ge\else $\ge$\fi}
-\def\leq{\ifmmode \le\else $\le$\fi}
-\def\minus{\ifmmode -\else $-$\fi}
+% Some math mode symbols. Define \ensuremath to switch into math mode
+% unless we are already there. Expansion tricks may not be needed here,
+% but safer, and can't hurt.
+\def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi}
+\def\ensuredmath#1{$\relax#1$}
+%
+\def\bullet{\ensuremath\ptexbullet}
+\def\geq{\ensuremath\ge}
+\def\leq{\ensuremath\le}
+\def\minus{\ensuremath-}
% @dots{} outputs an ellipsis using the current font.
% We do .5em per period so that it has the same spacing in the cm
@@ -9038,7 +9043,7 @@ directory should work if nowhere else does.}
\gdef^^b4{\'{}}
\gdef^^b5{$\mu$}
\gdef^^b6{\P}
- \gdef^^b7{\ifmmode\cdot\else $\cdot$\fi}
+ \gdef^^b7{\ensuremath\cdot}
\gdef^^b8{\cedilla\ }
\gdef^^b9{$^1$}
\gdef^^ba{\ordm}
@@ -9397,19 +9402,19 @@ directory should work if nowhere else does.}
\DeclareUnicodeCharacter{00A9}{\copyright}
\DeclareUnicodeCharacter{00AA}{\ordf}
\DeclareUnicodeCharacter{00AB}{\guillemetleft}
- \DeclareUnicodeCharacter{00AC}{\ifmmode\lnot\else $\lnot$\fi}
+ \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}
\DeclareUnicodeCharacter{00AD}{\-}
\DeclareUnicodeCharacter{00AE}{\registeredsymbol}
\DeclareUnicodeCharacter{00AF}{\={ }}
\DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
- \DeclareUnicodeCharacter{00B1}{\ifmmode\pm\else $\pm$\fi}
+ \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}
\DeclareUnicodeCharacter{00B2}{$^2$}
\DeclareUnicodeCharacter{00B3}{$^3$}
\DeclareUnicodeCharacter{00B4}{\'{ }}
\DeclareUnicodeCharacter{00B5}{$\mu$}
\DeclareUnicodeCharacter{00B6}{\P}
- \DeclareUnicodeCharacter{00B7}{\ifmmode\cdot\else $\cdot$\fi}
+ \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}
\DeclareUnicodeCharacter{00B8}{\cedilla{ }}
\DeclareUnicodeCharacter{00B9}{$^1$}
\DeclareUnicodeCharacter{00BA}{\ordm}
@@ -9443,7 +9448,7 @@ directory should work if nowhere else does.}
\DeclareUnicodeCharacter{00D4}{\^O}
\DeclareUnicodeCharacter{00D5}{\~O}
\DeclareUnicodeCharacter{00D6}{\"O}
- \DeclareUnicodeCharacter{00D7}{\ifmmode\times\else $\times$\fi}
+ \DeclareUnicodeCharacter{00D7}{\ensuremath\times}
\DeclareUnicodeCharacter{00D8}{\O}
\DeclareUnicodeCharacter{00D9}{\`U}
\DeclareUnicodeCharacter{00DA}{\'U}
@@ -9477,7 +9482,7 @@ directory should work if nowhere else does.}
\DeclareUnicodeCharacter{00F4}{\^o}
\DeclareUnicodeCharacter{00F5}{\~o}
\DeclareUnicodeCharacter{00F6}{\"o}
- \DeclareUnicodeCharacter{00F7}{\ifmmode\div\else $\div$\fi}
+ \DeclareUnicodeCharacter{00F7}{\ensuremath\div}
\DeclareUnicodeCharacter{00F8}{\o}
\DeclareUnicodeCharacter{00F9}{\`u}
\DeclareUnicodeCharacter{00FA}{\'u}
@@ -9546,7 +9551,7 @@ directory should work if nowhere else does.}
\DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
\DeclareUnicodeCharacter{0136}{\cedilla{K}}
\DeclareUnicodeCharacter{0137}{\cedilla{k}}
- \DeclareUnicodeCharacter{0138}{\ifmmode\kappa\else $\kappa$\fi}
+ \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}
\DeclareUnicodeCharacter{0139}{\'L}
\DeclareUnicodeCharacter{013A}{\'l}
\DeclareUnicodeCharacter{013B}{\cedilla{L}}
@@ -9813,6 +9818,8 @@ directory should work if nowhere else does.}
\DeclareUnicodeCharacter{201C}{\quotedblleft}
\DeclareUnicodeCharacter{201D}{\quotedblright}
\DeclareUnicodeCharacter{201E}{\quotedblbase}
+ \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}
+ \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}
\DeclareUnicodeCharacter{2022}{\bullet}
\DeclareUnicodeCharacter{2026}{\dots}
\DeclareUnicodeCharacter{2039}{\guilsinglleft}
@@ -9824,6 +9831,7 @@ directory should work if nowhere else does.}
\DeclareUnicodeCharacter{2212}{\minus}
\DeclareUnicodeCharacter{2217}{\point}
+ \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}
\DeclareUnicodeCharacter{2261}{\equiv}
}% end of \utfeightchardefs
@@ -9836,6 +9844,17 @@ directory should work if nowhere else does.}
\def\nonasciistringdefs{%
\setnonasciicharscatcode\active
\def\defstringchar##1{\def##1{\string##1}}%
+ %
+ \defstringchar^^80\defstringchar^^81\defstringchar^^82\defstringchar^^83%
+ \defstringchar^^84\defstringchar^^85\defstringchar^^86\defstringchar^^87%
+ \defstringchar^^88\defstringchar^^89\defstringchar^^8a\defstringchar^^8b%
+ \defstringchar^^8c\defstringchar^^8d\defstringchar^^8e\defstringchar^^8f%
+ %
+ \defstringchar^^90\defstringchar^^91\defstringchar^^92\defstringchar^^93%
+ \defstringchar^^94\defstringchar^^95\defstringchar^^96\defstringchar^^97%
+ \defstringchar^^98\defstringchar^^99\defstringchar^^9a\defstringchar^^9b%
+ \defstringchar^^9c\defstringchar^^9d\defstringchar^^9e\defstringchar^^9f%
+ %
\defstringchar^^a0\defstringchar^^a1\defstringchar^^a2\defstringchar^^a3%
\defstringchar^^a4\defstringchar^^a5\defstringchar^^a6\defstringchar^^a7%
\defstringchar^^a8\defstringchar^^a9\defstringchar^^aa\defstringchar^^ab%
diff --git a/doc/misc/todo-mode.texi b/doc/misc/todo-mode.texi
index 3032da34e28..69656da8880 100644
--- a/doc/misc/todo-mode.texi
+++ b/doc/misc/todo-mode.texi
@@ -2,10 +2,10 @@
@c %**start of header
@setfilename ../../info/todo-mode.info
@settitle Todo Mode User Manual
+@include docstyle.texi
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/tramp.texi b/doc/misc/tramp.texi
index 1875a70af43..ece851ded93 100644
--- a/doc/misc/tramp.texi
+++ b/doc/misc/tramp.texi
@@ -2,7 +2,7 @@
@setfilename ../../info/tramp.info
@c %**start of header
@settitle TRAMP User Manual
-@documentencoding UTF-8
+@include docstyle.texi
@c %**end of header
@c This is *so* much nicer :)
@@ -91,7 +91,7 @@ copy and modify this GNU manual.''
@titlepage
@title @value{tramp} version @value{trampver} User Manual
@author by Daniel Pittman
-@author based on documentation by Kai Gro@ss{}johann
+@author based on documentation by Kai Großjohann
@page
@insertcopying
@end titlepage
@@ -1935,7 +1935,7 @@ of your (local or remote) host, you might need to adapt this. Example:
"password" "Password"
;; Deutsch
"passwort" "Passwort"
- ;; Fran@,{c}ais
+ ;; Français
"mot de passe" "Mot de passe") t)
".*:\0? *"))
@end lisp
diff --git a/doc/misc/url.texi b/doc/misc/url.texi
index 8c4afbe28b6..d94b19f77b6 100644
--- a/doc/misc/url.texi
+++ b/doc/misc/url.texi
@@ -1,8 +1,7 @@
\input texinfo
@setfilename ../../info/url.info
@settitle URL Programmer's Manual
-
-@documentencoding UTF-8
+@include docstyle.texi
@iftex
@c @finalout
diff --git a/doc/misc/vhdl-mode.texi b/doc/misc/vhdl-mode.texi
index 829c4f6564b..b8b3850c55a 100644
--- a/doc/misc/vhdl-mode.texi
+++ b/doc/misc/vhdl-mode.texi
@@ -2,7 +2,7 @@
@setfilename ../../info/vhdl-mode.info
@settitle VHDL Mode, an Emacs mode for editing VHDL code
-@documentencoding UTF-8
+@include docstyle.texi
@c Adapted from the VHDL Mode texinfo manual version 2 by Rodney J. Whitby.
@c Adapted from the CC Mode texinfo manual by Barry A. Warsaw.
diff --git a/doc/misc/vip.texi b/doc/misc/vip.texi
index 250ced951b1..4680a098f06 100644
--- a/doc/misc/vip.texi
+++ b/doc/misc/vip.texi
@@ -1,8 +1,7 @@
\input texinfo
@setfilename ../../info/vip.info
@settitle VIP
-
-@documentencoding UTF-8
+@include docstyle.texi
@copying
Copyright @copyright{} 1987, 2001--2015 Free Software Foundation, Inc.
diff --git a/doc/misc/viper.texi b/doc/misc/viper.texi
index cfaf4e66d85..f449e3b738b 100644
--- a/doc/misc/viper.texi
+++ b/doc/misc/viper.texi
@@ -5,8 +5,7 @@
@comment @setfilename viper
@comment @setfilename viper.info
@setfilename ../../info/viper.info
-
-@documentencoding UTF-8
+@include docstyle.texi
@copying
Copyright @copyright{} 1995--1997, 2001--2015 Free Software Foundation, Inc.
diff --git a/doc/misc/widget.texi b/doc/misc/widget.texi
index 1942b79977a..ea785501698 100644
--- a/doc/misc/widget.texi
+++ b/doc/misc/widget.texi
@@ -2,10 +2,10 @@
@c %**start of header
@setfilename ../../info/widget.info
@settitle The Emacs Widget Library
+@include docstyle.texi
@syncodeindex fn cp
@syncodeindex vr cp
@syncodeindex ky cp
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/wisent.texi b/doc/misc/wisent.texi
index 16b5d122df1..7bcc46d58f0 100644
--- a/doc/misc/wisent.texi
+++ b/doc/misc/wisent.texi
@@ -4,6 +4,7 @@
@set TITLE Wisent Parser Development
@set AUTHOR Eric M. Ludlam, David Ponce, and Richard Y. Kim
@settitle @value{TITLE}
+@include docstyle.texi
@c *************************************************************************
@c @ Header
@@ -20,7 +21,6 @@
@c @footnotestyle separate
@c @paragraphindent 2
@c @@smallbook
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/doc/misc/woman.texi b/doc/misc/woman.texi
index a935bedd47f..f1286fc3473 100644
--- a/doc/misc/woman.texi
+++ b/doc/misc/woman.texi
@@ -2,13 +2,13 @@
@c %**start of header
@setfilename ../../info/woman.info
@settitle WoMan: Browse Unix Manual Pages ``W.O. (without) Man''
+@include docstyle.texi
@include emacsver.texi
@afourpaper
@c With different size paper the printed page breaks will need attention!
@c Look for @page and @need commands.
@setchapternewpage off
@paragraphindent 0
-@documentencoding UTF-8
@c %**end of header
@copying
diff --git a/etc/NEWS b/etc/NEWS
index b408b51756f..fdd0c874bad 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -205,6 +205,10 @@ font, and (iii) the specified window.
`message' and related functions from displaying messages the Echo
Area. The output is still logged to the *Messages* buffer.
+** It is now safe for a mode that derives `tabulated-list-mode' to not
+call `tabulated-list-init-header', in which case it will have no
+header.
+
* Editing Changes in Emacs 25.1
@@ -213,6 +217,9 @@ successive char insertions.
** Unicode names entered via C-x 8 RET now use substring completion by default.
+** C-x 8 now has shorthands for these chars: †‑ ‒ – — ― ‘ ’ “ †† ‡ • ′ ″
+€ № ↠→ ↔ − ≈ ≠ ≤ ≥. As before, you can type C-x 8 C-h to list shorthands.
+
** New minor mode global-eldoc-mode is enabled by default.
** Emacs now supports "bracketed paste mode" when running on a terminal
@@ -237,6 +244,15 @@ Unicode standards.
* Changes in Specialized Modes and Packages in Emacs 25.1
+
+** New `xterm-screen-extra-capabilities' config.
+
+** The `save-place' variable is replaced by a `save-place-mode'.
+
+** Midnight-mode
+*** `midnight-mode' is a proper minor mode.
+*** clean-buffer-*-regexps can now specify buffers via predicate functions.
+
** In xterms, killing text now also sets the CLIPBOARD/PRIMARY selection
in the surrounding GUI (using the OSC-52 escape sequence). This only works
if your xterm supports it and enables the `allowWindowOps' options (disabled
@@ -246,6 +262,17 @@ by default at least in Debian, for security reasons).
** package.el
+*** New "external" package status.
+An external package is any installed package that's not built-in and
+not from `package-user-dir', which usually means it's from an entry in
+`package-directory-list'. They are treated much like built-in
+packages, in that they cannot be deleted through the package menu and
+are not considered for upgrades.
+
+The effect, is that a user can manually place a specific version of a
+package inside `package-directory-list' and the package menu will
+always respect that.
+
*** If a package is available on multiple archives and one has higher
priority (as per `package-archive-priorities') only that one is
listed. This can be configured with `package-menu-hide-low-priority'.
@@ -530,6 +557,10 @@ and comments.
** VC and related modes
+*** Basic push support, via `vc-push', bound to `C-x v P'.
+Implemented for Bzr, Git, Hg. As part of this change, the pre-existing
+(undocumented) command vc-hg-push now behaves slightly differently.
+
*** The new command vc-region-history shows the log+diff of the active region.
*** New option `vc-annotate-background-mode' controls whether
@@ -543,6 +574,11 @@ allows to customize this.
*** Two new faces `compare-windows-removed' and `compare-windows-added'
replace the obsolete face `compare-windows'.
+---
+*** `log-edit-insert-changelog' converts "(tiny change)" to
+"Copyright-paperwork-exempt: yes". Set `log-edit-rewrite-tiny-change'
+nil to disable this.
+
** VHDL mode supports VHDL'08.
** Calculator: decimal display mode uses "," groups, so it's more
@@ -626,6 +662,9 @@ to avoid interfering with the kill ring.
*** Custom variable `eudc-inline-expansion-format' defaults to
"Firstname Surname <mail-address>".
+*** Custom variable `eudc-options-file' defaults to
+"~/.emacs.d/eudc-options".
+
*** New custom variable `ldap-ldapsearch-password-prompt-regexp' to
allow overriding the regular expression that recognizes the ldapsearch
command line's password prompt.
@@ -681,6 +720,11 @@ a typographically-correct documents.
* Incompatible Lisp Changes in Emacs 25.1
+** `indirect-function' does not signal `void-function' any more.
+This is mostly a bug-fix, since this change was missed back in 24.4 when
+symbol-function was changed not to signal `void-function' any more.
+*** As a consequence, the second arg of `indirect-function' is now obsolete.
+
** Comint, term, and compile do not set the EMACS env var any more.
Use the INSIDE_EMACS environment variable instead.
@@ -732,6 +776,8 @@ behavior, set `diff-switches' to `-c'.
* Lisp Changes in Emacs 25.1
+** The default value of `load-read-function' is now `read'.
+
** New hook `pre-redisplay-functions', a bit easier to use than pre-redisplay-function.
** The second arg of `looking-back' should always be provided explicitly.
@@ -807,6 +853,9 @@ name. The variable `system-name' is now obsolete.
+++
** Function `write-region' no longer outputs "Wrote FILE" in batch mode.
+** If `pwd' is called with a prefix argument, insert the current default
+directory at point.
+
---
** New utilities in subr-x.el:
*** New macros `if-let' and `when-let' allow defining bindings and to
diff --git a/etc/refcards/cs-dired-ref.tex b/etc/refcards/cs-dired-ref.tex
index 29a9b09ce57..ac1d27ae5b3 100644
--- a/etc/refcards/cs-dired-ref.tex
+++ b/etc/refcards/cs-dired-ref.tex
@@ -1,4 +1,4 @@
-% Reference Card for Dired
+% Reference Card for Dired -*- coding: utf-8 -*-
% Copyright (C) 2000-2015 Free Software Foundation, Inc.
diff --git a/etc/refcards/cs-refcard.tex b/etc/refcards/cs-refcard.tex
index 29ea258103e..3158b5bc64b 100644
--- a/etc/refcards/cs-refcard.tex
+++ b/etc/refcards/cs-refcard.tex
@@ -1,4 +1,4 @@
-% Reference Card for GNU Emacs
+% Reference Card for GNU Emacs -*- coding: utf-8 -*-
% Copyright (C) 1987, 1993, 1996-1997, 2001-2015 Free Software
% Foundation, Inc.
diff --git a/etc/refcards/cs-survival.tex b/etc/refcards/cs-survival.tex
index 72162c3a7df..cdf261a498e 100644
--- a/etc/refcards/cs-survival.tex
+++ b/etc/refcards/cs-survival.tex
@@ -1,4 +1,4 @@
-% Title: GNU Emacs Survival Card
+% Title: GNU Emacs Survival Card -*- coding: utf-8 -*-
% Copyright (C) 2000-2015 Free Software Foundation, Inc.
diff --git a/etc/refcards/sk-dired-ref.tex b/etc/refcards/sk-dired-ref.tex
index 8f898560b03..57a4b5b424a 100644
--- a/etc/refcards/sk-dired-ref.tex
+++ b/etc/refcards/sk-dired-ref.tex
@@ -1,4 +1,4 @@
-% Reference Card for Dired
+% Reference Card for Dired -*- coding: utf-8 -*-
% Copyright (C) 2000-2015 Free Software Foundation, Inc.
diff --git a/etc/refcards/sk-refcard.tex b/etc/refcards/sk-refcard.tex
index a8d07607cc8..e2df212fa6a 100644
--- a/etc/refcards/sk-refcard.tex
+++ b/etc/refcards/sk-refcard.tex
@@ -1,4 +1,4 @@
-% Reference Card for GNU Emacs
+% Reference Card for GNU Emacs -*- coding: utf-8 -*-
% Copyright (C) 1987, 1993, 1996-1997, 2001-2015 Free Software
% Foundation, Inc.
diff --git a/etc/refcards/sk-survival.tex b/etc/refcards/sk-survival.tex
index 363716c8bff..9f25b6ad52d 100644
--- a/etc/refcards/sk-survival.tex
+++ b/etc/refcards/sk-survival.tex
@@ -1,4 +1,4 @@
-% Title: GNU Emacs Survival Card
+% Title: GNU Emacs Survival Card -*- coding: utf-8 -*-
% Copyright (C) 2000-2015 Free Software Foundation, Inc.
diff --git a/etc/themes/tsdh-light-theme.el b/etc/themes/tsdh-light-theme.el
index 6555e49d9bb..397885ae9f0 100644
--- a/etc/themes/tsdh-light-theme.el
+++ b/etc/themes/tsdh-light-theme.el
@@ -26,7 +26,8 @@ Used and created by Tassilo Horn.")
(custom-theme-set-faces
'tsdh-light
'(Info-quoted ((t (:weight bold))))
- '(ace-jump-face-foreground ((t (:foreground "DeepPink" :box (:line-width -1 :color "grey75") :weight bold))))
+ '(ace-jump-face-foreground ((t (:foreground "DeepPink" :box nil :weight bold))))
+ '(aw-leading-char-face ((t (:inherit ace-jump-face-foreground))))
'(default ((t (:background "white" :foreground "black"))))
'(diff-added ((t (:inherit diff-changed :background "light green"))))
'(diff-changed ((t (:background "light steel blue"))))
diff --git a/lib-src/etags.c b/lib-src/etags.c
index b1361dbe7ad..7bacbd3e619 100644
--- a/lib-src/etags.c
+++ b/lib-src/etags.c
@@ -68,8 +68,8 @@ University of California, as described above. */
* 1994 Line-by-line regexp tags by Tom Tromey.
* 2001 Nested classes by Francesco Potortì (concept by Mykola Dzyuba).
* 2002 #line directives by Francesco Potortì.
- *
- * Francesco Potortì <pot@gnu.org> has maintained and improved it since 1993.
+ * Francesco Potortì maintained and improved it for many years
+ starting in 1993.
*/
/*
@@ -2862,7 +2862,10 @@ consider_token (char *str, int len, int c, int *c_extp,
case st_none:
if (constantypedefs
&& structdef == snone
- && structtype == st_C_enum && bracelev > structbracelev)
+ && structtype == st_C_enum && bracelev > structbracelev
+ /* Don't tag tokens in expressions that assign values to enum
+ constants. */
+ && fvdef != vignore)
return true; /* enum constant */
switch (fvdef)
{
@@ -3176,7 +3179,19 @@ C_entries (int c_ext, FILE *inf)
cpptoken = false;
}
if (cpptoken)
- definedef = dsharpseen;
+ {
+ definedef = dsharpseen;
+ /* This is needed for tagging enum values: when there are
+ preprocessor conditionals inside the enum, we need to
+ reset the value of fvdef so that the next enum value is
+ tagged even though the one before it did not end in a
+ comma. */
+ if (fvdef == vignore && instruct && parlev == 0)
+ {
+ if (strneq (cp, "#if", 3) || strneq (cp, "#el", 3))
+ fvdef = fvnone;
+ }
+ }
} /* if (definedef == dnone) */
continue;
case '[':
@@ -3507,7 +3522,10 @@ C_entries (int c_ext, FILE *inf)
case fstartlist:
case finlist:
case fignore:
+ break;
case vignore:
+ if (instruct && parlev == 0)
+ fvdef = fvnone;
break;
case fdefunname:
fvdef = fignore;
diff --git a/lisp/allout.el b/lisp/allout.el
index 689bed5efc1..2cdac99f90a 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -6051,8 +6051,8 @@ See `allout-toggle-current-subtree-encryption' for more details."
(declare-function epg-decrypt-string "epg" (context cipher))
(declare-function epg-encrypt-string "epg"
(context plain recipients &optional sign always-trust))
-(declare-function epg-user-id-string "epg" (user-id))
-(declare-function epg-key-user-id-list "epg" (key))
+(declare-function epg-user-id-string "epg" (user-id) t)
+(declare-function epg-key-user-id-list "epg" (key) t)
;;;_ > allout-encrypt-string (text decrypt allout-buffer keymode-cue
;;; &optional rejected)
diff --git a/lisp/calc/calc.el b/lisp/calc/calc.el
index 58bbdb81289..1cc11b48ac3 100644
--- a/lisp/calc/calc.el
+++ b/lisp/calc/calc.el
@@ -154,6 +154,7 @@
(declare-function math-parse-date "calc-forms" (math-pd-str))
(declare-function math-lessp "calc-ext" (a b))
(declare-function math-compare "calc-ext" (a b))
+(declare-function math-zerop "calc-misc" (a))
(declare-function calc-embedded-finish-command "calc-embed" ())
(declare-function calc-embedded-select-buffer "calc-embed" ())
(declare-function calc-embedded-mode-line-change "calc-embed" ())
diff --git a/lisp/cedet/ede.el b/lisp/cedet/ede.el
index 074fda97862..43660a8bb71 100644
--- a/lisp/cedet/ede.el
+++ b/lisp/cedet/ede.el
@@ -339,7 +339,7 @@ Argument MENU-DEF is the menu definition to use."
(progn
(while (and class (slot-exists-p class 'menu))
;;(message "Looking at class %S" class)
- (setq menu (append menu (oref class menu))
+ (setq menu (append menu (oref-default class menu))
class (eieio-class-parent class))
(if (listp class) (setq class (car class))))
(append
diff --git a/lisp/cedet/ede/config.el b/lisp/cedet/ede/config.el
index f91a6c1751c..f5578a21883 100644
--- a/lisp/cedet/ede/config.el
+++ b/lisp/cedet/ede/config.el
@@ -268,6 +268,8 @@ programs from a project.")
(cmdsym (intern-soft (car cmdsplit))))
(call-interactively cmdsym t)))
+(declare-function ede-shell-run-something "ede/shell")
+
(cl-defmethod project-run-target ((target ede-target-with-config-program))
"Run the current project derived from TARGET."
(let* ((proj (ede-target-parent target))
@@ -358,8 +360,14 @@ parsed again."))
This target brings in methods used by Semantic to query
the preprocessor map, and include paths.")
+(declare-function semanticdb-file-table-object "semantic/db"
+ (file &optional dontload))
+(declare-function semanticdb-needs-refresh-p "semantic/db" (arg &rest args))
+(declare-function semanticdb-refresh-table "semantic/db" (arg &rest args))
+
(cl-defmethod ede-preprocessor-map ((this ede-target-with-config-c))
"Get the pre-processor map for some generic C code."
+ (require 'semantic/sb)
(let* ((proj (ede-target-parent this))
(root (ede-project-root proj))
(config (ede-config-get-configuration proj))
diff --git a/lisp/cedet/ede/generic.el b/lisp/cedet/ede/generic.el
index 7e1425f1318..9e6fc978376 100644
--- a/lisp/cedet/ede/generic.el
+++ b/lisp/cedet/ede/generic.el
@@ -230,7 +230,7 @@ If one doesn't exist, create a new one for this directory."
(when ext
(dolist (C classes)
(let* ((classsym (intern (car C)))
- (extreg (oref classsym extension)))
+ (extreg (oref-default classsym extension)))
(when (and (not (string= extreg ""))
(string-match (concat "\\`\\(?:" extreg "\\)\\'") ext))
(setq cls classsym)))))
diff --git a/lisp/cedet/ede/locate.el b/lisp/cedet/ede/locate.el
index 2ff83418f78..a076c46513c 100644
--- a/lisp/cedet/ede/locate.el
+++ b/lisp/cedet/ede/locate.el
@@ -353,7 +353,7 @@ that created this EDE locate object."
(cl-defmethod ede-locate-create/update-root-database
((loc (subclass ede-locate-cscope)) root)
- "Create or update the GNU Global database for the current project."
+ "Create or update the Cscope database for the current project."
(require 'cedet-cscope)
(cedet-cscope-create/update-database root))
diff --git a/lisp/cedet/pulse.el b/lisp/cedet/pulse.el
index 89d44c20a6f..39ba13c33df 100644
--- a/lisp/cedet/pulse.el
+++ b/lisp/cedet/pulse.el
@@ -121,7 +121,7 @@ http://www.emacswiki.org/cgi-bin/wiki/hexrgb.el"
:group 'pulse
:type 'number)
(defcustom pulse-delay .03
- "Delay between face lightening iterations, as used by `sit-for'."
+ "Delay between face lightening iterations."
:group 'pulse
:type 'number)
@@ -133,7 +133,8 @@ Return t if there is more drift to do, nil if completed."
(let* ((frame (color-values (face-background 'default)))
(start (color-values (face-background
(get 'pulse-highlight-face
- :startface))))
+ :startface)
+ nil t)))
(frac (list (/ (- (nth 0 frame) (nth 0 start)) pulse-iterations)
(/ (- (nth 1 frame) (nth 1 start)) pulse-iterations)
(/ (- (nth 2 frame) (nth 2 start)) pulse-iterations)))
@@ -154,35 +155,28 @@ Return t if there is more drift to do, nil if completed."
"Reset the pulse highlighting FACE."
(set-face-background 'pulse-highlight-face
(if face
- (face-background face)
+ (face-background face nil t)
(face-background 'pulse-highlight-start-face)
))
(put 'pulse-highlight-face :startface (or face
'pulse-highlight-start-face))
(put 'pulse-highlight-face :iteration 0))
-(defun pulse (&optional face)
- "Pulse the colors on our highlight face.
-If optional FACE is provided, reset the face to FACE color,
-instead of `pulse-highlight-start-face'.
-Be sure to call `pulse-reset-face' after calling pulse."
- (unwind-protect
- (progn
- (pulse-reset-face face)
- (while (and (pulse-lighten-highlight)
- (sit-for pulse-delay))
- nil))))
-
;;; Convenience Functions
;;
(defvar pulse-momentary-overlay nil
"The current pulsing overlay.")
+(defvar pulse-momentary-timer nil
+ "The current pulsing timer.")
+
(defun pulse-momentary-highlight-overlay (o &optional face)
"Pulse the overlay O, unhighlighting before next command.
Optional argument FACE specifies the face to do the highlighting."
+ ;; We don't support simultaneous highlightings.
+ (pulse-momentary-unhighlight)
(overlay-put o 'original-face (overlay-get o 'face))
- (add-to-list 'pulse-momentary-overlay o)
+ (setq pulse-momentary-overlay o)
(if (eq pulse-flag 'never)
nil
(if (or (not pulse-flag) (not (pulse-available-p)))
@@ -191,39 +185,46 @@ Optional argument FACE specifies the face to do the highlighting."
(overlay-put o 'face (or face 'pulse-highlight-start-face))
(add-hook 'pre-command-hook
'pulse-momentary-unhighlight))
- ;; pulse it.
- (unwind-protect
- (progn
- (overlay-put o 'face 'pulse-highlight-face)
- ;; The pulse function puts FACE onto 'pulse-highlight-face.
- ;; Thus above we put our face on the overlay, but pulse
- ;; with a reference face needed for the color.
- (pulse face))
- (pulse-momentary-unhighlight)))))
+ ;; Pulse it.
+ (overlay-put o 'face 'pulse-highlight-face)
+ ;; The pulse function puts FACE onto 'pulse-highlight-face.
+ ;; Thus above we put our face on the overlay, but pulse
+ ;; with a reference face needed for the color.
+ (pulse-reset-face face)
+ (setq pulse-momentary-timer
+ (run-with-timer 0 pulse-delay #'pulse-tick
+ (time-add (current-time)
+ (* pulse-delay pulse-iterations)))))))
+
+(defun pulse-tick (stop-time)
+ (if (time-less-p (current-time) stop-time)
+ (pulse-lighten-highlight)
+ (pulse-momentary-unhighlight)))
(defun pulse-momentary-unhighlight ()
"Unhighlight a line recently highlighted."
- ;; If someone passes in an overlay, then pulse-momentary-overlay
- ;; will still be nil, and won't need modifying.
(when pulse-momentary-overlay
;; clear the starting face
- (mapc
- (lambda (ol)
- (overlay-put ol 'face (overlay-get ol 'original-face))
- (overlay-put ol 'original-face nil)
- ;; Clear the overlay if it needs deleting.
- (when (overlay-get ol 'pulse-delete) (delete-overlay ol)))
- pulse-momentary-overlay)
+ (let ((ol pulse-momentary-overlay))
+ (overlay-put ol 'face (overlay-get ol 'original-face))
+ (overlay-put ol 'original-face nil)
+ ;; Clear the overlay if it needs deleting.
+ (when (overlay-get ol 'pulse-delete) (delete-overlay ol)))
;; Clear the variable.
- (setq pulse-momentary-overlay nil))
+ (setq pulse-momentary-overlay nil)
+
+ ;; Reset the pulsing face.
+ (pulse-reset-face))
- ;; Reset the pulsing face.
- (pulse-reset-face)
+ ;; Cancel the timer.
+ (when pulse-momentary-timer
+ (cancel-timer pulse-momentary-timer))
;; Remove this hook.
(remove-hook 'pre-command-hook 'pulse-momentary-unhighlight))
+;;;###autoload
(defun pulse-momentary-highlight-one-line (point &optional face)
"Highlight the line around POINT, unhighlighting before next command.
Optional argument FACE specifies the face to do the highlighting."
@@ -237,6 +238,7 @@ Optional argument FACE specifies the face to do the highlighting."
(point))))
(pulse-momentary-highlight-region start end face))))
+;;;###autoload
(defun pulse-momentary-highlight-region (start end &optional face)
"Highlight between START and END, unhighlighting before next command.
Optional argument FACE specifies the face to do the highlighting."
diff --git a/lisp/cedet/semantic/bovine/c.el b/lisp/cedet/semantic/bovine/c.el
index aa93e246cc8..e86f09c114d 100644
--- a/lisp/cedet/semantic/bovine/c.el
+++ b/lisp/cedet/semantic/bovine/c.el
@@ -498,12 +498,12 @@ code to parse."
(parsedtokelist
(condition-case nil
;; This is imperfect, so always assume on error.
- (hif-canonicalize)
+ (hif-canonicalize hif-ifx-regexp)
(error nil))))
(let ((eval-form (condition-case err
(eval parsedtokelist)
- (error
+ (error
(semantic-push-parser-warning
(format "Hideif forms produced an error. Assuming false.\n%S" err)
(point) (1+ (point)))
diff --git a/lisp/cedet/semantic/bovine/gcc.el b/lisp/cedet/semantic/bovine/gcc.el
index 19d149112c6..fe7a14451f5 100644
--- a/lisp/cedet/semantic/bovine/gcc.el
+++ b/lisp/cedet/semantic/bovine/gcc.el
@@ -86,13 +86,11 @@ to give to the program."
(let ((chars (append line nil)))
(when (= 32 (nth 0 chars))
(let ((path (substring line 1)))
- (when (file-accessible-directory-p path)
- (when (if (memq system-type '(windows-nt))
- (/= ?/ (nth 1 chars))
- (= ?/ (nth 1 chars)))
- (add-to-list 'inc-path
- (expand-file-name (substring line 1))
- t)))))))))
+ (when (and (file-accessible-directory-p path)
+ (file-name-absolute-p path))
+ (add-to-list 'inc-path
+ (expand-file-name path)
+ t))))))))
inc-path))
@@ -166,8 +164,9 @@ It should also include other symbols GCC was compiled with.")
(host (or (cdr (assoc 'target fields))
(cdr (assoc '--target fields))
(cdr (assoc '--host fields))))
- (prefix (cdr (assoc '--prefix fields)))
+ ;; (prefix (cdr (assoc '--prefix fields)))
;; gcc output supplied paths
+ ;; FIXME: Where are `c-include-path' and `c++-include-path' used?
(c-include-path (semantic-gcc-get-include-paths "c"))
(c++-include-path (semantic-gcc-get-include-paths "c++"))
(gcc-exe (locate-file "gcc" exec-path exec-suffixes 'executable))
diff --git a/lisp/cedet/semantic/db-el.el b/lisp/cedet/semantic/db-el.el
index b20a756f6b7..432f638475a 100644
--- a/lisp/cedet/semantic/db-el.el
+++ b/lisp/cedet/semantic/db-el.el
@@ -223,11 +223,11 @@ TOKTYPE is a hint to the type of tag desired."
(symbol-name sym)
"class"
(semantic-elisp-desymbolify
- (let ((class (find-class sym)))
- (if (fboundp 'eieio-slot-descriptor-name)
- (mapcar #'eieio-slot-descriptor-name
- (eieio-class-slots class))
- (eieio--class-public-a class))))
+ (let ((class (find-class sym)))
+ (if (fboundp 'eieio--class-public-a) ; Emacs < 25.1
+ (eieio--class-public-a class)
+ (mapcar #'eieio-slot-descriptor-name
+ (eieio-class-slots class)))))
(semantic-elisp-desymbolify (eieio-class-parents sym)) ;; parents
))
((not toktype)
diff --git a/lisp/cedet/semantic/grammar.el b/lisp/cedet/semantic/grammar.el
index 7a92a12ed53..fc7e9e61a16 100644
--- a/lisp/cedet/semantic/grammar.el
+++ b/lisp/cedet/semantic/grammar.el
@@ -628,39 +628,38 @@ The symbols in the list are local variables in
t)
(match-string 0))))
+(defun semantic-grammar--template-expand (template env)
+ (mapconcat (lambda (S)
+ (if (stringp S) S
+ (let ((x (assq S env)))
+ (cond
+ (x (cdr x))
+ ((symbolp S) (symbol-value S))))))
+ template ""))
+
(defun semantic-grammar-header ()
"Return text of a generated standard header."
- (let ((file (semantic-grammar-buffer-file
+ (semantic-grammar--template-expand
+ semantic-grammar-header-template
+ `((file . ,(semantic-grammar-buffer-file
semantic--grammar-output-buffer))
- (gram (semantic-grammar-buffer-file))
- (date (format-time-string "%Y-%m-%d %T%z"))
- (vcid (concat "$" "Id" "$")) ;; Avoid expansion
- ;; Try to get the copyright from the input grammar, or
- ;; generate a new one if not found.
- (copy (or (semantic-grammar-copyright-line)
+ (gram . ,(semantic-grammar-buffer-file))
+ (date . ,(format-time-string "%Y-%m-%d %T%z"))
+ (vcid . ,(concat "$" "Id" "$")) ;; Avoid expansion
+ ;; Try to get the copyright from the input grammar, or
+ ;; generate a new one if not found.
+ (copy . ,(or (semantic-grammar-copyright-line)
(concat (format-time-string ";; Copyright (C) %Y ")
- user-full-name)))
- (out ""))
- (dolist (S semantic-grammar-header-template)
- (cond ((stringp S)
- (setq out (concat out S)))
- ((symbolp S)
- (setq out (concat out (symbol-value S))))))
- out))
+ user-full-name))))))
(defun semantic-grammar-footer ()
"Return text of a generated standard footer."
- (let* ((file (semantic-grammar-buffer-file
- semantic--grammar-output-buffer))
- (libr (or semantic--grammar-provide
- semantic--grammar-package))
- (out ""))
- (dolist (S semantic-grammar-footer-template)
- (cond ((stringp S)
- (setq out (concat out S)))
- ((symbolp S)
- (setq out (concat out (symbol-value S))))))
- out))
+ (semantic-grammar--template-expand
+ semantic-grammar-footer-template
+ `((file . ,(semantic-grammar-buffer-file
+ semantic--grammar-output-buffer))
+ (libr . ,(or semantic--grammar-provide
+ semantic--grammar-package)))))
(defun semantic-grammar-token-data ()
"Return the string value of the table of lexical tokens."
@@ -714,7 +713,7 @@ Block definitions are read from the current table of lexical types."
(let* ((blocks (cdr (semantic-lex-type-value "block" t)))
(open-delims (cdr (semantic-lex-type-value "open-paren" t)))
(close-delims (cdr (semantic-lex-type-value "close-paren" t)))
- olist clist block-spec delim-spec open-spec close-spec)
+ olist clist delim-spec open-spec close-spec)
(dolist (block-spec blocks)
(setq delim-spec (semantic-grammar--lex-delim-spec block-spec)
open-spec (assq (car delim-spec) open-delims)
@@ -818,7 +817,7 @@ Block definitions are read from the current table of lexical types."
;;; Generation of the grammar support file.
;;
-(defcustom semantic-grammar-file-regexp "\\.[wb]y$"
+(defcustom semantic-grammar-file-regexp "\\.[wb]y\\'"
"Regexp which matches grammar source files."
:group 'semantic
:type 'regexp)
@@ -1073,7 +1072,7 @@ See also the variable `semantic-grammar-file-regexp'."
(defvar semantic--grammar-macros-regexp-2 nil)
(make-variable-buffer-local 'semantic--grammar-macros-regexp-2)
-(defun semantic--grammar-clear-macros-regexp-2 (&rest ignore)
+(defun semantic--grammar-clear-macros-regexp-2 (&rest _)
"Clear the cached regexp that match macros local in this grammar.
IGNORE arguments.
Added to `before-change-functions' hooks to be run before each text
@@ -1659,21 +1658,17 @@ Select the buffer containing the tag's definition, and move point there."
)
"Association of syntax elements, and the corresponding help.")
-(declare-function eldoc-function-argstring "eldoc")
-(declare-function eldoc-docstring-format-sym-doc "eldoc")
-(declare-function eldoc-last-data-store "eldoc")
-(declare-function eldoc-get-fnsym-args-string "eldoc")
-(declare-function eldoc-get-var-docstring "eldoc")
-
(defvar semantic-grammar-eldoc-last-data (cons nil nil))
(defun semantic-grammar-eldoc-get-macro-docstring (macro expander)
"Return a one-line docstring for the given grammar MACRO.
EXPANDER is the name of the function that expands MACRO."
(require 'eldoc)
- (if (eq expander (car semantic-grammar-eldoc-last-data))
- (cdr semantic-grammar-eldoc-last-data)
- (let ((doc (help-split-fundoc (documentation expander t) expander)))
+ (cond
+ ((eq expander (car semantic-grammar-eldoc-last-data))
+ (cdr semantic-grammar-eldoc-last-data))
+ ((fboundp 'eldoc-function-argstring) ;; Emacs<25
+ (let* ((doc (help-split-fundoc (documentation expander t) expander)))
(cond
(doc
(setq doc (car doc))
@@ -1686,7 +1681,16 @@ EXPANDER is the name of the function that expands MACRO."
(eldoc-docstring-format-sym-doc
macro (format "==> %s %s" expander doc) 'default))
(setq semantic-grammar-eldoc-last-data (cons expander doc)))
- doc)))
+ doc))
+ ((fboundp 'elisp-get-fnsym-args-string) ;; Emacs≥25
+ (elisp-get-fnsym-args-string
+ expander nil
+ (concat (propertize (symbol-name macro)
+ 'face 'font-lock-keyword-face)
+ " ==> "
+ (propertize (symbol-name macro)
+ 'face 'font-lock-function-name-face)
+ ": ")))))
(define-mode-local-override semantic-idle-summary-current-symbol-info
semantic-grammar-mode ()
@@ -1717,10 +1721,14 @@ Otherwise return nil."
(setq val (semantic-grammar-eldoc-get-macro-docstring elt val)))
;; Function
((and elt (fboundp elt))
- (setq val (eldoc-get-fnsym-args-string elt)))
+ (setq val (if (fboundp 'eldoc-get-fnsym-args-string)
+ (eldoc-get-fnsym-args-string elt)
+ (elisp-get-fnsym-args-string elt))))
;; Variable
((and elt (boundp elt))
- (setq val (eldoc-get-var-docstring elt)))
+ (setq val (if (fboundp 'eldoc-get-var-docstring)
+ (eldoc-get-var-docstring elt)
+ (elisp-get-var-docstring elt))))
(t nil)))
(or val (semantic-idle-summary-current-symbol-info-default))))
diff --git a/lisp/cedet/semantic/symref.el b/lisp/cedet/semantic/symref.el
index 10293d9496c..2c5e3ba1805 100644
--- a/lisp/cedet/semantic/symref.el
+++ b/lisp/cedet/semantic/symref.el
@@ -472,8 +472,12 @@ buffers that were opened."
(goto-char (point-min))
(forward-line (1- line))
- ;; Search forward for the matching text
- (when (re-search-forward (regexp-quote searchtxt)
+ ;; Search forward for the matching text.
+ ;; FIXME: This still fails if the regexp uses something specific
+ ;; to the extended syntax, like grouping.
+ (when (re-search-forward (if (memq searchtype '(regexp tagregexp))
+ searchtxt
+ (regexp-quote searchtxt))
(point-at-eol)
t)
(goto-char (match-beginning 0))
diff --git a/lisp/cedet/semantic/symref/grep.el b/lisp/cedet/semantic/symref/grep.el
index 981dab8a8b5..6325eb4a396 100644
--- a/lisp/cedet/semantic/symref/grep.el
+++ b/lisp/cedet/semantic/symref/grep.el
@@ -46,9 +46,11 @@ and those hits returned.")
'((c-mode "*.[ch]")
(c++-mode "*.[chCH]" "*.[ch]pp" "*.cc" "*.hh")
(html-mode "*.s?html" "*.php")
+ (ruby-mode "*.r[bu]" "*.rake" "*.gemspec" "*.erb" "*.haml"
+ "Rakefile" "Thorfile" "Capfile" "Guardfile" "Vagrantfile")
)
- "List of major modes and file extension pattern regexp.
-See find -regex man page for format.")
+ "List of major modes and file extension pattern.
+See find -name man page for format.")
(defun semantic-symref-derive-find-filepatterns (&optional mode)
"Derive a list of file patterns for the current buffer.
@@ -85,6 +87,9 @@ Optional argument MODE specifies the `major-mode' to test."
(error "Customize `semantic-symref-filepattern-alist' for %s" major-mode))
)))
+(defvar grepflags)
+(defvar greppattern)
+
(defvar semantic-symref-grep-expand-keywords
(condition-case nil
(let* ((kw (copy-alist grep-expand-keywords))
@@ -96,7 +101,7 @@ Optional argument MODE specifies the `major-mode' to test."
(error nil))
"Grep expand keywords used when expanding templates for symref.")
-(defun semantic-symref-grep-use-template (rootdir filepattern grepflags greppattern)
+(defun semantic-symref-grep-use-template (rootdir filepattern flags pattern)
"Use the grep template expand feature to create a grep command.
ROOTDIR is the root location to run the `find' from.
FILEPATTERN is a string representing find flags for searching file patterns.
@@ -104,18 +109,29 @@ GREPFLAGS are flags passed to grep, such as -n or -l.
GREPPATTERN is the pattern used by grep."
;; We have grep-compute-defaults. Let's use it.
(grep-compute-defaults)
- (let* ((grep-expand-keywords semantic-symref-grep-expand-keywords)
- (cmd (grep-expand-template grep-find-template
- greppattern
- filepattern
- rootdir)))
+ (let* ((grepflags flags)
+ (greppattern pattern)
+ (grep-expand-keywords semantic-symref-grep-expand-keywords)
+ (cmd (grep-expand-template
+ (if (memq system-type '(windows-nt ms-dos))
+ ;; grep-find uses '--color=always' on MS-Windows
+ ;; because it wants the colorized output, to show
+ ;; it to the user. By contrast, here we don't show
+ ;; the output, and the SGR escapes get in the way
+ ;; of parsing the output.
+ (replace-regexp-in-string "--color=always" ""
+ grep-find-template t t)
+ grep-find-template)
+ greppattern
+ filepattern
+ rootdir)))
;; For some reason, my default has no <D> in it.
(when (string-match "find \\(\\.\\)" cmd)
(setq cmd (replace-match rootdir t t cmd 1)))
;;(message "New command: %s" cmd)
cmd))
-(defcustom semantic-symref-grep-shell "sh"
+(defcustom semantic-symref-grep-shell shell-file-name
"The shell command to use for executing find/grep.
This shell should support pipe redirect syntax."
:group 'semantic
@@ -125,22 +141,28 @@ This shell should support pipe redirect syntax."
"Perform a search with Grep."
;; Grep doesn't support some types of searches.
(let ((st (oref tool :searchtype)))
- (when (not (eq st 'symbol))
+ (when (not (memq st '(symbol regexp)))
(error "Symref impl GREP does not support searchtype of %s" st))
)
;; Find the root of the project, and do a find-grep...
(let* (;; Find the file patterns to use.
- (pat (cdr (assoc major-mode semantic-symref-filepattern-alist)))
(rootdir (semantic-symref-calculate-rootdir))
(filepattern (semantic-symref-derive-find-filepatterns))
;; Grep based flags.
(grepflags (cond ((eq (oref tool :resulttype) 'file)
- "-l ")
- (t "-n ")))
- (greppat (cond ((eq (oref tool :searchtype) 'regexp)
- (oref tool searchfor))
- (t
- (concat "'\\<" (oref tool searchfor) "\\>'"))))
+ "-l ")
+ ((eq (oref tool :searchtype) 'regexp)
+ "-nE ")
+ (t "-n ")))
+ (greppat (shell-quote-argument
+ (cond ((eq (oref tool :searchtype) 'regexp)
+ (oref tool searchfor))
+ (t
+ ;; Can't use the word boundaries: Grep
+ ;; doesn't always agrees with the language
+ ;; syntax on those.
+ (format "\\(^\\|\\W\\)%s\\(\\W\\|$\\)"
+ (oref tool searchfor))))))
;; Misc
(b (get-buffer-create "*Semantic SymRef*"))
(ans nil)
@@ -158,10 +180,12 @@ This shell should support pipe redirect syntax."
(let ((cmd (concat "find " default-directory " -type f " filepattern " -print0 "
"| xargs -0 grep -H " grepflags "-e " greppat)))
;;(message "Old command: %s" cmd)
- (call-process semantic-symref-grep-shell nil b nil "-c" cmd)
+ (call-process semantic-symref-grep-shell nil b nil
+ shell-command-switch cmd)
)
(let ((cmd (semantic-symref-grep-use-template rootdir filepattern grepflags greppat)))
- (call-process semantic-symref-grep-shell nil b nil "-c" cmd))
+ (call-process semantic-symref-grep-shell nil b nil
+ shell-command-switch cmd))
))
(setq ans (semantic-symref-parse-tool-output tool b))
;; Return the answer
diff --git a/lisp/cedet/semantic/symref/idutils.el b/lisp/cedet/semantic/symref/idutils.el
index c22a6a3b7fb..655b000ccdd 100644
--- a/lisp/cedet/semantic/symref/idutils.el
+++ b/lisp/cedet/semantic/symref/idutils.el
@@ -60,7 +60,7 @@ Moves cursor to end of the match."
(when (re-search-forward "^\\([^ ]+\\) " nil t)
(match-string 1)))
(t
- (when (re-search-forward "^\\([^ :]+\\):+\\([0-9]+\\):" nil t)
+ (when (re-search-forward "^\\(\\(?:[a-zA-Z]:\\)?[^:\n]+\\):\\([0-9]+\\):" nil t)
(cons (string-to-number (match-string 2))
(expand-file-name (match-string 1) default-directory))
))))
diff --git a/lisp/cedet/semantic/symref/list.el b/lisp/cedet/semantic/symref/list.el
index c99fc5f1932..f72499bf88e 100644
--- a/lisp/cedet/semantic/symref/list.el
+++ b/lisp/cedet/semantic/symref/list.el
@@ -84,9 +84,13 @@ This command uses the currently configured references tool within the
current project to find references to the input SYM. The
references are the organized by file and the name of the function
they are used in.
-Display the references in`semantic-symref-results-mode'."
- (interactive (list (semantic-tag-name (semantic-complete-read-tag-buffer-deep
- "Symrefs for: "))))
+Display the references in `semantic-symref-results-mode'."
+ (interactive (list (let ((tag (semantic-current-tag)))
+ (read-string " Symrefs for: " nil nil
+ (when tag
+ (regexp-quote (semantic-tag-name tag)))))))
+ ;; FIXME: Shouldn't the input be in Emacs regexp format, for
+ ;; consistency? Converting it to extended is not hard.
(semantic-fetch-tags)
(message "Gathering References...")
;; Gather results and tags
diff --git a/lisp/cedet/srecode/compile.el b/lisp/cedet/srecode/compile.el
index c93a6f72a9a..a8d6a5008bb 100644
--- a/lisp/cedet/srecode/compile.el
+++ b/lisp/cedet/srecode/compile.el
@@ -116,19 +116,19 @@ additional static argument data."))
Plain text strings are not handled via this baseclass."
:abstract t)
-(cl-defmethod srecode-parse-input ((ins srecode-template-inserter)
- tag input STATE)
+(cl-defmethod srecode-parse-input ((_ins srecode-template-inserter)
+ _tag input _STATE)
"For the template inserter INS, parse INPUT.
Shorten input only by the amount needed.
Return the remains of INPUT.
STATE is the current compilation state."
input)
-(cl-defmethod srecode-match-end ((ins srecode-template-inserter) name)
+(cl-defmethod srecode-match-end ((_ins srecode-template-inserter) _name)
"For the template inserter INS, do I end a section called NAME?"
nil)
-(cl-defmethod srecode-inserter-apply-state ((ins srecode-template-inserter) STATE)
+(cl-defmethod srecode-inserter-apply-state ((_ins srecode-template-inserter) _STATE)
"For the template inserter INS, apply information from STATE."
nil)
@@ -415,7 +415,7 @@ If END-NAME is specified, and the input string"
(match-end 0)))
(namestart (match-end 0))
(junk (string-match regexend what namestart))
- end tail name key)
+ end tail name)
;; Add string to compiled output
(when (> (length prefix) 0)
(setq comp (cons prefix comp)))
@@ -453,8 +453,7 @@ If END-NAME is specified, and the input string"
(semantic-tag-name tag)))
)
;; Add string to compiled output
- (setq name (substring what namestart end)
- key nil)
+ (setq name (substring what namestart end))
;; Trim WHAT back.
(setq what (substring what tail))
;; Get the inserter
@@ -523,7 +522,7 @@ to the inserter constructor."
(setq classes (append classes (eieio-class-children (car classes))))
;; Do we have a match?
(when (and (not (class-abstract-p (car classes)))
- (equal (oref (car classes) key) key))
+ (equal (oref-default (car classes) key) key))
;; Create the new class, and apply state.
(setq new (apply (car classes) name props))
(srecode-inserter-apply-state new STATE)
@@ -642,7 +641,7 @@ Argument INDENT specifies the indentation level for the list."
(princ "\n"))))
)
-(cl-defmethod srecode-dump ((ins srecode-template-inserter) indent)
+(cl-defmethod srecode-dump ((ins srecode-template-inserter) _indent)
"Dump the state of the SRecode template inserter INS."
(princ "INS: \"")
(princ (eieio-object-name-string ins))
diff --git a/lisp/cedet/srecode/dictionary.el b/lisp/cedet/srecode/dictionary.el
index 97d3310a2ae..27e730f9d6a 100644
--- a/lisp/cedet/srecode/dictionary.el
+++ b/lisp/cedet/srecode/dictionary.el
@@ -195,8 +195,8 @@ associated with a buffer or parent."
initfrombuff t)))
;; Create the new dictionary object.
- (let ((dict (srecode-dictionary
- major-mode
+ (let ((dict (make-instance
+ 'srecode-dictionary
:buffer buffer
:parent parent
:namehash (make-hash-table :test 'equal
diff --git a/lisp/cedet/srecode/insert.el b/lisp/cedet/srecode/insert.el
index 0c13ee51e34..c2a70fe030f 100644
--- a/lisp/cedet/srecode/insert.el
+++ b/lisp/cedet/srecode/insert.el
@@ -35,7 +35,6 @@
(require 'srecode/args)
(require 'srecode/filters)
-(defvar srecode-template-inserter-point)
(declare-function srecode-overlaid-activate "srecode/fields")
(declare-function srecode-template-inserted-region "srecode/fields")
@@ -145,7 +144,7 @@ has set everything up already."
)
(set-buffer standard-output)
(setq end-mark (point-marker))
- (goto-char (oref srecode-template-inserter-point point)))
+ (goto-char (oref-default 'srecode-template-inserter-point point)))
(oset-default 'srecode-template-inserter-point point eieio-unbound)
;; Return the end-mark.
@@ -264,13 +263,12 @@ Optional argument TEMP is the template that is getting its arguments resolved."
"Push the srecoder template ST onto the active stack."
(oset st active (cons st (oref st active))))
-(cl-defmethod srecode-pop ((st (subclass srecode-template)))
- "Pop the srecoder template ST onto the active stack.
-ST can be a class, or an object."
+(cl-defmethod srecode-pop ((st srecode-template))
+ "Pop the srecoder template ST onto the active stack."
(oset st active (cdr (oref st active))))
-(cl-defmethod srecode-peek ((st (subclass srecode-template)))
- "Fetch the topmost active template record. ST can be a class."
+(cl-defmethod srecode-peek ((st srecode-template))
+ "Fetch the topmost active template record."
(car (oref st active)))
(cl-defmethod srecode-insert-method ((st srecode-template) dictionary)
@@ -363,7 +361,7 @@ occur in your template.")
((stringp i)
(princ i))))))
-(cl-defmethod srecode-dump ((ins srecode-template-inserter-newline) indent)
+(cl-defmethod srecode-dump ((ins srecode-template-inserter-newline) _indent)
"Dump the state of the SRecode template inserter INS."
(cl-call-next-method)
(when (oref ins hard)
@@ -425,8 +423,8 @@ Specify the :blank argument to enable this inserter.")
)
"Allow comments within template coding. This inserts nothing.")
-(cl-defmethod srecode-inserter-prin-example ((ins (subclass srecode-template-inserter-comment))
- escape-start escape-end)
+(cl-defmethod srecode-inserter-prin-example ((_ins (subclass srecode-template-inserter-comment))
+ escape-start escape-end)
"Insert an example using inserter INS.
Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
(princ " ")
@@ -436,8 +434,8 @@ Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
(terpri)
)
-(cl-defmethod srecode-insert-method ((sti srecode-template-inserter-comment)
- dictionary)
+(cl-defmethod srecode-insert-method ((_sti srecode-template-inserter-comment)
+ _dictionary)
"Don't insert anything for comment macros in STI."
nil)
@@ -491,7 +489,7 @@ If SECONDNAME is nil, return VALUE."
(setq val (srecode-insert-variable-secondname-handler
sti dictionary val fcnpart)))
;; Compound data value
- ((srecode-dictionary-compound-value-child-p val)
+ ((cl-typep val 'srecode-dictionary-compound-value)
;; Force FCN to be a symbol
(when fcnpart (setq fcnpart (read fcnpart)))
;; Convert compound value to a string with the fcn.
@@ -502,7 +500,7 @@ If SECONDNAME is nil, return VALUE."
(setq do-princ nil)))
;; Dictionaries... not allowed in this style
- ((srecode-dictionary-child-p val)
+ ((cl-typep val 'srecode-dictionary)
(srecode-insert-report-error
dictionary
"Macro %s cannot insert a dictionary - use section macros instead"
@@ -661,7 +659,7 @@ Use DICTIONARY to resolve values."
;; across multiple locations.
compound-value))
-(cl-defmethod srecode-dump ((ins srecode-template-inserter-ask) indent)
+(cl-defmethod srecode-dump ((ins srecode-template-inserter-ask) _indent)
"Dump the state of the SRecode template inserter INS."
(cl-call-next-method)
(princ " : \"")
@@ -682,7 +680,7 @@ to 10 characters, with spaces added to the left. Use `right' for adding
spaces to the right.")
(cl-defmethod srecode-insert-variable-secondname-handler
- ((sti srecode-template-inserter-width) dictionary value width)
+ ((_sti srecode-template-inserter-width) dictionary value width)
"For VALUE handle WIDTH behaviors for this variable inserter.
Return the result as a string.
By default, treat as a function name."
@@ -714,8 +712,8 @@ By default, treat as a function name."
(concat padchars value)
(concat value padchars))))))
-(cl-defmethod srecode-inserter-prin-example ((ins (subclass srecode-template-inserter-width))
- escape-start escape-end)
+(cl-defmethod srecode-inserter-prin-example ((_ins (subclass srecode-template-inserter-width))
+ escape-start escape-end)
"Insert an example using inserter INS.
Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
(princ " ")
@@ -750,8 +748,8 @@ The cursor is placed at the ^ macro after insertion.
Some inserter macros, such as `srecode-template-inserter-include-wrap'
will place text at the ^ macro from the included macro.")
-(cl-defmethod srecode-inserter-prin-example ((ins (subclass srecode-template-inserter-point))
- escape-start escape-end)
+(cl-defmethod srecode-inserter-prin-example ((_ins (subclass srecode-template-inserter-point))
+ escape-start escape-end)
"Insert an example using inserter INS.
Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
(princ " ")
@@ -787,8 +785,8 @@ generalized marker will do something else. See
"Wrap a section of a template under the control of a macro."
:abstract t)
-(cl-defmethod srecode-inserter-prin-example ((ins (subclass srecode-template-inserter-subtemplate))
- escape-start escape-end)
+(cl-defmethod srecode-inserter-prin-example ((_ins (subclass srecode-template-inserter-subtemplate))
+ escape-start escape-end)
"Insert an example using inserter INS.
Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
(cl-call-next-method)
@@ -805,7 +803,7 @@ Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
dict slot)
"Insert a subtemplate for the inserter STI with dictionary DICT."
;; Make sure that only dictionaries are used.
- (unless (srecode-dictionary-child-p dict)
+ (unless (cl-typep dict 'srecode-dictionary)
(srecode-insert-report-error
dict
"Only section dictionaries allowed for `%s'"
@@ -889,8 +887,8 @@ Return the remains of INPUT."
"All template segments between the section-start and section-end
are treated specially.")
-(cl-defmethod srecode-insert-method ((sti srecode-template-inserter-section-end)
- dictionary)
+(cl-defmethod srecode-insert-method ((_sti srecode-template-inserter-section-end)
+ _dictionary)
"Insert the STI inserter."
)
@@ -912,7 +910,7 @@ are treated specially.")
The included template will have additional dictionary entries from the subdictionary
stored specified by this macro.")
-(cl-defmethod srecode-inserter-prin-example ((ins (subclass srecode-template-inserter-include))
+(cl-defmethod srecode-inserter-prin-example ((_ins (subclass srecode-template-inserter-include))
escape-start escape-end)
"Insert an example using inserter INS.
Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
@@ -1017,7 +1015,7 @@ stored specified by this macro. If the included macro includes a ^ macro,
then the text between this macro and the end macro will be inserted at
the ^ macro.")
-(cl-defmethod srecode-inserter-prin-example ((ins (subclass srecode-template-inserter-include-wrap))
+(cl-defmethod srecode-inserter-prin-example ((_ins (subclass srecode-template-inserter-include-wrap))
escape-start escape-end)
"Insert an example using inserter INS.
Arguments ESCAPE-START and ESCAPE-END are the current escape sequences in use."
diff --git a/lisp/cus-start.el b/lisp/cus-start.el
index 071aaa6850f..b4d2139022c 100644
--- a/lisp/cus-start.el
+++ b/lisp/cus-start.el
@@ -438,6 +438,7 @@ Leaving \"Default\" unchecked is equivalent with specifying a default of
(const super)) "23.1")
(ns-antialias-text ns boolean "23.1")
(ns-auto-hide-menu-bar ns boolean "24.1")
+ (ns-confirm-quit ns boolean "25.1")
(ns-use-native-fullscreen ns boolean "24.4")
(ns-use-fullscreen-animation ns boolean "25.1")
(ns-use-srgb-colorspace ns boolean "24.4")
diff --git a/lisp/dired-aux.el b/lisp/dired-aux.el
index b4e2dc0a937..4dcb519b039 100644
--- a/lisp/dired-aux.el
+++ b/lisp/dired-aux.el
@@ -413,12 +413,15 @@ into the minibuffer."
;; Now the original list FILES has been put back as it was.
(nconc past pending))))
+(defvar lpr-printer-switch)
+
;;;###autoload
(defun dired-do-print (&optional arg)
"Print the marked (or next ARG) files.
Uses the shell command coming from variables `lpr-command' and
`lpr-switches' as default."
(interactive "P")
+ (require 'lpr)
(let* ((file-list (dired-get-marked-files t arg))
(lpr-switches
(if (and (stringp printer-name)
diff --git a/lisp/dired.el b/lisp/dired.el
index cc16c8c9c53..ca13900f681 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -3889,7 +3889,7 @@ Ask means pop up a menu for the user to select one of copy, move or link."
;;; Start of automatically extracted autoloads.
-;;;### (autoloads nil "dired-aux" "dired-aux.el" "65f8aa57ace423283926d92dff903ca7")
+;;;### (autoloads nil "dired-aux" "dired-aux.el" "8820677763cb69eef827e38b86d35f47")
;;; Generated autoloads from dired-aux.el
(autoload 'dired-diff "dired-aux" "\
diff --git a/lisp/dom.el b/lisp/dom.el
index 42131073a04..091197a8f9d 100644
--- a/lisp/dom.el
+++ b/lisp/dom.el
@@ -25,6 +25,7 @@
;;; Code:
(require 'cl-lib)
+(eval-when-compile (require 'subr-x))
(defsubst dom-tag (node)
"Return the NODE tag."
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el
index 51bbf8a2944..67744c69b14 100644
--- a/lisp/emacs-lisp/bytecomp.el
+++ b/lisp/emacs-lisp/bytecomp.el
@@ -979,17 +979,6 @@ Each function's symbol gets added to `byte-compile-noruntime-functions'."
(lambda (x) (if (symbolp x) (list 'prin1-to-string x) x))
args))))))
-(defvar byte-compile--interactive nil
- "Determine if `byte-compile--message' uses the minibuffer.")
-
-(defun byte-compile--message (format &rest args)
- "Like `message', except sometimes don't print to minibuffer.
-If the variable `byte-compile--interactive' is nil, the message
-is not displayed on the minibuffer."
- (apply #'message format args)
- (unless byte-compile--interactive
- (message nil)))
-
;; Log something that isn't a warning.
(defun byte-compile-log-1 (string)
(with-current-buffer byte-compile-log-buffer
@@ -997,7 +986,7 @@ is not displayed on the minibuffer."
(goto-char (point-max))
(byte-compile-warning-prefix nil nil)
(cond (noninteractive
- (byte-compile--message " %s" string))
+ (message " %s" string))
(t
(insert (format "%s\n" string)))))))
@@ -1601,10 +1590,7 @@ extra args."
"Recompile every `.el' file in DIRECTORY that already has a `.elc' file.
Files in subdirectories of DIRECTORY are processed also."
(interactive "DByte force recompile (directory): ")
- (let ((byte-compile--interactive
- (or byte-compile--interactive
- (called-interactively-p 'any))))
- (byte-recompile-directory directory nil t)))
+ (byte-recompile-directory directory nil t))
;;;###autoload
(defun byte-recompile-directory (directory &optional arg force)
@@ -1634,9 +1620,6 @@ that already has a `.elc' file."
(compilation-mode))
(let ((directories (list default-directory))
(default-directory default-directory)
- (byte-compile--interactive
- (or byte-compile--interactive
- (called-interactively-p 'any)))
(skip-count 0)
(fail-count 0)
(file-count 0)
@@ -1645,7 +1628,7 @@ that already has a `.elc' file."
(displaying-byte-compile-warnings
(while directories
(setq directory (car directories))
- (byte-compile--message "Checking %s..." directory)
+ (message "Checking %s..." directory)
(dolist (file (directory-files directory))
(let ((source (expand-file-name file directory)))
(if (file-directory-p source)
@@ -1670,13 +1653,13 @@ that already has a `.elc' file."
(`t file-count)
(_ fail-count)))
(or noninteractive
- (byte-compile--message "Checking %s..." directory))
+ (message "Checking %s..." directory))
(if (not (eq last-dir directory))
(setq last-dir directory
dir-count (1+ dir-count)))
)))))
(setq directories (cdr directories))))
- (byte-compile--message "Done (Total of %d file%s compiled%s%s%s)"
+ (message "Done (Total of %d file%s compiled%s%s%s)"
file-count (if (= file-count 1) "" "s")
(if (> fail-count 0) (format ", %d failed" fail-count) "")
(if (> skip-count 0) (format ", %d skipped" skip-count) "")
@@ -1723,10 +1706,7 @@ If compilation is needed, this functions returns the result of
current-prefix-arg)))
(let ((dest (byte-compile-dest-file filename))
;; Expand now so we get the current buffer's defaults
- (filename (expand-file-name filename))
- (byte-compile--interactive
- (or byte-compile--interactive
- (called-interactively-p 'any))))
+ (filename (expand-file-name filename)))
(if (if (file-exists-p dest)
;; File was already compiled
;; Compile if forced to, or filename newer
@@ -1738,7 +1718,7 @@ If compilation is needed, this functions returns the result of
filename "? ")))))
(progn
(if (and noninteractive (not byte-compile-verbose))
- (byte-compile--message "Compiling %s..." filename))
+ (message "Compiling %s..." filename))
(byte-compile-file filename load))
(when load
(load (if (file-exists-p dest) dest filename)))
@@ -1782,9 +1762,6 @@ The value is non-nil if there were no errors, nil if errors."
(let ((byte-compile-current-file filename)
(byte-compile-current-group nil)
(set-auto-coding-for-load t)
- (byte-compile--interactive
- (or byte-compile--interactive
- (called-interactively-p 'any)))
target-file input-buffer output-buffer
byte-compile-dest-file)
(setq target-file (byte-compile-dest-file filename))
@@ -1840,14 +1817,14 @@ The value is non-nil if there were no errors, nil if errors."
;; (byte-compile-abbreviate-file filename)
;; (with-current-buffer input-buffer no-byte-compile))
(when (file-exists-p target-file)
- (byte-compile--message "%s deleted because of `no-byte-compile: %s'"
+ (message "%s deleted because of `no-byte-compile: %s'"
(byte-compile-abbreviate-file target-file)
(buffer-local-value 'no-byte-compile input-buffer))
(condition-case nil (delete-file target-file) (error nil)))
;; We successfully didn't compile this file.
'no-byte-compile)
(when byte-compile-verbose
- (byte-compile--message "Compiling %s..." filename))
+ (message "Compiling %s..." filename))
(setq byte-compiler-error-flag nil)
;; It is important that input-buffer not be current at this call,
;; so that the value of point set in input-buffer
@@ -1859,7 +1836,7 @@ The value is non-nil if there were no errors, nil if errors."
(if byte-compiler-error-flag
nil
(when byte-compile-verbose
- (byte-compile--message "Compiling %s...done" filename))
+ (message "Compiling %s...done" filename))
(kill-buffer input-buffer)
(with-current-buffer output-buffer
(goto-char (point-max))
@@ -1885,7 +1862,7 @@ The value is non-nil if there were no errors, nil if errors."
;; recompiled). Previously this was accomplished by
;; deleting target-file before writing it.
(rename-file tempfile target-file t)
- (or noninteractive (byte-compile--message "Wrote %s" target-file)))
+ (or noninteractive (message "Wrote %s" target-file)))
;; This is just to give a better error message than write-region
(signal 'file-error
(list "Opening output file"
@@ -1919,9 +1896,6 @@ With argument ARG, insert value in current buffer after the form."
(byte-compile-read-position (point))
(byte-compile-last-position byte-compile-read-position)
(byte-compile-last-warned-form 'nothing)
- (byte-compile--interactive
- (or byte-compile--interactive
- (called-interactively-p 'any)))
(value (eval
(let ((read-with-symbol-positions (current-buffer))
(read-symbol-positions-list nil))
@@ -1929,10 +1903,10 @@ With argument ARG, insert value in current buffer after the form."
(byte-compile-sexp (read (current-buffer)))))
lexical-binding)))
(cond (arg
- (byte-compile--message "Compiling from buffer... done.")
+ (message "Compiling from buffer... done.")
(prin1 value (current-buffer))
(insert "\n"))
- ((byte-compile--message "%s" (prin1-to-string value)))))))
+ ((message "%s" (prin1-to-string value)))))))
(defun byte-compile-from-buffer (inbuffer)
(let ((byte-compile-current-buffer inbuffer)
@@ -2436,7 +2410,7 @@ not to take responsibility for the actual compilation of the code."
(byte-compile-arglist-warn name arglist macro))
(if byte-compile-verbose
- (byte-compile--message "Compiling %s... (%s)"
+ (message "Compiling %s... (%s)"
(or byte-compile-current-file "") name))
(cond ((not (or macro (listp body)))
;; We do not know positively if the definition is a macro
@@ -2606,7 +2580,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
;; error to a simple message for the known case where signaling an error
;; causes problems.
((byte-code-function-p fun)
- (byte-compile--message "Function %s is already compiled"
+ (message "Function %s is already compiled"
(if (symbolp form) form "provided"))
fun)
(t
@@ -2946,11 +2920,17 @@ for symbols generated by the byte compiler itself."
;; Special macro-expander used during byte-compilation.
(defun byte-compile-macroexpand-declare-function (fn file &rest args)
- (push (cons fn
- (if (and (consp args) (listp (car args)))
- (list 'declared (car args))
- t)) ; Arglist not specified.
- byte-compile-function-environment)
+ (let ((gotargs (and (consp args) (listp (car args))))
+ (unresolved (assq fn byte-compile-unresolved-functions)))
+ (when unresolved ; function was called before declaration
+ (if (and gotargs (byte-compile-warning-enabled-p 'callargs))
+ (byte-compile-arglist-warn fn (car args) nil)
+ (setq byte-compile-unresolved-functions
+ (delq unresolved byte-compile-unresolved-functions))))
+ (push (cons fn (if gotargs
+ (list 'declared (car args))
+ t)) ; Arglist not specified.
+ byte-compile-function-environment))
;; We are stating that it _will_ be defined at runtime.
(setq byte-compile-noruntime-functions
(delq fn byte-compile-noruntime-functions))
@@ -4424,8 +4404,8 @@ binding slots have been popped."
name macro arglist body rest)
(when macro
(if (null fun)
- (byte-compile--message "Macro %s unrecognized, won't work in file" name)
- (byte-compile--message "Macro %s partly recognized, trying our luck" name)
+ (message "Macro %s unrecognized, won't work in file" name)
+ (message "Macro %s partly recognized, trying our luck" name)
(push (cons name (eval fun))
byte-compile-macro-environment)))
(byte-compile-keep-pending form))))
@@ -4551,11 +4531,11 @@ The call tree also lists those functions which are not known to be called
\(that is, to which no calls have been compiled\), and which cannot be
invoked interactively."
(interactive)
- (byte-compile--message "Generating call tree...")
+ (message "Generating call tree...")
(with-output-to-temp-buffer "*Call-Tree*"
(set-buffer "*Call-Tree*")
(erase-buffer)
- (byte-compile--message "Generating call tree... (sorting on %s)"
+ (message "Generating call tree... (sorting on %s)"
byte-compile-call-tree-sort)
(insert "Call tree for "
(cond ((null byte-compile-current-file) (or filename "???"))
diff --git a/lisp/emacs-lisp/chart.el b/lisp/emacs-lisp/chart.el
index 851b3bfc6fd..06601252a4c 100644
--- a/lisp/emacs-lisp/chart.el
+++ b/lisp/emacs-lisp/chart.el
@@ -280,7 +280,7 @@ START and END represent the boundary."
"Draw axis information based upon a range to be spread along the edge.
A is the chart to draw. DIR is the direction.
MARGIN, ZONE, START, and END specify restrictions in chart space."
- (call-next-method)
+ (cl-call-next-method)
;; We prefer about 5 spaces between each value
(let* ((i (car (oref a bounds)))
(e (cdr (oref a bounds)))
@@ -333,7 +333,7 @@ Automatically compensates for direction."
"Draw axis information based upon A range to be spread along the edge.
Optional argument DIR is the direction of the chart.
Optional arguments MARGIN, ZONE, START and END specify boundaries of the drawing."
- (call-next-method)
+ (cl-call-next-method)
;; We prefer about 5 spaces between each value
(let* ((i 0)
(s (oref a items))
diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el
index 8fc299d7e93..7269b83b619 100644
--- a/lisp/emacs-lisp/check-declare.el
+++ b/lisp/emacs-lisp/check-declare.el
@@ -157,6 +157,7 @@ is a string giving details of the error."
(setq re (format (if cflag
"^[ \t]*\\(DEFUN\\)[ \t]*([ \t]*\"%s\""
"^[ \t]*(\\(fset[ \t]+'\\|\
+cl-def\\(?:generic\\|method\\)\\|\
def\\(?:un\\|subst\\|foo\\|method\\|class\\|\
ine-\\(?:derived\\|generic\\|\\(?:global\\(?:ized\\)?-\\)?minor\\)-mode\\|\
\\(?:ine-obsolete-function-\\)?alias[ \t]+'\\|\
@@ -200,8 +201,8 @@ ine-overloadable-function\\)\\)\
type)
'obsolete)
;; Can't easily check arguments in these cases.
- ((string-match "\\`\\(def\\(alias\\|\
-method\\|class\\)\\|fset\\)\\>" type)
+ ((string-match "\\`\\(def\\(alias\\|class\\)\\|\
+fset\\|\\(?:cl-\\)?defmethod\\)\\>" type)
t)
((looking-at "\\((\\|nil\\)")
(byte-compile-arglist-signature
@@ -284,6 +285,8 @@ TYPE is a string giving the nature of the error. Warning is displayed in
type)
nil check-declare-warning-buffer)))
+(declare-function compilation-forget-errors "compile" ())
+
(defun check-declare-files (&rest files)
"Check veracity of all `declare-function' statements in FILES.
Return a list of any errors found."
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index fb11a3e25a1..a2716ef87ee 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -54,6 +54,15 @@
;; - The standard method combination supports ":extra STRING" qualifiers
;; which simply allows adding more methods for the same
;; specializers&qualifiers.
+;; - Methods can dispatch on the context. For that, a method needs to specify
+;; context arguments, introduced by `&context' (which need to come right
+;; after the mandatory arguments and before anything like
+;; &optional/&rest/&key). Each context argument is given as (EXP SPECIALIZER)
+;; which means that EXP is taken as an expression which computes some context
+;; and this value is then used to dispatch.
+;; E.g. (foo &context (major-mode (eql c-mode))) is an arglist specifying
+;; that this method will only be applicable when `major-mode' has value
+;; `c-mode'.
;; Efficiency considerations: overall, I've made an effort to make this fairly
;; efficient for the expected case (e.g. no constant redefinition of methods).
@@ -222,17 +231,12 @@ BODY, if present, is used as the body of a default method.
,@(mapcar (lambda (method) `(cl-defmethod ,name ,@method))
(nreverse methods)))))
-(defun cl--generic-mandatory-args (args)
- (let ((res ()))
- (while (not (memq (car args) '(nil &rest &optional &key)))
- (push (pop args) res))
- (nreverse res)))
-
;;;###autoload
(defun cl-generic-define (name args options)
- (let ((generic (cl-generic-ensure-function name))
- (mandatory (cl--generic-mandatory-args args))
- (apo (assq :argument-precedence-order options)))
+ (pcase-let* ((generic (cl-generic-ensure-function name))
+ (`(,spec-args . ,_) (cl--generic-split-args args))
+ (mandatory (mapcar #'car spec-args))
+ (apo (assq :argument-precedence-order options)))
(setf (cl--generic-dispatches generic) nil)
(when apo
(dolist (arg (cdr apo))
@@ -259,52 +263,70 @@ This macro can only be used within the lexical scope of a cl-generic method."
(and (memq sexp vars) (not (memq sexp res)) (push sexp res))
res))
- (defun cl--generic-lambda (args body)
- "Make the lambda expression for a method with ARGS and BODY."
+ (defun cl--generic-split-args (args)
+ "Return (SPEC-ARGS . PLAIN-ARGS)."
(let ((plain-args ())
(specializers nil)
(mandatory t))
(dolist (arg args)
(push (pcase arg
((or '&optional '&rest '&key) (setq mandatory nil) arg)
- ((and `(,name . ,type) (guard mandatory))
+ ('&context
+ (unless mandatory
+ (error "&context not immediately after mandatory args"))
+ (setq mandatory 'context) nil)
+ ((let 'nil mandatory) arg)
+ ((let 'context mandatory)
+ (unless (consp arg)
+ (error "Invalid &context arg: %S" arg))
+ (push `((&context . ,(car arg)) . ,(cadr arg)) specializers)
+ nil)
+ (`(,name . ,type)
(push (cons name (car type)) specializers)
name)
- (_ arg))
+ (_
+ (push (cons arg t) specializers)
+ arg))
plain-args))
- (setq plain-args (nreverse plain-args))
- (let ((fun `(cl-function (lambda ,plain-args ,@body)))
- (macroenv (cons `(cl-generic-current-method-specializers
- . ,(lambda () specializers))
- macroexpand-all-environment)))
- (require 'cl-lib) ;Needed to expand `cl-flet' and `cl-function'.
- ;; First macroexpand away the cl-function stuff (e.g. &key and
- ;; destructuring args, `declare' and whatnot).
- (pcase (macroexpand fun macroenv)
- (`#'(lambda ,args . ,body)
- (let* ((parsed-body (macroexp-parse-body body))
- (cnm (make-symbol "cl--cnm"))
- (nmp (make-symbol "cl--nmp"))
- (nbody (macroexpand-all
- `(cl-flet ((cl-call-next-method ,cnm)
- (cl-next-method-p ,nmp))
- ,@(cdr parsed-body))
- macroenv))
- ;; FIXME: Rather than `grep' after the fact, the
- ;; macroexpansion should directly set some flag when cnm
- ;; is used.
- ;; FIXME: Also, optimize the case where call-next-method is
- ;; only called with explicit arguments.
- (uses-cnm (cl--generic-fgrep (list cnm nmp) nbody)))
- (cons (not (not uses-cnm))
- `#'(lambda (,@(if uses-cnm (list cnm)) ,@args)
- ,@(car parsed-body)
- ,(if (not (memq nmp uses-cnm))
- nbody
- `(let ((,nmp (lambda ()
- (cl--generic-isnot-nnm-p ,cnm))))
- ,nbody))))))
- (f (error "Unexpected macroexpansion result: %S" f)))))))
+ (cons (nreverse specializers)
+ (nreverse (delq nil plain-args)))))
+
+ (defun cl--generic-lambda (args body)
+ "Make the lambda expression for a method with ARGS and BODY."
+ (pcase-let* ((`(,spec-args . ,plain-args)
+ (cl--generic-split-args args))
+ (fun `(cl-function (lambda ,plain-args ,@body)))
+ (macroenv (cons `(cl-generic-current-method-specializers
+ . ,(lambda () spec-args))
+ macroexpand-all-environment)))
+ (require 'cl-lib) ;Needed to expand `cl-flet' and `cl-function'.
+ ;; First macroexpand away the cl-function stuff (e.g. &key and
+ ;; destructuring args, `declare' and whatnot).
+ (pcase (macroexpand fun macroenv)
+ (`#'(lambda ,args . ,body)
+ (let* ((parsed-body (macroexp-parse-body body))
+ (cnm (make-symbol "cl--cnm"))
+ (nmp (make-symbol "cl--nmp"))
+ (nbody (macroexpand-all
+ `(cl-flet ((cl-call-next-method ,cnm)
+ (cl-next-method-p ,nmp))
+ ,@(cdr parsed-body))
+ macroenv))
+ ;; FIXME: Rather than `grep' after the fact, the
+ ;; macroexpansion should directly set some flag when cnm
+ ;; is used.
+ ;; FIXME: Also, optimize the case where call-next-method is
+ ;; only called with explicit arguments.
+ (uses-cnm (cl--generic-fgrep (list cnm nmp) nbody)))
+ (cons (not (not uses-cnm))
+ `#'(lambda (,@(if uses-cnm (list cnm)) ,@args)
+ ,@(car parsed-body)
+ ,(if (not (memq nmp uses-cnm))
+ nbody
+ `(let ((,nmp (lambda ()
+ (cl--generic-isnot-nnm-p ,cnm))))
+ ,nbody))))))
+ (f (error "Unexpected macroexpansion result: %S" f))))))
;;;###autoload
@@ -375,21 +397,26 @@ which case this method will be invoked when the argument is `eql' to VAL.
;;;###autoload
(defun cl-generic-define-method (name qualifiers args uses-cnm function)
- (let* ((generic (cl-generic-ensure-function name))
- (mandatory (cl--generic-mandatory-args args))
- (specializers
- (mapcar (lambda (arg) (if (consp arg) (cadr arg) t)) mandatory))
- (method (cl--generic-make-method
- specializers qualifiers uses-cnm function))
- (mt (cl--generic-method-table generic))
- (me (cl--generic-member-method specializers qualifiers mt))
- (dispatches (cl--generic-dispatches generic))
- (i 0))
- (dolist (specializer specializers)
- (let* ((generalizers (cl-generic-generalizers specializer))
- (x (assq i dispatches)))
+ (pcase-let*
+ ((generic (cl-generic-ensure-function name))
+ (`(,spec-args . ,_) (cl--generic-split-args args))
+ (specializers (mapcar (lambda (spec-arg)
+ (if (eq '&context (car-safe (car spec-arg)))
+ spec-arg (cdr spec-arg)))
+ spec-args))
+ (method (cl--generic-make-method
+ specializers qualifiers uses-cnm function))
+ (mt (cl--generic-method-table generic))
+ (me (cl--generic-member-method specializers qualifiers mt))
+ (dispatches (cl--generic-dispatches generic))
+ (i 0))
+ (dolist (spec-arg spec-args)
+ (let* ((key (if (eq '&context (car-safe (car spec-arg)))
+ (car spec-arg) i))
+ (generalizers (cl-generic-generalizers (cdr spec-arg)))
+ (x (assoc key dispatches)))
(unless x
- (setq x (cons i (cl-generic-generalizers t)))
+ (setq x (cons key (cl-generic-generalizers t)))
(setf (cl--generic-dispatches generic)
(setq dispatches (cons x dispatches))))
(dolist (generalizer generalizers)
@@ -411,7 +438,16 @@ which case this method will be invoked when the argument is `eql' to VAL.
;; the generic function.
current-load-list)
;; For aliases, cl--generic-name gives us the actual name.
- (defalias (cl--generic-name generic) gfun))))
+ (funcall
+ (if purify-flag
+ ;; BEWARE! Don't purify this function definition, since that leads
+ ;; to memory corruption if the hash-tables it holds are modified
+ ;; (the GC doesn't trace those pointers).
+ #'fset
+ ;; But do use `defalias' in the normal case, so that it interacts
+ ;; properly with nadvice, e.g. for tracing/debug-on-entry.
+ #'defalias)
+ (cl--generic-name generic) gfun))))
(defmacro cl--generic-with-memoization (place &rest code)
(declare (indent 1) (debug t))
@@ -427,6 +463,7 @@ which case this method will be invoked when the argument is `eql' to VAL.
(defun cl--generic-get-dispatcher (dispatch)
(cl--generic-with-memoization
(gethash dispatch cl--generic-dispatchers)
+ ;; (message "cl--generic-get-dispatcher (%S)" dispatch)
(let* ((dispatch-arg (car dispatch))
(generalizers (cdr dispatch))
(lexical-binding t)
@@ -437,13 +474,14 @@ which case this method will be invoked when the argument is `eql' to VAL.
'arg))
generalizers))
(typescodes
- (mapcar (lambda (generalizer)
- `(funcall ',(cl--generic-generalizer-specializers-function
- generalizer)
- ,(funcall (cl--generic-generalizer-tagcode-function
- generalizer)
- 'arg)))
- generalizers))
+ (mapcar
+ (lambda (generalizer)
+ `(funcall ',(cl--generic-generalizer-specializers-function
+ generalizer)
+ ,(funcall (cl--generic-generalizer-tagcode-function
+ generalizer)
+ 'arg)))
+ generalizers))
(tag-exp
;; Minor optimization: since this tag-exp is
;; only used to lookup the method-cache, it
@@ -452,23 +490,30 @@ which case this method will be invoked when the argument is `eql' to VAL.
`(or ,@(if (macroexp-const-p (car (last tagcodes)))
(butlast tagcodes)
tagcodes)))
- (extraargs ()))
- (dotimes (_ dispatch-arg)
- (push (make-symbol "arg") extraargs))
+ (fixedargs '(arg))
+ (dispatch-idx dispatch-arg)
+ (bindings nil))
+ (when (eq '&context (car-safe dispatch-arg))
+ (setq bindings `((arg ,(cdr dispatch-arg))))
+ (setq fixedargs nil)
+ (setq dispatch-idx 0))
+ (dotimes (i dispatch-idx)
+ (push (make-symbol (format "arg%d" (- dispatch-idx i 1))) fixedargs))
;; FIXME: For generic functions with a single method (or with 2 methods,
;; one of which always matches), using a tagcode + hash-table is
;; overkill: better just use a `cl-typep' test.
(byte-compile
`(lambda (generic dispatches-left methods)
(let ((method-cache (make-hash-table :test #'eql)))
- (lambda (,@extraargs arg &rest args)
- (apply (cl--generic-with-memoization
- (gethash ,tag-exp method-cache)
- (cl--generic-cache-miss
- generic ',dispatch-arg dispatches-left methods
- ,(if (cdr typescodes)
- `(append ,@typescodes) (car typescodes))))
- ,@extraargs arg args))))))))
+ (lambda (,@fixedargs &rest args)
+ (let ,bindings
+ (apply (cl--generic-with-memoization
+ (gethash ,tag-exp method-cache)
+ (cl--generic-cache-miss
+ generic ',dispatch-arg dispatches-left methods
+ ,(if (cdr typescodes)
+ `(append ,@typescodes) (car typescodes))))
+ ,@fixedargs args)))))))))
(defun cl--generic-make-function (generic)
(cl--generic-make-next-function generic
@@ -593,8 +638,11 @@ FUN is the function that should be called when METHOD calls
dispatch-arg dispatches-left methods-left types)
(let ((methods '()))
(dolist (method methods-left)
- (let* ((specializer (or (nth dispatch-arg
- (cl--generic-method-specializers method))
+ (let* ((specializer (or (if (integerp dispatch-arg)
+ (nth dispatch-arg
+ (cl--generic-method-specializers method))
+ (cdr (assoc dispatch-arg
+ (cl--generic-method-specializers method))))
t))
(m (member specializer types)))
(when m
@@ -657,6 +705,25 @@ methods.")
(if (eq specializer t) (list cl--generic-t-generalizer)
(error "Unknown specializer %S" specializer)))
+(defmacro cl--generic-prefill-dispatchers (arg-or-context specializer)
+ (unless (integerp arg-or-context)
+ (setq arg-or-context `(&context . ,arg-or-context)))
+ (unless (fboundp 'cl--generic-get-dispatcher)
+ (require 'cl-generic))
+ (let ((fun (cl--generic-get-dispatcher
+ `(,arg-or-context ,@(cl-generic-generalizers specializer)
+ ,cl--generic-t-generalizer))))
+ ;; Recompute dispatch at run-time, since the generalizers may be slightly
+ ;; different (e.g. byte-compiled rather than interpreted).
+ ;; FIXME: There is a risk that the run-time generalizer is not equivalent
+ ;; to the compile-time one, in which case `fun' may not be correct
+ ;; any more!
+ `(let ((dispatch `(,',arg-or-context
+ ,@(cl-generic-generalizers ',specializer)
+ ,cl--generic-t-generalizer)))
+ ;; (message "Prefilling for %S with \n%S" dispatch ',fun)
+ (puthash dispatch ',fun cl--generic-dispatchers))))
+
(cl-defmethod cl-generic-combine-methods (generic methods)
"Standard support for :after, :before, :around, and `:extra NAME' qualifiers."
(cl--generic-standard-method-combination generic methods))
@@ -840,6 +907,8 @@ Can only be used from within the lexical body of a primary or around method."
(gethash (cadr specializer) cl--generic-head-used) specializer)
(list cl--generic-head-generalizer)))
+(cl--generic-prefill-dispatchers 0 (head eql))
+
;;; Support for (eql <val>) specializers.
(defvar cl--generic-eql-used (make-hash-table :test #'eql))
@@ -854,6 +923,9 @@ Can only be used from within the lexical body of a primary or around method."
(puthash (cadr specializer) specializer cl--generic-eql-used)
(list cl--generic-eql-generalizer))
+(cl--generic-prefill-dispatchers 0 (eql nil))
+(cl--generic-prefill-dispatchers window-system (eql nil))
+
;;; Support for cl-defstructs specializers.
(defun cl--generic-struct-tag (name)
@@ -910,6 +982,8 @@ Can only be used from within the lexical body of a primary or around method."
(list cl--generic-struct-generalizer))))
(cl-call-next-method)))
+(cl--generic-prefill-dispatchers 0 cl--generic-generalizer)
+
;;; Dispatch on "system types".
(defconst cl--generic-typeof-types
@@ -948,39 +1022,7 @@ Can only be used from within the lexical body of a primary or around method."
(list cl--generic-typeof-generalizer)))
(cl-call-next-method)))
-;;; Just for kicks: dispatch on major-mode
-;;
-;; Here's how you'd use it:
-;; (cl-defmethod foo ((x (major-mode text-mode)) y z) ...)
-;; And then
-;; (foo 'major-mode toto titi)
-;;
-;; FIXME: Better would be to do that via dispatch on an "implicit argument".
-;; E.g. (cl-defmethod foo (y z &context (major-mode text-mode)) ...)
-
-;; (defvar cl--generic-major-modes (make-hash-table :test #'eq))
-;;
-;; (add-function :before-until cl-generic-generalizer-function
-;; #'cl--generic-major-mode-tagcode)
-;; (defun cl--generic-major-mode-tagcode (type name)
-;; (if (eq 'major-mode (car-safe type))
-;; `(50 . (if (eq ,name 'major-mode)
-;; (cl--generic-with-memoization
-;; (gethash major-mode cl--generic-major-modes)
-;; `(cl--generic-major-mode . ,major-mode))))))
-;;
-;; (add-function :before-until cl-generic-tag-types-function
-;; #'cl--generic-major-mode-types)
-;; (defun cl--generic-major-mode-types (tag)
-;; (when (eq (car-safe tag) 'cl--generic-major-mode)
-;; (if (eq tag 'fundamental-mode) '(fundamental-mode t)
-;; (let ((types `((major-mode ,(cdr tag)))))
-;; (while (get (car types) 'derived-mode-parent)
-;; (push (list 'major-mode (get (car types) 'derived-mode-parent))
-;; types))
-;; (unless (eq 'fundamental-mode (car types))
-;; (push '(major-mode fundamental-mode) types))
-;; (nreverse types)))))
+(cl--generic-prefill-dispatchers 0 integer)
;; Local variables:
;; generated-autoload-file: "cl-loaddefs.el"
diff --git a/lisp/emacs-lisp/cl-lib.el b/lisp/emacs-lisp/cl-lib.el
index 6b43c126130..b6f3a793be6 100644
--- a/lisp/emacs-lisp/cl-lib.el
+++ b/lisp/emacs-lisp/cl-lib.el
@@ -731,9 +731,10 @@ If ALIST is non-nil, the new pairs are prepended to it."
;;; Miscellaneous.
(provide 'cl-lib)
-(or (load "cl-loaddefs" 'noerror 'quiet)
- ;; When bootstrapping, cl-loaddefs hasn't been built yet!
- (require 'cl-macs))
+(unless (load "cl-loaddefs" 'noerror 'quiet)
+ ;; When bootstrapping, cl-loaddefs hasn't been built yet!
+ (require 'cl-macs)
+ (require 'cl-seq))
;; Local variables:
;; byte-compile-dynamic: t
diff --git a/lisp/emacs-lisp/cl-seq.el b/lisp/emacs-lisp/cl-seq.el
index 5624accf66a..3aea67ad11b 100644
--- a/lisp/emacs-lisp/cl-seq.el
+++ b/lisp/emacs-lisp/cl-seq.el
@@ -1018,4 +1018,6 @@ Atoms are compared by `eql'; cons cells are compared recursively.
;; generated-autoload-file: "cl-loaddefs.el"
;; End:
+(provide 'cl-seq)
+
;;; cl-seq.el ends here
diff --git a/lisp/emacs-lisp/cl.el b/lisp/emacs-lisp/cl.el
index 564a44457d8..c966ace3852 100644
--- a/lisp/emacs-lisp/cl.el
+++ b/lisp/emacs-lisp/cl.el
@@ -626,6 +626,8 @@ You can replace this form with `gv-define-setter'.
;; ...the rest, and build the 5-tuple))
(make-obsolete 'get-setf-method 'gv-letplace "24.3")
+(declare-function cl--arglist-args "cl-macs" (args))
+
(defmacro define-modify-macro (name arglist func &optional doc)
"Define a `setf'-like modify macro.
If NAME is called, it combines its PLACE argument with the other
@@ -639,6 +641,7 @@ You can replace this macro with `gv-letplace'."
symbolp &optional stringp)))
(if (memq '&key arglist)
(error "&key not allowed in define-modify-macro"))
+ (require 'cl-macs) ;For cl--arglist-args.
(let ((place (make-symbol "--cl-place--")))
`(cl-defmacro ,name (,place ,@arglist)
,doc
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index ce5c7863c3c..9d32ba241de 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -731,7 +731,8 @@ Complete list of commands:
(buffer-substring (line-beginning-position 0)
(line-end-position 0)))))
-(declare-function help-xref-interned "help-mode" (symbol))
+(declare-function help-xref-interned "help-mode"
+ (symbol &optional buffer frame))
(defun debug-help-follow (&optional pos)
"Follow cross-reference at POS, defaulting to point.
diff --git a/lisp/emacs-lisp/eieio-core.el b/lisp/emacs-lisp/eieio-core.el
index 59d834837b0..bf3f44206c4 100644
--- a/lisp/emacs-lisp/eieio-core.el
+++ b/lisp/emacs-lisp/eieio-core.el
@@ -88,7 +88,7 @@ Currently under control of this var:
(cl-defstruct (eieio--class
(:constructor nil)
- (:constructor eieio--class-make (name &aux (tag 'defclass)))
+ (:constructor eieio--class-make (name))
(:include cl--class)
(:copier nil))
children
@@ -277,12 +277,12 @@ See `defclass' for more information."
(setq eieio-hook nil)
(let* ((oldc (let ((c (eieio--class-v cname))) (if (eieio--class-p c) c)))
- (newc (if (and oldc (not (eieio--class-default-object-cache oldc)))
- ;; The oldc class is a stub setup by eieio-defclass-autoload.
- ;; Reuse it instead of creating a new one, so that existing
- ;; references stay valid.
- oldc
- (eieio--class-make cname)))
+ (newc (or oldc
+ ;; Reuse `oldc' instead of creating a new one, so that
+ ;; existing references stay valid. E.g. when
+ ;; reloading the file that does the `defclass', we don't
+ ;; want to create a new class object.
+ (eieio--class-make cname)))
(groups nil) ;; list of groups id'd from slots
(clearparent nil))
@@ -292,7 +292,13 @@ See `defclass' for more information."
;; method table breakage, particularly when the users is only
;; byte compiling an EIEIO file.
(if oldc
- (setf (eieio--class-children newc) (eieio--class-children oldc))
+ (progn
+ (cl-assert (eq newc oldc))
+ ;; Reset the fields.
+ (setf (eieio--class-parents newc) nil)
+ (setf (eieio--class-slots newc) nil)
+ (setf (eieio--class-initarg-tuples newc) nil)
+ (setf (eieio--class-class-slots newc) nil))
;; If the old class did not exist, but did exist in the autoload map,
;; then adopt those children. This is like the above, but deals with
;; autoloads nicely.
@@ -724,7 +730,7 @@ Argument FN is the function calling this verifier."
(cl-check-type slot symbol)
(cl-check-type obj (or eieio-object class))
(let* ((class (cond ((symbolp obj)
- (error "eieio-oref called on a class!")
+ (error "eieio-oref called on a class: %s" obj)
(let ((c (eieio--class-v obj)))
(if (eieio--class-p c) (eieio-class-un-autoload obj))
c))
diff --git a/lisp/emacs-lisp/eieio-custom.el b/lisp/emacs-lisp/eieio-custom.el
index 26fc452f7b1..31d0b85c55a 100644
--- a/lisp/emacs-lisp/eieio-custom.el
+++ b/lisp/emacs-lisp/eieio-custom.el
@@ -223,6 +223,7 @@ Optional argument IGNORE is an extraneous parameter."
;; Loop over all the slots, creating child widgets.
(dotimes (i (length slots))
(let* ((slot (aref slots i))
+ (sname (eieio-slot-descriptor-name slot))
(props (cl--slot-descriptor-props slot)))
;; Output this slot if it has a customize flag associated with it.
(when (and (alist-get :custom props)
@@ -261,13 +262,13 @@ Optional argument IGNORE is an extraneous parameter."
(or
(eieio--class-slot-initarg
(eieio--object-class obj)
- (car slots))
- (car slots)))))
+ sname)
+ sname))))
(capitalize
(if (string-match "^:" s)
(substring s (match-end 0))
s)))))
- :value (slot-value obj (car slots))
+ :value (slot-value obj sname)
:doc (or (alist-get :documentation props)
"Slot not Documented.")
:eieio-custom-visibility 'visible
@@ -297,6 +298,13 @@ Optional argument IGNORE is an extraneous parameter."
(let* ((slot (aref slots i))
(props (cl--slot-descriptor-props slot))
(cust (alist-get :custom props)))
+ ;;
+ ;; Shouldn't I be incremented unconditionally? Or
+ ;; better shouldn't we simply mapc on the slots vector
+ ;; avoiding use of this integer variable? PLN Sat May
+ ;; 2 07:35:45 2015
+ ;;
+ (setq i (+ i 1))
(if (and cust
(or eieio-custom-ignore-eieio-co
(not master-group)
diff --git a/lisp/emacs-lisp/eieio-opt.el b/lisp/emacs-lisp/eieio-opt.el
index 7f98730340d..02b89e043e4 100644
--- a/lisp/emacs-lisp/eieio-opt.el
+++ b/lisp/emacs-lisp/eieio-opt.el
@@ -74,6 +74,9 @@ Argument CH-PREFIX is another character prefix to display."
;;; CLASS COMPLETION / DOCUMENTATION
+;; Called via help-fns-describe-function-functions.
+(declare-function help-fns-short-filename "help-fns" (filename))
+
;;;###autoload
(defun eieio-help-class (class)
"Print help description for CLASS.
diff --git a/lisp/emacs-lisp/eieio.el b/lisp/emacs-lisp/eieio.el
index 111459509bc..f6ffa3d6c71 100644
--- a/lisp/emacs-lisp/eieio.el
+++ b/lisp/emacs-lisp/eieio.el
@@ -967,7 +967,7 @@ variable PRINT-FUNCTION. Optional argument NOESCAPE is passed to
;;; Start of automatically extracted autoloads.
-;;;### (autoloads nil "eieio-custom" "eieio-custom.el" "813d32fbf76d4248fc6b4dc97ebcd720")
+;;;### (autoloads nil "eieio-custom" "eieio-custom.el" "916f54b818479a77a02f3ecccda84a11")
;;; Generated autoloads from eieio-custom.el
(autoload 'customize-object "eieio-custom" "\
@@ -978,7 +978,7 @@ Optional argument GROUP is the sub-group of slots to display.
;;;***
-;;;### (autoloads nil "eieio-opt" "eieio-opt.el" "3005b815c6b30eccbf0642170b3f82a5")
+;;;### (autoloads nil "eieio-opt" "eieio-opt.el" "59cee62a4829ace9bb4a6526442d2b3c")
;;; Generated autoloads from eieio-opt.el
(autoload 'eieio-browse "eieio-opt" "\
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index d527d676d51..0091cdb8484 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -354,7 +354,32 @@ return any documentation.")
nil))
(eldoc-message (funcall eldoc-documentation-function)))))
-
+;; If the entire line cannot fit in the echo area, the symbol name may be
+;; truncated or eliminated entirely from the output to make room for the
+;; description.
+(defun eldoc-docstring-format-sym-doc (prefix doc &optional face)
+ (when (symbolp prefix)
+ (setq prefix (concat (propertize (symbol-name prefix) 'face face) ": ")))
+ (let* ((ea-multi eldoc-echo-area-use-multiline-p)
+ ;; Subtract 1 from window width since emacs will not write
+ ;; any chars to the last column, or in later versions, will
+ ;; cause a wraparound and resize of the echo area.
+ (ea-width (1- (window-width (minibuffer-window))))
+ (strip (- (+ (length prefix) (length doc)) ea-width)))
+ (cond ((or (<= strip 0)
+ (eq ea-multi t)
+ (and ea-multi (> (length doc) ea-width)))
+ (concat prefix doc))
+ ((> (length doc) ea-width)
+ (substring (format "%s" doc) 0 ea-width))
+ ((>= strip (string-match-p ":? *\\'" prefix))
+ doc)
+ (t
+ ;; Show the end of the partial symbol name, rather
+ ;; than the beginning, since the former is more likely
+ ;; to be unique given package namespace conventions.
+ (concat (substring prefix strip) doc)))))
+
;; When point is in a sexp, the function args are not reprinted in the echo
;; area after every possible interactive command because some of them print
;; their own messages in the echo area; the eldoc functions would instantly
diff --git a/lisp/emacs-lisp/ert.el b/lisp/emacs-lisp/ert.el
index 4ffd8cd8558..b678e122c11 100644
--- a/lisp/emacs-lisp/ert.el
+++ b/lisp/emacs-lisp/ert.el
@@ -269,7 +269,7 @@ DATA is displayed to the user and should state the reason for skipping."
(defun ert--special-operator-p (thing)
"Return non-nil if THING is a symbol naming a special operator."
(and (symbolp thing)
- (let ((definition (indirect-function thing t)))
+ (let ((definition (indirect-function thing)))
(and (subrp definition)
(eql (cdr (subr-arity definition)) 'unevalled)))))
@@ -2537,7 +2537,7 @@ To be used in the ERT results buffer."
(add-to-list 'minor-mode-alist '(ert--current-run-stats
(:eval
(ert--tests-running-mode-line-indicator))))
-(add-to-list 'emacs-lisp-mode-hook 'ert--activate-font-lock-keywords)
+(add-hook 'emacs-lisp-mode-hook #'ert--activate-font-lock-keywords)
(defun ert--unload-function ()
"Unload function to undo the side-effects of loading ert.el."
@@ -2548,7 +2548,7 @@ To be used in the ERT results buffer."
nil)
(defvar ert-unload-hook '())
-(add-hook 'ert-unload-hook 'ert--unload-function)
+(add-hook 'ert-unload-hook #'ert--unload-function)
(provide 'ert)
diff --git a/lisp/emacs-lisp/lisp.el b/lisp/emacs-lisp/lisp.el
index 67d14872b3a..d401b316719 100644
--- a/lisp/emacs-lisp/lisp.el
+++ b/lisp/emacs-lisp/lisp.el
@@ -736,22 +736,19 @@ character."
)
(call-interactively 'minibuffer-complete)))
-(defun lisp-complete-symbol (&optional predicate)
+(defun lisp-complete-symbol (&optional _predicate)
"Perform completion on Lisp symbol preceding point.
Compare that symbol against the known Lisp symbols.
If no characters can be completed, display a list of possible completions.
Repeating the command at that point scrolls the list.
-When called from a program, optional arg PREDICATE is a predicate
-determining which symbols are considered, e.g. `commandp'.
-If PREDICATE is nil, the context determines which symbols are
-considered. If the symbol starts just after an open-parenthesis, only
-symbols with function definitions are considered. Otherwise, all
-symbols with function definitions, values or properties are
-considered."
+The context determines which symbols are considered. If the
+symbol starts just after an open-parenthesis, only symbols with
+function definitions are considered. Otherwise, all symbols with
+function definitions, values or properties are considered."
(declare (obsolete completion-at-point "24.4"))
(interactive)
- (let* ((data (lisp-completion-at-point predicate))
+ (let* ((data (lisp-completion-at-point))
(plist (nthcdr 3 data)))
(if (null data)
(minibuffer-message "Nothing to complete")
diff --git a/lisp/emacs-lisp/package-x.el b/lisp/emacs-lisp/package-x.el
index 6955ce8f5a6..81d0b834722 100644
--- a/lisp/emacs-lisp/package-x.el
+++ b/lisp/emacs-lisp/package-x.el
@@ -156,6 +156,7 @@ DESCRIPTION is the text of the news item."
archive-url))
(declare-function lm-commentary "lisp-mnt" (&optional file))
+(defvar tar-data-buffer)
(defun package-upload-buffer-internal (pkg-desc extension &optional archive-url)
"Upload a package whose contents are in the current buffer.
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el
index f770acd557e..55fa962719d 100644
--- a/lisp/emacs-lisp/package.el
+++ b/lisp/emacs-lisp/package.el
@@ -185,7 +185,6 @@ and before `after-init-hook'. Activation is not done if
Even if the value is nil, you can type \\[package-initialize] to
activate the package system at any time."
:type 'boolean
- :group 'package
:version "24.1")
(defcustom package-load-list '(all)
@@ -203,7 +202,6 @@ If VERSION is a string, only that version is ever loaded.
If VERSION is nil, the package is not loaded (it is \"disabled\")."
:type '(repeat symbol)
:risky t
- :group 'package
:version "24.1")
(defcustom package-archives '(("gnu" . "http://elpa.gnu.org/packages/"))
@@ -222,7 +220,6 @@ a package can run arbitrary code."
:type '(alist :key-type (string :tag "Archive name")
:value-type (string :tag "URL or directory name"))
:risky t
- :group 'package
:version "24.1")
(defcustom package-menu-hide-low-priority 'archive
@@ -246,7 +243,6 @@ nil, so it can be toggled with \\<package-menu-mode-map> \\[package-menu-hide-ob
(const :tag "Hide per package-archive-priorities"
archive)
(const :tag "Hide per archive and version number" t))
- :group 'package
:version "25.1")
(defcustom package-archive-priorities nil
@@ -265,7 +261,6 @@ See also `package-menu-hide-low-priority'."
:type '(alist :key-type (string :tag "Archive name")
:value-type (integer :tag "Priority (default is 0)"))
:risky t
- :group 'package
:version "25.1")
(defcustom package-pinned-packages nil
@@ -289,7 +284,6 @@ the package will be unavailable."
;; via an entry (PACKAGE . NON-EXISTING). Which could be an issue
;; if PACKAGE has a known vulnerability that is fixed in newer versions.
:risky t
- :group 'package
:version "24.4")
(defcustom package-user-dir (locate-user-emacs-file "elpa")
@@ -299,7 +293,6 @@ Apart from this directory, Emacs also looks for system-wide
packages in `package-directory-list'."
:type 'directory
:risky t
- :group 'package
:version "24.1")
(defcustom package-directory-list
@@ -317,7 +310,6 @@ These directories contain packages intended for system-wide; in
contrast, `package-user-dir' contains packages for personal use."
:type '(repeat directory)
:risky t
- :group 'package
:version "24.1")
(defvar epg-gpg-program)
@@ -335,14 +327,12 @@ contents of the archive."
(const allow-unsigned :tag "Allow unsigned")
(const t :tag "Check always"))
:risky t
- :group 'package
:version "24.4")
(defcustom package-unsigned-archives nil
"List of archives where we do not check for package signatures."
:type '(repeat (string :tag "Archive name"))
:risky t
- :group 'package
:version "24.4")
(defcustom package-selected-packages nil
@@ -356,9 +346,15 @@ by running `package-user-selected-packages-install'.
To check if a package is contained in this list here, use
`package--user-selected-p', as it may populate the variable with
a sane initial value."
- :group 'package
:type '(repeat symbol))
+(defcustom package-menu-async t
+ "If non-nil, package-menu will use async operations when possible.
+This includes refreshing archive contents as well as installing
+packages."
+ :type 'boolean
+ :version "25.1")
+
;;; `package-desc' object definition
;; This is the struct used internally to represent packages.
@@ -897,7 +893,7 @@ untar into a directory named DIR; otherwise, signal an error."
;;(ignore-name (concat name "-pkg.el"))
(generated-autoload-file (expand-file-name auto-name pkg-dir))
;; Silence `autoload-generate-file-autoloads'.
- (noninteractive package--silence)
+ (noninteractive inhibit-message)
(backup-inhibited t)
(version-control 'never))
(package-autoload-ensure-default-file generated-autoload-file)
@@ -917,10 +913,13 @@ untar into a directory named DIR; otherwise, signal an error."
)
;;;; Compilation
+(defvar warning-minimum-level)
(defun package--compile (pkg-desc)
"Byte-compile installed package PKG-DESC."
- (package-activate-1 pkg-desc)
- (byte-recompile-directory (package-desc-dir pkg-desc) 0 t))
+ (let ((warning-minimum-level :error)
+ (save-silently inhibit-message))
+ (package-activate-1 pkg-desc)
+ (byte-recompile-directory (package-desc-dir pkg-desc) 0 t)))
;;;; Inferring package from current buffer
(defun package-read-from-string (str)
@@ -958,7 +957,7 @@ is wrapped around any parts requiring it."
deps))))
(declare-function lm-header "lisp-mnt" (header))
-(declare-function lm-homepage "lisp-mnt" ())
+(declare-function lm-homepage "lisp-mnt" (&optional file))
(defun package-buffer-info ()
"Return a `package-desc' describing the package in the current buffer.
@@ -1080,7 +1079,7 @@ The return result is a `package-desc'."
(declare-function epg-verify-string "epg" (context signature
&optional signed-text))
(declare-function epg-context-result-for "epg" (context name))
-(declare-function epg-signature-status "epg" (signature))
+(declare-function epg-signature-status "epg" (signature) t)
(declare-function epg-signature-to-string "epg" (signature))
(defun package--display-verify-error (context sig-file)
@@ -1137,7 +1136,8 @@ arguments see `package--with-work-buffer'."
(signal (cdar status) (cddr status)))
(goto-char (point-min))
(unless (search-forward "\n\n" nil 'noerror)
- (error "Invalid url response"))
+ (error "Invalid url response in buffer %s"
+ (current-buffer)))
(delete-region (point-min) (point))
,@body)
(kill-buffer (current-buffer)))
@@ -1346,6 +1346,9 @@ If successful, set `package-archive-contents'."
;; available on disk.
(defvar package--initialized nil)
+(defvar package--init-file-ensured nil
+ "Whether we know the init file has package-initialize.")
+
;;;###autoload
(defun package-initialize (&optional no-activate)
"Load Emacs Lisp packages, and activate them.
@@ -1355,7 +1358,11 @@ If `user-init-file' does not mention `(package-initialize)', add
it to the file."
(interactive)
(setq package-alist nil)
- (package--ensure-init-file)
+ (if (equal user-init-file load-file-name)
+ ;; If `package-initialize' is being called as part of loading
+ ;; the init file, it's obvious we don't need to ensure-init.
+ (setq package--init-file-ensured t)
+ (package--ensure-init-file))
(package-load-all-descriptors)
(package-read-all-archive-contents)
(unless no-activate
@@ -1378,16 +1385,6 @@ it to the file."
(declare-function epg-configuration "epg-config" ())
(declare-function epg-import-keys-from-file "epg" (context keys))
-(defvar package--silence nil)
-
-(defun package--message (format &rest args)
- "Like `message', except sometimes don't print to minibuffer.
-If the variable `package--silence' is non-nil, the message is not
-displayed on the minibuffer."
- (apply #'message format args)
- (when package--silence
- (message nil)))
-
;;;###autoload
(defun package-import-keyring (&optional file)
"Import keys from FILE."
@@ -1398,9 +1395,9 @@ displayed on the minibuffer."
(with-file-modes 448
(make-directory homedir t))
(setf (epg-context-home-directory context) homedir)
- (package--message "Importing %s..." (file-name-nondirectory file))
+ (message "Importing %s..." (file-name-nondirectory file))
(epg-import-keys-from-file context file)
- (package--message "Importing %s...done" (file-name-nondirectory file))))
+ (message "Importing %s...done" (file-name-nondirectory file))))
(defvar package--post-download-archives-hook nil
"Hook run after the archive contents are downloaded.
@@ -1466,9 +1463,9 @@ This populates `package-archive-contents'. If ASYNC is non-nil,
perform the downloads asynchronously."
;; The downloaded archive contents will be read as part of
;; `package--update-downloads-in-progress'.
- (setq package--downloads-in-progress
- (append package-archives
- package--downloads-in-progress))
+ (dolist (archive package-archives)
+ (cl-pushnew archive package--downloads-in-progress
+ :test #'equal))
(dolist (archive package-archives)
(condition-case-unless-debug nil
(package--download-one-archive
@@ -1492,14 +1489,14 @@ downloads in the background."
(make-directory package-user-dir t))
(let ((default-keyring (expand-file-name "package-keyring.gpg"
data-directory))
- (package--silence async))
+ (inhibit-message async))
(when (and package-check-signature (file-exists-p default-keyring))
(condition-case-unless-debug error
(progn
(epg-check-configuration (epg-configuration))
(package-import-keyring default-keyring))
- (error (message "Cannot import default keyring: %S" (cdr error)))))
- (package--download-and-read-archives async)))
+ (error (message "Cannot import default keyring: %S" (cdr error))))))
+ (package--download-and-read-archives async))
;;; Dependency Management
@@ -1541,7 +1538,7 @@ SEEN is used internally to detect infinite recursion."
;; we re-add it (along with its dependencies) at an earlier place
;; below (bug#16994).
(if (memq already seen) ;Avoid inf-loop on dependency cycles.
- (package--message "Dependency cycle going through %S"
+ (message "Dependency cycle going through %S"
(package-desc-full-name already))
(setq packages (delq already packages))
(setq already nil))
@@ -1607,7 +1604,7 @@ Used to populate `package-selected-packages'."
(defun package--save-selected-packages (value)
"Set and save `package-selected-packages' to VALUE."
- (let ((save-silently package--silence))
+ (let ((save-silently inhibit-message))
(customize-save-variable
'package-selected-packages
(setq package-selected-packages value))))
@@ -1728,7 +1725,8 @@ operation is done."
package-unsigned-archives))
;; If we don't care about the signature, unpack and we're
;; done.
- (progn (let ((save-silently async))
+ (progn (let ((save-silently async)
+ (inhibit-message async))
(package-unpack pkg-desc))
(funcall callback))
;; If we care, check it and *then* write the file.
@@ -1744,7 +1742,8 @@ operation is done."
(package-desc-name pkg-desc)))
;; Signature checked, unpack now.
(with-temp-buffer (insert content)
- (let ((save-silently async))
+ (let ((save-silently async)
+ (inhibit-message async))
(package-unpack pkg-desc)))
;; Here the package has been installed successfully, mark it as
;; signed if appropriate.
@@ -1804,9 +1803,15 @@ using `package-compute-transaction'."
(callback (funcall callback))))
(defun package--ensure-init-file ()
- "Ensure that the user's init file calls `package-initialize'."
+ "Ensure that the user's init file has `package-initialize'.
+`package-initialize' doesn't have to be called, as long as it is
+present somewhere in the file, even as a comment. If it is not,
+add a call to it along with some explanatory comments."
;; Don't mess with the init-file from "emacs -Q".
- (when user-init-file
+ (when (and (stringp user-init-file)
+ (not package--init-file-ensured)
+ (file-readable-p user-init-file)
+ (file-writable-p user-init-file))
(let* ((buffer (find-buffer-visiting user-init-file))
(contains-init
(if buffer
@@ -1816,6 +1821,7 @@ using `package-compute-transaction'."
(widen)
(goto-char (point-min))
(search-forward "(package-initialize)" nil 'noerror))))
+ ;; Don't visit the file if we don't have to.
(with-temp-buffer
(insert-file-contents user-init-file)
(goto-char (point-min))
@@ -1828,7 +1834,11 @@ using `package-compute-transaction'."
(save-restriction
(widen)
(goto-char (point-min))
+ (while (and (looking-at-p "[[:blank:]]*\\(;\\|$\\)")
+ (not (eobp)))
+ (forward-line 1))
(insert
+ "\n"
";; Added by Package.el. This must come before configurations of\n"
";; installed packages. Don't delete this line. If you don't want it,\n"
";; just comment it out by adding a semicolon to the start of the line.\n"
@@ -1839,7 +1849,8 @@ using `package-compute-transaction'."
(let ((file-precious-flag t))
(save-buffer))
(unless buffer
- (kill-buffer (current-buffer))))))))))
+ (kill-buffer (current-buffer)))))))))
+ (setq package--init-file-ensured t))
;;;###autoload
(defun package-install (pkg &optional dont-select async callback)
@@ -1885,7 +1896,8 @@ to install it but still mark it as selected."
(package-desc-reqs pkg)))
(package-compute-transaction () (list (list pkg))))))
(package-download-transaction transaction async callback)
- (package--message "`%s' is already installed" (package-desc-full-name pkg))))
+ (message "`%s' is already installed" (package-desc-full-name pkg))
+ (funcall callback)))
(defun package-strip-rcs-id (str)
"Strip RCS version ID from the version string STR.
@@ -1953,7 +1965,7 @@ The file can either be a tar file or an Emacs Lisp file."
(package-install-from-buffer)))
;;;###autoload
-(defun package-install-user-selected-packages ()
+(defun package-install-selected-packages ()
"Ensure packages in `package-selected-packages' are installed.
If some packages are not installed propose to install them."
(interactive)
@@ -2027,7 +2039,7 @@ If NOSAVE is non-nil, the package is not removed from
(delete pkg-desc pkgs)
(unless (cdr pkgs)
(setq package-alist (delq pkgs package-alist))))
- (package--message "Package `%s' deleted." (package-desc-full-name pkg-desc))))))
+ (message "Package `%s' deleted." (package-desc-full-name pkg-desc))))))
;;;###autoload
(defun package-reinstall (pkg)
@@ -2457,16 +2469,17 @@ of these dependencies, similar to the list returned by
((version-list-= version hv) "held")
((version-list-< version hv) "obsolete")
(t "disabled"))))
- ((package-built-in-p name version) "obsolete")
- ((package--incompatible-p pkg-desc) "incompat")
(dir ;One of the installed packages.
(cond
- ((not (file-exists-p (package-desc-dir pkg-desc))) "deleted")
+ ((not (file-exists-p dir)) "deleted")
+ ;; Not inside `package-user-dir'.
+ ((not (file-in-directory-p dir package-user-dir)) "external")
((eq pkg-desc (cadr (assq name package-alist)))
(if (not signed) "unsigned"
(if (package--user-selected-p name)
"installed" "dependency")))
(t "obsolete")))
+ ((package--incompatible-p pkg-desc) "incompat")
(t
(let* ((ins (cadr (assq name package-alist)))
(ins-v (if ins (package-desc-version ins))))
@@ -2497,29 +2510,43 @@ Installed obsolete packages are always displayed.")
(defun package--remove-hidden (pkg-list)
"Filter PKG-LIST according to `package-archive-priorities'.
-PKG-LIST must be a list of package-desc objects sorted by
-decreasing version number.
+PKG-LIST must be a list of package-desc objects, all with the
+same name, sorted by decreasing `package-desc-priority-version'.
Return a list of packages tied for the highest priority according
to their archives."
(when pkg-list
- ;; The first is a variable toggled with
- ;; `package-menu-hide-obsolete', the second is a static user
- ;; option that defines *what* we hide.
- (if (and package-menu--hide-obsolete
- package-menu-hide-low-priority)
- (let ((max-priority (package-desc-priority (car pkg-list)))
- (out (list (pop pkg-list))))
- (dolist (p pkg-list (nreverse out))
- (let ((priority (package-desc-priority p)))
- (cond
- ((> priority max-priority)
- (setq max-priority priority)
- (setq out (list p)))
- ;; This assumes pkg-list is sorted by version number.
- ((and (= priority max-priority)
- (eq package-menu-hide-low-priority 'archive))
- (push p out))))))
- pkg-list)))
+ ;; Variable toggled with `package-menu-hide-obsolete'.
+ (if (not package-menu--hide-obsolete)
+ pkg-list
+ (let ((installed (cadr (assq (package-desc-name (car pkg-list))
+ package-alist))))
+ (when installed
+ (setq pkg-list
+ (let ((ins-version (package-desc-version installed)))
+ (cl-remove-if (lambda (p) (version-list-< (package-desc-version p)
+ ins-version))
+ pkg-list))))
+ (let ((filtered-by-priority
+ (cond
+ ((not package-menu-hide-low-priority)
+ pkg-list)
+ ((eq package-menu-hide-low-priority 'archive)
+ (let* ((max-priority most-negative-fixnum)
+ (out))
+ (while pkg-list
+ (let ((p (pop pkg-list)))
+ (if (>= (package-desc-priority p) max-priority)
+ (push p out)
+ (setq pkg-list nil))))
+ (nreverse out)))
+ (pkg-list
+ (list (car pkg-list))))))
+ (if (not installed)
+ filtered-by-priority
+ (let ((ins-version (package-desc-version installed)))
+ (cl-remove-if (lambda (p) (version-list-= (package-desc-version p)
+ ins-version))
+ filtered-by-priority))))))))
(defun package-menu--refresh (&optional packages keywords)
"Re-populate the `tabulated-list-entries'.
@@ -2527,40 +2554,38 @@ PACKAGES should be nil or t, which means to display all known packages.
KEYWORDS should be nil or a list of keywords."
;; Construct list of (PKG-DESC . STATUS).
(unless packages (setq packages t))
- (let (info-list name)
+ (let (info-list)
;; Installed packages:
(dolist (elt package-alist)
- (setq name (car elt))
- (when (or (eq packages t) (memq name packages))
- (dolist (pkg (cdr elt))
- (when (package--has-keyword-p pkg keywords)
- (package--push pkg (package-desc-status pkg) info-list)))))
+ (let ((name (car elt)))
+ (when (or (eq packages t) (memq name packages))
+ (dolist (pkg (cdr elt))
+ (when (package--has-keyword-p pkg keywords)
+ (push pkg info-list))))))
;; Built-in packages:
(dolist (elt package--builtins)
- (setq name (car elt))
- (when (and (not (eq name 'emacs)) ; Hide the `emacs' package.
- (package--has-keyword-p (package--from-builtin elt) keywords)
- (or package-list-unversioned
- (package--bi-desc-version (cdr elt)))
- (or (eq packages t) (memq name packages)))
- (package--push (package--from-builtin elt) "built-in" info-list)))
+ (let ((pkg (package--from-builtin elt))
+ (name (car elt)))
+ (when (not (eq name 'emacs)) ; Hide the `emacs' package.
+ (when (and (package--has-keyword-p pkg keywords)
+ (or package-list-unversioned
+ (package--bi-desc-version (cdr elt)))
+ (or (eq packages t) (memq name packages)))
+ (push pkg info-list)))))
;; Available and disabled packages:
(dolist (elt package-archive-contents)
- (setq name (car elt))
- (when (or (eq packages t) (memq name packages))
- (dolist (pkg (package--remove-hidden (cdr elt)))
- ;; Hide available obsolete packages.
- (when (and (not (and package-menu--hide-obsolete
- (package-installed-p (package-desc-name pkg)
- (package-desc-version pkg))))
- (package--has-keyword-p pkg keywords))
- (package--push pkg (package-desc-status pkg) info-list)))))
+ (let ((name (car elt)))
+ (when (or (eq packages t) (memq name packages))
+ ;; Hide available-obsolete or low-priority packages.
+ (dolist (pkg (package--remove-hidden (cdr elt)))
+ (when (package--has-keyword-p pkg keywords)
+ (push pkg info-list))))))
;; Print the result.
(setq tabulated-list-entries
- (mapcar #'package-menu--print-info info-list))))
+ (mapcar #'package-menu--print-info-simple info-list))))
(defun package-all-keywords ()
"Collect all package keywords"
@@ -2642,10 +2667,18 @@ shown."
"Return a package entry suitable for `tabulated-list-entries'.
PKG has the form (PKG-DESC . STATUS).
Return (PKG-DESC [NAME VERSION STATUS DOC])."
- (let* ((pkg-desc (car pkg))
- (status (cdr pkg))
+ (package-menu--print-info-simple (car pkg)))
+(make-obsolete 'package-menu--print-info
+ 'package-menu--print-info-simple "25.1")
+
+(defun package-menu--print-info-simple (pkg)
+ "Return a package entry suitable for `tabulated-list-entries'.
+PKG is a package-desc object.
+Return (PKG-DESC [NAME VERSION STATUS DOC])."
+ (let* ((status (package-desc-status pkg))
(face (pcase status
(`"built-in" 'font-lock-builtin-face)
+ (`"external" 'font-lock-builtin-face)
(`"available" 'default)
(`"avail-obso" 'font-lock-comment-face)
(`"new" 'bold)
@@ -2656,21 +2689,23 @@ Return (PKG-DESC [NAME VERSION STATUS DOC])."
(`"unsigned" 'font-lock-warning-face)
(`"incompat" 'font-lock-comment-face)
(_ 'font-lock-warning-face)))) ; obsolete.
- (list pkg-desc
- `[,(list (symbol-name (package-desc-name pkg-desc))
- 'face 'link
- 'follow-link t
- 'package-desc pkg-desc
- 'action 'package-menu-describe-package)
+ (list pkg
+ `[(,(symbol-name (package-desc-name pkg))
+ face link
+ follow-link t
+ package-desc ,pkg
+ action package-menu-describe-package)
,(propertize (package-version-join
- (package-desc-version pkg-desc))
+ (package-desc-version pkg))
'font-lock-face face)
,(propertize status 'font-lock-face face)
,@(if (cdr package-archives)
- (list (propertize (or (package-desc-archive pkg-desc) "")
+ (list (propertize (or (package-desc-archive pkg) "")
'font-lock-face face)))
- ,(propertize (package-desc-summary pkg-desc)
- 'font-lock-face face)])))
+ ,(package-desc-summary pkg)])))
+
+(defvar package-menu--old-archive-contents nil
+ "`package-archive-contents' before the latest refresh.")
(defun package-menu-refresh ()
"Download the Emacs Lisp package archive.
@@ -2887,19 +2922,19 @@ asynchronously."
(package-install
pkg dont-mark async
(lambda () (package-menu--perform-transaction rest delete-list async))))
- ;; Once there are no more packages to install, proceed to
- ;; deletion.
- (let ((package--silence async))
+ (let ((inhibit-message async))
+ ;; Once there are no more packages to install, proceed to
+ ;; deletion.
(dolist (elt (package--sort-by-dependence delete-list))
(condition-case-unless-debug err
(package-delete elt)
- (error (message (cadr err)))))
- (when package-selected-packages
- (when-let ((removable (package--removable-packages)))
- (package--message "These %d packages are no longer needed, type `M-x package-autoremove' to remove them (%s)"
- (length removable)
- (mapconcat #'symbol-name removable ", ")))))
+ (error (message (cadr err))))))
(message "Transaction done")
+ (when package-selected-packages
+ (when-let ((removable (package--removable-packages)))
+ (message "These %d packages are no longer needed, type `M-x package-autoremove' to remove them (%s)"
+ (length removable)
+ (mapconcat #'symbol-name removable ", "))))
(package-menu--post-refresh)))
(defun package-menu-execute (&optional noquery)
@@ -2959,6 +2994,8 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
((string= sB "unsigned") nil)
((string= sA "held") t)
((string= sB "held") nil)
+ ((string= sA "external") t)
+ ((string= sB "external") nil)
((string= sA "built-in") t)
((string= sB "built-in") nil)
((string= sA "obsolete") t)
@@ -2982,9 +3019,6 @@ Optional argument NOQUERY non-nil means do not ask the user to confirm."
(string< (or (package-desc-archive (car A)) "")
(or (package-desc-archive (car B)) "")))
-(defvar package-menu--old-archive-contents nil
- "`package-archive-contents' before the latest refresh.")
-
(defun package-menu--populate-new-package-list ()
"Decide which packages are new in `package-archives-contents'.
Store this list in `package-menu--new-package-list'."
@@ -3015,14 +3049,6 @@ after `package-menu--perform-transaction'."
(revert-buffer nil 'noconfirm))))
(package-menu--find-and-notify-upgrades))
-(defcustom package-menu-async t
- "If non-nil, package-menu will use async operations when possible.
-This includes refreshing archive contents as well as installing
-packages."
- :type 'boolean
- :version "25.1"
- :group 'package)
-
;;;###autoload
(defun list-packages (&optional no-fetch)
"Display a list of packages.
diff --git a/lisp/emacs-lisp/pcase.el b/lisp/emacs-lisp/pcase.el
index 978c3f0dd30..5a81bb20e57 100644
--- a/lisp/emacs-lisp/pcase.el
+++ b/lisp/emacs-lisp/pcase.el
@@ -91,6 +91,10 @@
(def-edebug-spec pcase-MACRO pcase--edebug-match-macro)
+;; Only called from edebug.
+(declare-function get-edebug-spec "edebug" (symbol))
+(declare-function edebug-match "edebug" (cursor specs))
+
(defun pcase--edebug-match-macro (cursor)
(let (specs)
(mapatoms
@@ -158,12 +162,18 @@ Currently, the following patterns are provided this way:"
;; (puthash (car cases) `(,exp ,cases ,@expansion) pcase--memoize-2)
expansion))))
+(declare-function help-fns--signature "help-fns"
+ (function doc real-def real-function))
+
;; FIXME: Obviously, this will collide with nadvice's use of
;; function-documentation if we happen to advise `pcase'.
(put 'pcase 'function-documentation '(pcase--make-docstring))
(defun pcase--make-docstring ()
(let* ((main (documentation (symbol-function 'pcase) 'raw))
(ud (help-split-fundoc main 'pcase)))
+ ;; So that eg emacs -Q -l cl-lib --eval "(documentation 'pcase)" works,
+ ;; where cl-lib is anything using pcase-defmacro.
+ (require 'help-fns)
(with-temp-buffer
(insert (or (cdr ud) main))
(mapatoms
diff --git a/lisp/emacs-lisp/seq.el b/lisp/emacs-lisp/seq.el
index 0050ff0a303..0aa0f095969 100644
--- a/lisp/emacs-lisp/seq.el
+++ b/lisp/emacs-lisp/seq.el
@@ -4,7 +4,7 @@
;; Author: Nicolas Petton <nicolas@petton.fr>
;; Keywords: sequences
-;; Version: 1.4
+;; Version: 1.7
;; Package: seq
;; Maintainer: emacs-devel@gnu.org
@@ -63,9 +63,40 @@ Evaluate BODY with VAR bound to each element of SEQ, in turn.
(prog1 (seq-elt ,seq ,index)
(setq ,index (+ ,index 1)))
(pop ,index))))
- ,@body))
- ;; FIXME: Do we really want to support this?
- ,@(cddr spec))))
+ ,@body)))))
+
+(if (fboundp 'pcase-defmacro)
+ ;; Implementation of `seq-let' based on a `pcase'
+ ;; pattern. Requires Emacs>=25.1.
+ (progn
+ (pcase-defmacro seq (&rest args)
+ "pcase pattern matching sequence elements.
+Matches if the object is a sequence (list, string or vector), and
+binds each element of ARGS to the corresponding element of the
+sequence."
+ `(and (pred seq-p)
+ ,@(seq--make-pcase-bindings args)))
+
+ (defmacro seq-let (args seq &rest body)
+ "Bind the variables in ARGS to the elements of SEQ then evaluate BODY.
+
+ARGS can also include the `&rest' marker followed by a variable
+name to be bound to the rest of SEQ."
+ (declare (indent 2) (debug t))
+ `(pcase-let ((,(seq--make-pcase-patterns args) ,seq))
+ ,@body)))
+
+ ;; Implementation of `seq-let' compatible with Emacs<25.1.
+ (defmacro seq-let (args seq &rest body)
+ "Bind the variables in ARGS to the elements of SEQ then evaluate BODY.
+
+ARGS can also include the `&rest' marker followed by a variable
+name to be bound to the rest of SEQ."
+ (declare (indent 2) (debug t))
+ (let ((seq-var (make-symbol "seq")))
+ `(let* ((,seq-var ,seq)
+ ,@(seq--make-bindings args seq-var))
+ ,@body))))
(defun seq-drop (seq n)
"Return a subsequence of SEQ without its first N elements.
@@ -335,10 +366,70 @@ This is an optimization for lists in `seq-take-while'."
(setq n (+ 1 n)))
n))
+(defun seq--make-pcase-bindings (args)
+ "Return a list of bindings of the variables in ARGS to the elements of a sequence."
+ (let ((bindings '())
+ (index 0)
+ (rest-marker nil))
+ (seq-doseq (name args)
+ (unless rest-marker
+ (pcase name
+ (`&rest
+ (progn (push `(app (pcase--flip seq-drop ,index)
+ ,(seq--elt-safe args (1+ index)))
+ bindings)
+ (setq rest-marker t)))
+ (t
+ (push `(app (pcase--flip seq--elt-safe ,index) ,name) bindings))))
+ (setq index (1+ index)))
+ bindings))
+
+(defun seq--make-pcase-patterns (args)
+ "Return a list of `(seq ...)' pcase patterns from the argument list ARGS."
+ (cons 'seq
+ (seq-map (lambda (elt)
+ (if (seq-p elt)
+ (seq--make-pcase-patterns elt)
+ elt))
+ args)))
+
+;; Helper function for the Backward-compatible version of `seq-let'
+;; for Emacs<25.1.
+(defun seq--make-bindings (args seq &optional bindings)
+ "Return a list of bindings of the variables in ARGS to the elements of a sequence.
+if BINDINGS is non-nil, append new bindings to it, and return
+BINDINGS."
+ (let ((index 0)
+ (rest-marker nil))
+ (seq-doseq (name args)
+ (unless rest-marker
+ (pcase name
+ ((pred seq-p)
+ (setq bindings (seq--make-bindings (seq--elt-safe args index)
+ `(seq--elt-safe ,seq ,index)
+ bindings)))
+ (`&rest
+ (progn (push `(,(seq--elt-safe args (1+ index))
+ (seq-drop ,seq ,index))
+ bindings)
+ (setq rest-marker t)))
+ (t
+ (push `(,name (seq--elt-safe ,seq ,index)) bindings))))
+ (setq index (1+ index)))
+ bindings))
+
+(defun seq--elt-safe (seq n)
+ "Return element of SEQ at the index N.
+If no element is found, return nil."
+ (when (or (listp seq)
+ (and (sequencep seq)
+ (> (seq-length seq) n)))
+ (seq-elt seq n)))
+
(defun seq--activate-font-lock-keywords ()
"Activate font-lock keywords for some symbols defined in seq."
(font-lock-add-keywords 'emacs-lisp-mode
- '("\\<seq-doseq\\>")))
+ '("\\<seq-doseq\\>" "\\<seq-let\\>")))
(defalias 'seq-copy #'copy-sequence)
(defalias 'seq-elt #'elt)
@@ -346,11 +437,12 @@ This is an optimization for lists in `seq-take-while'."
(defalias 'seq-do #'mapc)
(defalias 'seq-each #'seq-do)
(defalias 'seq-map #'mapcar)
+(defalias 'seq-p #'sequencep)
(unless (fboundp 'elisp--font-lock-flush-elisp-buffers)
;; In Emacs≥25, (via elisp--font-lock-flush-elisp-buffers and a few others)
;; we automatically highlight macros.
- (add-to-list 'emacs-lisp-mode-hook #'seq--activate-font-lock-keywords))
+ (add-hook 'emacs-lisp-mode-hook #'seq--activate-font-lock-keywords))
(provide 'seq)
;;; seq.el ends here
diff --git a/lisp/emacs-lisp/subr-x.el b/lisp/emacs-lisp/subr-x.el
index 78a6dc98456..bd178faa4af 100644
--- a/lisp/emacs-lisp/subr-x.el
+++ b/lisp/emacs-lisp/subr-x.el
@@ -120,7 +120,8 @@ Argument BINDINGS is a list of tuples whose car is a symbol to be
bound and (optionally) used in THEN, and its cadr is a sexp to be
evalled to set symbol's value. In the special case you only want
to bind a single value, BINDINGS can just be a plain tuple."
- (declare (indent 2) (debug ((&rest (symbolp form)) form body)))
+ (declare (indent 2)
+ (debug ([&or (&rest (symbolp form)) (symbolp form)] form body)))
(when (and (<= (length bindings) 2)
(not (listp (car bindings))))
;; Adjust the single binding case
diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el
index 15a0914cb17..5d10b55d14c 100644
--- a/lisp/emacs-lisp/tabulated-list.el
+++ b/lisp/emacs-lisp/tabulated-list.el
@@ -179,7 +179,9 @@ If ADVANCE is non-nil, move forward by one line afterwards."
table)
"The `glyphless-char-display' table in Tabulated List buffers.")
-(defvar tabulated-list--header-string nil)
+(defvar tabulated-list--header-string nil
+ "Holds the header if `tabulated-list-use-header-line' is nil.
+Populated by `tabulated-list-init-header'.")
(defvar tabulated-list--header-overlay nil)
(defun tabulated-list-init-header ()
@@ -243,15 +245,17 @@ If ADVANCE is non-nil, move forward by one line afterwards."
(setq-local tabulated-list--header-string cols))))
(defun tabulated-list-print-fake-header ()
- "Insert a fake Tabulated List \"header line\" at the start of the buffer."
- (goto-char (point-min))
- (let ((inhibit-read-only t))
- (insert tabulated-list--header-string "\n")
- (if tabulated-list--header-overlay
- (move-overlay tabulated-list--header-overlay (point-min) (point))
- (setq-local tabulated-list--header-overlay
- (make-overlay (point-min) (point))))
- (overlay-put tabulated-list--header-overlay 'face 'underline)))
+ "Insert a fake Tabulated List \"header line\" at the start of the buffer.
+Do nothing if `tabulated-list--header-string' is nil."
+ (when tabulated-list--header-string
+ (goto-char (point-min))
+ (let ((inhibit-read-only t))
+ (insert tabulated-list--header-string "\n")
+ (if tabulated-list--header-overlay
+ (move-overlay tabulated-list--header-overlay (point-min) (point))
+ (setq-local tabulated-list--header-overlay
+ (make-overlay (point-min) (point))))
+ (overlay-put tabulated-list--header-overlay 'face 'underline))))
(defun tabulated-list-revert (&rest ignored)
"The `revert-buffer-function' for `tabulated-list-mode'.
@@ -341,8 +345,10 @@ of column descriptors."
(dotimes (n ncols)
(setq x (tabulated-list-print-col n (aref cols n) x)))
(insert ?\n)
- (put-text-property beg (point) 'tabulated-list-id id)
- (put-text-property beg (point) 'tabulated-list-entry cols)))
+ ;; Ever so slightly faster than calling `put-text-property' twice.
+ (add-text-properties
+ beg (point)
+ `(tabulated-list-id ,id tabulated-list-entry ,cols))))
(defun tabulated-list-print-col (n col-desc x)
"Insert a specified Tabulated List entry at point.
diff --git a/lisp/emacs-lisp/testcover.el b/lisp/emacs-lisp/testcover.el
index a91704a11bf..110c63f777a 100644
--- a/lisp/emacs-lisp/testcover.el
+++ b/lisp/emacs-lisp/testcover.el
@@ -1,4 +1,4 @@
-;;;; testcover.el -- Visual code-coverage tool
+;;;; testcover.el -- Visual code-coverage tool -*- lexical-binding:t -*-
;; Copyright (C) 2002-2015 Free Software Foundation, Inc.
@@ -191,8 +191,9 @@ problems with type-ahead or post-command-hook, etc. If BYTE-COMPILE is
non-nil, byte-compiles each function after instrumenting."
(interactive "fStart covering file: ")
(let ((buf (find-file filename))
- (load-read-function 'testcover-read)
- (edebug-all-defs t))
+ (load-read-function load-read-function))
+ (add-function :around load-read-function
+ #'testcover--read)
(setq edebug-form-data nil
testcover-module-constants nil
testcover-module-1value-functions nil)
@@ -207,22 +208,26 @@ non-nil, byte-compiles each function after instrumenting."
(defun testcover-this-defun ()
"Start coverage on function under point."
(interactive)
- (let* ((edebug-all-defs t)
- (x (symbol-function (eval-defun nil))))
+ (let ((x (let ((edebug-all-defs t))
+ (symbol-function (eval-defun nil)))))
(testcover-reinstrument x)
x))
-(defun testcover-read (&optional stream)
+(defun testcover--read (orig &optional stream)
"Read a form using edebug, changing edebug callbacks to testcover callbacks."
- (let ((x (edebug-read stream)))
- (testcover-reinstrument x)
- x))
+ (or stream (setq stream standard-input))
+ (if (eq stream (current-buffer))
+ (let ((x (let ((edebug-all-defs t))
+ (edebug-read-and-maybe-wrap-form))))
+ (testcover-reinstrument x)
+ x)
+ (funcall (or orig #'read) stream)))
(defun testcover-reinstrument (form)
"Reinstruments FORM to use testcover instead of edebug. This
function modifies the list that FORM points to. Result is nil if
FORM should return multiple values, t if should always return same
-value, 'maybe if either is acceptable."
+value, `maybe' if either is acceptable."
(let ((fun (car-safe form))
id val)
(cond
@@ -495,7 +500,7 @@ eliminated by adding more test cases."
(len (length points))
(changed (buffer-modified-p))
(coverage (get def 'edebug-coverage))
- ov j item)
+ ov j)
(or (and def-mark points coverage)
(error "Missing edebug data for function %s" def))
(when (> len 0)
diff --git a/lisp/emulation/cua-base.el b/lisp/emulation/cua-base.el
index c6d7b5018cd..e91ce80bbe2 100644
--- a/lisp/emulation/cua-base.el
+++ b/lisp/emulation/cua-base.el
@@ -790,6 +790,8 @@ Repeating prefix key when region is active works as a single prefix key."
;;; Region specific commands
+(declare-function delete-active-region "delsel" (&optional killp))
+
(defun cua-delete-region ()
"Delete the active region.
Save a copy in register 0 if `cua-delete-copy-to-register-0' is non-nil."
diff --git a/lisp/eshell/em-cmpl.el b/lisp/eshell/em-cmpl.el
index dbea9e5ceec..93b275e2ffb 100644
--- a/lisp/eshell/em-cmpl.el
+++ b/lisp/eshell/em-cmpl.el
@@ -405,7 +405,9 @@ to writing a completion function."
"Generate list of applicable, visible commands."
(let ((filename (pcomplete-arg)) glob-name)
(if (file-name-directory filename)
- (pcomplete-executables)
+ (if eshell-force-execution
+ (pcomplete-dirs-or-entries nil 'file-readable-p)
+ (pcomplete-executables))
(if (and (> (length filename) 0)
(eq (aref filename 0) eshell-explicit-command-char))
(setq filename (substring filename 1)
@@ -416,6 +418,8 @@ to writing a completion function."
(expand-file-name default-directory)))
(path "") (comps-in-path ())
(file "") (filepath "") (completions ()))
+ (if (eshell-under-windows-p)
+ (push "." paths))
;; Go thru each path in the search path, finding completions.
(while paths
(setq path (file-name-as-directory
@@ -431,7 +435,9 @@ to writing a completion function."
(if (and (not (member file completions)) ;
(or (string-equal path cwd)
(not (file-directory-p filepath)))
- (file-executable-p filepath))
+ (if eshell-force-execution
+ (file-readable-p filepath)
+ (file-executable-p filepath)))
(setq completions (cons file completions)))
(setq comps-in-path (cdr comps-in-path)))
(setq paths (cdr paths)))
diff --git a/lisp/eshell/esh-ext.el b/lisp/eshell/esh-ext.el
index 0b25b31eff9..91c4f4b6095 100644
--- a/lisp/eshell/esh-ext.el
+++ b/lisp/eshell/esh-ext.el
@@ -60,14 +60,15 @@ loaded into memory, thus beginning a new process."
:type '(repeat string)
:group 'eshell-ext)
-(defcustom eshell-force-execution nil
- "If non-nil, try to execute binary files regardless of permissions.
+(defcustom eshell-force-execution
+ (not (null (memq system-type '(windows-nt ms-dos))))
+ "If non-nil, try to execute files regardless of execute permissions.
This can be useful on systems like Windows, where the operating system
-doesn't happen to honor the permission bits in certain cases; or in
-cases where you want to associate an interpreter with a particular
-kind of script file, but the language won't let you but a '#!'
-interpreter line in the file, and you don't want to make it executable
-since nothing else but Eshell will be able to understand
+doesn't support the execution bit for shell scripts; or in cases where
+you want to associate an interpreter with a particular kind of script
+file, but the language won't let you but a '#!' interpreter line in
+the file, and you don't want to make it executable since nothing else
+but Eshell will be able to understand
`eshell-interpreter-alist'."
:type 'boolean
:group 'eshell-ext)
@@ -78,6 +79,8 @@ since nothing else but Eshell will be able to understand
name
(let ((list (eshell-parse-colon-path eshell-path-env))
suffixes n1 n2 file)
+ (if (eshell-under-windows-p)
+ (push "." list))
(while list
(setq n1 (concat (car list) name))
(setq suffixes eshell-binary-suffixes)
diff --git a/lisp/ffap.el b/lisp/ffap.el
index 452275ab8c2..d78fd4c4b31 100644
--- a/lisp/ffap.el
+++ b/lisp/ffap.el
@@ -1288,7 +1288,7 @@ which may actually result in an URL rather than a filename."
nil
nil
(if dir (cons guess (length dir)) guess)
- (list 'file-name-history)
+ 'file-name-history
(and buffer-file-name
(abbreviate-file-name buffer-file-name)))))
;; Remove the special handler manually. We used to just let-bind
diff --git a/lisp/files.el b/lisp/files.el
index 045eeaf154c..ef6ac7b8c92 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -654,10 +654,14 @@ the value of `default-directory'."
'file-directory-p))
-(defun pwd ()
- "Show the current default directory."
- (interactive nil)
- (message "Directory %s" default-directory))
+(defun pwd (&optional insert)
+ "Show the current default directory.
+With prefix argument INSERT, insert the current default directory
+at point instead."
+ (interactive "P")
+ (if insert
+ (insert default-directory)
+ (message "Directory %s" default-directory)))
(defvar cd-path nil
"Value of the CDPATH environment variable, as a list.
diff --git a/lisp/foldout.el b/lisp/foldout.el
index 443f8b72217..64c0af451b8 100644
--- a/lisp/foldout.el
+++ b/lisp/foldout.el
@@ -280,16 +280,16 @@ optional arg EXPOSURE \(interactively with prefix arg\) changes this:-
(goto-char start)
(cond
((null exposure)
- (show-entry)
- (show-children))
+ (outline-show-entry)
+ (outline-show-children))
((< exposure-value 0)
- (show-entry))
+ (outline-show-entry))
((consp exposure)
- (show-children))
+ (outline-show-children))
((> exposure-value 0)
- (show-children exposure-value))
+ (outline-show-children exposure-value))
(t
- (show-subtree))
+ (outline-show-subtree))
)
;; save the location of the fold we are entering
@@ -366,7 +366,7 @@ exited and text is left visible."
;; hide the subtree
(when hide-fold
(goto-char start-marker)
- (hide-subtree))
+ (outline-hide-subtree))
;; make sure the next heading is exposed
(if end-marker
@@ -454,10 +454,10 @@ What gets exposed depends on the number of mouse clicks:-
(foldout-mouse-goto-heading event)
(let ((nclicks (event-click-count event)))
(cond
- ((= nclicks 1) (show-entry))
- ((= nclicks 2) (show-children))
- ((= nclicks 3) (show-entry) (show-children))
- (t (show-subtree)))))
+ ((= nclicks 1) (outline-show-entry))
+ ((= nclicks 2) (outline-show-children))
+ ((= nclicks 3) (outline-show-entry) (outline-show-children))
+ (t (outline-show-subtree)))))
(defun foldout-mouse-hide-or-exit (event)
"Hide the subtree under the heading clicked on, or exit a fold.
@@ -478,7 +478,7 @@ What happens depends on the number of mouse clicks:-
(if (= nclicks 1)
(progn
(foldout-mouse-goto-heading event)
- (hide-subtree))
+ (outline-hide-subtree))
(foldout-exit-fold
(cond
((= nclicks 2) 1) ; exit and hide
diff --git a/lisp/font-lock.el b/lisp/font-lock.el
index 96b290e34f4..b1455131114 100644
--- a/lisp/font-lock.el
+++ b/lisp/font-lock.el
@@ -1350,7 +1350,7 @@ delimit the region to fontify."
deactivate-mark)
;; Make sure we have the right `font-lock-keywords' etc.
(if (not font-lock-mode) (font-lock-set-defaults))
- (save-excursion
+ (save-mark-and-excursion
(save-match-data
(condition-case error-data
(if (or arg (not font-lock-mark-block-function))
diff --git a/lisp/frame.el b/lisp/frame.el
index e8a89828b8d..0c1fb38c516 100644
--- a/lisp/frame.el
+++ b/lisp/frame.el
@@ -217,6 +217,7 @@ This function runs the hook `focus-out-hook'."
"Non-nil means function `frame-notice-user-settings' wasn't run yet.")
(declare-function tool-bar-mode "tool-bar" (&optional arg))
+(declare-function tool-bar-height "xdisp.c" (&optional frame pixelwise))
(defalias 'tool-bar-lines-needed 'tool-bar-height)
diff --git a/lisp/gnus/gnus-art.el b/lisp/gnus/gnus-art.el
index 14f9adca85d..989a4247800 100644
--- a/lisp/gnus/gnus-art.el
+++ b/lisp/gnus/gnus-art.el
@@ -7027,8 +7027,7 @@ If given a prefix, show the hidden text instead."
(gnus-check-server (gnus-find-method-for-group gnus-newsgroup-name))
(gnus-request-group gnus-newsgroup-name t)))
-(eval-when-compile
- (autoload 'nneething-get-file-name "nneething"))
+(declare-function nneething-get-file-name "nneething" (id))
(defun gnus-request-article-this-buffer (article group)
"Get an article and insert it into this buffer."
diff --git a/lisp/gnus/gnus-async.el b/lisp/gnus/gnus-async.el
index b1b3af9658e..d4d3dba2417 100644
--- a/lisp/gnus/gnus-async.el
+++ b/lisp/gnus/gnus-async.el
@@ -226,9 +226,6 @@ that was fetched."
`(lambda (arg)
(gnus-async-article-callback arg ,group ,article ,mark ,summary ,next)))
-(eval-when-compile
- (autoload 'gnus-html-prefetch-images "gnus-html"))
-
(defun gnus-async-article-callback (arg group article mark summary next)
"Function called when an async article is done being fetched."
(save-excursion
diff --git a/lisp/gnus/gnus-sync.el b/lisp/gnus/gnus-sync.el
index 3c0025f0df2..c9ccc3ec69d 100644
--- a/lisp/gnus/gnus-sync.el
+++ b/lisp/gnus/gnus-sync.el
@@ -90,10 +90,7 @@
(require 'gnus-util)
(defvar gnus-topic-alist) ;; gnus-group.el
-(eval-when-compile
- (autoload 'gnus-group-topic "gnus-topic")
- (autoload 'gnus-topic-create-topic "gnus-topic" nil t)
- (autoload 'gnus-topic-enter-dribble "gnus-topic"))
+(autoload 'gnus-group-topic "gnus-topic")
(defgroup gnus-sync nil
"The Gnus synchronization facility."
@@ -605,6 +602,10 @@ unwanted groups via the LeSync URL."
loc name gnus-sync-lesync-name (or sources "")))
nil)))
+(declare-function gnus-topic-create-topic "gnus-topic"
+ (topic parent &optional previous full-topic))
+(declare-function gnus-topic-enter-dribble "gnus-topic" ())
+
(defun gnus-sync-lesync-install-group-entry (name)
(let* ((master (assoc name gnus-newsrc-alist))
(old-topic-name (gnus-group-topic name))
diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el
index 7bacaba286d..b75d9efe5e5 100644
--- a/lisp/gnus/gnus-util.el
+++ b/lisp/gnus/gnus-util.el
@@ -1575,8 +1575,10 @@ SPEC is a predicate specifier that contains stuff like `or', `and',
(declare-function iswitchb-read-buffer "iswitchb"
- (prompt &optional default require-match start matches-set))
+ (prompt &optional default require-match
+ _predicate start matches-set))
(defvar iswitchb-temp-buflist)
+(defvar iswitchb-mode)
(defun gnus-iswitchb-completing-read (prompt collection &optional require-match
initial-input history def)
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 1371e700281..8bb0a78a446 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -3997,8 +3997,6 @@ This function uses `mail-citation-hook' if that is non-nil."
"Cite function in the standard Message manner."
(message-cite-original-1 nil))
-(defvar gnus-extract-address-components)
-
(autoload 'format-spec "format-spec")
(autoload 'gnus-date-get-time "gnus-util")
@@ -4020,7 +4018,7 @@ See `message-citation-line-format'."
(unless from
(setq from (mail-header-from message-reply-headers)))
(let* ((data (condition-case ()
- (funcall (if (boundp gnus-extract-address-components)
+ (funcall (if (boundp 'gnus-extract-address-components)
gnus-extract-address-components
'mail-extract-address-components)
from)
diff --git a/lisp/gnus/mm-archive.el b/lisp/gnus/mm-archive.el
index d88e159900b..9c86c4ac4f3 100644
--- a/lisp/gnus/mm-archive.el
+++ b/lisp/gnus/mm-archive.el
@@ -23,9 +23,8 @@
;;; Code:
(require 'mm-decode)
-(eval-when-compile
- (autoload 'gnus-recursive-directory-files "gnus-util")
- (autoload 'mailcap-extension-to-mime "mailcap"))
+(autoload 'gnus-recursive-directory-files "gnus-util")
+(autoload 'mailcap-extension-to-mime "mailcap")
(defvar mm-archive-decoders
'(("application/ms-tnef" t "tnef" "-f" "-" "-C")
diff --git a/lisp/gnus/mm-decode.el b/lisp/gnus/mm-decode.el
index ae6bb71dfc7..bce9abdcc8d 100644
--- a/lisp/gnus/mm-decode.el
+++ b/lisp/gnus/mm-decode.el
@@ -1827,7 +1827,7 @@ If RECURSIVE, search recursively."
(not (mm-long-lines-p 76))))))
(declare-function libxml-parse-html-region "xml.c"
- (start end &optional base-url))
+ (start end &optional base-url discard-comments))
(declare-function shr-insert-document "shr" (dom))
(defvar shr-blocked-images)
(defvar shr-use-fonts)
diff --git a/lisp/gnus/mm-util.el b/lisp/gnus/mm-util.el
index 0b7590114c4..ab9145f8b1c 100644
--- a/lisp/gnus/mm-util.el
+++ b/lisp/gnus/mm-util.el
@@ -1058,11 +1058,10 @@ This affects whether coding conversion should be attempted generally."
(length (memq (coding-system-base b) priorities)))
t))))
-(eval-when-compile
- (autoload 'latin-unity-massage-name "latin-unity")
- (autoload 'latin-unity-maybe-remap "latin-unity")
- (autoload 'latin-unity-representations-feasible-region "latin-unity")
- (autoload 'latin-unity-representations-present-region "latin-unity"))
+(declare-function latin-unity-massage-name "ext:latin-unity")
+(declare-function latin-unity-maybe-remap "ext:latin-unity")
+(declare-function latin-unity-representations-feasible-region "ext:latin-unity")
+(declare-function latin-unity-representations-present-region "ext:latin-unity")
(defvar latin-unity-coding-systems)
(defvar latin-unity-ucs-list)
diff --git a/lisp/gnus/mm-view.el b/lisp/gnus/mm-view.el
index a3d6e74fbcb..edc2d39cd0f 100644
--- a/lisp/gnus/mm-view.el
+++ b/lisp/gnus/mm-view.el
@@ -629,6 +629,8 @@ If MODE is not set, try to find mode automatically."
(replace-match "\n"))
t)
+(autoload 'epg-decrypt-string "epg")
+
(defun mm-view-pkcs7-decrypt (handle &optional from)
(insert-buffer-substring (mm-handle-buffer handle))
(goto-char (point-min))
diff --git a/lisp/gnus/mml-smime.el b/lisp/gnus/mml-smime.el
index 58d3b4680b9..3f0809edbe8 100644
--- a/lisp/gnus/mml-smime.el
+++ b/lisp/gnus/mml-smime.el
@@ -317,24 +317,25 @@ Whether the passphrase is cached at all is controlled by
(defvar inhibit-redisplay)
(defvar password-cache-expiry)
-(eval-when-compile
- (autoload 'epg-make-context "epg")
- (autoload 'epg-context-set-armor "epg")
- (autoload 'epg-context-set-signers "epg")
- (autoload 'epg-context-result-for "epg")
- (autoload 'epg-new-signature-digest-algorithm "epg")
- (autoload 'epg-verify-result-to-string "epg")
- (autoload 'epg-list-keys "epg")
- (autoload 'epg-decrypt-string "epg")
- (autoload 'epg-verify-string "epg")
- (autoload 'epg-sign-string "epg")
- (autoload 'epg-encrypt-string "epg")
- (autoload 'epg-passphrase-callback-function "epg")
- (autoload 'epg-context-set-passphrase-callback "epg")
- (autoload 'epg-sub-key-fingerprint "epg")
- (autoload 'epg-configuration "epg-config")
- (autoload 'epg-expand-group "epg-config")
- (autoload 'epa-select-keys "epa"))
+(autoload 'epg-make-context "epg")
+(autoload 'epg-passphrase-callback-function "epg")
+(declare-function epg-context-set-signers "epg" (context signers))
+(declare-function epg-context-result-for "epg" (context name))
+(declare-function epg-new-signature-digest-algorithm "epg" (cl-x) t)
+(declare-function epg-verify-result-to-string "epg" (verify-result))
+(declare-function epg-list-keys "epg" (context &optional name mode))
+(declare-function epg-verify-string "epg"
+ (context signature &optional signed-text))
+(declare-function epg-sign-string "epg" (context plain &optional mode))
+(declare-function epg-encrypt-string "epg"
+ (context plain recipients &optional sign always-trust))
+(declare-function epg-context-set-passphrase-callback "epg"
+ (context passphrase-callback))
+(declare-function epg-sub-key-fingerprint "epg" (cl-x) t)
+(declare-function epg-configuration "epg-config" ())
+(declare-function epg-expand-group "epg-config" (config group))
+(declare-function epa-select-keys "epa"
+ (context prompt &optional names secret))
(defvar mml-smime-epg-secret-key-id-list nil)
@@ -359,9 +360,9 @@ Whether the passphrase is cached at all is controlled by
(cons key-id mml-smime-epg-secret-key-id-list))
(copy-sequence passphrase)))))
-(declare-function epg-key-sub-key-list "ext:epg" (key))
-(declare-function epg-sub-key-capability "ext:epg" (sub-key))
-(declare-function epg-sub-key-validity "ext:epg" (sub-key))
+(declare-function epg-key-sub-key-list "epg" (key) t)
+(declare-function epg-sub-key-capability "epg" (sub-key) t)
+(declare-function epg-sub-key-validity "epg" (sub-key) t)
(defun mml-smime-epg-find-usable-key (keys usage)
(catch 'found
diff --git a/lisp/gnus/mml.el b/lisp/gnus/mml.el
index 2a3b228097a..57544758597 100644
--- a/lisp/gnus/mml.el
+++ b/lisp/gnus/mml.el
@@ -463,7 +463,7 @@ If MML is non-nil, return the buffer up till the correspondent mml tag."
(defvar mml-inhibit-compute-boundary nil)
(declare-function libxml-parse-html-region "xml.c"
- (start end &optional base-url))
+ (start end &optional base-url discard-comments))
(defun mml-generate-mime (&optional multipart-type)
"Generate a MIME message based on the current MML document.
diff --git a/lisp/gnus/nnir.el b/lisp/gnus/nnir.el
index 08ca7c7e06b..15ccc4725d7 100644
--- a/lisp/gnus/nnir.el
+++ b/lisp/gnus/nnir.el
@@ -281,16 +281,6 @@ is `(valuefunc member)'."
(require 'gnus-sum)
-(eval-when-compile
- (autoload 'nnimap-buffer "nnimap")
- (autoload 'nnimap-command "nnimap")
- (autoload 'nnimap-change-group "nnimap")
- (autoload 'nnimap-make-thread-query "nnimap")
- (autoload 'gnus-registry-action "gnus-registry")
- (autoload 'gnus-registry-get-id-key "gnus-registry")
- (autoload 'gnus-group-topic-name "gnus-topic"))
-
-
(nnoo-declare nnir)
(nnoo-define-basics nnir)
@@ -586,6 +576,8 @@ Add an entry here when adding a new search engine.")
;; Gnus glue.
+(declare-function gnus-group-topic-name "gnus-topic" ())
+
(defun gnus-group-make-nnir-group (nnir-extra-parms &optional specs)
"Create an nnir group. Prompt for a search query and determine
the groups to search as follows: if called from the *Server*
@@ -948,6 +940,10 @@ ready to be added to the list of search results."
;;; Search Engine Interfaces:
+(autoload 'nnimap-change-group "nnimap")
+(declare-function nnimap-buffer "nnimap" ())
+(declare-function nnimap-command "nnimap" (&rest args))
+
;; imap interface
(defun nnir-run-imap (query srv &optional groups)
"Run a search against an IMAP back-end server.
@@ -1774,6 +1770,9 @@ environment unless `not-global' is non-nil."
(let ((backend (car (gnus-server-to-method server))))
(nnoo-current-server-p (or backend 'nnir) server)))
+(autoload 'nnimap-make-thread-query "nnimap")
+(declare-function gnus-registry-get-id-key "gnus-registry" (id key))
+
(defun nnir-search-thread (header)
"Make an nnir group based on the thread containing the article
header. The current server will be searched. If the registry is
@@ -1841,6 +1840,10 @@ article came from is also searched."
(forward-line)))))
groups))
+;; Behind gnus-registry-enabled test.
+(declare-function gnus-registry-action "gnus-registry"
+ (action data-header from &optional to method))
+
(defun nnir-registry-action (action data-header from &optional to method)
"Call `gnus-registry-action' with the original article group."
(gnus-registry-action
diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el
index 5c5481095e2..71bc916a927 100644
--- a/lisp/gnus/nnmail.el
+++ b/lisp/gnus/nnmail.el
@@ -36,8 +36,7 @@
(autoload 'gnus-add-buffer "gnus")
(autoload 'gnus-kill-buffer "gnus")
-(eval-when-compile
- (autoload 'mail-send-and-exit "sendmail" nil t))
+(autoload 'mail-send-and-exit "sendmail" nil t)
(defgroup nnmail nil
"Reading mail with Gnus."
diff --git a/lisp/gnus/nnrss.el b/lisp/gnus/nnrss.el
index ac9c5ffab2c..1546f922e7a 100644
--- a/lisp/gnus/nnrss.el
+++ b/lisp/gnus/nnrss.el
@@ -395,7 +395,7 @@ otherwise return nil."
(mm-coding-system-p 'utf-8)))
(declare-function libxml-parse-html-region "xml.c"
- (start end &optional base-url))
+ (start end &optional base-url discard-comments))
(defun nnrss-fetch (url &optional local)
"Fetch URL and put it in a the expected Lisp structure."
(mm-with-unibyte-buffer
diff --git a/lisp/gnus/spam.el b/lisp/gnus/spam.el
index 500f34139be..02ec69516c1 100644
--- a/lisp/gnus/spam.el
+++ b/lisp/gnus/spam.el
@@ -2232,15 +2232,6 @@ Uses `gnus-newsgroup-name' if category is nil (for ham registration)."
;;{{{ spam-stat
-(eval-when-compile
- (autoload 'spam-stat-buffer-change-to-non-spam "spam-stat")
- (autoload 'spam-stat-buffer-change-to-spam "spam-stat")
- (autoload 'spam-stat-buffer-is-non-spam "spam-stat")
- (autoload 'spam-stat-buffer-is-spam "spam-stat")
- (autoload 'spam-stat-load "spam-stat")
- (autoload 'spam-stat-save "spam-stat")
- (autoload 'spam-stat-split-fancy "spam-stat"))
-
(require 'spam-stat)
(defun spam-check-stat ()
diff --git a/lisp/help-fns.el b/lisp/help-fns.el
index 90200377428..4982ee54f46 100644
--- a/lisp/help-fns.el
+++ b/lisp/help-fns.el
@@ -495,6 +495,9 @@ FILE is the file where FUNCTION was probably defined."
f))
((subrp def) (intern (subr-name def)))
(t def)))
+ (sig-key (if (subrp def)
+ (indirect-function real-def)
+ real-def))
(file-name (find-lisp-object-file-name function def))
(pt1 (with-current-buffer (help-buffer) (point)))
(beg (if (and (or (byte-code-function-p def)
@@ -586,7 +589,7 @@ FILE is the file where FUNCTION was probably defined."
(help-fns--key-bindings function)
(with-current-buffer standard-output
- (setq doc (help-fns--signature function doc real-def real-function))
+ (setq doc (help-fns--signature function doc sig-key real-function))
(run-hook-with-args 'help-fns-describe-function-functions function)
(insert "\n"
(or doc "Not documented.")))))))
diff --git a/lisp/help-mode.el b/lisp/help-mode.el
index d6679e9e4de..f99e9165bce 100644
--- a/lisp/help-mode.el
+++ b/lisp/help-mode.el
@@ -727,7 +727,7 @@ BUFFER or FRAME."
(user-error "No previous help buffer")))
(defun help-go-forward ()
- "Go back to next topic in this help buffer."
+ "Go to the next topic in this help buffer."
(interactive)
(if help-xref-forward-stack
(help-xref-go-forward (current-buffer))
diff --git a/lisp/help.el b/lisp/help.el
index fb1719ac9c9..2b8f6423172 100644
--- a/lisp/help.el
+++ b/lisp/help.el
@@ -691,7 +691,8 @@ POSITION is as documented in the function `key-binding'."
(defun help--binding-locus (key position)
"Describe in which keymap KEY is defined.
Return a symbol pointing to that keymap if one exists ; otherwise
-return nil."
+return nil. The argument POSITION is as documented in the
+function `key-binding'."
(let ((map (help--key-binding-keymap key t nil position)))
(when map
(catch 'found
diff --git a/lisp/info.el b/lisp/info.el
index 057bd77ba16..05574ae11f5 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -632,7 +632,7 @@ Do the right thing if the file has been compressed or zipped."
default-directory)))
(or (consp decoder)
(setq decoder (list decoder)))
- (apply 'call-process-region (point-min) (point-max)
+ (apply #'call-process-region (point-min) (point-max)
(car decoder) t t nil (cdr decoder))))
(let ((inhibit-null-byte-detection t)) ; Index nodes include null bytes
(insert-file-contents fullname visit)))
@@ -1422,10 +1422,10 @@ is non-nil)."
(insert "\^_\nFile: dir\tNode: " nodename "\n\n* Menu:\n\n"))
;; Merge the text from the other buffer's menu
;; into the menu in the like-named node in the main buffer.
- (apply 'insert-buffer-substring (cdr node))))
+ (apply #'insert-buffer-substring (cdr node))))
(Info-dir-remove-duplicates)
;; Kill all the buffers we just made, including the special one excised.
- (mapc 'kill-buffer (cons buffer buffers))
+ (mapc #'kill-buffer (cons buffer buffers))
(goto-char (point-min))
(if problems
(message "Composing main Info directory...problems encountered, see `*Messages*'")
@@ -1810,10 +1810,10 @@ See `completing-read' for a description of arguments and usage."
((string-match "\\`([^)]*\\'" string)
(completion-table-with-context
"("
- (apply-partially 'completion-table-with-terminator ")"
- (apply-partially 'Info-read-node-name-2
+ (apply-partially #'completion-table-with-terminator ")"
+ (apply-partially #'Info-read-node-name-2
Info-directory-list
- (mapcar 'car Info-suffix-list)))
+ (mapcar #'car Info-suffix-list)))
(substring string 1)
predicate
code))
@@ -1827,12 +1827,11 @@ See `completing-read' for a description of arguments and usage."
t
(completion-table-with-context
file0
- (apply-partially
- (lambda (string pred action)
- (complete-with-action
- action
- (Info-build-node-completions (Info-find-file file1))
- string pred)))
+ (lambda (string pred action)
+ (complete-with-action
+ action
+ (Info-build-node-completions (Info-find-file file1))
+ string pred))
nodename predicate code))))
;; Otherwise use Info-read-node-completion-table.
(t (complete-with-action
@@ -2750,7 +2749,8 @@ new buffer."
(end-of-line)
(if (re-search-backward (concat "\n\\* +\\("
Info-menu-entry-name-re
- "\\):") beg t)
+ "\\):")
+ beg t)
(setq default (match-string-no-properties 1))))))
(let ((item nil))
(while (null item)
@@ -2760,7 +2760,8 @@ new buffer."
(format "Menu item (default %s): "
default)
"Menu item: ")
- 'Info-complete-menu-item nil t)))
+ #'Info-complete-menu-item nil t nil nil
+ default)))
;; we rely on the fact that completing-read accepts an input
;; of "" even when the require-match argument is true and ""
;; is not a valid possibility
@@ -3496,7 +3497,7 @@ MATCHES is a list of index matches found by `Info-apropos-matches'.")
(defun Info-apropos-toc-nodes (filename)
"Apropos-specific implementation of `Info-toc-nodes'."
- (let ((nodes (mapcar 'car (reverse Info-apropos-nodes))))
+ (let ((nodes (mapcar #'car (reverse Info-apropos-nodes))))
`(,filename
("Top" nil nil ,nodes)
,@(mapcar (lambda (node) `(,node "Top" nil nil)) nodes))))
@@ -3709,13 +3710,13 @@ Build a menu of the possible matches."
"The following packages match the keyword `" nodename "':\n\n")
(insert "* Menu:\n\n")
(let ((keywords
- (mapcar 'intern (if (string-match-p "," nodename)
+ (mapcar #'intern (if (string-match-p "," nodename)
(split-string nodename ",[ \t\n]*" t)
(list nodename))))
hits desc)
(dolist (keyword keywords)
(push (copy-tree (gethash keyword finder-keywords-hash)) hits))
- (setq hits (delete-dups (apply 'append hits))
+ (setq hits (delete-dups (apply #'append hits))
;; Not a meaningful package.
hits (delete 'emacs hits)
hits (sort hits (lambda (a b) (string< (symbol-name a)
@@ -3766,8 +3767,8 @@ with a list of packages that contain all specified keywords."
(list
(completing-read-multiple
"Keywords (separated by comma): "
- (mapcar 'symbol-name (mapcar 'car (append finder-known-keywords
- (finder-unknown-keywords))))
+ (mapcar #'symbol-name (mapcar #'car (append finder-known-keywords
+ (finder-unknown-keywords))))
nil t))))
(require 'finder)
(if keywords
@@ -5322,9 +5323,9 @@ completion alternatives to currently visited manuals."
(when (not visited-only)
(all-completions
""
- (apply-partially 'Info-read-node-name-2
+ (apply-partially #'Info-read-node-name-2
Info-directory-list
- (mapcar 'car Info-suffix-list))))))))
+ (mapcar #'car Info-suffix-list))))))))
(provide 'info)
diff --git a/lisp/international/cp51932.el b/lisp/international/cp51932.el
index a6489268578..cb72356fea0 100644
--- a/lisp/international/cp51932.el
+++ b/lisp/international/cp51932.el
@@ -468,3 +468,5 @@
(setcar x (cdr x)) (setcdr x tmp)))
map)
(define-translation-table 'cp51932-encode map))
+
+(provide 'cp51932)
diff --git a/lisp/international/eucjp-ms.el b/lisp/international/eucjp-ms.el
index 6e4e1e798b0..efb0a2b2d75 100644
--- a/lisp/international/eucjp-ms.el
+++ b/lisp/international/eucjp-ms.el
@@ -2085,3 +2085,5 @@
(setcar x (cdr x)) (setcdr x tmp)))
map)
(define-translation-table 'eucjp-ms-encode map))
+
+(provide 'eucjp-ms)
diff --git a/lisp/international/iso-transl.el b/lisp/international/iso-transl.el
index 73bcae060b3..e9fb009a56e 100644
--- a/lisp/international/iso-transl.el
+++ b/lisp/international/iso-transl.el
@@ -1,4 +1,4 @@
-;;; iso-transl.el --- keyboard input definitions for ISO 8859-1 -*- coding: utf-8 -*-
+;;; iso-transl.el --- keyboard input for ISO 10646 chars -*- coding: utf-8 -*-
;; Copyright (C) 1987, 1993-1999, 2001-2015 Free Software Foundation,
;; Inc.
@@ -36,6 +36,10 @@
;; to make all of the Alt keys autoload, and it is not clear
;; that the dead accent keys SHOULD autoload this package.
+;; This package supports all characters defined by ISO 8859-1, along
+;; with a few other ISO 10646 characters commonly used in English and
+;; basic math.
+
;;; Code:
;;; Provide some binding for startup:
@@ -192,6 +196,31 @@
("~o" . [?õ])
("~t" . [?þ])
("~~" . [?¬])
+ ("_h" . [?â€])
+ ("_H" . [?‑])
+ ("_f" . [?‒])
+ ("_n" . [?–])
+ ("_m" . [?—])
+ ("_q" . [?―])
+ ("[" . [?‘])
+ ("]" . [?’])
+ ("{" . [?“])
+ ("}" . [?â€])
+ ("1+" . [?†])
+ ("2+" . [?‡])
+ ("**" . [?•])
+ ("*'" . [?′])
+ ("*\"" . [?″])
+ ("*E" . [?€])
+ ("No" . [?â„–])
+ ("a<" . [?â†])
+ ("a>" . [?→])
+ ("a=" . [?↔])
+ ("_-" . [?−])
+ ("~=" . [?≈])
+ ("/=" . [?≠])
+ ("_<" . [?≤])
+ ("_>" . [?≥])
("' " . "'")
("` " . "`")
("\" " . "\"")
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index cca659f2cc1..4b63cb8f565 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -1698,7 +1698,7 @@ Usually, the input method inserts the intermediate key sequence,
or candidate translations corresponding to the sequence,
at point in the current buffer.
But, if this flag is non-nil, it displays them in echo area instead."
- :type 'hook
+ :type 'boolean
:group 'mule)
(defvar input-method-exit-on-invalid-key nil
@@ -2708,6 +2708,14 @@ See also `locale-charset-language-names', `locale-language-names',
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)))
+ ;; If curved quotes don't work, display straight ASCII approximations.
+ (unless frame
+ (dolist (char-repl '((?‘ . [?\']) (?’ . [?\']) (?“ . [?\"]) (?†. [?\"])))
+ (when (not (char-displayable-p (car char-repl)))
+ (or standard-display-table
+ (setq standard-display-table (make-display-table)))
+ (aset standard-display-table (car char-repl) (cdr char-repl)))))
+
;; Default to A4 paper if we're not in a C, POSIX or US locale.
;; (See comments in Flocale_info.)
(unless frame
diff --git a/lisp/international/quail.el b/lisp/international/quail.el
index 5e422bf5fdb..90a540aae30 100644
--- a/lisp/international/quail.el
+++ b/lisp/international/quail.el
@@ -793,9 +793,10 @@ you type is correctly handled."
keyseq)))
(defun quail-insert-kbd-layout (kbd-layout)
-"Insert the visual keyboard layout table according to KBD-LAYOUT.
+ "Insert the visual keyboard layout table according to KBD-LAYOUT.
The format of KBD-LAYOUT is the same as `quail-keyboard-layout'."
(let (done-list layout i ch)
+ (setq bidi-paragraph-direction 'left-to-right)
;; At first, convert KBD-LAYOUT to the same size vector that
;; contains translated character or string.
(setq layout (string-to-vector kbd-layout)
diff --git a/lisp/international/robin.el b/lisp/international/robin.el
index 897075f0faf..8254180fcc1 100644
--- a/lisp/international/robin.el
+++ b/lisp/international/robin.el
@@ -576,7 +576,7 @@ used."
(provide 'robin)
;; Local Variables:
-;; coding: utf-8-emacs
+;; coding: utf-8
;; End:
;;; robin.el ends here
diff --git a/lisp/isearch.el b/lisp/isearch.el
index 35fb0608dd0..dc10502309f 100644
--- a/lisp/isearch.el
+++ b/lisp/isearch.el
@@ -452,7 +452,7 @@ This is like `describe-bindings', but displays only Isearch keys."
(define-key map "\M-\C-s" 'isearch-repeat-forward)
(define-key map "\M-\C-r" 'isearch-repeat-backward)
(define-key map "\177" 'isearch-delete-char)
- (define-key map [backspace] 'isearch-delete-char)
+ (define-key map [backspace] 'undefined) ;bug#20466.
(define-key map "\C-g" 'isearch-abort)
;; This assumes \e is the meta-prefix-char.
@@ -1924,8 +1924,8 @@ If search string is empty, just beep."
(defun isearch-yank-x-selection ()
"Pull current X selection into search string."
(interactive)
- (isearch-yank-string (x-get-selection))
- ;; If `x-get-selection' returned the text from the active region,
+ (isearch-yank-string (gui-get-selection))
+ ;; If `gui-get-selection' returned the text from the active region,
;; then it "used" the mark which we should hence deactivate.
(when select-active-regions (deactivate-mark)))
diff --git a/lisp/language/ethio-util.el b/lisp/language/ethio-util.el
index 8575e7b6a93..a27f74907b0 100644
--- a/lisp/language/ethio-util.el
+++ b/lisp/language/ethio-util.el
@@ -2071,5 +2071,3 @@ mark."
(provide 'ethio-util)
;;; ethio-util.el ends here
-
-;;; ethio-util.el ends here
diff --git a/lisp/language/japanese.el b/lisp/language/japanese.el
index ce480252e7c..38159d7b458 100644
--- a/lisp/language/japanese.el
+++ b/lisp/language/japanese.el
@@ -34,8 +34,8 @@
;;; Code:
;;; Load translation tables for CP932.
-(load "international/cp51932")
-(load "international/eucjp-ms")
+(require 'cp51932)
+(require 'eucjp-ms)
(define-coding-system 'iso-2022-jp
"ISO 2022 based 7bit encoding for Japanese (MIME:ISO-2022-JP)."
diff --git a/lisp/ldefs-boot.el b/lisp/ldefs-boot.el
index ff09bf79c25..0d1940cf248 100644
--- a/lisp/ldefs-boot.el
+++ b/lisp/ldefs-boot.el
@@ -3,7 +3,7 @@
;;; Code:
-;;;### (autoloads nil "5x5" "play/5x5.el" (21799 24401 566172 757000))
+;;;### (autoloads nil "5x5" "play/5x5.el" (21799 41767 31221 635000))
;;; Generated autoloads from play/5x5.el
(autoload '5x5 "5x5" "\
@@ -65,8 +65,8 @@ should return a grid vector array that is the new solution.
;;;***
-;;;### (autoloads nil "ada-mode" "progmodes/ada-mode.el" (21678 60840
-;;;;;; 221777 189000))
+;;;### (autoloads nil "ada-mode" "progmodes/ada-mode.el" (21814 9129
+;;;;;; 380496 997000))
;;; Generated autoloads from progmodes/ada-mode.el
(autoload 'ada-add-extensions "ada-mode" "\
@@ -85,8 +85,8 @@ Ada mode is the major mode for editing Ada code.
;;;***
-;;;### (autoloads nil "ada-stmt" "progmodes/ada-stmt.el" (21678 60840
-;;;;;; 221777 189000))
+;;;### (autoloads nil "ada-stmt" "progmodes/ada-stmt.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/ada-stmt.el
(autoload 'ada-header "ada-stmt" "\
@@ -96,8 +96,8 @@ Insert a descriptive header at the top of the file.
;;;***
-;;;### (autoloads nil "ada-xref" "progmodes/ada-xref.el" (21678 60840
-;;;;;; 225777 350000))
+;;;### (autoloads nil "ada-xref" "progmodes/ada-xref.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/ada-xref.el
(autoload 'ada-find-file "ada-xref" "\
@@ -108,8 +108,8 @@ Completion is available.
;;;***
-;;;### (autoloads nil "add-log" "vc/add-log.el" (21678 60840 513788
-;;;;;; 871000))
+;;;### (autoloads nil "add-log" "vc/add-log.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from vc/add-log.el
(put 'change-log-default-name 'safe-local-variable 'string-or-null-p)
@@ -238,8 +238,8 @@ old-style time formats for entries are supported.
;;;***
-;;;### (autoloads nil "advice" "emacs-lisp/advice.el" (21678 60839
-;;;;;; 441745 885000))
+;;;### (autoloads nil "advice" "emacs-lisp/advice.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/advice.el
(defvar ad-redefinition-action 'warn "\
@@ -374,7 +374,7 @@ usage: (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
;;;***
-;;;### (autoloads nil "align" "align.el" (21678 60839 237737 687000))
+;;;### (autoloads nil "align" "align.el" (21670 32330 885624 725000))
;;; Generated autoloads from align.el
(autoload 'align "align" "\
@@ -477,7 +477,7 @@ A replacement function for `newline-and-indent', aligning as it goes.
;;;***
-;;;### (autoloads nil "allout" "allout.el" (21678 60839 245738 8000))
+;;;### (autoloads nil "allout" "allout.el" (21670 32330 885624 725000))
;;; Generated autoloads from allout.el
(push (purecopy '(allout 2 3)) package--builtin-versions)
@@ -837,8 +837,8 @@ for details on preparing Emacs for automatic allout activation.
;;;***
-;;;### (autoloads nil "allout-widgets" "allout-widgets.el" (21678
-;;;;;; 60839 241737 848000))
+;;;### (autoloads nil "allout-widgets" "allout-widgets.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from allout-widgets.el
(push (purecopy '(allout-widgets 1 0)) package--builtin-versions)
@@ -896,8 +896,8 @@ outline hot-spot navigation (see `allout-mode').
;;;***
-;;;### (autoloads nil "ange-ftp" "net/ange-ftp.el" (21697 290 536850
-;;;;;; 376000))
+;;;### (autoloads nil "ange-ftp" "net/ange-ftp.el" (21696 56380 925320
+;;;;;; 624000))
;;; Generated autoloads from net/ange-ftp.el
(defalias 'ange-ftp-re-read-dir 'ange-ftp-reread-dir)
@@ -918,8 +918,8 @@ directory, so that Emacs will know its current contents.
;;;***
-;;;### (autoloads nil "animate" "play/animate.el" (21678 60840 197776
-;;;;;; 230000))
+;;;### (autoloads nil "animate" "play/animate.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/animate.el
(autoload 'animate-string "animate" "\
@@ -951,8 +951,8 @@ the buffer *Birthday-Present-for-Name*.
;;;***
-;;;### (autoloads nil "ansi-color" "ansi-color.el" (21678 60839 249738
-;;;;;; 169000))
+;;;### (autoloads nil "ansi-color" "ansi-color.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from ansi-color.el
(push (purecopy '(ansi-color 3 4 2)) package--builtin-versions)
@@ -978,8 +978,8 @@ This is a good function to put in `comint-output-filter-functions'.
;;;***
-;;;### (autoloads nil "antlr-mode" "progmodes/antlr-mode.el" (21678
-;;;;;; 60840 229777 510000))
+;;;### (autoloads nil "antlr-mode" "progmodes/antlr-mode.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/antlr-mode.el
(push (purecopy '(antlr-mode 2 2 3)) package--builtin-versions)
@@ -1015,8 +1015,8 @@ Used in `antlr-mode'. Also a useful function in `java-mode-hook'.
;;;***
-;;;### (autoloads nil "appt" "calendar/appt.el" (21678 60839 305740
-;;;;;; 419000))
+;;;### (autoloads nil "appt" "calendar/appt.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from calendar/appt.el
(autoload 'appt-add "appt" "\
@@ -1037,8 +1037,8 @@ ARG is positive, otherwise off.
;;;***
-;;;### (autoloads nil "apropos" "apropos.el" (21678 60839 249738
-;;;;;; 169000))
+;;;### (autoloads nil "apropos" "apropos.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from apropos.el
(autoload 'apropos-read-pattern "apropos" "\
@@ -1153,8 +1153,8 @@ Returns list of symbols and documentation found.
;;;***
-;;;### (autoloads nil "arc-mode" "arc-mode.el" (21678 60839 249738
-;;;;;; 169000))
+;;;### (autoloads nil "arc-mode" "arc-mode.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from arc-mode.el
(autoload 'archive-mode "arc-mode" "\
@@ -1174,7 +1174,7 @@ archive.
;;;***
-;;;### (autoloads nil "array" "array.el" (21678 60839 253738 330000))
+;;;### (autoloads nil "array" "array.el" (21670 32330 885624 725000))
;;; Generated autoloads from array.el
(autoload 'array-mode "array" "\
@@ -1245,8 +1245,8 @@ Entering array mode calls the function `array-mode-hook'.
;;;***
-;;;### (autoloads nil "artist" "textmodes/artist.el" (21756 63738
-;;;;;; 14470 148000))
+;;;### (autoloads nil "artist" "textmodes/artist.el" (21750 59840
+;;;;;; 704617 663000))
;;; Generated autoloads from textmodes/artist.el
(push (purecopy '(artist 1 2 6)) package--builtin-versions)
@@ -1452,8 +1452,8 @@ Keymap summary
;;;***
-;;;### (autoloads nil "asm-mode" "progmodes/asm-mode.el" (21678 60840
-;;;;;; 229777 510000))
+;;;### (autoloads nil "asm-mode" "progmodes/asm-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/asm-mode.el
(autoload 'asm-mode "asm-mode" "\
@@ -1480,8 +1480,8 @@ Special commands:
;;;***
-;;;### (autoloads nil "auth-source" "gnus/auth-source.el" (21678
-;;;;;; 60839 625753 279000))
+;;;### (autoloads nil "auth-source" "gnus/auth-source.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from gnus/auth-source.el
(defvar auth-source-cache-expiry 7200 "\
@@ -1493,8 +1493,8 @@ let-binding.")
;;;***
-;;;### (autoloads nil "autoarg" "autoarg.el" (21678 60839 253738
-;;;;;; 330000))
+;;;### (autoloads nil "autoarg" "autoarg.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from autoarg.el
(defvar autoarg-mode nil "\
@@ -1554,8 +1554,8 @@ This is similar to `autoarg-mode' but rebinds the keypad keys
;;;***
-;;;### (autoloads nil "autoconf" "progmodes/autoconf.el" (21678 60840
-;;;;;; 229777 510000))
+;;;### (autoloads nil "autoconf" "progmodes/autoconf.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/autoconf.el
(autoload 'autoconf-mode "autoconf" "\
@@ -1565,8 +1565,8 @@ Major mode for editing Autoconf configure.ac files.
;;;***
-;;;### (autoloads nil "autoinsert" "autoinsert.el" (21678 60839 253738
-;;;;;; 330000))
+;;;### (autoloads nil "autoinsert" "autoinsert.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from autoinsert.el
(autoload 'auto-insert "autoinsert" "\
@@ -1604,8 +1604,8 @@ insert a template for the file depending on the mode of the buffer.
;;;***
-;;;### (autoloads nil "autoload" "emacs-lisp/autoload.el" (21803
-;;;;;; 61751 253342 299000))
+;;;### (autoloads nil "autoload" "emacs-lisp/autoload.el" (21802
+;;;;;; 17960 382855 287000))
;;; Generated autoloads from emacs-lisp/autoload.el
(put 'generated-autoload-file 'safe-local-variable 'stringp)
@@ -1656,8 +1656,8 @@ should be non-nil).
;;;***
-;;;### (autoloads nil "autorevert" "autorevert.el" (21756 63737 806475
-;;;;;; 370000))
+;;;### (autoloads nil "autorevert" "autorevert.el" (21752 15166 568176
+;;;;;; 278000))
;;; Generated autoloads from autorevert.el
(autoload 'auto-revert-mode "autorevert" "\
@@ -1745,7 +1745,7 @@ specifies in the mode line.
;;;***
-;;;### (autoloads nil "avoid" "avoid.el" (21678 60839 253738 330000))
+;;;### (autoloads nil "avoid" "avoid.el" (21670 32330 885624 725000))
;;; Generated autoloads from avoid.el
(defvar mouse-avoidance-mode nil "\
@@ -1783,8 +1783,8 @@ definition of \"random distance\".)
;;;***
-;;;### (autoloads nil "bat-mode" "progmodes/bat-mode.el" (21678 60840
-;;;;;; 229777 510000))
+;;;### (autoloads nil "bat-mode" "progmodes/bat-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/bat-mode.el
(add-to-list 'auto-mode-alist '("\\.\\(bat\\|cmd\\)\\'" . bat-mode))
@@ -1802,8 +1802,8 @@ Run script using `bat-run' and `bat-run-args'.
;;;***
-;;;### (autoloads nil "battery" "battery.el" (21756 63737 810475
-;;;;;; 270000))
+;;;### (autoloads nil "battery" "battery.el" (21754 56896 744606
+;;;;;; 568000))
;;; Generated autoloads from battery.el
(put 'battery-mode-line-string 'risky-local-variable t)
@@ -1838,8 +1838,8 @@ seconds.
;;;***
-;;;### (autoloads nil "benchmark" "emacs-lisp/benchmark.el" (21678
-;;;;;; 60839 441745 885000))
+;;;### (autoloads nil "benchmark" "emacs-lisp/benchmark.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/benchmark.el
(autoload 'benchmark-run "benchmark" "\
@@ -1875,8 +1875,8 @@ For non-interactive use see also `benchmark-run' and
;;;***
-;;;### (autoloads nil "bibtex" "textmodes/bibtex.el" (21678 60840
-;;;;;; 445786 150000))
+;;;### (autoloads nil "bibtex" "textmodes/bibtex.el" (21822 37176
+;;;;;; 700494 564000))
;;; Generated autoloads from textmodes/bibtex.el
(autoload 'bibtex-initialize "bibtex" "\
@@ -1968,7 +1968,7 @@ A prefix arg negates the value of `bibtex-search-entry-globally'.
;;;***
;;;### (autoloads nil "bibtex-style" "textmodes/bibtex-style.el"
-;;;;;; (21678 60840 441785 990000))
+;;;;;; (21670 32331 885635 586000))
;;; Generated autoloads from textmodes/bibtex-style.el
(autoload 'bibtex-style-mode "bibtex-style" "\
@@ -1978,8 +1978,8 @@ Major mode for editing BibTeX style files.
;;;***
-;;;### (autoloads nil "binhex" "mail/binhex.el" (21678 60839 869763
-;;;;;; 84000))
+;;;### (autoloads nil "binhex" "mail/binhex.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from mail/binhex.el
(defconst binhex-begin-line "^:...............................................................$" "\
@@ -2003,8 +2003,8 @@ Binhex decode region between START and END.
;;;***
-;;;### (autoloads nil "blackbox" "play/blackbox.el" (21678 60840
-;;;;;; 197776 230000))
+;;;### (autoloads nil "blackbox" "play/blackbox.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from play/blackbox.el
(autoload 'blackbox "blackbox" "\
@@ -2123,8 +2123,8 @@ a reflection.
;;;***
-;;;### (autoloads nil "bookmark" "bookmark.el" (21798 38124 240660
-;;;;;; 218000))
+;;;### (autoloads nil "bookmark" "bookmark.el" (21798 49947 232670
+;;;;;; 676000))
;;; Generated autoloads from bookmark.el
(define-key ctl-x-r-map "b" 'bookmark-jump)
(define-key ctl-x-r-map "m" 'bookmark-set)
@@ -2317,8 +2317,8 @@ Incremental search of bookmarks, hiding the non-matches as we go.
;;;***
-;;;### (autoloads nil "browse-url" "net/browse-url.el" (21797 54705
-;;;;;; 60905 16000))
+;;;### (autoloads nil "browse-url" "net/browse-url.el" (21811 32939
+;;;;;; 190503 320000))
;;; Generated autoloads from net/browse-url.el
(defvar browse-url-browser-function 'browse-url-default-browser "\
@@ -2363,16 +2363,21 @@ Ask a WWW browser to display the current region.
(autoload 'browse-url "browse-url" "\
Ask a WWW browser to load URL.
-Prompt for a URL, defaulting to the URL at or before point. Variable
-`browse-url-browser-function' says which browser to use.
+Prompt for a URL, defaulting to the URL at or before point.
+The variable `browse-url-browser-function' says which browser to use.
If the URL is a mailto: URL, consult `browse-url-mailto-function'
first, if that exists.
+Passes any ARGS to the browser function.
+The default is to pass `browse-url-new-window-flag'.
+
\(fn URL &rest ARGS)" t nil)
(autoload 'browse-url-at-point "browse-url" "\
Ask a WWW browser to load the URL at or before point.
Variable `browse-url-browser-function' says which browser to use.
+Optional prefix argument ARG non-nil inverts the value of the option
+`browse-url-new-window-flag'.
\(fn &optional ARG)" t nil)
@@ -2653,7 +2658,7 @@ from `browse-url-elinks-wrapper'.
;;;***
-;;;### (autoloads nil "bs" "bs.el" (21678 60839 257738 491000))
+;;;### (autoloads nil "bs" "bs.el" (21670 32330 885624 725000))
;;; Generated autoloads from bs.el
(push (purecopy '(bs 1 17)) package--builtin-versions)
@@ -2694,8 +2699,8 @@ name of buffer configuration.
;;;***
-;;;### (autoloads nil "bubbles" "play/bubbles.el" (21678 60840 197776
-;;;;;; 230000))
+;;;### (autoloads nil "bubbles" "play/bubbles.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/bubbles.el
(autoload 'bubbles "bubbles" "\
@@ -2717,7 +2722,7 @@ columns on its right towards the left.
;;;***
;;;### (autoloads nil "bug-reference" "progmodes/bug-reference.el"
-;;;;;; (21678 60840 229777 510000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from progmodes/bug-reference.el
(put 'bug-reference-url-format 'safe-local-variable (lambda (s) (or (stringp s) (and (symbolp s) (get s 'bug-reference-url-format)))))
@@ -2737,8 +2742,8 @@ Like `bug-reference-mode', but only buttonize in comments and strings.
;;;***
-;;;### (autoloads nil "bytecomp" "emacs-lisp/bytecomp.el" (21804
-;;;;;; 3763 202437 529000))
+;;;### (autoloads nil "bytecomp" "emacs-lisp/bytecomp.el" (21824
+;;;;;; 44973 370497 114000))
;;; Generated autoloads from emacs-lisp/bytecomp.el
(put 'byte-compile-dynamic 'safe-local-variable 'booleanp)
(put 'byte-compile-disable-print-circle 'safe-local-variable 'booleanp)
@@ -2858,8 +2863,8 @@ and corresponding effects.
;;;***
-;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (21678
-;;;;;; 60839 305740 419000))
+;;;### (autoloads nil "cal-china" "calendar/cal-china.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from calendar/cal-china.el
(put 'calendar-chinese-time-zone 'risky-local-variable t)
@@ -2868,8 +2873,8 @@ and corresponding effects.
;;;***
-;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (21678 60839
-;;;;;; 305740 419000))
+;;;### (autoloads nil "cal-dst" "calendar/cal-dst.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from calendar/cal-dst.el
(put 'calendar-daylight-savings-starts 'risky-local-variable t)
@@ -2880,8 +2885,8 @@ and corresponding effects.
;;;***
-;;;### (autoloads nil "cal-hebrew" "calendar/cal-hebrew.el" (21678
-;;;;;; 60839 305740 419000))
+;;;### (autoloads nil "cal-hebrew" "calendar/cal-hebrew.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from calendar/cal-hebrew.el
(autoload 'calendar-hebrew-list-yahrzeits "cal-hebrew" "\
@@ -2893,7 +2898,7 @@ from the cursor position.
;;;***
-;;;### (autoloads nil "calc" "calc/calc.el" (21678 60839 297740 98000))
+;;;### (autoloads nil "calc" "calc/calc.el" (21670 32330 885624 725000))
;;; Generated autoloads from calc/calc.el
(define-key ctl-x-map "*" 'calc-dispatch)
@@ -2979,8 +2984,8 @@ See Info node `(calc)Defining Functions'.
;;;***
-;;;### (autoloads nil "calc-undo" "calc/calc-undo.el" (21678 60839
-;;;;;; 289739 776000))
+;;;### (autoloads nil "calc-undo" "calc/calc-undo.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from calc/calc-undo.el
(autoload 'calc-undo "calc-undo" "\
@@ -2990,8 +2995,8 @@ See Info node `(calc)Defining Functions'.
;;;***
-;;;### (autoloads nil "calculator" "calculator.el" (21702 18751 28687
-;;;;;; 539000))
+;;;### (autoloads nil "calculator" "calculator.el" (21702 8774 274627
+;;;;;; 813000))
;;; Generated autoloads from calculator.el
(autoload 'calculator "calculator" "\
@@ -3002,8 +3007,8 @@ See the documentation for `calculator-mode' for more information.
;;;***
-;;;### (autoloads nil "calendar" "calendar/calendar.el" (21678 60839
-;;;;;; 313740 741000))
+;;;### (autoloads nil "calendar" "calendar/calendar.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from calendar/calendar.el
(autoload 'calendar "calendar" "\
@@ -3046,8 +3051,8 @@ This function is suitable for execution in an init file.
;;;***
-;;;### (autoloads nil "canlock" "gnus/canlock.el" (21678 60839 625753
-;;;;;; 279000))
+;;;### (autoloads nil "canlock" "gnus/canlock.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from gnus/canlock.el
(autoload 'canlock-insert-header "canlock" "\
@@ -3065,7 +3070,7 @@ it fails.
;;;***
;;;### (autoloads nil "cc-engine" "progmodes/cc-engine.el" (21743
-;;;;;; 12185 601417 366000))
+;;;;;; 190 195328 729000))
;;; Generated autoloads from progmodes/cc-engine.el
(autoload 'c-guess-basic-syntax "cc-engine" "\
@@ -3075,8 +3080,8 @@ Return the syntactic context of the current line.
;;;***
-;;;### (autoloads nil "cc-guess" "progmodes/cc-guess.el" (21678 60840
-;;;;;; 249778 310000))
+;;;### (autoloads nil "cc-guess" "progmodes/cc-guess.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/cc-guess.el
(defvar c-guess-guessed-offsets-alist nil "\
@@ -3174,8 +3179,8 @@ the absolute file name of the file if STYLE-NAME is nil.
;;;***
-;;;### (autoloads nil "cc-mode" "progmodes/cc-mode.el" (21797 54705
-;;;;;; 112903 894000))
+;;;### (autoloads nil "cc-mode" "progmodes/cc-mode.el" (21814 50992
+;;;;;; 820503 761000))
;;; Generated autoloads from progmodes/cc-mode.el
(autoload 'c-initialize-cc-mode "cc-mode" "\
@@ -3332,8 +3337,8 @@ Key bindings:
;;;***
-;;;### (autoloads nil "cc-styles" "progmodes/cc-styles.el" (21678
-;;;;;; 60840 253778 470000))
+;;;### (autoloads nil "cc-styles" "progmodes/cc-styles.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/cc-styles.el
(autoload 'c-set-style "cc-styles" "\
@@ -3384,8 +3389,8 @@ and exists only for compatibility reasons.
;;;***
-;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (21678 60840
-;;;;;; 257778 629000))
+;;;### (autoloads nil "cc-vars" "progmodes/cc-vars.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/cc-vars.el
(put 'c-basic-offset 'safe-local-variable 'integerp)
(put 'c-backslash-column 'safe-local-variable 'integerp)
@@ -3393,8 +3398,8 @@ and exists only for compatibility reasons.
;;;***
-;;;### (autoloads nil "ccl" "international/ccl.el" (21684 3021 710224
-;;;;;; 877000))
+;;;### (autoloads nil "ccl" "international/ccl.el" (21682 23484 726747
+;;;;;; 991000))
;;; Generated autoloads from international/ccl.el
(autoload 'ccl-compile "ccl" "\
@@ -3687,8 +3692,8 @@ See the documentation of `define-ccl-program' for the detail of CCL program.
;;;***
-;;;### (autoloads nil "cconv" "emacs-lisp/cconv.el" (21715 51226
-;;;;;; 268496 513000))
+;;;### (autoloads nil "cconv" "emacs-lisp/cconv.el" (21716 41663
+;;;;;; 456033 27000))
;;; Generated autoloads from emacs-lisp/cconv.el
(autoload 'cconv-closure-convert "cconv" "\
@@ -3707,15 +3712,15 @@ Add the warnings that closure conversion would encounter.
;;;***
-;;;### (autoloads nil "cedet" "cedet/cedet.el" (21678 60839 333741
-;;;;;; 545000))
+;;;### (autoloads nil "cedet" "cedet/cedet.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from cedet/cedet.el
(push (purecopy '(cedet 2 0)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "cfengine" "progmodes/cfengine.el" (21694 48017
-;;;;;; 606102 36000))
+;;;### (autoloads nil "cfengine" "progmodes/cfengine.el" (21695 35516
+;;;;;; 595262 313000))
;;; Generated autoloads from progmodes/cfengine.el
(push (purecopy '(cfengine 1 3)) package--builtin-versions)
@@ -3744,15 +3749,15 @@ Choose `cfengine2-mode' or `cfengine3-mode' by buffer contents.
;;;***
-;;;### (autoloads nil "chart" "emacs-lisp/chart.el" (21678 60854
-;;;;;; 898345 827000))
+;;;### (autoloads nil "chart" "emacs-lisp/chart.el" (21679 47292
+;;;;;; 556033 759000))
;;; Generated autoloads from emacs-lisp/chart.el
(push (purecopy '(chart 0 2)) package--builtin-versions)
;;;***
;;;### (autoloads nil "check-declare" "emacs-lisp/check-declare.el"
-;;;;;; (21756 63737 822474 968000))
+;;;;;; (21826 50092 650494 96000))
;;; Generated autoloads from emacs-lisp/check-declare.el
(autoload 'check-declare-file "check-declare" "\
@@ -3769,8 +3774,8 @@ Returns non-nil if any false statements are found.
;;;***
-;;;### (autoloads nil "checkdoc" "emacs-lisp/checkdoc.el" (21778
-;;;;;; 65092 741003 198000))
+;;;### (autoloads nil "checkdoc" "emacs-lisp/checkdoc.el" (21779
+;;;;;; 56495 106033 935000))
;;; Generated autoloads from emacs-lisp/checkdoc.el
(push (purecopy '(checkdoc 0 6 2)) package--builtin-versions)
(put 'checkdoc-force-docstrings-flag 'safe-local-variable #'booleanp)
@@ -3970,8 +3975,8 @@ checking of documentation strings.
;;;***
-;;;### (autoloads nil "china-util" "language/china-util.el" (21678
-;;;;;; 60839 797760 191000))
+;;;### (autoloads nil "china-util" "language/china-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/china-util.el
(autoload 'decode-hz-region "china-util" "\
@@ -4008,8 +4013,8 @@ Encode the text in the current buffer to HZ.
;;;***
-;;;### (autoloads nil "chistory" "chistory.el" (21678 60839 401744
-;;;;;; 277000))
+;;;### (autoloads nil "chistory" "chistory.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from chistory.el
(autoload 'repeat-matching-complex-command "chistory" "\
@@ -4049,7 +4054,7 @@ and runs the normal hook `command-history-hook'.
;;;***
;;;### (autoloads nil "cl-indent" "emacs-lisp/cl-indent.el" (21765
-;;;;;; 52461 376136 680000))
+;;;;;; 23600 805241 145000))
;;; Generated autoloads from emacs-lisp/cl-indent.el
(autoload 'common-lisp-indent-function "cl-indent" "\
@@ -4132,8 +4137,8 @@ instead.
;;;***
-;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (21799 24999
-;;;;;; 410026 774000))
+;;;### (autoloads nil "cl-lib" "emacs-lisp/cl-lib.el" (21799 41766
+;;;;;; 961230 875000))
;;; Generated autoloads from emacs-lisp/cl-lib.el
(push (purecopy '(cl-lib 1 0)) package--builtin-versions)
@@ -4151,8 +4156,8 @@ a future Emacs interpreter will be able to use it.")
;;;***
-;;;### (autoloads nil "cmacexp" "progmodes/cmacexp.el" (21678 60840
-;;;;;; 257778 629000))
+;;;### (autoloads nil "cmacexp" "progmodes/cmacexp.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/cmacexp.el
(autoload 'c-macro-expand "cmacexp" "\
@@ -4172,8 +4177,8 @@ For use inside Lisp programs, see also `c-macro-expansion'.
;;;***
-;;;### (autoloads nil "cmuscheme" "cmuscheme.el" (21678 60839 401744
-;;;;;; 277000))
+;;;### (autoloads nil "cmuscheme" "cmuscheme.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from cmuscheme.el
(autoload 'run-scheme "cmuscheme" "\
@@ -4193,7 +4198,7 @@ is run).
;;;***
-;;;### (autoloads nil "color" "color.el" (21678 60839 401744 277000))
+;;;### (autoloads nil "color" "color.el" (21670 32330 885624 725000))
;;; Generated autoloads from color.el
(autoload 'color-name-to-rgb "color" "\
@@ -4212,7 +4217,7 @@ If FRAME cannot display COLOR, return nil.
;;;***
-;;;### (autoloads nil "comint" "comint.el" (21798 37607 346141 281000))
+;;;### (autoloads nil "comint" "comint.el" (21810 12071 401207 648000))
;;; Generated autoloads from comint.el
(defvar comint-output-filter-functions '(ansi-color-process-output comint-postoutput-scroll-to-bottom comint-watch-for-password-prompt) "\
@@ -4313,8 +4318,8 @@ REGEXP-GROUP is the regular expression group in REGEXP to use.
;;;***
-;;;### (autoloads nil "compare-w" "vc/compare-w.el" (21678 60840
-;;;;;; 513788 871000))
+;;;### (autoloads nil "compare-w" "vc/compare-w.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/compare-w.el
(autoload 'compare-windows "compare-w" "\
@@ -4350,8 +4355,8 @@ on third call it again advances points to the next difference and so on.
;;;***
-;;;### (autoloads nil "compile" "progmodes/compile.el" (21798 37675
-;;;;;; 396889 196000))
+;;;### (autoloads nil "compile" "progmodes/compile.el" (21798 49947
+;;;;;; 262665 54000))
;;; Generated autoloads from progmodes/compile.el
(defvar compilation-mode-hook nil "\
@@ -4532,8 +4537,8 @@ This is the value of `next-error-function' in Compilation buffers.
;;;***
-;;;### (autoloads nil "completion" "completion.el" (21803 61751 249342
-;;;;;; 464000))
+;;;### (autoloads nil "completion" "completion.el" (21804 59688 154807
+;;;;;; 989000))
;;; Generated autoloads from completion.el
(defvar dynamic-completion-mode nil "\
@@ -4555,8 +4560,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "conf-mode" "textmodes/conf-mode.el" (21678
-;;;;;; 60840 445786 150000))
+;;;### (autoloads nil "conf-mode" "textmodes/conf-mode.el" (21670
+;;;;;; 32331 885635 586000))
;;; Generated autoloads from textmodes/conf-mode.el
(autoload 'conf-mode "conf-mode" "\
@@ -4711,8 +4716,8 @@ For details see `conf-mode'. Example:
;;;***
-;;;### (autoloads nil "cookie1" "play/cookie1.el" (21678 60840 197776
-;;;;;; 230000))
+;;;### (autoloads nil "cookie1" "play/cookie1.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/cookie1.el
(autoload 'cookie "cookie1" "\
@@ -4740,8 +4745,8 @@ and subsequent calls on the same file won't go to disk.
;;;***
-;;;### (autoloads nil "copyright" "emacs-lisp/copyright.el" (21678
-;;;;;; 60839 461746 688000))
+;;;### (autoloads nil "copyright" "emacs-lisp/copyright.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/copyright.el
(put 'copyright-at-end-flag 'safe-local-variable 'booleanp)
(put 'copyright-names-regexp 'safe-local-variable 'stringp)
@@ -4779,8 +4784,8 @@ If FIX is non-nil, run `copyright-fix-years' instead.
;;;***
-;;;### (autoloads nil "cperl-mode" "progmodes/cperl-mode.el" (21772
-;;;;;; 3649 129589 390000))
+;;;### (autoloads nil "cperl-mode" "progmodes/cperl-mode.el" (21771
+;;;;;; 62389 36768 739000))
;;; Generated autoloads from progmodes/cperl-mode.el
(put 'cperl-indent-level 'safe-local-variable 'integerp)
(put 'cperl-brace-offset 'safe-local-variable 'integerp)
@@ -4978,8 +4983,8 @@ Run a `perldoc' on the word around point.
;;;***
-;;;### (autoloads nil "cpp" "progmodes/cpp.el" (21678 60840 269779
-;;;;;; 110000))
+;;;### (autoloads nil "cpp" "progmodes/cpp.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from progmodes/cpp.el
(autoload 'cpp-highlight-buffer "cpp" "\
@@ -4997,8 +5002,8 @@ Edit display information for cpp conditionals.
;;;***
-;;;### (autoloads nil "crm" "emacs-lisp/crm.el" (21678 60839 461746
-;;;;;; 688000))
+;;;### (autoloads nil "crm" "emacs-lisp/crm.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/crm.el
(autoload 'completing-read-multiple "crm" "\
@@ -5024,8 +5029,8 @@ with empty strings removed.
;;;***
-;;;### (autoloads nil "css-mode" "textmodes/css-mode.el" (21799 19718
-;;;;;; 378236 623000))
+;;;### (autoloads nil "css-mode" "textmodes/css-mode.el" (21811 32939
+;;;;;; 200500 777000))
;;; Generated autoloads from textmodes/css-mode.el
(autoload 'css-mode "css-mode" "\
@@ -5041,8 +5046,8 @@ Major mode to edit \"Sassy CSS\" files.
;;;***
-;;;### (autoloads nil "cua-base" "emulation/cua-base.el" (21804 3763
-;;;;;; 202437 529000))
+;;;### (autoloads nil "cua-base" "emulation/cua-base.el" (21826 50080
+;;;;;; 561727 536000))
;;; Generated autoloads from emulation/cua-base.el
(defvar cua-mode nil "\
@@ -5087,8 +5092,8 @@ Enable CUA selection mode without the C-z/C-x/C-c/C-v bindings.
;;;***
-;;;### (autoloads nil "cua-rect" "emulation/cua-rect.el" (21678 60839
-;;;;;; 501748 296000))
+;;;### (autoloads nil "cua-rect" "emulation/cua-rect.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emulation/cua-rect.el
(autoload 'cua-rectangle-mark-mode "cua-rect" "\
@@ -5099,8 +5104,29 @@ Activates the region if needed. Only lasts until the region is deactivated.
;;;***
-;;;### (autoloads nil "cus-edit" "cus-edit.el" (21803 61751 249342
-;;;;;; 464000))
+;;;### (autoloads nil "cursor-sensor" "emacs-lisp/cursor-sensor.el"
+;;;;;; (21804 59688 154807 989000))
+;;; Generated autoloads from emacs-lisp/cursor-sensor.el
+
+(autoload 'cursor-intangible-mode "cursor-sensor" "\
+Keep cursor outside of any `cursor-intangible' text property.
+
+\(fn &optional ARG)" t nil)
+
+(autoload 'cursor-sensor-mode "cursor-sensor" "\
+Handle the `cursor-sensor-functions' text property.
+This property should hold a list of functions which react to the motion
+of the cursor. They're called with three arguments (WINDOW OLDPOS DIR)
+where WINDOW is the affected window, OLDPOS is the last known position of
+the cursor and DIR can be `left' or `entered' depending on whether the cursor is
+entering the area covered by the text-property property or leaving it.
+
+\(fn &optional ARG)" t nil)
+
+;;;***
+
+;;;### (autoloads nil "cus-edit" "cus-edit.el" (21815 59890 571208
+;;;;;; 933000))
;;; Generated autoloads from cus-edit.el
(defvar custom-browse-sort-alphabetically nil "\
@@ -5419,8 +5445,8 @@ The format is suitable for use with `easy-menu-define'.
;;;***
-;;;### (autoloads nil "cus-theme" "cus-theme.el" (21678 60839 413744
-;;;;;; 759000))
+;;;### (autoloads nil "cus-theme" "cus-theme.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from cus-theme.el
(autoload 'customize-create-theme "cus-theme" "\
@@ -5453,8 +5479,8 @@ omitted, a buffer named *Custom Themes* is used.
;;;***
-;;;### (autoloads nil "cvs-status" "vc/cvs-status.el" (21678 60840
-;;;;;; 513788 871000))
+;;;### (autoloads nil "cvs-status" "vc/cvs-status.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/cvs-status.el
(autoload 'cvs-status-mode "cvs-status" "\
@@ -5464,8 +5490,8 @@ Mode used for cvs status output.
;;;***
-;;;### (autoloads nil "cwarn" "progmodes/cwarn.el" (21678 60840 269779
-;;;;;; 110000))
+;;;### (autoloads nil "cwarn" "progmodes/cwarn.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from progmodes/cwarn.el
(push (purecopy '(cwarn 1 3 1)) package--builtin-versions)
@@ -5509,8 +5535,8 @@ See `cwarn-mode' for more information on Cwarn mode.
;;;***
-;;;### (autoloads nil "cyril-util" "language/cyril-util.el" (21678
-;;;;;; 60839 797760 191000))
+;;;### (autoloads nil "cyril-util" "language/cyril-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/cyril-util.el
(autoload 'cyrillic-encode-koi8-r-char "cyril-util" "\
@@ -5538,8 +5564,8 @@ If the argument is nil, we return the display table to its standard state.
;;;***
-;;;### (autoloads nil "dabbrev" "dabbrev.el" (21678 60839 417744
-;;;;;; 920000))
+;;;### (autoloads nil "dabbrev" "dabbrev.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from dabbrev.el
(put 'dabbrev-case-fold-search 'risky-local-variable t)
(put 'dabbrev-case-replace 'risky-local-variable t)
@@ -5585,8 +5611,8 @@ See also `dabbrev-abbrev-char-regexp' and \\[dabbrev-completion].
;;;***
-;;;### (autoloads nil "data-debug" "cedet/data-debug.el" (21678 60839
-;;;;;; 333741 545000))
+;;;### (autoloads nil "data-debug" "cedet/data-debug.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from cedet/data-debug.el
(autoload 'data-debug-new-buffer "data-debug" "\
@@ -5596,7 +5622,7 @@ Create a new data-debug buffer with NAME.
;;;***
-;;;### (autoloads nil "dbus" "net/dbus.el" (21799 25402 297856 218000))
+;;;### (autoloads nil "dbus" "net/dbus.el" (21799 41767 11212 472000))
;;; Generated autoloads from net/dbus.el
(autoload 'dbus-handle-event "dbus" "\
@@ -5609,8 +5635,8 @@ If the HANDLER returns a `dbus-error', it is propagated as return message.
;;;***
-;;;### (autoloads nil "dcl-mode" "progmodes/dcl-mode.el" (21678 60840
-;;;;;; 269779 110000))
+;;;### (autoloads nil "dcl-mode" "progmodes/dcl-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/dcl-mode.el
(autoload 'dcl-mode "dcl-mode" "\
@@ -5736,8 +5762,8 @@ There is some minimal font-lock support (see vars
;;;***
-;;;### (autoloads nil "debug" "emacs-lisp/debug.el" (21776 37118
-;;;;;; 308010 713000))
+;;;### (autoloads nil "debug" "emacs-lisp/debug.el" (21777 14770
+;;;;;; 397461 322000))
;;; Generated autoloads from emacs-lisp/debug.el
(setq debugger 'debug)
@@ -5780,8 +5806,8 @@ To specify a nil argument interactively, exit with an empty minibuffer.
;;;***
-;;;### (autoloads nil "decipher" "play/decipher.el" (21799 24401
-;;;;;; 570172 675000))
+;;;### (autoloads nil "decipher" "play/decipher.el" (21799 41767
+;;;;;; 31221 635000))
;;; Generated autoloads from play/decipher.el
(autoload 'decipher "decipher" "\
@@ -5809,8 +5835,8 @@ The most useful commands are:
;;;***
-;;;### (autoloads nil "delim-col" "delim-col.el" (21678 60839 417744
-;;;;;; 920000))
+;;;### (autoloads nil "delim-col" "delim-col.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from delim-col.el
(push (purecopy '(delim-col 2 1)) package--builtin-versions)
@@ -5835,7 +5861,7 @@ START and END delimits the corners of text rectangle.
;;;***
-;;;### (autoloads nil "delsel" "delsel.el" (21714 30294 262748 97000))
+;;;### (autoloads nil "delsel" "delsel.el" (21716 41663 456033 27000))
;;; Generated autoloads from delsel.el
(defalias 'pending-delete-mode 'delete-selection-mode)
@@ -5863,8 +5889,8 @@ point regardless of any selection.
;;;***
-;;;### (autoloads nil "derived" "emacs-lisp/derived.el" (21703 62119
-;;;;;; 434295 103000))
+;;;### (autoloads nil "derived" "emacs-lisp/derived.el" (21703 29629
+;;;;;; 608890 826000))
;;; Generated autoloads from emacs-lisp/derived.el
(autoload 'define-derived-mode "derived" "\
@@ -5932,8 +5958,8 @@ the first time the mode is used.
;;;***
-;;;### (autoloads nil "descr-text" "descr-text.el" (21694 48017 602102
-;;;;;; 111000))
+;;;### (autoloads nil "descr-text" "descr-text.el" (21695 35516 595262
+;;;;;; 313000))
;;; Generated autoloads from descr-text.el
(autoload 'describe-text-properties "descr-text" "\
@@ -5982,8 +6008,8 @@ This function is meant to be used as a value of
;;;***
-;;;### (autoloads nil "desktop" "desktop.el" (21799 25192 774103
-;;;;;; 976000))
+;;;### (autoloads nil "desktop" "desktop.el" (21799 41766 961230
+;;;;;; 875000))
;;; Generated autoloads from desktop.el
(defvar desktop-save-mode nil "\
@@ -6188,8 +6214,8 @@ Revert to the last loaded desktop.
;;;***
-;;;### (autoloads nil "deuglify" "gnus/deuglify.el" (21797 54705
-;;;;;; 36905 533000))
+;;;### (autoloads nil "deuglify" "gnus/deuglify.el" (21795 44704
+;;;;;; 920702 722000))
;;; Generated autoloads from gnus/deuglify.el
(autoload 'gnus-article-outlook-unwrap-lines "deuglify" "\
@@ -6221,8 +6247,8 @@ Deuglify broken Outlook (Express) articles and redisplay.
;;;***
-;;;### (autoloads nil "diary-lib" "calendar/diary-lib.el" (21678
-;;;;;; 60839 317740 902000))
+;;;### (autoloads nil "diary-lib" "calendar/diary-lib.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from calendar/diary-lib.el
(autoload 'diary "diary-lib" "\
@@ -6264,10 +6290,10 @@ Major mode for editing the diary file.
;;;***
-;;;### (autoloads nil "diff" "vc/diff.el" (21678 60840 517789 31000))
+;;;### (autoloads nil "diff" "vc/diff.el" (21804 59688 284811 0))
;;; Generated autoloads from vc/diff.el
-(defvar diff-switches (purecopy "-c") "\
+(defvar diff-switches (purecopy "-u") "\
A string or list of strings specifying switches to be passed to diff.")
(custom-autoload 'diff-switches "diff" t)
@@ -6312,8 +6338,8 @@ This requires the external program `diff' to be in your `exec-path'.
;;;***
-;;;### (autoloads nil "diff-mode" "vc/diff-mode.el" (21797 55597
-;;;;;; 620753 991000))
+;;;### (autoloads nil "diff-mode" "vc/diff-mode.el" (21798 20907
+;;;;;; 11218 42000))
;;; Generated autoloads from vc/diff-mode.el
(autoload 'diff-mode "diff-mode" "\
@@ -6345,7 +6371,7 @@ the mode if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "dig" "net/dig.el" (21678 60839 961766 782000))
+;;;### (autoloads nil "dig" "net/dig.el" (21670 32331 385639 720000))
;;; Generated autoloads from net/dig.el
(autoload 'dig "dig" "\
@@ -6356,7 +6382,7 @@ Optional arguments are passed to `dig-invoke'.
;;;***
-;;;### (autoloads nil "dired" "dired.el" (21757 49303 481943 552000))
+;;;### (autoloads nil "dired" "dired.el" (21757 29489 158925 687000))
;;; Generated autoloads from dired.el
(defvar dired-listing-switches (purecopy "-al") "\
@@ -6476,8 +6502,8 @@ Keybindings:
;;;***
-;;;### (autoloads nil "dirtrack" "dirtrack.el" (21678 60839 429745
-;;;;;; 402000))
+;;;### (autoloads nil "dirtrack" "dirtrack.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from dirtrack.el
(autoload 'dirtrack-mode "dirtrack" "\
@@ -6507,8 +6533,8 @@ from `default-directory'.
;;;***
-;;;### (autoloads nil "disass" "emacs-lisp/disass.el" (21678 60839
-;;;;;; 461746 688000))
+;;;### (autoloads nil "disass" "emacs-lisp/disass.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/disass.el
(autoload 'disassemble "disass" "\
@@ -6522,8 +6548,8 @@ redefine OBJECT if it is a symbol.
;;;***
-;;;### (autoloads nil "disp-table" "disp-table.el" (21678 60839 429745
-;;;;;; 402000))
+;;;### (autoloads nil "disp-table" "disp-table.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from disp-table.el
(autoload 'make-display-table "disp-table" "\
@@ -6644,8 +6670,8 @@ in `.emacs'.
;;;***
-;;;### (autoloads nil "dissociate" "play/dissociate.el" (21678 60840
-;;;;;; 197776 230000))
+;;;### (autoloads nil "dissociate" "play/dissociate.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from play/dissociate.el
(autoload 'dissociated-press "dissociate" "\
@@ -6661,7 +6687,7 @@ Default is 2.
;;;***
-;;;### (autoloads nil "dnd" "dnd.el" (21678 60839 429745 402000))
+;;;### (autoloads nil "dnd" "dnd.el" (21670 32330 885624 725000))
;;; Generated autoloads from dnd.el
(defvar dnd-protocol-alist `((,(purecopy "^file:///") . dnd-open-local-file) (,(purecopy "^file://") . dnd-open-file) (,(purecopy "^file:") . dnd-open-local-file) (,(purecopy "^\\(https?\\|ftp\\|file\\|nfs\\)://") . dnd-open-file)) "\
@@ -6681,8 +6707,8 @@ if some action was made, or nil if the URL is ignored.")
;;;***
-;;;### (autoloads nil "dns-mode" "textmodes/dns-mode.el" (21678 60840
-;;;;;; 449786 311000))
+;;;### (autoloads nil "dns-mode" "textmodes/dns-mode.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from textmodes/dns-mode.el
(autoload 'dns-mode "dns-mode" "\
@@ -6705,8 +6731,8 @@ Locate SOA record and increment the serial field.
;;;***
-;;;### (autoloads nil "doc-view" "doc-view.el" (21718 7576 270960
-;;;;;; 954000))
+;;;### (autoloads nil "doc-view" "doc-view.el" (21716 41663 456033
+;;;;;; 27000))
;;; Generated autoloads from doc-view.el
(autoload 'doc-view-mode-p "doc-view" "\
@@ -6752,8 +6778,8 @@ See the command `doc-view-mode' for more information on this mode.
;;;***
-;;;### (autoloads nil "doctor" "play/doctor.el" (21678 60840 201776
-;;;;;; 390000))
+;;;### (autoloads nil "doctor" "play/doctor.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/doctor.el
(autoload 'doctor "doctor" "\
@@ -6763,7 +6789,7 @@ Switch to *doctor* buffer and start giving psychotherapy.
;;;***
-;;;### (autoloads nil "double" "double.el" (21678 60839 433745 563000))
+;;;### (autoloads nil "double" "double.el" (21670 32330 885624 725000))
;;; Generated autoloads from double.el
(autoload 'double-mode "double" "\
@@ -6779,8 +6805,8 @@ strings when pressed twice. See `double-map' for details.
;;;***
-;;;### (autoloads nil "dunnet" "play/dunnet.el" (21678 60840 201776
-;;;;;; 390000))
+;;;### (autoloads nil "dunnet" "play/dunnet.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/dunnet.el
(push (purecopy '(dunnet 2 1)) package--builtin-versions)
@@ -6792,7 +6818,7 @@ Switch to *dungeon* buffer and start game.
;;;***
;;;### (autoloads nil "easy-mmode" "emacs-lisp/easy-mmode.el" (21732
-;;;;;; 38826 390629 134000))
+;;;;;; 29888 498897 471000))
;;; Generated autoloads from emacs-lisp/easy-mmode.el
(defalias 'easy-mmode-define-minor-mode 'define-minor-mode)
@@ -6936,8 +6962,8 @@ CSS contains a list of syntax specifications of the form (CHAR . SYNTAX).
;;;***
-;;;### (autoloads nil "easymenu" "emacs-lisp/easymenu.el" (21678
-;;;;;; 60839 461746 688000))
+;;;### (autoloads nil "easymenu" "emacs-lisp/easymenu.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/easymenu.el
(autoload 'easy-menu-define "easymenu" "\
@@ -7075,8 +7101,8 @@ To implement dynamic menus, either call this from
;;;***
-;;;### (autoloads nil "ebnf2ps" "progmodes/ebnf2ps.el" (21678 60840
-;;;;;; 277779 430000))
+;;;### (autoloads nil "ebnf2ps" "progmodes/ebnf2ps.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/ebnf2ps.el
(push (purecopy '(ebnf2ps 4 4)) package--builtin-versions)
@@ -7341,8 +7367,8 @@ See `ebnf-style-database' documentation.
;;;***
-;;;### (autoloads nil "ebrowse" "progmodes/ebrowse.el" (21678 60840
-;;;;;; 281779 590000))
+;;;### (autoloads nil "ebrowse" "progmodes/ebrowse.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/ebrowse.el
(autoload 'ebrowse-tree-mode "ebrowse" "\
@@ -7490,8 +7516,8 @@ Display statistics for a class tree.
;;;***
-;;;### (autoloads nil "ebuff-menu" "ebuff-menu.el" (21678 60839 433745
-;;;;;; 563000))
+;;;### (autoloads nil "ebuff-menu" "ebuff-menu.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from ebuff-menu.el
(autoload 'electric-buffer-list "ebuff-menu" "\
@@ -7523,8 +7549,8 @@ Run hooks in `electric-buffer-menu-mode-hook' on entry.
;;;***
-;;;### (autoloads nil "echistory" "echistory.el" (21678 60839 433745
-;;;;;; 563000))
+;;;### (autoloads nil "echistory" "echistory.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from echistory.el
(autoload 'Electric-command-history-redo-expression "echistory" "\
@@ -7535,8 +7561,8 @@ With prefix arg NOCONFIRM, execute current line as-is without editing.
;;;***
-;;;### (autoloads nil "ecomplete" "gnus/ecomplete.el" (21678 60839
-;;;;;; 625753 279000))
+;;;### (autoloads nil "ecomplete" "gnus/ecomplete.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/ecomplete.el
(autoload 'ecomplete-setup "ecomplete" "\
@@ -7546,7 +7572,7 @@ With prefix arg NOCONFIRM, execute current line as-is without editing.
;;;***
-;;;### (autoloads nil "ede" "cedet/ede.el" (21714 11434 472202 812000))
+;;;### (autoloads nil "ede" "cedet/ede.el" (21715 20800 626041 761000))
;;; Generated autoloads from cedet/ede.el
(push (purecopy '(ede 1 2)) package--builtin-versions)
@@ -7572,8 +7598,8 @@ an EDE controlled project.
;;;***
-;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (21803 61751
-;;;;;; 261341 967000))
+;;;### (autoloads nil "edebug" "emacs-lisp/edebug.el" (21803 38822
+;;;;;; 934065 207000))
;;; Generated autoloads from emacs-lisp/edebug.el
(defvar edebug-all-defs nil "\
@@ -7637,7 +7663,7 @@ Toggle edebugging of all forms.
;;;***
-;;;### (autoloads nil "ediff" "vc/ediff.el" (21678 60840 529789 511000))
+;;;### (autoloads nil "ediff" "vc/ediff.el" (21670 32331 885635 586000))
;;; Generated autoloads from vc/ediff.el
(push (purecopy '(ediff 2 81 4)) package--builtin-versions)
@@ -7909,8 +7935,8 @@ With optional NODE, goes to that node.
;;;***
-;;;### (autoloads nil "ediff-help" "vc/ediff-help.el" (21678 60840
-;;;;;; 517789 31000))
+;;;### (autoloads nil "ediff-help" "vc/ediff-help.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/ediff-help.el
(autoload 'ediff-customize "ediff-help" "\
@@ -7920,8 +7946,8 @@ With optional NODE, goes to that node.
;;;***
-;;;### (autoloads nil "ediff-mult" "vc/ediff-mult.el" (21678 60840
-;;;;;; 521789 190000))
+;;;### (autoloads nil "ediff-mult" "vc/ediff-mult.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/ediff-mult.el
(autoload 'ediff-show-registry "ediff-mult" "\
@@ -7933,8 +7959,8 @@ Display Ediff's registry.
;;;***
-;;;### (autoloads nil "ediff-util" "vc/ediff-util.el" (21678 60840
-;;;;;; 525789 351000))
+;;;### (autoloads nil "ediff-util" "vc/ediff-util.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/ediff-util.el
(autoload 'ediff-toggle-multiframe "ediff-util" "\
@@ -7953,8 +7979,8 @@ To change the default, set the variable `ediff-use-toolbar-p', which see.
;;;***
-;;;### (autoloads nil "edmacro" "edmacro.el" (21799 24401 550173
-;;;;;; 82000))
+;;;### (autoloads nil "edmacro" "edmacro.el" (21799 41766 961230
+;;;;;; 875000))
;;; Generated autoloads from edmacro.el
(push (purecopy '(edmacro 2 1)) package--builtin-versions)
@@ -8003,8 +8029,8 @@ or nil, use a compact 80-column format.
;;;***
-;;;### (autoloads nil "edt" "emulation/edt.el" (21678 60839 505748
-;;;;;; 457000))
+;;;### (autoloads nil "edt" "emulation/edt.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emulation/edt.el
(autoload 'edt-set-scroll-margins "edt" "\
@@ -8021,7 +8047,7 @@ Turn on EDT Emulation.
;;;***
-;;;### (autoloads nil "ehelp" "ehelp.el" (21678 60839 437745 724000))
+;;;### (autoloads nil "ehelp" "ehelp.el" (21670 32330 885624 725000))
;;; Generated autoloads from ehelp.el
(autoload 'with-electric-help "ehelp" "\
@@ -8057,15 +8083,15 @@ BUFFER is put back into its original major mode.
;;;***
-;;;### (autoloads nil "eieio" "emacs-lisp/eieio.el" (21803 61751
-;;;;;; 261341 967000))
+;;;### (autoloads nil "eieio" "emacs-lisp/eieio.el" (21803 38822
+;;;;;; 944058 719000))
;;; Generated autoloads from emacs-lisp/eieio.el
(push (purecopy '(eieio 1 4)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "eieio-core" "emacs-lisp/eieio-core.el" (21797
-;;;;;; 54704 984906 655000))
+;;;### (autoloads nil "eieio-core" "emacs-lisp/eieio-core.el" (21822
+;;;;;; 42786 590507 895000))
;;; Generated autoloads from emacs-lisp/eieio-core.el
(push (purecopy '(eieio-core 1 4)) package--builtin-versions)
@@ -8081,8 +8107,8 @@ It creates an autoload function for CNAME's constructor.
;;;***
-;;;### (autoloads nil "elec-pair" "elec-pair.el" (21783 27762 910046
-;;;;;; 655000))
+;;;### (autoloads nil "elec-pair" "elec-pair.el" (21811 32939 170488
+;;;;;; 968000))
;;; Generated autoloads from elec-pair.el
(defvar electric-pair-text-pairs '((34 . 34)) "\
@@ -8123,8 +8149,8 @@ Toggle `electric-pair-mode' only in this buffer.
;;;***
-;;;### (autoloads nil "elide-head" "elide-head.el" (21678 60839 437745
-;;;;;; 724000))
+;;;### (autoloads nil "elide-head" "elide-head.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from elide-head.el
(autoload 'elide-head "elide-head" "\
@@ -8139,8 +8165,8 @@ This is suitable as an entry on `find-file-hook' or appropriate mode hooks.
;;;***
-;;;### (autoloads nil "elint" "emacs-lisp/elint.el" (21678 60839
-;;;;;; 473747 171000))
+;;;### (autoloads nil "elint" "emacs-lisp/elint.el" (21814 9129 240503
+;;;;;; 291000))
;;; Generated autoloads from emacs-lisp/elint.el
(autoload 'elint-file "elint" "\
@@ -8175,8 +8201,8 @@ optional prefix argument REINIT is non-nil.
;;;***
-;;;### (autoloads nil "elp" "emacs-lisp/elp.el" (21678 60839 473747
-;;;;;; 171000))
+;;;### (autoloads nil "elp" "emacs-lisp/elp.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/elp.el
(autoload 'elp-instrument-function "elp" "\
@@ -8210,8 +8236,8 @@ displayed.
;;;***
-;;;### (autoloads nil "emacs-lock" "emacs-lock.el" (21678 60839 497748
-;;;;;; 135000))
+;;;### (autoloads nil "emacs-lock" "emacs-lock.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lock.el
(autoload 'emacs-lock-mode "emacs-lock" "\
@@ -8238,8 +8264,8 @@ Other values are interpreted as usual.
;;;***
-;;;### (autoloads nil "emacsbug" "mail/emacsbug.el" (21678 60839
-;;;;;; 869763 84000))
+;;;### (autoloads nil "emacsbug" "mail/emacsbug.el" (21814 9129 290493
+;;;;;; 495000))
;;; Generated autoloads from mail/emacsbug.el
(autoload 'report-emacs-bug "emacsbug" "\
@@ -8252,8 +8278,8 @@ Prompts for bug subject. Leaves you in a mail buffer.
;;;***
-;;;### (autoloads nil "emerge" "vc/emerge.el" (21605 26937 780008
-;;;;;; 15000))
+;;;### (autoloads nil "emerge" "vc/emerge.el" (21607 54478 800121
+;;;;;; 42000))
;;; Generated autoloads from vc/emerge.el
(autoload 'emerge-files "emerge" "\
@@ -8313,8 +8339,8 @@ Emerge two RCS revisions of a file, with another revision as ancestor.
;;;***
-;;;### (autoloads nil "enriched" "textmodes/enriched.el" (21690 51765
-;;;;;; 876519 934000))
+;;;### (autoloads nil "enriched" "textmodes/enriched.el" (21691 38459
+;;;;;; 74604 918000))
;;; Generated autoloads from textmodes/enriched.el
(autoload 'enriched-mode "enriched" "\
@@ -8349,7 +8375,7 @@ Commands:
;;;***
-;;;### (autoloads nil "epa" "epa.el" (21678 60839 517748 939000))
+;;;### (autoloads nil "epa" "epa.el" (21670 32330 885624 725000))
;;; Generated autoloads from epa.el
(autoload 'epa-list-keys "epa" "\
@@ -8537,8 +8563,8 @@ Insert selected KEYS after the point.
;;;***
-;;;### (autoloads nil "epa-dired" "epa-dired.el" (21678 60839 513748
-;;;;;; 778000))
+;;;### (autoloads nil "epa-dired" "epa-dired.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from epa-dired.el
(autoload 'epa-dired-do-decrypt "epa-dired" "\
@@ -8563,8 +8589,8 @@ Encrypt marked files.
;;;***
-;;;### (autoloads nil "epa-file" "epa-file.el" (21678 60839 517748
-;;;;;; 939000))
+;;;### (autoloads nil "epa-file" "epa-file.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from epa-file.el
(autoload 'epa-file-handler "epa-file" "\
@@ -8584,8 +8610,8 @@ Encrypt marked files.
;;;***
-;;;### (autoloads nil "epa-mail" "epa-mail.el" (21678 60839 517748
-;;;;;; 939000))
+;;;### (autoloads nil "epa-mail" "epa-mail.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from epa-mail.el
(autoload 'epa-mail-mode "epa-mail" "\
@@ -8662,7 +8688,7 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "epg" "epg.el" (21803 61751 269341 636000))
+;;;### (autoloads nil "epg" "epg.el" (21802 17960 412629 175000))
;;; Generated autoloads from epg.el
(push (purecopy '(epg 1 0 0)) package--builtin-versions)
@@ -8673,8 +8699,8 @@ Return a context object.
;;;***
-;;;### (autoloads nil "epg-config" "epg-config.el" (21678 60839 517748
-;;;;;; 939000))
+;;;### (autoloads nil "epg-config" "epg-config.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from epg-config.el
(autoload 'epg-configuration "epg-config" "\
@@ -8694,7 +8720,7 @@ Look at CONFIG and try to expand GROUP.
;;;***
-;;;### (autoloads nil "erc" "erc/erc.el" (21778 44895 439347 149000))
+;;;### (autoloads nil "erc" "erc/erc.el" (21779 56495 106033 935000))
;;; Generated autoloads from erc/erc.el
(push (purecopy '(erc 5 3)) package--builtin-versions)
@@ -8743,36 +8769,36 @@ Otherwise, connect to HOST:PORT as USER and /join CHANNEL.
;;;***
-;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (21678
-;;;;;; 60839 529749 421000))
+;;;### (autoloads nil "erc-autoaway" "erc/erc-autoaway.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-autoaway.el
(autoload 'erc-autoaway-mode "erc-autoaway")
;;;***
-;;;### (autoloads nil "erc-button" "erc/erc-button.el" (21678 60839
-;;;;;; 533749 582000))
+;;;### (autoloads nil "erc-button" "erc/erc-button.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-button.el
(autoload 'erc-button-mode "erc-button" nil t)
;;;***
-;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (21678 60839
-;;;;;; 533749 582000))
+;;;### (autoloads nil "erc-capab" "erc/erc-capab.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-capab.el
(autoload 'erc-capab-identify-mode "erc-capab" nil t)
;;;***
-;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (21678 60839
-;;;;;; 533749 582000))
+;;;### (autoloads nil "erc-compat" "erc/erc-compat.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-compat.el
(autoload 'erc-define-minor-mode "erc-compat")
;;;***
-;;;### (autoloads nil "erc-dcc" "erc/erc-dcc.el" (21697 290 520850
-;;;;;; 834000))
+;;;### (autoloads nil "erc-dcc" "erc/erc-dcc.el" (21696 56380 925320
+;;;;;; 624000))
;;; Generated autoloads from erc/erc-dcc.el
(autoload 'erc-dcc-mode "erc-dcc")
@@ -8802,14 +8828,14 @@ that subcommand.
;;;***
;;;### (autoloads nil "erc-desktop-notifications" "erc/erc-desktop-notifications.el"
-;;;;;; (21678 60839 533749 582000))
+;;;;;; (21670 32330 885624 725000))
;;; Generated autoloads from erc/erc-desktop-notifications.el
(autoload 'erc-notifications-mode "erc-desktop-notifications" "" t)
;;;***
-;;;### (autoloads nil "erc-ezbounce" "erc/erc-ezbounce.el" (21678
-;;;;;; 60839 533749 582000))
+;;;### (autoloads nil "erc-ezbounce" "erc/erc-ezbounce.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-ezbounce.el
(autoload 'erc-cmd-ezb "erc-ezbounce" "\
@@ -8871,8 +8897,8 @@ Add EZBouncer convenience functions to ERC.
;;;***
-;;;### (autoloads nil "erc-fill" "erc/erc-fill.el" (21678 60839 533749
-;;;;;; 582000))
+;;;### (autoloads nil "erc-fill" "erc/erc-fill.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-fill.el
(autoload 'erc-fill-mode "erc-fill" nil t)
@@ -8884,8 +8910,8 @@ You can put this on `erc-insert-modify-hook' and/or `erc-send-modify-hook'.
;;;***
-;;;### (autoloads nil "erc-identd" "erc/erc-identd.el" (21678 60839
-;;;;;; 537749 742000))
+;;;### (autoloads nil "erc-identd" "erc/erc-identd.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-identd.el
(autoload 'erc-identd-mode "erc-identd")
@@ -8906,8 +8932,8 @@ system.
;;;***
-;;;### (autoloads nil "erc-imenu" "erc/erc-imenu.el" (21678 60839
-;;;;;; 537749 742000))
+;;;### (autoloads nil "erc-imenu" "erc/erc-imenu.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-imenu.el
(autoload 'erc-create-imenu-index "erc-imenu" "\
@@ -8917,22 +8943,22 @@ system.
;;;***
-;;;### (autoloads nil "erc-join" "erc/erc-join.el" (21678 60839 537749
-;;;;;; 742000))
+;;;### (autoloads nil "erc-join" "erc/erc-join.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-join.el
(autoload 'erc-autojoin-mode "erc-join" nil t)
;;;***
-;;;### (autoloads nil "erc-list" "erc/erc-list.el" (21678 60839 537749
-;;;;;; 742000))
+;;;### (autoloads nil "erc-list" "erc/erc-list.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-list.el
(autoload 'erc-list-mode "erc-list")
;;;***
-;;;### (autoloads nil "erc-log" "erc/erc-log.el" (21678 60839 537749
-;;;;;; 742000))
+;;;### (autoloads nil "erc-log" "erc/erc-log.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-log.el
(autoload 'erc-log-mode "erc-log" nil t)
@@ -8961,8 +8987,8 @@ You can save every individual message by putting this function on
;;;***
-;;;### (autoloads nil "erc-match" "erc/erc-match.el" (21678 60839
-;;;;;; 537749 742000))
+;;;### (autoloads nil "erc-match" "erc/erc-match.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-match.el
(autoload 'erc-match-mode "erc-match")
@@ -9008,15 +9034,15 @@ Delete dangerous-host interactively to `erc-dangerous-hosts'.
;;;***
-;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (21678 60839 537749
-;;;;;; 742000))
+;;;### (autoloads nil "erc-menu" "erc/erc-menu.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-menu.el
(autoload 'erc-menu-mode "erc-menu" nil t)
;;;***
-;;;### (autoloads nil "erc-netsplit" "erc/erc-netsplit.el" (21678
-;;;;;; 60839 537749 742000))
+;;;### (autoloads nil "erc-netsplit" "erc/erc-netsplit.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-netsplit.el
(autoload 'erc-netsplit-mode "erc-netsplit")
@@ -9027,8 +9053,8 @@ Show who's gone.
;;;***
-;;;### (autoloads nil "erc-networks" "erc/erc-networks.el" (21678
-;;;;;; 60839 541749 903000))
+;;;### (autoloads nil "erc-networks" "erc/erc-networks.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-networks.el
(autoload 'erc-determine-network "erc-networks" "\
@@ -9045,8 +9071,8 @@ Interactively select a server to connect to using `erc-server-alist'.
;;;***
-;;;### (autoloads nil "erc-notify" "erc/erc-notify.el" (21678 60839
-;;;;;; 541749 903000))
+;;;### (autoloads nil "erc-notify" "erc/erc-notify.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-notify.el
(autoload 'erc-notify-mode "erc-notify" nil t)
@@ -9064,36 +9090,36 @@ with args, toggle notify status of people.
;;;***
-;;;### (autoloads nil "erc-page" "erc/erc-page.el" (21678 60839 541749
-;;;;;; 903000))
+;;;### (autoloads nil "erc-page" "erc/erc-page.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-page.el
(autoload 'erc-page-mode "erc-page")
;;;***
-;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (21804
-;;;;;; 3763 202437 529000))
+;;;### (autoloads nil "erc-pcomplete" "erc/erc-pcomplete.el" (21808
+;;;;;; 56742 451927 765000))
;;; Generated autoloads from erc/erc-pcomplete.el
(autoload 'erc-completion-mode "erc-pcomplete" nil t)
;;;***
-;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (21678 60839
-;;;;;; 541749 903000))
+;;;### (autoloads nil "erc-replace" "erc/erc-replace.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-replace.el
(autoload 'erc-replace-mode "erc-replace")
;;;***
-;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (21678 60839 541749
-;;;;;; 903000))
+;;;### (autoloads nil "erc-ring" "erc/erc-ring.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-ring.el
(autoload 'erc-ring-mode "erc-ring" nil t)
;;;***
-;;;### (autoloads nil "erc-services" "erc/erc-services.el" (21678
-;;;;;; 60839 541749 903000))
+;;;### (autoloads nil "erc-services" "erc/erc-services.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-services.el
(autoload 'erc-services-mode "erc-services" nil t)
@@ -9110,15 +9136,15 @@ When called interactively, read the password using `read-passwd'.
;;;***
-;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (21678 60839
-;;;;;; 541749 903000))
+;;;### (autoloads nil "erc-sound" "erc/erc-sound.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-sound.el
(autoload 'erc-sound-mode "erc-sound")
;;;***
-;;;### (autoloads nil "erc-speedbar" "erc/erc-speedbar.el" (21678
-;;;;;; 60839 541749 903000))
+;;;### (autoloads nil "erc-speedbar" "erc/erc-speedbar.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-speedbar.el
(autoload 'erc-speedbar-browser "erc-speedbar" "\
@@ -9130,21 +9156,21 @@ This will add a speedbar major display mode.
;;;***
;;;### (autoloads nil "erc-spelling" "erc/erc-spelling.el" (21727
-;;;;;; 22885 681250 112000))
+;;;;;; 11963 635339 992000))
;;; Generated autoloads from erc/erc-spelling.el
(autoload 'erc-spelling-mode "erc-spelling" nil t)
;;;***
-;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (21804 4012
-;;;;;; 674064 262000))
+;;;### (autoloads nil "erc-stamp" "erc/erc-stamp.el" (21804 59688
+;;;;;; 164807 902000))
;;; Generated autoloads from erc/erc-stamp.el
(autoload 'erc-timestamp-mode "erc-stamp" nil t)
;;;***
-;;;### (autoloads nil "erc-track" "erc/erc-track.el" (21678 60839
-;;;;;; 541749 903000))
+;;;### (autoloads nil "erc-track" "erc/erc-track.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from erc/erc-track.el
(defvar erc-track-minor-mode nil "\
@@ -9169,8 +9195,8 @@ keybindings will not do anything useful.
;;;***
-;;;### (autoloads nil "erc-truncate" "erc/erc-truncate.el" (21678
-;;;;;; 60839 545750 64000))
+;;;### (autoloads nil "erc-truncate" "erc/erc-truncate.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from erc/erc-truncate.el
(autoload 'erc-truncate-mode "erc-truncate" nil t)
@@ -9189,8 +9215,8 @@ Meant to be used in hooks, like `erc-insert-post-hook'.
;;;***
-;;;### (autoloads nil "erc-xdcc" "erc/erc-xdcc.el" (21678 60839 545750
-;;;;;; 64000))
+;;;### (autoloads nil "erc-xdcc" "erc/erc-xdcc.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from erc/erc-xdcc.el
(autoload 'erc-xdcc-mode "erc-xdcc")
@@ -9201,8 +9227,8 @@ Add a file to `erc-xdcc-files'.
;;;***
-;;;### (autoloads nil "ert" "emacs-lisp/ert.el" (21678 60839 477747
-;;;;;; 331000))
+;;;### (autoloads nil "ert" "emacs-lisp/ert.el" (21826 54340 400495
+;;;;;; 677000))
;;; Generated autoloads from emacs-lisp/ert.el
(autoload 'ert-deftest "ert" "\
@@ -9271,8 +9297,8 @@ Display the documentation for TEST-OR-TEST-NAME (a symbol or ert-test).
;;;***
-;;;### (autoloads nil "ert-x" "emacs-lisp/ert-x.el" (21678 60839
-;;;;;; 473747 171000))
+;;;### (autoloads nil "ert-x" "emacs-lisp/ert-x.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/ert-x.el
(put 'ert-with-test-buffer 'lisp-indent-function 1)
@@ -9284,8 +9310,8 @@ Kill all test buffers that are still live.
;;;***
-;;;### (autoloads nil "esh-mode" "eshell/esh-mode.el" (21767 20340
-;;;;;; 938139 905000))
+;;;### (autoloads nil "esh-mode" "eshell/esh-mode.el" (21812 53800
+;;;;;; 114093 251000))
;;; Generated autoloads from eshell/esh-mode.el
(autoload 'eshell-mode "esh-mode" "\
@@ -9295,8 +9321,8 @@ Emacs shell interactive mode.
;;;***
-;;;### (autoloads nil "eshell" "eshell/eshell.el" (21678 60839 561750
-;;;;;; 707000))
+;;;### (autoloads nil "eshell" "eshell/eshell.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from eshell/eshell.el
(push (purecopy '(eshell 2 4 2)) package--builtin-versions)
@@ -9331,8 +9357,8 @@ corresponding to a successful execution.
;;;***
-;;;### (autoloads nil "etags" "progmodes/etags.el" (21697 290 536850
-;;;;;; 376000))
+;;;### (autoloads nil "etags" "progmodes/etags.el" (21826 300 610486
+;;;;;; 122000))
;;; Generated autoloads from progmodes/etags.el
(defvar tags-file-name nil "\
@@ -9647,8 +9673,8 @@ for \\[find-tag] (which see).
;;;***
-;;;### (autoloads nil "ethio-util" "language/ethio-util.el" (21678
-;;;;;; 60839 797760 191000))
+;;;### (autoloads nil "ethio-util" "language/ethio-util.el" (21824
+;;;;;; 5851 711914 99000))
;;; Generated autoloads from language/ethio-util.el
(autoload 'setup-ethiopic-environment-internal "ethio-util" "\
@@ -9816,7 +9842,7 @@ With ARG, insert that many delimiters.
;;;***
-;;;### (autoloads nil "eudc" "net/eudc.el" (21799 24829 185482 342000))
+;;;### (autoloads nil "eudc" "net/eudc.el" (21799 41767 21224 988000))
;;; Generated autoloads from net/eudc.el
(autoload 'eudc-set-server "eudc" "\
@@ -9870,8 +9896,8 @@ This does nothing except loading eudc by autoload side-effect.
;;;***
-;;;### (autoloads nil "eudc-bob" "net/eudc-bob.el" (21703 62119 462294
-;;;;;; 474000))
+;;;### (autoloads nil "eudc-bob" "net/eudc-bob.el" (21704 50495 455324
+;;;;;; 752000))
;;; Generated autoloads from net/eudc-bob.el
(autoload 'eudc-display-generic-binary "eudc-bob" "\
@@ -9906,8 +9932,8 @@ Display a button for the JPEG DATA.
;;;***
-;;;### (autoloads nil "eudc-export" "net/eudc-export.el" (21799 24730
-;;;;;; 583484 950000))
+;;;### (autoloads nil "eudc-export" "net/eudc-export.el" (21794 23865
+;;;;;; 772631 636000))
;;; Generated autoloads from net/eudc-export.el
(autoload 'eudc-insert-record-at-point-into-bbdb "eudc-export" "\
@@ -9923,8 +9949,8 @@ Call `eudc-insert-record-at-point-into-bbdb' if on a record.
;;;***
-;;;### (autoloads nil "eudc-hotlist" "net/eudc-hotlist.el" (21703
-;;;;;; 62119 462294 474000))
+;;;### (autoloads nil "eudc-hotlist" "net/eudc-hotlist.el" (21704
+;;;;;; 50495 455324 752000))
;;; Generated autoloads from net/eudc-hotlist.el
(autoload 'eudc-edit-hotlist "eudc-hotlist" "\
@@ -9934,8 +9960,8 @@ Edit the hotlist of directory servers in a specialized buffer.
;;;***
-;;;### (autoloads nil "ewoc" "emacs-lisp/ewoc.el" (21678 60839 477747
-;;;;;; 331000))
+;;;### (autoloads nil "ewoc" "emacs-lisp/ewoc.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/ewoc.el
(autoload 'ewoc-create "ewoc" "\
@@ -9961,7 +9987,7 @@ fourth arg NOSEP non-nil inhibits this.
;;;***
-;;;### (autoloads nil "eww" "net/eww.el" (21756 63737 898473 61000))
+;;;### (autoloads nil "eww" "net/eww.el" (21826 49851 770496 504000))
;;; Generated autoloads from net/eww.el
(defvar eww-suggest-uris '(eww-links-at-point url-get-url-at-point eww-current-url) "\
@@ -10008,8 +10034,8 @@ Display the bookmarks.
;;;***
-;;;### (autoloads nil "executable" "progmodes/executable.el" (21678
-;;;;;; 60840 285779 750000))
+;;;### (autoloads nil "executable" "progmodes/executable.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/executable.el
(autoload 'executable-command-find-posix-p "executable" "\
@@ -10050,7 +10076,7 @@ file modes.
;;;***
-;;;### (autoloads nil "expand" "expand.el" (21678 60839 561750 707000))
+;;;### (autoloads nil "expand" "expand.el" (21670 32330 885624 725000))
;;; Generated autoloads from expand.el
(autoload 'expand-add-abbrevs "expand" "\
@@ -10099,8 +10125,8 @@ This is used only in conjunction with `expand-add-abbrevs'.
;;;***
-;;;### (autoloads nil "f90" "progmodes/f90.el" (21741 10923 306579
-;;;;;; 600000))
+;;;### (autoloads nil "f90" "progmodes/f90.el" (21740 23998 526747
+;;;;;; 884000))
;;; Generated autoloads from progmodes/f90.el
(autoload 'f90-mode "f90" "\
@@ -10167,8 +10193,8 @@ with no args, if that value is non-nil.
;;;***
-;;;### (autoloads nil "face-remap" "face-remap.el" (21678 60839 561750
-;;;;;; 707000))
+;;;### (autoloads nil "face-remap" "face-remap.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from face-remap.el
(autoload 'face-remap-add-relative "face-remap" "\
@@ -10327,8 +10353,8 @@ Besides the choice of face, it is the same as `buffer-face-mode'.
;;;***
-;;;### (autoloads nil "feedmail" "mail/feedmail.el" (21605 26936
-;;;;;; 980023 383000))
+;;;### (autoloads nil "feedmail" "mail/feedmail.el" (21607 54478
+;;;;;; 300138 641000))
;;; Generated autoloads from mail/feedmail.el
(push (purecopy '(feedmail 11)) package--builtin-versions)
@@ -10382,7 +10408,7 @@ you can set `feedmail-queue-reminder-alist' to nil.
;;;***
-;;;### (autoloads nil "ffap" "ffap.el" (21797 54704 996906 396000))
+;;;### (autoloads nil "ffap" "ffap.el" (21797 36 690506 232000))
;;; Generated autoloads from ffap.el
(autoload 'ffap-next "ffap" "\
@@ -10445,8 +10471,8 @@ Evaluate the forms in variable `ffap-bindings'.
;;;***
-;;;### (autoloads nil "filecache" "filecache.el" (21741 10923 302579
-;;;;;; 694000))
+;;;### (autoloads nil "filecache" "filecache.el" (21740 23998 26747
+;;;;;; 125000))
;;; Generated autoloads from filecache.el
(autoload 'file-cache-add-directory "filecache" "\
@@ -10503,8 +10529,8 @@ the name is considered already unique; only the second substitution
;;;***
-;;;### (autoloads nil "filenotify" "filenotify.el" (21706 14224 249963
-;;;;;; 176000))
+;;;### (autoloads nil "filenotify" "filenotify.el" (21704 50495 455324
+;;;;;; 752000))
;;; Generated autoloads from filenotify.el
(autoload 'file-notify-handle-event "filenotify" "\
@@ -10519,8 +10545,8 @@ Otherwise, signal a `file-notify-error'.
;;;***
-;;;### (autoloads nil "files-x" "files-x.el" (21678 60839 569751
-;;;;;; 28000))
+;;;### (autoloads nil "files-x" "files-x.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from files-x.el
(autoload 'add-file-local-variable "files-x" "\
@@ -10585,8 +10611,8 @@ Copy directory-local variables to the -*- line.
;;;***
-;;;### (autoloads nil "filesets" "filesets.el" (21678 60839 577751
-;;;;;; 350000))
+;;;### (autoloads nil "filesets" "filesets.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from filesets.el
(autoload 'filesets-init "filesets" "\
@@ -10597,8 +10623,8 @@ Set up hooks, load the cache file -- if existing -- and build the menu.
;;;***
-;;;### (autoloads nil "find-cmd" "find-cmd.el" (21678 60839 577751
-;;;;;; 350000))
+;;;### (autoloads nil "find-cmd" "find-cmd.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from find-cmd.el
(push (purecopy '(find-cmd 0 6)) package--builtin-versions)
@@ -10618,8 +10644,8 @@ result is a string that should be ready for the command line.
;;;***
-;;;### (autoloads nil "find-dired" "find-dired.el" (21678 60839 577751
-;;;;;; 350000))
+;;;### (autoloads nil "find-dired" "find-dired.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from find-dired.el
(autoload 'find-dired "find-dired" "\
@@ -10659,8 +10685,8 @@ use in place of \"-ls\" as the final argument.
;;;***
-;;;### (autoloads nil "find-file" "find-file.el" (21678 60839 581751
-;;;;;; 511000))
+;;;### (autoloads nil "find-file" "find-file.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from find-file.el
(defvar ff-special-constructs `((,(purecopy "^#\\s *\\(include\\|import\\)\\s +[<\"]\\(.*\\)[>\"]") lambda nil (buffer-substring (match-beginning 2) (match-end 2)))) "\
@@ -10750,8 +10776,8 @@ Visit the file you click on in another window.
;;;***
-;;;### (autoloads nil "find-func" "emacs-lisp/find-func.el" (21701
-;;;;;; 12613 256523 949000))
+;;;### (autoloads nil "find-func" "emacs-lisp/find-func.el" (21700
+;;;;;; 53432 444919 658000))
;;; Generated autoloads from emacs-lisp/find-func.el
(autoload 'find-library "find-func" "\
@@ -10909,8 +10935,8 @@ Define some key bindings for the find-function family of functions.
;;;***
-;;;### (autoloads nil "find-lisp" "find-lisp.el" (21678 60839 581751
-;;;;;; 511000))
+;;;### (autoloads nil "find-lisp" "find-lisp.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from find-lisp.el
(autoload 'find-lisp-find-dired "find-lisp" "\
@@ -10930,7 +10956,7 @@ Change the filter on a `find-lisp-find-dired' buffer to REGEXP.
;;;***
-;;;### (autoloads nil "finder" "finder.el" (21678 60839 581751 511000))
+;;;### (autoloads nil "finder" "finder.el" (21670 32330 885624 725000))
;;; Generated autoloads from finder.el
(push (purecopy '(finder 1 0)) package--builtin-versions)
@@ -10952,8 +10978,8 @@ Find packages matching a given keyword.
;;;***
-;;;### (autoloads nil "flow-ctrl" "flow-ctrl.el" (21678 60839 581751
-;;;;;; 511000))
+;;;### (autoloads nil "flow-ctrl" "flow-ctrl.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from flow-ctrl.el
(autoload 'enable-flow-control "flow-ctrl" "\
@@ -10974,8 +11000,8 @@ to get the effect of a C-q.
;;;***
-;;;### (autoloads nil "flow-fill" "gnus/flow-fill.el" (21678 60839
-;;;;;; 625753 279000))
+;;;### (autoloads nil "flow-fill" "gnus/flow-fill.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/flow-fill.el
(autoload 'fill-flowed-encode "flow-fill" "\
@@ -10990,8 +11016,8 @@ to get the effect of a C-q.
;;;***
-;;;### (autoloads nil "flymake" "progmodes/flymake.el" (21678 60840
-;;;;;; 289779 910000))
+;;;### (autoloads nil "flymake" "progmodes/flymake.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/flymake.el
(push (purecopy '(flymake 0 3)) package--builtin-versions)
@@ -11021,8 +11047,8 @@ Turn flymake mode off.
;;;***
-;;;### (autoloads nil "flyspell" "textmodes/flyspell.el" (21756 63738
-;;;;;; 18470 49000))
+;;;### (autoloads nil "flyspell" "textmodes/flyspell.el" (21750 59840
+;;;;;; 704617 663000))
;;; Generated autoloads from textmodes/flyspell.el
(autoload 'flyspell-prog-mode "flyspell" "\
@@ -11092,14 +11118,14 @@ Flyspell whole buffer.
;;;***
-;;;### (autoloads nil "foldout" "foldout.el" (21678 60839 581751
-;;;;;; 511000))
+;;;### (autoloads nil "foldout" "foldout.el" (21824 11953 672190
+;;;;;; 35000))
;;; Generated autoloads from foldout.el
(push (purecopy '(foldout 1 10)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "follow" "follow.el" (21678 60839 581751 511000))
+;;;### (autoloads nil "follow" "follow.el" (21670 32330 885624 725000))
;;; Generated autoloads from follow.el
(autoload 'turn-on-follow-mode "follow" "\
@@ -11167,8 +11193,8 @@ selected if the original window is the first one in the frame.
;;;***
-;;;### (autoloads nil "footnote" "mail/footnote.el" (21799 24401
-;;;;;; 558172 920000))
+;;;### (autoloads nil "footnote" "mail/footnote.el" (21814 9129 310503
+;;;;;; 742000))
;;; Generated autoloads from mail/footnote.el
(push (purecopy '(footnote 0 19)) package--builtin-versions)
@@ -11187,7 +11213,7 @@ play around with the following keys:
;;;***
-;;;### (autoloads nil "forms" "forms.el" (21804 4012 674064 262000))
+;;;### (autoloads nil "forms" "forms.el" (21804 59688 164807 902000))
;;; Generated autoloads from forms.el
(autoload 'forms-mode "forms" "\
@@ -11223,8 +11249,8 @@ Visit a file in Forms mode in other window.
;;;***
-;;;### (autoloads nil "fortran" "progmodes/fortran.el" (21678 60840
-;;;;;; 289779 910000))
+;;;### (autoloads nil "fortran" "progmodes/fortran.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/fortran.el
(autoload 'fortran-mode "fortran" "\
@@ -11301,8 +11327,8 @@ with no args, if that value is non-nil.
;;;***
-;;;### (autoloads nil "fortune" "play/fortune.el" (21678 60840 201776
-;;;;;; 390000))
+;;;### (autoloads nil "fortune" "play/fortune.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/fortune.el
(autoload 'fortune-add-fortune "fortune" "\
@@ -11350,8 +11376,8 @@ and choose the directory as the fortune-file.
;;;***
-;;;### (autoloads nil "frameset" "frameset.el" (21799 24401 554173
-;;;;;; 1000))
+;;;### (autoloads nil "frameset" "frameset.el" (21799 41766 981374
+;;;;;; 972000))
;;; Generated autoloads from frameset.el
(defvar frameset-session-filter-alist '((name . :never) (left . frameset-filter-iconified) (minibuffer . frameset-filter-minibuffer) (top . frameset-filter-iconified)) "\
@@ -11537,15 +11563,15 @@ Interactively, reads the register using `register-read-with-preview'.
;;;***
-;;;### (autoloads nil "gamegrid" "play/gamegrid.el" (21720 48653
-;;;;;; 160356 477000))
+;;;### (autoloads nil "gamegrid" "play/gamegrid.el" (21720 38720
+;;;;;; 956749 443000))
;;; Generated autoloads from play/gamegrid.el
(push (purecopy '(gamegrid 1 2)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "gdb-mi" "progmodes/gdb-mi.el" (21724 48240
-;;;;;; 923325 678000))
+;;;### (autoloads nil "gdb-mi" "progmodes/gdb-mi.el" (21724 35774
+;;;;;; 954622 790000))
;;; Generated autoloads from progmodes/gdb-mi.el
(defvar gdb-enable-debug nil "\
@@ -11622,8 +11648,8 @@ detailed description of this mode.
;;;***
-;;;### (autoloads nil "generic" "emacs-lisp/generic.el" (21678 60839
-;;;;;; 477747 331000))
+;;;### (autoloads nil "generic" "emacs-lisp/generic.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/generic.el
(defvar generic-mode-list nil "\
@@ -11703,8 +11729,8 @@ regular expression that can be used as an element of
;;;***
-;;;### (autoloads nil "glasses" "progmodes/glasses.el" (21678 60840
-;;;;;; 293780 70000))
+;;;### (autoloads nil "glasses" "progmodes/glasses.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/glasses.el
(autoload 'glasses-mode "glasses" "\
@@ -11718,8 +11744,8 @@ add virtual separators (like underscores) at places they belong to.
;;;***
-;;;### (autoloads nil "gmm-utils" "gnus/gmm-utils.el" (21678 60839
-;;;;;; 629753 440000))
+;;;### (autoloads nil "gmm-utils" "gnus/gmm-utils.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gmm-utils.el
(autoload 'gmm-regexp-concat "gmm-utils" "\
@@ -11773,7 +11799,7 @@ DEFAULT-MAP specifies the default key map for ICON-LIST.
;;;***
-;;;### (autoloads nil "gnus" "gnus/gnus.el" (21678 60839 681755 530000))
+;;;### (autoloads nil "gnus" "gnus/gnus.el" (21670 32330 885624 725000))
;;; Generated autoloads from gnus/gnus.el
(push (purecopy '(gnus 5 13)) package--builtin-versions)
(when (fboundp 'custom-autoload)
@@ -11823,8 +11849,8 @@ prompt the user for the name of an NNTP server to use.
;;;***
-;;;### (autoloads nil "gnus-agent" "gnus/gnus-agent.el" (21678 60839
-;;;;;; 629753 440000))
+;;;### (autoloads nil "gnus-agent" "gnus/gnus-agent.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-agent.el
(autoload 'gnus-unplugged "gnus-agent" "\
@@ -11914,8 +11940,8 @@ CLEAN is obsolete and ignored.
;;;***
-;;;### (autoloads nil "gnus-art" "gnus/gnus-art.el" (21799 14518
-;;;;;; 691699 178000))
+;;;### (autoloads nil "gnus-art" "gnus/gnus-art.el" (21804 59688
+;;;;;; 184805 112000))
;;; Generated autoloads from gnus/gnus-art.el
(autoload 'gnus-article-prepare-display "gnus-art" "\
@@ -11925,8 +11951,8 @@ Make the current buffer look like a nice article.
;;;***
-;;;### (autoloads nil "gnus-bookmark" "gnus/gnus-bookmark.el" (21678
-;;;;;; 60839 637753 761000))
+;;;### (autoloads nil "gnus-bookmark" "gnus/gnus-bookmark.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from gnus/gnus-bookmark.el
(autoload 'gnus-bookmark-set "gnus-bookmark" "\
@@ -11949,8 +11975,8 @@ deletion, or > if it is flagged for displaying.
;;;***
-;;;### (autoloads nil "gnus-cache" "gnus/gnus-cache.el" (21678 60839
-;;;;;; 641753 922000))
+;;;### (autoloads nil "gnus-cache" "gnus/gnus-cache.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-cache.el
(autoload 'gnus-jog-cache "gnus-cache" "\
@@ -11991,8 +12017,8 @@ supported.
;;;***
-;;;### (autoloads nil "gnus-delay" "gnus/gnus-delay.el" (21678 60839
-;;;;;; 641753 922000))
+;;;### (autoloads nil "gnus-delay" "gnus/gnus-delay.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-delay.el
(autoload 'gnus-delay-article "gnus-delay" "\
@@ -12027,8 +12053,8 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
;;;***
-;;;### (autoloads nil "gnus-diary" "gnus/gnus-diary.el" (21678 60839
-;;;;;; 641753 922000))
+;;;### (autoloads nil "gnus-diary" "gnus/gnus-diary.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-diary.el
(autoload 'gnus-user-format-function-d "gnus-diary" "\
@@ -12043,8 +12069,8 @@ Checking delayed messages is skipped if optional arg NO-CHECK is non-nil.
;;;***
-;;;### (autoloads nil "gnus-dired" "gnus/gnus-dired.el" (21678 60839
-;;;;;; 641753 922000))
+;;;### (autoloads nil "gnus-dired" "gnus/gnus-dired.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-dired.el
(autoload 'turn-on-gnus-dired-mode "gnus-dired" "\
@@ -12054,8 +12080,8 @@ Convenience method to turn on gnus-dired-mode.
;;;***
-;;;### (autoloads nil "gnus-draft" "gnus/gnus-draft.el" (21678 60839
-;;;;;; 645754 83000))
+;;;### (autoloads nil "gnus-draft" "gnus/gnus-draft.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-draft.el
(autoload 'gnus-draft-reminder "gnus-draft" "\
@@ -12065,8 +12091,8 @@ Reminder user if there are unsent drafts.
;;;***
-;;;### (autoloads nil "gnus-fun" "gnus/gnus-fun.el" (21678 60839
-;;;;;; 645754 83000))
+;;;### (autoloads nil "gnus-fun" "gnus/gnus-fun.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-fun.el
(autoload 'gnus--random-face-with-type "gnus-fun" "\
@@ -12131,8 +12157,8 @@ Insert a random Face header from `gnus-face-directory'.
;;;***
-;;;### (autoloads nil "gnus-gravatar" "gnus/gnus-gravatar.el" (21678
-;;;;;; 60839 645754 83000))
+;;;### (autoloads nil "gnus-gravatar" "gnus/gnus-gravatar.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from gnus/gnus-gravatar.el
(autoload 'gnus-treat-from-gravatar "gnus-gravatar" "\
@@ -12149,8 +12175,8 @@ If gravatars are already displayed, remove them.
;;;***
-;;;### (autoloads nil "gnus-group" "gnus/gnus-group.el" (21804 4012
-;;;;;; 678064 192000))
+;;;### (autoloads nil "gnus-group" "gnus/gnus-group.el" (21804 59688
+;;;;;; 184805 112000))
;;; Generated autoloads from gnus/gnus-group.el
(autoload 'gnus-fetch-group "gnus-group" "\
@@ -12167,8 +12193,8 @@ Pop up a frame and enter GROUP.
;;;***
-;;;### (autoloads nil "gnus-html" "gnus/gnus-html.el" (21678 60839
-;;;;;; 649754 243000))
+;;;### (autoloads nil "gnus-html" "gnus/gnus-html.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-html.el
(autoload 'gnus-article-html "gnus-html" "\
@@ -12183,8 +12209,8 @@ Pop up a frame and enter GROUP.
;;;***
-;;;### (autoloads nil "gnus-kill" "gnus/gnus-kill.el" (21678 60839
-;;;;;; 649754 243000))
+;;;### (autoloads nil "gnus-kill" "gnus/gnus-kill.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-kill.el
(defalias 'gnus-batch-kill 'gnus-batch-score)
@@ -12197,8 +12223,8 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score
;;;***
-;;;### (autoloads nil "gnus-ml" "gnus/gnus-ml.el" (21678 60839 653754
-;;;;;; 404000))
+;;;### (autoloads nil "gnus-ml" "gnus/gnus-ml.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from gnus/gnus-ml.el
(autoload 'turn-on-gnus-mailing-list-mode "gnus-ml" "\
@@ -12221,8 +12247,8 @@ Minor mode for providing mailing-list commands.
;;;***
-;;;### (autoloads nil "gnus-mlspl" "gnus/gnus-mlspl.el" (21678 60839
-;;;;;; 653754 404000))
+;;;### (autoloads nil "gnus-mlspl" "gnus/gnus-mlspl.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-mlspl.el
(autoload 'gnus-group-split-setup "gnus-mlspl" "\
@@ -12322,8 +12348,8 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns:
;;;***
-;;;### (autoloads nil "gnus-msg" "gnus/gnus-msg.el" (21727 22885
-;;;;;; 701249 695000))
+;;;### (autoloads nil "gnus-msg" "gnus/gnus-msg.el" (21725 56638
+;;;;;; 795320 63000))
;;; Generated autoloads from gnus/gnus-msg.el
(autoload 'gnus-msg-mail "gnus-msg" "\
@@ -12350,7 +12376,7 @@ Like `message-reply'.
;;;***
;;;### (autoloads nil "gnus-notifications" "gnus/gnus-notifications.el"
-;;;;;; (21756 63737 858474 66000))
+;;;;;; (21757 29489 158925 687000))
;;; Generated autoloads from gnus/gnus-notifications.el
(autoload 'gnus-notifications "gnus-notifications" "\
@@ -12366,8 +12392,8 @@ This is typically a function to add in
;;;***
-;;;### (autoloads nil "gnus-picon" "gnus/gnus-picon.el" (21678 60839
-;;;;;; 653754 404000))
+;;;### (autoloads nil "gnus-picon" "gnus/gnus-picon.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-picon.el
(autoload 'gnus-treat-from-picon "gnus-picon" "\
@@ -12390,8 +12416,8 @@ If picons are already displayed, remove them.
;;;***
-;;;### (autoloads nil "gnus-range" "gnus/gnus-range.el" (21678 60839
-;;;;;; 653754 404000))
+;;;### (autoloads nil "gnus-range" "gnus/gnus-range.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-range.el
(autoload 'gnus-sorted-difference "gnus-range" "\
@@ -12459,7 +12485,7 @@ Add NUM into sorted LIST by side effect.
;;;***
;;;### (autoloads nil "gnus-registry" "gnus/gnus-registry.el" (21774
-;;;;;; 52426 305831 981000))
+;;;;;; 38574 225319 550000))
;;; Generated autoloads from gnus/gnus-registry.el
(autoload 'gnus-registry-initialize "gnus-registry" "\
@@ -12474,8 +12500,8 @@ Install the registry hooks.
;;;***
-;;;### (autoloads nil "gnus-sieve" "gnus/gnus-sieve.el" (21678 60839
-;;;;;; 661754 726000))
+;;;### (autoloads nil "gnus-sieve" "gnus/gnus-sieve.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-sieve.el
(autoload 'gnus-sieve-update "gnus-sieve" "\
@@ -12502,8 +12528,8 @@ See the documentation for these variables and functions for details.
;;;***
-;;;### (autoloads nil "gnus-spec" "gnus/gnus-spec.el" (21678 60839
-;;;;;; 661754 726000))
+;;;### (autoloads nil "gnus-spec" "gnus/gnus-spec.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-spec.el
(autoload 'gnus-update-format "gnus-spec" "\
@@ -12513,8 +12539,8 @@ Update the format specification near point.
;;;***
-;;;### (autoloads nil "gnus-start" "gnus/gnus-start.el" (21715 35341
-;;;;;; 203436 746000))
+;;;### (autoloads nil "gnus-start" "gnus/gnus-start.el" (21716 41663
+;;;;;; 456033 27000))
;;; Generated autoloads from gnus/gnus-start.el
(autoload 'gnus-declare-backend "gnus-start" "\
@@ -12524,8 +12550,8 @@ Declare back end NAME with ABILITIES as a Gnus back end.
;;;***
-;;;### (autoloads nil "gnus-sum" "gnus/gnus-sum.el" (21803 61751
-;;;;;; 289340 808000))
+;;;### (autoloads nil "gnus-sum" "gnus/gnus-sum.el" (21804 59688
+;;;;;; 194794 158000))
;;; Generated autoloads from gnus/gnus-sum.el
(autoload 'gnus-summary-bookmark-jump "gnus-sum" "\
@@ -12536,8 +12562,8 @@ BOOKMARK is a bookmark name or a bookmark record.
;;;***
-;;;### (autoloads nil "gnus-sync" "gnus/gnus-sync.el" (21678 60839
-;;;;;; 673755 208000))
+;;;### (autoloads nil "gnus-sync" "gnus/gnus-sync.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-sync.el
(autoload 'gnus-sync-initialize "gnus-sync" "\
@@ -12552,8 +12578,8 @@ Install the sync hooks.
;;;***
-;;;### (autoloads nil "gnus-win" "gnus/gnus-win.el" (21678 60839
-;;;;;; 681755 530000))
+;;;### (autoloads nil "gnus-win" "gnus/gnus-win.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gnus-win.el
(autoload 'gnus-add-configuration "gnus-win" "\
@@ -12563,8 +12589,8 @@ Add the window configuration CONF to `gnus-buffer-configuration'.
;;;***
-;;;### (autoloads nil "gnutls" "net/gnutls.el" (21678 60839 969767
-;;;;;; 103000))
+;;;### (autoloads nil "gnutls" "net/gnutls.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from net/gnutls.el
(defvar gnutls-min-prime-bits 256 "\
@@ -12580,8 +12606,8 @@ A value of nil says to use the default GnuTLS value.")
;;;***
-;;;### (autoloads nil "gomoku" "play/gomoku.el" (21678 60840 205776
-;;;;;; 549000))
+;;;### (autoloads nil "gomoku" "play/gomoku.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/gomoku.el
(autoload 'gomoku "gomoku" "\
@@ -12607,8 +12633,8 @@ Use \\[describe-mode] for more info.
;;;***
-;;;### (autoloads nil "goto-addr" "net/goto-addr.el" (21678 60839
-;;;;;; 969767 103000))
+;;;### (autoloads nil "goto-addr" "net/goto-addr.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from net/goto-addr.el
(define-obsolete-function-alias 'goto-address-at-mouse 'goto-address-at-point "22.1")
@@ -12649,8 +12675,8 @@ Like `goto-address-mode', but only for comments and strings.
;;;***
-;;;### (autoloads nil "gravatar" "gnus/gravatar.el" (21678 60839
-;;;;;; 685755 690000))
+;;;### (autoloads nil "gravatar" "gnus/gravatar.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/gravatar.el
(autoload 'gravatar-retrieve "gravatar" "\
@@ -12666,8 +12692,8 @@ Retrieve MAIL-ADDRESS gravatar and returns it.
;;;***
-;;;### (autoloads nil "grep" "progmodes/grep.el" (21678 60840 297780
-;;;;;; 230000))
+;;;### (autoloads nil "grep" "progmodes/grep.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from progmodes/grep.el
(defvar grep-window-height nil "\
@@ -12831,7 +12857,7 @@ file name to `*.gz', and sets `grep-highlight-matches' to `always'.
;;;***
-;;;### (autoloads nil "gs" "gs.el" (21678 60839 733757 619000))
+;;;### (autoloads nil "gs" "gs.el" (21670 32331 385639 720000))
;;; Generated autoloads from gs.el
(autoload 'gs-load-image "gs" "\
@@ -12844,8 +12870,8 @@ the form \"WINDOW-ID PIXMAP-ID\". Value is non-nil if successful.
;;;***
-;;;### (autoloads nil "gud" "progmodes/gud.el" (21769 35727 354145
-;;;;;; 723000))
+;;;### (autoloads nil "gud" "progmodes/gud.el" (21769 20661 366048
+;;;;;; 601000))
;;; Generated autoloads from progmodes/gud.el
(autoload 'gud-gdb "gud" "\
@@ -12940,8 +12966,8 @@ it if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "gv" "emacs-lisp/gv.el" (21756 63737 830474
-;;;;;; 768000))
+;;;### (autoloads nil "gv" "emacs-lisp/gv.el" (21750 59840 206034
+;;;;;; 761000))
;;; Generated autoloads from emacs-lisp/gv.el
(autoload 'gv-get "gv" "\
@@ -13043,8 +13069,8 @@ binding mode.
;;;***
-;;;### (autoloads nil "handwrite" "play/handwrite.el" (21678 60840
-;;;;;; 205776 549000))
+;;;### (autoloads nil "handwrite" "play/handwrite.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from play/handwrite.el
(autoload 'handwrite "handwrite" "\
@@ -13061,8 +13087,8 @@ Variables: `handwrite-linespace' (default 12)
;;;***
-;;;### (autoloads nil "hanoi" "play/hanoi.el" (21799 25474 348396
-;;;;;; 169000))
+;;;### (autoloads nil "hanoi" "play/hanoi.el" (21799 41767 31221
+;;;;;; 635000))
;;; Generated autoloads from play/hanoi.el
(autoload 'hanoi "hanoi" "\
@@ -13089,8 +13115,8 @@ to be updated.
;;;***
-;;;### (autoloads nil "hashcash" "mail/hashcash.el" (21678 60839
-;;;;;; 869763 84000))
+;;;### (autoloads nil "hashcash" "mail/hashcash.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/hashcash.el
(autoload 'hashcash-insert-payment "hashcash" "\
@@ -13132,8 +13158,8 @@ Prefix arg sets default accept amount temporarily.
;;;***
-;;;### (autoloads nil "help-at-pt" "help-at-pt.el" (21678 60839 733757
-;;;;;; 619000))
+;;;### (autoloads nil "help-at-pt" "help-at-pt.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from help-at-pt.el
(autoload 'help-at-pt-string "help-at-pt" "\
@@ -13260,8 +13286,8 @@ different regions. With numeric argument ARG, behaves like
;;;***
-;;;### (autoloads nil "help-fns" "help-fns.el" (21720 48653 588347
-;;;;;; 670000))
+;;;### (autoloads nil "help-fns" "help-fns.el" (21818 36533 711220
+;;;;;; 766000))
;;; Generated autoloads from help-fns.el
(autoload 'describe-function "help-fns" "\
@@ -13347,8 +13373,8 @@ Produce a texinfo buffer with sorted doc-strings from the DOC file.
;;;***
-;;;### (autoloads nil "help-macro" "help-macro.el" (21678 60839 737757
-;;;;;; 780000))
+;;;### (autoloads nil "help-macro" "help-macro.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from help-macro.el
(defvar three-step-help nil "\
@@ -13362,8 +13388,8 @@ gives the window that lists the options.")
;;;***
-;;;### (autoloads nil "help-mode" "help-mode.el" (21733 15494 350926
-;;;;;; 217000))
+;;;### (autoloads nil "help-mode" "help-mode.el" (21733 50750 334730
+;;;;;; 5000))
;;; Generated autoloads from help-mode.el
(autoload 'help-mode "help-mode" "\
@@ -13470,8 +13496,8 @@ BOOKMARK is a bookmark name or a bookmark record.
;;;***
-;;;### (autoloads nil "helper" "emacs-lisp/helper.el" (21678 60839
-;;;;;; 481747 492000))
+;;;### (autoloads nil "helper" "emacs-lisp/helper.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/helper.el
(autoload 'Helper-describe-bindings "helper" "\
@@ -13486,7 +13512,7 @@ Provide help for current mode.
;;;***
-;;;### (autoloads nil "hexl" "hexl.el" (21694 48017 602102 111000))
+;;;### (autoloads nil "hexl" "hexl.el" (21695 35516 595262 313000))
;;; Generated autoloads from hexl.el
(autoload 'hexl-mode "hexl" "\
@@ -13580,8 +13606,7 @@ This discards the buffer's undo information.
;;;***
-;;;### (autoloads nil "hi-lock" "hi-lock.el" (21741 10923 302579
-;;;;;; 694000))
+;;;### (autoloads nil "hi-lock" "hi-lock.el" (21741 1161 438890 423000))
;;; Generated autoloads from hi-lock.el
(autoload 'hi-lock-mode "hi-lock" "\
@@ -13748,8 +13773,8 @@ be found in variable `hi-lock-interactive-patterns'.
;;;***
-;;;### (autoloads nil "hideif" "progmodes/hideif.el" (21799 25495
-;;;;;; 339970 854000))
+;;;### (autoloads nil "hideif" "progmodes/hideif.el" (21799 41767
+;;;;;; 51222 992000))
;;; Generated autoloads from progmodes/hideif.el
(autoload 'hide-ifdef-mode "hideif" "\
@@ -13796,8 +13821,8 @@ Several variables affect how the hiding is done:
;;;***
-;;;### (autoloads nil "hideshow" "progmodes/hideshow.el" (21678 60840
-;;;;;; 301780 390000))
+;;;### (autoloads nil "hideshow" "progmodes/hideshow.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/hideshow.el
(defvar hs-special-modes-alist (mapcar 'purecopy '((c-mode "{" "}" "/[*/]" nil nil) (c++-mode "{" "}" "/[*/]" nil nil) (bibtex-mode ("@\\S(*\\(\\s(\\)" 1)) (java-mode "{" "}" "/[*/]" nil nil) (js-mode "{" "}" "/[*/]" nil))) "\
@@ -13859,8 +13884,8 @@ Unconditionally turn off `hs-minor-mode'.
;;;***
-;;;### (autoloads nil "hilit-chg" "hilit-chg.el" (21678 60839 741757
-;;;;;; 940000))
+;;;### (autoloads nil "hilit-chg" "hilit-chg.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from hilit-chg.el
(autoload 'highlight-changes-mode "hilit-chg" "\
@@ -13991,8 +14016,8 @@ See `highlight-changes-mode' for more information on Highlight-Changes mode.
;;;***
-;;;### (autoloads nil "hippie-exp" "hippie-exp.el" (21678 60839 741757
-;;;;;; 940000))
+;;;### (autoloads nil "hippie-exp" "hippie-exp.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from hippie-exp.el
(push (purecopy '(hippie-exp 1 6)) package--builtin-versions)
@@ -14024,8 +14049,8 @@ argument VERBOSE non-nil makes the function verbose.
;;;***
-;;;### (autoloads nil "hl-line" "hl-line.el" (21678 60839 741757
-;;;;;; 940000))
+;;;### (autoloads nil "hl-line" "hl-line.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from hl-line.el
(autoload 'hl-line-mode "hl-line" "\
@@ -14074,8 +14099,8 @@ Global-Hl-Line mode uses the functions `global-hl-line-unhighlight' and
;;;***
-;;;### (autoloads nil "holidays" "calendar/holidays.el" (21678 60839
-;;;;;; 317740 902000))
+;;;### (autoloads nil "holidays" "calendar/holidays.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from calendar/holidays.el
(defvar holiday-general-holidays (mapcar 'purecopy '((holiday-fixed 1 1 "New Year's Day") (holiday-float 1 1 3 "Martin Luther King Day") (holiday-fixed 2 2 "Groundhog Day") (holiday-fixed 2 14 "Valentine's Day") (holiday-float 2 1 3 "President's Day") (holiday-fixed 3 17 "St. Patrick's Day") (holiday-fixed 4 1 "April Fools' Day") (holiday-float 5 0 2 "Mother's Day") (holiday-float 5 1 -1 "Memorial Day") (holiday-fixed 6 14 "Flag Day") (holiday-float 6 0 3 "Father's Day") (holiday-fixed 7 4 "Independence Day") (holiday-float 9 1 1 "Labor Day") (holiday-float 10 1 2 "Columbus Day") (holiday-fixed 10 31 "Halloween") (holiday-fixed 11 11 "Veteran's Day") (holiday-float 11 4 4 "Thanksgiving"))) "\
@@ -14185,8 +14210,8 @@ The optional LABEL is used to label the buffer created.
;;;***
-;;;### (autoloads nil "html2text" "gnus/html2text.el" (21678 60839
-;;;;;; 685755 690000))
+;;;### (autoloads nil "html2text" "gnus/html2text.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from gnus/html2text.el
(autoload 'html2text "html2text" "\
@@ -14196,8 +14221,8 @@ Convert HTML to plain text in the current buffer.
;;;***
-;;;### (autoloads nil "htmlfontify" "htmlfontify.el" (21797 54705
-;;;;;; 36905 533000))
+;;;### (autoloads nil "htmlfontify" "htmlfontify.el" (21794 23865
+;;;;;; 762631 503000))
;;; Generated autoloads from htmlfontify.el
(push (purecopy '(htmlfontify 0 21)) package--builtin-versions)
@@ -14230,8 +14255,8 @@ You may also want to set `hfy-page-header' and `hfy-page-footer'.
;;;***
-;;;### (autoloads nil "ibuf-macs" "ibuf-macs.el" (21678 60839 745758
-;;;;;; 101000))
+;;;### (autoloads nil "ibuf-macs" "ibuf-macs.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from ibuf-macs.el
(autoload 'define-ibuffer-column "ibuf-macs" "\
@@ -14333,8 +14358,7 @@ bound to the current value of the filter.
;;;***
-;;;### (autoloads nil "ibuffer" "ibuffer.el" (21799 25376 342382
-;;;;;; 265000))
+;;;### (autoloads nil "ibuffer" "ibuffer.el" (21799 41767 11212 472000))
;;; Generated autoloads from ibuffer.el
(autoload 'ibuffer-list-buffers "ibuffer" "\
@@ -14373,8 +14397,8 @@ FORMATS is the value to use for `ibuffer-formats'.
;;;***
-;;;### (autoloads nil "icalendar" "calendar/icalendar.el" (21797
-;;;;;; 54704 968907 0))
+;;;### (autoloads nil "icalendar" "calendar/icalendar.el" (21795
+;;;;;; 44704 594368 994000))
;;; Generated autoloads from calendar/icalendar.el
(push (purecopy '(icalendar 0 19)) package--builtin-versions)
@@ -14427,8 +14451,8 @@ buffer `*icalendar-errors*'.
;;;***
-;;;### (autoloads nil "icomplete" "icomplete.el" (21678 60839 749758
-;;;;;; 262000))
+;;;### (autoloads nil "icomplete" "icomplete.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from icomplete.el
(defvar icomplete-mode nil "\
@@ -14467,8 +14491,8 @@ completions:
;;;***
-;;;### (autoloads nil "icon" "progmodes/icon.el" (21678 60840 301780
-;;;;;; 390000))
+;;;### (autoloads nil "icon" "progmodes/icon.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from progmodes/icon.el
(autoload 'icon-mode "icon" "\
@@ -14508,8 +14532,8 @@ with no args, if that value is non-nil.
;;;***
-;;;### (autoloads nil "idlw-shell" "progmodes/idlw-shell.el" (21678
-;;;;;; 60840 309780 710000))
+;;;### (autoloads nil "idlw-shell" "progmodes/idlw-shell.el" (21826
+;;;;;; 49523 450500 879000))
;;; Generated autoloads from progmodes/idlw-shell.el
(autoload 'idlwave-shell "idlw-shell" "\
@@ -14534,8 +14558,8 @@ See also the variable `idlwave-shell-prompt-pattern'.
;;;***
-;;;### (autoloads nil "idlwave" "progmodes/idlwave.el" (21678 60840
-;;;;;; 313780 870000))
+;;;### (autoloads nil "idlwave" "progmodes/idlwave.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/idlwave.el
(push (purecopy '(idlwave 6 1 22)) package--builtin-versions)
@@ -14664,7 +14688,7 @@ The main features of this mode are
;;;***
-;;;### (autoloads nil "ido" "ido.el" (21767 20340 942139 827000))
+;;;### (autoloads nil "ido" "ido.el" (21767 65327 504606 256000))
;;; Generated autoloads from ido.el
(defvar ido-mode nil "\
@@ -14926,7 +14950,7 @@ DEF, if non-nil, is the default value.
;;;***
-;;;### (autoloads nil "ielm" "ielm.el" (21694 48017 602102 111000))
+;;;### (autoloads nil "ielm" "ielm.el" (21695 35516 595262 313000))
;;; Generated autoloads from ielm.el
(autoload 'ielm "ielm" "\
@@ -14938,7 +14962,7 @@ See `inferior-emacs-lisp-mode' for details.
;;;***
-;;;### (autoloads nil "iimage" "iimage.el" (21678 60839 753758 423000))
+;;;### (autoloads nil "iimage" "iimage.el" (21670 32331 385639 720000))
;;; Generated autoloads from iimage.el
(define-obsolete-function-alias 'turn-on-iimage-mode 'iimage-mode "24.1")
@@ -14954,7 +14978,7 @@ the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'.
;;;***
-;;;### (autoloads nil "image" "image.el" (21678 60839 757758 583000))
+;;;### (autoloads nil "image" "image.el" (21670 32331 385639 720000))
;;; Generated autoloads from image.el
(autoload 'image-type-from-data "image" "\
@@ -15147,8 +15171,8 @@ If Emacs is compiled without ImageMagick support, this does nothing.
;;;***
-;;;### (autoloads nil "image-dired" "image-dired.el" (21678 60839
-;;;;;; 757758 583000))
+;;;### (autoloads nil "image-dired" "image-dired.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from image-dired.el
(push (purecopy '(image-dired 0 4 11)) package--builtin-versions)
@@ -15285,8 +15309,8 @@ easy-to-use form.
;;;***
-;;;### (autoloads nil "image-file" "image-file.el" (21678 60839 757758
-;;;;;; 583000))
+;;;### (autoloads nil "image-file" "image-file.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from image-file.el
(defvar image-file-name-extensions (purecopy '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg")) "\
@@ -15348,8 +15372,8 @@ An image file is one whose name has an extension in
;;;***
-;;;### (autoloads nil "image-mode" "image-mode.el" (21718 7576 278960
-;;;;;; 757000))
+;;;### (autoloads nil "image-mode" "image-mode.el" (21716 41663 456033
+;;;;;; 27000))
;;; Generated autoloads from image-mode.el
(autoload 'image-mode "image-mode" "\
@@ -15396,7 +15420,7 @@ on these modes.
;;;***
-;;;### (autoloads nil "imenu" "imenu.el" (21678 60839 761758 744000))
+;;;### (autoloads nil "imenu" "imenu.el" (21670 32331 385639 720000))
;;; Generated autoloads from imenu.el
(defvar imenu-sort-function nil "\
@@ -15534,8 +15558,8 @@ for more information.
;;;***
-;;;### (autoloads nil "ind-util" "language/ind-util.el" (21678 60839
-;;;;;; 813760 834000))
+;;;### (autoloads nil "ind-util" "language/ind-util.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from language/ind-util.el
(autoload 'indian-compose-region "ind-util" "\
@@ -15565,8 +15589,8 @@ Convert old Emacs Devanagari characters to UCS.
;;;***
-;;;### (autoloads nil "inf-lisp" "progmodes/inf-lisp.el" (21678 60840
-;;;;;; 317781 30000))
+;;;### (autoloads nil "inf-lisp" "progmodes/inf-lisp.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/inf-lisp.el
(autoload 'inferior-lisp "inf-lisp" "\
@@ -15584,7 +15608,7 @@ of `inferior-lisp-program'). Runs the hooks from
;;;***
-;;;### (autoloads nil "info" "info.el" (21678 60839 765758 905000))
+;;;### (autoloads nil "info" "info.el" (21822 3243 710497 966000))
;;; Generated autoloads from info.el
(defcustom Info-default-directory-list (let* ((config-dir (file-name-as-directory (or (and (featurep 'ns) (let ((dir (expand-file-name "../info" data-directory))) (if (file-directory-p dir) dir))) configure-info-directory))) (prefixes (prune-directory-list '("/usr/local/" "/usr/" "/opt/" "/"))) (suffixes '("share/" "" "gnu/" "gnu/lib/" "gnu/lib/emacs/" "emacs/" "lib/" "lib/emacs/")) (standard-info-dirs (apply #'nconc (mapcar (lambda (pfx) (let ((dirs (mapcar (lambda (sfx) (concat pfx sfx "info/")) suffixes))) (prune-directory-list dirs))) prefixes))) (dirs (if (member config-dir standard-info-dirs) (nconc standard-info-dirs (list config-dir)) (cons config-dir standard-info-dirs)))) (if (not (eq system-type 'windows-nt)) dirs (let* ((instdir (file-name-directory invocation-directory)) (dir1 (expand-file-name "../info/" instdir)) (dir2 (expand-file-name "../../../info/" instdir))) (cond ((file-exists-p dir1) (append dirs (list dir1))) ((file-exists-p dir2) (append dirs (list dir2))) (t dirs))))) "\
@@ -15796,8 +15820,8 @@ completion alternatives to currently visited manuals.
;;;***
-;;;### (autoloads nil "info-look" "info-look.el" (21763 18426 747793
-;;;;;; 948000))
+;;;### (autoloads nil "info-look" "info-look.el" (21814 9129 270507
+;;;;;; 521000))
;;; Generated autoloads from info-look.el
(autoload 'info-lookup-reset "info-look" "\
@@ -15844,8 +15868,8 @@ Perform completion on file preceding point.
;;;***
-;;;### (autoloads nil "info-xref" "info-xref.el" (21678 60839 761758
-;;;;;; 744000))
+;;;### (autoloads nil "info-xref" "info-xref.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from info-xref.el
(push (purecopy '(info-xref 3)) package--builtin-versions)
@@ -15928,8 +15952,8 @@ the sources handy.
;;;***
-;;;### (autoloads nil "informat" "informat.el" (21678 60839 765758
-;;;;;; 905000))
+;;;### (autoloads nil "informat" "informat.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from informat.el
(autoload 'Info-tagify "informat" "\
@@ -15974,8 +15998,8 @@ For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"
;;;***
-;;;### (autoloads nil "inline" "emacs-lisp/inline.el" (21678 60839
-;;;;;; 481747 492000))
+;;;### (autoloads nil "inline" "emacs-lisp/inline.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/inline.el
(autoload 'define-inline "inline" "\
@@ -15989,8 +16013,8 @@ For example, invoke \"emacs -batch -f batch-info-validate $info/ ~/*.info\"
;;;***
-;;;### (autoloads nil "inversion" "cedet/inversion.el" (21678 60839
-;;;;;; 349742 188000))
+;;;### (autoloads nil "inversion" "cedet/inversion.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from cedet/inversion.el
(push (purecopy '(inversion 1 3)) package--builtin-versions)
@@ -16002,8 +16026,8 @@ Only checks one based on which kind of Emacs is being run.
;;;***
-;;;### (autoloads nil "isearch-x" "international/isearch-x.el" (21678
-;;;;;; 60839 769759 66000))
+;;;### (autoloads nil "isearch-x" "international/isearch-x.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from international/isearch-x.el
(autoload 'isearch-toggle-specified-input-method "isearch-x" "\
@@ -16023,8 +16047,8 @@ Toggle input method in interactive search.
;;;***
-;;;### (autoloads nil "isearchb" "isearchb.el" (21767 20340 942139
-;;;;;; 827000))
+;;;### (autoloads nil "isearchb" "isearchb.el" (21767 65327 504606
+;;;;;; 256000))
;;; Generated autoloads from isearchb.el
(push (purecopy '(isearchb 1 5)) package--builtin-versions)
@@ -16038,8 +16062,8 @@ accessed via isearchb.
;;;***
-;;;### (autoloads nil "iso-cvt" "international/iso-cvt.el" (21678
-;;;;;; 60839 769759 66000))
+;;;### (autoloads nil "iso-cvt" "international/iso-cvt.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from international/iso-cvt.el
(autoload 'iso-spanish "iso-cvt" "\
@@ -16130,15 +16154,15 @@ Add submenus to the File menu, to convert to and from various formats.
;;;***
;;;### (autoloads nil "iso-transl" "international/iso-transl.el"
-;;;;;; (21678 60839 769759 66000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from international/iso-transl.el
(define-key key-translation-map "\C-x8" 'iso-transl-ctl-x-8-map)
(autoload 'iso-transl-ctl-x-8-map "iso-transl" "Keymap for C-x 8 prefix." t 'keymap)
;;;***
-;;;### (autoloads nil "ispell" "textmodes/ispell.el" (21756 63738
-;;;;;; 22469 950000))
+;;;### (autoloads nil "ispell" "textmodes/ispell.el" (21824 5851
+;;;;;; 721914 174000))
;;; Generated autoloads from textmodes/ispell.el
(put 'ispell-check-comments 'safe-local-variable (lambda (a) (memq a '(nil t exclusive))))
@@ -16371,8 +16395,8 @@ You can bind this to the key C-c i in GNUS or mail by adding to
;;;***
-;;;### (autoloads nil "japan-util" "language/japan-util.el" (21678
-;;;;;; 60839 817760 994000))
+;;;### (autoloads nil "japan-util" "language/japan-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/japan-util.el
(autoload 'setup-japanese-environment-internal "japan-util" "\
@@ -16449,8 +16473,8 @@ If non-nil, second arg INITIAL-INPUT is a string to insert before reading.
;;;***
-;;;### (autoloads nil "jka-compr" "jka-compr.el" (21678 60839 793760
-;;;;;; 30000))
+;;;### (autoloads nil "jka-compr" "jka-compr.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from jka-compr.el
(defvar jka-compr-inhibit nil "\
@@ -16473,8 +16497,8 @@ by `jka-compr-installed'.
;;;***
-;;;### (autoloads nil "js" "progmodes/js.el" (21790 46509 351608
-;;;;;; 183000))
+;;;### (autoloads nil "js" "progmodes/js.el" (21790 26797 438891
+;;;;;; 674000))
;;; Generated autoloads from progmodes/js.el
(push (purecopy '(js 9)) package--builtin-versions)
@@ -16488,14 +16512,14 @@ Major mode for editing JavaScript.
;;;***
-;;;### (autoloads nil "json" "json.el" (21779 20029 611175 954000))
+;;;### (autoloads nil "json" "json.el" (21779 56495 106033 935000))
;;; Generated autoloads from json.el
(push (purecopy '(json 1 4)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "keypad" "emulation/keypad.el" (21678 60839
-;;;;;; 505748 457000))
+;;;### (autoloads nil "keypad" "emulation/keypad.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emulation/keypad.el
(defvar keypad-setup nil "\
@@ -16550,8 +16574,8 @@ the decimal key on the keypad is mapped to DECIMAL instead of `.'
;;;***
-;;;### (autoloads nil "kinsoku" "international/kinsoku.el" (21678
-;;;;;; 60839 773759 227000))
+;;;### (autoloads nil "kinsoku" "international/kinsoku.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from international/kinsoku.el
(autoload 'kinsoku "kinsoku" "\
@@ -16572,8 +16596,8 @@ the context of text formatting.
;;;***
-;;;### (autoloads nil "kkc" "international/kkc.el" (21678 60839 773759
-;;;;;; 227000))
+;;;### (autoloads nil "kkc" "international/kkc.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from international/kkc.el
(defvar kkc-after-update-conversion-functions nil "\
@@ -16595,7 +16619,7 @@ and the return value is the length of the conversion.
;;;***
-;;;### (autoloads nil "kmacro" "kmacro.el" (21678 60839 793760 30000))
+;;;### (autoloads nil "kmacro" "kmacro.el" (21670 32331 385639 720000))
;;; Generated autoloads from kmacro.el
(global-set-key "\C-x(" 'kmacro-start-macro)
(global-set-key "\C-x)" 'kmacro-end-macro)
@@ -16707,8 +16731,8 @@ If kbd macro currently being defined end it before activating it.
;;;***
-;;;### (autoloads nil "korea-util" "language/korea-util.el" (21678
-;;;;;; 60839 817760 994000))
+;;;### (autoloads nil "korea-util" "language/korea-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/korea-util.el
(defvar default-korean-keyboard (purecopy (if (string-match "3" (or (getenv "HANGUL_KEYBOARD_TYPE") "")) "3" "")) "\
@@ -16722,8 +16746,8 @@ The kind of Korean keyboard for Korean input method.
;;;***
-;;;### (autoloads nil "landmark" "play/landmark.el" (21678 60840
-;;;;;; 209776 710000))
+;;;### (autoloads nil "landmark" "play/landmark.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from play/landmark.el
(push (purecopy '(landmark 1 0)) package--builtin-versions)
@@ -16754,8 +16778,8 @@ Use \\[describe-mode] for more info.
;;;***
-;;;### (autoloads nil "lao-util" "language/lao-util.el" (21678 60839
-;;;;;; 817760 994000))
+;;;### (autoloads nil "lao-util" "language/lao-util.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from language/lao-util.el
(autoload 'lao-compose-string "lao-util" "\
@@ -16792,8 +16816,8 @@ Transcribe Romanized Lao string STR to Lao character string.
;;;***
-;;;### (autoloads nil "latexenc" "international/latexenc.el" (21678
-;;;;;; 60839 773759 227000))
+;;;### (autoloads nil "latexenc" "international/latexenc.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from international/latexenc.el
(defvar latex-inputenc-coding-alist (purecopy '(("ansinew" . windows-1252) ("applemac" . mac-roman) ("ascii" . us-ascii) ("cp1250" . windows-1250) ("cp1252" . windows-1252) ("cp1257" . cp1257) ("cp437de" . cp437) ("cp437" . cp437) ("cp850" . cp850) ("cp852" . cp852) ("cp858" . cp858) ("cp865" . cp865) ("latin1" . iso-8859-1) ("latin2" . iso-8859-2) ("latin3" . iso-8859-3) ("latin4" . iso-8859-4) ("latin5" . iso-8859-5) ("latin9" . iso-8859-15) ("next" . next) ("utf8" . utf-8) ("utf8x" . utf-8))) "\
@@ -16825,7 +16849,7 @@ coding system names is determined from `latex-inputenc-coding-alist'.
;;;***
;;;### (autoloads nil "latin1-disp" "international/latin1-disp.el"
-;;;;;; (21678 60839 773759 227000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from international/latin1-disp.el
(defvar latin1-display nil "\
@@ -16866,8 +16890,8 @@ use either \\[customize] or the function `latin1-display'.")
;;;***
-;;;### (autoloads nil "ld-script" "progmodes/ld-script.el" (21678
-;;;;;; 60840 317781 30000))
+;;;### (autoloads nil "ld-script" "progmodes/ld-script.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/ld-script.el
(autoload 'ld-script-mode "ld-script" "\
@@ -16877,8 +16901,8 @@ A major mode to edit GNU ld script files
;;;***
-;;;### (autoloads nil "let-alist" "let-alist.el" (21678 60839 865762
-;;;;;; 924000))
+;;;### (autoloads nil "let-alist" "let-alist.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from let-alist.el
(push (purecopy '(let-alist 1 0 3)) package--builtin-versions)
@@ -16917,7 +16941,7 @@ displayed in the example above.
;;;***
-;;;### (autoloads nil "life" "play/life.el" (21678 60840 209776 710000))
+;;;### (autoloads nil "life" "play/life.el" (21670 32331 385639 720000))
;;; Generated autoloads from play/life.el
(autoload 'life "life" "\
@@ -16930,7 +16954,7 @@ generations (this defaults to 1).
;;;***
-;;;### (autoloads nil "linum" "linum.el" (21678 60839 865762 924000))
+;;;### (autoloads nil "linum" "linum.el" (21670 32331 385639 720000))
;;; Generated autoloads from linum.el
(push (purecopy '(linum 0 9 24)) package--builtin-versions)
@@ -16967,8 +16991,8 @@ See `linum-mode' for more information on Linum mode.
;;;***
-;;;### (autoloads nil "loadhist" "loadhist.el" (21678 60839 865762
-;;;;;; 924000))
+;;;### (autoloads nil "loadhist" "loadhist.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from loadhist.el
(autoload 'unload-feature "loadhist" "\
@@ -16999,7 +17023,7 @@ something strange, such as redefining an Emacs function.
;;;***
-;;;### (autoloads nil "locate" "locate.el" (21678 60839 865762 924000))
+;;;### (autoloads nil "locate" "locate.el" (21670 32331 385639 720000))
;;; Generated autoloads from locate.el
(defvar locate-ls-subdir-switches (purecopy "-al") "\
@@ -17051,8 +17075,8 @@ except that FILTER is not optional.
;;;***
-;;;### (autoloads nil "log-edit" "vc/log-edit.el" (21803 61751 305340
-;;;;;; 145000))
+;;;### (autoloads nil "log-edit" "vc/log-edit.el" (21800 62630 983381
+;;;;;; 721000))
;;; Generated autoloads from vc/log-edit.el
(autoload 'log-edit "log-edit" "\
@@ -17083,8 +17107,8 @@ done. Otherwise, it uses the current buffer.
;;;***
-;;;### (autoloads nil "log-view" "vc/log-view.el" (21678 60840 529789
-;;;;;; 511000))
+;;;### (autoloads nil "log-view" "vc/log-view.el" (21814 9129 450497
+;;;;;; 666000))
;;; Generated autoloads from vc/log-view.el
(autoload 'log-view-mode "log-view" "\
@@ -17094,7 +17118,7 @@ Major mode for browsing CVS log output.
;;;***
-;;;### (autoloads nil "lpr" "lpr.el" (21678 60839 865762 924000))
+;;;### (autoloads nil "lpr" "lpr.el" (21670 32331 385639 720000))
;;; Generated autoloads from lpr.el
(defvar lpr-windows-system (memq system-type '(ms-dos windows-nt)) "\
@@ -17189,8 +17213,8 @@ for further customization of the printer command.
;;;***
-;;;### (autoloads nil "ls-lisp" "ls-lisp.el" (21678 60839 865762
-;;;;;; 924000))
+;;;### (autoloads nil "ls-lisp" "ls-lisp.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from ls-lisp.el
(defvar ls-lisp-support-shell-wildcards t "\
@@ -17201,8 +17225,8 @@ Otherwise they are treated as Emacs regexps (for backward compatibility).")
;;;***
-;;;### (autoloads nil "lunar" "calendar/lunar.el" (21678 60839 321741
-;;;;;; 62000))
+;;;### (autoloads nil "lunar" "calendar/lunar.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from calendar/lunar.el
(autoload 'lunar-phases "lunar" "\
@@ -17214,8 +17238,8 @@ This function is suitable for execution in an init file.
;;;***
-;;;### (autoloads nil "m4-mode" "progmodes/m4-mode.el" (21678 60840
-;;;;;; 317781 30000))
+;;;### (autoloads nil "m4-mode" "progmodes/m4-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/m4-mode.el
(autoload 'm4-mode "m4-mode" "\
@@ -17225,7 +17249,7 @@ A major mode to edit m4 macro files.
;;;***
-;;;### (autoloads nil "macros" "macros.el" (21678 60839 869763 84000))
+;;;### (autoloads nil "macros" "macros.el" (21670 32331 385639 720000))
;;; Generated autoloads from macros.el
(autoload 'name-last-kbd-macro "macros" "\
@@ -17314,8 +17338,8 @@ and then select the region of un-tablified names and use
;;;***
-;;;### (autoloads nil "mail-extr" "mail/mail-extr.el" (21678 60839
-;;;;;; 869763 84000))
+;;;### (autoloads nil "mail-extr" "mail/mail-extr.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/mail-extr.el
(autoload 'mail-extract-address-components "mail-extr" "\
@@ -17345,8 +17369,8 @@ Convert mail domain DOMAIN to the country it corresponds to.
;;;***
-;;;### (autoloads nil "mail-hist" "mail/mail-hist.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "mail-hist" "mail/mail-hist.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/mail-hist.el
(autoload 'mail-hist-define-keys "mail-hist" "\
@@ -17375,8 +17399,8 @@ This function normally would be called when the message is sent.
;;;***
-;;;### (autoloads nil "mail-utils" "mail/mail-utils.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "mail-utils" "mail/mail-utils.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/mail-utils.el
(defvar mail-use-rfc822 nil "\
@@ -17450,8 +17474,8 @@ matches may be returned from the message body.
;;;***
-;;;### (autoloads nil "mailabbrev" "mail/mailabbrev.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "mailabbrev" "mail/mailabbrev.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/mailabbrev.el
(defvar mail-abbrevs-mode nil "\
@@ -17500,8 +17524,8 @@ double-quotes.
;;;***
-;;;### (autoloads nil "mailalias" "mail/mailalias.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "mailalias" "mail/mailalias.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/mailalias.el
(defvar mail-complete-style 'angles "\
@@ -17554,8 +17578,8 @@ current header, calls `mail-complete-function' and passes prefix ARG if any.
;;;***
-;;;### (autoloads nil "mailclient" "mail/mailclient.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "mailclient" "mail/mailclient.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/mailclient.el
(autoload 'mailclient-send-it "mailclient" "\
@@ -17567,8 +17591,8 @@ The mail client is taken to be the handler of mailto URLs.
;;;***
-;;;### (autoloads nil "make-mode" "progmodes/make-mode.el" (21678
-;;;;;; 60840 321781 190000))
+;;;### (autoloads nil "make-mode" "progmodes/make-mode.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/make-mode.el
(autoload 'makefile-mode "make-mode" "\
@@ -17685,8 +17709,8 @@ An adapted `makefile-mode' that knows about imake.
;;;***
-;;;### (autoloads nil "makesum" "makesum.el" (21678 60839 893764
-;;;;;; 49000))
+;;;### (autoloads nil "makesum" "makesum.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from makesum.el
(autoload 'make-command-summary "makesum" "\
@@ -17697,7 +17721,7 @@ Previous contents of that buffer are killed first.
;;;***
-;;;### (autoloads nil "man" "man.el" (21678 60839 893764 49000))
+;;;### (autoloads nil "man" "man.el" (21814 9129 320508 708000))
;;; Generated autoloads from man.el
(defalias 'manual-entry 'man)
@@ -17753,7 +17777,7 @@ Default bookmark handler for Man buffers.
;;;***
-;;;### (autoloads nil "master" "master.el" (21678 60839 893764 49000))
+;;;### (autoloads nil "master" "master.el" (21670 32331 385639 720000))
;;; Generated autoloads from master.el
(push (purecopy '(master 1 0 2)) package--builtin-versions)
@@ -17776,8 +17800,8 @@ yourself the value of `master-of' by calling `master-show-slave'.
;;;***
-;;;### (autoloads nil "mb-depth" "mb-depth.el" (21678 60839 893764
-;;;;;; 49000))
+;;;### (autoloads nil "mb-depth" "mb-depth.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from mb-depth.el
(defvar minibuffer-depth-indicate-mode nil "\
@@ -17804,14 +17828,14 @@ recursion depth in the minibuffer prompt. This is only useful if
;;;***
-;;;### (autoloads nil "md4" "md4.el" (21678 60839 897764 210000))
+;;;### (autoloads nil "md4" "md4.el" (21670 32331 385639 720000))
;;; Generated autoloads from md4.el
(push (purecopy '(md4 1 0)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "message" "gnus/message.el" (21803 61751 293340
-;;;;;; 642000))
+;;;### (autoloads nil "message" "gnus/message.el" (21822 37322 690488
+;;;;;; 175000))
;;; Generated autoloads from gnus/message.el
(define-mail-user-agent 'message-user-agent 'message-mail 'message-send-and-exit 'message-kill-buffer 'message-send-hook)
@@ -17976,8 +18000,8 @@ which specify the range to operate on.
;;;***
-;;;### (autoloads nil "meta-mode" "progmodes/meta-mode.el" (21678
-;;;;;; 60840 321781 190000))
+;;;### (autoloads nil "meta-mode" "progmodes/meta-mode.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/meta-mode.el
(push (purecopy '(meta-mode 1 0)) package--builtin-versions)
@@ -17993,8 +18017,8 @@ Major mode for editing MetaPost sources.
;;;***
-;;;### (autoloads nil "metamail" "mail/metamail.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "metamail" "mail/metamail.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/metamail.el
(autoload 'metamail-interpret-header "metamail" "\
@@ -18037,8 +18061,8 @@ redisplayed as output is inserted.
;;;***
-;;;### (autoloads nil "mh-comp" "mh-e/mh-comp.el" (21678 60839 913764
-;;;;;; 853000))
+;;;### (autoloads nil "mh-comp" "mh-e/mh-comp.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from mh-e/mh-comp.el
(autoload 'mh-smail "mh-comp" "\
@@ -18128,7 +18152,7 @@ delete the draft message.
;;;***
-;;;### (autoloads nil "mh-e" "mh-e/mh-e.el" (21678 60839 917765 13000))
+;;;### (autoloads nil "mh-e" "mh-e/mh-e.el" (21670 32331 385639 720000))
;;; Generated autoloads from mh-e/mh-e.el
(push (purecopy '(mh-e 8 6)) package--builtin-versions)
@@ -18145,8 +18169,8 @@ Display version information about MH-E and the MH mail handling system.
;;;***
-;;;### (autoloads nil "mh-folder" "mh-e/mh-folder.el" (21678 60839
-;;;;;; 917765 13000))
+;;;### (autoloads nil "mh-folder" "mh-e/mh-folder.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mh-e/mh-folder.el
(autoload 'mh-rmail "mh-folder" "\
@@ -18227,10 +18251,24 @@ perform the operation on all messages in that region.
;;;***
-;;;### (autoloads nil "midnight" "midnight.el" (21678 60839 937765
-;;;;;; 817000))
+;;;### (autoloads nil "midnight" "midnight.el" (21822 58098 20521
+;;;;;; 61000))
;;; Generated autoloads from midnight.el
+(defvar midnight-mode nil "\
+Non-nil if Midnight mode is enabled.
+See the command `midnight-mode' for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `midnight-mode'.")
+
+(custom-autoload 'midnight-mode "midnight" nil)
+
+(autoload 'midnight-mode "midnight" "\
+Non-nil means run `midnight-hook' at midnight.
+
+\(fn &optional ARG)" t nil)
+
(autoload 'clean-buffer-list "midnight" "\
Kill old buffers that have not been displayed recently.
The relevant variables are `clean-buffer-list-delay-general',
@@ -18254,8 +18292,8 @@ to its second argument TM.
;;;***
-;;;### (autoloads nil "minibuf-eldef" "minibuf-eldef.el" (21678 60839
-;;;;;; 937765 817000))
+;;;### (autoloads nil "minibuf-eldef" "minibuf-eldef.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from minibuf-eldef.el
(defvar minibuffer-electric-default-mode nil "\
@@ -18284,7 +18322,7 @@ is modified to remove the default indication.
;;;***
-;;;### (autoloads nil "misc" "misc.el" (21678 60839 941765 977000))
+;;;### (autoloads nil "misc" "misc.el" (21670 32331 385639 720000))
;;; Generated autoloads from misc.el
(autoload 'butterfly "misc" "\
@@ -18312,8 +18350,7 @@ The return value is always nil.
;;;***
-;;;### (autoloads nil "misearch" "misearch.el" (21797 54705 52905
-;;;;;; 188000))
+;;;### (autoloads nil "misearch" "misearch.el" (21797 36 720489 297000))
;;; Generated autoloads from misearch.el
(add-hook 'isearch-mode-hook 'multi-isearch-setup)
@@ -18401,8 +18438,8 @@ whose file names match the specified wildcard.
;;;***
-;;;### (autoloads nil "mixal-mode" "progmodes/mixal-mode.el" (21678
-;;;;;; 60840 321781 190000))
+;;;### (autoloads nil "mixal-mode" "progmodes/mixal-mode.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/mixal-mode.el
(push (purecopy '(mixal-mode 0 1)) package--builtin-versions)
@@ -18413,8 +18450,8 @@ Major mode for the mixal asm language.
;;;***
-;;;### (autoloads nil "mm-encode" "gnus/mm-encode.el" (21678 60839
-;;;;;; 697756 173000))
+;;;### (autoloads nil "mm-encode" "gnus/mm-encode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/mm-encode.el
(autoload 'mm-default-file-encoding "mm-encode" "\
@@ -18424,8 +18461,8 @@ Return a default encoding for FILE.
;;;***
-;;;### (autoloads nil "mm-extern" "gnus/mm-extern.el" (21678 60839
-;;;;;; 697756 173000))
+;;;### (autoloads nil "mm-extern" "gnus/mm-extern.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/mm-extern.el
(autoload 'mm-extern-cache-contents "mm-extern" "\
@@ -18443,8 +18480,8 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
;;;***
-;;;### (autoloads nil "mm-partial" "gnus/mm-partial.el" (21678 60839
-;;;;;; 697756 173000))
+;;;### (autoloads nil "mm-partial" "gnus/mm-partial.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/mm-partial.el
(autoload 'mm-inline-partial "mm-partial" "\
@@ -18457,8 +18494,8 @@ If NO-DISPLAY is nil, display it. Otherwise, do nothing after replacing.
;;;***
-;;;### (autoloads nil "mm-url" "gnus/mm-url.el" (21678 60839 697756
-;;;;;; 173000))
+;;;### (autoloads nil "mm-url" "gnus/mm-url.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/mm-url.el
(autoload 'mm-url-insert-file-contents "mm-url" "\
@@ -18474,8 +18511,8 @@ Insert file contents of URL using `mm-url-program'.
;;;***
-;;;### (autoloads nil "mm-uu" "gnus/mm-uu.el" (21678 60839 697756
-;;;;;; 173000))
+;;;### (autoloads nil "mm-uu" "gnus/mm-uu.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/mm-uu.el
(autoload 'mm-uu-dissect "mm-uu" "\
@@ -18494,7 +18531,7 @@ Assume text has been decoded if DECODED is non-nil.
;;;***
-;;;### (autoloads nil "mml" "gnus/mml.el" (21678 60839 701756 333000))
+;;;### (autoloads nil "mml" "gnus/mml.el" (21826 49866 790514 606000))
;;; Generated autoloads from gnus/mml.el
(autoload 'mml-to-mime "mml" "\
@@ -18519,8 +18556,8 @@ body) or \"attachment\" (separate from the body).
;;;***
-;;;### (autoloads nil "mml1991" "gnus/mml1991.el" (21678 60839 701756
-;;;;;; 333000))
+;;;### (autoloads nil "mml1991" "gnus/mml1991.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/mml1991.el
(autoload 'mml1991-encrypt "mml1991" "\
@@ -18535,8 +18572,8 @@ body) or \"attachment\" (separate from the body).
;;;***
-;;;### (autoloads nil "mml2015" "gnus/mml2015.el" (21678 60839 701756
-;;;;;; 333000))
+;;;### (autoloads nil "mml2015" "gnus/mml2015.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/mml2015.el
(autoload 'mml2015-decrypt "mml2015" "\
@@ -18576,16 +18613,16 @@ body) or \"attachment\" (separate from the body).
;;;***
-;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (21678 60839
-;;;;;; 349742 188000))
+;;;### (autoloads nil "mode-local" "cedet/mode-local.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from cedet/mode-local.el
(put 'define-overloadable-function 'doc-string-elt 3)
;;;***
-;;;### (autoloads nil "modula2" "progmodes/modula2.el" (21605 26937
-;;;;;; 524012 932000))
+;;;### (autoloads nil "modula2" "progmodes/modula2.el" (21607 54478
+;;;;;; 800121 42000))
;;; Generated autoloads from progmodes/modula2.el
(defalias 'modula-2-mode 'm2-mode)
@@ -18618,8 +18655,8 @@ followed by the first character of the construct.
;;;***
-;;;### (autoloads nil "morse" "play/morse.el" (21678 60840 209776
-;;;;;; 710000))
+;;;### (autoloads nil "morse" "play/morse.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/morse.el
(autoload 'morse-region "morse" "\
@@ -18644,8 +18681,8 @@ Convert NATO phonetic alphabet in region to ordinary ASCII text.
;;;***
-;;;### (autoloads nil "mouse-drag" "mouse-drag.el" (21678 60839 949766
-;;;;;; 299000))
+;;;### (autoloads nil "mouse-drag" "mouse-drag.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from mouse-drag.el
(autoload 'mouse-drag-throw "mouse-drag" "\
@@ -18692,7 +18729,7 @@ To test this function, evaluate:
;;;***
-;;;### (autoloads nil "mpc" "mpc.el" (21678 60839 953766 460000))
+;;;### (autoloads nil "mpc" "mpc.el" (21670 32331 385639 720000))
;;; Generated autoloads from mpc.el
(autoload 'mpc "mpc" "\
@@ -18702,7 +18739,7 @@ Main entry point for MPC.
;;;***
-;;;### (autoloads nil "mpuz" "play/mpuz.el" (21678 60840 209776 710000))
+;;;### (autoloads nil "mpuz" "play/mpuz.el" (21670 32331 385639 720000))
;;; Generated autoloads from play/mpuz.el
(autoload 'mpuz "mpuz" "\
@@ -18712,7 +18749,7 @@ Multiplication puzzle with GNU Emacs.
;;;***
-;;;### (autoloads nil "msb" "msb.el" (21678 60839 953766 460000))
+;;;### (autoloads nil "msb" "msb.el" (21670 32331 385639 720000))
;;; Generated autoloads from msb.el
(defvar msb-mode nil "\
@@ -18737,8 +18774,8 @@ different buffer menu using the function `msb'.
;;;***
-;;;### (autoloads nil "mule-diag" "international/mule-diag.el" (21678
-;;;;;; 60839 777759 387000))
+;;;### (autoloads nil "mule-diag" "international/mule-diag.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from international/mule-diag.el
(autoload 'list-character-sets "mule-diag" "\
@@ -18870,8 +18907,8 @@ The default is 20. If LIMIT is negative, do not limit the listing.
;;;***
-;;;### (autoloads nil "mule-util" "international/mule-util.el" (21678
-;;;;;; 60839 781759 548000))
+;;;### (autoloads nil "mule-util" "international/mule-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from international/mule-util.el
(defsubst string-to-list (string) "\
@@ -19002,8 +19039,8 @@ per-character basis, this may not be accurate.
;;;***
-;;;### (autoloads nil "net-utils" "net/net-utils.el" (21706 14224
-;;;;;; 285958 900000))
+;;;### (autoloads nil "net-utils" "net/net-utils.el" (21826 50071
+;;;;;; 80489 638000))
;;; Generated autoloads from net/net-utils.el
(autoload 'ifconfig "net-utils" "\
@@ -19097,8 +19134,8 @@ Open a network connection to HOST on PORT.
;;;***
-;;;### (autoloads nil "netrc" "net/netrc.el" (21678 60839 973767
-;;;;;; 264000))
+;;;### (autoloads nil "netrc" "net/netrc.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from net/netrc.el
(autoload 'netrc-credentials "netrc" "\
@@ -19110,8 +19147,8 @@ listed in the PORTS list.
;;;***
-;;;### (autoloads nil "network-stream" "net/network-stream.el" (21718
-;;;;;; 7576 278960 757000))
+;;;### (autoloads nil "network-stream" "net/network-stream.el" (21716
+;;;;;; 41663 456033 27000))
;;; Generated autoloads from net/network-stream.el
(autoload 'open-network-stream "network-stream" "\
@@ -19207,8 +19244,8 @@ asynchronously, if possible.
;;;***
-;;;### (autoloads nil "newst-backend" "net/newst-backend.el" (21678
-;;;;;; 60839 977767 424000))
+;;;### (autoloads nil "newst-backend" "net/newst-backend.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from net/newst-backend.el
(autoload 'newsticker-running-p "newst-backend" "\
@@ -19230,7 +19267,7 @@ Run `newsticker-start-hook' if newsticker was not running already.
;;;***
;;;### (autoloads nil "newst-plainview" "net/newst-plainview.el"
-;;;;;; (21678 60839 977767 424000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from net/newst-plainview.el
(autoload 'newsticker-plainview "newst-plainview" "\
@@ -19240,8 +19277,8 @@ Start newsticker plainview.
;;;***
-;;;### (autoloads nil "newst-reader" "net/newst-reader.el" (21678
-;;;;;; 60839 977767 424000))
+;;;### (autoloads nil "newst-reader" "net/newst-reader.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from net/newst-reader.el
(autoload 'newsticker-show-news "newst-reader" "\
@@ -19251,8 +19288,8 @@ Start reading news. You may want to bind this to a key.
;;;***
-;;;### (autoloads nil "newst-ticker" "net/newst-ticker.el" (21678
-;;;;;; 60839 977767 424000))
+;;;### (autoloads nil "newst-ticker" "net/newst-ticker.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from net/newst-ticker.el
(autoload 'newsticker-ticker-running-p "newst-ticker" "\
@@ -19272,8 +19309,8 @@ running already.
;;;***
-;;;### (autoloads nil "newst-treeview" "net/newst-treeview.el" (21678
-;;;;;; 60839 981767 585000))
+;;;### (autoloads nil "newst-treeview" "net/newst-treeview.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from net/newst-treeview.el
(autoload 'newsticker-treeview "newst-treeview" "\
@@ -19283,8 +19320,8 @@ Start newsticker treeview.
;;;***
-;;;### (autoloads nil "nndiary" "gnus/nndiary.el" (21678 60839 705756
-;;;;;; 494000))
+;;;### (autoloads nil "nndiary" "gnus/nndiary.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/nndiary.el
(autoload 'nndiary-generate-nov-databases "nndiary" "\
@@ -19294,8 +19331,8 @@ Generate NOV databases in all nndiary directories.
;;;***
-;;;### (autoloads nil "nndoc" "gnus/nndoc.el" (21678 60839 705756
-;;;;;; 494000))
+;;;### (autoloads nil "nndoc" "gnus/nndoc.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/nndoc.el
(autoload 'nndoc-add-type "nndoc" "\
@@ -19309,8 +19346,8 @@ symbol in the alist.
;;;***
-;;;### (autoloads nil "nnfolder" "gnus/nnfolder.el" (21678 60839
-;;;;;; 709756 654000))
+;;;### (autoloads nil "nnfolder" "gnus/nnfolder.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/nnfolder.el
(autoload 'nnfolder-generate-active-file "nnfolder" "\
@@ -19321,7 +19358,7 @@ This command does not work if you use short group names.
;;;***
-;;;### (autoloads nil "nnml" "gnus/nnml.el" (21678 60839 717756 976000))
+;;;### (autoloads nil "nnml" "gnus/nnml.el" (21670 32331 385639 720000))
;;; Generated autoloads from gnus/nnml.el
(autoload 'nnml-generate-nov-databases "nnml" "\
@@ -19331,7 +19368,7 @@ Generate NOV databases in all nnml directories.
;;;***
-;;;### (autoloads nil "novice" "novice.el" (21678 60840 13768 869000))
+;;;### (autoloads nil "novice" "novice.el" (21670 32331 385639 720000))
;;; Generated autoloads from novice.el
(define-obsolete-variable-alias 'disabled-command-hook 'disabled-command-function "22.1")
@@ -19363,8 +19400,8 @@ future sessions.
;;;***
-;;;### (autoloads nil "nroff-mode" "textmodes/nroff-mode.el" (21678
-;;;;;; 60840 457786 630000))
+;;;### (autoloads nil "nroff-mode" "textmodes/nroff-mode.el" (21670
+;;;;;; 32331 885635 586000))
;;; Generated autoloads from textmodes/nroff-mode.el
(autoload 'nroff-mode "nroff-mode" "\
@@ -19378,14 +19415,14 @@ closing requests for requests that are used in matched pairs.
;;;***
-;;;### (autoloads nil "ntlm" "net/ntlm.el" (21678 60839 981767 585000))
+;;;### (autoloads nil "ntlm" "net/ntlm.el" (21670 32331 385639 720000))
;;; Generated autoloads from net/ntlm.el
(push (purecopy '(ntlm 1 0)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "nxml-glyph" "nxml/nxml-glyph.el" (21678 60840
-;;;;;; 13768 869000))
+;;;### (autoloads nil "nxml-glyph" "nxml/nxml-glyph.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from nxml/nxml-glyph.el
(autoload 'nxml-glyph-display-string "nxml-glyph" "\
@@ -19397,8 +19434,8 @@ Return nil if the face cannot display a glyph for N.
;;;***
-;;;### (autoloads nil "nxml-mode" "nxml/nxml-mode.el" (21678 60840
-;;;;;; 17769 29000))
+;;;### (autoloads nil "nxml-mode" "nxml/nxml-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from nxml/nxml-mode.el
(autoload 'nxml-mode "nxml-mode" "\
@@ -19458,8 +19495,8 @@ Many aspects this mode can be customized using
;;;***
-;;;### (autoloads nil "nxml-uchnm" "nxml/nxml-uchnm.el" (21678 60840
-;;;;;; 17769 29000))
+;;;### (autoloads nil "nxml-uchnm" "nxml/nxml-uchnm.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from nxml/nxml-uchnm.el
(autoload 'nxml-enable-unicode-char-name-sets "nxml-uchnm" "\
@@ -19471,8 +19508,8 @@ the variable `nxml-enabled-unicode-blocks'.
;;;***
-;;;### (autoloads nil "octave" "progmodes/octave.el" (21694 48017
-;;;;;; 610101 961000))
+;;;### (autoloads nil "octave" "progmodes/octave.el" (21695 35516
+;;;;;; 595262 313000))
;;; Generated autoloads from progmodes/octave.el
(autoload 'octave-mode "octave" "\
@@ -19509,8 +19546,8 @@ startup file, `~/.emacs-octave'.
;;;***
-;;;### (autoloads nil "opascal" "progmodes/opascal.el" (21678 60840
-;;;;;; 325781 350000))
+;;;### (autoloads nil "opascal" "progmodes/opascal.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/opascal.el
(define-obsolete-function-alias 'delphi-mode 'opascal-mode "24.4")
@@ -19545,7 +19582,7 @@ Coloring:
;;;***
-;;;### (autoloads nil "org" "org/org.el" (21804 3763 242436 828000))
+;;;### (autoloads nil "org" "org/org.el" (21814 9129 360494 26000))
;;; Generated autoloads from org/org.el
(autoload 'org-babel-do-load-languages "org" "\
@@ -19766,8 +19803,8 @@ Call the customize function with org as argument.
;;;***
-;;;### (autoloads nil "org-agenda" "org/org-agenda.el" (21804 3763
-;;;;;; 222437 179000))
+;;;### (autoloads nil "org-agenda" "org/org-agenda.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from org/org-agenda.el
(autoload 'org-toggle-sticky-agenda "org-agenda" "\
@@ -20040,8 +20077,8 @@ to override `appt-message-warning-time'.
;;;***
-;;;### (autoloads nil "org-capture" "org/org-capture.el" (21678 60840
-;;;;;; 117773 29000))
+;;;### (autoloads nil "org-capture" "org/org-capture.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from org/org-capture.el
(autoload 'org-capture-string "org-capture" "\
@@ -20083,8 +20120,8 @@ Set `org-capture-templates' to be similar to `org-remember-templates'.
;;;***
-;;;### (autoloads nil "org-colview" "org/org-colview.el" (21804 3763
-;;;;;; 222437 179000))
+;;;### (autoloads nil "org-colview" "org/org-colview.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from org/org-colview.el
(autoload 'org-columns-remove-overlays "org-colview" "\
@@ -20147,8 +20184,8 @@ Turn on or update column view in the agenda.
;;;***
-;;;### (autoloads nil "org-compat" "org/org-compat.el" (21678 60840
-;;;;;; 121773 189000))
+;;;### (autoloads nil "org-compat" "org/org-compat.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from org/org-compat.el
(autoload 'org-check-version "org-compat" "\
@@ -20158,8 +20195,8 @@ Try very hard to provide sensible version strings.
;;;***
-;;;### (autoloads nil "org-macs" "org/org-macs.el" (21678 60840 137773
-;;;;;; 829000))
+;;;### (autoloads nil "org-macs" "org/org-macs.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from org/org-macs.el
(autoload 'org-load-noerror-mustsuffix "org-macs" "\
@@ -20169,8 +20206,8 @@ Load FILE with optional arguments NOERROR and MUSTSUFFIX. Drop the MUSTSUFFIX a
;;;***
-;;;### (autoloads nil "org-version" "org/org-version.el" (21605 26937
-;;;;;; 304017 159000))
+;;;### (autoloads nil "org-version" "org/org-version.el" (21607 54478
+;;;;;; 800121 42000))
;;; Generated autoloads from org/org-version.el
(autoload 'org-release "org-version" "\
@@ -20187,8 +20224,8 @@ The Git version of org-mode.
;;;***
-;;;### (autoloads nil "outline" "outline.el" (21719 45321 591080
-;;;;;; 883000))
+;;;### (autoloads nil "outline" "outline.el" (21720 38720 956749
+;;;;;; 443000))
;;; Generated autoloads from outline.el
(put 'outline-regexp 'safe-local-variable 'stringp)
(put 'outline-heading-end-regexp 'safe-local-variable 'stringp)
@@ -20231,8 +20268,8 @@ See the command `outline-mode' for more information on this mode.
;;;***
-;;;### (autoloads nil "package" "emacs-lisp/package.el" (21803 61751
-;;;;;; 265341 801000))
+;;;### (autoloads nil "package" "emacs-lisp/package.el" (21826 49900
+;;;;;; 450489 321000))
;;; Generated autoloads from emacs-lisp/package.el
(push (purecopy '(package 1 0 1)) package--builtin-versions)
@@ -20307,7 +20344,7 @@ The file can either be a tar file or an Emacs Lisp file.
\(fn FILE)" t nil)
-(autoload 'package-install-user-selected-packages "package" "\
+(autoload 'package-install-selected-packages "package" "\
Ensure packages in `package-selected-packages' are installed.
If some packages are not installed propose to install them.
@@ -20346,7 +20383,7 @@ The list is displayed in a buffer named `*Packages*'.
;;;***
-;;;### (autoloads nil "paren" "paren.el" (21678 60840 193776 69000))
+;;;### (autoloads nil "paren" "paren.el" (21670 32331 385639 720000))
;;; Generated autoloads from paren.el
(defvar show-paren-mode nil "\
@@ -20372,8 +20409,8 @@ matching parenthesis is highlighted in `show-paren-style' after
;;;***
-;;;### (autoloads nil "parse-time" "calendar/parse-time.el" (21678
-;;;;;; 60839 321741 62000))
+;;;### (autoloads nil "parse-time" "calendar/parse-time.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from calendar/parse-time.el
(put 'parse-time-rules 'risky-local-variable t)
@@ -20386,8 +20423,8 @@ unknown are returned as nil.
;;;***
-;;;### (autoloads nil "pascal" "progmodes/pascal.el" (21678 60840
-;;;;;; 329781 510000))
+;;;### (autoloads nil "pascal" "progmodes/pascal.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/pascal.el
(autoload 'pascal-mode "pascal" "\
@@ -20436,8 +20473,8 @@ See also the user variables `pascal-type-keywords', `pascal-start-keywords' and
;;;***
-;;;### (autoloads nil "password-cache" "password-cache.el" (21678
-;;;;;; 60840 193776 69000))
+;;;### (autoloads nil "password-cache" "password-cache.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from password-cache.el
(defvar password-cache t "\
@@ -20458,8 +20495,8 @@ Check if KEY is in the cache.
;;;***
-;;;### (autoloads nil "pcase" "emacs-lisp/pcase.el" (21804 3853 736850
-;;;;;; 365000))
+;;;### (autoloads nil "pcase" "emacs-lisp/pcase.el" (21804 59688
+;;;;;; 164807 902000))
;;; Generated autoloads from emacs-lisp/pcase.el
(autoload 'pcase "pcase" "\
@@ -20554,8 +20591,8 @@ Define a pcase UPattern macro.
;;;***
-;;;### (autoloads nil "pcmpl-cvs" "pcmpl-cvs.el" (21678 60840 193776
-;;;;;; 69000))
+;;;### (autoloads nil "pcmpl-cvs" "pcmpl-cvs.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from pcmpl-cvs.el
(autoload 'pcomplete/cvs "pcmpl-cvs" "\
@@ -20565,8 +20602,8 @@ Completion rules for the `cvs' command.
;;;***
-;;;### (autoloads nil "pcmpl-gnu" "pcmpl-gnu.el" (21678 60840 193776
-;;;;;; 69000))
+;;;### (autoloads nil "pcmpl-gnu" "pcmpl-gnu.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from pcmpl-gnu.el
(autoload 'pcomplete/gzip "pcmpl-gnu" "\
@@ -20593,8 +20630,8 @@ Completion for the GNU tar utility.
;;;***
-;;;### (autoloads nil "pcmpl-linux" "pcmpl-linux.el" (21678 60840
-;;;;;; 193776 69000))
+;;;### (autoloads nil "pcmpl-linux" "pcmpl-linux.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from pcmpl-linux.el
(autoload 'pcomplete/kill "pcmpl-linux" "\
@@ -20614,8 +20651,8 @@ Completion for GNU/Linux `mount'.
;;;***
-;;;### (autoloads nil "pcmpl-rpm" "pcmpl-rpm.el" (21678 60840 193776
-;;;;;; 69000))
+;;;### (autoloads nil "pcmpl-rpm" "pcmpl-rpm.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from pcmpl-rpm.el
(autoload 'pcomplete/rpm "pcmpl-rpm" "\
@@ -20625,8 +20662,8 @@ Completion for the `rpm' command.
;;;***
-;;;### (autoloads nil "pcmpl-unix" "pcmpl-unix.el" (21790 46509 343608
-;;;;;; 375000))
+;;;### (autoloads nil "pcmpl-unix" "pcmpl-unix.el" (21791 47660 796747
+;;;;;; 422000))
;;; Generated autoloads from pcmpl-unix.el
(autoload 'pcomplete/cd "pcmpl-unix" "\
@@ -20681,8 +20718,8 @@ Includes files as well as host names followed by a colon.
;;;***
-;;;### (autoloads nil "pcmpl-x" "pcmpl-x.el" (21678 60840 193776
-;;;;;; 69000))
+;;;### (autoloads nil "pcmpl-x" "pcmpl-x.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from pcmpl-x.el
(autoload 'pcomplete/tlmgr "pcmpl-x" "\
@@ -20706,8 +20743,8 @@ Completion for the `ag' command.
;;;***
-;;;### (autoloads nil "pcomplete" "pcomplete.el" (21804 3763 246436
-;;;;;; 758000))
+;;;### (autoloads nil "pcomplete" "pcomplete.el" (21688 62278 418203
+;;;;;; 119000))
;;; Generated autoloads from pcomplete.el
(autoload 'pcomplete "pcomplete" "\
@@ -20764,7 +20801,7 @@ Setup `shell-mode' to use pcomplete.
;;;***
-;;;### (autoloads nil "pcvs" "vc/pcvs.el" (21678 60840 533789 670000))
+;;;### (autoloads nil "pcvs" "vc/pcvs.el" (21670 32331 885635 586000))
;;; Generated autoloads from vc/pcvs.el
(autoload 'cvs-checkout "pcvs" "\
@@ -20839,8 +20876,8 @@ The exact behavior is determined also by `cvs-dired-use-hook'." (when (stringp d
;;;***
-;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (21678 60840
-;;;;;; 533789 670000))
+;;;### (autoloads nil "pcvs-defs" "vc/pcvs-defs.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/pcvs-defs.el
(defvar cvs-global-menu (let ((m (make-sparse-keymap "PCL-CVS"))) (define-key m [status] `(menu-item ,(purecopy "Directory Status") cvs-status :help ,(purecopy "A more verbose status of a workarea"))) (define-key m [checkout] `(menu-item ,(purecopy "Checkout Module") cvs-checkout :help ,(purecopy "Check out a module from the repository"))) (define-key m [update] `(menu-item ,(purecopy "Update Directory") cvs-update :help ,(purecopy "Fetch updates from the repository"))) (define-key m [examine] `(menu-item ,(purecopy "Examine Directory") cvs-examine :help ,(purecopy "Examine the current state of a workarea"))) (fset 'cvs-global-menu m)) "\
@@ -20848,8 +20885,8 @@ Global menu used by PCL-CVS.")
;;;***
-;;;### (autoloads nil "perl-mode" "progmodes/perl-mode.el" (21678
-;;;;;; 60840 329781 510000))
+;;;### (autoloads nil "perl-mode" "progmodes/perl-mode.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from progmodes/perl-mode.el
(put 'perl-indent-level 'safe-local-variable 'integerp)
(put 'perl-continued-statement-offset 'safe-local-variable 'integerp)
@@ -20910,8 +20947,8 @@ Turning on Perl mode runs the normal hook `perl-mode-hook'.
;;;***
-;;;### (autoloads nil "picture" "textmodes/picture.el" (21678 60840
-;;;;;; 457786 630000))
+;;;### (autoloads nil "picture" "textmodes/picture.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from textmodes/picture.el
(autoload 'picture-mode "picture" "\
@@ -20991,8 +21028,8 @@ they are not by default assigned to keys.
;;;***
-;;;### (autoloads nil "plstore" "gnus/plstore.el" (21785 63745 85575
-;;;;;; 501000))
+;;;### (autoloads nil "plstore" "gnus/plstore.el" (21786 29744 368212
+;;;;;; 633000))
;;; Generated autoloads from gnus/plstore.el
(autoload 'plstore-open "plstore" "\
@@ -21007,8 +21044,8 @@ Major mode for editing PLSTORE files.
;;;***
-;;;### (autoloads nil "po" "textmodes/po.el" (21678 60840 457786
-;;;;;; 630000))
+;;;### (autoloads nil "po" "textmodes/po.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from textmodes/po.el
(autoload 'po-find-file-coding-system "po" "\
@@ -21019,7 +21056,7 @@ Called through `file-coding-system-alist', before the file is visited for real.
;;;***
-;;;### (autoloads nil "pong" "play/pong.el" (21678 60840 209776 710000))
+;;;### (autoloads nil "pong" "play/pong.el" (21670 32331 385639 720000))
;;; Generated autoloads from play/pong.el
(autoload 'pong "pong" "\
@@ -21035,7 +21072,7 @@ pong-mode keybindings:\\<pong-mode-map>
;;;***
-;;;### (autoloads nil "pop3" "gnus/pop3.el" (21678 60839 725757 297000))
+;;;### (autoloads nil "pop3" "gnus/pop3.el" (21670 32331 385639 720000))
;;; Generated autoloads from gnus/pop3.el
(autoload 'pop3-movemail "pop3" "\
@@ -21046,8 +21083,8 @@ Use streaming commands.
;;;***
-;;;### (autoloads nil "pp" "emacs-lisp/pp.el" (21678 60839 485747
-;;;;;; 653000))
+;;;### (autoloads nil "pp" "emacs-lisp/pp.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/pp.el
(autoload 'pp-to-string "pp" "\
@@ -21097,8 +21134,8 @@ Ignores leading comment characters.
;;;***
-;;;### (autoloads nil "printing" "printing.el" (21678 60840 217777
-;;;;;; 30000))
+;;;### (autoloads nil "printing" "printing.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from printing.el
(push (purecopy '(printing 6 9 3)) package--builtin-versions)
@@ -21686,7 +21723,7 @@ are both set to t.
;;;***
-;;;### (autoloads nil "proced" "proced.el" (21678 60840 217777 30000))
+;;;### (autoloads nil "proced" "proced.el" (21670 32331 385639 720000))
;;; Generated autoloads from proced.el
(autoload 'proced "proced" "\
@@ -21704,8 +21741,8 @@ Proced buffers.
;;;***
-;;;### (autoloads nil "profiler" "profiler.el" (21678 60840 217777
-;;;;;; 30000))
+;;;### (autoloads nil "profiler" "profiler.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from profiler.el
(autoload 'profiler-start "profiler" "\
@@ -21733,8 +21770,8 @@ Open profile FILENAME.
;;;***
-;;;### (autoloads nil "prolog" "progmodes/prolog.el" (21678 60840
-;;;;;; 329781 510000))
+;;;### (autoloads nil "prolog" "progmodes/prolog.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/prolog.el
(autoload 'prolog-mode "prolog" "\
@@ -21767,7 +21804,7 @@ With prefix argument ARG, restart the Prolog process if running before.
;;;***
-;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (21678 60840 377783 430000))
+;;;### (autoloads nil "ps-bdf" "ps-bdf.el" (21670 32331 885635 586000))
;;; Generated autoloads from ps-bdf.el
(defvar bdf-directory-list (if (memq system-type '(ms-dos windows-nt)) (list (expand-file-name "fonts/bdf" installation-directory)) '("/usr/local/share/emacs/fonts/bdf")) "\
@@ -21778,8 +21815,8 @@ The default value is '(\"/usr/local/share/emacs/fonts/bdf\").")
;;;***
-;;;### (autoloads nil "ps-mode" "progmodes/ps-mode.el" (21678 60840
-;;;;;; 333781 670000))
+;;;### (autoloads nil "ps-mode" "progmodes/ps-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/ps-mode.el
(push (purecopy '(ps-mode 1 1 9)) package--builtin-versions)
@@ -21825,8 +21862,8 @@ Typing \\<ps-run-mode-map>\\[ps-run-goto-error] when the cursor is at the number
;;;***
-;;;### (autoloads nil "ps-print" "ps-print.el" (21678 60840 385783
-;;;;;; 750000))
+;;;### (autoloads nil "ps-print" "ps-print.el" (21670 32624 385626
+;;;;;; 484000))
;;; Generated autoloads from ps-print.el
(push (purecopy '(ps-print 7 3 5)) package--builtin-versions)
@@ -22023,15 +22060,15 @@ If EXTENSION is any other symbol, it is ignored.
;;;***
-;;;### (autoloads nil "pulse" "cedet/pulse.el" (21678 60839 349742
-;;;;;; 188000))
+;;;### (autoloads nil "pulse" "cedet/pulse.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from cedet/pulse.el
(push (purecopy '(pulse 1 0)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "python" "progmodes/python.el" (21803 61751
-;;;;;; 297340 476000))
+;;;### (autoloads nil "python" "progmodes/python.el" (21826 300 630487
+;;;;;; 331000))
;;; Generated autoloads from progmodes/python.el
(push (purecopy '(python 0 24 5)) package--builtin-versions)
@@ -22068,7 +22105,7 @@ Major mode for editing Python files.
;;;***
-;;;### (autoloads nil "qp" "gnus/qp.el" (21678 60839 725757 297000))
+;;;### (autoloads nil "qp" "gnus/qp.el" (21670 32331 385639 720000))
;;; Generated autoloads from gnus/qp.el
(autoload 'quoted-printable-decode-region "qp" "\
@@ -22087,8 +22124,8 @@ them into characters should be done separately.
;;;***
-;;;### (autoloads nil "quail" "international/quail.el" (21760 22311
-;;;;;; 618792 686000))
+;;;### (autoloads nil "quail" "international/quail.el" (21761 26543
+;;;;;; 734945 674000))
;;; Generated autoloads from international/quail.el
(autoload 'quail-title "quail" "\
@@ -22319,7 +22356,7 @@ of each directory.
;;;***
;;;### (autoloads nil "quail/hangul" "leim/quail/hangul.el" (21770
-;;;;;; 15582 625546 353000))
+;;;;;; 41522 196747 399000))
;;; Generated autoloads from leim/quail/hangul.el
(autoload 'hangul-input-method-activate "quail/hangul" "\
@@ -22332,7 +22369,7 @@ HELP-TEXT is a text set in `hangul-input-method-help-text'.
;;;***
;;;### (autoloads nil "quail/uni-input" "leim/quail/uni-input.el"
-;;;;;; (21678 60839 861762 763000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from leim/quail/uni-input.el
(autoload 'ucs-input-activate "quail/uni-input" "\
@@ -22346,8 +22383,8 @@ While this input method is active, the variable
;;;***
-;;;### (autoloads nil "quickurl" "net/quickurl.el" (21678 60839 985767
-;;;;;; 746000))
+;;;### (autoloads nil "quickurl" "net/quickurl.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from net/quickurl.el
(defconst quickurl-reread-hook-postfix "\n;; Local Variables:\n;; eval: (progn (require 'quickurl) (add-hook 'local-write-file-hooks (lambda () (quickurl-read) nil)))\n;; End:\n" "\
@@ -22418,8 +22455,7 @@ Display `quickurl-list' as a formatted list using `quickurl-list-mode'.
;;;***
-;;;### (autoloads nil "rcirc" "net/rcirc.el" (21799 25426 601363
-;;;;;; 687000))
+;;;### (autoloads nil "rcirc" "net/rcirc.el" (21826 300 570503 812000))
;;; Generated autoloads from net/rcirc.el
(autoload 'rcirc "rcirc" "\
@@ -22457,8 +22493,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "re-builder" "emacs-lisp/re-builder.el" (21678
-;;;;;; 60839 489747 814000))
+;;;### (autoloads nil "re-builder" "emacs-lisp/re-builder.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/re-builder.el
(defalias 'regexp-builder 're-builder)
@@ -22476,8 +22512,8 @@ matching parts of the target buffer will be highlighted.
;;;***
-;;;### (autoloads nil "recentf" "recentf.el" (21678 60840 385783
-;;;;;; 750000))
+;;;### (autoloads nil "recentf" "recentf.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from recentf.el
(defvar recentf-mode nil "\
@@ -22503,7 +22539,7 @@ were operated on recently.
;;;***
-;;;### (autoloads nil "rect" "rect.el" (21803 61751 301340 310000))
+;;;### (autoloads nil "rect" "rect.el" (21803 38823 44085 519000))
;;; Generated autoloads from rect.el
(autoload 'delete-rectangle "rect" "\
@@ -22643,8 +22679,8 @@ Activates the region if needed. Only lasts until the region is deactivated.
;;;***
-;;;### (autoloads nil "refill" "textmodes/refill.el" (21678 60840
-;;;;;; 461786 791000))
+;;;### (autoloads nil "refill" "textmodes/refill.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from textmodes/refill.el
(autoload 'refill-mode "refill" "\
@@ -22664,8 +22700,8 @@ For true \"word wrap\" behavior, use `visual-line-mode' instead.
;;;***
-;;;### (autoloads nil "reftex" "textmodes/reftex.el" (21804 3763
-;;;;;; 270436 337000))
+;;;### (autoloads nil "reftex" "textmodes/reftex.el" (21823 24169
+;;;;;; 100485 529000))
;;; Generated autoloads from textmodes/reftex.el
(autoload 'reftex-citation "reftex-cite" nil t)
(autoload 'reftex-all-document-files "reftex-parse")
@@ -22719,7 +22755,7 @@ This enforces rescanning the buffer on next use.
;;;***
;;;### (autoloads nil "reftex-vars" "textmodes/reftex-vars.el" (21743
-;;;;;; 12185 613417 151000))
+;;;;;; 190 195328 729000))
;;; Generated autoloads from textmodes/reftex-vars.el
(put 'reftex-vref-is-default 'safe-local-variable (lambda (x) (or (stringp x) (symbolp x))))
(put 'reftex-fref-is-default 'safe-local-variable (lambda (x) (or (stringp x) (symbolp x))))
@@ -22728,8 +22764,8 @@ This enforces rescanning the buffer on next use.
;;;***
-;;;### (autoloads nil "regexp-opt" "emacs-lisp/regexp-opt.el" (21678
-;;;;;; 60839 489747 814000))
+;;;### (autoloads nil "regexp-opt" "emacs-lisp/regexp-opt.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/regexp-opt.el
(autoload 'regexp-opt "regexp-opt" "\
@@ -22758,15 +22794,15 @@ This means the number of non-shy regexp grouping constructs
;;;***
-;;;### (autoloads nil "regi" "emacs-lisp/regi.el" (21678 60839 489747
-;;;;;; 814000))
+;;;### (autoloads nil "regi" "emacs-lisp/regi.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/regi.el
(push (purecopy '(regi 1 8)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "remember" "textmodes/remember.el" (21678 60840
-;;;;;; 473787 271000))
+;;;### (autoloads nil "remember" "textmodes/remember.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from textmodes/remember.el
(push (purecopy '(remember 2 0)) package--builtin-versions)
@@ -22820,7 +22856,7 @@ to turn the *scratch* buffer into your notes buffer.
;;;***
-;;;### (autoloads nil "repeat" "repeat.el" (21678 60840 389783 910000))
+;;;### (autoloads nil "repeat" "repeat.el" (21670 32331 885635 586000))
;;; Generated autoloads from repeat.el
(push (purecopy '(repeat 0 51)) package--builtin-versions)
@@ -22843,8 +22879,8 @@ recently executed command not bound to an input event\".
;;;***
-;;;### (autoloads nil "reporter" "mail/reporter.el" (21678 60839
-;;;;;; 873763 245000))
+;;;### (autoloads nil "reporter" "mail/reporter.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/reporter.el
(autoload 'reporter-submit-bug-report "reporter" "\
@@ -22875,8 +22911,8 @@ mail-sending package is used for editing and sending the message.
;;;***
-;;;### (autoloads nil "reposition" "reposition.el" (21678 60840 389783
-;;;;;; 910000))
+;;;### (autoloads nil "reposition" "reposition.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from reposition.el
(autoload 'reposition-window "reposition" "\
@@ -22902,7 +22938,7 @@ first comment line visible (if point is in a comment).
;;;***
-;;;### (autoloads nil "reveal" "reveal.el" (21678 60840 389783 910000))
+;;;### (autoloads nil "reveal" "reveal.el" (21670 32331 885635 586000))
;;; Generated autoloads from reveal.el
(autoload 'reveal-mode "reveal" "\
@@ -22937,8 +22973,8 @@ the mode if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "ring" "emacs-lisp/ring.el" (21678 60839 489747
-;;;;;; 814000))
+;;;### (autoloads nil "ring" "emacs-lisp/ring.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/ring.el
(autoload 'ring-p "ring" "\
@@ -22953,8 +22989,8 @@ Make a ring that can contain SIZE elements.
;;;***
-;;;### (autoloads nil "rlogin" "net/rlogin.el" (21678 60839 985767
-;;;;;; 746000))
+;;;### (autoloads nil "rlogin" "net/rlogin.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from net/rlogin.el
(autoload 'rlogin "rlogin" "\
@@ -22998,8 +23034,8 @@ variable.
;;;***
-;;;### (autoloads nil "rmail" "mail/rmail.el" (21797 54705 48905
-;;;;;; 274000))
+;;;### (autoloads nil "rmail" "mail/rmail.el" (21824 45139 490498
+;;;;;; 458000))
;;; Generated autoloads from mail/rmail.el
(defvar rmail-file-name (purecopy "~/RMAIL") "\
@@ -23196,8 +23232,8 @@ Set PASSWORD to be used for retrieving mail from a POP or IMAP server.
;;;***
-;;;### (autoloads nil "rmailout" "mail/rmailout.el" (21678 60839
-;;;;;; 885763 727000))
+;;;### (autoloads nil "rmailout" "mail/rmailout.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/rmailout.el
(put 'rmail-output-file-alist 'risky-local-variable t)
@@ -23261,8 +23297,8 @@ than appending to it. Deletes the message after writing if
;;;***
-;;;### (autoloads nil "rng-cmpct" "nxml/rng-cmpct.el" (21678 60840
-;;;;;; 21769 189000))
+;;;### (autoloads nil "rng-cmpct" "nxml/rng-cmpct.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from nxml/rng-cmpct.el
(autoload 'rng-c-load-schema "rng-cmpct" "\
@@ -23273,8 +23309,8 @@ Return a pattern.
;;;***
-;;;### (autoloads nil "rng-nxml" "nxml/rng-nxml.el" (21678 60840
-;;;;;; 21769 189000))
+;;;### (autoloads nil "rng-nxml" "nxml/rng-nxml.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from nxml/rng-nxml.el
(autoload 'rng-nxml-mode-init "rng-nxml" "\
@@ -23286,8 +23322,8 @@ Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil.
;;;***
-;;;### (autoloads nil "rng-valid" "nxml/rng-valid.el" (21678 60840
-;;;;;; 25769 349000))
+;;;### (autoloads nil "rng-valid" "nxml/rng-valid.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from nxml/rng-valid.el
(autoload 'rng-validate-mode "rng-valid" "\
@@ -23317,8 +23353,8 @@ to use for finding the schema.
;;;***
-;;;### (autoloads nil "rng-xsd" "nxml/rng-xsd.el" (21678 60840 25769
-;;;;;; 349000))
+;;;### (autoloads nil "rng-xsd" "nxml/rng-xsd.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from nxml/rng-xsd.el
(put 'http://www\.w3\.org/2001/XMLSchema-datatypes 'rng-dt-compile 'rng-xsd-compile)
@@ -23345,8 +23381,8 @@ must be equal.
;;;***
-;;;### (autoloads nil "robin" "international/robin.el" (21605 26936
-;;;;;; 840026 71000))
+;;;### (autoloads nil "robin" "international/robin.el" (21824 5851
+;;;;;; 711914 99000))
;;; Generated autoloads from international/robin.el
(autoload 'robin-define-package "robin" "\
@@ -23378,7 +23414,7 @@ Start using robin package NAME, which is a string.
;;;***
-;;;### (autoloads nil "rot13" "rot13.el" (21678 60840 393784 70000))
+;;;### (autoloads nil "rot13" "rot13.el" (21670 32331 885635 586000))
;;; Generated autoloads from rot13.el
(autoload 'rot13 "rot13" "\
@@ -23415,8 +23451,8 @@ Toggle the use of ROT13 encoding for the current window.
;;;***
-;;;### (autoloads nil "rst" "textmodes/rst.el" (21678 60840 477787
-;;;;;; 431000))
+;;;### (autoloads nil "rst" "textmodes/rst.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from textmodes/rst.el
(add-to-list 'auto-mode-alist (purecopy '("\\.re?st\\'" . rst-mode)))
@@ -23446,8 +23482,8 @@ for modes derived from Text mode, like Mail mode.
;;;***
-;;;### (autoloads nil "ruby-mode" "progmodes/ruby-mode.el" (21772
-;;;;;; 3649 133589 283000))
+;;;### (autoloads nil "ruby-mode" "progmodes/ruby-mode.el" (21814
+;;;;;; 9129 410518 16000))
;;; Generated autoloads from progmodes/ruby-mode.el
(push (purecopy '(ruby-mode 1 2)) package--builtin-versions)
@@ -23464,8 +23500,8 @@ Major mode for editing Ruby code.
;;;***
-;;;### (autoloads nil "ruler-mode" "ruler-mode.el" (21678 60840 393784
-;;;;;; 70000))
+;;;### (autoloads nil "ruler-mode" "ruler-mode.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from ruler-mode.el
(push (purecopy '(ruler-mode 1 6)) package--builtin-versions)
@@ -23483,8 +23519,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "rx" "emacs-lisp/rx.el" (21678 60839 489747
-;;;;;; 814000))
+;;;### (autoloads nil "rx" "emacs-lisp/rx.el" (21807 35879 352666
+;;;;;; 863000))
;;; Generated autoloads from emacs-lisp/rx.el
(autoload 'rx-to-string "rx" "\
@@ -23592,20 +23628,20 @@ CHAR
matches space and tab only.
`graphic', `graph'
- matches graphic characters--everything except ASCII control chars,
- space, and DEL.
+ matches graphic characters--everything except whitespace, ASCII
+ and non-ASCII control characters, surrogates, and codepoints
+ unassigned by Unicode.
`printing', `print'
- matches printing characters--everything except ASCII control chars
- and DEL.
+ matches whitespace and graphic characters.
`alphanumeric', `alnum'
- matches letters and digits. (But at present, for multibyte characters,
- it matches anything that has word syntax.)
+ matches alphabetic characters and digits. (For multibyte characters,
+ it matches according to Unicode character properties.)
`letter', `alphabetic', `alpha'
- matches letters. (But at present, for multibyte characters,
- it matches anything that has word syntax.)
+ matches alphabetic characters. (For multibyte characters,
+ it matches according to Unicode character properties.)
`ascii'
matches ASCII (unibyte) characters.
@@ -23795,15 +23831,15 @@ enclosed in `(and ...)'.
;;;***
-;;;### (autoloads nil "sasl-ntlm" "net/sasl-ntlm.el" (21678 60839
-;;;;;; 989767 907000))
+;;;### (autoloads nil "sasl-ntlm" "net/sasl-ntlm.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from net/sasl-ntlm.el
(push (purecopy '(sasl 1 0)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "savehist" "savehist.el" (21678 60840 393784
-;;;;;; 70000))
+;;;### (autoloads nil "savehist" "savehist.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from savehist.el
(push (purecopy '(savehist 24)) package--builtin-versions)
@@ -23835,8 +23871,30 @@ histories, which is probably undesirable.
;;;***
-;;;### (autoloads nil "scheme" "progmodes/scheme.el" (21678 60840
-;;;;;; 337781 830000))
+;;;### (autoloads nil "saveplace" "saveplace.el" (21822 58098 20521
+;;;;;; 61000))
+;;; Generated autoloads from saveplace.el
+
+(defvar save-place-mode nil "\
+Non-nil if Save-Place mode is enabled.
+See the command `save-place-mode' for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `save-place-mode'.")
+
+(custom-autoload 'save-place-mode "saveplace" nil)
+
+(autoload 'save-place-mode "saveplace" "\
+Non-nil means automatically save place in each file.
+This means when you visit a file, point goes to the last place
+where it was when you previously visited the same file.
+
+\(fn &optional ARG)" t nil)
+
+;;;***
+
+;;;### (autoloads nil "scheme" "progmodes/scheme.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/scheme.el
(autoload 'scheme-mode "scheme" "\
@@ -23875,8 +23933,8 @@ that variable's value is a string.
;;;***
-;;;### (autoloads nil "score-mode" "gnus/score-mode.el" (21678 60839
-;;;;;; 725757 297000))
+;;;### (autoloads nil "score-mode" "gnus/score-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/score-mode.el
(autoload 'gnus-score-mode "score-mode" "\
@@ -23889,8 +23947,8 @@ This mode is an extended emacs-lisp mode.
;;;***
-;;;### (autoloads nil "scroll-all" "scroll-all.el" (21678 60840 393784
-;;;;;; 70000))
+;;;### (autoloads nil "scroll-all" "scroll-all.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from scroll-all.el
(defvar scroll-all-mode nil "\
@@ -23915,8 +23973,8 @@ one window apply to all visible windows in the same frame.
;;;***
-;;;### (autoloads nil "scroll-lock" "scroll-lock.el" (21678 60840
-;;;;;; 393784 70000))
+;;;### (autoloads nil "scroll-lock" "scroll-lock.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from scroll-lock.el
(autoload 'scroll-lock-mode "scroll-lock" "\
@@ -23932,16 +23990,16 @@ vertically fixed relative to window boundaries during scrolling.
;;;***
-;;;### (autoloads nil "secrets" "net/secrets.el" (21799 25450 636876
-;;;;;; 627000))
+;;;### (autoloads nil "secrets" "net/secrets.el" (21824 44973 380509
+;;;;;; 24000))
;;; Generated autoloads from net/secrets.el
(when (featurep 'dbusbind)
(autoload 'secrets-show-secrets "secrets" nil t))
;;;***
-;;;### (autoloads nil "semantic" "cedet/semantic.el" (21678 60854
-;;;;;; 970348 529000))
+;;;### (autoloads nil "semantic" "cedet/semantic.el" (21679 47292
+;;;;;; 556033 759000))
;;; Generated autoloads from cedet/semantic.el
(push (purecopy '(semantic 2 2)) package--builtin-versions)
@@ -23999,7 +24057,7 @@ Semantic mode.
;;;***
;;;### (autoloads nil "semantic/bovine/grammar" "cedet/semantic/bovine/grammar.el"
-;;;;;; (21678 60839 357742 509000))
+;;;;;; (21670 32330 885624 725000))
;;; Generated autoloads from cedet/semantic/bovine/grammar.el
(autoload 'bovine-grammar-mode "semantic/bovine/grammar" "\
@@ -24010,7 +24068,7 @@ Major mode for editing Bovine grammars.
;;;***
;;;### (autoloads nil "semantic/wisent/grammar" "cedet/semantic/wisent/grammar.el"
-;;;;;; (21678 60839 393743 956000))
+;;;;;; (21670 32330 885624 725000))
;;; Generated autoloads from cedet/semantic/wisent/grammar.el
(autoload 'wisent-grammar-mode "semantic/wisent/grammar" "\
@@ -24020,8 +24078,8 @@ Major mode for editing Wisent grammars.
;;;***
-;;;### (autoloads nil "sendmail" "mail/sendmail.el" (21785 52256
-;;;;;; 612012 760000))
+;;;### (autoloads nil "sendmail" "mail/sendmail.el" (21786 29744
+;;;;;; 368212 633000))
;;; Generated autoloads from mail/sendmail.el
(defvar mail-from-style 'default "\
@@ -24302,14 +24360,14 @@ Like `mail' command, but display mail buffer in another frame.
;;;***
-;;;### (autoloads nil "seq" "emacs-lisp/seq.el" (21778 45004 713399
-;;;;;; 126000))
+;;;### (autoloads nil "seq" "emacs-lisp/seq.el" (21822 58098 20521
+;;;;;; 61000))
;;; Generated autoloads from emacs-lisp/seq.el
-(push (purecopy '(seq 1 3)) package--builtin-versions)
+(push (purecopy '(seq 1 5)) package--builtin-versions)
;;;***
-;;;### (autoloads nil "server" "server.el" (21744 29479 720733 839000))
+;;;### (autoloads nil "server" "server.el" (21818 36774 564783 146000))
;;; Generated autoloads from server.el
(put 'server-host 'risky-local-variable t)
@@ -24376,7 +24434,7 @@ only these files will be asked to be saved.
;;;***
-;;;### (autoloads nil "ses" "ses.el" (21804 4012 686064 51000))
+;;;### (autoloads nil "ses" "ses.el" (21804 59688 264800 604000))
;;; Generated autoloads from ses.el
(autoload 'ses-mode "ses" "\
@@ -24421,7 +24479,7 @@ formula:
;;;***
;;;### (autoloads nil "sgml-mode" "textmodes/sgml-mode.el" (21804
-;;;;;; 4012 698063 841000))
+;;;;;; 59688 284811 0))
;;; Generated autoloads from textmodes/sgml-mode.el
(autoload 'sgml-mode "sgml-mode" "\
@@ -24486,8 +24544,8 @@ To work around that, do:
;;;***
-;;;### (autoloads nil "sh-script" "progmodes/sh-script.el" (21706
-;;;;;; 14224 297957 474000))
+;;;### (autoloads nil "sh-script" "progmodes/sh-script.el" (21814
+;;;;;; 9129 410518 16000))
;;; Generated autoloads from progmodes/sh-script.el
(push (purecopy '(sh-script 2 0 6)) package--builtin-versions)
(put 'sh-shell 'safe-local-variable 'symbolp)
@@ -24550,8 +24608,8 @@ with your script for an edit-interpret-debug cycle.
;;;***
-;;;### (autoloads nil "shadow" "emacs-lisp/shadow.el" (21678 60839
-;;;;;; 489747 814000))
+;;;### (autoloads nil "shadow" "emacs-lisp/shadow.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/shadow.el
(autoload 'list-load-path-shadows "shadow" "\
@@ -24600,8 +24658,8 @@ function, `load-path-shadows-find'.
;;;***
-;;;### (autoloads nil "shadowfile" "shadowfile.el" (21678 60840 401784
-;;;;;; 390000))
+;;;### (autoloads nil "shadowfile" "shadowfile.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from shadowfile.el
(autoload 'shadow-define-cluster "shadowfile" "\
@@ -24639,7 +24697,7 @@ Set up file shadowing.
;;;***
-;;;### (autoloads nil "shell" "shell.el" (21678 60840 401784 390000))
+;;;### (autoloads nil "shell" "shell.el" (21678 26426 225333 737000))
;;; Generated autoloads from shell.el
(defvar shell-dumb-shell-regexp (purecopy "cmd\\(proxy\\)?\\.exe") "\
@@ -24687,7 +24745,7 @@ Otherwise, one argument `-i' is passed to the shell.
;;;***
-;;;### (autoloads nil "shr" "net/shr.el" (21756 63737 910472 761000))
+;;;### (autoloads nil "shr" "net/shr.el" (21826 49834 1206 441000))
;;; Generated autoloads from net/shr.el
(autoload 'shr-render-region "shr" "\
@@ -24704,8 +24762,8 @@ DOM should be a parse tree as generated by
;;;***
-;;;### (autoloads nil "sieve" "gnus/sieve.el" (21678 60839 729757
-;;;;;; 458000))
+;;;### (autoloads nil "sieve" "gnus/sieve.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/sieve.el
(autoload 'sieve-manage "sieve" "\
@@ -24730,8 +24788,8 @@ DOM should be a parse tree as generated by
;;;***
-;;;### (autoloads nil "sieve-mode" "gnus/sieve-mode.el" (21678 60839
-;;;;;; 729757 458000))
+;;;### (autoloads nil "sieve-mode" "gnus/sieve-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/sieve-mode.el
(autoload 'sieve-mode "sieve-mode" "\
@@ -24746,8 +24804,8 @@ Turning on Sieve mode runs `sieve-mode-hook'.
;;;***
-;;;### (autoloads nil "simula" "progmodes/simula.el" (21678 60840
-;;;;;; 345782 150000))
+;;;### (autoloads nil "simula" "progmodes/simula.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from progmodes/simula.el
(autoload 'simula-mode "simula" "\
@@ -24795,8 +24853,8 @@ with no arguments, if that value is non-nil.
;;;***
-;;;### (autoloads nil "skeleton" "skeleton.el" (21678 60840 409784
-;;;;;; 710000))
+;;;### (autoloads nil "skeleton" "skeleton.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from skeleton.el
(defvar skeleton-filter-function 'identity "\
@@ -24914,8 +24972,8 @@ symmetrical ones, and the same character twice for the others.
;;;***
-;;;### (autoloads nil "smerge-mode" "vc/smerge-mode.el" (21678 60840
-;;;;;; 537789 831000))
+;;;### (autoloads nil "smerge-mode" "vc/smerge-mode.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/smerge-mode.el
(autoload 'smerge-ediff "smerge-mode" "\
@@ -24942,8 +25000,8 @@ If no conflict maker is found, turn off `smerge-mode'.
;;;***
-;;;### (autoloads nil "smiley" "gnus/smiley.el" (21678 60839 729757
-;;;;;; 458000))
+;;;### (autoloads nil "smiley" "gnus/smiley.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from gnus/smiley.el
(autoload 'smiley-region "smiley" "\
@@ -24960,8 +25018,8 @@ interactively. If there's no argument, do it at the current buffer.
;;;***
-;;;### (autoloads nil "smtpmail" "mail/smtpmail.el" (21678 60839
-;;;;;; 889763 888000))
+;;;### (autoloads nil "smtpmail" "mail/smtpmail.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/smtpmail.el
(autoload 'smtpmail-send-it "smtpmail" "\
@@ -24976,8 +25034,8 @@ Send mail that was queued as a result of setting `smtpmail-queue-mail'.
;;;***
-;;;### (autoloads nil "snake" "play/snake.el" (21678 60840 209776
-;;;;;; 710000))
+;;;### (autoloads nil "snake" "play/snake.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/snake.el
(autoload 'snake "snake" "\
@@ -25000,8 +25058,8 @@ Snake mode keybindings:
;;;***
-;;;### (autoloads nil "snmp-mode" "net/snmp-mode.el" (21678 60839
-;;;;;; 989767 907000))
+;;;### (autoloads nil "snmp-mode" "net/snmp-mode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from net/snmp-mode.el
(autoload 'snmp-mode "snmp-mode" "\
@@ -25030,8 +25088,8 @@ then `snmpv2-mode-hook'.
;;;***
-;;;### (autoloads nil "solar" "calendar/solar.el" (21735 24088 384215
-;;;;;; 80000))
+;;;### (autoloads nil "solar" "calendar/solar.el" (21735 6077 666769
+;;;;;; 364000))
;;; Generated autoloads from calendar/solar.el
(autoload 'sunrise-sunset "solar" "\
@@ -25046,8 +25104,8 @@ This function is suitable for execution in an init file.
;;;***
-;;;### (autoloads nil "solitaire" "play/solitaire.el" (21678 60840
-;;;;;; 209776 710000))
+;;;### (autoloads nil "solitaire" "play/solitaire.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from play/solitaire.el
(autoload 'solitaire "solitaire" "\
@@ -25122,7 +25180,7 @@ Pick your favorite shortcuts:
;;;***
-;;;### (autoloads nil "sort" "sort.el" (21678 60840 409784 710000))
+;;;### (autoloads nil "sort" "sort.el" (21670 32331 885635 586000))
;;; Generated autoloads from sort.el
(put 'sort-fold-case 'safe-local-variable 'booleanp)
@@ -25297,7 +25355,7 @@ is non-nil, it also prints a message describing the number of deletions.
;;;***
-;;;### (autoloads nil "spam" "gnus/spam.el" (21678 60839 733757 619000))
+;;;### (autoloads nil "spam" "gnus/spam.el" (21670 32331 385639 720000))
;;; Generated autoloads from gnus/spam.el
(autoload 'spam-initialize "spam" "\
@@ -25311,8 +25369,8 @@ installed through `spam-necessary-extra-headers'.
;;;***
-;;;### (autoloads nil "spam-report" "gnus/spam-report.el" (21678
-;;;;;; 60839 729757 458000))
+;;;### (autoloads nil "spam-report" "gnus/spam-report.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from gnus/spam-report.el
(autoload 'spam-report-process-queue "spam-report" "\
@@ -25354,8 +25412,8 @@ Spam reports will be queued with the method used when
;;;***
-;;;### (autoloads nil "speedbar" "speedbar.el" (21678 60840 413784
-;;;;;; 870000))
+;;;### (autoloads nil "speedbar" "speedbar.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from speedbar.el
(defalias 'speedbar 'speedbar-frame-mode)
@@ -25379,8 +25437,8 @@ selected. If the speedbar frame is active, then select the attached frame.
;;;***
-;;;### (autoloads nil "spook" "play/spook.el" (21678 60840 209776
-;;;;;; 710000))
+;;;### (autoloads nil "spook" "play/spook.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/spook.el
(autoload 'spook "spook" "\
@@ -25395,8 +25453,8 @@ Return a vector containing the lines from `spook-phrases-file'.
;;;***
-;;;### (autoloads nil "sql" "progmodes/sql.el" (21765 52461 396136
-;;;;;; 269000))
+;;;### (autoloads nil "sql" "progmodes/sql.el" (21765 23600 805241
+;;;;;; 145000))
;;; Generated autoloads from progmodes/sql.el
(push (purecopy '(sql 3 5)) package--builtin-versions)
@@ -25862,15 +25920,15 @@ Run vsql as an inferior process.
;;;***
-;;;### (autoloads nil "srecode" "cedet/srecode.el" (21678 60839 393743
-;;;;;; 956000))
+;;;### (autoloads nil "srecode" "cedet/srecode.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from cedet/srecode.el
(push (purecopy '(srecode 1 2)) package--builtin-versions)
;;;***
;;;### (autoloads nil "srecode/srt-mode" "cedet/srecode/srt-mode.el"
-;;;;;; (21678 60839 401744 277000))
+;;;;;; (21670 32330 885624 725000))
;;; Generated autoloads from cedet/srecode/srt-mode.el
(autoload 'srecode-template-mode "srecode/srt-mode" "\
@@ -25882,8 +25940,8 @@ Major-mode for writing SRecode macros.
;;;***
-;;;### (autoloads nil "starttls" "gnus/starttls.el" (21678 60839
-;;;;;; 733757 619000))
+;;;### (autoloads nil "starttls" "gnus/starttls.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from gnus/starttls.el
(autoload 'starttls-open-stream "starttls" "\
@@ -25906,8 +25964,8 @@ GnuTLS requires a port number.
;;;***
-;;;### (autoloads nil "strokes" "strokes.el" (21678 60840 417785
-;;;;;; 31000))
+;;;### (autoloads nil "strokes" "strokes.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from strokes.el
(autoload 'strokes-global-set-stroke "strokes" "\
@@ -26020,8 +26078,8 @@ Read a complex stroke and insert its glyph into the current buffer.
;;;***
-;;;### (autoloads nil "studly" "play/studly.el" (21605 26937 380015
-;;;;;; 699000))
+;;;### (autoloads nil "studly" "play/studly.el" (21607 54478 800121
+;;;;;; 42000))
;;; Generated autoloads from play/studly.el
(autoload 'studlify-region "studly" "\
@@ -26041,8 +26099,8 @@ Studlify-case the current buffer.
;;;***
-;;;### (autoloads nil "subword" "progmodes/subword.el" (21678 60840
-;;;;;; 349782 310000))
+;;;### (autoloads nil "subword" "progmodes/subword.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from progmodes/subword.el
(define-obsolete-function-alias 'capitalized-words-mode 'subword-mode "25.1")
@@ -26134,8 +26192,8 @@ See `superword-mode' for more information on Superword mode.
;;;***
-;;;### (autoloads nil "supercite" "mail/supercite.el" (21678 60839
-;;;;;; 889763 888000))
+;;;### (autoloads nil "supercite" "mail/supercite.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/supercite.el
(autoload 'sc-cite-original "supercite" "\
@@ -26167,8 +26225,8 @@ and `sc-post-hook' is run after the guts of this function.
;;;***
-;;;### (autoloads nil "t-mouse" "t-mouse.el" (21678 60840 421785
-;;;;;; 191000))
+;;;### (autoloads nil "t-mouse" "t-mouse.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from t-mouse.el
(define-obsolete-function-alias 't-mouse-mode 'gpm-mouse-mode "23.1")
@@ -26196,7 +26254,7 @@ It relies on the `gpm' daemon being activated.
;;;***
-;;;### (autoloads nil "tabify" "tabify.el" (21678 60840 421785 191000))
+;;;### (autoloads nil "tabify" "tabify.el" (21670 32331 885635 586000))
;;; Generated autoloads from tabify.el
(autoload 'untabify "tabify" "\
@@ -26225,31 +26283,10 @@ The variable `tab-width' controls the spacing of tab stops.
;;;***
-;;;### (autoloads nil "table" "textmodes/table.el" (21804 4012 706063
-;;;;;; 701000))
+;;;### (autoloads nil "table" "textmodes/table.el" (21804 59688 284811
+;;;;;; 0))
;;; Generated autoloads from textmodes/table.el
-(defvar table-cell-map-hook nil "\
-Normal hooks run when finishing construction of `table-cell-map'.
-User can modify `table-cell-map' by adding custom functions here.")
-
-(custom-autoload 'table-cell-map-hook "table" t)
-
-(defvar table-load-hook nil "\
-List of functions to be called after the table is first loaded.")
-
-(custom-autoload 'table-load-hook "table" t)
-
-(defvar table-point-entered-cell-hook nil "\
-List of functions to be called after point entered a table cell.")
-
-(custom-autoload 'table-point-entered-cell-hook "table" t)
-
-(defvar table-point-left-cell-hook nil "\
-List of functions to be called after point left a table cell.")
-
-(custom-autoload 'table-point-left-cell-hook "table" t)
-
(autoload 'table-insert "table" "\
Insert an editable text table.
Insert a table of specified number of COLUMNS and ROWS. Optional
@@ -26818,7 +26855,7 @@ converts a table into plain text without frames. It is a companion to
;;;***
-;;;### (autoloads nil "talk" "talk.el" (21678 60840 421785 191000))
+;;;### (autoloads nil "talk" "talk.el" (21670 32331 885635 586000))
;;; Generated autoloads from talk.el
(autoload 'talk-connect "talk" "\
@@ -26833,8 +26870,8 @@ Connect to the Emacs talk group from the current X display or tty frame.
;;;***
-;;;### (autoloads nil "tar-mode" "tar-mode.el" (21706 14224 305956
-;;;;;; 524000))
+;;;### (autoloads nil "tar-mode" "tar-mode.el" (21704 50495 455324
+;;;;;; 752000))
;;; Generated autoloads from tar-mode.el
(autoload 'tar-mode "tar-mode" "\
@@ -26857,8 +26894,8 @@ See also: variables `tar-update-datestamp' and `tar-anal-blocksize'.
;;;***
-;;;### (autoloads nil "tcl" "progmodes/tcl.el" (21678 60840 349782
-;;;;;; 310000))
+;;;### (autoloads nil "tcl" "progmodes/tcl.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from progmodes/tcl.el
(autoload 'tcl-mode "tcl" "\
@@ -26906,8 +26943,8 @@ Prefix argument means invert sense of `tcl-use-smart-word-finder'.
;;;***
-;;;### (autoloads nil "telnet" "net/telnet.el" (21678 60839 993768
-;;;;;; 67000))
+;;;### (autoloads nil "telnet" "net/telnet.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from net/telnet.el
(autoload 'telnet "telnet" "\
@@ -26932,7 +26969,7 @@ Normally input is edited in Emacs and sent a line at a time.
;;;***
-;;;### (autoloads nil "term" "term.el" (21798 37736 247770 610000))
+;;;### (autoloads nil "term" "term.el" (21798 49947 262665 54000))
;;; Generated autoloads from term.el
(autoload 'make-term "term" "\
@@ -26974,8 +27011,8 @@ use in that buffer.
;;;***
-;;;### (autoloads nil "testcover" "emacs-lisp/testcover.el" (21678
-;;;;;; 60839 497748 135000))
+;;;### (autoloads nil "testcover" "emacs-lisp/testcover.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/testcover.el
(autoload 'testcover-this-defun "testcover" "\
@@ -26985,8 +27022,8 @@ Start coverage on function under point.
;;;***
-;;;### (autoloads nil "tetris" "play/tetris.el" (21678 60840 209776
-;;;;;; 710000))
+;;;### (autoloads nil "tetris" "play/tetris.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from play/tetris.el
(push (purecopy '(tetris 2 1)) package--builtin-versions)
@@ -27011,8 +27048,8 @@ tetris-mode keybindings:
;;;***
-;;;### (autoloads nil "tex-mode" "textmodes/tex-mode.el" (21678 60840
-;;;;;; 485787 751000))
+;;;### (autoloads nil "tex-mode" "textmodes/tex-mode.el" (21822 3243
+;;;;;; 760493 958000))
;;; Generated autoloads from textmodes/tex-mode.el
(defvar tex-shell-file-name nil "\
@@ -27313,8 +27350,8 @@ Major mode to edit DocTeX files.
;;;***
-;;;### (autoloads nil "texinfmt" "textmodes/texinfmt.el" (21678 60840
-;;;;;; 489787 911000))
+;;;### (autoloads nil "texinfmt" "textmodes/texinfmt.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from textmodes/texinfmt.el
(autoload 'texinfo-format-buffer "texinfmt" "\
@@ -27353,8 +27390,8 @@ if large. You can use `Info-split' to do this manually.
;;;***
-;;;### (autoloads nil "texinfo" "textmodes/texinfo.el" (21678 60840
-;;;;;; 489787 911000))
+;;;### (autoloads nil "texinfo" "textmodes/texinfo.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from textmodes/texinfo.el
(defvar texinfo-open-quote (purecopy "``") "\
@@ -27438,8 +27475,8 @@ value of `texinfo-mode-hook'.
;;;***
-;;;### (autoloads nil "thai-util" "language/thai-util.el" (21678
-;;;;;; 60839 817760 994000))
+;;;### (autoloads nil "thai-util" "language/thai-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/thai-util.el
(autoload 'thai-compose-region "thai-util" "\
@@ -27466,8 +27503,8 @@ Compose Thai characters in the current buffer.
;;;***
-;;;### (autoloads nil "thingatpt" "thingatpt.el" (21678 60840 493788
-;;;;;; 71000))
+;;;### (autoloads nil "thingatpt" "thingatpt.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from thingatpt.el
(autoload 'forward-thing "thingatpt" "\
@@ -27531,7 +27568,7 @@ Return the Lisp list at point, or nil if none is found.
;;;***
-;;;### (autoloads nil "thumbs" "thumbs.el" (21678 60840 493788 71000))
+;;;### (autoloads nil "thumbs" "thumbs.el" (21670 32331 885635 586000))
;;; Generated autoloads from thumbs.el
(autoload 'thumbs-find-thumb "thumbs" "\
@@ -27565,8 +27602,8 @@ In dired, call the setroot program on the image at point.
;;;***
-;;;### (autoloads nil "tibet-util" "language/tibet-util.el" (21678
-;;;;;; 60839 817760 994000))
+;;;### (autoloads nil "tibet-util" "language/tibet-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/tibet-util.el
(autoload 'tibetan-char-p "tibet-util" "\
@@ -27639,8 +27676,8 @@ See also docstring of the function tibetan-compose-region.
;;;***
-;;;### (autoloads nil "tildify" "textmodes/tildify.el" (21694 48017
-;;;;;; 622101 735000))
+;;;### (autoloads nil "tildify" "textmodes/tildify.el" (21695 35516
+;;;;;; 595262 313000))
;;; Generated autoloads from textmodes/tildify.el
(push (purecopy '(tildify 4 6 1)) package--builtin-versions)
@@ -27706,7 +27743,7 @@ variable will be set to the representation.
;;;***
-;;;### (autoloads nil "time" "time.el" (21678 60840 493788 71000))
+;;;### (autoloads nil "time" "time.el" (21670 32331 885635 586000))
;;; Generated autoloads from time.el
(defvar display-time-day-and-date nil "\
@@ -27768,8 +27805,8 @@ Return a string giving the duration of the Emacs initialization.
;;;***
-;;;### (autoloads nil "time-date" "calendar/time-date.el" (21678
-;;;;;; 60839 321741 62000))
+;;;### (autoloads nil "time-date" "calendar/time-date.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from calendar/time-date.el
(autoload 'date-to-time "time-date" "\
@@ -27872,8 +27909,8 @@ Convert the time interval in seconds to a short string.
;;;***
-;;;### (autoloads nil "time-stamp" "time-stamp.el" (21678 60840 493788
-;;;;;; 71000))
+;;;### (autoloads nil "time-stamp" "time-stamp.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from time-stamp.el
(put 'time-stamp-format 'safe-local-variable 'stringp)
(put 'time-stamp-time-zone 'safe-local-variable 'string-or-null-p)
@@ -27913,8 +27950,8 @@ With ARG, turn time stamping on if and only if arg is positive.
;;;***
-;;;### (autoloads nil "timeclock" "calendar/timeclock.el" (21678
-;;;;;; 60839 321741 62000))
+;;;### (autoloads nil "timeclock" "calendar/timeclock.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from calendar/timeclock.el
(push (purecopy '(timeclock 2 6 1)) package--builtin-versions)
@@ -28024,7 +28061,7 @@ relative only to the time worked today, and not to past time.
;;;***
;;;### (autoloads nil "titdic-cnv" "international/titdic-cnv.el"
-;;;;;; (21678 60839 785759 709000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from international/titdic-cnv.el
(autoload 'titdic-convert "titdic-cnv" "\
@@ -28046,7 +28083,7 @@ To get complete usage, invoke \"emacs -batch -f batch-titdic-convert -h\".
;;;***
-;;;### (autoloads nil "tmm" "tmm.el" (21678 60840 497788 230000))
+;;;### (autoloads nil "tmm" "tmm.el" (21670 32331 885635 586000))
;;; Generated autoloads from tmm.el
(define-key global-map "\M-`" 'tmm-menubar)
(define-key global-map [menu-bar mouse-1] 'tmm-menubar-mouse)
@@ -28088,8 +28125,8 @@ Its value should be an event that has a binding in MENU.
;;;***
-;;;### (autoloads nil "todo-mode" "calendar/todo-mode.el" (21756
-;;;;;; 63737 814475 170000))
+;;;### (autoloads nil "todo-mode" "calendar/todo-mode.el" (21814
+;;;;;; 9129 220497 835000))
;;; Generated autoloads from calendar/todo-mode.el
(autoload 'todo-show "todo-mode" "\
@@ -28156,8 +28193,8 @@ Mode for displaying and reprioritizing top priority Todo.
;;;***
-;;;### (autoloads nil "tool-bar" "tool-bar.el" (21678 60840 497788
-;;;;;; 230000))
+;;;### (autoloads nil "tool-bar" "tool-bar.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from tool-bar.el
(autoload 'toggle-tool-bar-mode-from-frame "tool-bar" "\
@@ -28227,8 +28264,8 @@ holds a keymap.
;;;***
-;;;### (autoloads nil "tq" "emacs-lisp/tq.el" (21678 60839 497748
-;;;;;; 135000))
+;;;### (autoloads nil "tq" "emacs-lisp/tq.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emacs-lisp/tq.el
(autoload 'tq-create "tq" "\
@@ -28241,8 +28278,8 @@ to a tcp server on another machine.
;;;***
-;;;### (autoloads nil "trace" "emacs-lisp/trace.el" (21741 17831
-;;;;;; 261102 632000))
+;;;### (autoloads nil "trace" "emacs-lisp/trace.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/trace.el
(defvar trace-buffer "*trace-output*" "\
@@ -28287,8 +28324,8 @@ the output buffer or changing the window configuration.
;;;***
-;;;### (autoloads nil "tramp" "net/tramp.el" (21765 52461 392136
-;;;;;; 351000))
+;;;### (autoloads nil "tramp" "net/tramp.el" (21766 44463 655319
+;;;;;; 936000))
;;; Generated autoloads from net/tramp.el
(defvar tramp-mode t "\
@@ -28403,8 +28440,8 @@ Discard Tramp from loading remote files.
;;;***
-;;;### (autoloads nil "tramp-ftp" "net/tramp-ftp.el" (21678 60839
-;;;;;; 997768 228000))
+;;;### (autoloads nil "tramp-ftp" "net/tramp-ftp.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from net/tramp-ftp.el
(autoload 'tramp-ftp-enable-ange-ftp "tramp-ftp" "\
@@ -28414,8 +28451,8 @@ Discard Tramp from loading remote files.
;;;***
-;;;### (autoloads nil "tutorial" "tutorial.el" (21678 60840 497788
-;;;;;; 230000))
+;;;### (autoloads nil "tutorial" "tutorial.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from tutorial.el
(autoload 'help-with-tutorial "tutorial" "\
@@ -28439,8 +28476,8 @@ resumed later.
;;;***
-;;;### (autoloads nil "tv-util" "language/tv-util.el" (21605 26936
-;;;;;; 888025 150000))
+;;;### (autoloads nil "tv-util" "language/tv-util.el" (21607 54478
+;;;;;; 300138 641000))
;;; Generated autoloads from language/tv-util.el
(autoload 'tai-viet-composition-function "tv-util" "\
@@ -28450,8 +28487,8 @@ resumed later.
;;;***
-;;;### (autoloads nil "two-column" "textmodes/two-column.el" (21678
-;;;;;; 60840 493788 71000))
+;;;### (autoloads nil "two-column" "textmodes/two-column.el" (21670
+;;;;;; 32331 885635 586000))
;;; Generated autoloads from textmodes/two-column.el
(autoload '2C-command "two-column" () t 'keymap)
(global-set-key "\C-x6" '2C-command)
@@ -28498,8 +28535,8 @@ First column's text sSs Second column's text
;;;***
-;;;### (autoloads nil "type-break" "type-break.el" (21678 60840 497788
-;;;;;; 230000))
+;;;### (autoloads nil "type-break" "type-break.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from type-break.el
(defvar type-break-mode nil "\
@@ -28631,7 +28668,7 @@ FRAC should be the inverse of the fractional value; for example, a value of
;;;***
-;;;### (autoloads nil "uce" "mail/uce.el" (21678 60839 889763 888000))
+;;;### (autoloads nil "uce" "mail/uce.el" (21670 32331 385639 720000))
;;; Generated autoloads from mail/uce.el
(autoload 'uce-reply-to-uce "uce" "\
@@ -28645,7 +28682,7 @@ You might need to set `uce-mail-reader' before using this.
;;;***
;;;### (autoloads nil "ucs-normalize" "international/ucs-normalize.el"
-;;;;;; (21678 60839 785759 709000))
+;;;;;; (21670 32331 385639 720000))
;;; Generated autoloads from international/ucs-normalize.el
(autoload 'ucs-normalize-NFD-region "ucs-normalize" "\
@@ -28710,8 +28747,8 @@ Normalize the string STR by the Unicode NFC and Mac OS's HFS Plus.
;;;***
-;;;### (autoloads nil "underline" "textmodes/underline.el" (21678
-;;;;;; 60840 493788 71000))
+;;;### (autoloads nil "underline" "textmodes/underline.el" (21670
+;;;;;; 32331 885635 586000))
;;; Generated autoloads from textmodes/underline.el
(autoload 'underline-region "underline" "\
@@ -28731,8 +28768,8 @@ which specify the range to operate on.
;;;***
-;;;### (autoloads nil "unrmail" "mail/unrmail.el" (21678 60839 893764
-;;;;;; 49000))
+;;;### (autoloads nil "unrmail" "mail/unrmail.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from mail/unrmail.el
(autoload 'batch-unrmail "unrmail" "\
@@ -28752,8 +28789,8 @@ The variable `unrmail-mbox-format' controls which mbox format to use.
;;;***
-;;;### (autoloads nil "unsafep" "emacs-lisp/unsafep.el" (21678 60839
-;;;;;; 497748 135000))
+;;;### (autoloads nil "unsafep" "emacs-lisp/unsafep.el" (21670 32330
+;;;;;; 885624 725000))
;;; Generated autoloads from emacs-lisp/unsafep.el
(autoload 'unsafep "unsafep" "\
@@ -28765,7 +28802,7 @@ UNSAFEP-VARS is a list of symbols with local bindings.
;;;***
-;;;### (autoloads nil "url" "url/url.el" (21678 60840 513788 871000))
+;;;### (autoloads nil "url" "url/url.el" (21670 32331 885635 586000))
;;; Generated autoloads from url/url.el
(autoload 'url-retrieve "url" "\
@@ -28812,8 +28849,8 @@ no further processing). URL is either a string or a parsed URL.
;;;***
-;;;### (autoloads nil "url-auth" "url/url-auth.el" (21678 60840 501788
-;;;;;; 391000))
+;;;### (autoloads nil "url-auth" "url/url-auth.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-auth.el
(autoload 'url-get-authentication "url-auth" "\
@@ -28854,8 +28891,8 @@ RATING a rating between 1 and 10 of the strength of the authentication.
;;;***
-;;;### (autoloads nil "url-cache" "url/url-cache.el" (21678 60840
-;;;;;; 501788 391000))
+;;;### (autoloads nil "url-cache" "url/url-cache.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from url/url-cache.el
(autoload 'url-store-in-cache "url-cache" "\
@@ -28876,8 +28913,8 @@ Extract FNAM from the local disk cache.
;;;***
-;;;### (autoloads nil "url-cid" "url/url-cid.el" (21678 60840 501788
-;;;;;; 391000))
+;;;### (autoloads nil "url-cid" "url/url-cid.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-cid.el
(autoload 'url-cid "url-cid" "\
@@ -28887,8 +28924,8 @@ Extract FNAM from the local disk cache.
;;;***
-;;;### (autoloads nil "url-dav" "url/url-dav.el" (21697 290 540850
-;;;;;; 262000))
+;;;### (autoloads nil "url-dav" "url/url-dav.el" (21696 56380 925320
+;;;;;; 624000))
;;; Generated autoloads from url/url-dav.el
(autoload 'url-dav-supported-p "url-dav" "\
@@ -28922,8 +28959,8 @@ added to this list, so most requests can just pass in nil.
;;;***
-;;;### (autoloads nil "url-file" "url/url-file.el" (21678 60840 505788
-;;;;;; 551000))
+;;;### (autoloads nil "url-file" "url/url-file.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-file.el
(autoload 'url-file "url-file" "\
@@ -28933,8 +28970,8 @@ Handle file: and ftp: URLs.
;;;***
-;;;### (autoloads nil "url-gw" "url/url-gw.el" (21678 60840 505788
-;;;;;; 551000))
+;;;### (autoloads nil "url-gw" "url/url-gw.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-gw.el
(autoload 'url-gateway-nslookup-host "url-gw" "\
@@ -28955,8 +28992,8 @@ overriding the value of `url-gateway-method'.
;;;***
-;;;### (autoloads nil "url-handlers" "url/url-handlers.el" (21765
-;;;;;; 52463 696089 51000))
+;;;### (autoloads nil "url-handlers" "url/url-handlers.el" (21766
+;;;;;; 44463 655319 936000))
;;; Generated autoloads from url/url-handlers.el
(defvar url-handler-mode nil "\
@@ -29010,8 +29047,8 @@ accessible.
;;;***
-;;;### (autoloads nil "url-http" "url/url-http.el" (21678 60840 509788
-;;;;;; 711000))
+;;;### (autoloads nil "url-http" "url/url-http.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-http.el
(autoload 'url-default-expander "url-expand")
@@ -29023,8 +29060,8 @@ accessible.
;;;***
-;;;### (autoloads nil "url-irc" "url/url-irc.el" (21678 60840 509788
-;;;;;; 711000))
+;;;### (autoloads nil "url-irc" "url/url-irc.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-irc.el
(autoload 'url-irc "url-irc" "\
@@ -29034,8 +29071,8 @@ accessible.
;;;***
-;;;### (autoloads nil "url-ldap" "url/url-ldap.el" (21678 60840 509788
-;;;;;; 711000))
+;;;### (autoloads nil "url-ldap" "url/url-ldap.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-ldap.el
(autoload 'url-ldap "url-ldap" "\
@@ -29048,8 +29085,8 @@ URL can be a URL string, or a URL vector of the type returned by
;;;***
-;;;### (autoloads nil "url-mailto" "url/url-mailto.el" (21678 60840
-;;;;;; 509788 711000))
+;;;### (autoloads nil "url-mailto" "url/url-mailto.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from url/url-mailto.el
(autoload 'url-mail "url-mailto" "\
@@ -29064,8 +29101,8 @@ Handle the mailto: URL syntax.
;;;***
-;;;### (autoloads nil "url-misc" "url/url-misc.el" (21678 60840 509788
-;;;;;; 711000))
+;;;### (autoloads nil "url-misc" "url/url-misc.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-misc.el
(autoload 'url-man "url-misc" "\
@@ -29096,8 +29133,8 @@ Fetch a data URL (RFC 2397).
;;;***
-;;;### (autoloads nil "url-news" "url/url-news.el" (21678 60840 509788
-;;;;;; 711000))
+;;;### (autoloads nil "url-news" "url/url-news.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-news.el
(autoload 'url-news "url-news" "\
@@ -29112,8 +29149,8 @@ Fetch a data URL (RFC 2397).
;;;***
-;;;### (autoloads nil "url-ns" "url/url-ns.el" (21678 60840 509788
-;;;;;; 711000))
+;;;### (autoloads nil "url-ns" "url/url-ns.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-ns.el
(autoload 'isPlainHostName "url-ns" "\
@@ -29153,8 +29190,8 @@ Fetch a data URL (RFC 2397).
;;;***
-;;;### (autoloads nil "url-parse" "url/url-parse.el" (21678 60840
-;;;;;; 509788 711000))
+;;;### (autoloads nil "url-parse" "url/url-parse.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from url/url-parse.el
(autoload 'url-recreate-url "url-parse" "\
@@ -29205,8 +29242,8 @@ parses to
;;;***
-;;;### (autoloads nil "url-privacy" "url/url-privacy.el" (21678 60840
-;;;;;; 509788 711000))
+;;;### (autoloads nil "url-privacy" "url/url-privacy.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from url/url-privacy.el
(autoload 'url-setup-privacy-info "url-privacy" "\
@@ -29216,8 +29253,8 @@ Setup variables that expose info about you and your system.
;;;***
-;;;### (autoloads nil "url-queue" "url/url-queue.el" (21678 60840
-;;;;;; 509788 711000))
+;;;### (autoloads nil "url-queue" "url/url-queue.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from url/url-queue.el
(autoload 'url-queue-retrieve "url-queue" "\
@@ -29231,8 +29268,8 @@ The variable `url-queue-timeout' sets a timeout.
;;;***
-;;;### (autoloads nil "url-tramp" "url/url-tramp.el" (21678 60840
-;;;;;; 509788 711000))
+;;;### (autoloads nil "url-tramp" "url/url-tramp.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from url/url-tramp.el
(defvar url-tramp-protocols '("ftp" "ssh" "scp" "rsync" "telnet") "\
@@ -29250,8 +29287,8 @@ would have been passed to OPERATION.
;;;***
-;;;### (autoloads nil "url-util" "url/url-util.el" (21678 60840 513788
-;;;;;; 871000))
+;;;### (autoloads nil "url-util" "url/url-util.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from url/url-util.el
(defvar url-debug nil "\
@@ -29419,8 +29456,8 @@ This uses `url-current-object', set locally to the buffer.
;;;***
-;;;### (autoloads nil "userlock" "userlock.el" (21678 60840 513788
-;;;;;; 871000))
+;;;### (autoloads nil "userlock" "userlock.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from userlock.el
(autoload 'ask-user-about-lock "userlock" "\
@@ -29448,8 +29485,8 @@ The buffer in question is current when this function is called.
;;;***
-;;;### (autoloads nil "utf-7" "international/utf-7.el" (21678 60839
-;;;;;; 785759 709000))
+;;;### (autoloads nil "utf-7" "international/utf-7.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from international/utf-7.el
(autoload 'utf-7-post-read-conversion "utf-7" "\
@@ -29474,7 +29511,7 @@ The buffer in question is current when this function is called.
;;;***
-;;;### (autoloads nil "utf7" "gnus/utf7.el" (21678 60839 733757 619000))
+;;;### (autoloads nil "utf7" "gnus/utf7.el" (21670 32331 385639 720000))
;;; Generated autoloads from gnus/utf7.el
(autoload 'utf7-encode "utf7" "\
@@ -29484,8 +29521,8 @@ Encode UTF-7 STRING. Use IMAP modification if FOR-IMAP is non-nil.
;;;***
-;;;### (autoloads nil "uudecode" "mail/uudecode.el" (21678 60839
-;;;;;; 893764 49000))
+;;;### (autoloads nil "uudecode" "mail/uudecode.el" (21670 32331
+;;;;;; 385639 720000))
;;; Generated autoloads from mail/uudecode.el
(autoload 'uudecode-decode-region-external "uudecode" "\
@@ -29509,7 +29546,7 @@ If FILE-NAME is non-nil, save the result to FILE-NAME.
;;;***
-;;;### (autoloads nil "vc" "vc/vc.el" (21756 63738 30469 750000))
+;;;### (autoloads nil "vc" "vc/vc.el" (21748 18111 534605 274000))
;;; Generated autoloads from vc/vc.el
(defvar vc-checkout-hook nil "\
@@ -29806,8 +29843,8 @@ Return the branch part of a revision number REV.
;;;***
-;;;### (autoloads nil "vc-annotate" "vc/vc-annotate.el" (21678 60840
-;;;;;; 537789 831000))
+;;;### (autoloads nil "vc-annotate" "vc/vc-annotate.el" (21670 32331
+;;;;;; 885635 586000))
;;; Generated autoloads from vc/vc-annotate.el
(autoload 'vc-annotate "vc-annotate" "\
@@ -29846,8 +29883,8 @@ should be applied to the background or to the foreground.
;;;***
-;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (21743 64718 144093
-;;;;;; 773000))
+;;;### (autoloads nil "vc-bzr" "vc/vc-bzr.el" (21826 49705 100508
+;;;;;; 896000))
;;; Generated autoloads from vc/vc-bzr.el
(defconst vc-bzr-admin-dirname ".bzr" "\
@@ -29863,8 +29900,8 @@ Name of the format file in a .bzr directory.")
;;;***
-;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (21743 64718 148093
-;;;;;; 697000))
+;;;### (autoloads nil "vc-cvs" "vc/vc-cvs.el" (21826 49707 480493
+;;;;;; 554000))
;;; Generated autoloads from vc/vc-cvs.el
(defun vc-cvs-registered (f)
"Return non-nil if file F is registered with CVS."
@@ -29875,8 +29912,8 @@ Name of the format file in a .bzr directory.")
;;;***
-;;;### (autoloads nil "vc-dir" "vc/vc-dir.el" (21694 48017 622101
-;;;;;; 735000))
+;;;### (autoloads nil "vc-dir" "vc/vc-dir.el" (21694 14651 747488
+;;;;;; 989000))
;;; Generated autoloads from vc/vc-dir.el
(autoload 'vc-dir "vc-dir" "\
@@ -29900,8 +29937,8 @@ These are the commands available for use in the file status buffer:
;;;***
-;;;### (autoloads nil "vc-dispatcher" "vc/vc-dispatcher.el" (21803
-;;;;;; 61751 309339 979000))
+;;;### (autoloads nil "vc-dispatcher" "vc/vc-dispatcher.el" (21800
+;;;;;; 62631 12543 671000))
;;; Generated autoloads from vc/vc-dispatcher.el
(autoload 'vc-do-command "vc-dispatcher" "\
@@ -29924,8 +29961,8 @@ case, and the process object in the asynchronous case.
;;;***
-;;;### (autoloads nil "vc-git" "vc/vc-git.el" (21743 64718 148093
-;;;;;; 697000))
+;;;### (autoloads nil "vc-git" "vc/vc-git.el" (21826 49709 140509
+;;;;;; 237000))
;;; Generated autoloads from vc/vc-git.el
(defun vc-git-registered (file)
"Return non-nil if FILE is registered with git."
@@ -29936,7 +29973,7 @@ case, and the process object in the asynchronous case.
;;;***
-;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (21743 64718 148093 697000))
+;;;### (autoloads nil "vc-hg" "vc/vc-hg.el" (21826 49710 734782 20000))
;;; Generated autoloads from vc/vc-hg.el
(defun vc-hg-registered (file)
"Return non-nil if FILE is registered with hg."
@@ -29947,8 +29984,8 @@ case, and the process object in the asynchronous case.
;;;***
-;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (21743 64718 148093
-;;;;;; 697000))
+;;;### (autoloads nil "vc-mtn" "vc/vc-mtn.el" (21826 49712 314797
+;;;;;; 780000))
;;; Generated autoloads from vc/vc-mtn.el
(defconst vc-mtn-admin-dir "_MTN" "\
@@ -29964,8 +30001,8 @@ Name of the monotone directory's format file.")
;;;***
-;;;### (autoloads nil "vc-rcs" "vc/vc-rcs.el" (21756 63738 26469
-;;;;;; 850000))
+;;;### (autoloads nil "vc-rcs" "vc/vc-rcs.el" (21826 49714 91236
+;;;;;; 252000))
;;; Generated autoloads from vc/vc-rcs.el
(defvar vc-rcs-master-templates (purecopy '("%sRCS/%s,v" "%s%s,v" "%sRCS/%s")) "\
@@ -29978,8 +30015,8 @@ For a description of possible values, see `vc-check-master-templates'.")
;;;***
-;;;### (autoloads nil "vc-sccs" "vc/vc-sccs.el" (21756 63738 26469
-;;;;;; 850000))
+;;;### (autoloads nil "vc-sccs" "vc/vc-sccs.el" (21748 18111 534605
+;;;;;; 274000))
;;; Generated autoloads from vc/vc-sccs.el
(defvar vc-sccs-master-templates (purecopy '("%sSCCS/s.%s" "%ss.%s" vc-sccs-search-project-dir)) "\
@@ -29997,8 +30034,8 @@ find any project directory." (let ((project-dir (getenv "PROJECTDIR")) dirs dir)
;;;***
-;;;### (autoloads nil "vc-src" "vc/vc-src.el" (21756 63738 26469
-;;;;;; 850000))
+;;;### (autoloads nil "vc-src" "vc/vc-src.el" (21748 18111 534605
+;;;;;; 274000))
;;; Generated autoloads from vc/vc-src.el
(defvar vc-src-master-templates (purecopy '("%s.src/%s,v")) "\
@@ -30011,8 +30048,8 @@ For a description of possible values, see `vc-check-master-templates'.")
;;;***
-;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (21743 64718 148093
-;;;;;; 697000))
+;;;### (autoloads nil "vc-svn" "vc/vc-svn.el" (21744 21055 525326
+;;;;;; 515000))
;;; Generated autoloads from vc/vc-svn.el
(defun vc-svn-registered (f)
(let ((admin-dir (cond ((and (eq system-type 'windows-nt)
@@ -30025,8 +30062,8 @@ For a description of possible values, see `vc-check-master-templates'.")
;;;***
-;;;### (autoloads nil "vera-mode" "progmodes/vera-mode.el" (21678
-;;;;;; 60840 349782 310000))
+;;;### (autoloads nil "vera-mode" "progmodes/vera-mode.el" (21670
+;;;;;; 32331 885635 586000))
;;; Generated autoloads from progmodes/vera-mode.el
(push (purecopy '(vera-mode 2 28)) package--builtin-versions)
(add-to-list 'auto-mode-alist (cons (purecopy "\\.vr[hi]?\\'") 'vera-mode))
@@ -30085,7 +30122,7 @@ Key bindings:
;;;***
;;;### (autoloads nil "verilog-mode" "progmodes/verilog-mode.el"
-;;;;;; (21737 7371 369619 402000))
+;;;;;; (21735 54828 874639 640000))
;;; Generated autoloads from progmodes/verilog-mode.el
(autoload 'verilog-mode "verilog-mode" "\
@@ -30225,7 +30262,7 @@ Key bindings specific to `verilog-mode-map' are:
;;;***
;;;### (autoloads nil "vhdl-mode" "progmodes/vhdl-mode.el" (21799
-;;;;;; 14913 220433 536000))
+;;;;;; 41767 71224 187000))
;;; Generated autoloads from progmodes/vhdl-mode.el
(autoload 'vhdl-mode "vhdl-mode" "\
@@ -30779,8 +30816,8 @@ Key bindings:
;;;***
-;;;### (autoloads nil "viet-util" "language/viet-util.el" (21678
-;;;;;; 60839 821761 156000))
+;;;### (autoloads nil "viet-util" "language/viet-util.el" (21670
+;;;;;; 32331 385639 720000))
;;; Generated autoloads from language/viet-util.el
(autoload 'viet-encode-viscii-char "viet-util" "\
@@ -30824,7 +30861,7 @@ Convert Vietnamese characters of the current buffer to `VIQR' mnemonics.
;;;***
-;;;### (autoloads nil "view" "view.el" (21678 60840 553790 471000))
+;;;### (autoloads nil "view" "view.el" (21670 32331 885635 586000))
;;; Generated autoloads from view.el
(defvar view-remove-frame-by-deleting t "\
@@ -31080,8 +31117,8 @@ Exit View mode and make the current buffer editable.
;;;***
-;;;### (autoloads nil "viper" "emulation/viper.el" (21678 60839 513748
-;;;;;; 778000))
+;;;### (autoloads nil "viper" "emulation/viper.el" (21670 32330 885624
+;;;;;; 725000))
;;; Generated autoloads from emulation/viper.el
(push (purecopy '(viper 3 14 1)) package--builtin-versions)
@@ -31098,8 +31135,8 @@ Turn on Viper emulation of Vi in Emacs. See Info node `(viper)Top'.
;;;***
-;;;### (autoloads nil "warnings" "emacs-lisp/warnings.el" (21678
-;;;;;; 60839 497748 135000))
+;;;### (autoloads nil "warnings" "emacs-lisp/warnings.el" (21670
+;;;;;; 32330 885624 725000))
;;; Generated autoloads from emacs-lisp/warnings.el
(defvar warning-prefix-function nil "\
@@ -31189,7 +31226,7 @@ this is equivalent to `display-warning', using
;;;***
-;;;### (autoloads nil "wdired" "wdired.el" (21678 60840 553790 471000))
+;;;### (autoloads nil "wdired" "wdired.el" (21670 32331 885635 586000))
;;; Generated autoloads from wdired.el
(push (purecopy '(wdired 2 0)) package--builtin-versions)
@@ -31207,8 +31244,8 @@ See `wdired-mode'.
;;;***
-;;;### (autoloads nil "webjump" "net/webjump.el" (21678 60840 9768
-;;;;;; 710000))
+;;;### (autoloads nil "webjump" "net/webjump.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from net/webjump.el
(autoload 'webjump "webjump" "\
@@ -31224,8 +31261,8 @@ Please submit bug reports and other feedback to the author, Neil W. Van Dyke
;;;***
-;;;### (autoloads nil "which-func" "progmodes/which-func.el" (21678
-;;;;;; 60840 377783 430000))
+;;;### (autoloads nil "which-func" "progmodes/which-func.el" (21670
+;;;;;; 32331 885635 586000))
;;; Generated autoloads from progmodes/which-func.el
(put 'which-func-format 'risky-local-variable t)
(put 'which-func-current 'risky-local-variable t)
@@ -31255,8 +31292,8 @@ in certain major modes.
;;;***
-;;;### (autoloads nil "whitespace" "whitespace.el" (21678 60840 557790
-;;;;;; 631000))
+;;;### (autoloads nil "whitespace" "whitespace.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from whitespace.el
(push (purecopy '(whitespace 13 2 2)) package--builtin-versions)
@@ -31624,8 +31661,8 @@ cleaning up these problems.
;;;***
-;;;### (autoloads nil "wid-browse" "wid-browse.el" (21678 60840 557790
-;;;;;; 631000))
+;;;### (autoloads nil "wid-browse" "wid-browse.el" (21670 32331 885635
+;;;;;; 586000))
;;; Generated autoloads from wid-browse.el
(autoload 'widget-browse-at "wid-browse" "\
@@ -31653,8 +31690,8 @@ if ARG is omitted or nil.
;;;***
-;;;### (autoloads nil "wid-edit" "wid-edit.el" (21678 60840 561790
-;;;;;; 791000))
+;;;### (autoloads nil "wid-edit" "wid-edit.el" (21816 50862 20497
+;;;;;; 333000))
;;; Generated autoloads from wid-edit.el
(autoload 'widgetp "wid-edit" "\
@@ -31696,8 +31733,8 @@ Setup current buffer so editing string widgets works.
;;;***
-;;;### (autoloads nil "windmove" "windmove.el" (21733 15494 362925
-;;;;;; 968000))
+;;;### (autoloads nil "windmove" "windmove.el" (21733 50750 334730
+;;;;;; 5000))
;;; Generated autoloads from windmove.el
(autoload 'windmove-left "windmove" "\
@@ -31749,7 +31786,7 @@ Default MODIFIER is 'shift.
;;;***
-;;;### (autoloads nil "winner" "winner.el" (21733 15494 362925 968000))
+;;;### (autoloads nil "winner" "winner.el" (21733 50750 334730 5000))
;;; Generated autoloads from winner.el
(defvar winner-mode nil "\
@@ -31772,7 +31809,7 @@ the mode if ARG is omitted or nil, and toggle it if ARG is `toggle'.
;;;***
-;;;### (autoloads nil "woman" "woman.el" (21678 60840 573791 271000))
+;;;### (autoloads nil "woman" "woman.el" (21670 32331 885635 586000))
;;; Generated autoloads from woman.el
(push (purecopy '(woman 0 551)) package--builtin-versions)
@@ -31821,7 +31858,7 @@ Default bookmark handler for Woman buffers.
;;;***
-;;;### (autoloads nil "xml" "xml.el" (21678 60840 573791 271000))
+;;;### (autoloads nil "xml" "xml.el" (21670 32331 885635 586000))
;;; Generated autoloads from xml.el
(autoload 'xml-parse-file "xml" "\
@@ -31877,8 +31914,8 @@ Both features can be combined by providing a cons cell
;;;***
-;;;### (autoloads nil "xmltok" "nxml/xmltok.el" (21678 60840 29769
-;;;;;; 509000))
+;;;### (autoloads nil "xmltok" "nxml/xmltok.el" (21670 32331 385639
+;;;;;; 720000))
;;; Generated autoloads from nxml/xmltok.el
(autoload 'xmltok-get-declared-encoding-position "xmltok" "\
@@ -31896,8 +31933,8 @@ If LIMIT is non-nil, then do not consider characters beyond LIMIT.
;;;***
-;;;### (autoloads nil "xref" "progmodes/xref.el" (21738 45410 880804
-;;;;;; 179000))
+;;;### (autoloads nil "xref" "progmodes/xref.el" (21826 300 640488
+;;;;;; 815000))
;;; Generated autoloads from progmodes/xref.el
(autoload 'xref-pop-marker-stack "xref" "\
@@ -31946,8 +31983,8 @@ The argument has the same meaning as in `apropos'.
;;;***
-;;;### (autoloads nil "xt-mouse" "xt-mouse.el" (21779 25618 200348
-;;;;;; 730000))
+;;;### (autoloads nil "xt-mouse" "xt-mouse.el" (21779 56495 106033
+;;;;;; 935000))
;;; Generated autoloads from xt-mouse.el
(defvar xterm-mouse-mode nil "\
@@ -31976,7 +32013,7 @@ down the SHIFT key while pressing the mouse button.
;;;***
-;;;### (autoloads nil "yenc" "gnus/yenc.el" (21678 60839 733757 619000))
+;;;### (autoloads nil "yenc" "gnus/yenc.el" (21670 32331 385639 720000))
;;; Generated autoloads from gnus/yenc.el
(autoload 'yenc-decode-region "yenc" "\
@@ -31991,7 +32028,7 @@ Extract file name from an yenc header.
;;;***
-;;;### (autoloads nil "zone" "play/zone.el" (21678 60840 213776 870000))
+;;;### (autoloads nil "zone" "play/zone.el" (21670 32331 385639 720000))
;;; Generated autoloads from play/zone.el
(autoload 'zone "zone" "\
@@ -32037,11 +32074,9 @@ Zone out, completely.
;;;;;; "cedet/ede/system.el" "cedet/ede/util.el" "cedet/semantic/analyze.el"
;;;;;; "cedet/semantic/analyze/complete.el" "cedet/semantic/analyze/debug.el"
;;;;;; "cedet/semantic/analyze/fcn.el" "cedet/semantic/analyze/refs.el"
-;;;;;; "cedet/semantic/bovine.el" "cedet/semantic/bovine/c-by.el"
-;;;;;; "cedet/semantic/bovine/c.el" "cedet/semantic/bovine/debug.el"
+;;;;;; "cedet/semantic/bovine.el" "cedet/semantic/bovine/c.el" "cedet/semantic/bovine/debug.el"
;;;;;; "cedet/semantic/bovine/el.el" "cedet/semantic/bovine/gcc.el"
-;;;;;; "cedet/semantic/bovine/make-by.el" "cedet/semantic/bovine/make.el"
-;;;;;; "cedet/semantic/bovine/scm-by.el" "cedet/semantic/bovine/scm.el"
+;;;;;; "cedet/semantic/bovine/make.el" "cedet/semantic/bovine/scm.el"
;;;;;; "cedet/semantic/chart.el" "cedet/semantic/complete.el" "cedet/semantic/ctxt.el"
;;;;;; "cedet/semantic/db-debug.el" "cedet/semantic/db-ebrowse.el"
;;;;;; "cedet/semantic/db-el.el" "cedet/semantic/db-file.el" "cedet/semantic/db-find.el"
@@ -32064,23 +32099,21 @@ Zone out, completely.
;;;;;; "cedet/semantic/tag.el" "cedet/semantic/texi.el" "cedet/semantic/util-modes.el"
;;;;;; "cedet/semantic/util.el" "cedet/semantic/wisent.el" "cedet/semantic/wisent/comp.el"
;;;;;; "cedet/semantic/wisent/java-tags.el" "cedet/semantic/wisent/javascript.el"
-;;;;;; "cedet/semantic/wisent/javat-wy.el" "cedet/semantic/wisent/js-wy.el"
-;;;;;; "cedet/semantic/wisent/python-wy.el" "cedet/semantic/wisent/python.el"
-;;;;;; "cedet/semantic/wisent/wisent.el" "cedet/srecode/args.el"
-;;;;;; "cedet/srecode/compile.el" "cedet/srecode/cpp.el" "cedet/srecode/ctxt.el"
-;;;;;; "cedet/srecode/dictionary.el" "cedet/srecode/document.el"
+;;;;;; "cedet/semantic/wisent/python.el" "cedet/semantic/wisent/wisent.el"
+;;;;;; "cedet/srecode/args.el" "cedet/srecode/compile.el" "cedet/srecode/cpp.el"
+;;;;;; "cedet/srecode/ctxt.el" "cedet/srecode/dictionary.el" "cedet/srecode/document.el"
;;;;;; "cedet/srecode/el.el" "cedet/srecode/expandproto.el" "cedet/srecode/extract.el"
;;;;;; "cedet/srecode/fields.el" "cedet/srecode/filters.el" "cedet/srecode/find.el"
;;;;;; "cedet/srecode/getset.el" "cedet/srecode/insert.el" "cedet/srecode/java.el"
;;;;;; "cedet/srecode/loaddefs.el" "cedet/srecode/map.el" "cedet/srecode/mode.el"
-;;;;;; "cedet/srecode/semantic.el" "cedet/srecode/srt-wy.el" "cedet/srecode/srt.el"
-;;;;;; "cedet/srecode/table.el" "cedet/srecode/template.el" "cedet/srecode/texi.el"
-;;;;;; "cus-dep.el" "cus-load.el" "dframe.el" "dired-aux.el" "dired-x.el"
-;;;;;; "dom.el" "dos-fns.el" "dos-vars.el" "dos-w32.el" "dynamic-setting.el"
-;;;;;; "emacs-lisp/avl-tree.el" "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el"
-;;;;;; "emacs-lisp/cl-extra.el" "emacs-lisp/cl-generic.el" "emacs-lisp/cl-loaddefs.el"
-;;;;;; "emacs-lisp/cl-macs.el" "emacs-lisp/cl-seq.el" "emacs-lisp/cl.el"
-;;;;;; "emacs-lisp/eieio-base.el" "emacs-lisp/eieio-compat.el" "emacs-lisp/eieio-custom.el"
+;;;;;; "cedet/srecode/semantic.el" "cedet/srecode/srt.el" "cedet/srecode/table.el"
+;;;;;; "cedet/srecode/template.el" "cedet/srecode/texi.el" "cus-dep.el"
+;;;;;; "dframe.el" "dired-aux.el" "dired-x.el" "dom.el" "dos-fns.el"
+;;;;;; "dos-vars.el" "dos-w32.el" "dynamic-setting.el" "emacs-lisp/avl-tree.el"
+;;;;;; "emacs-lisp/bindat.el" "emacs-lisp/byte-opt.el" "emacs-lisp/cl-extra.el"
+;;;;;; "emacs-lisp/cl-generic.el" "emacs-lisp/cl-loaddefs.el" "emacs-lisp/cl-macs.el"
+;;;;;; "emacs-lisp/cl-seq.el" "emacs-lisp/cl.el" "emacs-lisp/eieio-base.el"
+;;;;;; "emacs-lisp/eieio-compat.el" "emacs-lisp/eieio-custom.el"
;;;;;; "emacs-lisp/eieio-datadebug.el" "emacs-lisp/eieio-opt.el"
;;;;;; "emacs-lisp/eieio-speedbar.el" "emacs-lisp/generator.el"
;;;;;; "emacs-lisp/lisp-mnt.el" "emacs-lisp/package-x.el" "emacs-lisp/smie.el"
@@ -32099,66 +32132,51 @@ Zone out, completely.
;;;;;; "eshell/esh-arg.el" "eshell/esh-cmd.el" "eshell/esh-ext.el"
;;;;;; "eshell/esh-groups.el" "eshell/esh-io.el" "eshell/esh-module.el"
;;;;;; "eshell/esh-opt.el" "eshell/esh-proc.el" "eshell/esh-util.el"
-;;;;;; "eshell/esh-var.el" "ezimage.el" "finder-inf.el" "format-spec.el"
-;;;;;; "fringe.el" "generic-x.el" "gnus/compface.el" "gnus/gnus-async.el"
-;;;;;; "gnus/gnus-bcklg.el" "gnus/gnus-cite.el" "gnus/gnus-cloud.el"
-;;;;;; "gnus/gnus-cus.el" "gnus/gnus-demon.el" "gnus/gnus-dup.el"
-;;;;;; "gnus/gnus-eform.el" "gnus/gnus-ems.el" "gnus/gnus-icalendar.el"
-;;;;;; "gnus/gnus-int.el" "gnus/gnus-logic.el" "gnus/gnus-mh.el"
-;;;;;; "gnus/gnus-salt.el" "gnus/gnus-score.el" "gnus/gnus-srvr.el"
-;;;;;; "gnus/gnus-topic.el" "gnus/gnus-undo.el" "gnus/gnus-util.el"
-;;;;;; "gnus/gnus-uu.el" "gnus/gnus-vm.el" "gnus/gssapi.el" "gnus/ietf-drums.el"
-;;;;;; "gnus/legacy-gnus-agent.el" "gnus/mail-parse.el" "gnus/mail-prsvr.el"
-;;;;;; "gnus/mail-source.el" "gnus/mailcap.el" "gnus/messcompat.el"
-;;;;;; "gnus/mm-archive.el" "gnus/mm-bodies.el" "gnus/mm-decode.el"
-;;;;;; "gnus/mm-util.el" "gnus/mm-view.el" "gnus/mml-sec.el" "gnus/mml-smime.el"
-;;;;;; "gnus/nnagent.el" "gnus/nnbabyl.el" "gnus/nndir.el" "gnus/nndraft.el"
-;;;;;; "gnus/nneething.el" "gnus/nngateway.el" "gnus/nnheader.el"
-;;;;;; "gnus/nnimap.el" "gnus/nnir.el" "gnus/nnmail.el" "gnus/nnmaildir.el"
-;;;;;; "gnus/nnmairix.el" "gnus/nnmbox.el" "gnus/nnmh.el" "gnus/nnnil.el"
-;;;;;; "gnus/nnoo.el" "gnus/nnregistry.el" "gnus/nnrss.el" "gnus/nnspool.el"
-;;;;;; "gnus/nntp.el" "gnus/nnvirtual.el" "gnus/nnweb.el" "gnus/registry.el"
-;;;;;; "gnus/rfc1843.el" "gnus/rfc2045.el" "gnus/rfc2047.el" "gnus/rfc2231.el"
-;;;;;; "gnus/rtree.el" "gnus/sieve-manage.el" "gnus/smime.el" "gnus/spam-stat.el"
-;;;;;; "gnus/spam-wash.el" "hex-util.el" "hfy-cmap.el" "ibuf-ext.el"
-;;;;;; "international/cp51932.el" "international/eucjp-ms.el" "international/fontset.el"
-;;;;;; "international/iso-ascii.el" "international/ja-dic-cnv.el"
-;;;;;; "international/ja-dic-utl.el" "international/ogonek.el" "international/uni-bidi.el"
-;;;;;; "international/uni-brackets.el" "international/uni-category.el"
-;;;;;; "international/uni-combining.el" "international/uni-comment.el"
-;;;;;; "international/uni-decimal.el" "international/uni-decomposition.el"
-;;;;;; "international/uni-digit.el" "international/uni-lowercase.el"
-;;;;;; "international/uni-mirrored.el" "international/uni-name.el"
-;;;;;; "international/uni-numeric.el" "international/uni-old-name.el"
-;;;;;; "international/uni-titlecase.el" "international/uni-uppercase.el"
-;;;;;; "kermit.el" "language/hanja-util.el" "language/thai-word.el"
-;;;;;; "ldefs-boot.el" "leim/ja-dic/ja-dic.el" "leim/quail/4Corner.el"
-;;;;;; "leim/quail/ARRAY30.el" "leim/quail/CCDOSPY.el" "leim/quail/CTLau-b5.el"
-;;;;;; "leim/quail/CTLau.el" "leim/quail/ECDICT.el" "leim/quail/ETZY.el"
-;;;;;; "leim/quail/PY-b5.el" "leim/quail/PY.el" "leim/quail/Punct-b5.el"
-;;;;;; "leim/quail/Punct.el" "leim/quail/QJ-b5.el" "leim/quail/QJ.el"
-;;;;;; "leim/quail/SW.el" "leim/quail/TONEPY.el" "leim/quail/ZIRANMA.el"
-;;;;;; "leim/quail/ZOZY.el" "leim/quail/arabic.el" "leim/quail/croatian.el"
-;;;;;; "leim/quail/cyril-jis.el" "leim/quail/cyrillic.el" "leim/quail/czech.el"
-;;;;;; "leim/quail/ethiopic.el" "leim/quail/georgian.el" "leim/quail/greek.el"
-;;;;;; "leim/quail/hanja-jis.el" "leim/quail/hanja.el" "leim/quail/hanja3.el"
-;;;;;; "leim/quail/hebrew.el" "leim/quail/indian.el" "leim/quail/ipa-praat.el"
-;;;;;; "leim/quail/ipa.el" "leim/quail/japanese.el" "leim/quail/lao.el"
-;;;;;; "leim/quail/latin-alt.el" "leim/quail/latin-ltx.el" "leim/quail/latin-post.el"
-;;;;;; "leim/quail/latin-pre.el" "leim/quail/lrt.el" "leim/quail/persian.el"
-;;;;;; "leim/quail/py-punct.el" "leim/quail/pypunct-b5.el" "leim/quail/quick-b5.el"
-;;;;;; "leim/quail/quick-cns.el" "leim/quail/rfc1345.el" "leim/quail/sgml-input.el"
+;;;;;; "eshell/esh-var.el" "ezimage.el" "format-spec.el" "fringe.el"
+;;;;;; "generic-x.el" "gnus/compface.el" "gnus/gnus-async.el" "gnus/gnus-bcklg.el"
+;;;;;; "gnus/gnus-cite.el" "gnus/gnus-cloud.el" "gnus/gnus-cus.el"
+;;;;;; "gnus/gnus-demon.el" "gnus/gnus-dup.el" "gnus/gnus-eform.el"
+;;;;;; "gnus/gnus-ems.el" "gnus/gnus-icalendar.el" "gnus/gnus-int.el"
+;;;;;; "gnus/gnus-logic.el" "gnus/gnus-mh.el" "gnus/gnus-salt.el"
+;;;;;; "gnus/gnus-score.el" "gnus/gnus-srvr.el" "gnus/gnus-topic.el"
+;;;;;; "gnus/gnus-undo.el" "gnus/gnus-util.el" "gnus/gnus-uu.el"
+;;;;;; "gnus/gnus-vm.el" "gnus/gssapi.el" "gnus/ietf-drums.el" "gnus/legacy-gnus-agent.el"
+;;;;;; "gnus/mail-parse.el" "gnus/mail-prsvr.el" "gnus/mail-source.el"
+;;;;;; "gnus/mailcap.el" "gnus/messcompat.el" "gnus/mm-archive.el"
+;;;;;; "gnus/mm-bodies.el" "gnus/mm-decode.el" "gnus/mm-util.el"
+;;;;;; "gnus/mm-view.el" "gnus/mml-sec.el" "gnus/mml-smime.el" "gnus/nnagent.el"
+;;;;;; "gnus/nnbabyl.el" "gnus/nndir.el" "gnus/nndraft.el" "gnus/nneething.el"
+;;;;;; "gnus/nngateway.el" "gnus/nnheader.el" "gnus/nnimap.el" "gnus/nnir.el"
+;;;;;; "gnus/nnmail.el" "gnus/nnmaildir.el" "gnus/nnmairix.el" "gnus/nnmbox.el"
+;;;;;; "gnus/nnmh.el" "gnus/nnnil.el" "gnus/nnoo.el" "gnus/nnregistry.el"
+;;;;;; "gnus/nnrss.el" "gnus/nnspool.el" "gnus/nntp.el" "gnus/nnvirtual.el"
+;;;;;; "gnus/nnweb.el" "gnus/registry.el" "gnus/rfc1843.el" "gnus/rfc2045.el"
+;;;;;; "gnus/rfc2047.el" "gnus/rfc2231.el" "gnus/rtree.el" "gnus/sieve-manage.el"
+;;;;;; "gnus/smime.el" "gnus/spam-stat.el" "gnus/spam-wash.el" "hex-util.el"
+;;;;;; "hfy-cmap.el" "ibuf-ext.el" "international/cp51932.el" "international/eucjp-ms.el"
+;;;;;; "international/fontset.el" "international/iso-ascii.el" "international/ja-dic-cnv.el"
+;;;;;; "international/ja-dic-utl.el" "international/ogonek.el" "kermit.el"
+;;;;;; "language/hanja-util.el" "language/thai-word.el" "ldefs-boot.el"
+;;;;;; "leim/quail/arabic.el" "leim/quail/croatian.el" "leim/quail/cyril-jis.el"
+;;;;;; "leim/quail/cyrillic.el" "leim/quail/czech.el" "leim/quail/ethiopic.el"
+;;;;;; "leim/quail/georgian.el" "leim/quail/greek.el" "leim/quail/hanja-jis.el"
+;;;;;; "leim/quail/hanja.el" "leim/quail/hanja3.el" "leim/quail/hebrew.el"
+;;;;;; "leim/quail/indian.el" "leim/quail/ipa-praat.el" "leim/quail/ipa.el"
+;;;;;; "leim/quail/japanese.el" "leim/quail/lao.el" "leim/quail/latin-alt.el"
+;;;;;; "leim/quail/latin-ltx.el" "leim/quail/latin-post.el" "leim/quail/latin-pre.el"
+;;;;;; "leim/quail/lrt.el" "leim/quail/persian.el" "leim/quail/py-punct.el"
+;;;;;; "leim/quail/pypunct-b5.el" "leim/quail/rfc1345.el" "leim/quail/sgml-input.el"
;;;;;; "leim/quail/sisheng.el" "leim/quail/slovak.el" "leim/quail/symbol-ksc.el"
-;;;;;; "leim/quail/thai.el" "leim/quail/tibetan.el" "leim/quail/tsang-b5.el"
-;;;;;; "leim/quail/tsang-cns.el" "leim/quail/viqr.el" "leim/quail/vntelex.el"
-;;;;;; "leim/quail/vnvni.el" "leim/quail/welsh.el" "loadup.el" "mail/blessmail.el"
-;;;;;; "mail/mailheader.el" "mail/mspools.el" "mail/rfc2368.el"
-;;;;;; "mail/rfc822.el" "mail/rmail-spam-filter.el" "mail/rmailedit.el"
-;;;;;; "mail/rmailkwd.el" "mail/rmailmm.el" "mail/rmailmsc.el" "mail/rmailsort.el"
-;;;;;; "mail/rmailsum.el" "mail/undigest.el" "mh-e/mh-acros.el"
-;;;;;; "mh-e/mh-alias.el" "mh-e/mh-buffers.el" "mh-e/mh-compat.el"
-;;;;;; "mh-e/mh-funcs.el" "mh-e/mh-gnus.el" "mh-e/mh-identity.el"
-;;;;;; "mh-e/mh-inc.el" "mh-e/mh-junk.el" "mh-e/mh-letter.el" "mh-e/mh-limit.el"
+;;;;;; "leim/quail/thai.el" "leim/quail/tibetan.el" "leim/quail/viqr.el"
+;;;;;; "leim/quail/vntelex.el" "leim/quail/vnvni.el" "leim/quail/welsh.el"
+;;;;;; "loadup.el" "mail/blessmail.el" "mail/mailheader.el" "mail/mspools.el"
+;;;;;; "mail/rfc2368.el" "mail/rfc822.el" "mail/rmail-spam-filter.el"
+;;;;;; "mail/rmailedit.el" "mail/rmailkwd.el" "mail/rmailmm.el"
+;;;;;; "mail/rmailmsc.el" "mail/rmailsort.el" "mail/rmailsum.el"
+;;;;;; "mail/undigest.el" "mh-e/mh-acros.el" "mh-e/mh-alias.el"
+;;;;;; "mh-e/mh-buffers.el" "mh-e/mh-compat.el" "mh-e/mh-funcs.el"
+;;;;;; "mh-e/mh-gnus.el" "mh-e/mh-identity.el" "mh-e/mh-inc.el"
+;;;;;; "mh-e/mh-junk.el" "mh-e/mh-letter.el" "mh-e/mh-limit.el"
;;;;;; "mh-e/mh-loaddefs.el" "mh-e/mh-mime.el" "mh-e/mh-print.el"
;;;;;; "mh-e/mh-scan.el" "mh-e/mh-search.el" "mh-e/mh-seq.el" "mh-e/mh-show.el"
;;;;;; "mh-e/mh-speed.el" "mh-e/mh-thread.el" "mh-e/mh-tool-bar.el"
@@ -32212,23 +32230,22 @@ Zone out, completely.
;;;;;; "progmodes/ebnf-otz.el" "progmodes/ebnf-yac.el" "progmodes/idlw-complete-structtag.el"
;;;;;; "progmodes/idlw-help.el" "progmodes/idlw-toolbar.el" "progmodes/mantemp.el"
;;;;;; "progmodes/xscheme.el" "ps-def.el" "ps-mule.el" "ps-samp.el"
-;;;;;; "saveplace.el" "sb-image.el" "scroll-bar.el" "soundex.el"
-;;;;;; "subdirs.el" "tempo.el" "textmodes/bib-mode.el" "textmodes/makeinfo.el"
-;;;;;; "textmodes/page-ext.el" "textmodes/refbib.el" "textmodes/refer.el"
-;;;;;; "textmodes/reftex-auc.el" "textmodes/reftex-cite.el" "textmodes/reftex-dcr.el"
-;;;;;; "textmodes/reftex-global.el" "textmodes/reftex-index.el"
-;;;;;; "textmodes/reftex-parse.el" "textmodes/reftex-ref.el" "textmodes/reftex-sel.el"
-;;;;;; "textmodes/reftex-toc.el" "textmodes/texnfo-upd.el" "timezone.el"
-;;;;;; "tooltip.el" "tree-widget.el" "url/url-about.el" "url/url-cookie.el"
-;;;;;; "url/url-dired.el" "url/url-domsuf.el" "url/url-expand.el"
-;;;;;; "url/url-ftp.el" "url/url-future.el" "url/url-history.el"
-;;;;;; "url/url-imap.el" "url/url-methods.el" "url/url-nfs.el" "url/url-proxy.el"
-;;;;;; "url/url-vars.el" "vc/ediff-diff.el" "vc/ediff-init.el" "vc/ediff-merg.el"
-;;;;;; "vc/ediff-ptch.el" "vc/ediff-vers.el" "vc/ediff-wind.el"
-;;;;;; "vc/pcvs-info.el" "vc/pcvs-parse.el" "vc/pcvs-util.el" "vc/vc-dav.el"
-;;;;;; "vc/vc-filewise.el" "vcursor.el" "vt-control.el" "vt100-led.el"
-;;;;;; "w32-fns.el" "w32-vars.el" "x-dnd.el") (21804 4067 633695
-;;;;;; 693000))
+;;;;;; "sb-image.el" "scroll-bar.el" "soundex.el" "subdirs.el" "tempo.el"
+;;;;;; "textmodes/bib-mode.el" "textmodes/makeinfo.el" "textmodes/page-ext.el"
+;;;;;; "textmodes/refbib.el" "textmodes/refer.el" "textmodes/reftex-auc.el"
+;;;;;; "textmodes/reftex-cite.el" "textmodes/reftex-dcr.el" "textmodes/reftex-global.el"
+;;;;;; "textmodes/reftex-index.el" "textmodes/reftex-parse.el" "textmodes/reftex-ref.el"
+;;;;;; "textmodes/reftex-sel.el" "textmodes/reftex-toc.el" "textmodes/texnfo-upd.el"
+;;;;;; "timezone.el" "tooltip.el" "tree-widget.el" "url/url-about.el"
+;;;;;; "url/url-cookie.el" "url/url-dired.el" "url/url-domsuf.el"
+;;;;;; "url/url-expand.el" "url/url-ftp.el" "url/url-future.el"
+;;;;;; "url/url-history.el" "url/url-imap.el" "url/url-methods.el"
+;;;;;; "url/url-nfs.el" "url/url-proxy.el" "url/url-vars.el" "vc/ediff-diff.el"
+;;;;;; "vc/ediff-init.el" "vc/ediff-merg.el" "vc/ediff-ptch.el"
+;;;;;; "vc/ediff-vers.el" "vc/ediff-wind.el" "vc/pcvs-info.el" "vc/pcvs-parse.el"
+;;;;;; "vc/pcvs-util.el" "vc/vc-dav.el" "vc/vc-filewise.el" "vcursor.el"
+;;;;;; "vt-control.el" "vt100-led.el" "w32-fns.el" "w32-vars.el"
+;;;;;; "x-dnd.el") (21827 21192 518044 532000))
;;;***
diff --git a/lisp/linum.el b/lisp/linum.el
index de15274314c..2aac13ab9b0 100644
--- a/lisp/linum.el
+++ b/lisp/linum.el
@@ -138,6 +138,9 @@ Linum mode is a buffer-local minor mode."
(mapc #'delete-overlay linum-available)
(setq linum-available nil))))
+;; Behind display-graphic-p test.
+(declare-function font-info "font.c" (name &optional frame))
+
(defun linum--face-width (face)
(let ((info (font-info (face-font face)))
width)
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 0746f95c1b9..84fa327050a 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -26,20 +26,24 @@
;; This is loaded into a bare Emacs to make a dumpable one.
-;; If you add/remove Lisp files to be loaded here, consider the
-;; following issues:
+;; If you add a file to be loaded here, keep the following points in mind:
-;; i) Any file loaded on any platform should appear in $lisp in src/lisp.mk.
-;; Use the .el or .elc version as appropriate.
+;; i) If the file is no-byte-compile, explicitly load the .el version.
+;; Such files should (where possible) obey the doc-string conventions
+;; expected by make-docfile. They should also be added to the
+;; uncompiled[] list in make-docfile.c.
+;; ii) If the file is dumped with Emacs (on any platform), put the
+;; load statement at the start of a line (leading whitespace is ok).
+
+;; iii) If the file is _not_ dumped with Emacs, make sure the load
+;; statement is _not_ at the start of a line. See pcase for an example.
+
+;; These rules are so that src/Makefile can construct lisp.mk automatically.
;; This ensures both that the Lisp files are compiled (if necessary)
;; before the emacs executable is dumped, and that they are passed to
;; make-docfile. (Any that are not processed for DOC will not have
-;; doc strings in the dumped Emacs.) Because of this:
-
-;; ii) If the file is loaded uncompiled, it should (where possible)
-;; obey the doc-string conventions expected by make-docfile. It
-;; should also be added to the uncompiled[] list in make-docfile.c.
+;; doc strings in the dumped Emacs.)
;;; Code:
@@ -117,8 +121,7 @@
;; Since loaddefs is not yet loaded, macroexp's uses of pcase will simply
;; fail until pcase is explicitly loaded. This also means that we have to
;; disable eager macro-expansion while loading pcase.
- (let ((macroexp--pending-eager-loads '(skip)))
- (load "emacs-lisp/pcase"))
+ (let ((macroexp--pending-eager-loads '(skip))) (load "emacs-lisp/pcase"))
;; Re-load macroexp so as to eagerly macro-expand its uses of pcase.
(let ((max-lisp-eval-depth (* 2 max-lisp-eval-depth)))
(load "emacs-lisp/macroexp")))
@@ -139,9 +142,7 @@
;; should be updated by overwriting it with an up-to-date copy of
;; loaddefs.el that is uncorrupted by local changes.
;; autogen/update_autogen can be used to periodically update ldefs-boot.
-(condition-case nil
- ;; Don't get confused if someone compiled this by mistake.
- (load "loaddefs.el")
+(condition-case nil (load "loaddefs.el")
;; In case loaddefs hasn't been generated yet.
(file-error (load "ldefs-boot.el")))
@@ -178,6 +179,8 @@
(load "language/romanian")
(load "language/greek")
(load "language/hebrew")
+(load "international/cp51932.el")
+(load "international/eucjp-ms.el")
(load "language/japanese")
(load "language/korean")
(load "language/lao")
@@ -193,6 +196,7 @@
(load "language/cham")
(load "indent")
+(load "emacs-lisp/cl-generic")
(load "frame")
(load "startup")
(load "term/tty-colors")
@@ -286,7 +290,8 @@
(load "electric")
(load "emacs-lisp/eldoc")
(load "cus-start") ;Late to reduce customize-rogue (needs loaddefs.el anyway)
-(if (not (eq system-type 'ms-dos)) (load "tooltip"))
+(if (not (eq system-type 'ms-dos))
+ (load "tooltip"))
;; This file doesn't exist when building a development version of Emacs
;; from the repository. It is generated just after temacs is built.
diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el
index 74533f88fdf..f0c6d876b7f 100644
--- a/lisp/mail/rmail.el
+++ b/lisp/mail/rmail.el
@@ -1,4 +1,4 @@
-;;; rmail.el --- main code of "RMAIL" mail reader for Emacs
+;;; rmail.el --- main code of "RMAIL" mail reader for Emacs -*- lexical-binding:t -*-
;; Copyright (C) 1985-1988, 1993-1998, 2000-2015 Free Software
;; Foundation, Inc.
@@ -393,7 +393,7 @@ go to that message and type \\[rmail-toggle-header] twice."
"Regexp to match Header fields that Rmail should display.
If nil, display all header fields except those matched by
`rmail-ignored-headers'."
- :type '(choice regexp (const :tag "All"))
+ :type '(choice regexp (const :tag "All" nil))
:group 'rmail-headers)
;;;###autoload
@@ -407,7 +407,7 @@ If nil, display all header fields except those matched by
(defcustom rmail-highlighted-headers (purecopy "^From:\\|^Subject:")
"Regexp to match Header fields that Rmail should normally highlight.
A value of nil means don't highlight. Uses the face `rmail-highlight'."
- :type 'regexp
+ :type '(choice regexp (const :tag "None" nil))
:group 'rmail-headers)
(defface rmail-highlight
@@ -889,7 +889,7 @@ that knows the exact ordering of the \\( \\) subexpressions.")
Signal an error and set `rmail-mime-feature' to nil if the feature
isn't provided."
(when rmail-enable-mime
- (condition-case err
+ (condition-case nil
(require rmail-mime-feature)
(error
(display-warning
@@ -1586,13 +1586,12 @@ Hook `rmail-quit-hook' is run after expunging."
(interactive)
;; This let var was called rmail-buffer, but that interfered
;; with the buffer-local var used in summary buffers.
- (let ((buffer-to-bury (current-buffer)))
- (if (rmail-summary-exists)
- (let (window)
- (while (setq window (get-buffer-window rmail-summary-buffer))
- (quit-window nil window))
- (bury-buffer rmail-summary-buffer)))
- (quit-window)))
+ (if (rmail-summary-exists)
+ (let (window)
+ (while (setq window (get-buffer-window rmail-summary-buffer))
+ (quit-window nil window))
+ (bury-buffer rmail-summary-buffer)))
+ (quit-window))
(defun rmail-duplicate-message ()
"Create a duplicated copy of the current message.
@@ -1760,15 +1759,14 @@ not be a new one). It returns non-nil if it got any new messages."
;; This loops if any members of the inbox list have the same
;; basename (see "name conflict" below).
(while all-files
- (let ((opoint (point))
- ;; If buffer has not changed yet, and has not been
+ (let (;; If buffer has not changed yet, and has not been
;; saved yet, don't replace the old backup file now.
(make-backup-files (and make-backup-files
(buffer-modified-p)))
(buffer-read-only nil)
;; Don't make undo records while getting mail.
(buffer-undo-list t)
- delete-files success files file-last-names)
+ delete-files files file-last-names)
;; Pull files off all-files onto files as long as there is
;; no name conflict. A conflict happens when two inbox
;; file names have the same last component.
@@ -1910,9 +1908,10 @@ is non-nil if the user has supplied the password interactively.
((string-match "^po:\\([^:]+\\)\\(:\\(.*\\)\\)?" file)
(let (got-password supplied-password
- (proto "pop")
- (user (match-string 1 file))
- (host (match-string 3 file)))
+ ;; (proto "pop")
+ ;; (user (match-string 1 file))
+ ;; (host (match-string 3 file))
+ )
(when rmail-remote-password-required
(setq got-password (not (rmail-have-password)))
@@ -1945,8 +1944,7 @@ SIZE is the original size of the newly read mail.
Value is the size of the newly read mail after conversion."
;; Detect previous Babyl format files.
(let ((case-fold-search nil)
- (old-file file)
- new-file)
+ (old-file file))
(cond ((looking-at "BABYL OPTIONS:")
;; The new mail is in Babyl version 5 format. Use unrmail
;; to convert it.
@@ -1972,7 +1970,7 @@ Value is the size of the newly read mail after conversion."
(or (memq (file-locked-p buffer-file-name) '(nil t))
(error "RMAIL file %s is locked"
(file-name-nondirectory buffer-file-name)))
- (let (file tofile delete-files movemail popmail got-password password)
+ (let (file tofile delete-files popmail got-password password)
(while files
;; Handle remote mailbox names specially; don't expand as filenames
;; in case the userid contains a directory separator.
@@ -2127,7 +2125,7 @@ Value is the size of the newly read mail after conversion."
Call with point at the end of the message."
(unless (bolp)
(insert "\n"))
- (unless (looking-back "\n\n" (- (point 2)))
+ (unless (looking-back "\n\n" (- (point) 2))
(insert "\n")))
(defun rmail-add-mbox-headers ()
@@ -2144,7 +2142,7 @@ new messages. Return the number of new messages."
(value "------U-")
(case-fold-search nil)
(delim (concat "\n\n" rmail-unix-mail-delimiter))
- limit stop)
+ stop)
;; Detect an empty inbox file.
(unless (= start (point-max))
;; Scan the new messages to establish a count and to ensure that
@@ -2889,7 +2887,7 @@ The current mail message becomes the message displayed."
(setq blurb (format "Showing message %d...done" msg)))))
blurb))
-(defun rmail-copy-headers (beg end &optional ignored-headers)
+(defun rmail-copy-headers (beg _end &optional ignored-headers)
"Copy displayed header fields to the message viewer buffer.
BEG and END marks the start and end positions of the message in
the mbox buffer. If the optional argument IGNORED-HEADERS is
@@ -2942,7 +2940,8 @@ buffer to the end of the headers."
(1+ (match-beginning 0))
(point-max))))
(if (and (looking-at ignored-headers)
- (not (looking-at rmail-nonignored-headers)))
+ (not (and rmail-nonignored-headers
+ (looking-at rmail-nonignored-headers))))
(goto-char lim)
(append-to-buffer rmail-view-buffer (point) lim)
(goto-char lim))))
@@ -3152,7 +3151,7 @@ or forward if N is negative."
(rmail-maybe-set-message-counters)
(rmail-show-message rmail-total-messages))
-(defun rmail-next-error-move (msg-pos bad-marker)
+(defun rmail-next-error-move (msg-pos _bad-marker)
"Move to an error locus (probably grep hit) in an Rmail buffer.
MSG-POS is a marker pointing at the error message in the grep buffer.
BAD-MARKER is a marker that ought to point at where to move to,
@@ -3462,21 +3461,20 @@ STATE non-nil means mark as deleted."
"Back up to deleted message, select it, and undelete it."
(interactive "p")
(set-buffer rmail-buffer)
- (let (value)
- (dotimes (i count)
- (let ((msg rmail-current-message))
- (while (and (> msg 0)
- (not (rmail-message-deleted-p msg)))
- (setq msg (1- msg)))
- (if (= msg 0)
- (error "No previous deleted message")
- (if (/= msg rmail-current-message)
- (rmail-show-message msg))
- (rmail-set-attribute rmail-deleted-attr-index nil)
- (if (rmail-summary-exists)
- (with-current-buffer rmail-summary-buffer
- (rmail-summary-mark-undeleted msg))))))
- (rmail-maybe-display-summary)))
+ (dotimes (_ count)
+ (let ((msg rmail-current-message))
+ (while (and (> msg 0)
+ (not (rmail-message-deleted-p msg)))
+ (setq msg (1- msg)))
+ (if (= msg 0)
+ (error "No previous deleted message")
+ (if (/= msg rmail-current-message)
+ (rmail-show-message msg))
+ (rmail-set-attribute rmail-deleted-attr-index nil)
+ (if (rmail-summary-exists)
+ (with-current-buffer rmail-summary-buffer
+ (rmail-summary-mark-undeleted msg))))))
+ (rmail-maybe-display-summary))
(defun rmail-delete-forward (&optional count)
"Delete this message and move to next nondeleted one.
@@ -3490,7 +3488,7 @@ Returns t if a new message is displayed after the delete, or nil otherwise."
(let (value backward)
(if (< count 0)
(setq count (- count) backward t))
- (dotimes (i count)
+ (dotimes (_ count)
(rmail-set-attribute rmail-deleted-attr-index t)
(run-hooks 'rmail-delete-message-hook)
(let ((del-msg rmail-current-message))
@@ -3787,7 +3785,7 @@ use \\[mail-yank-original] to yank the original message into it."
(if (zerop rmail-current-message)
(error "There is no message to reply to"))
(let (from reply-to cc subject date to message-id references
- resent-to resent-cc resent-reply-to
+ ;; resent-to resent-cc resent-reply-to
(msgnum rmail-current-message))
(rmail-apply-in-message
rmail-current-message
@@ -3802,14 +3800,14 @@ use \\[mail-yank-original] to yank the original message into it."
date (mail-fetch-field "date")
message-id (mail-fetch-field "message-id")
references (mail-fetch-field "references" nil nil t)
- resent-reply-to (mail-fetch-field "resent-reply-to" nil t)
;; Bug#512. It's inappropriate to reply to these addresses.
-;;; resent-cc (and (not just-sender)
-;;; (mail-fetch-field "resent-cc" nil t))
-;;; resent-to (or (mail-fetch-field "resent-to" nil t) "")
-;;; resent-subject (mail-fetch-field "resent-subject")
-;;; resent-date (mail-fetch-field "resent-date")
-;;; resent-message-id (mail-fetch-field "resent-message-id")
+ ;;resent-reply-to (mail-fetch-field "resent-reply-to" nil t)
+ ;;resent-cc (and (not just-sender)
+ ;; (mail-fetch-field "resent-cc" nil t))
+ ;;resent-to (or (mail-fetch-field "resent-to" nil t) "")
+ ;;resent-subject (mail-fetch-field "resent-subject")
+ ;;resent-date (mail-fetch-field "resent-date")
+ ;;resent-message-id (mail-fetch-field "resent-message-id")
)
(unless just-sender
(if (mail-fetch-field "mail-followup-to" nil t)
@@ -3820,17 +3818,18 @@ use \\[mail-yank-original] to yank the original message into it."
to (or (mail-fetch-field "to" nil t) ""))))))
;; Merge the resent-to and resent-cc into the to and cc.
;; Bug#512. It's inappropriate to reply to these addresses.
-;;; (if (and resent-to (not (equal resent-to "")))
-;;; (if (not (equal to ""))
-;;; (setq to (concat to ", " resent-to))
-;;; (setq to resent-to)))
-;;; (if (and resent-cc (not (equal resent-cc "")))
-;;; (if (not (equal cc ""))
-;;; (setq cc (concat cc ", " resent-cc))
-;;; (setq cc resent-cc)))
+ ;;(if (and resent-to (not (equal resent-to "")))
+ ;; (setq to (if (not (equal to ""))
+ ;; (concat to ", " resent-to)
+ ;; resent-to)))
+ ;;(if (and resent-cc (not (equal resent-cc "")))
+ ;; (setq cc (if (not (equal cc ""))
+ ;; (concat cc ", " resent-cc)
+ ;; resent-cc)))
;; Add `Re: ' to subject if not there already.
(and (stringp subject)
- (setq subject
+ (setq subject (rfc2047-decode-string subject)
+ subject
(concat rmail-reply-prefix
(if (let ((case-fold-search t))
(string-match rmail-reply-regexp subject))
@@ -4145,6 +4144,9 @@ The message should be narrowed to just the headers."
(declare-function rmail-mime-toggle-raw "rmailmm" (&optional state))
+(defvar rmail-mime-mbox-buffer)
+(defvar rmail-mime-view-buffer)
+
(defun rmail-retry-failure ()
"Edit a mail message which is based on the contents of the current message.
For a message rejected by the mail system, extract the interesting headers and
@@ -4421,13 +4423,13 @@ current message into that RMAIL folder."
(declare-function dframe-select-attached-frame "dframe" (&optional frame))
(declare-function dframe-maybee-jump-to-attached-frame "dframe" ())
-(defun rmail-speedbar-button (text token indent)
+(defun rmail-speedbar-button (_text token _indent)
"Execute an rmail command specified by TEXT.
The command used is TOKEN. INDENT is not used."
(dframe-with-attached-buffer
(funcall token t)))
-(defun rmail-speedbar-find-file (text token indent)
+(defun rmail-speedbar-find-file (text _token _indent)
"Load in the rmail file TEXT.
TOKEN and INDENT are not used."
(dframe-with-attached-buffer
@@ -4446,7 +4448,7 @@ TOKEN and INDENT are not used."
(forward-char -2)
(speedbar-do-function-pointer)))))
-(defun rmail-speedbar-move-message (text token indent)
+(defun rmail-speedbar-move-message (_text token _indent)
"From button TEXT, copy current message to the rmail file specified by TOKEN.
TEXT and INDENT are not used."
(dframe-with-attached-buffer
@@ -4642,13 +4644,13 @@ encoded string (and the same mask) will decode the string."
;;;; Desktop support
-(defun rmail-restore-desktop-buffer (desktop-buffer-file-name
- desktop-buffer-name
- desktop-buffer-misc)
+(defun rmail-restore-desktop-buffer (file-name
+ _buffer-name
+ _buffer-misc)
"Restore an rmail buffer specified in a desktop file."
- (condition-case error
+ (condition-case nil
(progn
- (rmail-input desktop-buffer-file-name)
+ (rmail-input file-name)
(if (eq major-mode 'rmail-mode)
(current-buffer)
rmail-buffer))
@@ -4664,7 +4666,7 @@ encoded string (and the same mask) will decode the string."
(defvar rmail-message-encoding nil)
;; Used in `write-region-annotate-functions' to write rmail files.
-(defun rmail-write-region-annotate (start end)
+(defun rmail-write-region-annotate (start _end)
(when (and (null start) rmail-buffer-swapped)
(unless (buffer-live-p rmail-view-buffer)
(error "Buffer `%s' with real text of `%s' has disappeared"
@@ -4691,7 +4693,7 @@ encoded string (and the same mask) will decode the string."
;;; Start of automatically extracted autoloads.
-;;;### (autoloads nil "rmailedit" "rmailedit.el" "f6da7267316d02c90b9d314ce95b3c22")
+;;;### (autoloads nil "rmailedit" "rmailedit.el" "1ed1c211e6e9c254ba3e0dd8d546e745")
;;; Generated autoloads from rmailedit.el
(autoload 'rmail-edit-current-message "rmailedit" "\
@@ -4744,7 +4746,7 @@ With prefix argument N moves forward N messages with these labels.
;;;***
-;;;### (autoloads nil "rmailmm" "rmailmm.el" "a17df5ef8968113c8f6a78cf85c82da4")
+;;;### (autoloads nil "rmailmm" "rmailmm.el" "e5b89eed8afb278cc8881f2208382c7c")
;;; Generated autoloads from rmailmm.el
(autoload 'rmail-mime "rmailmm" "\
@@ -4841,7 +4843,7 @@ If prefix argument REVERSE is non-nil, sorts in reverse order.
;;;***
-;;;### (autoloads nil "rmailsum" "rmailsum.el" "3203e61425330fc20f3154b559f8b539")
+;;;### (autoloads nil "rmailsum" "rmailsum.el" "b34aec2c31535804e2731992a64c8cdf")
;;; Generated autoloads from rmailsum.el
(autoload 'rmail-summary "rmailsum" "\
diff --git a/lisp/mail/rmailedit.el b/lisp/mail/rmailedit.el
index 15d27a085fe..0b49782d80f 100644
--- a/lisp/mail/rmailedit.el
+++ b/lisp/mail/rmailedit.el
@@ -44,6 +44,8 @@
(declare-function rmail-summary-disable "rmailsum" ())
+;; We can't straightforwardly make this derive from text-mode, because
+;; we need to bind (rmail-buffer-swapped) around the text-mode call. :(
(defun rmail-edit-mode ()
"Major mode for editing the contents of an Rmail message.
The editing commands are the same as in Text mode, together with
diff --git a/lisp/mail/rmailmm.el b/lisp/mail/rmailmm.el
index 00fc25dd440..3dd57b9bab7 100644
--- a/lisp/mail/rmailmm.el
+++ b/lisp/mail/rmailmm.el
@@ -135,9 +135,10 @@ automatically display the image in the buffer."
(cond ((fboundp 'libxml-parse-html-region) 'rmail-mime-render-html-shr)
((executable-find "lynx") 'rmail-mime-render-html-lynx)
(t nil))
- "Function to convert HTML to text. Called with buffer containing HTML
-extracted from message in a temporary buffer. Converts to text in current
-buffer. If NIL, display HTML source."
+ "Function to convert HTML to text.
+Called with buffer containing HTML extracted from message in a
+temporary buffer. Converts to text in current buffer. If nil,
+display HTML source."
:group 'rmail
:version "25.1"
:type '(choice function (const nil)))
@@ -705,6 +706,9 @@ HEADER is a header component of a MIME-entity object (see
(insert-buffer-substring source-buffer))
(rmail-mime-fix-inserted-faces start)))))))
+(declare-function libxml-parse-html-region "xml.c"
+ (start end &optional base-url discard-comments))
+
(defun rmail-mime-render-html-shr (source-buffer)
(let ((dom (with-current-buffer source-buffer
(libxml-parse-html-region (point-min) (point-max))))
@@ -732,12 +736,12 @@ HEADER is a header component of a MIME-entity object (see
(defun rmail-mime-fix-inserted-faces (start)
(while (< start (point))
(let ((face (get-text-property start 'face))
- (next (next-single-property-change
+ (next (next-single-property-change
start 'face (current-buffer) (point))))
(if face ; anything to do?
(put-text-property start next 'font-lock-face face))
(setq start next))))
-
+
(defun rmail-mime-toggle-button (button)
"Hide or show the body of the MIME-entity associated with BUTTON."
(save-excursion
diff --git a/lisp/mail/rmailsum.el b/lisp/mail/rmailsum.el
index 7144e43d301..7097fef9ada 100644
--- a/lisp/mail/rmailsum.el
+++ b/lisp/mail/rmailsum.el
@@ -1,4 +1,4 @@
-;;; rmailsum.el --- make summary buffers for the mail reader
+;;; rmailsum.el --- make summary buffers for the mail reader -*- lexical-binding:t -*-
;; Copyright (C) 1985, 1993-1996, 2000-2015 Free Software Foundation, Inc.
@@ -262,7 +262,7 @@ Setting this option to nil might speed up the generation of summaries."
;; Regenerate the contents of the summary
;; using the same selection criterion as last time.
;; M-x revert-buffer in a summary buffer calls this function.
-(defun rmail-update-summary (&rest ignore)
+(defun rmail-update-summary (&rest _)
(apply (car rmail-summary-redo) (cdr rmail-summary-redo)))
;;;###autoload
@@ -340,13 +340,30 @@ Emacs will list the message in the summary."
"Return t, if for message number MSG, regexp REGEXP matches in the header."
(rmail-apply-in-message msg 'rmail-message-regexp-p-1 msg regexp))
+(defun rmail--decode-and-apply (function &rest args)
+ "Make an RFC2047-decoded copy of current buffer, apply FUNCTION with ARGS."
+ (let ((buff (current-buffer)))
+ (with-temp-buffer
+ (insert-buffer-substring buff)
+ (goto-char (point-min))
+ ;; FIXME? In rmail-show-message-1, decoding depends on
+ ;; rmail-enable-mime being non-nil (?).
+ (rfc2047-decode-region (point-min)
+ (save-excursion
+ (progn
+ (search-forward "\n\n" nil 'move)
+ (point))))
+ (apply function args))))
+
(defun rmail-message-regexp-p-1 (msg regexp)
;; Search functions can expect to start from the beginning.
(narrow-to-region (point) (save-excursion (search-forward "\n\n") (point)))
(if (and rmail-enable-mime
rmail-search-mime-header-function)
(funcall rmail-search-mime-header-function msg regexp (point))
- (re-search-forward regexp nil t)))
+ ;; We need to search the full headers, but probably want to decode
+ ;; them so they match the ones people see displayed. (Bug#19088)
+ (rmail--decode-and-apply 're-search-forward regexp nil t)))
;;;###autoload
(defun rmail-summary-by-topic (subject &optional whole-message)
@@ -370,7 +387,9 @@ SUBJECT is a string of regexps separated by commas."
(defun rmail-message-subject-p (msg subject &optional whole-message)
(if whole-message
- (rmail-apply-in-message msg 're-search-forward subject nil t)
+ ;; SUBJECT and rmail-simplified-subject are 2047 decoded.
+ (rmail-apply-in-message msg 'rmail--decode-and-apply
+ 're-search-forward subject nil t)
(string-match subject (rmail-simplified-subject msg))))
;;;###autoload
@@ -655,7 +674,7 @@ LINES is the number of lines in the message (if we should display that)
(goto-char (point-min))
(let ((line (rmail-header-summary))
(labels (rmail-get-summary-labels))
- pos status prefix basic-start basic-end linecount-string)
+ status prefix basic-start basic-end linecount-string)
(setq linecount-string
(cond
@@ -727,7 +746,7 @@ the message being processed."
;; Get all the lines of the From field
;; so that we get a whole comment if there is one,
;; so that mail-strip-quoted-names can discard it.
- (let ((opoint (point)))
+ (progn
(while (progn (forward-line 1)
(looking-at "[ \t]")))
;; Back up over newline, then trailing spaces or tabs
@@ -909,8 +928,8 @@ A prefix argument serves as a repeat count;
a negative argument means to delete and move backward."
(interactive "p")
(unless (numberp count) (setq count 1))
- (let (end del-msg
- (backward (< count 0)))
+ (let (del-msg
+ (backward (< count 0)))
(while (and (/= count 0)
;; Don't waste time if we are at the beginning
;; and trying to go backward.
@@ -1029,7 +1048,7 @@ Optional prefix ARG means undelete ARG previous messages."
(forward-line 1))
(setq n (1- n)))
(rmail-summary-goto-msg 1)
- (dotimes (i rmail-total-messages)
+ (dotimes (_ rmail-total-messages)
(rmail-summary-goto-msg)
(let (del-msg)
(when (rmail-summary-deleted-p)
diff --git a/lisp/midnight.el b/lisp/midnight.el
index dbf0c0289d1..256ab9c06aa 100644
--- a/lisp/midnight.el
+++ b/lisp/midnight.el
@@ -1,4 +1,4 @@
-;;; midnight.el --- run something every midnight, e.g., kill old buffers
+;;; midnight.el --- run something every midnight, e.g., kill old buffers -*- lexical-binding:t -*-
;; Copyright (C) 1998, 2001-2015 Free Software Foundation, Inc.
@@ -36,7 +36,7 @@
;;; Code:
-(eval-when-compile (require 'cl-lib))
+(require 'cl-lib)
(defgroup midnight nil
"Run something every day at midnight."
@@ -48,24 +48,19 @@
Use `cancel-timer' to stop it and `midnight-delay-set' to change
the time when it is run.")
-(defcustom midnight-mode nil
- "Non-nil means run `midnight-hook' at midnight.
-Setting this variable outside customize has no effect;
-call `cancel-timer' or `timer-activate' on `midnight-timer' instead."
- :type 'boolean
- :group 'midnight
- :require 'midnight
- :initialize 'custom-initialize-default
- :set (lambda (symb val)
- (set symb val) (require 'midnight)
- (if val (timer-activate midnight-timer)
- (cancel-timer midnight-timer))))
+;;;###autoload
+(define-minor-mode midnight-mode
+ "Non-nil means run `midnight-hook' at midnight."
+ :global t
+ :initialize #'custom-initialize-default
+ (if midnight-mode (timer-activate midnight-timer)
+ (cancel-timer midnight-timer)))
;;; time conversion
-(defun midnight-buffer-display-time (&optional buffer)
+(defun midnight-buffer-display-time (buffer)
"Return the time-stamp of BUFFER, or current buffer, as float."
- (with-current-buffer (or buffer (current-buffer))
+ (with-current-buffer buffer
(when buffer-display-time (float-time buffer-display-time))))
;;; clean-buffer-list stuff
@@ -76,18 +71,16 @@ The autokilling is done by `clean-buffer-list' when is it in `midnight-hook'.
Currently displayed and/or modified (unsaved) buffers, as well as buffers
matching `clean-buffer-list-kill-never-buffer-names' and
`clean-buffer-list-kill-never-regexps' are excluded."
- :type 'integer
- :group 'midnight)
+ :type 'integer)
(defcustom clean-buffer-list-delay-special 3600
"The number of seconds before some buffers become eligible for autokilling.
Buffers matched by `clean-buffer-list-kill-regexps' and
`clean-buffer-list-kill-buffer-names' are killed if they were last
displayed more than this many seconds ago."
- :type 'integer
- :group 'midnight)
+ :type 'integer)
-(defcustom clean-buffer-list-kill-regexps '("^\\*Man ")
+(defcustom clean-buffer-list-kill-regexps '("\\`\\*Man ")
"List of regexps saying which buffers will be killed at midnight.
If buffer name matches a regexp in the list and the buffer was not displayed
in the last `clean-buffer-list-delay-special' seconds, it is killed by
@@ -96,9 +89,14 @@ If a member of the list is a cons, its `car' is the regexp and its `cdr' is
the number of seconds to use instead of `clean-buffer-list-delay-special'.
See also `clean-buffer-list-kill-buffer-names',
`clean-buffer-list-kill-never-regexps' and
-`clean-buffer-list-kill-never-buffer-names'."
- :type '(repeat (regexp :tag "Regexp matching Buffer Name"))
- :group 'midnight)
+`clean-buffer-list-kill-never-buffer-names'.
+
+Each element can also be a function instead of a regexp, in which case
+it takes a single argument (a buffer name) and should return non-nil
+if the buffer should be killed by `clean-buffer-list'."
+ :type '(repeat
+ (choice (regexp :tag "Regexp matching Buffer Name")
+ (function :tag "Predicate function"))))
(defcustom clean-buffer-list-kill-buffer-names
'("*Help*" "*Apropos*" "*Buffer List*" "*Compile-Log*" "*info*"
@@ -112,8 +110,7 @@ the number of seconds to use instead of `clean-buffer-list-delay-special'.
See also `clean-buffer-list-kill-regexps',
`clean-buffer-list-kill-never-regexps' and
`clean-buffer-list-kill-never-buffer-names'."
- :type '(repeat (string :tag "Buffer Name"))
- :group 'midnight)
+ :type '(repeat (string :tag "Buffer Name")))
(defcustom clean-buffer-list-kill-never-buffer-names
'("*scratch*" "*Messages*")
@@ -122,33 +119,34 @@ See also `clean-buffer-list-kill-never-regexps'.
Note that this does override `clean-buffer-list-kill-regexps' and
`clean-buffer-list-kill-buffer-names' so a buffer matching any of these
two lists will NOT be killed if it is also present in this list."
- :type '(repeat (string :tag "Buffer Name"))
- :group 'midnight)
+ :type '(repeat (string :tag "Buffer Name")))
-(defcustom clean-buffer-list-kill-never-regexps '("^ \\*Minibuf-.*\\*$")
+(defcustom clean-buffer-list-kill-never-regexps '("\\` \\*Minibuf-.*\\*\\'")
"List of regexp saying which buffers will never be killed at midnight.
See also `clean-buffer-list-kill-never-buffer-names'.
Killing is done by `clean-buffer-list'.
Note that this does override `clean-buffer-list-kill-regexps' and
`clean-buffer-list-kill-buffer-names' so a buffer matching any of these
-two lists will NOT be killed if it also matches anything in this list."
- :type '(repeat (regexp :tag "Regexp matching Buffer Name"))
- :group 'midnight)
+two lists will NOT be killed if it also matches anything in this list.
-(defun midnight-find (el ls test &optional key)
- "A stopgap solution to the absence of `find' in ELisp."
- (cl-dolist (rr ls)
- (when (funcall test (if key (funcall key rr) rr) el)
- (cl-return rr))))
+Each element can also be a function instead of a regexp, in which case
+it takes a single argument (a buffer name) and should return non-nil
+if the buffer should never be killed by `clean-buffer-list'."
+ :type '(repeat
+ (choice (regexp :tag "Regexp matching Buffer Name")
+ (function :tag "Predicate function"))))
(defun clean-buffer-list-delay (name)
"Return the delay, in seconds, before killing a buffer named NAME.
Uses `clean-buffer-list-kill-buffer-names', `clean-buffer-list-kill-regexps'
`clean-buffer-list-delay-general' and `clean-buffer-list-delay-special'.
Autokilling is done by `clean-buffer-list'."
- (or (assoc-default name clean-buffer-list-kill-buffer-names 'string=
+ (or (assoc-default name clean-buffer-list-kill-buffer-names #'string=
clean-buffer-list-delay-special)
- (assoc-default name clean-buffer-list-kill-regexps 'string-match
+ (assoc-default name clean-buffer-list-kill-regexps
+ (lambda (re str)
+ (if (functionp re)
+ (funcall re str) (string-match re str)))
clean-buffer-list-delay-special)
(* clean-buffer-list-delay-general 24 60 60)))
@@ -172,10 +170,13 @@ lifetime, i.e., its \"age\" when it will be purged."
(setq bts (midnight-buffer-display-time buf) bn (buffer-name buf)
delay (if bts (- tm bts) 0) cbld (clean-buffer-list-delay bn))
(message "[%s] `%s' [%s %d]" ts bn (if bts (round delay)) cbld)
- (unless (or (midnight-find bn clean-buffer-list-kill-never-regexps
- 'string-match)
- (midnight-find bn clean-buffer-list-kill-never-buffer-names
- 'string-equal)
+ (unless (or (cl-find bn clean-buffer-list-kill-never-regexps
+ :test (lambda (bn re)
+ (if (functionp re)
+ (funcall re bn)
+ (string-match re bn))))
+ (cl-find bn clean-buffer-list-kill-never-buffer-names
+ :test #'string-equal)
(get-buffer-process buf)
(and (buffer-file-name buf) (buffer-modified-p buf))
(get-buffer-window buf 'visible) (< delay cbld))
@@ -190,8 +191,7 @@ lifetime, i.e., its \"age\" when it will be purged."
(defcustom midnight-hook '(clean-buffer-list)
"The hook run `midnight-delay' seconds after midnight every day.
The default value is `clean-buffer-list'."
- :type 'hook
- :group 'midnight)
+ :type 'hook)
(defun midnight-next ()
"Return the number of seconds till the next midnight."
@@ -209,7 +209,7 @@ to its second argument TM."
(when (timerp midnight-timer) (cancel-timer midnight-timer))
(setq midnight-timer
(run-at-time (if (numberp tm) (+ (midnight-next) tm) tm)
- midnight-period 'run-hooks 'midnight-hook)))
+ midnight-period #'run-hooks 'midnight-hook)))
(defcustom midnight-delay 3600
"The number of seconds after the midnight when the `midnight-timer' is run.
@@ -218,8 +218,7 @@ set it by calling `midnight-delay-set', or use `custom'.
If you wish, you can use a string instead, it will be passed as the
first argument to `run-at-time'."
:type 'sexp
- :set 'midnight-delay-set
- :group 'midnight)
+ :set #'midnight-delay-set)
(provide 'midnight)
diff --git a/lisp/mouse-copy.el b/lisp/mouse-copy.el
index 609713ce5fd..d3c3c80fd99 100644
--- a/lisp/mouse-copy.el
+++ b/lisp/mouse-copy.el
@@ -177,7 +177,7 @@ put the point at one place, then click and drag over some other region."
(mouse-copy-work-around-drag-bug start-event last-input-event))
;; Remember what we do so we can undo it, if necessary.
(setq mouse-copy-last-paste-start (point))
- (insert (x-get-selection 'SECONDARY))
+ (insert (gui-get-selection 'SECONDARY))
(setq mouse-copy-last-paste-end (point)))
(setq mouse-copy-last-paste-start nil)))
@@ -216,7 +216,7 @@ by johnh@ficus.cs.ucla.edu."
(if (mouse-drag-secondary start-event)
(progn
(mouse-kill-preserving-secondary)
- (insert (x-get-selection 'SECONDARY))))
+ (insert (gui-get-selection 'SECONDARY))))
)
(provide 'mouse-copy)
diff --git a/lisp/net/eudc-vars.el b/lisp/net/eudc-vars.el
index 36a583daa4d..5e994a3a38f 100644
--- a/lisp/net/eudc-vars.el
+++ b/lisp/net/eudc-vars.el
@@ -312,9 +312,11 @@ arguments that should be passed to the program."
:inline t
(string :tag "Argument")))))
-(defcustom eudc-options-file "~/.eudc-options"
+(defcustom eudc-options-file
+ (locate-user-emacs-file "eudc-options" ".eudc-options")
"A file where the `servers' hotlist is stored."
- :type '(file :Tag "File Name:"))
+ :type '(file :Tag "File Name:")
+ :version "25.1")
(defcustom eudc-mode-hook nil
"Normal hook run on entry to EUDC mode."
diff --git a/lisp/net/eww.el b/lisp/net/eww.el
index a128ffb9d06..f2f5ecb8e88 100644
--- a/lisp/net/eww.el
+++ b/lisp/net/eww.el
@@ -379,7 +379,7 @@ Currently this means either text/html or application/xhtml+xml."
(match-string 1)))))
(declare-function libxml-parse-html-region "xml.c"
- (start end &optional base-url))
+ (start end &optional base-url discard-comments))
(defun eww-display-html (charset url &optional document point buffer encode)
(unless (fboundp 'libxml-parse-html-region)
diff --git a/lisp/net/mairix.el b/lisp/net/mairix.el
index c1b107932c3..087ae439f3f 100644
--- a/lisp/net/mairix.el
+++ b/lisp/net/mairix.el
@@ -265,18 +265,22 @@ Currently there are 'threads and 'flags.")
(mail-fetch-field field)))))
;;; Gnus
-(eval-when-compile
- (defvar gnus-article-buffer)
- (autoload 'gnus-summary-toggle-header "gnus-sum")
- (autoload 'gnus-buffer-exists-p "gnus-util")
- (autoload 'message-field-value "message")
- (autoload 'gnus-group-read-ephemeral-group "gnus-group")
- (autoload 'gnus-alive-p "gnus-util"))
+
+;; For gnus-buffer-exists-p, although it seems that could be replaced by:
+;; (and buffer (get-buffer buffer))
+(eval-when-compile (require 'gnus-util))
+(defvar gnus-article-buffer)
+(declare-function gnus-group-read-ephemeral-group "gnus-group"
+ (group method &optional activate quit-config
+ request-only select-articles parameters number))
+(declare-function gnus-summary-toggle-header "gnus-sum" (&optional arg))
+(declare-function message-field-value "message" (header &optional not-all))
;; Display function:
(defun mairix-gnus-ephemeral-nndoc (folder)
"Create ephemeral nndoc group for reading mbox file FOLDER in Gnus."
- (unless (gnus-alive-p)
+ (unless (and (fboundp 'gnus-alive-p)
+ (gnus-alive-p))
(error "Gnus is not running"))
(gnus-group-read-ephemeral-group
;; add randomness to group string to prevent Gnus from using a
@@ -289,26 +293,29 @@ Currently there are 'threads and 'flags.")
;; Fetching mail header field:
(defun mairix-gnus-fetch-field (field)
"Get mail header FIELD for current message using Gnus."
- (unless (gnus-alive-p)
+ (unless (and (fboundp 'gnus-alive-p)
+ (gnus-alive-p))
(error "Gnus is not running"))
(unless (gnus-buffer-exists-p gnus-article-buffer)
(error "No article buffer available"))
(with-current-buffer gnus-article-buffer
+ ;; gnus-art requires gnus-sum and message.
(gnus-summary-toggle-header 1)
(message-field-value field)))
;;; VM
;;; written by Ulrich Mueller
-(eval-when-compile
- (autoload 'vm-quit "vm-folder")
- (autoload 'vm-visit-folder "vm")
- (autoload 'vm-select-folder-buffer "vm-macro")
- (autoload 'vm-check-for-killed-summary "vm-misc")
- (autoload 'vm-get-header-contents "vm-summary")
- (autoload 'vm-check-for-killed-summary "vm-misc")
- (autoload 'vm-error-if-folder-empty "vm-misc")
- (autoload 'vm-select-marked-or-prefixed-messages "vm-folder"))
+(declare-function vm-quit "ext:vm-folder" (&optional no-change))
+(declare-function vm-visit-folder "ext:vm-startup"
+ (folder &optional read-only))
+(declare-function vm-select-folder-buffer "ext:vm-macro" ()) ; defsubst
+(declare-function vm-check-for-killed-summary "ext:vm-misc" ())
+(declare-function vm-error-if-folder-empty "ext:vm-misc" ())
+(declare-function vm-get-header-contents "ext:vm-summary"
+ (message header-name-regexp &optional clump-sep))
+(declare-function vm-select-marked-or-prefixed-messages "ext:vm-folder"
+ (prefix))
;; Display function
(defun mairix-vm-display (folder)
diff --git a/lisp/net/net-utils.el b/lisp/net/net-utils.el
index ebcbc714ffb..eaf1d7e22c4 100644
--- a/lisp/net/net-utils.el
+++ b/lisp/net/net-utils.el
@@ -326,6 +326,8 @@ This variable is only used if the variable
(insert filtered-string)
(set-marker (process-mark process) (point))))))
+(declare-function w32-get-console-output-codepage "w32proc.c" ())
+
(defun net-utils-run-program (name header program args)
"Run a network information program."
(let ((buf (get-buffer-create (concat "*" name "*")))
diff --git a/lisp/net/nsm.el b/lisp/net/nsm.el
index 28253e5bdf5..261e5a1a36c 100644
--- a/lisp/net/nsm.el
+++ b/lisp/net/nsm.el
@@ -76,6 +76,8 @@ stored in plain text."
"If non-nil, the connection is opened in a non-interactive context.
This means that no queries should be performed.")
+(declare-function gnutls-peer-status "gnutls.c" (proc))
+
(defun nsm-verify-connection (process host port &optional
save-fingerprint warn-unencrypted)
"Verify the security status of PROCESS that's connected to HOST:PORT.
@@ -122,6 +124,9 @@ unencrypted."
(nsm-check-protocol process host port status settings)
process)))
+(declare-function gnutls-peer-status-warning-describe "gnutls.c"
+ (status-symbol))
+
(defun nsm-check-certificate (process host port status settings)
(let ((warnings (plist-get status :warnings)))
(cond
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 5ea10475cea..11db7a2cab2 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -1924,17 +1924,13 @@ Uninteresting lines are those whose responses are listed in
(goto-char overlay-arrow-position)
(message "No unread messages")))
-(defun rcirc-non-irc-buffer ()
- (let ((buflist (buffer-list))
- buffer)
- (while (and buflist (not buffer))
- (with-current-buffer (car buflist)
- (unless (or (eq major-mode 'rcirc-mode)
- (= ?\s (aref (buffer-name) 0)) ; internal buffers
- (get-buffer-window (current-buffer)))
- (setq buffer (current-buffer))))
- (setq buflist (cdr buflist)))
- buffer))
+(defun rcirc-bury-buffers ()
+ "Bury all RCIRC buffers."
+ (interactive)
+ (dolist (buf (buffer-list))
+ (when (eq 'rcirc-mode (with-current-buffer buf major-mode))
+ (bury-buffer buf) ; buffers not shown
+ (quit-windows-on buf)))) ; buffers shown in a window
(defun rcirc-next-active-buffer (arg)
"Switch to the next rcirc buffer with activity.
@@ -1949,15 +1945,13 @@ With prefix ARG, go to the next low priority buffer with activity."
(switch-to-buffer (car (if arg lopri hipri)))
(when (> (point) rcirc-prompt-start-marker)
(recenter -1)))
- (if (eq major-mode 'rcirc-mode)
- (switch-to-buffer (rcirc-non-irc-buffer))
- (message "%s" (concat
- "No IRC activity."
- (when lopri
- (concat
- " Type C-u "
- (key-description (this-command-keys))
- " for low priority activity."))))))))
+ (rcirc-bury-buffers)
+ (message "No IRC activity.%s"
+ (if lopri
+ (concat
+ " Type C-u " (key-description (this-command-keys))
+ " for low priority activity.")
+ "")))))
(define-obsolete-variable-alias 'rcirc-activity-hooks
'rcirc-activity-functions "24.3")
diff --git a/lisp/net/secrets.el b/lisp/net/secrets.el
index 6f4e1736937..56cbec4ea75 100644
--- a/lisp/net/secrets.el
+++ b/lisp/net/secrets.el
@@ -598,10 +598,9 @@ If successful, return the object path of the collection."
ATTRIBUTES are key-value pairs. The keys are keyword symbols,
starting with a colon. Example:
- \(secrets-create-item \"Tramp collection\" \"item\" \"geheim\"
- :method \"sudo\" :user \"joe\" :host \"remote-host\"\)
+ \(secrets-search-items \"Tramp collection\" :user \"joe\")
-The object paths of the found items are returned as list."
+The object labels of the found items are returned as list."
(let ((collection-path (secrets-unlock-collection collection))
result props)
(unless (secrets-empty-path collection-path)
@@ -618,8 +617,7 @@ The object paths of the found items are returned as list."
(cadr attributes))
'append)
attributes (cddr attributes)))
- ;; Search. The result is a list of two lists, the object paths
- ;; of the unlocked and the locked items.
+ ;; Search. The result is a list of object paths.
(setq result
(dbus-call-method
:session secrets-service collection-path
@@ -630,7 +628,7 @@ The object paths of the found items are returned as list."
;; Return the found items.
(mapcar
(lambda (item-path) (secrets-get-item-property item-path "Label"))
- (append (car result) (cadr result))))))
+ result))))
(defun secrets-create-item (collection item password &rest attributes)
"Create a new item in COLLECTION with label ITEM and password PASSWORD.
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index 454332e55d0..0ce77b9055c 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -57,7 +57,7 @@ fit these criteria."
:group 'shr
:type '(choice (const nil) regexp))
-(defcustom shr-use-fonts nil
+(defcustom shr-use-fonts t
"If non-nil, use proportional fonts for text."
:version "25.1"
:group 'shr
@@ -152,7 +152,6 @@ cid: URL as the argument.")
(defvar shr-ignore-cache nil)
(defvar shr-external-rendering-functions nil)
(defvar shr-target-id nil)
-(defvar shr-inhibit-decoration nil)
(defvar shr-table-separator-length 1)
(defvar shr-table-separator-pixel-width 0)
(defvar shr-table-id nil)
@@ -178,7 +177,7 @@ cid: URL as the argument.")
;; Public functions and commands.
(declare-function libxml-parse-html-region "xml.c"
- (start end &optional base-url))
+ (start end &optional base-url discard-comments))
(defun shr-render-buffer (buffer)
"Display the HTML rendering of the current buffer."
@@ -783,16 +782,15 @@ size, and full-buffer size."
;; blank text at the start of the line, and the newline at the end, to
;; avoid ugliness.
(defun shr-add-font (start end type)
- (unless shr-inhibit-decoration
- (save-excursion
- (goto-char start)
- (while (< (point) end)
- (when (bolp)
- (skip-chars-forward " "))
- (add-face-text-property (point) (min (line-end-position) end) type t)
- (if (< (line-end-position) end)
- (forward-line 1)
- (goto-char end))))))
+ (save-excursion
+ (goto-char start)
+ (while (< (point) end)
+ (when (bolp)
+ (skip-chars-forward " "))
+ (add-face-text-property (point) (min (line-end-position) end) type t)
+ (if (< (line-end-position) end)
+ (forward-line 1)
+ (goto-char end)))))
(defun shr-mouse-browse-url (ev)
"Browse the URL under the mouse cursor."
@@ -951,6 +949,9 @@ Return a string with image data."
(search-forward "\r\n\r\n" nil t))
(shr-parse-image-data)))))
+(declare-function libxml-parse-xml-region "xml.c"
+ (start end &optional base-url discard-comments))
+
(defun shr-parse-image-data ()
(let ((data (buffer-substring (point) (point-max)))
(content-type
@@ -1041,8 +1042,7 @@ ones, in case fg and bg are nil."
(shr-color-visible bg fg)))))))
(defun shr-colorize-region (start end fg &optional bg)
- (when (and (not shr-inhibit-decoration)
- (or fg bg))
+ (when (or fg bg)
(let ((new-colors (shr-color-check fg bg)))
(when new-colors
(when fg
@@ -1212,8 +1212,7 @@ ones, in case fg and bg are nil."
(shr-ensure-newline)
(insert " "))
(put-text-property start (1+ start) 'shr-target-id shr-target-id))
- (when (and url
- (not shr-inhibit-decoration))
+ (when url
(shr-urlify (or shr-start start) (shr-expand-url url) title))))
(defun shr-tag-object (dom)
@@ -1805,7 +1804,6 @@ The preference is a float determined from `shr-prefer-media-type'."
(defun shr-make-table-1 (dom widths &optional fill)
(let ((trs nil)
- (shr-inhibit-decoration (not fill))
(rowspans (make-vector (length widths) 0))
(colspan-remaining 0)
colspan-width colspan-count
diff --git a/lisp/obsolete/mouse-sel.el b/lisp/obsolete/mouse-sel.el
index fcadedf6262..865a4277dda 100644
--- a/lisp/obsolete/mouse-sel.el
+++ b/lisp/obsolete/mouse-sel.el
@@ -315,7 +315,7 @@ is `interprogram-cut-paste'.")
(or (gui-selection-value)
(bound-and-true-p x-last-selected-text-primary)
gui--last-selected-text-primary)
- (x-get-selection selection)))
+ (gui-get-selection selection)))
"Function to call to get the selection.
Called with one argument:
diff --git a/lisp/org/org-list.el b/lisp/org/org-list.el
index c8db77bc689..73f24ce7bd8 100644
--- a/lisp/org/org-list.el
+++ b/lisp/org/org-list.el
@@ -431,7 +431,7 @@ group 4: description tag")
(context (org-list-context))
(lim-up (car context))
(drawers-re (concat "^[ \t]*:\\("
- (mapconcat 'regexp-quote org-drawers "\\|")
+ (mapconcat #'regexp-quote org-drawers "\\|")
"\\):[ \t]*$"))
(inlinetask-re (and (featurep 'org-inlinetask)
(org-inlinetask-outline-regexp)))
@@ -550,7 +550,7 @@ Contexts `block' and `invalid' refer to `org-list-forbidden-blocks'."
;; Can't use org-drawers-regexp as this function might
;; be called in buffers not in Org mode.
(beg-re (concat "^[ \t]*:\\("
- (mapconcat 'regexp-quote org-drawers "\\|")
+ (mapconcat #'regexp-quote org-drawers "\\|")
"\\):[ \t]*$")))
(when (save-excursion
(and (not (looking-at beg-re))
@@ -636,12 +636,12 @@ Assume point is at an item."
(text-min-ind 10000)
(item-re (org-item-re))
(drawers-re (concat "^[ \t]*:\\("
- (mapconcat 'regexp-quote org-drawers "\\|")
+ (mapconcat #'regexp-quote org-drawers "\\|")
"\\):[ \t]*$"))
(inlinetask-re (and (featurep 'org-inlinetask)
(org-inlinetask-outline-regexp)))
(beg-cell (cons (point) (org-get-indentation)))
- ind itm-lst itm-lst-2 end-lst end-lst-2 struct
+ itm-lst itm-lst-2 end-lst end-lst-2 struct
(assoc-at-point
(function
;; Return association at point.
@@ -926,13 +926,13 @@ Value returned is the position of the first child of ITEM."
(< ind (org-list-get-ind child-maybe struct)))
child-maybe)))
-(defun org-list-get-next-item (item struct prevs)
+(defun org-list-get-next-item (item _struct prevs)
"Return next item in same sub-list as ITEM, or nil.
STRUCT is the list structure. PREVS is the alist of previous
items, as returned by `org-list-prevs-alist'."
(car (rassq item prevs)))
-(defun org-list-get-prev-item (item struct prevs)
+(defun org-list-get-prev-item (item _struct prevs)
"Return previous item in same sub-list as ITEM, or nil.
STRUCT is the list structure. PREVS is the alist of previous
items, as returned by `org-list-prevs-alist'."
@@ -964,7 +964,7 @@ items, as returned by `org-list-prevs-alist'."
(push next-item after-item))
(append before-item (list item) (nreverse after-item))))
-(defun org-list-get-children (item struct parents)
+(defun org-list-get-children (item _struct parents)
"List all children of ITEM, or nil.
STRUCT is the list structure. PARENTS is the alist of parents,
as returned by `org-list-parents-alist'."
@@ -982,7 +982,7 @@ STRUCT is the list structure."
(defun org-list-get-bottom-point (struct)
"Return point at bottom of list.
STRUCT is the list structure."
- (apply 'max
+ (apply #'max
(mapcar (lambda (e) (org-list-get-item-end (car e) struct)) struct)))
(defun org-list-get-list-begin (item struct prevs)
@@ -1630,8 +1630,7 @@ as returned by `org-list-prevs-alist'."
;; Pretend that bullets are uppercase and check if alphabet
;; is sufficient, taking counters into account.
(while item
- (let ((bul (org-list-get-bullet item struct))
- (count (org-list-get-counter item struct)))
+ (let ((count (org-list-get-counter item struct)))
;; Virtually determine current bullet
(if (and count (string-match "[a-zA-Z]" count))
;; Counters are not case-sensitive.
@@ -1728,7 +1727,7 @@ This function modifies STRUCT."
(replace-match "1" nil nil bullet))
;; Not an ordered list: keep bullet.
(t bullet)))))))))
- (mapc fix-bul (mapcar 'car struct))))
+ (mapc fix-bul (mapcar #'car struct))))
(defun org-list-struct-fix-ind (struct parents &optional bullet-size)
"Verify and correct indentation in STRUCT.
@@ -1756,7 +1755,7 @@ This function modifies STRUCT."
org-list-indent-offset))
;; If no parent, indent like top-point.
(org-list-set-ind item struct top-ind))))))
- (mapc new-ind (mapcar 'car (cdr struct)))))
+ (mapc new-ind (mapcar #'car (cdr struct)))))
(defun org-list-struct-fix-box (struct parents prevs &optional ordered)
"Verify and correct checkboxes in STRUCT.
@@ -1771,7 +1770,7 @@ break this rule, the function will return the blocking item. In
all others cases, the return value will be nil.
This function modifies STRUCT."
- (let ((all-items (mapcar 'car struct))
+ (let ((all-items (mapcar #'car struct))
(set-parent-box
(function
(lambda (item)
@@ -1942,8 +1941,8 @@ Initial position of cursor is restored after the changes."
;; same amount of indentation. Each slice follow the pattern
;; (END BEG DELTA MAX-IND-OR-NIL). Slices are returned in
;; reverse order.
- (setq all-ends (sort (append (mapcar 'car itm-shift)
- (org-uniquify (mapcar 'car end-list)))
+ (setq all-ends (sort (append (mapcar #'car itm-shift)
+ (org-uniquify (mapcar #'car end-list)))
'<))
(while (cdr all-ends)
(let* ((up (pop all-ends))
@@ -2327,7 +2326,7 @@ in subtree, ignoring drawers."
lim-up
lim-down
(drawer-re (concat "^[ \t]*:\\("
- (mapconcat 'regexp-quote org-drawers "\\|")
+ (mapconcat #'regexp-quote org-drawers "\\|")
"\\):[ \t]*$"))
(keyword-re (concat "^[ \t]*\\<\\(" org-scheduled-string
"\\|" org-deadline-string
@@ -2335,7 +2334,7 @@ in subtree, ignoring drawers."
"\\|" org-clock-string "\\)"
" *[[<]\\([^]>]+\\)[]>]"))
(orderedp (org-entry-get nil "ORDERED"))
- (bounds
+ (_bounds
;; In a region, start at first item in region.
(cond
((org-region-active-p)
@@ -2391,7 +2390,7 @@ in subtree, ignoring drawers."
(bottom (copy-marker (org-list-get-bottom-point struct)))
(items-to-toggle (org-remove-if
(lambda (e) (or (< e lim-up) (> e lim-down)))
- (mapcar 'car struct))))
+ (mapcar #'car struct))))
(mapc (lambda (e) (org-list-set-checkbox
e struct
;; If there is no box at item, leave as-is
@@ -2473,7 +2472,7 @@ With optional prefix argument ALL, do this for the whole buffer."
(items
(cond
((and recursivep item) (org-list-get-subtree item s))
- (recursivep (mapcar 'car s))
+ (recursivep (mapcar #'car s))
(item (org-list-get-children item s par))
(t (org-list-get-all-items
(org-list-get-top-point s) s pre))))
@@ -2486,7 +2485,7 @@ With optional prefix argument ALL, do this for the whole buffer."
structs)
(cons c-on c-all)))))
(backup-end 1)
- cookies-list structs-bak box-num)
+ cookies-list structs-bak)
(goto-char (car bounds))
;; 1. Build an alist for each cookie found within BOUNDS. The
;; key will be position at beginning of cookie and values
@@ -2749,6 +2748,7 @@ If a region is active, all items inside will be moved."
(t (error "Not at an item")))))
(defvar org-tab-ind-state)
+(defvar org-adapt-indentation)
(defun org-cycle-item-indentation ()
"Cycle levels of indentation of an empty item.
The first run indents the item, if applicable. Subsequent runs
@@ -2940,13 +2940,13 @@ will be parsed as:
\(3 \"last item\"\)\)
Point is left at list end."
+ (defvar parse-item) ;FIXME: Or use `cl-labels' or `letrec'.
(let* ((struct (org-list-struct))
(prevs (org-list-prevs-alist struct))
(parents (org-list-parents-alist struct))
(top (org-list-get-top-point struct))
(bottom (org-list-get-bottom-point struct))
out
- parse-item ; for byte-compiler
(get-text
(function
;; Return text between BEG and END, trimmed, with
@@ -3072,7 +3072,7 @@ for this list."
(re-search-forward (org-item-beginning-re) bottom-point t)
(match-beginning 0)))
(plain-list (buffer-substring-no-properties top-point bottom-point))
- beg txt)
+ beg)
(unless (fboundp transform)
(error "No such transformation function %s" transform))
(let ((txt (funcall transform plain-list)))
@@ -3082,7 +3082,8 @@ for this list."
(unless (re-search-forward
(concat "BEGIN RECEIVE ORGLST +"
name
- "\\([ \t]\\|$\\)") nil t)
+ "\\([ \t]\\|$\\)")
+ nil t)
(error "Don't know where to insert translated list"))
(goto-char (match-beginning 0))
(beginning-of-line 2)
@@ -3230,7 +3231,7 @@ items."
items (or (eval isep) ""))))))))
(concat (funcall export-sublist list 0) "\n")))
-(defun org-list-to-latex (list &optional params)
+(defun org-list-to-latex (list &optional _params)
"Convert LIST into a LaTeX list.
LIST is as string representing the list to transform, as Org
syntax. Return converted list as a string."
@@ -3244,7 +3245,7 @@ syntax. Return converted list as a string."
(require 'ox-html)
(org-export-string-as list 'html t))
-(defun org-list-to-texinfo (list &optional params)
+(defun org-list-to-texinfo (list &optional _params)
"Convert LIST into a Texinfo list.
LIST is as string representing the list to transform, as Org
syntax. Return converted list as a string."
@@ -3255,14 +3256,15 @@ syntax. Return converted list as a string."
"Convert LIST into an Org subtree.
LIST is as returned by `org-list-parse-list'. PARAMS is a property list
with overruling parameters for `org-list-to-generic'."
+ (defvar get-stars) (defvar org--blankp)
(let* ((rule (cdr (assq 'heading org-blank-before-new-entry)))
(level (org-reduced-level (or (org-current-level) 0)))
- (blankp (or (eq rule t)
+ (org--blankp (or (eq rule t)
(and (eq rule 'auto)
(save-excursion
(outline-previous-heading)
(org-previous-line-empty-p)))))
- (get-stars
+ (get-stars ;FIXME: Can't rename without renaming it in org.el as well!
(function
;; Return the string for the heading, depending on depth D
;; of current sub-list.
@@ -3277,12 +3279,12 @@ with overruling parameters for `org-list-to-generic'."
list
(org-combine-plists
'(:splice t
- :dtstart " " :dtend " "
- :istart (funcall get-stars depth)
- :icount (funcall get-stars depth)
- :isep (if blankp "\n\n" "\n")
- :csep (if blankp "\n\n" "\n")
- :cbon "DONE" :cboff "TODO" :cbtrans "TODO")
+ :dtstart " " :dtend " "
+ :istart (funcall get-stars depth)
+ :icount (funcall get-stars depth)
+ :isep (if org--blankp "\n\n" "\n")
+ :csep (if org--blankp "\n\n" "\n")
+ :cbon "DONE" :cboff "TODO" :cbtrans "TODO")
params))))
(provide 'org-list)
diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el
index 23c30178080..db09909f404 100644
--- a/lisp/org/org-macs.el
+++ b/lisp/org/org-macs.el
@@ -33,7 +33,7 @@
(eval-and-compile
(unless (fboundp 'declare-function)
- (defmacro declare-function (fn file &optional arglist fileonly)
+ (defmacro declare-function (fn file &optional _arglist _fileonly)
`(autoload ',fn ,file)))
(if (>= emacs-major-version 23)
@@ -48,13 +48,14 @@
(declare-function org-string-match-p "org-compat" (&rest args))
(defmacro org-with-gensyms (symbols &rest body)
+ (declare (debug (sexp body)) (indent 1))
`(let ,(mapcar (lambda (s)
- `(,s (make-symbol (concat "--" (symbol-name ',s))))) symbols)
+ `(,s (make-symbol (concat "--" (symbol-name ',s)))))
+ symbols)
,@body))
-(def-edebug-spec org-with-gensyms (sexp body))
-(put 'org-with-gensyms 'lisp-indent-function 1)
(defmacro org-called-interactively-p (&optional kind)
+ (declare (debug (&optional ("quote" symbolp)))) ;Why not just `t'?
(if (featurep 'xemacs)
`(interactive-p)
(if (or (> emacs-major-version 23)
@@ -63,12 +64,11 @@
;; defined with no argument in <=23.1
`(with-no-warnings (called-interactively-p ,kind))
`(interactive-p))))
-(def-edebug-spec org-called-interactively-p (&optional ("quote" symbolp)))
(defmacro org-bound-and-true-p (var)
"Return the value of symbol VAR if it is bound, else nil."
+ (declare (debug (symbolp)))
`(and (boundp (quote ,var)) ,var))
-(def-edebug-spec org-bound-and-true-p (symbolp))
(defun org-string-nw-p (s)
"Is S a string with a non-white character?"
@@ -97,10 +97,11 @@ Otherwise return nil."
(defmacro org-re (s)
"Replace posix classes in regular expression."
+ (declare (debug (form)))
(if (featurep 'xemacs) `(org-substitute-posix-classes ,s) s))
-(def-edebug-spec org-re (form))
(defmacro org-preserve-lc (&rest body)
+ (declare (debug (body)))
(org-with-gensyms (line col)
`(let ((,line (org-current-line))
(,col (current-column)))
@@ -108,12 +109,12 @@ Otherwise return nil."
(progn ,@body)
(org-goto-line ,line)
(org-move-to-column ,col)))))
-(def-edebug-spec org-preserve-lc (body))
;; Use `org-with-silent-modifications' to ignore cosmetic changes and
;; `org-unmodified' to ignore real text modifications
(defmacro org-unmodified (&rest body)
"Run BODY while preserving the buffer's `buffer-modified-p' state."
+ (declare (debug (body)))
(org-with-gensyms (was-modified)
`(let ((,was-modified (buffer-modified-p)))
(unwind-protect
@@ -121,9 +122,9 @@ Otherwise return nil."
(inhibit-modification-hooks t))
,@body)
(set-buffer-modified-p ,was-modified)))))
-(def-edebug-spec org-unmodified (body))
(defmacro org-without-partial-completion (&rest body)
+ (declare (debug (body)))
`(if (and (boundp 'partial-completion-mode)
partial-completion-mode
(fboundp 'partial-completion-mode))
@@ -133,7 +134,6 @@ Otherwise return nil."
,@body)
(partial-completion-mode 1))
,@body))
-(def-edebug-spec org-without-partial-completion (body))
;; FIXME: Slated for removal. Current Org mode does not support Emacs < 22
(defmacro org-maybe-intangible (props)
@@ -150,6 +150,7 @@ We use a macro so that the test can happen at compilation time."
(defmacro org-with-point-at (pom &rest body)
"Move to buffer and point of point-or-marker POM for the duration of BODY."
+ (declare (debug (form body)) (indent 1))
(org-with-gensyms (mpom)
`(let ((,mpom ,pom))
(save-excursion
@@ -157,15 +158,14 @@ We use a macro so that the test can happen at compilation time."
(org-with-wide-buffer
(goto-char (or ,mpom (point)))
,@body)))))
-(def-edebug-spec org-with-point-at (form body))
-(put 'org-with-point-at 'lisp-indent-function 1)
(defmacro org-no-warnings (&rest body)
+ (declare (debug (body)))
(cons (if (fboundp 'with-no-warnings) 'with-no-warnings 'progn) body))
-(def-edebug-spec org-no-warnings (body))
(defmacro org-with-remote-undo (buffer &rest body)
"Execute BODY while recording undo information in two buffers."
+ (declare (debug (form body)) (indent 1))
(org-with-gensyms (cline cmd buf1 buf2 undo1 undo2 c1 c2)
`(let ((,cline (org-current-line))
(,cmd this-command)
@@ -187,13 +187,11 @@ We use a macro so that the test can happen at compilation time."
;; remember which buffer to undo
(push (list ,cmd ,cline ,buf1 ,c1 ,buf2 ,c2)
org-agenda-undo-list))))))
-(def-edebug-spec org-with-remote-undo (form body))
-(put 'org-with-remote-undo 'lisp-indent-function 1)
(defmacro org-no-read-only (&rest body)
"Inhibit read-only for BODY."
+ (declare (debug (body)))
`(let ((inhibit-read-only t)) ,@body))
-(def-edebug-spec org-no-read-only (body))
(defconst org-rm-props '(invisible t face t keymap t intangible t mouse-face t
rear-nonsticky t mouse-map t fontified t
@@ -313,7 +311,7 @@ This means that the buffer may change while running BODY,
but it also means that the buffer should stay alive
during the operation, because otherwise all these markers will
point nowhere."
- (declare (indent 1))
+ (declare (debug (form body)) (indent 1))
(org-with-gensyms (data rtn)
`(let ((,data (org-outline-overlay-data ,use-markers))
,rtn)
@@ -327,24 +325,28 @@ point nowhere."
(and (markerp (cdr c)) (move-marker (cdr c) nil)))
,data)))
,rtn)))
-(def-edebug-spec org-save-outline-visibility (form body))
(defmacro org-with-wide-buffer (&rest body)
"Execute body while temporarily widening the buffer."
+ (declare (debug (body)))
`(save-excursion
(save-restriction
(widen)
,@body)))
-(def-edebug-spec org-with-wide-buffer (body))
(defmacro org-with-limited-levels (&rest body)
"Execute BODY with limited number of outline levels."
- `(let* ((org-called-with-limited-levels t)
- (org-outline-regexp (org-get-limited-outline-regexp))
- (outline-regexp org-outline-regexp)
- (org-outline-regexp-bol (concat "^" org-outline-regexp)))
- ,@body))
-(def-edebug-spec org-with-limited-levels (body))
+ (declare (debug (body)))
+ `(progn
+ (defvar org-called-with-limited-levels)
+ (defvar org-outline-regexp)
+ (defvar outline-regexp)
+ (defvar org-outline-regexp-bol)
+ (let* ((org-called-with-limited-levels t)
+ (org-outline-regexp (org-get-limited-outline-regexp))
+ (outline-regexp org-outline-regexp)
+ (org-outline-regexp-bol (concat "^" org-outline-regexp)))
+ ,@body)))
(defvar org-outline-regexp) ; defined in org.el
(defvar org-odd-levels-only) ; defined in org.el
@@ -365,9 +367,8 @@ The number of levels is controlled by `org-inlinetask-min-level'"
(format-time-string string (seconds-to-time seconds))))
(defmacro org-eval-in-environment (environment form)
+ (declare (debug (form form)) (indent 1))
`(eval (list 'let ,environment ',form)))
-(def-edebug-spec org-eval-in-environment (form form))
-(put 'org-eval-in-environment 'lisp-indent-function 1)
(defun org-make-parameter-alist (flat)
"Return alist based on FLAT.
diff --git a/lisp/org/ox-ascii.el b/lisp/org/ox-ascii.el
index 65b6f7528dd..a3284d9b905 100644
--- a/lisp/org/ox-ascii.el
+++ b/lisp/org/ox-ascii.el
@@ -1965,7 +1965,7 @@ Return output file name."
;; Local variables:
;; generated-autoload-file: "org-loaddefs.el"
-;; coding: utf-8-emacs
+;; coding: utf-8
;; End:
;;; ox-ascii.el ends here
diff --git a/lisp/play/dunnet.el b/lisp/play/dunnet.el
index 2f4536c0820..877e5dbea88 100644
--- a/lisp/play/dunnet.el
+++ b/lisp/play/dunnet.el
@@ -3099,7 +3099,7 @@ File not found")))
(defun dun-dos-boot-msg ()
(sleep-for 3)
(dun-mprinc "Current time is ")
- (dun-mprincl (substring (current-time-string) 12 20))
+ (dun-mprincl (format-time-string "%H:%M:%S"))
(dun-mprinc "Enter new time: ")
(dun-read-line)
(if (not dun-batch-mode)
diff --git a/lisp/play/gametree.el b/lisp/play/gametree.el
index ef55015a999..2c68c40d893 100644
--- a/lisp/play/gametree.el
+++ b/lisp/play/gametree.el
@@ -248,8 +248,8 @@ This value is simply the outline heading level of the current line."
;;;; outline layout
(defsubst gametree-show-children-and-entry ()
- (show-children)
- (show-entry))
+ (outline-show-children)
+ (outline-show-entry))
(defun gametree-entry-shown-p ()
(save-excursion
@@ -307,7 +307,7 @@ This value is simply the outline heading level of the current line."
(if (not first-time)
(outline-next-visible-heading 1))
(setq first-time nil)
- (hide-subtree)
+ (outline-hide-subtree)
(if (nth 0 layout)
(funcall (nth 0 layout)))
(if (not (and (nth 1 layout) (listp (nth 1 layout))))
@@ -393,7 +393,7 @@ depth AT-DEPTH or smaller is found."
(outline-up-heading 1)))
(beginning-of-line 1)
(let ((parent-depth (gametree-current-branch-depth)))
- (show-entry)
+ (outline-show-entry)
(condition-case nil
(outline-next-visible-heading 1)
(error
@@ -601,11 +601,11 @@ shogi, etc.) players, it is a slightly modified version of Outline mode.
(defun gametree-mouse-show-subtree (event)
(interactive "e")
(mouse-set-point event)
- (show-subtree))
+ (outline-show-subtree))
(defun gametree-mouse-hide-subtree (event)
(interactive "e")
(mouse-set-point event)
- (hide-subtree))
+ (outline-hide-subtree))
(define-key gametree-mode-map [M-down-mouse-2 M-mouse-2]
'gametree-mouse-break-line-here)
(define-key gametree-mode-map [S-down-mouse-1 S-mouse-1]
diff --git a/lisp/progmodes/cc-awk.el b/lisp/progmodes/cc-awk.el
index 1ef80c801ee..ad0248561a8 100644
--- a/lisp/progmodes/cc-awk.el
+++ b/lisp/progmodes/cc-awk.el
@@ -61,6 +61,7 @@
(cc-bytecomp-defun c-backward-token-1)
(cc-bytecomp-defun c-beginning-of-statement-1)
(cc-bytecomp-defun c-backward-sws)
+(cc-bytecomp-defun c-forward-sws)
(defvar awk-mode-syntax-table
(let ((st (make-syntax-table)))
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 68075f356ab..94dc34bb20e 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -1317,6 +1317,9 @@ keyword on the line, the keyword is not inserted inside a literal, and
(autoload 'c-subword-mode "cc-subword"
"Mode enabling subword movement and editing keys." t)))
+(declare-function c-forward-subword "ext:cc-subword" (&optional arg))
+(declare-function c-backward-subword "ext:cc-subword" (&optional arg))
+
;; "nomenclature" functions + c-scope-operator.
(defun c-forward-into-nomenclature (&optional arg)
"Compatibility alias for `c-forward-subword'."
diff --git a/lisp/progmodes/cmacexp.el b/lisp/progmodes/cmacexp.el
index 357625d10cf..19d0473c42d 100644
--- a/lisp/progmodes/cmacexp.el
+++ b/lisp/progmodes/cmacexp.el
@@ -364,8 +364,8 @@ Optional arg DISPLAY non-nil means show messages in the echo area."
;; Find and delete the mark of the start of the expansion.
;; Look for `# nn "file.c"' lines and delete them.
(goto-char (point-min))
- (search-forward startmarker)
- (delete-region 1 (point)))
+ (if (search-forward startmarker nil t)
+ (delete-region 1 (point))))
(while (re-search-forward (concat "^# [0-9]+ \""
(regexp-quote filename)
"\"") nil t)
diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el
index ad35c48a101..e06b920e5d7 100644
--- a/lisp/progmodes/elisp-mode.el
+++ b/lisp/progmodes/elisp-mode.el
@@ -30,7 +30,6 @@
(require 'lisp-mode)
-(defvar emacs-lisp-mode-abbrev-table nil)
(define-abbrev-table 'emacs-lisp-mode-abbrev-table ()
"Abbrev table for Emacs Lisp mode.
It has `lisp-mode-abbrev-table' as its parent."
@@ -476,11 +475,12 @@ It can be quoted, or be inside a quoted form."
(point)))
(scan-error pos))))
;; t if in function position.
- (funpos (eq (char-before beg) ?\()))
+ (funpos (eq (char-before beg) ?\())
+ (quoted (elisp--form-quoted-p beg)))
(when (and end (or (not (nth 8 (syntax-ppss)))
(eq (char-before beg) ?`)))
(let ((table-etc
- (if (not funpos)
+ (if (or (not funpos) quoted)
;; FIXME: We could look at the first element of the list and
;; use it to provide a more specific completion table in some
;; cases. E.g. filter out keywords that are not understood by
@@ -492,7 +492,7 @@ It can be quoted, or be inside a quoted form."
:company-doc-buffer #'elisp--company-doc-buffer
:company-docsig #'elisp--company-doc-string
:company-location #'elisp--company-location))
- ((elisp--form-quoted-p beg)
+ (quoted
(list nil obarray
;; Don't include all symbols (bug#16646).
:predicate (lambda (sym)
@@ -544,10 +544,11 @@ It can be quoted, or be inside a quoted form."
(< (point) beg)))))
(list t obarray
:predicate (lambda (sym) (get sym 'error-conditions))))
- ((and ?\(
+ ((and (or ?\( `let `let*)
(guard (save-excursion
(goto-char (1- beg))
- (up-list -1)
+ (when (eq parent ?\()
+ (up-list -1))
(forward-symbol -1)
(looking-at "\\_<let\\*?\\_>"))))
(list t obarray
@@ -580,6 +581,7 @@ It can be quoted, or be inside a quoted form."
(declare-function xref-make-elisp-location "xref" (symbol type file))
(declare-function xref-make-bogus-location "xref" (message))
(declare-function xref-make "xref" (description location))
+(declare-function xref-collect-matches "xref" (input dir &optional kind))
(defun elisp-xref-find (action id)
(require 'find-func)
@@ -588,6 +590,10 @@ It can be quoted, or be inside a quoted form."
(let ((sym (intern-soft id)))
(when sym
(elisp--xref-find-definitions sym))))
+ (`references
+ (elisp--xref-find-matches id 'symbol))
+ (`matches
+ (elisp--xref-find-matches id 'regexp))
(`apropos
(elisp--xref-find-apropos id))))
@@ -600,12 +606,16 @@ It can be quoted, or be inside a quoted form."
(setq sym (car fun-lib))
(cdr fun-lib))))
(`defvar (and (boundp sym)
- ;; Don't show minor modes twice.
- ;; TODO: If TYPE ever becomes dependent on the
- ;; context, move this check outside.
- (not (fboundp sym))
- (or (symbol-file sym 'defvar)
- (help-C-file-name sym 'var))))
+ (let ((el-file (symbol-file sym 'defvar)))
+ (if el-file
+ (and
+ ;; Don't show minor modes twice.
+ ;; TODO: If TYPE ever becomes dependent on the
+ ;; context, move this check outside.
+ (not (and (fboundp sym)
+ (memq sym minor-mode-list)))
+ el-file)
+ (help-C-file-name sym 'var)))))
(`feature (and (featurep sym)
;; Skip when a function with the same name
;; is defined, because it's probably in the
@@ -620,6 +630,12 @@ It can be quoted, or be inside a quoted form."
(setq file (substring file 0 -1)))
(xref-make-elisp-location sym type file))))
+(defvar elisp--xref-format
+ (let ((str "(%s %s)"))
+ (put-text-property 1 3 'face 'font-lock-keyword-face str)
+ (put-text-property 4 6 'face 'font-lock-function-name-face str)
+ str))
+
(defun elisp--xref-find-definitions (symbol)
(save-excursion
(let (lst)
@@ -631,11 +647,35 @@ It can be quoted, or be inside a quoted form."
(xref-make-bogus-location (error-message-string err))))))
(when loc
(push
- (xref-make (format "(%s %s)" type symbol)
+ (xref-make (format elisp--xref-format type symbol)
loc)
lst))))
lst)))
+(defvar package-user-dir)
+
+(defun elisp--xref-find-matches (symbol kind)
+ (let* ((dirs (sort
+ (mapcar
+ (lambda (dir)
+ (file-name-as-directory (expand-file-name dir)))
+ ;; It's one level above a number of `load-path'
+ ;; elements (one for each installed package).
+ ;; Save us some process calls.
+ (cons package-user-dir load-path))
+ #'string<))
+ (ref dirs))
+ ;; Delete subdirectories from the list.
+ (while (cdr ref)
+ (if (string-prefix-p (car ref) (cadr ref))
+ (setcdr ref (cddr ref))
+ (setq ref (cdr ref))))
+ (cl-mapcan
+ (lambda (dir)
+ (and (file-exists-p dir)
+ (xref-collect-matches symbol dir kind)))
+ dirs)))
+
(defun elisp--xref-find-apropos (regexp)
(apply #'nconc
(let (lst)
@@ -1141,13 +1181,13 @@ which see."
(cond ((null current-fnsym)
nil)
((eq current-symbol (car current-fnsym))
- (or (apply #'elisp--get-fnsym-args-string current-fnsym)
- (elisp--get-var-docstring current-symbol)))
+ (or (apply #'elisp-get-fnsym-args-string current-fnsym)
+ (elisp-get-var-docstring current-symbol)))
(t
- (or (elisp--get-var-docstring current-symbol)
- (apply #'elisp--get-fnsym-args-string current-fnsym))))))
+ (or (elisp-get-var-docstring current-symbol)
+ (apply #'elisp-get-fnsym-args-string current-fnsym))))))
-(defun elisp--get-fnsym-args-string (sym &optional index)
+(defun elisp-get-fnsym-args-string (sym &optional index prefix)
"Return a string containing the parameter list of the function SYM.
If SYM is a subr and no arglist is obtainable from the docstring
or elsewhere, return a 1-line docstring."
@@ -1164,20 +1204,29 @@ or elsewhere, return a 1-line docstring."
(args
(cond
((listp advertised) advertised)
- ((setq doc (help-split-fundoc (documentation sym t) sym))
+ ((setq doc (help-split-fundoc
+ (condition-case nil (documentation sym t)
+ (invalid-function nil))
+ sym))
(car doc))
(t (help-function-arglist sym)))))
;; Stringify, and store before highlighting, downcasing, etc.
- ;; FIXME should truncate before storing.
- (elisp--last-data-store sym (elisp--function-argstring args)
+ (elisp--last-data-store sym (elisp-function-argstring args)
'function))))))
;; Highlight, truncate.
(if argstring
- (elisp--highlight-function-argument sym argstring index))))
-
-(defun elisp--highlight-function-argument (sym args index)
+ (elisp--highlight-function-argument
+ sym argstring index
+ (or prefix
+ (concat (propertize (symbol-name sym) 'face
+ (if (functionp sym)
+ 'font-lock-function-name-face
+ 'font-lock-keyword-face))
+ ": "))))))
+
+(defun elisp--highlight-function-argument (sym args index prefix)
"Highlight argument INDEX in ARGS list for function SYM.
-In the absence of INDEX, just call `elisp--docstring-format-sym-doc'."
+In the absence of INDEX, just call `eldoc-docstring-format-sym-doc'."
;; FIXME: This should probably work on the list representation of `args'
;; rather than its string representation.
;; FIXME: This function is much too long, we need to split it up!
@@ -1262,9 +1311,9 @@ In the absence of INDEX, just call `elisp--docstring-format-sym-doc'."
((string= argument "&allow-other-keys")) ; Skip.
;; Back to index 0 in ARG1 ARG2 ARG2 ARG3 etc...
;; like in `setq'.
- ((or (and (string-match-p "\\.\\.\\.$" argument)
+ ((or (and (string-match-p "\\.\\.\\.\\'" argument)
(string= argument (car (last args-lst))))
- (and (string-match-p "\\.\\.\\.$"
+ (and (string-match-p "\\.\\.\\.\\'"
(substring args 1 (1- (length args))))
(= (length (remove "..." args-lst)) 2)
(> index 1) (eq (logand index 1) 1)))
@@ -1279,14 +1328,12 @@ In the absence of INDEX, just call `elisp--docstring-format-sym-doc'."
(when start
(setq doc (copy-sequence args))
(add-text-properties start end (list 'face argument-face) doc))
- (setq doc (elisp--docstring-format-sym-doc
- sym doc (if (functionp sym) 'font-lock-function-name-face
- 'font-lock-keyword-face)))
+ (setq doc (eldoc-docstring-format-sym-doc prefix doc))
doc)))
;; Return a string containing a brief (one-line) documentation string for
;; the variable.
-(defun elisp--get-var-docstring (sym)
+(defun elisp-get-var-docstring (sym)
(cond ((not sym) nil)
((and (eq sym (aref elisp--eldoc-last-data 0))
(eq 'variable (aref elisp--eldoc-last-data 2)))
@@ -1294,7 +1341,7 @@ In the absence of INDEX, just call `elisp--docstring-format-sym-doc'."
(t
(let ((doc (documentation-property sym 'variable-documentation t)))
(when doc
- (let ((doc (elisp--docstring-format-sym-doc
+ (let ((doc (eldoc-docstring-format-sym-doc
sym (elisp--docstring-first-line doc)
'font-lock-variable-name-face)))
(elisp--last-data-store sym doc 'variable)))))))
@@ -1318,36 +1365,6 @@ In the absence of INDEX, just call `elisp--docstring-format-sym-doc'."
(substring doc start (match-beginning 0)))
((zerop start) doc)
(t (substring doc start))))))))
-
-(defvar eldoc-echo-area-use-multiline-p)
-
-;; If the entire line cannot fit in the echo area, the symbol name may be
-;; truncated or eliminated entirely from the output to make room for the
-;; description.
-(defun elisp--docstring-format-sym-doc (sym doc face)
- (save-match-data
- (let* ((name (symbol-name sym))
- (ea-multi eldoc-echo-area-use-multiline-p)
- ;; Subtract 1 from window width since emacs will not write
- ;; any chars to the last column, or in later versions, will
- ;; cause a wraparound and resize of the echo area.
- (ea-width (1- (window-width (minibuffer-window))))
- (strip (- (+ (length name) (length ": ") (length doc)) ea-width)))
- (cond ((or (<= strip 0)
- (eq ea-multi t)
- (and ea-multi (> (length doc) ea-width)))
- (format "%s: %s" (propertize name 'face face) doc))
- ((> (length doc) ea-width)
- (substring (format "%s" doc) 0 ea-width))
- ((>= strip (length name))
- (format "%s" doc))
- (t
- ;; Show the end of the partial symbol name, rather
- ;; than the beginning, since the former is more likely
- ;; to be unique given package namespace conventions.
- (setq name (substring name strip))
- (format "%s: %s" (propertize name 'face face) doc))))))
-
;; Return a list of current function name and argument index.
(defun elisp--fnsym-in-current-sexp ()
@@ -1392,7 +1409,7 @@ In the absence of INDEX, just call `elisp--docstring-format-sym-doc'."
(memq (char-syntax c) '(?w ?_))
(intern-soft (current-word)))))
-(defun elisp--function-argstring (arglist)
+(defun elisp-function-argstring (arglist)
"Return ARGLIST as a string enclosed by ().
ARGLIST is either a string, or a list of strings or symbols."
(let ((str (cond ((stringp arglist) arglist)
diff --git a/lisp/progmodes/etags.el b/lisp/progmodes/etags.el
index b470352f8dc..7a87377503d 100644
--- a/lisp/progmodes/etags.el
+++ b/lisp/progmodes/etags.el
@@ -947,6 +947,7 @@ onto a ring and may be popped back to with \\[pop-tag-mark].
Contrast this with the ring of marks gone to by the command.
See documentation of variable `tags-file-name'."
+ (declare (obsolete xref-find-definitions "25.1"))
(interactive (find-tag-interactive "Find tag: "))
(let* ((buf (find-tag-noselect tagname next-p regexp-p))
(pos (with-current-buffer buf (point))))
@@ -2073,12 +2074,28 @@ for \\[find-tag] (which see)."
;; we hit the limit rarely.
(defconst etags--xref-limit 1000)
+(defvar etags-xref-find-definitions-tag-order '(tag-exact-match-p
+ tag-implicit-name-match-p)
+ "Tag order used in `etags-xref-find' to look for definitions.")
+
;;;###autoload
(defun etags-xref-find (action id)
(pcase action
(`definitions (etags--xref-find-definitions id))
+ (`references (etags--xref-find-matches id 'symbol))
+ (`matches (etags--xref-find-matches id 'regexp))
(`apropos (etags--xref-find-definitions id t))))
+(defun etags--xref-find-matches (input kind)
+ (let ((dirs (if tags-table-list
+ (mapcar #'file-name-directory tags-table-list)
+ ;; If no tags files are loaded, prompt for the dir.
+ (list (read-directory-name "In directory: " nil nil t)))))
+ (cl-mapcan
+ (lambda (dir)
+ (xref-collect-matches input dir kind))
+ dirs)))
+
(defun etags--xref-find-definitions (pattern &optional regexp?)
;; This emulates the behaviour of `find-tag-in-order' but instead of
;; returning one match at a time all matches are returned as list.
@@ -2094,7 +2111,7 @@ for \\[find-tag] (which see)."
(while (visit-tags-table-buffer (not first-time))
(setq first-time nil)
(dolist (order-fun (cond (regexp? find-tag-regexp-tag-order)
- (t find-tag-tag-order)))
+ (t etags-xref-find-definitions-tag-order)))
(goto-char (point-min))
(while (and (funcall search-fun pattern nil t)
(< (hash-table-count marks) etags--xref-limit))
@@ -2129,6 +2146,10 @@ for \\[find-tag] (which see)."
(etags-goto-tag-location tag-info)
(point-marker)))))
+(cl-defmethod xref-location-line ((l xref-etags-location))
+ (with-slots (tag-info) l
+ (nth 1 tag-info)))
+
(provide 'etags)
diff --git a/lisp/progmodes/idlw-shell.el b/lisp/progmodes/idlw-shell.el
index 40c40eef302..02a8ec8a560 100644
--- a/lisp/progmodes/idlw-shell.el
+++ b/lisp/progmodes/idlw-shell.el
@@ -1445,12 +1445,8 @@ Otherwise just move the line. Move down unless UP is non-nil."
(interactive "p")
(idlwave-shell-move-or-history nil arg))
-;; Newer versions of comint.el changed the name of comint-filter to
-;; comint-output-filter.
-(defalias 'idlwave-shell-comint-filter
- (if (fboundp 'comint-output-filter)
- #'comint-output-filter
- #'comint-filter))
+(define-obsolete-function-alias 'idlwave-shell-comint-filter
+ 'comint-output-filter "25.1")
(defun idlwave-shell-is-running ()
"Return t if the shell process is running."
@@ -1496,7 +1492,7 @@ and then calls `idlwave-shell-send-command' for any pending commands."
(get-buffer-create idlwave-shell-hidden-output-buffer))
(goto-char (point-max))
(insert string))
- (idlwave-shell-comint-filter proc string))
+ (comint-output-filter proc string))
;; Watch for magic - need to accumulate the current line
;; since it may not be sent all at once.
(if (string-match "\n" string)
@@ -1552,7 +1548,7 @@ and then calls `idlwave-shell-send-command' for any pending commands."
(if idlwave-shell-hide-output
(if (and idlwave-shell-show-if-error
(eq idlwave-shell-current-state 'error))
- (idlwave-shell-comint-filter proc full-output)
+ (comint-output-filter proc full-output)
;; If it's only *mostly* hidden, filter % lines,
;; and show anything that remains
(if (eq idlwave-shell-hide-output 'mostly)
@@ -1560,7 +1556,7 @@ and then calls `idlwave-shell-send-command' for any pending commands."
(idlwave-shell-filter-hidden-output
full-output)))
(if filtered
- (idlwave-shell-comint-filter
+ (comint-output-filter
proc filtered))))))
;; Call the post-command hook
diff --git a/lisp/progmodes/js.el b/lisp/progmodes/js.el
index 62f19f42df1..f06c5c75b1a 100644
--- a/lisp/progmodes/js.el
+++ b/lisp/progmodes/js.el
@@ -2852,10 +2852,6 @@ with `js--js-encode-value'."
(defsubst js--js-true (value)
(not (js--js-not value)))
-;; The somewhat complex code layout confuses the byte-compiler into
-;; thinking this function "might not be defined at runtime".
-(declare-function js--optimize-arglist "js" (arglist))
-
(eval-and-compile
(defun js--optimize-arglist (arglist)
"Convert immediate js< and js! references to deferred ones."
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index eb17d075921..4b0a028faa3 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -2268,7 +2268,8 @@ banner and the initial prompt are received separately."
(while t
(when (not (accept-process-output process timeout))
(throw 'found nil))
- (when (looking-back regexp)
+ (when (looking-back
+ regexp (car (python-util-comint-last-prompt)))
(throw 'found t))))))
(defun python-shell-comint-end-of-output-p (output)
diff --git a/lisp/progmodes/tcl.el b/lisp/progmodes/tcl.el
index 8f7705ba17d..e4e96554c95 100644
--- a/lisp/progmodes/tcl.el
+++ b/lisp/progmodes/tcl.el
@@ -1028,7 +1028,8 @@ Returns nil if line starts inside a string, t if in a comment."
(with-current-buffer (process-buffer proc)
;; Delete prompt if requested.
(when (marker-buffer inferior-tcl-delete-prompt-marker)
- (delete-region (process-mark proc) inferior-tcl-delete-prompt-marker)
+ (let ((inhibit-read-only t))
+ (delete-region (process-mark proc) inferior-tcl-delete-prompt-marker))
(set-marker inferior-tcl-delete-prompt-marker nil))))
(comint-output-filter proc string))
diff --git a/lisp/progmodes/verilog-mode.el b/lisp/progmodes/verilog-mode.el
index 57206544b9b..a1ad49e9a2c 100644
--- a/lisp/progmodes/verilog-mode.el
+++ b/lisp/progmodes/verilog-mode.el
@@ -123,7 +123,7 @@
;;; Code:
;; This variable will always hold the version number of the mode
-(defconst verilog-mode-version "2015-02-20-0d6420b-vpo"
+(defconst verilog-mode-version "2015-05-14-6232468-vpo-GNU"
"Version of this Verilog mode.")
(defconst verilog-mode-release-emacs t
"If non-nil, this version of Verilog mode was released with Emacs itself.")
@@ -282,6 +282,50 @@ STRING should be given if the last search was by `string-match' on STRING."
;; Emacs.
(defalias 'verilog-regexp-opt 'regexp-opt)))
+;; emacs >=22 has looking-back, but older emacs and xemacs don't.
+;; This function is lifted directly from emacs's subr.el
+;; so that it can be used by xemacs.
+;; The idea for this was borrowed from org-mode via this link:
+;; https://lists.gnu.org/archive/html/emacs-orgmode/2009-12/msg00032.html
+(eval-and-compile
+ (cond
+ ((fboundp 'looking-back)
+ (defalias 'verilog-looking-back 'looking-back))
+ (t
+ (defun verilog-looking-back (regexp limit &optional greedy)
+ "Return non-nil if text before point matches regular expression REGEXP.
+Like `looking-at' except matches before point, and is slower.
+LIMIT if non-nil speeds up the search by specifying a minimum
+starting position, to avoid checking matches that would start
+before LIMIT.
+
+If GREEDY is non-nil, extend the match backwards as far as
+possible, stopping when a single additional previous character
+cannot be part of a match for REGEXP. When the match is
+extended, its starting position is allowed to occur before
+LIMIT.
+
+As a general recommendation, try to avoid using `looking-back'
+wherever possible, since it is slow."
+ (let ((start (point))
+ (pos
+ (save-excursion
+ (and (re-search-backward (concat "\\(?:" regexp "\\)\\=") limit t)
+ (point)))))
+ (if (and greedy pos)
+ (save-restriction
+ (narrow-to-region (point-min) start)
+ (while (and (> pos (point-min))
+ (save-excursion
+ (goto-char pos)
+ (backward-char 1)
+ (looking-at (concat "\\(?:" regexp "\\)\\'"))))
+ (setq pos (1- pos)))
+ (save-excursion
+ (goto-char pos)
+ (looking-at (concat "\\(?:" regexp "\\)\\'")))))
+ (not (null pos)))))))
+
(eval-and-compile
;; Both xemacs and emacs
(condition-case nil
@@ -662,9 +706,10 @@ to see the effect as font color choices are cached by Emacs."
(defcustom verilog-highlight-grouping-keywords nil
"Non-nil means highlight grouping keywords more dramatically.
-If false, these words are in the `font-lock-type-face'; if True then they are in
-`verilog-font-lock-ams-face'. Some find that special highlighting on these
-grouping constructs allow the structure of the code to be understood at a glance."
+If false, these words are in the `font-lock-type-face'; if True
+then they are in `verilog-font-lock-grouping-keywords-face'.
+Some find that special highlighting on these grouping constructs
+allow the structure of the code to be understood at a glance."
:group 'verilog-mode-indent
:type 'boolean)
(put 'verilog-highlight-grouping-keywords 'safe-local-variable 'verilog-booleanp)
@@ -1880,14 +1925,22 @@ find the errors."
(if (featurep 'xemacs) (add-hook 'compilation-mode-hook 'verilog-error-regexp-add-xemacs))
(if (featurep 'emacs) (add-hook 'compilation-mode-hook 'verilog-error-regexp-add-emacs))
-(defconst verilog-directive-re
+(defconst verilog-compiler-directives
(eval-when-compile
- (verilog-regexp-words
- '(
- "`case" "`default" "`define" "`else" "`elsif" "`endfor" "`endif"
- "`endprotect" "`endswitch" "`endwhile" "`for" "`format" "`if" "`ifdef"
- "`ifndef" "`include" "`let" "`protect" "`switch" "`timescale"
- "`time_scale" "`undef" "`while" ))))
+ '( ;; compiler directives, from IEEE 1800-2012 section 22.1
+ "`__FILE__" "`__LINE" "`begin_keywords" "`celldefine" "`default_nettype"
+ "`define" "`else" "`elsif" "`end_keywords" "`endcelldefine" "`endif"
+ "`ifdef" "`ifndef" "`include" "`line" "`nounconnected_drive" "`pragma"
+ "`resetall" "`timescale" "`unconnected_drive" "`undef" "`undefineall"
+ ;; compiler directives not covered by IEEE 1800
+ "`case" "`default" "`endfor" "`endprotect" "`endswitch" "`endwhile" "`for"
+ "`format" "`if" "`let" "`protect" "`switch" "`timescale" "`time_scale"
+ "`while"
+ ))
+ "List of Verilog compiler directives.")
+
+(defconst verilog-directive-re
+ (verilog-regexp-words verilog-compiler-directives))
(defconst verilog-directive-re-1
(concat "[ \t]*" verilog-directive-re))
@@ -2411,11 +2464,9 @@ find the errors."
"\\(\\<begin\\>\\)\\|" ; 1
"\\(\\<else\\>\\)\\|" ; 2
"\\(\\<end\\>\\s-+\\<else\\>\\)\\|" ; 3
- "\\(\\<always_comb\\>\\(\[ \t\]*@\\)?\\)\\|" ; 4
- "\\(\\<always_ff\\>\\(\[ \t\]*@\\)?\\)\\|" ; 5
- "\\(\\<always_latch\\>\\(\[ \t\]*@\\)?\\)\\|" ; 6
+ "\\(\\<always\\(?:_ff\\)?\\>\\(?:\[ \t\]*@\\)\\)\\|" ; 4 (matches always or always_ff w/ @...)
+ "\\(\\<always\\(?:_comb\\|_latch\\)?\\>\\)\\|" ; 5 (matches always, always_comb, always_latch w/o @...)
"\\(\\<fork\\>\\)\\|" ; 7
- "\\(\\<always\\>\\(\[ \t\]*@\\)?\\)\\|"
"\\(\\<if\\>\\)\\|"
verilog-property-re "\\|"
"\\(\\(" verilog-label-re "\\)?\\<assert\\>\\)\\|"
@@ -2581,10 +2632,10 @@ find the errors."
(defconst verilog-declaration-re
(concat "\\(" verilog-declaration-prefix-re "\\s-*\\)?" verilog-declaration-core-re))
(defconst verilog-range-re "\\(\\[[^]]*\\]\\s-*\\)+")
-(defconst verilog-optional-signed-re "\\s-*\\(signed\\)?")
+(defconst verilog-optional-signed-re "\\s-*\\(\\(un\\)?signed\\)?")
(defconst verilog-optional-signed-range-re
(concat
- "\\s-*\\(\\<\\(reg\\|wire\\)\\>\\s-*\\)?\\(\\<signed\\>\\s-*\\)?\\(" verilog-range-re "\\)?"))
+ "\\s-*\\(\\<\\(reg\\|wire\\)\\>\\s-*\\)?\\(\\<\\(un\\)?signed\\>\\s-*\\)?\\(" verilog-range-re "\\)?"))
(defconst verilog-macroexp-re "`\\sw+")
(defconst verilog-delay-re "#\\s-*\\(\\([0-9_]+\\('s?[hdxbo][0-9a-fA-F_xz]+\\)?\\)\\|\\(([^()]*)\\)\\|\\(\\sw+\\)\\)")
@@ -2799,17 +2850,23 @@ find the errors."
;; from http://www.emacswiki.org/emacs/MultilineRegexp
(concat "\\<\\(`define\\|`if\\)\\>" ;; directive
"\\s-+" ;; separator
- "\\(.*\\(?:\n.*\\)*?\\)" ;; definition: to tend of line, the maybe more lines (excludes any trailing \n)
+ "\\(?:.*?\\(?:\n.*\\)*?\\)" ;; definition: to end of line, then maybe more lines (excludes any trailing \n)
+ "\\(?:\n\\s-*\n\\|\\'\\)") ;; blank line or EOF
+ "\\)\\|\\(?:"
+ ;; `<macro>() : i.e. `uvm_info(a,b,c) or any other pre-defined macro
+ ;; Since parameters inside the macro can have parentheses, and
+ ;; the macro can span multiple lines, just look for the opening
+ ;; parentheses and then continue to the end of the first
+ ;; non-escaped EOL
+ (concat "\\<`\\w+\\>\\s-*("
+ "\\(?:.*?\\(?:\n.*\\)*?\\)" ;; definition: to end of line, then maybe more lines (excludes any trailing \n)
"\\(?:\n\\s-*\n\\|\\'\\)") ;; blank line or EOF
"\\)"
)))
(defconst verilog-keywords
- '( "`case" "`default" "`define" "`else" "`endfor" "`endif"
- "`endprotect" "`endswitch" "`endwhile" "`for" "`format" "`if" "`ifdef"
- "`ifndef" "`include" "`let" "`protect" "`switch" "`timescale"
- "`time_scale" "`undef" "`while"
-
+ (append verilog-compiler-directives
+ '(
"after" "alias" "always" "always_comb" "always_ff" "always_latch" "and"
"assert" "assign" "assume" "automatic" "before" "begin" "bind"
"bins" "binsof" "bit" "break" "buf" "bufif0" "bufif1" "byte"
@@ -2851,7 +2908,7 @@ find the errors."
"sync_reject_on" "unique0" "until" "until_with" "untyped" "weak"
;; 1800-2012
"implements" "interconnect" "nettype" "soft"
- )
+ ))
"List of Verilog keywords.")
(defconst verilog-comment-start-regexp "//\\|/\\*"
@@ -2955,10 +3012,10 @@ See also `verilog-font-lock-extra-types'.")
(defface verilog-font-lock-grouping-keywords-face
'((((class color)
(background light))
- (:foreground "red4" :bold t ))
+ (:foreground "Purple" :bold t ))
(((class color)
(background dark))
- (:foreground "red4" :bold t ))
+ (:foreground "orange1" :bold t ))
(t (:italic t)))
"Font lock mode face used to highlight verilog grouping keywords."
:group 'font-lock-highlighting-faces)
@@ -3068,7 +3125,7 @@ See also `verilog-font-lock-extra-types'.")
;; Fontify all types
(if verilog-highlight-grouping-keywords
(cons (concat "\\<\\(" verilog-font-grouping-keywords "\\)\\>")
- 'verilog-font-lock-ams-face)
+ 'verilog-font-lock-grouping-keywords-face)
(cons (concat "\\<\\(" verilog-font-grouping-keywords "\\)\\>")
'font-lock-type-face))
(cons (concat "\\<\\(" verilog-type-font-keywords "\\)\\>")
@@ -4200,6 +4257,8 @@ Uses `verilog-scan' cache."
(not (or
;; stop if beginning of buffer
(bobp)
+ ;; stop if looking at a pre-processor directive
+ (looking-at "`\\w+")
;; stop if we find a ;
(= (preceding-char) ?\;)
;; stop if we see a named coverpoint
@@ -4208,12 +4267,13 @@ Uses `verilog-scan' cache."
(not (or (looking-at "\\<") (forward-word -1)))
;; stop if we see an assertion (perhaps labeled)
(and
- (looking-at "\\(\\<\\(assert\\|assume\\|cover\\)\\>\\s-+\\<property\\>\\)\\|\\(\\<assert\\>\\)")
+ (looking-at "\\(\\w+\\W*:\\W*\\)?\\(\\<\\(assert\\|assume\\|cover\\)\\>\\s-+\\<property\\>\\)\\|\\(\\<assert\\>\\)")
(progn
(setq h (point))
(save-excursion
(verilog-backward-token)
- (if (looking-at verilog-label-re)
+ (if (and (looking-at verilog-label-re)
+ (not (looking-at verilog-end-block-re)))
(setq h (point))))
(goto-char h)))
;; stop if we see an extended complete reg, perhaps a complete one
@@ -4715,8 +4775,8 @@ primitive or interface named NAME."
(setq str (concat " // else: !assert " str ))
(throw 'skip 1)))))))))
- (; always_comb, always_ff, always_latch
- (or (match-end 4) (match-end 5) (match-end 6))
+ (; always, always_comb, always_latch w/o @...
+ (match-end 5)
(goto-char (match-end 0))
(setq there (point))
(setq err nil)
@@ -4800,6 +4860,9 @@ primitive or interface named NAME."
(throw 'skip 1))))
))))
(end-of-line)
+ (if kill-existing-comment
+ (verilog-kill-existing-comment))
+ (delete-horizontal-space)
(insert (concat " // " string ))))
(;- this is end{function,generate,task,module,primitive,table,generate}
@@ -5161,7 +5224,8 @@ FILENAME to find directory to run in, or defaults to `buffer-file-name`."
;; We should use font-lock-ensure in preference to
;; font-lock-fontify-buffer, but IIUC the problem this is supposed to
;; solve only appears in Emacsen older than font-lock-ensure anyway.
- (when fontlocked (font-lock-fontify-buffer)))))))
+ ;; So avoid bytecomp's interactive-only by going through intern.
+ (when fontlocked (funcall (intern "font-lock-fontify-buffer"))))))))
;;
@@ -5530,8 +5594,12 @@ Return a list of two elements: (INDENT-TYPE INDENT-LEVEL)."
((equal (char-after) ?\{)
;; block type returned based on outer constraint { or inner
(if (verilog-at-constraint-p)
- (cond (inconstraint (throw 'nesting 'constraint))
- (t (throw 'nesting 'statement)))))
+ (cond (inconstraint
+ (beginning-of-line nil)
+ (skip-chars-forward " \t")
+ (throw 'nesting 'constraint))
+ (t
+ (throw 'nesting 'statement)))))
((equal (char-after) ?\})
(let (par-pos
(there (verilog-at-close-constraint-p)))
@@ -6044,7 +6112,16 @@ Optional BOUND limits search."
(save-match-data
(save-excursion
(verilog-re-search-backward "\\((\\*\\)\\|\\(\\*)\\)" nil 'move)
- (numberp (match-beginning 1)))))
+ (cond
+ ((match-end 1)
+ (progn (goto-char (match-end 1))
+ (not (looking-at "\\s-*)")))
+ nil)
+ ((match-end 2)
+ (progn (goto-char (match-beginning 2))
+ (not (looking-at "(\\s-*")))
+ nil)
+ (t nil)))))
(defun verilog-in-parameter-p ()
"Return true if point is in a parameter assignment #( p1=1, p2=5)."
@@ -6176,7 +6253,7 @@ Return >0 for nested struct."
))
;; if first word token not keyword, it maybe the instance name
;; check next word token
- (if (looking-at "\\<\\w+\\>\\|\\s-*(\\s-*\\w+")
+ (if (looking-at "\\<\\w+\\>\\|\\s-*(\\s-*\\S-+")
(progn (verilog-beg-of-statement)
(if (looking-at (concat "\\<\\(constraint\\|"
"\\(?:\\w+\\s-*:\\s-*\\)?\\(coverpoint\\|cross\\)"
@@ -6275,8 +6352,8 @@ Return >0 for nested struct."
(goto-char (- (point) 2))
t) ;; Let nth 4 state handle the rest
((and (not (bobp))
- (= (char-before) ?\))
- (= (char-before (1- (point))) ?\*))
+ (verilog-looking-back "\\*)" nil)
+ (not (verilog-looking-back "(\\s-*\\*)" nil)))
(goto-char (- (point) 2))
(if (search-backward "(*" nil t)
(progn
@@ -6320,7 +6397,8 @@ Return >0 for nested struct."
(progn
(goto-char h)
nil))))
- ((looking-at "(\\*")
+ ((and (looking-at "(\\*") ;; attribute start, but not an event (*) or (* )
+ (not (looking-at "(\\*\\s-*)")))
(progn
(setq h (point))
(goto-char (match-end 0))
@@ -6375,7 +6453,6 @@ Only look at a few lines to determine indent level."
(cond
((or
(= (preceding-char) ?\,)
- (= (preceding-char) ?\])
(save-excursion
(verilog-beg-of-statement-1)
(looking-at verilog-declaration-re)))
@@ -7830,6 +7907,48 @@ Signals must be in standard (base vector) form."
(nreverse out-list)))))
;;(verilog-signals-not-in '(("A" "") ("B" "") ("DEL" "[2:3]")) '(("DEL" "") ("EXT" "")))
+(defun verilog-signals-not-in-struct (in-list not-list)
+ "Return list of signals in IN-LIST that aren't also in NOT-LIST.
+Also remove any duplicates in IN-LIST.
+Any structure in not-list will remove all members in in-list.
+Signals must be in standard (base vector) form."
+ (cond ((eval-when-compile (fboundp 'make-hash-table))
+ (let ((ht (make-hash-table :test 'equal :rehash-size 4.0))
+ out-list addit nm)
+ (while not-list
+ (puthash (car (car not-list)) t ht)
+ (setq not-list (cdr not-list)))
+ (while in-list
+ (setq nm (verilog-sig-name (car in-list)))
+ (when (not (gethash nm ht))
+ (setq addit t)
+ (while (string-match "^\\([^\\].*\\)\\.[^.]+$" nm)
+ (setq nm (match-string 1 nm))
+ (setq addit (and addit
+ (not (gethash nm ht)))))
+ (when addit
+ (setq out-list (cons (car in-list) out-list))
+ (puthash (verilog-sig-name (car in-list)) t ht)))
+ (setq in-list (cdr in-list)))
+ (nreverse out-list)))
+ ;; Slower Fallback if no hash tables (pre Emacs 21.1/XEmacs 21.4)
+ (t
+ (let (out-list addit nm)
+ (while in-list
+ (setq nm (verilog-sig-name (car in-list)))
+ (when (and (not (assoc nm not-list))
+ (not (assoc nm out-list)))
+ (setq addit t)
+ (while (string-match "^\\([^\\].*\\)\\.[^.]+$" nm)
+ (setq nm (match-string 1 nm))
+ (setq addit (and addit
+ (not (assoc nm not-list)))))
+ (when addit
+ (setq out-list (cons (car in-list) out-list))))
+ (setq in-list (cdr in-list)))
+ (nreverse out-list)))))
+;;(verilog-signals-not-in-struct '(("A" "") ("B" "") ("DEL.SUB.A" "[2:3]")) '(("DEL.SUB" "") ("EXT" "")))
+
(defun verilog-signals-memory (in-list)
"Return list of signals in IN-LIST that are memorized (multidimensional)."
(let (out-list)
@@ -8281,10 +8400,9 @@ Return an array of [outputs inouts inputs wire reg assign const]."
typedefed nil multidim nil ptype nil modport nil
expect-signal 'sigs-assign sig-paren paren))
((member keywd '("localparam" "genvar"))
- (unless io
- (setq vec nil enum nil rvalue nil signed nil
- typedefed nil multidim nil ptype nil modport nil
- expect-signal 'sigs-const sig-paren paren)))
+ (setq vec nil enum nil rvalue nil signed nil
+ typedefed nil multidim nil ptype nil modport nil
+ expect-signal 'sigs-const sig-paren paren))
((member keywd '("signed" "unsigned"))
(setq signed keywd))
((member keywd '("assert" "assume" "cover" "expect" "restrict"))
@@ -12134,20 +12252,26 @@ You may also provide an optional third argument regular
expression, in which case only signals which have that pin
direction and data type matching that regular expression will be
included. This matches against everything before the signal name
-in the declaration, for example against \"input\" (single bit),
-\"output logic\" (direction and type) or \"output
-[1:0]\" (direction and implicit type). You also probably want to
-skip spaces in your regexp.
+in the declaration, for example against \"input\" (single
+bit), \"output logic\" (direction and type) or
+\"output [1:0]\" (direction and implicit type). You also
+probably want to skip spaces in your regexp.
For example, the below will result in matching the output \"o\"
against the previous example's module:
- /*AUTOINOUTMODULE(\"ExampMain\",\"\",\"^output.*\")*/"
+ /*AUTOINOUTMODULE(\"ExampMain\",\"\",\"^output.*\")*/
+
+You may also provide an optional fourth argument regular
+expression, which if not \"\" only signals which do NOT match
+that expression are included."
+ ;; Beware spacing of quotes in above as can mess up Emacs indenter
(save-excursion
- (let* ((params (verilog-read-auto-params 1 3))
+ (let* ((params (verilog-read-auto-params 1 4))
(submod (nth 0 params))
(regexp (nth 1 params))
(direction-re (nth 2 params))
+ (not-re (nth 3 params))
submodi)
;; Lookup position, etc of co-module
;; Note this may raise an error
@@ -12182,20 +12306,24 @@ against the previous example's module:
(append (verilog-decls-get-interfaces moddecls)))))
(forward-line 1)
(setq sig-list-i (verilog-signals-edit-wire-reg
- (verilog-signals-matching-dir-re
- (verilog-signals-matching-regexp sig-list-i regexp)
- "input" direction-re))
+ (verilog-signals-not-matching-regexp
+ (verilog-signals-matching-dir-re
+ (verilog-signals-matching-regexp sig-list-i regexp)
+ "input" direction-re) not-re))
sig-list-o (verilog-signals-edit-wire-reg
- (verilog-signals-matching-dir-re
- (verilog-signals-matching-regexp sig-list-o regexp)
- "output" direction-re))
+ (verilog-signals-not-matching-regexp
+ (verilog-signals-matching-dir-re
+ (verilog-signals-matching-regexp sig-list-o regexp)
+ "output" direction-re) not-re))
sig-list-io (verilog-signals-edit-wire-reg
+ (verilog-signals-not-matching-regexp
+ (verilog-signals-matching-dir-re
+ (verilog-signals-matching-regexp sig-list-io regexp)
+ "inout" direction-re) not-re))
+ sig-list-if (verilog-signals-not-matching-regexp
(verilog-signals-matching-dir-re
- (verilog-signals-matching-regexp sig-list-io regexp)
- "inout" direction-re))
- sig-list-if (verilog-signals-matching-dir-re
- (verilog-signals-matching-regexp sig-list-if regexp)
- "interface" direction-re))
+ (verilog-signals-matching-regexp sig-list-if regexp)
+ "interface" direction-re) not-re))
(when v2k (verilog-repair-open-comma))
(when (or sig-list-i sig-list-o sig-list-io sig-list-if)
(verilog-insert-indent "// Beginning of automatic in/out/inouts (from specific module)\n")
@@ -12262,15 +12390,20 @@ You may also provide an optional third argument regular
expression, in which case only signals which have that pin
direction and data type matching that regular expression will be
included. This matches against everything before the signal name
-in the declaration, for example against \"input\" (single bit),
-\"output logic\" (direction and type) or \"output
-[1:0]\" (direction and implicit type). You also probably want to
-skip spaces in your regexp.
+in the declaration, for example against \"input\" (single
+bit), \"output logic\" (direction and type)
+or \"output [1:0]\" (direction and implicit type). You also
+probably want to skip spaces in your regexp.
For example, the below will result in matching the output \"o\"
against the previous example's module:
- /*AUTOINOUTCOMP(\"ExampMain\",\"\",\"^output.*\")*/"
+ /*AUTOINOUTCOMP(\"ExampMain\",\"\",\"^output.*\")*/
+
+You may also provide an optional fourth argument regular
+expression, which if not \"\" only signals which do NOT match
+that expression are included."
+ ;; Beware spacing of quotes in above as can mess up Emacs indenter
(verilog-auto-inout-module t nil))
(defun verilog-auto-inout-in ()
@@ -12793,14 +12926,15 @@ Typing \\[verilog-auto] will make this into:
(verilog-re-search-backward-quick "\\(@\\|\\<\\(always\\(_latch\\|_ff\\|_comb\\)?\\)\\>\\)" nil t)
(setq sigss (verilog-read-always-signals)))
(setq dly-list (verilog-alw-get-outputs-delayed sigss))
- (setq sig-list (verilog-signals-not-in (append
- (verilog-alw-get-outputs-delayed sigss)
- (when (or (not (verilog-alw-get-uses-delayed sigss))
- verilog-auto-reset-blocking-in-non)
- (verilog-alw-get-outputs-immediate sigss)))
- (append
- (verilog-alw-get-temps sigss)
- prereset-sigs)))
+ (setq sig-list (verilog-signals-not-in-struct
+ (append
+ (verilog-alw-get-outputs-delayed sigss)
+ (when (or (not (verilog-alw-get-uses-delayed sigss))
+ verilog-auto-reset-blocking-in-non)
+ (verilog-alw-get-outputs-immediate sigss)))
+ (append
+ (verilog-alw-get-temps sigss)
+ prereset-sigs)))
(setq sig-list (sort sig-list `verilog-signals-sort-compare))
(when sig-list
(insert "\n");
diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el
index 0257210a6c7..ef46e34e78f 100644
--- a/lisp/progmodes/xref.el
+++ b/lisp/progmodes/xref.el
@@ -73,13 +73,17 @@
"Return a string used to group a set of locations.
This is typically the filename.")
+(cl-defgeneric xref-location-line (_location)
+ "Return the line number corresponding to the location."
+ nil)
+
;;;; Commonly needed location classes are defined here:
;; FIXME: might be useful to have an optional "hint" i.e. a string to
;; search for in case the line number is sightly out of date.
(defclass xref-file-location (xref-location)
((file :type string :initarg :file)
- (line :type fixnum :initarg :line)
+ (line :type fixnum :initarg :line :reader xref-location-line)
(column :type fixnum :initarg :column))
:documentation "A file location is a file/line/column triple.
Line numbers start from 1 and columns from 0.")
@@ -203,6 +207,9 @@ found, return nil.
(apropos PATTERN): Find all symbols that match PATTERN. PATTERN
is a regexp.
+ (matches REGEXP): Find all matches for REGEXP in the related
+files. REGEXP is an Emacs regular expression.
+
IDENTIFIER can be any string returned by
`xref-identifier-at-point-function', or from the table returned
by `xref-identifier-completion-table-function'.
@@ -276,6 +283,20 @@ backward."
:type 'integer
:version "25.1")
+(defcustom xref-prompt-for-identifier nil
+ "When non-nil, always prompt for the identifier name.
+
+Otherwise, only prompt when there's no value at point we can use,
+or when the command has been called with the prefix argument."
+ :type '(choice (const :tag "always" t)
+ (const :tag "auto" nil))
+ :version "25.1")
+
+(defcustom xref-pulse-on-jump t
+ "When non-nil, momentarily highlight jump locations."
+ :type 'boolean
+ :version "25.1")
+
(defvar xref--marker-ring (make-ring xref-marker-ring-length)
"Ring of markers to implement the marker stack.")
@@ -294,7 +315,20 @@ backward."
(switch-to-buffer (or (marker-buffer marker)
(error "The marked buffer has been deleted")))
(goto-char (marker-position marker))
- (set-marker marker nil nil))))
+ (set-marker marker nil nil)
+ (xref--maybe-pulse))))
+
+(defun xref--maybe-pulse ()
+ (when xref-pulse-on-jump
+ (let (beg end)
+ (save-excursion
+ (back-to-indentation)
+ (if (eolp)
+ (setq beg (line-beginning-position)
+ end (1+ (point)))
+ (setq beg (point)
+ end (line-end-position))))
+ (pulse-momentary-highlight-region beg end 'next-error))))
;; etags.el needs this
(defun xref-clear-marker-stack ()
@@ -329,7 +363,8 @@ WINDOW controls how the buffer is displayed:
(cl-ecase window
((nil) (switch-to-buffer (current-buffer)))
(window (pop-to-buffer (current-buffer) t))
- (frame (let ((pop-up-frames t)) (pop-to-buffer (current-buffer) t)))))
+ (frame (let ((pop-up-frames t)) (pop-to-buffer (current-buffer) t))))
+ (xref--maybe-pulse))
;;; XREF buffer (part of the UI)
@@ -365,6 +400,7 @@ Used for temporary buffers.")
(with-selected-window (display-buffer (current-buffer) other-window)
(goto-char pos)
(recenter recenter-arg)
+ (xref--maybe-pulse)
(let ((buf (current-buffer))
(win (selected-window)))
(with-current-buffer xref-buf
@@ -406,7 +442,9 @@ Used for temporary buffers.")
(xref-show-location-at-point))
(defun xref--location-at-point ()
- (get-text-property (point) 'xref-location))
+ (save-excursion
+ (back-to-indentation)
+ (get-text-property (point) 'xref-location)))
(defvar-local xref--window nil
"ACTION argument to call `display-buffer' with.")
@@ -414,7 +452,6 @@ Used for temporary buffers.")
(defun xref-goto-xref ()
"Jump to the xref on the current line and bury the xref buffer."
(interactive)
- (back-to-indentation)
(let ((loc (or (xref--location-at-point)
(user-error "No reference at point")))
(window xref--window))
@@ -435,7 +472,22 @@ Used for temporary buffers.")
(define-derived-mode xref--xref-buffer-mode special-mode "XREF"
"Mode for displaying cross-references."
- (setq buffer-read-only t))
+ (setq buffer-read-only t)
+ (setq next-error-function #'xref--next-error-function)
+ (setq next-error-last-buffer (current-buffer)))
+
+(defun xref--next-error-function (n reset?)
+ (when reset?
+ (goto-char (point-min)))
+ (let ((backward (< n 0))
+ (n (abs n))
+ (loc nil))
+ (dotimes (_ n)
+ (setq loc (xref--search-property 'xref-location backward)))
+ (cond (loc
+ (xref--pop-to-location loc))
+ (t
+ (error "No %s xref" (if backward "previous" "next"))))))
(defun xref-quit (&optional kill)
"Bury temporarily displayed buffers, then quit the current window.
@@ -485,22 +537,35 @@ meantime are preserved."
XREF-ALIST is of the form ((GROUP . (XREF ...)) ...). Where
GROUP is a string for decoration purposes and XREF is an
`xref--xref' object."
- (cl-loop for ((group . xrefs) . more1) on xref-alist do
- (xref--insert-propertized '(face bold) group "\n")
+ (require 'compile) ; For the compilation faces.
+ (cl-loop for ((group . xrefs) . more1) on xref-alist
+ for max-line-width =
+ (cl-loop for xref in xrefs
+ maximize (let ((line (xref-location-line
+ (oref xref :location))))
+ (length (and line (format "%d" line)))))
+ for line-format = (and max-line-width
+ (format "%%%dd: " max-line-width))
+ do
+ (xref--insert-propertized '(face compilation-info) group "\n")
(cl-loop for (xref . more2) on xrefs do
- (insert " ")
(with-slots (description location) xref
- (xref--insert-propertized
- (list 'xref-location location
- 'face 'font-lock-keyword-face
- 'mouse-face 'highlight
- 'keymap xref--button-map
- 'help-echo
- (concat "mouse-2: display in another window, "
- "RET or mouse-1: follow reference"))
- description))
- (when (or more1 more2)
- (insert "\n")))))
+ (let* ((line (xref-location-line location))
+ (prefix
+ (if line
+ (propertize (format line-format line)
+ 'face 'compilation-line-number)
+ " ")))
+ (xref--insert-propertized
+ (list 'xref-location location
+ ;; 'face 'font-lock-keyword-face
+ 'mouse-face 'highlight
+ 'keymap xref--button-map
+ 'help-echo
+ (concat "mouse-2: display in another window, "
+ "RET or mouse-1: follow reference"))
+ prefix description)))
+ (insert "\n"))))
(defun xref--analyze (xrefs)
"Find common filenames in XREFS.
@@ -559,10 +624,10 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
(defun xref--read-identifier (prompt)
"Return the identifier at point or read it from the minibuffer."
(let ((id (funcall xref-identifier-at-point-function)))
- (cond ((or current-prefix-arg (not id))
+ (cond ((or current-prefix-arg xref-prompt-for-identifier (not id))
(completing-read prompt
(funcall xref-identifier-completion-table-function)
- nil t nil
+ nil nil nil
'xref--read-identifier-history id))
(t id))))
@@ -599,6 +664,12 @@ With prefix argument, prompt for the identifier."
(interactive (list (xref--read-identifier "Find references of: ")))
(xref--show-xrefs identifier 'references identifier nil))
+;;;###autoload
+(defun xref-find-regexp (regexp)
+ "Find all matches for REGEXP."
+ (interactive (list (xref--read-identifier "Find regexp: ")))
+ (xref--show-xrefs regexp 'matches regexp nil))
+
(declare-function apropos-parse-pattern "apropos" (pattern))
;;;###autoload
@@ -650,6 +721,72 @@ and just use etags."
(setq-local xref-identifier-completion-table-function
(cdr xref-etags-mode--saved))))
+(declare-function semantic-symref-find-references-by-name "semantic/symref")
+(declare-function semantic-symref-find-text "semantic/symref")
+(declare-function semantic-find-file-noselect "semantic/fw")
+
+(defun xref-collect-matches (input dir &optional kind)
+ "Collect KIND matches for INPUT inside DIR according.
+KIND can be `symbol', `regexp' or nil, the last of which means
+literal matches. This function uses the Semantic Symbol
+Reference API, see `semantic-symref-find-references-by-name' for
+details on which tools are used, and when."
+ (require 'semantic/symref)
+ (defvar semantic-symref-tool)
+ (cl-assert (directory-name-p dir))
+ (when (null kind)
+ (setq input (regexp-quote input)))
+ (let* ((default-directory dir)
+ (semantic-symref-tool 'detect)
+ (res (if (eq kind 'symbol)
+ (semantic-symref-find-references-by-name input 'subdirs)
+ (semantic-symref-find-text (xref--regexp-to-extended input)
+ 'subdirs)))
+ (hits (and res (oref res :hit-lines)))
+ (orig-buffers (buffer-list)))
+ (unwind-protect
+ (delq nil
+ (mapcar (lambda (hit) (xref--collect-match hit input kind)) hits))
+ (mapc #'kill-buffer
+ (cl-set-difference (buffer-list) orig-buffers)))))
+
+(defun xref--regexp-to-extended (str)
+ (replace-regexp-in-string
+ ;; FIXME: Add tests. Move to subr.el, make a public function.
+ ;; Maybe error on Emacs-only constructs.
+ "\\(?:\\\\\\\\\\)*\\(?:\\\\[][]\\)?\\(?:\\[.+?\\]\\|\\(\\\\?[(){}|]\\)\\)"
+ (lambda (str)
+ (cond
+ ((not (match-beginning 1))
+ str)
+ ((eq (length (match-string 1 str)) 2)
+ (concat (substring str 0 (match-beginning 1))
+ (substring (match-string 1 str) 1 2)))
+ (t
+ (concat (substring str 0 (match-beginning 1))
+ "\\"
+ (match-string 1 str)))))
+ str t t))
+
+(defun xref--collect-match (hit input kind)
+ (pcase-let* ((`(,line . ,file) hit)
+ (buf (or (find-buffer-visiting file)
+ (semantic-find-file-noselect file)))
+ (input (if (eq kind 'symbol)
+ (format "\\_<%s\\_>" (regexp-quote input))
+ input)))
+ (with-current-buffer buf
+ (save-excursion
+ (goto-char (point-min))
+ (forward-line (1- line))
+ (when (re-search-forward input (line-end-position) t)
+ (goto-char (match-beginning 0))
+ (xref-make (buffer-substring
+ (line-beginning-position)
+ (line-end-position))
+ (xref-make-file-location file line
+ (current-column))))))))
+
(provide 'xref)
diff --git a/lisp/saveplace.el b/lisp/saveplace.el
index 4c53632affd..fe54743e393 100644
--- a/lisp/saveplace.el
+++ b/lisp/saveplace.el
@@ -50,28 +50,10 @@ visiting file FILENAME goes automatically to position POSITION
rather than the beginning of the buffer.
This alist is saved between Emacs sessions.")
-(defcustom save-place nil
- "Non-nil means automatically save place in each file.
-This means when you visit a file, point goes to the last place
-where it was when you previously visited the same file.
-
-If you wish your place in any file to always be automatically
-saved, set this to t using the Customize facility, or put the
-following code in your init file:
-
-\(setq-default save-place t)
-\(require 'saveplace)"
- :type 'boolean
- :require 'saveplace
- :group 'save-place)
-
-(make-variable-buffer-local 'save-place)
-
(defcustom save-place-file (locate-user-emacs-file "places" ".emacs-places")
"Name of the file that records `save-place-alist' value."
:version "24.4" ; added locate-user-emacs-file
- :type 'file
- :group 'save-place)
+ :type 'file)
(defcustom save-place-version-control nil
"Controls whether to make numbered backups of master save-place file.
@@ -82,8 +64,7 @@ value of `version-control'."
:type '(radio (const :tag "Unconditionally" t)
(const :tag "For VC Files" nil)
(const never)
- (const :tag "Use value of `version-control'" nospecial))
- :group 'save-place)
+ (const :tag "Use value of `version-control'" nospecial)))
(defvar save-place-loaded nil
"Non-nil means that the `save-place-file' has been loaded.")
@@ -92,8 +73,7 @@ value of `version-control'."
"Maximum number of entries to retain in the list; nil means no limit."
:version "24.1" ; nil -> 400
:type '(choice (integer :tag "Entries" :value 1)
- (const :tag "No Limit" nil))
- :group 'save-place)
+ (const :tag "No Limit" nil)))
(defcustom save-place-forget-unreadable-files t
"Non-nil means forget place in unreadable files.
@@ -106,7 +86,7 @@ You may do this anytime by calling the complementary function,
`save-place-forget-unreadable-files'. When this option is turned on,
this happens automatically before saving `save-place-alist' to
`save-place-file'."
- :type 'boolean :group 'save-place)
+ :type 'boolean)
(defcustom save-place-save-skipped t
"If non-nil, remember files matching `save-place-skip-check-regexp'.
@@ -114,7 +94,7 @@ this happens automatically before saving `save-place-alist' to
When filtering `save-place-alist' for unreadable files, some will not
be checked, based on said regexp, and instead saved or forgotten based
on this flag."
- :type 'boolean :group 'save-place)
+ :type 'boolean)
(defcustom save-place-skip-check-regexp
;; thanks to ange-ftp-name-format
@@ -127,7 +107,7 @@ subject to `save-place-save-skipped'.
Files for which such a check may be inconvenient include those on
removable and network volumes."
- :type 'regexp :group 'save-place)
+ :type 'regexp)
(defcustom save-place-ignore-files-regexp
"\\(?:COMMIT_EDITMSG\\|hg-editor-[[:alnum:]]+\\.txt\\|svn-commit\\.tmp\\|bzr_log\\.[[:alnum:]]+\\)$"
@@ -136,11 +116,34 @@ Useful for temporary file such as commit message files that are
automatically created by the VCS. If set to nil, this feature is
disabled, i.e., the position is recorded for all files."
:version "24.1"
- :type 'regexp :group 'save-place)
+ :type 'regexp)
(declare-function dired-current-directory "dired" (&optional localp))
-(defun toggle-save-place (&optional parg)
+(define-obsolete-variable-alias 'save-place 'save-place-mode "25.1")
+;;;###autoload
+(define-minor-mode save-place-mode
+ "Non-nil means automatically save place in each file.
+This means when you visit a file, point goes to the last place
+where it was when you previously visited the same file."
+ :global t
+ :group 'save-place
+ (cond
+ (save-place-mode
+ (add-hook 'find-file-hook 'save-place-find-file-hook t)
+ (add-hook 'dired-initial-position-hook 'save-place-dired-hook)
+ (unless noninteractive
+ (add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook))
+ (add-hook 'kill-buffer-hook 'save-place-to-alist))
+ (t
+ (remove-hook 'find-file-hook 'save-place-find-file-hook t)
+ (remove-hook 'dired-initial-position-hook 'save-place-dired-hook)
+ (remove-hook 'kill-emacs-hook 'save-place-kill-emacs-hook)
+ (remove-hook 'kill-buffer-hook 'save-place-to-alist))))
+
+(make-variable-buffer-local 'save-place-mode) ; Hysterical raisins.
+
+(defun toggle-save-place (&optional parg) ;FIXME: save-place-local-mode!
"Toggle whether to save your place in this file between sessions.
If this mode is enabled, point is recorded when you kill the buffer
or exit Emacs. Visiting this file again will go to that position,
@@ -353,15 +356,5 @@ may have changed) back to `save-place-alist'."
(if save-place-loaded
(save-place-alist-to-file)))
-(add-hook 'find-file-hook 'save-place-find-file-hook t)
-
-(add-hook 'dired-initial-position-hook 'save-place-dired-hook)
-
-(unless noninteractive
- (add-hook 'kill-emacs-hook 'save-place-kill-emacs-hook))
-
-(add-hook 'kill-buffer-hook 'save-place-to-alist)
-
-(provide 'saveplace) ; why not...
-
+(provide 'saveplace)
;;; saveplace.el ends here
diff --git a/lisp/simple.el b/lisp/simple.el
index cf1912ade4f..dfd92dcdc05 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -4870,6 +4870,45 @@ store it in a Lisp variable. Example:
(setq mark-active nil)
(set-marker (mark-marker) nil)))
+(defun save-mark-and-excursion--save ()
+ (cons
+ (let ((mark (mark-marker)))
+ (and (marker-position mark) (copy-marker mark)))
+ mark-active))
+
+(defun save-mark-and-excursion--restore (saved-mark-info)
+ (let ((saved-mark (car saved-mark-info))
+ (omark (marker-position (mark-marker)))
+ (nmark nil)
+ (saved-mark-active (cdr saved-mark-info)))
+ ;; Mark marker
+ (if (null saved-mark)
+ (set-marker (mark-marker) nil)
+ (setf nmark (marker-position saved-mark))
+ (set-marker (mark-marker) nmark)
+ (set-marker saved-mark nil))
+ ;; Mark active
+ (let ((cur-mark-active mark-active))
+ (setq mark-active saved-mark-active)
+ ;; If mark is active now, and either was not active or was at a
+ ;; different place, run the activate hook.
+ (if saved-mark-active
+ (when (or (not cur-mark-active)
+ (not (eq omark nmark)))
+ (run-hooks 'activate-mark-hook))
+ ;; If mark has ceased to be active, run deactivate hook.
+ (when cur-mark-active
+ (run-hooks 'deactivate-mark-hook))))))
+
+(defmacro save-mark-and-excursion (&rest body)
+ "Like `save-excursion', but also save and restore the mark state.
+This macro does what `save-excursion' did before Emacs 25.1."
+ (let ((saved-marker-sym (make-symbol "saved-marker")))
+ `(let ((,saved-marker-sym (save-mark-and-excursion--save)))
+ (unwind-protect
+ (save-excursion ,@body)
+ (save-mark-and-excursion--restore ,saved-marker-sym)))))
+
(defcustom use-empty-active-region nil
"Whether \"region-aware\" commands should act on empty regions.
If nil, region-aware commands treat empty regions as inactive.
@@ -5961,7 +6000,11 @@ and `current-column' to be able to ignore invisible text."
;; that will get us to the same place on the screen
;; but with a more reasonable buffer position.
(goto-char normal-location)
- (let ((line-beg (line-beginning-position)))
+ (let ((line-beg
+ ;; We want the real line beginning, so it's consistent
+ ;; with bolp below, otherwise we might infloop.
+ (let ((inhibit-field-text-motion t))
+ (line-beginning-position))))
(while (and (not (bolp)) (invisible-p (1- (point))))
(goto-char (previous-char-property-change (point) line-beg))))))))
@@ -6992,8 +7035,9 @@ The function should return non-nil if the two tokens do not match.")
(buffer-substring blinkpos (1+ blinkpos))))
;; There is nothing to show except the char itself.
(t (buffer-substring blinkpos (1+ blinkpos))))))
- (message "Matches %s"
- (substring-no-properties open-paren-line-string)))))))))
+ (minibuffer-message
+ "Matches %s"
+ (substring-no-properties open-paren-line-string)))))))))
(defvar blink-paren-function 'blink-matching-open
"Function called, if non-nil, whenever a close parenthesis is inserted.
diff --git a/lisp/subr.el b/lisp/subr.el
index 0343edb068c..9c56e51bc96 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -417,10 +417,21 @@ If N is omitted or nil, remove the last element."
Store the result in LIST and return it. LIST must be a proper list.
Of several `equal' occurrences of an element in LIST, the first
one is kept."
- (let ((tail list))
- (while tail
- (setcdr tail (delete (car tail) (cdr tail)))
- (setq tail (cdr tail))))
+ (let ((l (length list)))
+ (if (> l 100)
+ (let ((hash (make-hash-table :test #'equal :size l))
+ (tail list) retail)
+ (puthash (car list) t hash)
+ (while (setq retail (cdr tail))
+ (let ((elt (car retail)))
+ (if (gethash elt hash)
+ (setcdr tail (cdr retail))
+ (puthash elt t hash)))
+ (setq tail retail)))
+ (let ((tail list))
+ (while tail
+ (setcdr tail (delete (car tail) (cdr tail)))
+ (setq tail (cdr tail))))))
list)
;; See http://lists.gnu.org/archive/html/emacs-devel/2013-05/msg00204.html
@@ -1733,7 +1744,7 @@ this instead of `run-hooks' when running their FOO-mode-hook."
(defmacro delay-mode-hooks (&rest body)
"Execute BODY, but delay any `run-mode-hooks'.
These hooks will be executed by the first following call to
-`run-mode-hooks' that occurs outside any `delayed-mode-hooks' form.
+`run-mode-hooks' that occurs outside any `delay-mode-hooks' form.
Only affects hooks run in the current buffer."
(declare (debug t) (indent 0))
`(progn
diff --git a/lisp/term/common-win.el b/lisp/term/common-win.el
index 64459353e1c..98ad5acf268 100644
--- a/lisp/term/common-win.el
+++ b/lisp/term/common-win.el
@@ -419,4 +419,6 @@ the operating system.")
(setq defined-colors (cons this-color defined-colors))))
defined-colors)))
+(provide 'term/common-win)
+
;;; common-win.el ends here
diff --git a/lisp/term/ns-win.el b/lisp/term/ns-win.el
index 9264a1cf033..e642ab53447 100644
--- a/lisp/term/ns-win.el
+++ b/lisp/term/ns-win.el
@@ -717,10 +717,6 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
;;;; Pasteboard support.
-(declare-function ns-get-selection-internal "nsselect.m" (buffer))
-
-(define-obsolete-function-alias 'ns-get-cut-buffer-internal
- 'ns-get-selection-internal "24.1")
(define-obsolete-function-alias 'ns-store-cut-buffer-internal
'gui-set-selection "24.1")
@@ -732,7 +728,7 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
(defun ns-paste-secondary ()
(interactive)
- (insert (ns-get-selection-internal 'SECONDARY)))
+ (insert (gui-get-selection 'SECONDARY)))
;;;; Scrollbar handling.
@@ -930,6 +926,15 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
(gui-method-define window-system-initialization ns
#'ns-initialize-window-system)
+(declare-function ns-own-selection-internal "nsselect.m" (selection value))
+(declare-function ns-disown-selection-internal "nsselect.m" (selection))
+(declare-function ns-selection-owner-p "nsselect.m"
+ (&optional selection terminal))
+(declare-function ns-selection-exists-p "nsselect.m"
+ (&optional selection terminal))
+(declare-function ns-get-selection "nsselect.m"
+ (selection-symbol target-type &optional time-stamp terminal))
+
(gui-method-define gui-set-selection ns
(lambda (selection value)
(if value (ns-own-selection-internal selection value)
diff --git a/lisp/term/rxvt.el b/lisp/term/rxvt.el
index fa981c6625b..c2055088fb5 100644
--- a/lisp/term/rxvt.el
+++ b/lisp/term/rxvt.el
@@ -24,36 +24,21 @@
;;; Code:
+(require 'term/xterm)
+
(defvar rxvt-function-map
(let ((map (make-sparse-keymap)))
+ (set-keymap-parent map xterm-rxvt-function-map)
;; Set up input-decode-map entries that termcap and terminfo don't know.
- (define-key map "\e[A" [up])
- (define-key map "\e[B" [down])
- (define-key map "\e[C" [right])
- (define-key map "\e[D" [left])
- (define-key map "\e[2~" [insert])
- (define-key map "\e[3~" [delete])
- (define-key map "\e[4~" [select])
- (define-key map "\e[5~" [prior])
- (define-key map "\e[6~" [next])
(define-key map "\e[7~" [home])
(define-key map "\e[8~" [end])
- (define-key map "\e[11~" [f1])
- (define-key map "\e[12~" [f2])
- (define-key map "\e[13~" [f3])
- (define-key map "\e[14~" [f4])
- (define-key map "\e[15~" [f5])
- (define-key map "\e[17~" [f6])
- (define-key map "\e[18~" [f7])
- (define-key map "\e[19~" [f8])
- (define-key map "\e[20~" [f9])
- (define-key map "\e[21~" [f10])
;; The strings emitted by f11 and f12 are the same as the strings
;; emitted by S-f1 and S-f2, so don't define f11 and f12.
;; (define-key rxvt-function-map "\e[23~" [f11])
;; (define-key rxvt-function-map "\e[24~" [f12])
- (define-key map "\e[29~" [print])
+ (define-key map "\e[23~" [S-f1])
+ (define-key map "\e[24~" [S-f2])
(define-key map "\e[11^" [C-f1])
(define-key map "\e[12^" [C-f2])
@@ -66,8 +51,6 @@
(define-key map "\e[20^" [C-f9])
(define-key map "\e[21^" [C-f10])
- (define-key map "\e[23~" [S-f1])
- (define-key map "\e[24~" [S-f2])
(define-key map "\e[25~" [S-f3])
(define-key map "\e[26~" [S-f4])
(define-key map "\e[28~" [S-f5])
@@ -99,7 +82,6 @@
(define-key map "\eOa" [C-up])
(define-key map "\eOb" [C-down])
- (define-key map "\e[2;2~" [S-insert])
(define-key map "\e[3$" [S-delete])
(define-key map "\e[5$" [S-prior])
(define-key map "\e[6$" [S-next])
@@ -157,26 +139,6 @@
map)
"Keymap of possible alternative meanings for some keys.")
-(defun terminal-init-rxvt ()
- "Terminal initialization function for rxvt."
-
- (let ((map (copy-keymap rxvt-alternatives-map)))
- (set-keymap-parent map (keymap-parent local-function-key-map))
- (set-keymap-parent local-function-key-map map))
-
- ;; Use inheritance to let the main keymap override those defaults.
- ;; This way we don't override terminfo-derived settings or settings
- ;; made in the init file.
- (let ((m (copy-keymap rxvt-function-map)))
- (set-keymap-parent m (keymap-parent input-decode-map))
- (set-keymap-parent input-decode-map m))
-
- ;; Initialize colors and background mode.
- (rxvt-register-default-colors)
- (rxvt-set-background-mode)
- ;; This recomputes all the default faces given the colors we've just set up.
- (tty-set-up-initial-frame-faces))
-
;; Set up colors, for those versions of rxvt that support it.
(defvar rxvt-standard-colors
;; The names of the colors in the comments taken from the rxvt.1 man
@@ -199,93 +161,17 @@
("brightwhite" 15 (255 255 255))) ; white
"Names of 16 standard rxvt colors, their numbers, and RGB values.")
-(defun rxvt-rgb-convert-to-16bit (prim)
- "Convert an 8-bit primary color value PRIM to a corresponding 16-bit value."
- (logior prim (lsh prim 8)))
-
-(defun rxvt-register-default-colors ()
- "Register the default set of colors for rxvt or compatible emulator.
+(defun terminal-init-rxvt ()
+ "Terminal initialization function for rxvt."
-This function registers the number of colors returned by `display-color-cells'
-for the currently selected frame."
- (let* ((ncolors (display-color-cells))
- (colors rxvt-standard-colors)
- (color (car colors)))
- (if (> ncolors 0)
- ;; Clear the 8 default tty colors registered by startup.el
- (tty-color-clear))
- ;; Only register as many colors as are supported by the display.
- (while (and (> ncolors 0) colors)
- (tty-color-define (car color) (cadr color)
- (mapcar 'rxvt-rgb-convert-to-16bit
- (car (cddr color))))
- (setq colors (cdr colors)
- color (car colors)
- ncolors (1- ncolors)))
- (when (> ncolors 0)
- (cond
- ((= ncolors 240) ; 256-color rxvt
- ;; 216 non-gray colors first
- (let ((r 0) (g 0) (b 0))
- (while (> ncolors 24)
- ;; This and other formulas taken from 256colres.pl and
- ;; 88colres.pl in the xterm distribution.
- (tty-color-define (format "color-%d" (- 256 ncolors))
- (- 256 ncolors)
- (mapcar 'rxvt-rgb-convert-to-16bit
- (list (if (zerop r) 0 (+ (* r 40) 55))
- (if (zerop g) 0 (+ (* g 40) 55))
- (if (zerop b) 0 (+ (* b 40) 55)))))
- (setq b (1+ b))
- (if (> b 5)
- (setq g (1+ g)
- b 0))
- (if (> g 5)
- (setq r (1+ r)
- g 0))
- (setq ncolors (1- ncolors))))
- ;; Now the 24 gray colors
- (while (> ncolors 0)
- (setq color (rxvt-rgb-convert-to-16bit (+ 8 (* (- 24 ncolors) 10))))
- (tty-color-define (format "color-%d" (- 256 ncolors))
- (- 256 ncolors)
- (list color color color))
- (setq ncolors (1- ncolors))))
+ (xterm--push-map rxvt-alternatives-map local-function-key-map)
+ (xterm--push-map rxvt-function-map input-decode-map)
- ((= ncolors 72) ; rxvt-unicode
- ;; 64 non-gray colors
- (let ((levels '(0 139 205 255))
- (r 0) (g 0) (b 0))
- (while (> ncolors 8)
- (tty-color-define (format "color-%d" (- 88 ncolors))
- (- 88 ncolors)
- (mapcar 'rxvt-rgb-convert-to-16bit
- (list (nth r levels)
- (nth g levels)
- (nth b levels))))
- (setq b (1+ b))
- (if (> b 3)
- (setq g (1+ g)
- b 0))
- (if (> g 3)
- (setq r (1+ r)
- g 0))
- (setq ncolors (1- ncolors))))
- ;; Now the 8 gray colors
- (while (> ncolors 0)
- (setq color (rxvt-rgb-convert-to-16bit
- (floor
- (if (= ncolors 8)
- 46.36363636
- (+ (* (- 8 ncolors) 23.18181818) 69.54545454)))))
- (tty-color-define (format "color-%d" (- 88 ncolors))
- (- 88 ncolors)
- (list color color color))
- (setq ncolors (1- ncolors))))
- (t (error "Unsupported number of rxvt colors (%d)" (+ 16 ncolors)))))
- ;; Modifying color mappings means realized faces don't use the
- ;; right colors, so clear them.
- (clear-face-cache)))
+ ;; Initialize colors and background mode.
+ (xterm-register-default-colors rxvt-standard-colors)
+ (rxvt-set-background-mode)
+ ;; This recomputes all the default faces given the colors we've just set up.
+ (tty-set-up-initial-frame-faces))
;; rxvt puts the default colors into an environment variable
;; COLORFGBG. We use this to set the background mode in a more
diff --git a/lisp/term/screen.el b/lisp/term/screen.el
index 3587c4f95e5..41fd916a785 100644
--- a/lisp/term/screen.el
+++ b/lisp/term/screen.el
@@ -1,9 +1,22 @@
;;; screen.el --- terminal initialization for screen and tmux -*- lexical-binding: t -*-
;; Copyright (C) 1995, 2001-2015 Free Software Foundation, Inc.
+(require 'term/xterm)
+
+(defcustom xterm-screen-extra-capabilities '(modifyOtherKeys)
+ "Extra capabilities supported under \"screen\".
+Some features of screen depend on the terminal emulator in which
+it runs, which can change when the screen session is moved to another tty."
+ :type xterm--extra-capabilities-type
+ :group 'xterm)
+
(defun terminal-init-screen ()
"Terminal initialization function for screen."
- ;; Treat a screen terminal similar to an xterm.
- (tty-run-terminal-initialization (selected-frame) "xterm"))
+ ;; Treat a screen terminal similar to an xterm, but don't use
+ ;; xterm-extra-capabilities's `check' setting since that doesn't seem
+ ;; to work so well (it depends too much on the surrounding terminal
+ ;; emulator, which can change during the session, bug#20356).
+ (let ((xterm-extra-capabilities xterm-screen-extra-capabilities))
+ (tty-run-terminal-initialization (selected-frame) "xterm")))
;; screen.el ends here
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el
index b0902942f8f..f929288d04e 100644
--- a/lisp/term/x-win.el
+++ b/lisp/term/x-win.el
@@ -72,6 +72,7 @@
(if (not (fboundp 'x-create-frame))
(error "%s: Loading x-win.el but not compiled for X" (invocation-name)))
+(require 'term/common-win)
(require 'frame)
(require 'mouse)
(require 'scroll-bar)
@@ -1322,6 +1323,17 @@ This returns an error if any Emacs frames are X frames."
(x-apply-session-resources)
(setq x-initialized t))
+(declare-function x-own-selection-internal "xselect.c"
+ (selection value &optional frame))
+(declare-function x-disown-selection-internal "xselect.c"
+ (selection &optional time-object terminal))
+(declare-function x-selection-owner-p "xselect.c"
+ (&optional selection terminal))
+(declare-function x-selection-exists-p "xselect.c"
+ (&optional selection terminal))
+(declare-function x-get-selection-internal "xselect.c"
+ (selection-symbol target-type &optional time-stamp terminal))
+
(add-to-list 'display-format-alist '("\\`[^:]*:[0-9]+\\(\\.[0-9]+\\)?\\'" . x))
(gui-method-define handle-args-function x #'x-handle-args)
(gui-method-define frame-creation-function x #'x-create-frame-with-faces)
diff --git a/lisp/term/xterm.el b/lisp/term/xterm.el
index 726ecf91f85..667e4ce63ee 100644
--- a/lisp/term/xterm.el
+++ b/lisp/term/xterm.el
@@ -29,6 +29,13 @@
:version "24.1"
:group 'terminals)
+(defconst xterm--extra-capabilities-type
+ ;; NOTE: If you add entries here, make sure to update
+ ;; `terminal-init-xterm' as well.
+ '(set (const :tag "modifyOtherKeys support" modifyOtherKeys)
+ (const :tag "report background" reportBackground)
+ (const :tag "set X selection" setSelection)))
+
(defcustom xterm-extra-capabilities 'check
"Whether Xterm supports some additional, more modern, features.
If nil, just assume that it does not.
@@ -40,13 +47,8 @@ The relevant features are:
reportBackground -- if supported, Xterm reports its background color
setSelection -- if supported, Xterm saves yanked text to the X selection"
:version "24.1"
- :type '(choice (const :tag "No" nil)
- (const :tag "Check" check)
- ;; NOTE: If you add entries here, make sure to update
- ;; `terminal-init-xterm' as well.
- (set (const :tag "modifyOtherKeys support" modifyOtherKeys)
- (const :tag "report background" reportBackground)
- (const :tag "set X selection" setSelection))))
+ :type `(choice (const :tag "Check" check)
+ ,xterm--extra-capabilities-type))
(defcustom xterm-max-cut-length 100000
"Maximum number of bytes to cut into xterm using the OSC 52 sequence.
@@ -93,20 +95,50 @@ string bytes that can be copied is 3/4 of this value."
(define-key global-map [xterm-paste] #'xterm-paste)
-(defvar xterm-function-map
+(defvar xterm-rxvt-function-map
(let ((map (make-sparse-keymap)))
+ (define-key map "\e[2~" [insert])
+ (define-key map "\e[3~" [delete])
+ (define-key map "\e[4~" [select])
+ (define-key map "\e[5~" [prior])
+ (define-key map "\e[6~" [next])
- ;; xterm from X.org 6.8.2 uses these key definitions.
- (define-key map "\eOP" [f1])
- (define-key map "\eOQ" [f2])
- (define-key map "\eOR" [f3])
- (define-key map "\eOS" [f4])
(define-key map "\e[15~" [f5])
(define-key map "\e[17~" [f6])
(define-key map "\e[18~" [f7])
(define-key map "\e[19~" [f8])
(define-key map "\e[20~" [f9])
(define-key map "\e[21~" [f10])
+
+ (define-key map "\e[2;2~" [S-insert])
+
+ ;; Other versions of xterm might emit these.
+ (define-key map "\e[A" [up])
+ (define-key map "\e[B" [down])
+ (define-key map "\e[C" [right])
+ (define-key map "\e[D" [left])
+
+ (define-key map "\e[11~" [f1])
+ (define-key map "\e[12~" [f2])
+ (define-key map "\e[13~" [f3])
+ (define-key map "\e[14~" [f4])
+
+ ;; Recognize the start of a bracketed paste sequence. The handler
+ ;; internally recognizes the end.
+ (define-key map "\e[200~" [xterm-paste])
+
+ map)
+ "Keymap of escape sequences, shared between xterm and rxvt support.")
+
+(defvar xterm-function-map
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map xterm-rxvt-function-map)
+
+ ;; xterm from X.org 6.8.2 uses these key definitions.
+ (define-key map "\eOP" [f1])
+ (define-key map "\eOQ" [f2])
+ (define-key map "\eOR" [f3])
+ (define-key map "\eOS" [f4])
(define-key map "\e[23~" [f11])
(define-key map "\e[24~" [f12])
@@ -235,12 +267,6 @@ string bytes that can be copied is 3/4 of this value."
(define-key map "\e[1;3F" [M-end])
(define-key map "\e[1;3H" [M-home])
- (define-key map "\e[2~" [insert])
- (define-key map "\e[3~" [delete])
- (define-key map "\e[5~" [prior])
- (define-key map "\e[6~" [next])
-
- (define-key map "\e[2;2~" [S-insert])
(define-key map "\e[3;2~" [S-delete])
(define-key map "\e[5;2~" [S-prior])
(define-key map "\e[6;2~" [S-next])
@@ -275,7 +301,6 @@ string bytes that can be copied is 3/4 of this value."
(define-key map "\e[5;3~" [M-prior])
(define-key map "\e[6;3~" [M-next])
- (define-key map "\e[4~" [select])
(define-key map "\e[29~" [print])
(define-key map "\eOj" [kp-multiply])
@@ -480,10 +505,6 @@ string bytes that can be copied is 3/4 of this value."
(format "\e[%d;%du" (nth 1 bind) (nth 0 bind)) (nth 2 bind)))
;; Other versions of xterm might emit these.
- (define-key map "\e[A" [up])
- (define-key map "\e[B" [down])
- (define-key map "\e[C" [right])
- (define-key map "\e[D" [left])
(define-key map "\e[1~" [home])
(define-key map "\eO2A" [S-up])
@@ -500,15 +521,6 @@ string bytes that can be copied is 3/4 of this value."
(define-key map "\eO5F" [C-end])
(define-key map "\eO5H" [C-home])
- (define-key map "\e[11~" [f1])
- (define-key map "\e[12~" [f2])
- (define-key map "\e[13~" [f3])
- (define-key map "\e[14~" [f4])
-
- ;; Recognize the start of a bracketed paste sequence. The handler
- ;; internally recognizes the end.
- (define-key map "\e[200~" [xterm-paste])
-
map)
"Function key map overrides for xterm.")
@@ -578,6 +590,29 @@ string bytes that can be copied is 3/4 of this value."
map)
"Keymap of possible alternative meanings for some keys.")
+;; Set up colors, for those versions of xterm that support it.
+(defvar xterm-standard-colors
+ ;; The names in the comments taken from XTerm-col.ad in the xterm
+ ;; distribution, see ftp://dickey.his.com/xterm/. RGB values are
+ ;; from rgb.txt.
+ '(("black" 0 ( 0 0 0)) ; black
+ ("red" 1 (205 0 0)) ; red3
+ ("green" 2 ( 0 205 0)) ; green3
+ ("yellow" 3 (205 205 0)) ; yellow3
+ ("blue" 4 ( 0 0 238)) ; blue2
+ ("magenta" 5 (205 0 205)) ; magenta3
+ ("cyan" 6 ( 0 205 205)) ; cyan3
+ ("white" 7 (229 229 229)) ; gray90
+ ("brightblack" 8 (127 127 127)) ; gray50
+ ("brightred" 9 (255 0 0)) ; red
+ ("brightgreen" 10 ( 0 255 0)) ; green
+ ("brightyellow" 11 (255 255 0)) ; yellow
+ ("brightblue" 12 (92 92 255)) ; rgb:5c/5c/ff
+ ("brightmagenta" 13 (255 0 255)) ; magenta
+ ("brightcyan" 14 ( 0 255 255)) ; cyan
+ ("brightwhite" 15 (255 255 255))) ; white
+ "Names of 16 standard xterm/aixterm colors, their numbers, and RGB values.")
+
(defun xterm--report-background-handler ()
(let ((str "")
chr)
@@ -623,8 +658,11 @@ string bytes that can be copied is 3/4 of this value."
(setq version 200))
(when (equal (match-string 1 str) "83")
;; `screen' (which returns 83;40003;0) seems to also lack support for
- ;; some of these (bug#17607).
- (setq version 240))
+ ;; some of these (bug#17607, bug#20356).
+ ;; Note: this code path should normally not be used any more
+ ;; since term/screen.el now binds xterm-extra-capabilities
+ ;; to a fixed value, rather than using the dynamic checking.
+ (setq version 200))
;; If version is 242 or higher, assume the xterm supports
;; reporting the background color (TODO: maybe earlier
;; versions do too...)
@@ -682,6 +720,14 @@ We run the first FUNCTION whose STRING matches the input events."
(push (aref (car handler) (setq i (1- i)))
unread-command-events)))))))
+(defun xterm--push-map (map basemap)
+ ;; Use inheritance to let the main keymaps override those defaults.
+ ;; This way we don't override terminfo-derived settings or settings
+ ;; made in the init file.
+ (set-keymap-parent
+ basemap
+ (make-composed-keymap map (keymap-parent basemap))))
+
(defun terminal-init-xterm ()
"Terminal initialization function for xterm."
;; rxvt terminals sometimes set the TERM variable to "xterm", but
@@ -691,19 +737,10 @@ We run the first FUNCTION whose STRING matches the input events."
(string-match "\\`rxvt" (getenv "COLORTERM" (selected-frame))))
(tty-run-terminal-initialization (selected-frame) "rxvt")
- (let ((map (copy-keymap xterm-alternatives-map)))
- (set-keymap-parent map (keymap-parent local-function-key-map))
- (set-keymap-parent local-function-key-map map))
-
- (let ((map (copy-keymap xterm-function-map)))
+ (xterm--push-map xterm-alternatives-map local-function-key-map)
+ (xterm--push-map xterm-function-map input-decode-map))
- ;; Use inheritance to let the main keymap override those defaults.
- ;; This way we don't override terminfo-derived settings or settings
- ;; made in the init file.
- (set-keymap-parent map (keymap-parent input-decode-map))
- (set-keymap-parent input-decode-map map)))
-
- (xterm-register-default-colors)
+ (xterm-register-default-colors xterm-standard-colors)
(tty-set-up-initial-frame-faces)
(if (eq xterm-extra-capabilities 'check)
@@ -802,43 +839,19 @@ hitting screen's max DCS length."
"\a"
(when screen "\e\\"))))))))
-;; Set up colors, for those versions of xterm that support it.
-(defvar xterm-standard-colors
- ;; The names in the comments taken from XTerm-col.ad in the xterm
- ;; distribution, see ftp://dickey.his.com/xterm/. RGB values are
- ;; from rgb.txt.
- '(("black" 0 ( 0 0 0)) ; black
- ("red" 1 (205 0 0)) ; red3
- ("green" 2 ( 0 205 0)) ; green3
- ("yellow" 3 (205 205 0)) ; yellow3
- ("blue" 4 ( 0 0 238)) ; blue2
- ("magenta" 5 (205 0 205)) ; magenta3
- ("cyan" 6 ( 0 205 205)) ; cyan3
- ("white" 7 (229 229 229)) ; gray90
- ("brightblack" 8 (127 127 127)) ; gray50
- ("brightred" 9 (255 0 0)) ; red
- ("brightgreen" 10 ( 0 255 0)) ; green
- ("brightyellow" 11 (255 255 0)) ; yellow
- ("brightblue" 12 (92 92 255)) ; rgb:5c/5c/ff
- ("brightmagenta" 13 (255 0 255)) ; magenta
- ("brightcyan" 14 ( 0 255 255)) ; cyan
- ("brightwhite" 15 (255 255 255))) ; white
- "Names of 16 standard xterm/aixterm colors, their numbers, and RGB values.")
-
(defun xterm-rgb-convert-to-16bit (prim)
"Convert an 8-bit primary color value PRIM to a corresponding 16-bit value."
(logior prim (lsh prim 8)))
-(defun xterm-register-default-colors ()
+(defun xterm-register-default-colors (colors)
"Register the default set of colors for xterm or compatible emulator.
This function registers the number of colors returned by `display-color-cells'
-for the currently selected frame. The first 16 colors are taken from
-`xterm-standard-colors', which see, while the rest are computed assuming
+for the currently selected frame. The first (16) colors are taken from
+COLORS, which see, while the rest are computed assuming
either the 88- or 256-color standard color scheme supported by latest
versions of xterm."
- (let* ((ncolors (display-color-cells (selected-frame)))
- (colors xterm-standard-colors)
+ (let* ((ncolors (display-color-cells))
(color (car colors)))
(if (> ncolors 0)
;; Clear the 8 default tty colors registered by startup.el
@@ -846,12 +859,12 @@ versions of xterm."
;; Only register as many colors as are supported by the display.
(while (and (> ncolors 0) colors)
(tty-color-define (car color) (cadr color)
- (mapcar 'xterm-rgb-convert-to-16bit
+ (mapcar #'xterm-rgb-convert-to-16bit
(car (cddr color))))
(setq colors (cdr colors)
color (car colors)
ncolors (1- ncolors)))
- ;; We've exhausted the colors from `xterm-standard-colors'. If there
+ ;; We've exhausted the colors from `colors'. If there
;; are more colors to support, compute them now.
(when (> ncolors 0)
(cond
@@ -863,7 +876,7 @@ versions of xterm."
;; 88colres.pl in the xterm distribution.
(tty-color-define (format "color-%d" (- 256 ncolors))
(- 256 ncolors)
- (mapcar 'xterm-rgb-convert-to-16bit
+ (mapcar #'xterm-rgb-convert-to-16bit
(list (if (zerop r) 0 (+ (* r 40) 55))
(if (zerop g) 0 (+ (* g 40) 55))
(if (zerop b) 0 (+ (* b 40) 55)))))
@@ -890,7 +903,7 @@ versions of xterm."
(while (> ncolors 8)
(tty-color-define (format "color-%d" (- 88 ncolors))
(- 88 ncolors)
- (mapcar 'xterm-rgb-convert-to-16bit
+ (mapcar #'xterm-rgb-convert-to-16bit
(list (nth r levels)
(nth g levels)
(nth b levels))))
@@ -925,6 +938,6 @@ versions of xterm."
(set-terminal-parameter nil 'background-mode 'dark)
t))
-(provide 'xterm)
-
+(provide 'xterm) ;Backward compatibility.
+(provide 'term/xterm)
;;; xterm.el ends here
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el
index 8a018520f5f..10edefc9d3e 100644
--- a/lisp/textmodes/bibtex.el
+++ b/lisp/textmodes/bibtex.el
@@ -2229,7 +2229,7 @@ Optional arg COMMA is as in `bibtex-enclosing-field'."
bibtex-entry-kill-ring))
;; If we copied an entry from a buffer containing only this one entry,
;; it can be missing the second "\n".
- (unless (looking-back "\n\n" (- (point 2))) (insert "\n"))
+ (unless (looking-back "\n\n" (- (point) 2)) (insert "\n"))
(unless (functionp bibtex-reference-keys)
;; update `bibtex-reference-keys'
(save-excursion
diff --git a/lisp/textmodes/ispell.el b/lisp/textmodes/ispell.el
index 498def0b966..f67fae8bcfa 100644
--- a/lisp/textmodes/ispell.el
+++ b/lisp/textmodes/ispell.el
@@ -1075,9 +1075,11 @@ of `ispell-dictionary-base-alist' elements."
(dolist ( tmp-path (list ispell-aspell-dict-dir
ispell-aspell-data-dir ))
;; Try xx.dat first, strip out variant, country code, etc,
- ;; then try xx_YY.dat (without stripping country code).
+ ;; then try xx_YY.dat (without stripping country code),
+ ;; then try xx-alt.dat, for deu-alt etc.
(dolist (tmp-regexp (list "^[[:alpha:]]+"
- "^[[:alpha:]_]+"))
+ "^[[:alpha:]_]+"
+ "^[[:alpha:]]+-\\(alt\\|old\\)"))
(let ((fullpath
(concat tmp-path "/"
(and (string-match tmp-regexp dict-name)
@@ -2986,10 +2988,14 @@ Keeps argument list for future Ispell invocations for no async support."
(or ispell-local-dictionary ispell-dictionary "default"))
(sit-for 0)
(setq ispell-library-directory (ispell-check-version)
+ ;; Assign a non-nil value to ispell-process-directory
+ ;; before calling ispell-start-process, since that
+ ;; function needs it to set default-directory when
+ ;; ispell-async-processp is nil.
+ ispell-process-directory default-directory
ispell-process (ispell-start-process)
ispell-filter nil
- ispell-filter-continue nil
- ispell-process-directory default-directory)
+ ispell-filter-continue nil)
(unless (equal ispell-process-directory (expand-file-name "~/"))
;; At this point, `ispell-process-directory' will be "~/" unless using
@@ -3015,7 +3021,12 @@ Keeps argument list for future Ispell invocations for no async support."
(if (and (or (featurep 'xemacs)
(and (boundp 'enable-multibyte-characters)
enable-multibyte-characters))
- (fboundp 'set-process-coding-system))
+ (fboundp 'set-process-coding-system)
+ ;; Evidently, some people use the synchronous mode even
+ ;; when async subprocesses are supported, in which case
+ ;; set-process-coding-system is bound, but
+ ;; ispell-process is not a process object.
+ ispell-async-processp)
(set-process-coding-system ispell-process (ispell-get-coding-system)
(ispell-get-coding-system)))
;; Get version ID line
diff --git a/lisp/textmodes/reftex-cite.el b/lisp/textmodes/reftex-cite.el
index b22e8b1dcc0..17e8cfdc83c 100644
--- a/lisp/textmodes/reftex-cite.el
+++ b/lisp/textmodes/reftex-cite.el
@@ -543,7 +543,14 @@ If FORMAT is non-nil `format' entry accordingly."
(extra
(cond
((equal type "article")
- (concat (reftex-get-bib-field "journal" entry) " "
+ (concat (let ((jt (reftex-get-bib-field "journal" entry)))
+ ;; biblatex prefers the alternative journaltitle
+ ;; field, so check if that exists in case journal
+ ;; is empty.
+ (if (zerop (length jt))
+ (reftex-get-bib-field "journaltitle" entry)
+ jt))
+ " "
(reftex-get-bib-field "volume" entry) ", "
(reftex-get-bib-field "pages" entry)))
((equal type "book")
diff --git a/lisp/textmodes/reftex-toc.el b/lisp/textmodes/reftex-toc.el
index 085f2d7bdf9..d51fb9b2d4a 100644
--- a/lisp/textmodes/reftex-toc.el
+++ b/lisp/textmodes/reftex-toc.el
@@ -190,8 +190,11 @@ M-% Global search and replace to rename label at point.
x Switch to TOC of external document (with LaTeX package `xr').
z Jump to a specific section (e.g. '3 z' goes to section 3).")
+(defvar reftex--rebuilding-toc nil)
+
;;;###autoload
-(defun reftex-toc (&optional rebuild reuse)
+(defun reftex-toc (&optional _rebuild reuse)
+ ;; FIXME: Get rid of the `rebuild' argument.
"Show the table of contents for the current document.
When called with a raw C-u prefix, rescan the document first."
@@ -201,6 +204,9 @@ When called with a raw C-u prefix, rescan the document first."
(interactive)
(if (or (not (string= reftex-last-toc-master (reftex-TeX-master-file)))
+ ;; FIXME: use (interactive "P") to receive current-prefix-arg as
+ ;; an argument instead of using the var here, which forces us to set
+ ;; current-prefix-arg in the callers.
current-prefix-arg)
(reftex-erase-buffer "*toc*"))
@@ -225,7 +231,7 @@ When called with a raw C-u prefix, rescan the document first."
(docstruct-symbol reftex-docstruct-symbol)
(xr-data (assq 'xr (symbol-value reftex-docstruct-symbol)))
(xr-alist (cons (cons "" (buffer-file-name)) (nth 1 xr-data)))
- (here-I-am (if (boundp 'reftex-rebuilding-toc)
+ (here-I-am (if reftex--rebuilding-toc
(get 'reftex-toc :reftex-data)
(car (reftex-where-am-I))))
(unsplittable (if (fboundp 'frame-property)
@@ -414,17 +420,17 @@ SPC=view TAB=goto RET=goto+hide [q]uit [r]escan [l]abels [f]ollow [x]r [?]Help
(if reftex-toc-follow-mode
(setq reftex-toc-follow-mode 1)))
-(defun reftex-toc-next (&optional arg)
+(defun reftex-toc-next (&optional _arg)
"Move to next selectable item."
- (interactive "p")
+ (interactive)
(when (featurep 'xemacs) (setq zmacs-region-stays t))
(setq reftex-callback-fwd t)
(or (eobp) (forward-char 1))
(goto-char (or (next-single-property-change (point) :data)
(point))))
-(defun reftex-toc-previous (&optional arg)
+(defun reftex-toc-previous (&optional _arg)
"Move to previous selectable item."
- (interactive "p")
+ (interactive)
(when (featurep 'xemacs) (setq zmacs-region-stays t))
(setq reftex-callback-fwd nil)
(goto-char (or (previous-single-property-change (point) :data)
@@ -558,7 +564,7 @@ With prefix arg 1, restrict index to the section at point."
(reftex-display-index (if restr nil arg) restr)))
;; Rescanning the document and rebuilding the TOC buffer.
-(defun reftex-toc-rescan (&rest ignore)
+(defun reftex-toc-rescan (&rest _)
"Regenerate the *toc* buffer by reparsing file of section at point."
(interactive)
(if (and reftex-enable-partial-scans
@@ -576,12 +582,12 @@ With prefix arg 1, restrict index to the section at point."
(switch-to-buffer-other-window
(reftex-get-file-buffer-force file))
(setq current-prefix-arg '(4))
- (let ((reftex-rebuilding-toc t))
+ (let ((reftex--rebuilding-toc t))
(reftex-toc))))
(reftex-toc-Rescan))
(reftex-kill-temporary-buffers))
-(defun reftex-toc-Rescan (&rest ignore)
+(defun reftex-toc-Rescan (&rest _)
"Regenerate the *toc* buffer by reparsing the entire document."
(interactive)
(let* ((line (+ (count-lines (point-min) (point)) (if (bolp) 1 0))))
@@ -589,17 +595,17 @@ With prefix arg 1, restrict index to the section at point."
(switch-to-buffer-other-window
(reftex-get-file-buffer-force reftex-last-toc-file))
(setq current-prefix-arg '(16))
- (let ((reftex-rebuilding-toc t))
+ (let ((reftex--rebuilding-toc t))
(reftex-toc)))
-(defun reftex-toc-revert (&rest ignore)
+(defun reftex-toc-revert (&rest _)
"Regenerate the TOC from the internal lists."
(interactive)
(let ((unsplittable
(if (fboundp 'frame-property)
(frame-property (selected-frame) 'unsplittable)
(frame-parameter nil 'unsplittable)))
- (reftex-rebuilding-toc t))
+ (reftex--rebuilding-toc t))
(if unsplittable
(switch-to-buffer
(reftex-get-file-buffer-force reftex-last-toc-file))
@@ -607,9 +613,9 @@ With prefix arg 1, restrict index to the section at point."
(reftex-get-file-buffer-force reftex-last-toc-file))))
(reftex-erase-buffer "*toc*")
(setq current-prefix-arg nil)
- (reftex-toc t))
+ (reftex-toc t t))
-(defun reftex-toc-external (&rest ignore)
+(defun reftex-toc-external (&rest _)
"Switch to table of contents of an external document."
(interactive)
(reftex-toc-dframe-p nil 'error)
@@ -637,18 +643,17 @@ Useful for large TOCs."
;; Promotion/Demotion stuff
-(defvar pro-or-de)
-(defvar start-pos)
-(defvar start-line)
-(defvar mark-line)
+(defvar reftex--pro-or-de)
+(defvar reftex--start-line)
+(defvar reftex--mark-line)
-(defun reftex-toc-demote (&optional arg)
+(defun reftex-toc-demote (&optional _arg)
"Demote section at point. If region is active, apply to all in region."
- (interactive "p")
+ (interactive)
(reftex-toc-do-promote 1))
-(defun reftex-toc-promote (&optional arg)
+(defun reftex-toc-promote (&optional _arg)
"Promote section at point. If region is active, apply to all in region."
- (interactive "p")
+ (interactive)
(reftex-toc-do-promote -1))
(defun reftex-toc-do-promote (delta)
"Workhorse for `reftex-toc-promote' and `reftex-toc-demote'.
@@ -657,14 +662,15 @@ point."
;; We should not do anything unless we are sure this is going to work for
;; each section in the region. Therefore we first collect information and
;; test.
- (let* ((start-line (+ (count-lines (point-min) (point))
- (if (bolp) 1 0)))
- (mark-line (if (reftex-region-active-p)
- (save-excursion (goto-char (mark))
- (+ (count-lines (point-min) (point))
- (if (bolp) 1 0)))))
+ (let* ((reftex--start-line (+ (count-lines (point-min) (point))
+ (if (bolp) 1 0)))
+ (reftex--mark-line
+ (if (reftex-region-active-p)
+ (save-excursion (goto-char (mark))
+ (+ (count-lines (point-min) (point))
+ (if (bolp) 1 0)))))
(start-pos (point))
- (pro-or-de (if (> delta 0) "de" "pro"))
+ (reftex--pro-or-de (if (> delta 0) "de" "pro"))
beg end entries data sections nsec msg)
(setq msg
(catch 'exit
@@ -713,23 +719,23 @@ point."
;; Rescan the document and rebuilt the toc buffer
(save-window-excursion
(reftex-toc-Rescan))
- (reftex-toc-restore-region start-line mark-line)
+ (reftex-toc-restore-region reftex--start-line reftex--mark-line)
(message "%d section%s %smoted"
- nsec (if (= 1 nsec) "" "s") pro-or-de)
+ nsec (if (= 1 nsec) "" "s") reftex--pro-or-de)
nil))
(if msg (progn (ding) (message "%s" msg)))))
(defun reftex-toc-restore-region (point-line &optional mark-line)
- (let (mpos)
- (when mark-line
- (goto-char (point-min))
- (forward-line (1- mark-line))
- (setq mpos (point)))
+ (let ((mpos
+ (when mark-line
+ (goto-char (point-min))
+ (forward-line (1- mark-line))
+ (point))))
(when point-line
(goto-char (point-min))
(forward-line (1- point-line)))
- (when mark-line
+ (when mpos
(set-mark mpos)
(if (featurep 'xemacs)
(zmacs-activate-region)
@@ -749,7 +755,7 @@ promotion/demotion later. DELTA is the level change."
(name nil)
;; Here follows some paranoid code to make very sure we are not
;; going to break anything
- (name1 ; dummy
+ (_
(if (and (markerp marker) (marker-buffer marker))
;; Buffer is still live and we have the marker.
(progn
@@ -772,24 +778,24 @@ promotion/demotion later. DELTA is the level change."
;; We don't have a live marker: scan and load files.
(reftex-toc-load-all-files-for-promotion)))
(level (cdr (assoc name reftex-section-levels-all)))
- (dummy (if (not (integerp level))
- (progn
- (goto-char toc-point)
- (error "Cannot %smote special sections" pro-or-de))))
+ (_ (if (not (integerp level))
+ (progn
+ (goto-char toc-point)
+ (error "Cannot %smote special sections" reftex--pro-or-de))))
(newlevel (if (>= level 0) (+ delta level) (- level delta)))
- (dummy2 (if (or (and (>= level 0) (= newlevel -1))
- (and (< level 0) (= newlevel 0)))
- (error "Cannot %smote \\%s" pro-or-de name)))
+ (_ (if (or (and (>= level 0) (= newlevel -1))
+ (and (< level 0) (= newlevel 0)))
+ (error "Cannot %smote \\%s" reftex--pro-or-de name)))
(newname (reftex-toc-newhead-from-alist newlevel name
reftex-section-levels-all)))
(if (and name newname)
(list data name newname toc-point)
(goto-char toc-point)
- (error "Cannot %smote \\%s" pro-or-de name))))
+ (error "Cannot %smote \\%s" reftex--pro-or-de name))))
(defun reftex-toc-promote-action (x)
"Change the level of a TOC entry.
-PRO-OR-DE is assumed to be dynamically scoped into this function."
+`reftex--pro-or-de' is assumed to be dynamically scoped into this function."
(let* ((data (car x))
(name (nth 1 x))
(newname (nth 2 x))
@@ -798,7 +804,7 @@ PRO-OR-DE is assumed to be dynamically scoped into this function."
(goto-char (marker-position marker))
(if (looking-at (concat "\\([ \t]*" reftex-section-pre-regexp "\\)" (regexp-quote name)))
(replace-match (concat "\\1" newname))
- (error "Fatal error during %smotion" pro-or-de)))))
+ (error "Fatal error during %smotion" reftex--pro-or-de)))))
(defun reftex-toc-extract-section-number (entry)
"Get the numbering of a TOC entry, for message purposes."
@@ -848,11 +854,11 @@ if these sets are sorted blocks in the alist."
"Make sure all files of the document are being visited by buffers,
and that the scanning info is absolutely up to date.
We do this by rescanning with `reftex-keep-temporary-buffers' bound to t.
-The variable PRO-OR-DE is assumed to be dynamically scoped into this function.
+The variable `reftex--pro-or-de' is assumed to be dynamically scoped into this function.
When finished, we exit with an error message."
(let ((reftex-keep-temporary-buffers t))
(reftex-toc-Rescan)
- (reftex-toc-restore-region start-line mark-line)
+ (reftex-toc-restore-region reftex--start-line reftex--mark-line)
(throw 'exit
"TOC had to be updated first. Please check selection and repeat the command.")))
@@ -895,7 +901,7 @@ label prefix determines the wording of a reference."
(let* ((toc (get-text-property (point) :data))
(toc-window (selected-window))
- show-window show-buffer match)
+ match)
(unless toc (error "Don't know which TOC line to visit"))
@@ -926,30 +932,33 @@ label prefix determines the wording of a reference."
(setq match (reftex-show-label-location toc reftex-callback-fwd
no-revisit t))))
- (setq show-window (selected-window)
- show-buffer (current-buffer))
-
(unless match
(select-window toc-window)
(error "Cannot find location"))
- (select-window toc-window)
-
- ;; use the `final' parameter to decide what to do next
+ ;; Use the `final' parameter to decide what to do next.
(cond
((eq final t)
- (reftex-unhighlight 0)
- (select-window show-window))
+ (with-selected-window toc-window
+ (reftex-unhighlight 0)))
((eq final 'hide)
- (reftex-unhighlight 0)
- (or (one-window-p) (delete-window))
- ;; If `show-window' is still live, show-buffer is already visible
- ;; so let's not make it visible in yet-another-window.
- (if (window-live-p show-window)
- (set-buffer show-buffer)
- (switch-to-buffer show-buffer))
- (reftex-re-enlarge))
- (t nil))))
+ (let ((show-window (selected-window))
+ (show-buffer (window-buffer)))
+ (unless (eq show-window toc-window) ;FIXME: Can this happen?
+ (with-selected-window toc-window
+ (reftex-unhighlight 0)
+ (or (one-window-p) (delete-window))))
+ ;; If `show-window' is still live, show-buffer is already visible
+ ;; so let's not make it visible in yet-another-window.
+ (unless (window-live-p show-window)
+ ;; FIXME: How could show-window not be live?
+ (switch-to-buffer show-buffer))
+ (reftex-re-enlarge)))
+ (t
+ (unless (eq (selected-frame) (window-frame toc-window))
+ ;; Make sure `toc-window' is not just selected but has focus.
+ (select-frame-set-input-focus (window-frame toc-window)))
+ (select-window toc-window)))))
(defun reftex-toc-find-section (toc &optional no-revisit)
(let* ((file (nth 3 toc))
diff --git a/lisp/textmodes/reftex.el b/lisp/textmodes/reftex.el
index ce083c9a9a0..f1a917d5b60 100644
--- a/lisp/textmodes/reftex.el
+++ b/lisp/textmodes/reftex.el
@@ -2446,7 +2446,7 @@ of ENTRY-LIST is a list of cons cells (\"MACRONAME\" . LEVEL). See
;;;***
-;;;### (autoloads nil "reftex-cite" "reftex-cite.el" "9e0690737924aef6e3836bc2c42a36c9")
+;;;### (autoloads nil "reftex-cite" "reftex-cite.el" "83811ccf3471820f0ad0dc005ffc88d5")
;;; Generated autoloads from reftex-cite.el
(autoload 'reftex-default-bibliography "reftex-cite" "\
@@ -3046,7 +3046,7 @@ During a selection process, these are the local bindings.
;;;***
-;;;### (autoloads nil "reftex-toc" "reftex-toc.el" "8b6d6733d445a55206e84fc119909520")
+;;;### (autoloads nil "reftex-toc" "reftex-toc.el" "70daa7ce5ba54f2c8d469337f64636c1")
;;; Generated autoloads from reftex-toc.el
(autoload 'reftex-toc "reftex-toc" "\
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index c71ecb4d7a0..2ffe9c1e7ed 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -1828,6 +1828,8 @@ This takes effect when first loading the library.")
("array" (nil \n
("Item: " "<item>" str (if sgml-xml-mode "</item>") \n))
"align")
+ ("article" \n)
+ ("aside" \n)
("au")
("b")
("big")
@@ -1853,7 +1855,10 @@ This takes effect when first loading the library.")
"<dd>" (if sgml-xml-mode "</dd>") \n))
("em")
("fn" "id" "fn") ;; Footnotes were deprecated in HTML 3.2
+ ("footer" \n)
("head" \n)
+ ("header" \n)
+ ("hgroup" \n)
("html" (\n
"<head>\n"
"<title>" (setq str (read-input "Title: ")) "</title>\n"
@@ -1871,6 +1876,7 @@ This takes effect when first loading the library.")
("lang")
("li" ,(not sgml-xml-mode))
("math" \n)
+ ("nav" \n)
("nobr")
("option" t ("value") ("label") ("selected" t))
("over" t)
@@ -1880,6 +1886,7 @@ This takes effect when first loading the library.")
("rev")
("s")
("samp")
+ ("section" \n)
("small")
("span" nil
("class"
@@ -1910,6 +1917,8 @@ This takes effect when first loading the library.")
("acronym" . "Acronym")
("address" . "Formatted mail address")
("array" . "Math array")
+ ("article" . "An independent part of document or site")
+ ("aside" . "Secondary content related to surrounding content (e.g. page or article)")
("au" . "Author")
("b" . "Bold face")
("base" . "Base address for URLs")
@@ -1939,6 +1948,7 @@ This takes effect when first loading the library.")
("figt" . "Figure text")
("fn" . "Footnote") ;; No one supports special footnote rendering.
("font" . "Font size")
+ ("footer" . "Footer of a section")
("form" . "Form with input fields")
("group" . "Document grouping")
("h1" . "Most important section headline")
@@ -1948,6 +1958,8 @@ This takes effect when first loading the library.")
("h5" . "Unimportant section headline")
("h6" . "Least important section headline")
("head" . "Document header")
+ ("header" . "Header of a section")
+ ("hgroup" . "Group of headings - h1-h6 elements")
("hr" . "Horizontal rule")
("html" . "HTML Document")
("i" . "Italic face")
@@ -1960,8 +1972,9 @@ This takes effect when first loading the library.")
("li" . "List item")
("link" . "Link relationship")
("math" . "Math formula")
- ("menu" . "Menu list (obsolete)")
+ ("menu" . "List of commands")
("mh" . "Form mail header")
+ ("nav" . "Group of navigational links")
("nextid" . "Allocate new id")
("nobr" . "Text without line break")
("ol" . "Ordered list")
@@ -1975,6 +1988,7 @@ This takes effect when first loading the library.")
("rev" . "Reverse video")
("s" . "Strikeout")
("samp" . "Sample text")
+ ("section" . "Section of a document")
("select" . "Selection list")
("small" . "Font size")
("sp" . "Nobreak space")
@@ -2242,6 +2256,33 @@ HTML Autoview mode is a buffer-local minor mode for use with
"")))
\n))
+(define-skeleton html-navigational-links
+ "Group of navigational links."
+ nil
+ "<nav>" \n
+ "<ul>" \n
+ "<li><a href=\"" (skeleton-read "URL: " "#") "\">"
+ (skeleton-read "Title: ") "</a>"
+ (if sgml-xml-mode (if sgml-xml-mode "</li>")) \n
+ "</ul>" \n
+ "</nav>")
+
+(define-skeleton html-html5-template
+ "Initial HTML5 template"
+ nil
+ "<!DOCTYPE html>" \n
+ "<html lang=\"en\">" \n
+ "<head>" \n
+ "<meta charset=\"utf-8\">" \n
+ "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">" \n
+ "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" \n
+ "<title>" (skeleton-read "Page Title: ") "</title>" \n
+ "</head>" \n
+ "<body>" \n
+ "<div id=\"app\"></div>" \n
+ "</body>" \n
+ "</html>")
+
(provide 'sgml-mode)
;;; sgml-mode.el ends here
diff --git a/lisp/textmodes/text-mode.el b/lisp/textmodes/text-mode.el
index 7effa6ade59..1466556ab59 100644
--- a/lisp/textmodes/text-mode.el
+++ b/lisp/textmodes/text-mode.el
@@ -149,7 +149,8 @@ Turning on Paragraph-Indent minor mode runs the normal hook
(defalias 'indented-text-mode 'text-mode)
;; This can be made a no-op once all modes that use text-mode-hook
-;; are "derived" from text-mode.
+;; are "derived" from text-mode. (As of 2015/04, and probably well before,
+;; the only one I can find that doesn't so derive is rmail-edit-mode.)
(defun text-mode-hook-identify ()
"Mark that this mode has run `text-mode-hook'.
This is how `toggle-text-mode-auto-fill' knows which buffers to operate on."
diff --git a/lisp/url/url-handlers.el b/lisp/url/url-handlers.el
index ff3eafd19da..001a7831ad5 100644
--- a/lisp/url/url-handlers.el
+++ b/lisp/url/url-handlers.el
@@ -344,14 +344,14 @@ They count bytes from the beginning of the body."
(put 'insert-file-contents 'url-file-handlers 'url-insert-file-contents)
-(defun url-file-name-completion (url directory &optional predicate)
+(defun url-file-name-completion (url _directory &optional _predicate)
;; Even if it's not implemented, it's not an error to ask for completion,
;; in case it's available (bug#14806).
;; (error "Unimplemented")
url)
(put 'file-name-completion 'url-file-handlers 'url-file-name-completion)
-(defun url-file-name-all-completions (file directory)
+(defun url-file-name-all-completions (_file _directory)
;; Even if it's not implemented, it's not an error to ask for completion,
;; in case it's available (bug#14806).
;; (error "Unimplemented")
diff --git a/lisp/url/url-http.el b/lisp/url/url-http.el
index d766952ebf3..6a7d8e2c947 100644
--- a/lisp/url/url-http.el
+++ b/lisp/url/url-http.el
@@ -485,6 +485,8 @@ work correctly."
)
)
+(declare-function gnutls-peer-status "gnutls.c" (proc))
+
(defun url-http-parse-headers ()
"Parse and handle HTTP specific headers.
Return t if and only if the current buffer is still active and
diff --git a/lisp/vc/ediff-util.el b/lisp/vc/ediff-util.el
index 62a0d9da0ab..260366e242a 100644
--- a/lisp/vc/ediff-util.el
+++ b/lisp/vc/ediff-util.el
@@ -2318,6 +2318,7 @@ the number seen by the user."
(narrow-to-region
(ediff-get-diff-posn 'B 'beg n ctl-buf)
(ediff-get-diff-posn 'B 'end n ctl-buf))
+ (goto-char (point-min))
(re-search-forward regex-B nil t))))
(reg-C-match (if ediff-3way-comparison-job
(ediff-with-current-buffer ediff-buffer-C
@@ -2325,6 +2326,7 @@ the number seen by the user."
(narrow-to-region
(ediff-get-diff-posn 'C 'beg n ctl-buf)
(ediff-get-diff-posn 'C 'end n ctl-buf))
+ (goto-char (point-min))
(re-search-forward regex-C nil t))))))
(not (eval (if ediff-3way-comparison-job
(list ediff-focus-regexp-connective
diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el
index f82c7e9052e..08ae998200b 100644
--- a/lisp/vc/log-edit.el
+++ b/lisp/vc/log-edit.el
@@ -717,6 +717,9 @@ can thus take some time."
(defvar log-edit-changelog-use-first nil)
+(defvar log-edit-rewrite-tiny-change t
+ "Non-nil means rewrite (tiny change).")
+
(defvar log-edit-rewrite-fixes nil
"Rule to rewrite bug numbers into Fixes: headers.
The value should be of the form (REGEXP . REPLACEMENT)
@@ -761,7 +764,7 @@ regardless of user name or time."
(log-edit-insert-changelog-entries (log-edit-files)))))
(log-edit-set-common-indentation)
;; Add an Author: field if appropriate.
- (when author (log-edit-add-field "Author" author))
+ (when author (log-edit-add-field "Author" (car author)))
;; Add a Fixes: field if applicable.
(when (consp log-edit-rewrite-fixes)
(rfc822-goto-eoh)
@@ -782,7 +785,13 @@ regardless of user name or time."
(goto-char start)
(skip-chars-forward "^():")
(skip-chars-forward ": ")
- (delete-region start (point))))))))
+ (delete-region start (point)))))
+ ;; FIXME also add "Co-authored-by" when appropriate.
+ ;; Bzr accepts multiple --author arguments, others (?) don't.
+ (and log-edit-rewrite-tiny-change
+ (eq 'tiny (cdr author))
+ (goto-char (point-max))
+ (insert "\nCopyright-paperwork-exempt: yes\n")))))
;;;;
;;;; functions for getting commit message from ChangeLog a file...
@@ -868,19 +877,26 @@ Return non-nil if it is."
(if (null log-edit-changelog-use-first)
(looking-at (regexp-quote (format "%s %s <%s>" time name mail)))
;; Check the author, to potentially add it as a "Author: " header.
+ ;; FIXME This accumulates multiple authors, but only when there
+ ;; are multiple ChangeLog files. It should also check for
+ ;; multiple authors in each individual entry.
(when (looking-at "[^ \t]")
(when (and (boundp 'log-edit-author)
(not (looking-at (format ".+ .+ <%s>"
(regexp-quote mail))))
- (looking-at ".+ \\(.+ <.+>\\)"))
+ (looking-at ".+ \\(.+ <.+>\\) *\\((tiny change)\\)?"))
(let ((author (replace-regexp-in-string " " " "
(match-string 1))))
(unless (and log-edit-author
- (string-match (regexp-quote author) log-edit-author))
- (setq log-edit-author
- (if log-edit-author
- (concat log-edit-author ", " author)
- author)))))
+ (string-match (regexp-quote author)
+ (car log-edit-author)))
+ (if (not log-edit-author)
+ (setq log-edit-author
+ (cons author (if (match-string 2) 'tiny)))
+ (setcar log-edit-author
+ (concat (car log-edit-author) ", " author))
+ (and (match-string 2) (not (cdr log-edit-author))
+ (setcdr log-edit-author 'tiny))))))
t))))
(defun log-edit-changelog-entries (file)
diff --git a/lisp/vc/vc-bzr.el b/lisp/vc/vc-bzr.el
index 811f9e80b0c..c9508251c8d 100644
--- a/lisp/vc/vc-bzr.el
+++ b/lisp/vc/vc-bzr.el
@@ -335,29 +335,31 @@ in the repository root directory of FILE."
(declare-function vc-set-async-update "vc-dispatcher" (process-buffer))
(declare-function vc-compilation-mode "vc-dispatcher" (backend))
-(defun vc-bzr-pull (prompt)
- "Pull changes into the current Bzr branch.
-Normally, this runs \"bzr pull\". However, if the branch is a
-bound branch, run \"bzr update\" instead. If there is no default
-location from which to pull or update, or if PROMPT is non-nil,
-prompt for the Bzr command to run."
+(defun vc-bzr--pushpull (command prompt)
+ "Run COMMAND (a string; either push or pull) on the current Bzr branch.
+If PROMPT is non-nil, prompt for the Bzr command to run."
(let* ((vc-bzr-program vc-bzr-program)
(branch-conf (vc-bzr-branch-conf default-directory))
;; Check whether the branch is bound.
(bound (assoc "bound" branch-conf))
(bound (and bound (equal "true" (downcase (cdr bound)))))
- ;; If we need to do a "bzr pull", check for a parent. If it
- ;; does not exist, bzr will need a pull location.
- (has-parent (unless bound
- (assoc "parent_location" branch-conf)))
- (command (if bound "update" "pull"))
+ (has-loc (assoc (if (equal command "push")
+ "push_location"
+ "parent_location")
+ branch-conf))
args)
+ (when bound
+ (if (equal command "push")
+ (user-error "Cannot push a bound branch")
+ (setq command "update")))
;; If necessary, prompt for the exact command.
- (when (or prompt (not (or bound has-parent)))
+ (when (or prompt (if (equal command "push")
+ (not has-loc)
+ (not (or bound has-loc))))
(setq args (split-string
(read-shell-command
- "Bzr pull command: "
- (concat vc-bzr-program " " command)
+ (format "Bzr %s command: " command)
+ (format "%s %s" vc-bzr-program command)
'vc-bzr-history)
" " t))
(setq vc-bzr-program (car args)
@@ -368,6 +370,20 @@ prompt for the Bzr command to run."
(with-current-buffer buf (vc-run-delayed (vc-compilation-mode 'bzr)))
(vc-set-async-update buf))))
+(defun vc-bzr-pull (prompt)
+ "Pull changes into the current Bzr branch.
+Normally, this runs \"bzr pull\". However, if the branch is a
+bound branch, run \"bzr update\" instead. If there is no default
+location from which to pull or update, or if PROMPT is non-nil,
+prompt for the Bzr command to run."
+ (vc-bzr--pushpull "pull" prompt))
+
+(defun vc-bzr-push (prompt)
+ "Push changes from the current Bzr branch.
+Normally, this runs \"bzr push\". If there is no push location,
+or if PROMPT is non-nil, prompt for the Bzr command to run."
+ (vc-bzr--pushpull "push" prompt))
+
(defun vc-bzr-merge-branch ()
"Merge another Bzr branch into the current one.
Prompt for the Bzr command to run, providing a pre-defined merge
@@ -873,7 +889,7 @@ property containing author and date information."
(move-marker (process-mark proc) (point))))
(process-put proc :vc-left-over string)))))))
-(declare-function vc-annotate-convert-time "vc-annotate" (time))
+(declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
(defun vc-bzr-annotate-time ()
(when (re-search-forward "^ *[0-9.]+ +.+? +|" nil t)
@@ -954,6 +970,12 @@ stream. Standard error output is discarded."
(translated nil)
(result nil))
(goto-char (point-min))
+ ;; Skip a warning message that can occur in some bzr installations.
+ ;; vc-bzr-dir-extra-headers already reports it.
+ ;; Perhaps we should just discard stderr?
+ (and (looking-at "bzr: WARNING: bzrlib version doesn't match")
+ (re-search-forward "^bzr is version" nil t)
+ (forward-line 1))
(while (not (eobp))
;; Bzr 2.3.0 added this if there are shelves. (Bug#8170)
(unless (looking-at "[0-9]+ shel\\(f\\|ves\\) exists?\\.")
diff --git a/lisp/vc/vc-cvs.el b/lisp/vc/vc-cvs.el
index 232dcc2185e..9a41905abd2 100644
--- a/lisp/vc/vc-cvs.el
+++ b/lisp/vc/vc-cvs.el
@@ -651,7 +651,7 @@ Optional arg REVISION is a revision to annotate from."
(re-search-forward vc-cvs-annotate-first-line-re)
(delete-region (point-min) (1- (point)))))))
-(declare-function vc-annotate-convert-time "vc-annotate" (time))
+(declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
(defun vc-cvs-annotate-current-time ()
"Return the current time, based at midnight of the current day, and
diff --git a/lisp/vc/vc-dir.el b/lisp/vc/vc-dir.el
index e050c947504..eb03a8b45a7 100644
--- a/lisp/vc/vc-dir.el
+++ b/lisp/vc/vc-dir.el
@@ -111,7 +111,7 @@ See `run-hooks'."
(current-buffer)))))
(defvar vc-dir-menu-map
- (let ((map (make-sparse-keymap "VC-dir")))
+ (let ((map (make-sparse-keymap "VC-Dir")))
(define-key map [quit]
'(menu-item "Quit" quit-window
:help "Quit"))
@@ -204,6 +204,10 @@ See `run-hooks'."
:help "List the change log for the current tree in a window"))
;; VC commands.
(define-key map [sepvccmd] '("--"))
+ (define-key map [push]
+ '(menu-item "Push Changes" vc-push
+ :enable (vc-find-backend-function vc-dir-backend 'push)
+ :help "Push the current branch's changes"))
(define-key map [update]
'(menu-item "Update to Latest Version" vc-update
:help "Update the current fileset's files to their tip revisions"))
@@ -246,6 +250,8 @@ See `run-hooks'."
(define-key map "D" 'vc-root-diff) ;; C-x v D
(define-key map "i" 'vc-register) ;; C-x v i
(define-key map "+" 'vc-update) ;; C-x v +
+ ;; I'd prefer some kind of symmetry with vc-update:
+ (define-key map "P" 'vc-push) ;; C-x v P
(define-key map "l" 'vc-print-log) ;; C-x v l
(define-key map "L" 'vc-print-root-log) ;; C-x v L
(define-key map "I" 'vc-log-incoming) ;; C-x v I
@@ -294,7 +300,7 @@ See `run-hooks'."
`(menu-item
;; VC backends can use this to add mode-specific menu items to
;; vc-dir-menu-map.
- "VC-dir" ,vc-dir-menu-map :filter vc-dir-menu-map-filter))
+ "VC-Dir" ,vc-dir-menu-map :filter vc-dir-menu-map-filter))
map)
"Keymap for directory buffer.")
diff --git a/lisp/vc/vc-git.el b/lisp/vc/vc-git.el
index c8b696a03bb..cbf3da3003f 100644
--- a/lisp/vc/vc-git.el
+++ b/lisp/vc/vc-git.el
@@ -117,8 +117,7 @@ If nil, use the value of `vc-diff-switches'. If t, use no switches."
(const :tag "None" t)
(string :tag "Argument String")
(repeat :tag "Argument List" :value ("") string))
- :version "23.1"
- :group 'vc-git)
+ :version "23.1")
(defcustom vc-git-annotate-switches nil
"String or list of strings specifying switches for Git blame under VC.
@@ -127,14 +126,24 @@ If nil, use the value of `vc-annotate-switches'. If t, use no switches."
(const :tag "None" t)
(string :tag "Argument String")
(repeat :tag "Argument List" :value ("") string))
- :version "25.1"
- :group 'vc-git)
+ :version "25.1")
+
+(defcustom vc-git-resolve-conflicts t
+ "When non-nil, mark conflicted file as resolved upon saving.
+That is performed after all conflict markers in it have been
+removed. If the value is `unstage-maybe', and no merge is in
+progress, then after the last conflict is resolved, also clear
+the staging area."
+ :type '(choice (const :tag "Don't resolve" nil)
+ (const :tag "Resolve" t)
+ (const :tag "Resolve and maybe unstage all files"
+ unstage-maybe))
+ :version "25.1")
(defcustom vc-git-program "git"
"Name of the Git executable (excluding any arguments)."
:version "24.1"
- :type 'string
- :group 'vc-git)
+ :type 'string)
(defcustom vc-git-root-log-format
'("%d%h..: %an %ad %s"
@@ -154,7 +163,6 @@ format string (which is passed to \"git log\" via the argument
matching the resulting Git log output, and KEYWORDS is a list of
`font-lock-keywords' for highlighting the Log View buffer."
:type '(list string string (repeat sexp))
- :group 'vc-git
:version "24.1")
(defvar vc-git-commits-coding-system 'utf-8
@@ -721,21 +729,21 @@ It is based on `log-edit-mode', and has Git-specific extensions.")
;; To be called via vc-pull from vc.el, which requires vc-dispatcher.
(declare-function vc-compilation-mode "vc-dispatcher" (backend))
-(defun vc-git-pull (prompt)
- "Pull changes into the current Git branch.
-Normally, this runs \"git pull\". If PROMPT is non-nil, prompt
-for the Git command to run."
+(defun vc-git--pushpull (command prompt)
+ "Run COMMAND (a string; either push or pull) on the current Git branch.
+If PROMPT is non-nil, prompt for the Git command to run."
(let* ((root (vc-git-root default-directory))
(buffer (format "*vc-git : %s*" (expand-file-name root)))
- (command "pull")
(git-program vc-git-program)
args)
;; If necessary, prompt for the exact command.
+ ;; TODO if pushing, prompt if no default push location - cf bzr.
(when prompt
(setq args (split-string
- (read-shell-command "Git pull command: "
- (format "%s pull" git-program)
- 'vc-git-history)
+ (read-shell-command
+ (format "Git %s command: " command)
+ (format "%s %s" git-program command)
+ 'vc-git-history)
" " t))
(setq git-program (car args)
command (cadr args)
@@ -745,6 +753,18 @@ for the Git command to run."
(with-current-buffer buffer (vc-run-delayed (vc-compilation-mode 'git)))
(vc-set-async-update buffer)))
+(defun vc-git-pull (prompt)
+ "Pull changes into the current Git branch.
+Normally, this runs \"git pull\". If PROMPT is non-nil, prompt
+for the Git command to run."
+ (vc-git--pushpull "pull" prompt))
+
+(defun vc-git-push (prompt)
+ "Push changes from the current Git branch.
+Normally, this runs \"git push\". If PROMPT is non-nil, prompt
+for the Git command to run."
+ (vc-git--pushpull "push" prompt))
+
(defun vc-git-merge-branch ()
"Merge changes into the current Git branch.
This prompts for a branch to merge from."
@@ -789,12 +809,14 @@ This prompts for a branch to merge from."
(save-excursion
(goto-char (point-min))
(unless (re-search-forward "^<<<<<<< " nil t)
- (if (file-exists-p (expand-file-name ".git/MERGE_HEAD"
- (vc-git-root buffer-file-name)))
- ;; Doing a merge.
- (vc-git-command nil 0 buffer-file-name "add")
- ;; Doing something else. Likely applying a stash (bug#20292).
- (vc-git-command nil 0 buffer-file-name "reset"))
+ (vc-git-command nil 0 buffer-file-name "add")
+ (unless (or
+ (not (eq vc-git-resolve-conflicts 'unstage-maybe))
+ ;; Doing a merge, so bug#20292 doesn't apply.
+ (file-exists-p (expand-file-name ".git/MERGE_HEAD"
+ (vc-git-root buffer-file-name)))
+ (vc-git-conflicted-files (vc-git-root buffer-file-name)))
+ (vc-git-command nil 0 nil "reset"))
;; Remove the hook so that it is not called multiple times.
(remove-hook 'after-save-hook 'vc-git-resolve-when-done t))))
@@ -811,7 +833,8 @@ This prompts for a branch to merge from."
(re-search-forward "^<<<<<<< " nil 'noerror)))
(vc-file-setprop buffer-file-name 'vc-state 'conflict)
(smerge-start-session)
- (add-hook 'after-save-hook 'vc-git-resolve-when-done nil 'local)
+ (when vc-git-resolve-conflicts
+ (add-hook 'after-save-hook 'vc-git-resolve-when-done nil 'local))
(message "There are unresolved conflicts in this file")))
;;; HISTORY FUNCTIONS
@@ -1031,17 +1054,19 @@ or BRANCH^ (where \"^\" can be repeated)."
(defun vc-git-annotate-command (file buf &optional rev)
(let ((name (file-relative-name file)))
- (apply #'vc-git-command buf 'async nil "blame" "--date=iso"
+ (apply #'vc-git-command buf 'async nil "blame" "--date=short"
(append (vc-switches 'git 'annotate)
(list rev "--" name)))))
-(declare-function vc-annotate-convert-time "vc-annotate" (time))
+(declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
(defun vc-git-annotate-time ()
- (and (re-search-forward "[0-9a-f]+[^()]+(.* \\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) \\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\) +[0-9]+) " nil t)
+ (and (re-search-forward "^[0-9a-f]+[^()]+(.*?\\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\) \\(:?\\([0-9]+\\):\\([0-9]+\\):\\([0-9]+\\) \\([-+0-9]+\\)\\)? *[0-9]+) " nil t)
(vc-annotate-convert-time
(apply #'encode-time (mapcar (lambda (match)
- (string-to-number (match-string match)))
+ (if (match-beginning match)
+ (string-to-number (match-string match))
+ 0))
'(6 5 4 3 2 1 7))))))
(defun vc-git-annotate-extract-revision-at-line ()
diff --git a/lisp/vc/vc-hg.el b/lisp/vc/vc-hg.el
index c841dfcdf54..556174a3821 100644
--- a/lisp/vc/vc-hg.el
+++ b/lisp/vc/vc-hg.el
@@ -373,7 +373,7 @@ Optional arg REVISION is a revision to annotate from."
(append (vc-switches 'hg 'annotate)
(if revision (list (concat "-r" revision))))))
-(declare-function vc-annotate-convert-time "vc-annotate" (time))
+(declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
;; The format for one line output by "hg annotate -d -n" looks like this:
;;215 Wed Jun 20 21:22:58 2007 -0700: CONTENTS
@@ -659,20 +659,6 @@ REV is the revision to check out into WORKFILE."
(vc-hg-command buffer 1 nil "outgoing" "-n" (unless (string= remote-location "")
remote-location)))
-(declare-function log-view-get-marked "log-view" ())
-
-;; XXX maybe also add key bindings for these functions.
-(defun vc-hg-push ()
- (interactive)
- (let ((marked-list (log-view-get-marked)))
- (if marked-list
- (apply #'vc-hg-command
- nil 0 nil
- "push"
- (apply 'nconc
- (mapcar (lambda (arg) (list "-r" arg)) marked-list)))
- (error "No log entries selected for push"))))
-
(defvar vc-hg-error-regexp-alist nil
;; 'hg pull' does not list modified files, so, for now, the only
;; benefit of `vc-compilation-mode' is that one can get rid of
@@ -682,51 +668,70 @@ REV is the revision to check out into WORKFILE."
"Value of `compilation-error-regexp-alist' in *vc-hg* buffers.")
(autoload 'vc-do-async-command "vc-dispatcher")
+(autoload 'log-view-get-marked "log-view")
-(defun vc-hg-pull (prompt)
- "Issue a Mercurial pull command.
-If called interactively with a set of marked Log View buffers,
-call \"hg pull -r REVS\" to pull in the specified revisions REVS.
-
-With a prefix argument or if PROMPT is non-nil, prompt for a
-specific Mercurial pull command. The default is \"hg pull -u\",
-which fetches changesets from the default remote repository and
-then attempts to update the working directory."
- (interactive "P")
+(defun vc-hg--pushpull (command prompt &optional obsolete)
+ "Run COMMAND (a string; either push or pull) on the current Hg branch.
+If PROMPT is non-nil, prompt for the Hg command to run.
+If OBSOLETE is non-nil, behave like the old versions of the Hg push/pull
+commands, which only operated on marked files."
(let (marked-list)
- ;; The `vc-hg-pull' command existed before the `pull' VC action
- ;; was implemented. Keep it for backward compatibility.
- (if (and (called-interactively-p 'interactive)
- (setq marked-list (log-view-get-marked)))
+ ;; The `vc-hg-pull' and `vc-hg-push' commands existed before the
+ ;; `pull'/`push' VC actions were implemented.
+ ;; The following is for backwards compatibility.
+ (if (and obsolete (setq marked-list (log-view-get-marked)))
(apply #'vc-hg-command
nil 0 nil
- "pull"
+ command
(apply 'nconc
- (mapcar (lambda (arg) (list "-r" arg))
- marked-list)))
+ (mapcar (lambda (arg) (list "-r" arg)) marked-list)))
(let* ((root (vc-hg-root default-directory))
(buffer (format "*vc-hg : %s*" (expand-file-name root)))
- (command "pull")
(hg-program vc-hg-program)
;; Fixme: before updating the working copy to the latest
;; state, should check if it's visiting an old revision.
- (args '("-u")))
+ (args (if (equal command "pull") '("-u"))))
;; If necessary, prompt for the exact command.
+ ;; TODO if pushing, prompt if no default push location - cf bzr.
(when prompt
(setq args (split-string
- (read-shell-command "Run Hg (like this): "
- (format "%s pull -u" hg-program)
- 'vc-hg-history)
+ (read-shell-command
+ (format "Hg %s command: " command)
+ (format "%s %s%s" hg-program command
+ (if (not args) ""
+ (concat " " (mapconcat 'identity args " "))))
+ 'vc-hg-history)
" " t))
(setq hg-program (car args)
command (cadr args)
args (cddr args)))
- (apply 'vc-do-async-command buffer root hg-program
- command args)
+ (apply 'vc-do-async-command buffer root hg-program command args)
(with-current-buffer buffer
(vc-run-delayed (vc-compilation-mode 'hg)))
(vc-set-async-update buffer)))))
+(defun vc-hg-pull (prompt)
+ "Issue a Mercurial pull command.
+If called interactively with a set of marked Log View buffers,
+call \"hg pull -r REVS\" to pull in the specified revisions REVS.
+
+With a prefix argument or if PROMPT is non-nil, prompt for a
+specific Mercurial pull command. The default is \"hg pull -u\",
+which fetches changesets from the default remote repository and
+then attempts to update the working directory."
+ (interactive "P")
+ (vc-hg--pushpull "pull" prompt (called-interactively-p 'interactive)))
+
+(defun vc-hg-push (prompt)
+ "Push changes from the current Mercurial branch.
+Normally, this runs \"hg push\". If PROMPT is non-nil, prompt
+for the Hg command to run.
+
+If called interactively with a set of marked Log View buffers,
+call \"hg push -r REVS\" to push the specified revisions REVS."
+ (interactive "P")
+ (vc-hg--pushpull "push" prompt (called-interactively-p 'interactive)))
+
(defun vc-hg-merge-branch ()
"Merge incoming changes into the current working directory.
This runs the command \"hg merge\"."
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el
index 251fecb49c0..bae991936b5 100644
--- a/lisp/vc/vc-hooks.el
+++ b/lisp/vc/vc-hooks.el
@@ -883,6 +883,8 @@ current, and kill the buffer that visits the link."
(define-key map "u" 'vc-revert)
(define-key map "v" 'vc-next-action)
(define-key map "+" 'vc-update)
+ ;; I'd prefer some kind of symmetry with vc-update:
+ (define-key map "P" 'vc-push)
(define-key map "=" 'vc-diff)
(define-key map "D" 'vc-root-diff)
(define-key map "~" 'vc-revision-other-window)
@@ -940,6 +942,10 @@ current, and kill the buffer that visits the link."
(bindings--define-key map [vc-revert]
'(menu-item "Revert to Base Version" vc-revert
:help "Revert working copies of the selected file set to their repository contents"))
+ ;; TODO Only :enable if (vc-find-backend-function backend 'push)
+ (bindings--define-key map [vc-push]
+ '(menu-item "Push Changes" vc-push
+ :help "Push the current branch's changes"))
(bindings--define-key map [vc-update]
'(menu-item "Update to Latest Version" vc-update
:help "Update the current fileset's files to their tip revisions"))
diff --git a/lisp/vc/vc-mtn.el b/lisp/vc/vc-mtn.el
index cd84ebe7afa..93bd1f6a83f 100644
--- a/lisp/vc/vc-mtn.el
+++ b/lisp/vc/vc-mtn.el
@@ -261,7 +261,7 @@ If LIMIT is non-nil, show no more than this many entries."
(append (vc-switches 'mtn 'annotate)
(if rev (list "-r" rev)))))
-(declare-function vc-annotate-convert-time "vc-annotate" (time))
+(declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
(defconst vc-mtn-annotate-full-re
"^ *\\([0-9a-f]+\\)\\.* by [^ ]+ \\([0-9]+\\)-\\([0-9]+\\)-\\([0-9]+\\): ")
diff --git a/lisp/vc/vc-rcs.el b/lisp/vc/vc-rcs.el
index 8aedc00269d..1e1990890a2 100644
--- a/lisp/vc/vc-rcs.el
+++ b/lisp/vc/vc-rcs.el
@@ -758,7 +758,7 @@ Optional arg REVISION is a revision to annotate from."
(insert (gethash (get-text-property (point) :vc-rcs-r/d/a) ht))
(forward-line 1))))
-(declare-function vc-annotate-convert-time "vc-annotate" (time))
+(declare-function vc-annotate-convert-time "vc-annotate" (&optional time))
(defun vc-rcs-annotate-current-time ()
"Return the current time, based at midnight of the current day, and
diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el
index bb4dd607bdd..d5d0abe6517 100644
--- a/lisp/vc/vc.el
+++ b/lisp/vc/vc.el
@@ -2224,8 +2224,10 @@ earlier revisions. Show up to LIMIT entries (non-nil means unlimited)."
(lambda (_bk _files-arg ret)
(vc-print-log-setup-buttons working-revision
is-start-revision limit ret))
- (lambda (bk)
- (vc-call-backend bk 'show-log-entry working-revision))
+ ;; When it's nil, point really shouldn't move (bug#15322).
+ (when working-revision
+ (lambda (bk)
+ (vc-call-backend bk 'show-log-entry working-revision)))
(lambda (_ignore-auto _noconfirm)
(vc-print-log-internal backend files working-revision
is-start-revision limit)))))
@@ -2263,8 +2265,9 @@ earlier revisions. Show up to LIMIT entries (non-nil means unlimited)."
(let ((inhibit-read-only t))
(funcall setup-buttons-func backend files retval)
(shrink-window-if-larger-than-buffer)
- (funcall goto-location-func backend)
- (setq vc-sentinel-movepoint (point))
+ (when goto-location-func
+ (funcall goto-location-func backend)
+ (setq vc-sentinel-movepoint (point)))
(set-buffer-modified-p nil)))))
(defun vc-incoming-outgoing-internal (backend remote-location buffer-name type)
@@ -2273,7 +2276,7 @@ earlier revisions. Show up to LIMIT entries (non-nil means unlimited)."
(lambda (bk buf type-arg _files)
(vc-call-backend bk type-arg buf remote-location))
(lambda (_bk _files-arg _ret) nil)
- (lambda (_bk) (goto-char (point-min)))
+ nil ;; Don't move point.
(lambda (_ignore-auto _noconfirm)
(vc-incoming-outgoing-internal backend remote-location buffer-name type))))
@@ -2328,16 +2331,15 @@ When called interactively with a prefix argument, prompt for LIMIT."
(list (when (> vc-log-show-limit 0) vc-log-show-limit)))))
(let ((backend (vc-deduce-backend))
(default-directory default-directory)
- rootdir working-revision)
+ rootdir)
(if backend
(setq rootdir (vc-call-backend backend 'root default-directory))
(setq rootdir (read-directory-name "Directory for VC root-log: "))
(setq backend (vc-responsible-backend rootdir))
(unless backend
(error "Directory is not version controlled")))
- (setq working-revision (vc-working-revision rootdir)
- default-directory rootdir)
- (vc-print-log-internal backend (list rootdir) working-revision nil limit)))
+ (setq default-directory rootdir)
+ (vc-print-log-internal backend (list rootdir) nil nil limit)))
;;;###autoload
(defun vc-log-incoming (&optional remote-location)
@@ -2482,6 +2484,22 @@ tip revision are merged into the working file."
;;;###autoload
(defalias 'vc-update 'vc-pull)
+;;;###autoload
+(defun vc-push (&optional arg)
+ "Push the current branch.
+You must be visiting a version controlled file, or in a `vc-dir' buffer.
+On a distributed version control system, this runs a \"push\"
+operation on the current branch, prompting for the precise command
+if required. Optional prefix ARG non-nil forces a prompt.
+On a non-distributed version control system, this signals an error."
+ (interactive "P")
+ (let* ((vc-fileset (vc-deduce-fileset t))
+ (backend (car vc-fileset)))
+;;; (files (cadr vc-fileset)))
+ (if (vc-find-backend-function backend 'push)
+ (vc-call-backend backend 'push arg)
+ (user-error "VC push is unsupported for `%s'" backend))))
+
(defun vc-version-backup-file (file &optional rev)
"Return name of backup file for revision REV of FILE.
If version backups should be used for FILE, and there exists
diff --git a/lisp/w32-fns.el b/lisp/w32-fns.el
index 876df875b1b..6f8fa840bd3 100644
--- a/lisp/w32-fns.el
+++ b/lisp/w32-fns.el
@@ -44,7 +44,7 @@
(or (bound-and-true-p shell-file-name)
(getenv "ESHELL")
(getenv "SHELL")
- (and (w32-using-nt) "cmd.exe")
+ (and (fboundp 'w32-using-nt) (w32-using-nt) "cmd.exe")
"command.com"))
(defun w32-system-shell-p (shell-name)
diff --git a/lisp/whitespace.el b/lisp/whitespace.el
index b4cd67ff6b9..fad3e2f3ea6 100644
--- a/lisp/whitespace.el
+++ b/lisp/whitespace.el
@@ -538,31 +538,34 @@ cleaning up a buffer. See `whitespace-cleanup' and
`whitespace-cleanup-region' for documentation.
See also `whitespace-display-mappings' for documentation."
- :type '(repeat :tag "Kind of Blank"
- (choice :tag "Kind of Blank Face"
- (const :tag "(Face) Face visualization"
- face)
- (const :tag "(Face) Trailing TABs, SPACEs and HARD SPACEs"
- trailing)
- (const :tag "(Face) SPACEs and HARD SPACEs"
- spaces)
- (const :tag "(Face) TABs" tabs)
- (const :tag "(Face) Lines" lines)
- (const :tag "(Face) SPACEs before TAB"
- space-before-tab)
- (const :tag "(Face) NEWLINEs" newline)
- (const :tag "(Face) Indentation SPACEs"
- indentation)
- (const :tag "(Face) Too much line indentation"
- big-indent)
- (const :tag "(Face) Empty Lines At BOB And/Or EOB"
- empty)
- (const :tag "(Face) SPACEs after TAB"
- space-after-tab)
- (const :tag "(Mark) SPACEs and HARD SPACEs"
- space-mark)
- (const :tag "(Mark) TABs" tab-mark)
- (const :tag "(Mark) NEWLINEs" newline-mark)))
+ :type '(set :tag "Kind of Blank"
+ (const :tag "(Face) Face visualization" face)
+ (const :tag "(Face) Trailing TABs, SPACEs and HARD SPACEs"
+ trailing)
+ (const :tag "(Face) TABs" tabs)
+ (const :tag "(Face) SPACEs and HARD SPACEs" spaces)
+ (const :tag "(Face) Lines" lines)
+ (const :tag "(Face) Lines, only overlong part" lines-tail)
+ (const :tag "(Face) NEWLINEs" newline)
+ (const :tag "(Face) Empty Lines At BOB And/Or EOB" empty)
+ (const :tag "(Face) Indentation SPACEs" indentation::tab)
+ (const :tag "(Face) Indentation TABs"
+ indentation::space)
+ (const :tag "(Face) Indentation TABs or SPACEs" indentation)
+ (const :tag "(Face) Too much line indentation" big-indent)
+ (const :tag "(Face) SPACEs after TAB: SPACEs"
+ space-after-tab::tab)
+ (const :tag "(Face) SPACEs after TAB: TABs"
+ space-after-tab::space)
+ (const :tag "(Face) SPACEs after TAB" space-after-tab)
+ (const :tag "(Face) SPACEs before TAB: SPACEs"
+ space-before-tab::tab)
+ (const :tag "(Face) SPACEs before TAB: TABs"
+ space-before-tab::space)
+ (const :tag "(Face) SPACEs before TAB" space-before-tab)
+ (const :tag "(Mark) SPACEs and HARD SPACEs" space-mark)
+ (const :tag "(Mark) TABs" tab-mark)
+ (const :tag "(Mark) NEWLINEs" newline-mark))
:group 'whitespace)
(defvar whitespace-space 'whitespace-space
diff --git a/lisp/window.el b/lisp/window.el
index a6c60e9805d..49b7e2cc55d 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -1835,6 +1835,8 @@ optional argument PIXELWISE is passed to the functions."
(window-body-width window pixelwise)
(window-body-height window pixelwise)))
+(declare-function font-info "font.c" (name &optional frame))
+
(defun window-font-width (&optional window face)
"Return average character width for the font of FACE used in WINDOW.
WINDOW must be a live window and defaults to the selected one.
@@ -1866,6 +1868,8 @@ information for the remapped face."
(aref info 3))
(frame-char-height))))
+(defvar overflow-newline-into-fringe)
+
(defun window-max-chars-per-line (&optional window face)
"Return the number of characters that can be displayed on one line in WINDOW.
WINDOW must be a live window and defaults to the selected one.
@@ -7187,6 +7191,8 @@ See also `fit-frame-to-buffer-margins'."
(<= left (- right margin)) (<= margin right))
margin))
+(declare-function tool-bar-height "xdisp.c" (&optional frame pixelwise))
+
(defun fit-frame-to-buffer (&optional frame max-height min-height max-width min-width only)
"Adjust size of FRAME to display the contents of its buffer exactly.
FRAME can be any live frame and defaults to the selected one.
diff --git a/lwlib/Makefile.in b/lwlib/Makefile.in
index 7c91fb3a21c..cbc747cbbac 100644
--- a/lwlib/Makefile.in
+++ b/lwlib/Makefile.in
@@ -71,10 +71,15 @@ am__v_at_0 = @
am__v_at_1 =
DEPDIR = deps
-## -MMD -MF $(DEPDIR)/$*.d if AUTO_DEPEND; else empty.
-DEPFLAGS = @DEPFLAGS@
-## ${MKDIR_P} ${DEPDIR} (if AUTO_DEPEND); else ':'.
-MKDEPDIR = @MKDEPDIR@
+AUTO_DEPEND = @AUTO_DEPEND@
+
+ifeq ($(AUTO_DEPEND),yes)
+DEPFLAGS = -MMD -MF ${DEPDIR}/$*.d -MP
+MKDEPDIR = ${MKDIR_P} ${DEPDIR}
+else
+DEPFLAGS =
+MKDEPDIR = :
+endif
## ../src is where the generated file (config.h, globals.h) are.
## $(srcdir)/../src is where the non-generated files (lisp.h) are.
@@ -104,8 +109,11 @@ globals_h = ../src/globals.h
$(globals_h):
$(MAKE) -C ../src globals.h
-## Insert either autodeps.mk (if AUTO_DEPEND), else deps.mk.
-@lwlib_deps_frag@
+ifeq ($(AUTO_DEPEND),yes)
+-include $(ALLOBJS:%.o=${DEPDIR}/%.d)
+else
+include $(srcdir)/deps.mk
+endif
.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
diff --git a/lwlib/autodeps.mk b/lwlib/autodeps.mk
deleted file mode 100644
index f7109295ce2..00000000000
--- a/lwlib/autodeps.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-### autodeps.mk --- lwlib/Makefile fragment for GNU Emacs
-
-## This is inserted in lwlib/Makefile if AUTO_DEPEND=yes.
-
--include $(ALLOBJS:%.o=${DEPDIR}/%.d)
diff --git a/lwlib/deps.mk b/lwlib/deps.mk
index 11cc0567428..a19e51f34d1 100644
--- a/lwlib/deps.mk
+++ b/lwlib/deps.mk
@@ -20,7 +20,7 @@
### Commentary:
-## This file is inserted in lwlib/Makefile if AUTO_DEPEND=no.
+## This file is included in lwlib/Makefile if AUTO_DEPEND=no.
## It defines static dependencies between the various source files.
### Code:
diff --git a/m4/acl.m4 b/m4/acl.m4
index 186353c395b..b8f4660f7e3 100644
--- a/m4/acl.m4
+++ b/m4/acl.m4
@@ -1,5 +1,5 @@
# acl.m4 - check for access control list (ACL) primitives
-# serial 18
+# serial 19
# Copyright (C) 2002, 2004-2015 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
@@ -181,12 +181,26 @@ AC_DEFUN([gl_FILE_HAS_ACL],
[
AC_REQUIRE([gl_FUNC_ACL_ARG])
if test "$enable_acl" != no; then
- AC_CHECK_HEADERS([linux/xattr.h],
- [AC_CHECK_HEADERS([sys/xattr.h],
- [AC_CHECK_FUNCS([getxattr])])])
+ AC_CACHE_CHECK([for getxattr with XATTR_NAME_POSIX_ACL macros],
+ [gl_cv_getxattr_with_posix_acls],
+ [gl_cv_getxattr_with_posix_acls=no
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <sys/types.h>
+ #include <sys/xattr.h>
+ #include <linux/xattr.h>
+ ]],
+ [[ssize_t a = getxattr (".", XATTR_NAME_POSIX_ACL_ACCESS, 0, 0);
+ ssize_t b = getxattr (".", XATTR_NAME_POSIX_ACL_DEFAULT, 0, 0);
+ return a < 0 || b < 0;
+ ]])],
+ [gl_cv_getxattr_with_posix_acls=yes])])
fi
- if test "$ac_cv_header_sys_xattr_h,$ac_cv_header_linux_xattr_h,$ac_cv_func_getxattr" = yes,yes,yes; then
+ if test "$gl_cv_getxattr_with_posix_acls" = yes; then
LIB_HAS_ACL=
+ AC_DEFINE([GETXATTR_WITH_POSIX_ACLS], 1,
+ [Define to 1 if getxattr works with XATTR_NAME_POSIX_ACL_ACCESS
+ and XATTR_NAME_POSIX_ACL_DEFAULT.])
else
dnl Set gl_need_lib_has_acl to a nonempty value, so that any
dnl later gl_FUNC_ACL call will set LIB_HAS_ACL=$LIB_ACL.
diff --git a/m4/extern-inline.m4 b/m4/extern-inline.m4
index e74339a165e..72800650e6f 100644
--- a/m4/extern-inline.m4
+++ b/m4/extern-inline.m4
@@ -74,12 +74,13 @@ AC_DEFUN([gl_EXTERN_INLINE],
# define _GL_EXTERN_INLINE static _GL_UNUSED
#endif
-/* In GCC, suppress bogus "no previous prototype for 'FOO'"
+/* In GCC 4.6 (inclusive) to 5.1 (exclusive),
+ suppress bogus "no previous prototype for 'FOO'"
and "no previous declaration for 'FOO'" diagnostics,
when FOO is an inline function in the header; see
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113> and
<https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63877>. */
-#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
+#if __GNUC__ == 4 && 6 <= __GNUC_MINOR__
# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
# define _GL_INLINE_HEADER_CONST_PRAGMA
# else
diff --git a/make-dist b/make-dist
index 441070fd7c0..6bf01ffa11b 100755
--- a/make-dist
+++ b/make-dist
@@ -52,6 +52,7 @@ make_tar=no
default_gzip=gzip
newer=""
with_tests=no
+changelog=yes
while [ $# -gt 0 ]; do
case "$1" in
@@ -72,6 +73,9 @@ while [ $# -gt 0 ]; do
"--no-check" )
check=no
;;
+ "--no-changelog" )
+ changelog=no
+ ;;
## This option tells make-dist to make the distribution normally, then
## remove all files older than the given timestamp file. This is useful
## for creating incremental or patch distributions.
@@ -115,6 +119,7 @@ while [ $# -gt 0 ]; do
echo " --newer=TIME don't include files older than TIME"
echo " --no-check don't check for bad file names etc."
echo " --no-update don't recompile or do analogous things"
+ echo " --no-changelog don't generate the top-level ChangeLog"
echo " --snapshot same as --clean-up --no-update --tar --no-check"
echo " --tar make a tar file"
echo " --tests include the test/ directory"
@@ -277,11 +282,14 @@ fi
echo "Creating top directory: '${tempdir}'"
mkdir ${tempdir}
-if test -d .git; then
- echo "Making top-level ChangeLog"
- make distprefix=${tempdir}/ ChangeLog
-else
- echo "No repository, so omitting top-level ChangeLog"
+if [ "$changelog" = yes ]; then
+ if test -d .git; then
+ echo "Making top-level ChangeLog"
+ make ChangeLog CHANGELOG=${tempdir}/ChangeLog || \
+ { x=$?; echo "make ChangeLog FAILED (try --no-changelog?)" >&2; exit $x; }
+ else
+ echo "No repository, so omitting top-level ChangeLog"
+ fi
fi
### We copy in the top-level files before creating the subdirectories in
@@ -367,7 +375,7 @@ echo "Making links to 'src'"
echo " (It is ok if ln fails in some cases.)"
ln [a-zA-Z]*.[chm] ../${tempdir}/src
ln [a-zA-Z]*.in ../${tempdir}/src
- ln [a-zA-Z]*.mk ../${tempdir}/src
+ ln deps.mk ../${tempdir}/src
ln README ChangeLog.*[0-9] ../${tempdir}/src
ln makefile.w32-in ../${tempdir}/src
ln .gdbinit .dbxinit ../${tempdir}/src
diff --git a/oldXMenu/Makefile.in b/oldXMenu/Makefile.in
index ef2a3600a6b..de5b8e1114c 100644
--- a/oldXMenu/Makefile.in
+++ b/oldXMenu/Makefile.in
@@ -112,10 +112,15 @@ am__v_at_0 = @
am__v_at_1 =
DEPDIR = deps
-## -MMD -MF $(DEPDIR)/$*.d if AUTO_DEPEND; else empty.
-DEPFLAGS = @DEPFLAGS@
-## ${MKDIR_P} ${DEPDIR} (if AUTO_DEPEND); else ':'.
-MKDEPDIR = @MKDEPDIR@
+AUTO_DEPEND = @AUTO_DEPEND@
+
+ifeq ($(AUTO_DEPEND),yes)
+DEPFLAGS = -MMD -MF ${DEPDIR}/$*.d -MP
+MKDEPDIR = ${MKDIR_P} ${DEPDIR}
+else
+DEPFLAGS =
+MKDEPDIR = :
+endif
ALL_CFLAGS=$(C_SWITCH_SYSTEM) $(C_SWITCH_MACHINE) \
$(C_SWITCH_X_SITE) $(DEPFLAGS) \
@@ -132,8 +137,11 @@ libXMenu11.a: $(OBJS) $(EXTRA)
$(AM_V_at)$(AR) $(ARFLAGS) $@ $(OBJS) $(EXTRA)
$(AM_V_at)$(RANLIB) $@
-## Insert either autodeps.mk (if AUTO_DEPEND), else deps.mk.
-@oldxmenu_deps_frag@
+ifeq ($(AUTO_DEPEND),yes)
+-include $(ALLOBJS:%.o=${DEPDIR}/%.d)
+else
+include $(srcdir)/deps.mk
+endif
.PHONY: mostlyclean clean distclean bootstrap-clean maintainer-clean
diff --git a/oldXMenu/autodeps.mk b/oldXMenu/autodeps.mk
deleted file mode 100644
index f7109295ce2..00000000000
--- a/oldXMenu/autodeps.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-### autodeps.mk --- lwlib/Makefile fragment for GNU Emacs
-
-## This is inserted in lwlib/Makefile if AUTO_DEPEND=yes.
-
--include $(ALLOBJS:%.o=${DEPDIR}/%.d)
diff --git a/oldXMenu/deps.mk b/oldXMenu/deps.mk
index cdb89f9ead9..54ce3587574 100644
--- a/oldXMenu/deps.mk
+++ b/oldXMenu/deps.mk
@@ -32,7 +32,7 @@
### Commentary:
-## This file is inserted in oldXMenu/Makefile if AUTO_DEPEND=no.
+## This file is included in oldXMenu/Makefile if AUTO_DEPEND=no.
## It defines static dependencies between the various source files.
### Code:
diff --git a/src/Makefile.in b/src/Makefile.in
index 9e7a8a79915..d0df3260356 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -327,10 +327,15 @@ am__v_at_0 = @
am__v_at_1 =
DEPDIR=deps
-## -MMD -MF $(DEPDIR)/$*.d if AUTO_DEPEND; else empty.
-DEPFLAGS=@DEPFLAGS@
-## ${MKDIR_P} ${DEPDIR} (if AUTO_DEPEND); else ':'.
-MKDEPDIR=@MKDEPDIR@
+AUTO_DEPEND = @AUTO_DEPEND@
+
+ifeq ($(AUTO_DEPEND),yes)
+DEPFLAGS = -MMD -MF ${DEPDIR}/$*.d -MP
+MKDEPDIR = ${MKDIR_P} ${DEPDIR}
+else
+DEPFLAGS =
+MKDEPDIR = :
+endif
## DO NOT use -R. There is a special hack described in lastfile.c
## which is used instead. Some initialized data areas are modified
@@ -417,9 +422,37 @@ otherobj= $(TERMCAP_OBJ) $(PRE_ALLOC_OBJ) $(GMALLOC_OBJ) $(RALLOC_OBJ) \
FIRSTFILE_OBJ=@FIRSTFILE_OBJ@
ALLOBJS = $(FIRSTFILE_OBJ) $(VMLIMIT_OBJ) $(obj) $(otherobj)
-## Configure inserts the file lisp.mk at this point, defining $lisp.
-@lisp_frag@
-
+## This is the list of all Lisp files that might be loaded into the
+## dumped Emacs. Some of them are not loaded on all platforms, but
+## the DOC file on every platform uses them (because the DOC file is
+## supposed to be platform-independent).
+## Note that this list should not include lisp files which might not
+## be present, like site-load.el and site-init.el; this makefile
+## expects them all to be either present or buildable.
+##
+## To generate this list from loadup.el, we can either:
+## 1) Extract everything matching (load "..."), in which case
+## we need to add charprop.el by hand; or
+## 2) Extract everything matching (load "...", in which case
+## we need to remove leim-list, site-init, and site-load by hand.
+## There's not much to choose between these two approaches,
+## but the second one seems like it could be more future-proof.
+shortlisp =
+lisp.mk: $(lispsource)/loadup.el
+ @rm -f $@
+ ${AM_V_GEN}( echo "shortlisp = \\"; \
+ sed -n 's/^[ \t]*(load "\([^"]*\)".*/\1/p' $< | \
+ sed -e 's/$$/.elc \\/' -e 's/\.el\.elc/.el/'; \
+ echo "" ) > $@
+
+-include lisp.mk
+shortlisp_filter = leim/leim-list.el site-load.elc site-init.elc
+shortlisp := $(filter-out ${shortlisp_filter},${shortlisp})
+## Place loaddefs.el first, so it gets generated first, since it is on
+## the critical path (relevant in parallel compilations).
+## We don't really need to sort, but may as well use it to remove duplicates.
+shortlisp := loaddefs.el loadup.el $(sort ${shortlisp})
+lisp = $(addprefix ${lispsource}/,${shortlisp})
## Construct full set of libraries to be linked.
LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(LIBX_BASE) $(LIBIMAGE) \
@@ -453,7 +486,7 @@ $(srcdir)/macuvs.h $(lispsource)/international/charprop.el: \
## since not all pieces are used on all platforms. But DOC depends
## on all of $lisp, and emacs depends on DOC, so it is ok to use $lisp here.
emacs$(EXEEXT): temacs$(EXEEXT) \
- $(etc)/DOC $(lisp) $(leimdir)/leim-list.el \
+ lisp.mk $(etc)/DOC $(lisp) $(leimdir)/leim-list.el \
$(lispsource)/international/charprop.el
ifeq ($(CANNOT_DUMP),yes)
ln -f temacs$(EXEEXT) $@
@@ -464,12 +497,9 @@ else
endif
## We run make-docfile twice because the command line may get too long
-## on some systems. The sed command operating on lisp.mk also reduces
-## the length of the command line. Unfortunately, no-one has any idea
+## on some systems. Unfortunately, no-one has any idea
## exactly how long the maximum safe command line length is on all the
-## various systems that Emacs supports. Obviously, the length depends
-## on what your value of $srcdir is. If the length restriction goes
-## away, lisp.mk can be merged back into this file.
+## various systems that Emacs supports.
##
## $(SOME_MACHINE_OBJECTS) comes before $(obj) because some files may
## or may not be included in $(obj), but they are always included in
@@ -477,14 +507,13 @@ endif
## for the first time, this prevents any variation between configurations
## in the contents of the DOC file.
##
-$(etc)/DOC: $(libsrc)/make-docfile$(EXEEXT) $(obj) $(lisp)
+$(etc)/DOC: lisp.mk $(libsrc)/make-docfile$(EXEEXT) $(obj) $(lisp)
$(AM_V_GEN)$(MKDIR_P) $(etc)
-$(AM_V_at)rm -f $(etc)/DOC
$(AM_V_at)$(libsrc)/make-docfile -d $(srcdir) \
$(SOME_MACHINE_OBJECTS) $(obj) > $(etc)/DOC
$(AM_V_at)$(libsrc)/make-docfile -a $(etc)/DOC -d $(lispsource) \
- `sed -n -e 's| \\\\||' -e 's|^[ ]*$$(lispsource)/||p' \
- $(srcdir)/lisp.mk`
+ $(shortlisp)
$(libsrc)/make-docfile$(EXEEXT):
$(MAKE) -C $(libsrc) make-docfile$(EXEEXT)
@@ -584,7 +613,7 @@ bootstrap-clean: clean
fi
distclean: bootstrap-clean
- rm -f Makefile
+ rm -f Makefile lisp.mk
maintainer-clean: distclean
rm -f TAGS
@@ -607,9 +636,11 @@ ctagsfiles3 = [a-zA-Z]*.m
## rather than the file contents.
TAGS: $(srcdir)/$(ctagsfiles1) $(srcdir)/$(ctagsfiles2) $(srcdir)/$(ctagsfiles3)
"$(ETAGS)" --include=../lisp/TAGS --include=$(lwlibdir)/TAGS \
- --regex='{c}/[ ]*DEFVAR_[A-Z_ (]+"\([^"]+\)"/' \
+ --regex='{c}/[ ]*DEFVAR_[A-Z_ (]+"\([^"]+\)"/\1/' \
+ --regex='{c}/[ ]*DEFVAR_[A-Z_ (]+"[^"]+",[ ]\([A-Za-z0-9_]+\)/\1/' \
$(srcdir)/$(ctagsfiles1) $(srcdir)/$(ctagsfiles2) \
- --regex='{objc}/[ ]*DEFVAR_[A-Z_ (]+"\([^"]+\)"/' \
+ --regex='{objc}/[ ]*DEFVAR_[A-Z_ (]+"\([^"]+\)"/\1/' \
+ --regex='{objc}/[ ]*DEFVAR_[A-Z_ (]+"[^"]+",[ ]\([A-Za-z0-9_]+\)/\1/' \
$(srcdir)/$(ctagsfiles3)
## Arrange to make tags tables for ../lisp and ../lwlib,
@@ -669,8 +700,10 @@ endif
@: Compile some files earlier to speed up further compilation.
$(MAKE) -C ../lisp compile-first EMACS="$(bootstrap_exe)"
-## Insert either autodeps.mk (if AUTO_DEPEND), else deps.mk.
-@deps_frag@
-
+ifeq ($(AUTO_DEPEND),yes)
+-include $(ALLOBJS:%.o=${DEPDIR}/%.d)
+else
+include $(srcdir)/deps.mk
+endif
### Makefile.in ends here
diff --git a/src/alloc.c b/src/alloc.c
index 1f4b1a4694e..030c6e06ba8 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -4496,7 +4496,7 @@ live_buffer_p (struct mem_node *m, void *p)
must not have been killed. */
return (m->type == MEM_TYPE_BUFFER
&& p == m->start
- && !NILP (((struct buffer *) p)->INTERNAL_FIELD (name)));
+ && !NILP (((struct buffer *) p)->name_));
}
#endif /* GC_MARK_STACK || defined GC_MALLOC_CHECK */
@@ -5762,7 +5762,7 @@ garbage_collect_1 (void *end)
after GC. It's important to scan finalizers at this stage so
that we can be sure that unmarked finalizers are really
unreachable except for references from their associated functions
- and from other finalizers. */
+ and from other finalizers. */
queue_doomed_finalizers (&doomed_finalizers, &finalizers);
mark_finalizer_list (&doomed_finalizers);
diff --git a/src/autodeps.mk b/src/autodeps.mk
deleted file mode 100644
index 8b014a7508c..00000000000
--- a/src/autodeps.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-### autodeps.mk --- src/Makefile fragment for GNU Emacs
-
-## This is inserted in src/Makefile if AUTO_DEPEND=yes.
-
--include $(ALLOBJS:%.o=${DEPDIR}/%.d)
diff --git a/src/buffer.c b/src/buffer.c
index 332d6d51a81..b09676c438d 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -134,227 +134,227 @@ CHECK_OVERLAY (Lisp_Object x)
static void
bset_abbrev_mode (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (abbrev_mode) = val;
+ b->abbrev_mode_ = val;
}
static void
bset_abbrev_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (abbrev_table) = val;
+ b->abbrev_table_ = val;
}
static void
bset_auto_fill_function (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (auto_fill_function) = val;
+ b->auto_fill_function_ = val;
}
static void
bset_auto_save_file_format (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (auto_save_file_format) = val;
+ b->auto_save_file_format_ = val;
}
static void
bset_auto_save_file_name (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (auto_save_file_name) = val;
+ b->auto_save_file_name_ = val;
}
static void
bset_backed_up (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (backed_up) = val;
+ b->backed_up_ = val;
}
static void
bset_begv_marker (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (begv_marker) = val;
+ b->begv_marker_ = val;
}
static void
bset_bidi_display_reordering (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (bidi_display_reordering) = val;
+ b->bidi_display_reordering_ = val;
}
static void
bset_buffer_file_coding_system (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (buffer_file_coding_system) = val;
+ b->buffer_file_coding_system_ = val;
}
static void
bset_case_fold_search (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (case_fold_search) = val;
+ b->case_fold_search_ = val;
}
static void
bset_ctl_arrow (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (ctl_arrow) = val;
+ b->ctl_arrow_ = val;
}
static void
bset_cursor_in_non_selected_windows (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (cursor_in_non_selected_windows) = val;
+ b->cursor_in_non_selected_windows_ = val;
}
static void
bset_cursor_type (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (cursor_type) = val;
+ b->cursor_type_ = val;
}
static void
bset_display_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (display_table) = val;
+ b->display_table_ = val;
}
static void
bset_extra_line_spacing (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (extra_line_spacing) = val;
+ b->extra_line_spacing_ = val;
}
static void
bset_file_format (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (file_format) = val;
+ b->file_format_ = val;
}
static void
bset_file_truename (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (file_truename) = val;
+ b->file_truename_ = val;
}
static void
bset_fringe_cursor_alist (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (fringe_cursor_alist) = val;
+ b->fringe_cursor_alist_ = val;
}
static void
bset_fringe_indicator_alist (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (fringe_indicator_alist) = val;
+ b->fringe_indicator_alist_ = val;
}
static void
bset_fringes_outside_margins (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (fringes_outside_margins) = val;
+ b->fringes_outside_margins_ = val;
}
static void
bset_header_line_format (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (header_line_format) = val;
+ b->header_line_format_ = val;
}
static void
bset_indicate_buffer_boundaries (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (indicate_buffer_boundaries) = val;
+ b->indicate_buffer_boundaries_ = val;
}
static void
bset_indicate_empty_lines (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (indicate_empty_lines) = val;
+ b->indicate_empty_lines_ = val;
}
static void
bset_invisibility_spec (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (invisibility_spec) = val;
+ b->invisibility_spec_ = val;
}
static void
bset_left_fringe_width (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (left_fringe_width) = val;
+ b->left_fringe_width_ = val;
}
static void
bset_major_mode (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (major_mode) = val;
+ b->major_mode_ = val;
}
static void
bset_mark (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (mark) = val;
+ b->mark_ = val;
}
static void
bset_minor_modes (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (minor_modes) = val;
+ b->minor_modes_ = val;
}
static void
bset_mode_line_format (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (mode_line_format) = val;
+ b->mode_line_format_ = val;
}
static void
bset_mode_name (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (mode_name) = val;
+ b->mode_name_ = val;
}
static void
bset_name (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (name) = val;
+ b->name_ = val;
}
static void
bset_overwrite_mode (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (overwrite_mode) = val;
+ b->overwrite_mode_ = val;
}
static void
bset_pt_marker (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (pt_marker) = val;
+ b->pt_marker_ = val;
}
static void
bset_right_fringe_width (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (right_fringe_width) = val;
+ b->right_fringe_width_ = val;
}
static void
bset_save_length (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (save_length) = val;
+ b->save_length_ = val;
}
static void
bset_scroll_bar_width (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (scroll_bar_width) = val;
+ b->scroll_bar_width_ = val;
}
static void
bset_scroll_bar_height (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (scroll_bar_height) = val;
+ b->scroll_bar_height_ = val;
}
static void
bset_scroll_down_aggressively (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (scroll_down_aggressively) = val;
+ b->scroll_down_aggressively_ = val;
}
static void
bset_scroll_up_aggressively (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (scroll_up_aggressively) = val;
+ b->scroll_up_aggressively_ = val;
}
static void
bset_selective_display (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (selective_display) = val;
+ b->selective_display_ = val;
}
static void
bset_selective_display_ellipses (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (selective_display_ellipses) = val;
+ b->selective_display_ellipses_ = val;
}
static void
bset_vertical_scroll_bar_type (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (vertical_scroll_bar_type) = val;
+ b->vertical_scroll_bar_type_ = val;
}
static void
bset_horizontal_scroll_bar_type (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (horizontal_scroll_bar_type) = val;
+ b->horizontal_scroll_bar_type_ = val;
}
static void
bset_word_wrap (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (word_wrap) = val;
+ b->word_wrap_ = val;
}
static void
bset_zv_marker (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (zv_marker) = val;
+ b->zv_marker_ = val;
}
void
@@ -1591,7 +1591,7 @@ compact_buffer (struct buffer *buffer)
turned off in that buffer. Calling truncate_undo_list on
Qt tends to return NULL, which effectively turns undo back on.
So don't call truncate_undo_list if undo_list is Qt. */
- if (!EQ (buffer->INTERNAL_FIELD (undo_list), Qt))
+ if (!EQ (BVAR(buffer, undo_list), Qt))
truncate_undo_list (buffer);
/* Shrink buffer gaps. */
diff --git a/src/buffer.h b/src/buffer.h
index 81852cae505..a0410d454cd 100644
--- a/src/buffer.h
+++ b/src/buffer.h
@@ -483,7 +483,7 @@ struct buffer_text
/* Most code should use this macro to access Lisp fields in struct buffer. */
-#define BVAR(buf, field) ((buf)->INTERNAL_FIELD (field))
+#define BVAR(buf, field) ((buf)->field ## _)
/* This is the structure that the buffer Lisp object points to. */
@@ -492,17 +492,17 @@ struct buffer
struct vectorlike_header header;
/* The name of this buffer. */
- Lisp_Object INTERNAL_FIELD (name);
+ Lisp_Object name_;
/* The name of the file visited in this buffer, or nil. */
- Lisp_Object INTERNAL_FIELD (filename);
+ Lisp_Object filename_;
/* Directory for expanding relative file names. */
- Lisp_Object INTERNAL_FIELD (directory);
+ Lisp_Object directory_;
/* True if this buffer has been backed up (if you write to the visited
file and it hasn't been backed up, then a backup will be made). */
- Lisp_Object INTERNAL_FIELD (backed_up);
+ Lisp_Object backed_up_;
/* Length of file when last read or saved.
-1 means auto saving turned off because buffer shrank a lot.
@@ -510,132 +510,132 @@ struct buffer
(That value is used with buffer-swap-text.)
This is not in the struct buffer_text
because it's not used in indirect buffers at all. */
- Lisp_Object INTERNAL_FIELD (save_length);
+ Lisp_Object save_length_;
/* File name used for auto-saving this buffer.
This is not in the struct buffer_text
because it's not used in indirect buffers at all. */
- Lisp_Object INTERNAL_FIELD (auto_save_file_name);
+ Lisp_Object auto_save_file_name_;
/* Non-nil if buffer read-only. */
- Lisp_Object INTERNAL_FIELD (read_only);
+ Lisp_Object read_only_;
/* "The mark". This is a marker which may
point into this buffer or may point nowhere. */
- Lisp_Object INTERNAL_FIELD (mark);
+ Lisp_Object mark_;
/* Alist of elements (SYMBOL . VALUE-IN-THIS-BUFFER) for all
per-buffer variables of this buffer. For locally unbound
symbols, just the symbol appears as the element. */
- Lisp_Object INTERNAL_FIELD (local_var_alist);
+ Lisp_Object local_var_alist_;
/* Symbol naming major mode (e.g., lisp-mode). */
- Lisp_Object INTERNAL_FIELD (major_mode);
+ Lisp_Object major_mode_;
/* Pretty name of major mode (e.g., "Lisp"). */
- Lisp_Object INTERNAL_FIELD (mode_name);
+ Lisp_Object mode_name_;
/* Mode line element that controls format of mode line. */
- Lisp_Object INTERNAL_FIELD (mode_line_format);
+ Lisp_Object mode_line_format_;
/* Analogous to mode_line_format for the line displayed at the top
of windows. Nil means don't display that line. */
- Lisp_Object INTERNAL_FIELD (header_line_format);
+ Lisp_Object header_line_format_;
/* Keys that are bound local to this buffer. */
- Lisp_Object INTERNAL_FIELD (keymap);
+ Lisp_Object keymap_;
/* This buffer's local abbrev table. */
- Lisp_Object INTERNAL_FIELD (abbrev_table);
+ Lisp_Object abbrev_table_;
/* This buffer's syntax table. */
- Lisp_Object INTERNAL_FIELD (syntax_table);
+ Lisp_Object syntax_table_;
/* This buffer's category table. */
- Lisp_Object INTERNAL_FIELD (category_table);
+ Lisp_Object category_table_;
/* Values of several buffer-local variables. */
/* tab-width is buffer-local so that redisplay can find it
in buffers that are not current. */
- Lisp_Object INTERNAL_FIELD (case_fold_search);
- Lisp_Object INTERNAL_FIELD (tab_width);
- Lisp_Object INTERNAL_FIELD (fill_column);
- Lisp_Object INTERNAL_FIELD (left_margin);
+ Lisp_Object case_fold_search_;
+ Lisp_Object tab_width_;
+ Lisp_Object fill_column_;
+ Lisp_Object left_margin_;
/* Function to call when insert space past fill column. */
- Lisp_Object INTERNAL_FIELD (auto_fill_function);
+ Lisp_Object auto_fill_function_;
/* Case table for case-conversion in this buffer.
This char-table maps each char into its lower-case version. */
- Lisp_Object INTERNAL_FIELD (downcase_table);
+ Lisp_Object downcase_table_;
/* Char-table mapping each char to its upper-case version. */
- Lisp_Object INTERNAL_FIELD (upcase_table);
+ Lisp_Object upcase_table_;
/* Char-table for conversion for case-folding search. */
- Lisp_Object INTERNAL_FIELD (case_canon_table);
+ Lisp_Object case_canon_table_;
/* Char-table of equivalences for case-folding search. */
- Lisp_Object INTERNAL_FIELD (case_eqv_table);
+ Lisp_Object case_eqv_table_;
/* Non-nil means do not display continuation lines. */
- Lisp_Object INTERNAL_FIELD (truncate_lines);
+ Lisp_Object truncate_lines_;
/* Non-nil means to use word wrapping when displaying continuation lines. */
- Lisp_Object INTERNAL_FIELD (word_wrap);
+ Lisp_Object word_wrap_;
/* Non-nil means display ctl chars with uparrow. */
- Lisp_Object INTERNAL_FIELD (ctl_arrow);
+ Lisp_Object ctl_arrow_;
/* Non-nil means reorder bidirectional text for display in the
visual order. */
- Lisp_Object INTERNAL_FIELD (bidi_display_reordering);
+ Lisp_Object bidi_display_reordering_;
/* If non-nil, specifies which direction of text to force in all the
paragraphs of the buffer. Nil means determine paragraph
direction dynamically for each paragraph. */
- Lisp_Object INTERNAL_FIELD (bidi_paragraph_direction);
+ Lisp_Object bidi_paragraph_direction_;
/* Non-nil means do selective display;
see doc string in syms_of_buffer (buffer.c) for details. */
- Lisp_Object INTERNAL_FIELD (selective_display);
+ Lisp_Object selective_display_;
/* Non-nil means show ... at end of line followed by invisible lines. */
- Lisp_Object INTERNAL_FIELD (selective_display_ellipses);
+ Lisp_Object selective_display_ellipses_;
/* Alist of (FUNCTION . STRING) for each minor mode enabled in buffer. */
- Lisp_Object INTERNAL_FIELD (minor_modes);
+ Lisp_Object minor_modes_;
/* t if "self-insertion" should overwrite; `binary' if it should also
overwrite newlines and tabs - for editing executables and the like. */
- Lisp_Object INTERNAL_FIELD (overwrite_mode);
+ Lisp_Object overwrite_mode_;
/* Non-nil means abbrev mode is on. Expand abbrevs automatically. */
- Lisp_Object INTERNAL_FIELD (abbrev_mode);
+ Lisp_Object abbrev_mode_;
/* Display table to use for text in this buffer. */
- Lisp_Object INTERNAL_FIELD (display_table);
+ Lisp_Object display_table_;
/* t means the mark and region are currently active. */
- Lisp_Object INTERNAL_FIELD (mark_active);
+ Lisp_Object mark_active_;
/* Non-nil means the buffer contents are regarded as multi-byte
form of characters, not a binary code. */
- Lisp_Object INTERNAL_FIELD (enable_multibyte_characters);
+ Lisp_Object enable_multibyte_characters_;
/* Coding system to be used for encoding the buffer contents on
saving. */
- Lisp_Object INTERNAL_FIELD (buffer_file_coding_system);
+ Lisp_Object buffer_file_coding_system_;
/* List of symbols naming the file format used for visited file. */
- Lisp_Object INTERNAL_FIELD (file_format);
+ Lisp_Object file_format_;
/* List of symbols naming the file format used for auto-save file. */
- Lisp_Object INTERNAL_FIELD (auto_save_file_format);
+ Lisp_Object auto_save_file_format_;
/* True if the newline position cache, width run cache and BIDI paragraph
cache are enabled. See search.c, indent.c and bidi.c for details. */
- Lisp_Object INTERNAL_FIELD (cache_long_scans);
+ Lisp_Object cache_long_scans_;
/* If the width run cache is enabled, this table contains the
character widths width_run_cache (see above) assumes. When we
@@ -643,104 +643,104 @@ struct buffer
current display table to see whether the display table has
affected the widths of any characters. If it has, we
invalidate the width run cache, and re-initialize width_table. */
- Lisp_Object INTERNAL_FIELD (width_table);
+ Lisp_Object width_table_;
/* In an indirect buffer, or a buffer that is the base of an
indirect buffer, this holds a marker that records
PT for this buffer when the buffer is not current. */
- Lisp_Object INTERNAL_FIELD (pt_marker);
+ Lisp_Object pt_marker_;
/* In an indirect buffer, or a buffer that is the base of an
indirect buffer, this holds a marker that records
BEGV for this buffer when the buffer is not current. */
- Lisp_Object INTERNAL_FIELD (begv_marker);
+ Lisp_Object begv_marker_;
/* In an indirect buffer, or a buffer that is the base of an
indirect buffer, this holds a marker that records
ZV for this buffer when the buffer is not current. */
- Lisp_Object INTERNAL_FIELD (zv_marker);
+ Lisp_Object zv_marker_;
/* This holds the point value before the last scroll operation.
Explicitly setting point sets this to nil. */
- Lisp_Object INTERNAL_FIELD (point_before_scroll);
+ Lisp_Object point_before_scroll_;
/* Truename of the visited file, or nil. */
- Lisp_Object INTERNAL_FIELD (file_truename);
+ Lisp_Object file_truename_;
/* Invisibility spec of this buffer.
t => any non-nil `invisible' property means invisible.
A list => `invisible' property means invisible
if it is memq in that list. */
- Lisp_Object INTERNAL_FIELD (invisibility_spec);
+ Lisp_Object invisibility_spec_;
/* This is the last window that was selected with this buffer in it,
or nil if that window no longer displays this buffer. */
- Lisp_Object INTERNAL_FIELD (last_selected_window);
+ Lisp_Object last_selected_window_;
/* Incremented each time the buffer is displayed in a window. */
- Lisp_Object INTERNAL_FIELD (display_count);
+ Lisp_Object display_count_;
/* Widths of left and right marginal areas for windows displaying
this buffer. */
- Lisp_Object INTERNAL_FIELD (left_margin_cols);
- Lisp_Object INTERNAL_FIELD (right_margin_cols);
+ Lisp_Object left_margin_cols_;
+ Lisp_Object right_margin_cols_;
/* Widths of left and right fringe areas for windows displaying
this buffer. */
- Lisp_Object INTERNAL_FIELD (left_fringe_width);
- Lisp_Object INTERNAL_FIELD (right_fringe_width);
+ Lisp_Object left_fringe_width_;
+ Lisp_Object right_fringe_width_;
/* Non-nil means fringes are drawn outside display margins;
othersize draw them between margin areas and text. */
- Lisp_Object INTERNAL_FIELD (fringes_outside_margins);
+ Lisp_Object fringes_outside_margins_;
/* Width, height and types of scroll bar areas for windows displaying
this buffer. */
- Lisp_Object INTERNAL_FIELD (scroll_bar_width);
- Lisp_Object INTERNAL_FIELD (scroll_bar_height);
- Lisp_Object INTERNAL_FIELD (vertical_scroll_bar_type);
- Lisp_Object INTERNAL_FIELD (horizontal_scroll_bar_type);
+ Lisp_Object scroll_bar_width_;
+ Lisp_Object scroll_bar_height_;
+ Lisp_Object vertical_scroll_bar_type_;
+ Lisp_Object horizontal_scroll_bar_type_;
/* Non-nil means indicate lines not displaying text (in a style
like vi). */
- Lisp_Object INTERNAL_FIELD (indicate_empty_lines);
+ Lisp_Object indicate_empty_lines_;
/* Non-nil means indicate buffer boundaries and scrolling. */
- Lisp_Object INTERNAL_FIELD (indicate_buffer_boundaries);
+ Lisp_Object indicate_buffer_boundaries_;
/* Logical to physical fringe bitmap mappings. */
- Lisp_Object INTERNAL_FIELD (fringe_indicator_alist);
+ Lisp_Object fringe_indicator_alist_;
/* Logical to physical cursor bitmap mappings. */
- Lisp_Object INTERNAL_FIELD (fringe_cursor_alist);
+ Lisp_Object fringe_cursor_alist_;
/* Time stamp updated each time this buffer is displayed in a window. */
- Lisp_Object INTERNAL_FIELD (display_time);
+ Lisp_Object display_time_;
/* If scrolling the display because point is below the bottom of a
window showing this buffer, try to choose a window start so
that point ends up this number of lines from the top of the
window. Nil means that scrolling method isn't used. */
- Lisp_Object INTERNAL_FIELD (scroll_up_aggressively);
+ Lisp_Object scroll_up_aggressively_;
/* If scrolling the display because point is above the top of a
window showing this buffer, try to choose a window start so
that point ends up this number of lines from the bottom of the
window. Nil means that scrolling method isn't used. */
- Lisp_Object INTERNAL_FIELD (scroll_down_aggressively);
+ Lisp_Object scroll_down_aggressively_;
/* Desired cursor type in this buffer. See the doc string of
per-buffer variable `cursor-type'. */
- Lisp_Object INTERNAL_FIELD (cursor_type);
+ Lisp_Object cursor_type_;
/* An integer > 0 means put that number of pixels below text lines
in the display of this buffer. */
- Lisp_Object INTERNAL_FIELD (extra_line_spacing);
+ Lisp_Object extra_line_spacing_;
/* Cursor type to display in non-selected windows.
t means to use hollow box cursor.
See `cursor-type' for other values. */
- Lisp_Object INTERNAL_FIELD (cursor_in_non_selected_windows);
+ Lisp_Object cursor_in_non_selected_windows_;
/* No more Lisp_Object beyond this point. Except undo_list,
which is handled specially in Fgarbage_collect. */
@@ -872,7 +872,7 @@ struct buffer
buffer of an indirect buffer. But we can't store it in the
struct buffer_text because local variables have to be right in
the struct buffer. So we copy it around in set_buffer_internal. */
- Lisp_Object INTERNAL_FIELD (undo_list);
+ Lisp_Object undo_list_;
};
/* Most code should use these functions to set Lisp fields in struct
@@ -881,102 +881,102 @@ struct buffer
INLINE void
bset_bidi_paragraph_direction (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (bidi_paragraph_direction) = val;
+ b->bidi_paragraph_direction_ = val;
}
INLINE void
bset_cache_long_scans (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (cache_long_scans) = val;
+ b->cache_long_scans_ = val;
}
INLINE void
bset_case_canon_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (case_canon_table) = val;
+ b->case_canon_table_ = val;
}
INLINE void
bset_case_eqv_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (case_eqv_table) = val;
+ b->case_eqv_table_ = val;
}
INLINE void
bset_directory (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (directory) = val;
+ b->directory_ = val;
}
INLINE void
bset_display_count (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (display_count) = val;
+ b->display_count_ = val;
}
INLINE void
bset_display_time (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (display_time) = val;
+ b->display_time_ = val;
}
INLINE void
bset_downcase_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (downcase_table) = val;
+ b->downcase_table_ = val;
}
INLINE void
bset_enable_multibyte_characters (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (enable_multibyte_characters) = val;
+ b->enable_multibyte_characters_ = val;
}
INLINE void
bset_filename (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (filename) = val;
+ b->filename_ = val;
}
INLINE void
bset_keymap (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (keymap) = val;
+ b->keymap_ = val;
}
INLINE void
bset_last_selected_window (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (last_selected_window) = val;
+ b->last_selected_window_ = val;
}
INLINE void
bset_local_var_alist (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (local_var_alist) = val;
+ b->local_var_alist_ = val;
}
INLINE void
bset_mark_active (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (mark_active) = val;
+ b->mark_active_ = val;
}
INLINE void
bset_point_before_scroll (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (point_before_scroll) = val;
+ b->point_before_scroll_ = val;
}
INLINE void
bset_read_only (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (read_only) = val;
+ b->read_only_ = val;
}
INLINE void
bset_truncate_lines (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (truncate_lines) = val;
+ b->truncate_lines_ = val;
}
INLINE void
bset_undo_list (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (undo_list) = val;
+ b->undo_list_ = val;
}
INLINE void
bset_upcase_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (upcase_table) = val;
+ b->upcase_table_ = val;
}
INLINE void
bset_width_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (width_table) = val;
+ b->width_table_ = val;
}
/* Number of Lisp_Objects at the beginning of struct buffer.
@@ -1253,7 +1253,7 @@ extern int last_per_buffer_idx;
from the start of a buffer structure. */
#define PER_BUFFER_VAR_OFFSET(VAR) \
- offsetof (struct buffer, INTERNAL_FIELD (VAR))
+ offsetof (struct buffer, VAR ## _)
/* Used to iterate over normal Lisp_Object fields of struct buffer (all
Lisp_Objects except undo_list). If you add, remove, or reorder
diff --git a/src/category.c b/src/category.c
index b20493e5949..ab90f5ff093 100644
--- a/src/category.c
+++ b/src/category.c
@@ -41,7 +41,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
static void
bset_category_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (category_table) = val;
+ b->category_table_ = val;
}
/* The version number of the latest category table. Each category
diff --git a/src/cmds.c b/src/cmds.c
index 168ce8355ed..b590805ea8a 100644
--- a/src/cmds.c
+++ b/src/cmds.c
@@ -473,7 +473,7 @@ internal_self_insert (int c, EMACS_INT n)
}
replace_range (PT, PT + chars_to_delete, string, 1, 1, 1);
- Fforward_char (make_number (n + spaces_to_insert));
+ Fforward_char (make_number (n));
}
else if (n > 1)
{
diff --git a/src/deps.mk b/src/deps.mk
index 71a5f42d22e..23789384fdb 100644
--- a/src/deps.mk
+++ b/src/deps.mk
@@ -20,7 +20,7 @@
## Commentary:
##
-## This file is inserted in src/Makefile if AUTO_DEPEND=no.
+## This file is included in src/Makefile if AUTO_DEPEND=no.
## It defines static dependencies between the various source files.
## FIXME some of these dependencies are platform-specific.
diff --git a/src/editfns.c b/src/editfns.c
index dead48c1a62..cddb0d4eae6 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -908,6 +908,10 @@ even in case of abnormal exit (throw or error).
If you only want to save the current buffer but not point,
then just use `save-current-buffer', or even `with-current-buffer'.
+Before Emacs 25.1, `save-excursion' used to save the mark state.
+To save the marker state as well as the point and buffer, use
+`save-mark-and-excursion'.
+
usage: (save-excursion &rest BODY) */)
(Lisp_Object args)
{
@@ -4386,9 +4390,6 @@ usage: (format STRING &rest OBJECTS) */)
nchars = multibyte_chars_in_text ((unsigned char *) buf, p - buf);
val = make_specified_string (buf, nchars, p - buf, multibyte);
- /* If we allocated BUF with malloc, free it too. */
- SAFE_FREE ();
-
/* If the format string has text properties, or any of the string
arguments has text properties, set up text properties of the
result string. */
@@ -4494,6 +4495,9 @@ usage: (format STRING &rest OBJECTS) */)
UNGCPRO;
}
+ /* If we allocated BUF or INFO with malloc, free it too. */
+ SAFE_FREE ();
+
return val;
}
diff --git a/src/filelock.c b/src/filelock.c
index 89d3e350219..4ee7a01ecb8 100644
--- a/src/filelock.c
+++ b/src/filelock.c
@@ -669,10 +669,6 @@ lock_file (Lisp_Object fn)
struct gcpro gcpro1;
USE_SAFE_ALLOCA;
- /* Don't do locking if the user has opted out. */
- if (! create_lockfiles)
- return;
-
/* Don't do locking while dumping Emacs.
Uncompressing wtmp files uses call-process, which does not work
in an uninitialized Emacs. */
@@ -690,9 +686,6 @@ lock_file (Lisp_Object fn)
#endif
encoded_fn = ENCODE_FILE (fn);
- /* Create the name of the lock-file for file fn */
- MAKE_LOCK_NAME (lfname, encoded_fn);
-
/* See if this file is visited and has changed on disk since it was
visited. */
{
@@ -707,27 +700,35 @@ lock_file (Lisp_Object fn)
}
- /* Try to lock the lock. */
- if (0 < lock_if_free (&lock_info, lfname))
+ /* Don't do locking if the user has opted out. */
+ if (create_lockfiles)
{
- /* Someone else has the lock. Consider breaking it. */
- Lisp_Object attack;
- char *dot = lock_info.dot;
- ptrdiff_t pidlen = lock_info.colon - (dot + 1);
- static char const replacement[] = " (pid ";
- int replacementlen = sizeof replacement - 1;
- memmove (dot + replacementlen, dot + 1, pidlen);
- strcpy (dot + replacementlen + pidlen, ")");
- memcpy (dot, replacement, replacementlen);
- attack = call2 (intern ("ask-user-about-lock"), fn,
- build_string (lock_info.user));
- /* Take the lock if the user said so. */
- if (!NILP (attack))
- lock_file_1 (lfname, 1);
+
+ /* Create the name of the lock-file for file fn */
+ MAKE_LOCK_NAME (lfname, encoded_fn);
+
+ /* Try to lock the lock. */
+ if (0 < lock_if_free (&lock_info, lfname))
+ {
+ /* Someone else has the lock. Consider breaking it. */
+ Lisp_Object attack;
+ char *dot = lock_info.dot;
+ ptrdiff_t pidlen = lock_info.colon - (dot + 1);
+ static char const replacement[] = " (pid ";
+ int replacementlen = sizeof replacement - 1;
+ memmove (dot + replacementlen, dot + 1, pidlen);
+ strcpy (dot + replacementlen + pidlen, ")");
+ memcpy (dot, replacement, replacementlen);
+ attack = call2 (intern ("ask-user-about-lock"), fn,
+ build_string (lock_info.user));
+ /* Take the lock if the user said so. */
+ if (!NILP (attack))
+ lock_file_1 (lfname, 1);
+ }
+ SAFE_FREE ();
}
UNGCPRO;
- SAFE_FREE ();
}
void
diff --git a/src/gtkutil.c b/src/gtkutil.c
index d7340ba797e..5d28b0221af 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -869,6 +869,21 @@ xg_clear_under_internal_border (struct frame *f)
}
}
+static int
+xg_get_gdk_scale (void)
+{
+ const char *sscale = getenv ("GDK_SCALE");
+
+ if (sscale)
+ {
+ long scale = atol (sscale);
+ if (0 < scale)
+ return min (scale, INT_MAX);
+ }
+
+ return 1;
+}
+
/* Function to handle resize of our frame. As we have a Gtk+ tool bar
and a Gtk+ menu bar, we get resize events for the edit part of the
frame only. We let Gtk+ deal with the Gtk+ parts.
@@ -919,6 +934,9 @@ xg_frame_set_char_size (struct frame *f, int width, int height)
int pixelheight = FRAME_TEXT_TO_PIXEL_HEIGHT (f, height);
Lisp_Object fullscreen = get_frame_param (f, Qfullscreen);
gint gwidth, gheight;
+ int totalheight
+ = pixelheight + FRAME_TOOLBAR_HEIGHT (f) + FRAME_MENUBAR_HEIGHT (f);
+ int totalwidth = pixelwidth + FRAME_TOOLBAR_WIDTH (f);
if (FRAME_PIXEL_HEIGHT (f) == 0)
return;
@@ -929,6 +947,13 @@ xg_frame_set_char_size (struct frame *f, int width, int height)
/* Do this before resize, as we don't know yet if we will be resized. */
xg_clear_under_internal_border (f);
+ if (FRAME_VISIBLE_P (f))
+ {
+ int scale = xg_get_gdk_scale ();
+ totalheight /= scale;
+ totalwidth /= scale;
+ }
+
/* Resize the top level widget so rows and columns remain constant.
When the frame is fullheight and we only want to change the width
@@ -943,38 +968,33 @@ xg_frame_set_char_size (struct frame *f, int width, int height)
frame_size_history_add
(f, Qxg_frame_set_char_size_1, width, height,
list2 (make_number (gheight),
- make_number (pixelheight + FRAME_TOOLBAR_HEIGHT (f)
- + FRAME_MENUBAR_HEIGHT (f))));
+ make_number (totalheight)));
gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
gwidth,
- pixelheight + FRAME_TOOLBAR_HEIGHT (f)
- + FRAME_MENUBAR_HEIGHT (f));
+ totalheight);
}
else if (EQ (fullscreen, Qfullheight) && height == FRAME_TEXT_HEIGHT (f))
{
frame_size_history_add
(f, Qxg_frame_set_char_size_2, width, height,
list2 (make_number (gwidth),
- make_number (pixelwidth + FRAME_TOOLBAR_WIDTH (f))));
+ make_number (totalwidth)));
gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
- pixelwidth + FRAME_TOOLBAR_WIDTH (f),
+ totalwidth,
gheight);
}
-
else
{
frame_size_history_add
(f, Qxg_frame_set_char_size_3, width, height,
- list2 (make_number (pixelwidth + FRAME_TOOLBAR_WIDTH (f)),
- make_number (pixelheight + FRAME_TOOLBAR_HEIGHT (f)
- + FRAME_MENUBAR_HEIGHT (f))));
+ list2 (make_number (totalwidth),
+ make_number (totalheight)));
gtk_window_resize (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
- pixelwidth + FRAME_TOOLBAR_WIDTH (f),
- pixelheight + FRAME_TOOLBAR_HEIGHT (f)
- + FRAME_MENUBAR_HEIGHT (f));
+ totalwidth,
+ totalheight);
fullscreen = Qnil;
}
@@ -1126,18 +1146,6 @@ delete_cb (GtkWidget *widget,
GdkEvent *event,
gpointer user_data)
{
-#ifdef HAVE_GTK3
- /* The event doesn't arrive in the normal event loop. Send event
- here. */
- struct frame *f = user_data;
- struct input_event ie;
-
- EVENT_INIT (ie);
- ie.kind = DELETE_WINDOW_EVENT;
- XSETFRAME (ie.frame_or_window, f);
- kbd_buffer_store_event (&ie);
-#endif
-
return TRUE;
}
@@ -1356,6 +1364,7 @@ x_wm_set_size_hint (struct frame *f, long int flags, bool user_position)
int min_rows = 0, min_cols = 0;
int win_gravity = f->win_gravity;
Lisp_Object fs_state, frame;
+ int scale = xg_get_gdk_scale ();
/* Don't set size hints during initialization; that apparently leads
to a race condition. See the thread at
@@ -1435,6 +1444,11 @@ x_wm_set_size_hint (struct frame *f, long int flags, bool user_position)
hint_flags |= GDK_HINT_USER_POS;
}
+ size_hints.base_width /= scale;
+ size_hints.base_height /= scale;
+ size_hints.width_inc /= scale;
+ size_hints.height_inc /= scale;
+
if (hint_flags != f->output_data.x->hint_flags
|| memcmp (&size_hints,
&f->output_data.x->size_hints,
@@ -3556,14 +3570,14 @@ update_theme_scrollbar_height (void)
int
xg_get_default_scrollbar_width (void)
{
- return scroll_bar_width_for_theme;
+ return scroll_bar_width_for_theme * xg_get_gdk_scale ();
}
int
xg_get_default_scrollbar_height (void)
{
/* Apparently there's no default height for themes. */
- return scroll_bar_width_for_theme;
+ return scroll_bar_width_for_theme * xg_get_gdk_scale ();
}
/* Return the scrollbar id for X Window WID on display DPY.
@@ -3762,14 +3776,18 @@ xg_update_scrollbar_pos (struct frame *f,
int width,
int height)
{
-
GtkWidget *wscroll = xg_get_widget_from_map (scrollbar_id);
-
if (wscroll)
{
GtkWidget *wfixed = f->output_data.x->edit_widget;
GtkWidget *wparent = gtk_widget_get_parent (wscroll);
gint msl;
+ int scale = xg_get_gdk_scale ();
+
+ top /= scale;
+ left /= scale;
+ height /= scale;
+ left -= (scale - 1) * ((width / scale) >> 1);
/* Clear out old position. */
int oldx = -1, oldy = -1, oldw, oldh;
@@ -3800,11 +3818,15 @@ xg_update_scrollbar_pos (struct frame *f,
gdk_window_process_all_updates ();
#endif
if (oldx != -1 && oldw > 0 && oldh > 0)
- /* Clear under old scroll bar position. This must be done after
- the gtk_widget_queue_draw and gdk_window_process_all_updates
- above. */
- x_clear_area (f,
- oldx, oldy, oldw, oldh);
+ {
+ /* Clear under old scroll bar position. This must be done after
+ the gtk_widget_queue_draw and gdk_window_process_all_updates
+ above. */
+ oldw += (scale - 1) * oldw;
+ oldx -= (scale - 1) * oldw;
+ x_clear_area (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
+ oldx, oldy, oldw, oldh);
+ }
/* GTK does not redraw until the main loop is entered again, but
if there are no X events pending we will not enter it. So we sync
diff --git a/src/image.c b/src/image.c
index ffbed747590..87029bfa1b0 100644
--- a/src/image.c
+++ b/src/image.c
@@ -237,7 +237,7 @@ x_create_bitmap_from_data (struct frame *f, char *bits, unsigned int width, unsi
#endif /* HAVE_NTGUI */
#ifdef HAVE_NS
- void *bitmap = ns_image_from_XBM (bits, width, height);
+ void *bitmap = ns_image_from_XBM (bits, width, height, 0, 0);
if (!bitmap)
return -1;
#endif
@@ -2706,7 +2706,7 @@ Create_Pixmap_From_Bitmap_Data (struct frame *f, struct image *img, char *data,
convert_mono_to_color_image (f, img, fg, bg);
#elif defined (HAVE_NS)
- img->pixmap = ns_image_from_XBM (data, img->width, img->height);
+ img->pixmap = ns_image_from_XBM (data, img->width, img->height, fg, bg);
#else
img->pixmap =
diff --git a/src/keyboard.c b/src/keyboard.c
index bd79f901970..77f7fb97898 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -391,47 +391,47 @@ static void store_user_signal_events (void);
static void
kset_echo_string (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (echo_string) = val;
+ kb->echo_string_ = val;
}
static void
kset_kbd_queue (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (kbd_queue) = val;
+ kb->kbd_queue_ = val;
}
static void
kset_keyboard_translate_table (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vkeyboard_translate_table) = val;
+ kb->Vkeyboard_translate_table_ = val;
}
static void
kset_last_prefix_arg (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vlast_prefix_arg) = val;
+ kb->Vlast_prefix_arg_ = val;
}
static void
kset_last_repeatable_command (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vlast_repeatable_command) = val;
+ kb->Vlast_repeatable_command_ = val;
}
static void
kset_local_function_key_map (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vlocal_function_key_map) = val;
+ kb->Vlocal_function_key_map_ = val;
}
static void
kset_overriding_terminal_local_map (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Voverriding_terminal_local_map) = val;
+ kb->Voverriding_terminal_local_map_ = val;
}
static void
kset_real_last_command (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vreal_last_command) = val;
+ kb->Vreal_last_command_ = val;
}
static void
kset_system_key_syms (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (system_key_syms) = val;
+ kb->system_key_syms_ = val;
}
@@ -8707,12 +8707,10 @@ read_char_minibuf_menu_prompt (int commandflag,
while (BUFFERP (obj));
kset_defining_kbd_macro (current_kboard, orig_defn_macro);
- if (!INTEGERP (obj) || XINT (obj) == -2)
- return obj;
-
- if (! EQ (obj, menu_prompt_more_char)
- && (!INTEGERP (menu_prompt_more_char)
- || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char))))))
+ if (!INTEGERP (obj) || XINT (obj) == -2
+ || (! EQ (obj, menu_prompt_more_char)
+ && (!INTEGERP (menu_prompt_more_char)
+ || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char)))))))
{
if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
store_kbd_macro_char (obj);
diff --git a/src/keyboard.h b/src/keyboard.h
index 0ce6d184482..bcdeaf62165 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -25,7 +25,7 @@ INLINE_HEADER_BEGIN
/* Most code should use this macro to access Lisp fields in struct kboard. */
-#define KVAR(kboard, field) ((kboard)->INTERNAL_FIELD (field))
+#define KVAR(kboard, field) ((kboard)->field ## _)
/* Each KBOARD represents one logical input stream from which Emacs
gets input. If we are using ordinary terminals, it has one KBOARD
@@ -78,32 +78,32 @@ struct kboard
can effectively wait for input in the any-kboard state, and hence
avoid blocking out the other KBOARDs. See universal-argument in
lisp/simple.el for an example. */
- Lisp_Object INTERNAL_FIELD (Voverriding_terminal_local_map);
+ Lisp_Object Voverriding_terminal_local_map_;
/* Last command executed by the editor command loop, not counting
commands that set the prefix argument. */
- Lisp_Object INTERNAL_FIELD (Vlast_command);
+ Lisp_Object Vlast_command_;
/* Normally same as last-command, but never modified by other commands. */
- Lisp_Object INTERNAL_FIELD (Vreal_last_command);
+ Lisp_Object Vreal_last_command_;
/* User-supplied table to translate input characters through. */
- Lisp_Object INTERNAL_FIELD (Vkeyboard_translate_table);
+ Lisp_Object Vkeyboard_translate_table_;
/* Last command that may be repeated by `repeat'. */
- Lisp_Object INTERNAL_FIELD (Vlast_repeatable_command);
+ Lisp_Object Vlast_repeatable_command_;
/* The prefix argument for the next command, in raw form. */
- Lisp_Object INTERNAL_FIELD (Vprefix_arg);
+ Lisp_Object Vprefix_arg_;
/* Saved prefix argument for the last command, in raw form. */
- Lisp_Object INTERNAL_FIELD (Vlast_prefix_arg);
+ Lisp_Object Vlast_prefix_arg_;
/* Unread events specific to this kboard. */
- Lisp_Object INTERNAL_FIELD (kbd_queue);
+ Lisp_Object kbd_queue_;
/* Non-nil while a kbd macro is being defined. */
- Lisp_Object INTERNAL_FIELD (defining_kbd_macro);
+ Lisp_Object defining_kbd_macro_;
/* The start of storage for the current keyboard macro. */
Lisp_Object *kbd_macro_buffer;
@@ -125,28 +125,28 @@ struct kboard
ptrdiff_t kbd_macro_bufsize;
/* Last anonymous kbd macro defined. */
- Lisp_Object INTERNAL_FIELD (Vlast_kbd_macro);
+ Lisp_Object Vlast_kbd_macro_;
/* Alist of system-specific X windows key symbols. */
- Lisp_Object INTERNAL_FIELD (Vsystem_key_alist);
+ Lisp_Object Vsystem_key_alist_;
/* Cache for modify_event_symbol. */
- Lisp_Object INTERNAL_FIELD (system_key_syms);
+ Lisp_Object system_key_syms_;
/* The kind of display: x, w32, ... */
- Lisp_Object INTERNAL_FIELD (Vwindow_system);
+ Lisp_Object Vwindow_system_;
/* Keymap mapping keys to alternative preferred forms.
See the DEFVAR for more documentation. */
- Lisp_Object INTERNAL_FIELD (Vlocal_function_key_map);
+ Lisp_Object Vlocal_function_key_map_;
/* Keymap mapping ASCII function key sequences onto their preferred
forms. Initialized by the terminal-specific lisp files. See the
DEFVAR for more documentation. */
- Lisp_Object INTERNAL_FIELD (Vinput_decode_map);
+ Lisp_Object Vinput_decode_map_;
/* Minibufferless frames on this display use this frame's minibuffer. */
- Lisp_Object INTERNAL_FIELD (Vdefault_minibuffer_frame);
+ Lisp_Object Vdefault_minibuffer_frame_;
/* Number of displays using this KBOARD. Normally 1, but can be
larger when you have multiple screens on a single X display. */
@@ -154,7 +154,7 @@ struct kboard
/* The text we're echoing in the modeline - partial key sequences,
usually. This is nil when not echoing. */
- Lisp_Object INTERNAL_FIELD (echo_string);
+ Lisp_Object echo_string_;
/* This flag indicates that events were put into kbd_queue
while Emacs was running for some other KBOARD.
@@ -179,42 +179,42 @@ struct kboard
INLINE void
kset_default_minibuffer_frame (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vdefault_minibuffer_frame) = val;
+ kb->Vdefault_minibuffer_frame_ = val;
}
INLINE void
kset_defining_kbd_macro (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (defining_kbd_macro) = val;
+ kb->defining_kbd_macro_ = val;
}
INLINE void
kset_input_decode_map (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vinput_decode_map) = val;
+ kb->Vinput_decode_map_ = val;
}
INLINE void
kset_last_command (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vlast_command) = val;
+ kb->Vlast_command_ = val;
}
INLINE void
kset_last_kbd_macro (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vlast_kbd_macro) = val;
+ kb->Vlast_kbd_macro_ = val;
}
INLINE void
kset_prefix_arg (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vprefix_arg) = val;
+ kb->Vprefix_arg_ = val;
}
INLINE void
kset_system_key_alist (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vsystem_key_alist) = val;
+ kb->Vsystem_key_alist_ = val;
}
INLINE void
kset_window_system (struct kboard *kb, Lisp_Object val)
{
- kb->INTERNAL_FIELD (Vwindow_system) = val;
+ kb->Vwindow_system_ = val;
}
/* Temporarily used before a frame has been opened. */
diff --git a/src/lisp.h b/src/lisp.h
index 55c4c662c06..6d34ce3b052 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -1144,10 +1144,6 @@ LISP_MACRO_DEFUN_VOID (CHECK_TYPE,
(int ok, Lisp_Object predicate, Lisp_Object x),
(ok, predicate, x))
-/* Deprecated and will be removed soon. */
-
-#define INTERNAL_FIELD(field) field ## _
-
/* See the macros in intervals.h. */
typedef struct interval *INTERVAL;
diff --git a/src/lisp.mk b/src/lisp.mk
deleted file mode 100644
index ee2a07c0fd7..00000000000
--- a/src/lisp.mk
+++ /dev/null
@@ -1,174 +0,0 @@
-### lisp.mk --- src/Makefile fragment for GNU Emacs
-
-## Copyright (C) 1985, 1987-1988, 1993-1995, 1999-2015 Free Software
-## Foundation, Inc.
-
-## This file is part of GNU Emacs.
-
-## GNU Emacs is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## GNU Emacs is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
-
-### Commentary:
-
-## This is the list of all Lisp files that might be loaded into the
-## dumped Emacs. Some of them are not loaded on all platforms, but
-## the DOC file on every platform uses them (because the DOC file is
-## supposed to be platform-independent).
-## It is arranged like this because it is easier to generate it
-## semi-mechanically from loadup.el this way.
-## Eg something like:
-## sed -e 's/"[ )].*//' -n -e '/(load "/ s/.*load "//p' loadup.el | \
-## grep -vE 'site-|ldefs-boot'
-## minus any duplicates.
-## Note that you can generally just add a ".elc" extension to every file
-## that does not have an explicit .el extension, but beware of any
-## no-byte-compile ones.
-
-## Confusingly, international/cp51932 and international/eucjp-ms are
-## unconditionally loaded from language/japanese, instead of being
-## loaded directly from loadup.el; FIXME.
-
-## Note that this list should not include lisp files which might not
-## be present, like site-load.el and site-init.el; this makefile
-## expects them all to be either present or buildable.
-
-## Place loaddefs.el first, so it gets generated first, since it is on
-## the critical path (relevant in parallel compilations).
-
-### Code:
-
-## NB: This list is parsed by sed in the main src/Makefile.
-## Do not change the formatting.
-lisp = \
- $(lispsource)/loaddefs.el \
- $(lispsource)/loadup.el \
- $(lispsource)/emacs-lisp/byte-run.elc \
- $(lispsource)/emacs-lisp/backquote.elc \
- $(lispsource)/subr.elc \
- $(lispsource)/version.elc \
- $(lispsource)/widget.elc \
- $(lispsource)/custom.elc \
- $(lispsource)/emacs-lisp/map-ynp.elc \
- $(lispsource)/cus-start.elc \
- $(lispsource)/international/mule.elc \
- $(lispsource)/international/mule-conf.elc \
- $(lispsource)/env.elc \
- $(lispsource)/format.elc \
- $(lispsource)/bindings.elc \
- $(lispsource)/files.elc \
- $(lispsource)/emacs-lisp/macroexp.elc \
- $(lispsource)/cus-face.elc \
- $(lispsource)/faces.elc \
- $(lispsource)/button.elc \
- $(lispsource)/startup.elc \
- $(lispsource)/emacs-lisp/cl-preloaded.elc \
- $(lispsource)/emacs-lisp/nadvice.elc \
- $(lispsource)/minibuffer.elc \
- $(lispsource)/abbrev.elc \
- $(lispsource)/simple.elc \
- $(lispsource)/help.elc \
- $(lispsource)/jka-cmpr-hook.elc \
- $(lispsource)/epa-hook.elc \
- $(lispsource)/international/mule-cmds.elc \
- $(lispsource)/case-table.elc \
- $(lispsource)/international/characters.elc \
- $(lispsource)/composite.elc \
- $(lispsource)/international/charprop.el \
- $(lispsource)/language/chinese.elc \
- $(lispsource)/language/cyrillic.elc \
- $(lispsource)/language/indian.elc \
- $(lispsource)/language/sinhala.elc \
- $(lispsource)/language/english.elc \
- $(lispsource)/language/ethiopic.elc \
- $(lispsource)/language/european.elc \
- $(lispsource)/language/czech.elc \
- $(lispsource)/language/slovak.elc \
- $(lispsource)/language/romanian.elc \
- $(lispsource)/language/greek.elc \
- $(lispsource)/language/hebrew.elc \
- $(lispsource)/language/japanese.elc \
- $(lispsource)/international/cp51932.el \
- $(lispsource)/international/eucjp-ms.el \
- $(lispsource)/language/korean.elc \
- $(lispsource)/language/lao.elc \
- $(lispsource)/language/tai-viet.elc \
- $(lispsource)/language/thai.elc \
- $(lispsource)/language/tibetan.elc \
- $(lispsource)/language/vietnamese.elc \
- $(lispsource)/language/misc-lang.elc \
- $(lispsource)/language/utf-8-lang.elc \
- $(lispsource)/language/georgian.elc \
- $(lispsource)/language/khmer.elc \
- $(lispsource)/language/burmese.elc \
- $(lispsource)/language/cham.elc \
- $(lispsource)/indent.elc \
- $(lispsource)/window.elc \
- $(lispsource)/frame.elc \
- $(lispsource)/term/tty-colors.elc \
- $(lispsource)/font-core.elc \
- $(lispsource)/facemenu.elc \
- $(lispsource)/emacs-lisp/syntax.elc \
- $(lispsource)/font-lock.elc \
- $(lispsource)/jit-lock.elc \
- $(lispsource)/mouse.elc \
- $(lispsource)/scroll-bar.elc \
- $(lispsource)/select.elc \
- $(lispsource)/emacs-lisp/timer.elc \
- $(lispsource)/isearch.elc \
- $(lispsource)/rfn-eshadow.elc \
- $(lispsource)/menu-bar.elc \
- $(lispsource)/emacs-lisp/lisp.elc \
- $(lispsource)/textmodes/page.elc \
- $(lispsource)/register.elc \
- $(lispsource)/textmodes/paragraphs.elc \
- $(lispsource)/progmodes/prog-mode.elc \
- $(lispsource)/emacs-lisp/lisp-mode.elc \
- $(lispsource)/progmodes/elisp-mode.elc \
- $(lispsource)/textmodes/text-mode.elc \
- $(lispsource)/textmodes/fill.elc \
- $(lispsource)/newcomment.elc \
- $(lispsource)/replace.elc \
- $(lispsource)/emacs-lisp/tabulated-list.elc \
- $(lispsource)/buff-menu.elc \
- $(lispsource)/fringe.elc \
- $(lispsource)/emacs-lisp/regexp-opt.elc \
- $(lispsource)/image.elc \
- $(lispsource)/international/fontset.elc \
- $(lispsource)/dnd.elc \
- $(lispsource)/tool-bar.elc \
- $(lispsource)/dynamic-setting.elc \
- $(lispsource)/x-dnd.elc \
- $(lispsource)/term/common-win.elc \
- $(lispsource)/term/x-win.elc \
- $(lispsource)/w32-vars.elc \
- $(lispsource)/term/w32-win.elc \
- $(lispsource)/ls-lisp.elc \
- $(lispsource)/disp-table.elc \
- $(lispsource)/dos-w32.elc \
- $(lispsource)/w32-fns.elc \
- $(lispsource)/dos-fns.elc \
- $(lispsource)/dos-vars.elc \
- $(lispsource)/term/pc-win.elc \
- $(lispsource)/term/internal.elc \
- $(lispsource)/term/ns-win.elc \
- $(lispsource)/mwheel.elc \
- $(lispsource)/emacs-lisp/float-sup.elc \
- $(lispsource)/vc/vc-hooks.elc \
- $(lispsource)/vc/ediff-hook.elc \
- $(lispsource)/electric.elc \
- $(lispsource)/emacs-lisp/eldoc.elc \
- $(lispsource)/uniquify.elc \
- $(lispsource)/tooltip.elc
-
-
-### lisp.mk ends here
diff --git a/src/lread.c b/src/lread.c
index a84450a4364..26c19d8338b 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4592,8 +4592,10 @@ of the file, regardless of whether or not it has the `.elc' extension. */);
DEFVAR_LISP ("load-read-function", Vload_read_function,
doc: /* Function used by `load' and `eval-region' for reading expressions.
-The default is nil, which means use the function `read'. */);
- Vload_read_function = Qnil;
+Called with a single argument (the stream from which to read).
+The default is to use the function `read'. */);
+ DEFSYM (Qread, "read");
+ Vload_read_function = Qread;
DEFVAR_LISP ("load-source-file-function", Vload_source_file_function,
doc: /* Function called in `load' to load an Emacs Lisp source file.
diff --git a/src/macfont.h b/src/macfont.h
index f311577f051..403be94e332 100644
--- a/src/macfont.h
+++ b/src/macfont.h
@@ -48,7 +48,7 @@ struct mac_glyph_layout
typedef CTFontDescriptorRef FontDescriptorRef;
typedef CTFontRef FontRef;
typedef CTFontSymbolicTraits FontSymbolicTraits;
-typedef CTCharacterCollection CharacterCollection;
+typedef NSCharacterCollection CharacterCollection;
#define MAC_FONT_NAME_ATTRIBUTE kCTFontNameAttribute
#define MAC_FONT_FAMILY_NAME_ATTRIBUTE kCTFontFamilyNameAttribute
@@ -79,8 +79,8 @@ enum {
};
enum {
- MAC_CHARACTER_COLLECTION_IDENTITY_MAPPING = kCTIdentityMappingCharacterCollection,
- MAC_CHARACTER_COLLECTION_ADOBE_JAPAN1 = kCTAdobeJapan1CharacterCollection
+ MAC_CHARACTER_COLLECTION_IDENTITY_MAPPING = NSIdentityMappingCharacterCollection,
+ MAC_CHARACTER_COLLECTION_ADOBE_JAPAN1 = NSAdobeJapan1CharacterCollection
};
#define mac_font_descriptor_create_with_attributes \
diff --git a/src/nsfns.m b/src/nsfns.m
index f8863e6d400..8a3c6ccf2b0 100644
--- a/src/nsfns.m
+++ b/src/nsfns.m
@@ -1075,7 +1075,6 @@ This function is an internal primitive--use `make-frame' instead. */)
Lisp_Object name;
int minibuffer_only = 0;
long window_prompting = 0;
- int width, height;
ptrdiff_t count = specpdl_ptr - specpdl;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
Lisp_Object display;
@@ -1455,6 +1454,15 @@ ns_run_file_dialog (void)
ns_fd_data.panel = nil;
}
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_9
+#define MODAL_OK_RESPONSE NSModalResponseOK
+#endif
+#endif
+#ifndef MODAL_OK_RESPONSE
+#define MODAL_OK_RESPONSE NSOKButton
+#endif
+
DEFUN ("ns-read-file-name", Fns_read_file_name, Sns_read_file_name, 1, 5, 0,
doc: /* Use a graphical panel to read a file name, using prompt PROMPT.
Optional arg DIR, if non-nil, supplies a default directory.
@@ -1466,10 +1474,9 @@ Optional arg DIR_ONLY_P, if non-nil, means choose only directories. */)
Lisp_Object init, Lisp_Object dir_only_p)
{
static id fileDelegate = nil;
- BOOL ret;
BOOL isSave = NILP (mustmatch) && NILP (dir_only_p);
id panel;
- Lisp_Object fname;
+ Lisp_Object fname = Qnil;
NSString *promptS = NILP (prompt) || !STRINGP (prompt) ? nil :
[NSString stringWithUTF8String: SSDATA (prompt)];
@@ -1549,20 +1556,17 @@ Optional arg DIR_ONLY_P, if non-nil, means choose only directories. */)
while (ns_fd_data.panel != nil)
[NSApp run];
- ret = (ns_fd_data.ret == NSOKButton);
-
- if (ret)
+ if (ns_fd_data.ret == MODAL_OK_RESPONSE)
{
NSString *str = ns_filename_from_panel (panel);
if (! str) str = ns_directory_from_panel (panel);
- if (! str) ret = NO;
- else fname = build_string ([str UTF8String]);
+ if (str) fname = build_string ([str UTF8String]);
}
[[FRAME_NS_VIEW (SELECTED_FRAME ()) window] makeKeyWindow];
unblock_input ();
- return ret ? fname : Qnil;
+ return fname;
}
const char *
@@ -2677,7 +2681,16 @@ compute_tip_xy (struct frame *f,
pt.y = dpyinfo->last_mouse_motion_y;
/* Convert to screen coordinates */
pt = [view convertPoint: pt toView: nil];
+#if !defined (NS_IMPL_COCOA) || MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
pt = [[view window] convertBaseToScreen: pt];
+#else
+ {
+ NSRect r = NSMakeRect (pt.x, pt.y, 0, 0);
+ r = [[view window] convertRectToScreen: r];
+ pt.x = r.origin.x;
+ pt.y = r.origin.y;
+ }
+#endif
}
else
{
diff --git a/src/nsimage.m b/src/nsimage.m
index f37ad38ad1e..9302cd2f212 100644
--- a/src/nsimage.m
+++ b/src/nsimage.m
@@ -53,12 +53,13 @@ int image_trace_num = 0;
========================================================================== */
void *
-ns_image_from_XBM (unsigned char *bits, int width, int height)
+ns_image_from_XBM (unsigned char *bits, int width, int height,
+ unsigned long fg, unsigned long bg)
{
NSTRACE (ns_image_from_XBM);
return [[EmacsImage alloc] initFromXBM: bits
width: width height: height
- flip: YES];
+ fg: fg bg: bg];
}
void *
@@ -186,7 +187,11 @@ ns_set_alpha (void *img, int x, int y, unsigned char a)
/* The next two lines cause the DPI of the image to be ignored.
This seems to be the behavior users expect. */
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
[image setScalesWhenResized: YES];
+#endif
+#endif
[image setSize: NSMakeSize([imgRep pixelsWide], [imgRep pixelsHigh])];
[image setName: [NSString stringWithUTF8String: SSDATA (file)]];
@@ -204,16 +209,8 @@ ns_set_alpha (void *img, int x, int y, unsigned char a)
- initFromXBM: (unsigned char *)bits width: (int)w height: (int)h
- flip: (BOOL)flip
+ fg: (unsigned long)fg bg: (unsigned long)bg
{
- return [self initFromSkipXBM: bits width: w height: h flip: flip length: 0];
-}
-
-
-- initFromSkipXBM: (unsigned char *)bits width: (int)w height: (int)h
- flip: (BOOL)flip length: (int)length;
-{
- int bpr = (w + 7) / 8;
unsigned char *planes[5];
[self initWithSize: NSMakeSize (w, h)];
@@ -226,57 +223,58 @@ ns_set_alpha (void *img, int x, int y, unsigned char a)
bytesPerRow: w bitsPerPixel: 0];
[bmRep getBitmapDataPlanes: planes];
+
+ if (fg == 0 && bg == 0)
+ bg = 0xffffff;
+
{
/* pull bits out to set the (bytewise) alpha mask */
int i, j, k;
unsigned char *s = bits;
+ unsigned char *rr = planes[0];
+ unsigned char *gg = planes[1];
+ unsigned char *bb = planes[2];
unsigned char *alpha = planes[3];
- unsigned char swt[16] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13,
- 3, 11, 7, 15};
- unsigned char c, bitPat;
-
- for (j = 0; j < h; j++)
- for (i = 0; i < bpr; i++)
+ unsigned char fgr = (fg >> 16) & 0xff;
+ unsigned char fgg = (fg >> 8) & 0xff;
+ unsigned char fgb = fg & 0xff;
+ unsigned char bgr = (bg >> 16) & 0xff;
+ unsigned char bgg = (bg >> 8) & 0xff;
+ unsigned char bgb = bg & 0xff;
+ unsigned char c;
+
+ int idx = 0;
+ for (j = 0; j < h; ++j)
+ for (i = 0; i < w; )
{
- if (length)
+ c = *s++;
+ for (k = 0; i < w && k < 8; ++k, ++i)
{
- unsigned char s1, s2;
- while (*s++ != 'x' && s < bits + length);
- if (s >= bits + length)
+ *alpha++ = 0xff;
+ if (c & 1)
{
- [bmRep release];
- bmRep = nil;
- return nil;
+ *rr++ = fgr;
+ *gg++ = fgg;
+ *bb++ = fgb;
}
-#define hexchar(x) ('0' <= (x) && (x) <= '9' ? (x) - '0' : (x) - 'a' + 10)
- s1 = *s++;
- s2 = *s++;
- c = hexchar (s1) * 0x10 + hexchar (s2);
- }
- else
- c = *s++;
-
- bitPat = flip ? swt[c >> 4] | (swt[c & 0xf] << 4) : c ^ 255;
- for (k =0; k<8; k++)
- {
- *alpha++ = (bitPat & 0x80) ? 0xff : 0;
- bitPat <<= 1;
+ else
+ {
+ *rr++ = bgr;
+ *gg++ = bgg;
+ *bb++ = bgb;
+ }
+ idx++;
+ c >>= 1;
}
}
}
+ xbm_fg = fg;
[self addRepresentation: bmRep];
-
- memset (planes[0], 0, w*h);
- memset (planes[1], 0, w*h);
- memset (planes[2], 0, w*h);
- [self setXBMColor: [NSColor blackColor]];
return self;
}
-
-/* Set color for a bitmap image (see initFromSkipXBM). Note that the alpha
- is used as a mask, so we just memset the entire array. */
+/* Set color for a bitmap image. */
- setXBMColor: (NSColor *)color
{
NSSize s = [self size];
@@ -296,19 +294,21 @@ ns_set_alpha (void *img, int x, int y, unsigned char a)
[bmRep getBitmapDataPlanes: planes];
- /* we used to just do this, but Cocoa seems to have a bug when rendering
- an alpha-masked image onto a dark background where it bloats the mask */
- /* memset (planes[0..2], r, g, b*0xff, len); */
{
int i, len = s.width*s.height;
int rr = r * 0xff, gg = g * 0xff, bb = b * 0xff;
- for (i =0; i<len; i++)
- if (planes[3][i] != 0)
+ unsigned char fgr = (xbm_fg >> 16) & 0xff;
+ unsigned char fgg = (xbm_fg >> 8) & 0xff;
+ unsigned char fgb = xbm_fg & 0xff;
+
+ for (i = 0; i < len; ++i)
+ if (planes[0][i] == fgr && planes[1][i] == fgg && planes[2][i] == fgb)
{
planes[0][i] = rr;
planes[1][i] = gg;
planes[2][i] = bb;
}
+ xbm_fg = ((rr << 16) & 0xff) + ((gg << 8) & 0xff) + (bb & 0xff);
}
return self;
@@ -356,7 +356,11 @@ ns_set_alpha (void *img, int x, int y, unsigned char a)
/* The next two lines cause the DPI of the image to be ignored.
This seems to be the behavior users expect. */
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
[self setScalesWhenResized: YES];
+#endif
+#endif
[self setSize: NSMakeSize([bmr pixelsWide], [bmr pixelsHigh])];
break;
diff --git a/src/nsmenu.m b/src/nsmenu.m
index 26fe26e5e0d..b5cb64d68e5 100644
--- a/src/nsmenu.m
+++ b/src/nsmenu.m
@@ -1418,7 +1418,7 @@ Lisp_Object
ns_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents)
{
id dialog;
- Lisp_Object window, tem, title;
+ Lisp_Object tem, title;
NSPoint p;
BOOL isQ;
NSAutoreleasePool *pool;
@@ -1506,7 +1506,11 @@ ns_popup_dialog (struct frame *f, Lisp_Object header, Lisp_Object contents)
area.size.width = ICONSIZE;
area.size.height= ICONSIZE;
img = [[NSImage imageNamed: @"NSApplicationIcon"] copy];
+#ifdef NS_IMPL_COCOA
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
[img setScalesWhenResized: YES];
+#endif
+#endif
[img setSize: NSMakeSize (ICONSIZE, ICONSIZE)];
imgView = [[NSImageView alloc] initWithFrame: area];
[imgView setImage: img];
diff --git a/src/nsterm.h b/src/nsterm.h
index 9035ee1a328..c06b7c49a6d 100644
--- a/src/nsterm.h
+++ b/src/nsterm.h
@@ -341,13 +341,12 @@ typedef float EmacsCGFloat;
NSBitmapImageRep *bmRep; /* used for accessing pixel data */
unsigned char *pixmapData[5]; /* shortcut to access pixel data */
NSColor *stippleMask;
+ unsigned long xbm_fg;
}
+ allocInitFromFile: (Lisp_Object)file;
- (void)dealloc;
- initFromXBM: (unsigned char *)bits width: (int)w height: (int)h
- flip: (BOOL)flip;
-- initFromSkipXBM: (unsigned char *)bits width: (int)w height: (int)h
- flip: (BOOL)flip length: (int)length;
+ fg: (unsigned long)fg bg: (unsigned long)bg;
- setXBMColor: (NSColor *)color;
- initForXPMWithDepth: (int)depth width: (int)width height: (int)height;
- (void)setPixmapData;
@@ -397,6 +396,7 @@ typedef float EmacsCGFloat;
- condemn;
- reprieve;
- (bool)judge;
++ (CGFloat)scrollerWidth;
@end
@@ -864,7 +864,8 @@ extern void syms_of_nsselect (void);
/* From nsimage.m, needed in image.c */
struct image;
-extern void *ns_image_from_XBM (unsigned char *bits, int width, int height);
+extern void *ns_image_from_XBM (unsigned char *bits, int width, int height,
+ unsigned long fg, unsigned long bg);
extern void *ns_image_for_XPM (int width, int height, int depth);
extern void *ns_image_from_file (Lisp_Object file);
extern bool ns_load_image (struct frame *f, struct image *img,
diff --git a/src/nsterm.m b/src/nsterm.m
index e90c3d70db3..67a03898d13 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -1538,7 +1538,7 @@ ns_get_color (const char *name, NSColor **col)
{
NSColor *new = nil;
static char hex[20];
- int scaling;
+ int scaling = 0;
float r = -1.0, g, b;
NSString *nsname = [NSString stringWithUTF8String: name];
@@ -2093,6 +2093,18 @@ ns_clear_frame_area (struct frame *f, int x, int y, int width, int height)
return;
}
+static void
+ns_copy_bits (struct frame *f, NSRect src, NSRect dest)
+{
+ if (FRAME_NS_VIEW (f))
+ {
+ ns_focus (f, &dest, 1);
+ [FRAME_NS_VIEW (f) scrollRect: src
+ by: NSMakeSize (dest.origin.x - src.origin.x,
+ dest.origin.y - src.origin.y)];
+ ns_unfocus (f);
+ }
+}
static void
ns_scroll_run (struct window *w, struct run *run)
@@ -2145,11 +2157,8 @@ ns_scroll_run (struct window *w, struct run *run)
{
NSRect srcRect = NSMakeRect (x, from_y, width, height);
NSRect dstRect = NSMakeRect (x, to_y, width, height);
- NSPoint dstOrigin = NSMakePoint (x, to_y);
- ns_focus (f, &dstRect, 1);
- NSCopyBits (0, srcRect , dstOrigin);
- ns_unfocus (f);
+ ns_copy_bits (f, srcRect , dstRect);
}
unblock_input ();
@@ -2205,13 +2214,10 @@ ns_shift_glyphs_for_insert (struct frame *f,
{
NSRect srcRect = NSMakeRect (x, y, width, height);
NSRect dstRect = NSMakeRect (x+shift_by, y, width, height);
- NSPoint dstOrigin = dstRect.origin;
NSTRACE (ns_shift_glyphs_for_insert);
- ns_focus (f, &dstRect, 1);
- NSCopyBits (0, srcRect, dstOrigin);
- ns_unfocus (f);
+ ns_copy_bits (f, srcRect, dstRect);
}
@@ -2317,7 +2323,7 @@ ns_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
for (i = 0; i < len; i++)
cbits[i] = ~(bits[i] & 0xff);
img = [[EmacsImage alloc] initFromXBM: cbits width: 8 height: p->h
- flip: NO];
+ fg: 0 bg: 0];
bimgs[p->which - 1] = img;
xfree (cbits);
}
@@ -2459,6 +2465,7 @@ ns_draw_window_cursor (struct window *w, struct glyph_row *glyph_row,
switch (cursor_type)
{
+ case DEFAULT_CURSOR:
case NO_CURSOR:
break;
case FILLED_BOX_CURSOR:
@@ -3188,6 +3195,96 @@ ns_dumpglyphs_stretch (struct glyph_string *s)
static void
+ns_draw_composite_glyph_string_foreground (struct glyph_string *s)
+{
+ int i, j, x;
+ struct font *font = s->font;
+
+ /* If first glyph of S has a left box line, start drawing the text
+ of S to the right of that box line. */
+ if (s->face && s->face->box != FACE_NO_BOX
+ && s->first_glyph->left_box_line_p)
+ x = s->x + eabs (s->face->box_line_width);
+ else
+ x = s->x;
+
+ /* S is a glyph string for a composition. S->cmp_from is the index
+ of the first character drawn for glyphs of this composition.
+ S->cmp_from == 0 means we are drawing the very first character of
+ this composition. */
+
+ /* Draw a rectangle for the composition if the font for the very
+ first character of the composition could not be loaded. */
+ if (s->font_not_found_p)
+ {
+ if (s->cmp_from == 0)
+ {
+ NSRect r = NSMakeRect (s->x, s->y, s->width-1, s->height -1);
+ ns_draw_box (r, 1, FRAME_CURSOR_COLOR (s->f), 1, 1);
+ }
+ }
+ else if (! s->first_glyph->u.cmp.automatic)
+ {
+ int y = s->ybase;
+
+ for (i = 0, j = s->cmp_from; i < s->nchars; i++, j++)
+ /* TAB in a composition means display glyphs with padding
+ space on the left or right. */
+ if (COMPOSITION_GLYPH (s->cmp, j) != '\t')
+ {
+ int xx = x + s->cmp->offsets[j * 2];
+ int yy = y - s->cmp->offsets[j * 2 + 1];
+
+ font->driver->draw (s, j, j + 1, xx, yy, false);
+ if (s->face->overstrike)
+ font->driver->draw (s, j, j + 1, xx + 1, yy, false);
+ }
+ }
+ else
+ {
+ Lisp_Object gstring = composition_gstring_from_id (s->cmp_id);
+ Lisp_Object glyph;
+ int y = s->ybase;
+ int width = 0;
+
+ for (i = j = s->cmp_from; i < s->cmp_to; i++)
+ {
+ glyph = LGSTRING_GLYPH (gstring, i);
+ if (NILP (LGLYPH_ADJUSTMENT (glyph)))
+ width += LGLYPH_WIDTH (glyph);
+ else
+ {
+ int xoff, yoff, wadjust;
+
+ if (j < i)
+ {
+ font->driver->draw (s, j, i, x, y, false);
+ if (s->face->overstrike)
+ font->driver->draw (s, j, i, x + 1, y, false);
+ x += width;
+ }
+ xoff = LGLYPH_XOFF (glyph);
+ yoff = LGLYPH_YOFF (glyph);
+ wadjust = LGLYPH_WADJUST (glyph);
+ font->driver->draw (s, i, i + 1, x + xoff, y + yoff, false);
+ if (s->face->overstrike)
+ font->driver->draw (s, i, i + 1, x + xoff + 1, y + yoff,
+ false);
+ x += wadjust;
+ j = i + 1;
+ width = 0;
+ }
+ }
+ if (j < i)
+ {
+ font->driver->draw (s, j, i, x, y, false);
+ if (s->face->overstrike)
+ font->driver->draw (s, j, i, x + 1, y, false);
+ }
+ }
+}
+
+static void
ns_draw_glyph_string (struct glyph_string *s)
/* --------------------------------------------------------------------------
External (RIF): Main draw-text call.
@@ -3279,13 +3376,14 @@ ns_draw_glyph_string (struct glyph_string *s)
{
BOOL isComposite = s->first_glyph->type == COMPOSITE_GLYPH;
- int end = isComposite ? s->cmp_to : s->nchars;
-
- font->driver->draw
- (s, s->cmp_from, end, s->x, s->ybase,
- (flags == NS_DUMPGLYPH_NORMAL && !s->background_filled_p)
- || flags == NS_DUMPGLYPH_MOUSEFACE);
+ if (isComposite)
+ ns_draw_composite_glyph_string_foreground (s);
+ else
+ font->driver->draw
+ (s, s->cmp_from, s->nchars, s->x, s->ybase,
+ (flags == NS_DUMPGLYPH_NORMAL && !s->background_filled_p)
+ || flags == NS_DUMPGLYPH_MOUSEFACE);
}
{
@@ -3866,7 +3964,6 @@ ns_set_horizontal_scroll_bar (struct window *window,
EmacsScroller *bar;
int top, height, left, width;
int window_x, window_width;
- int pixel_width = WINDOW_PIXEL_WIDTH (window);
BOOL update_p = YES;
/* optimization; display engine sends WAY too many of these.. */
@@ -4224,6 +4321,7 @@ ns_create_terminal (struct ns_display_info *dpyinfo)
terminal->menu_show_hook = ns_menu_show;
terminal->popup_dialog_hook = ns_popup_dialog;
terminal->set_vertical_scroll_bar_hook = ns_set_vertical_scroll_bar;
+ terminal->set_horizontal_scroll_bar_hook = ns_set_horizontal_scroll_bar;
terminal->condemn_scroll_bars_hook = ns_condemn_scroll_bars;
terminal->redeem_scroll_bar_hook = ns_redeem_scroll_bar;
terminal->judge_scroll_bars_hook = ns_judge_scroll_bars;
@@ -4508,7 +4606,7 @@ ns_term_shutdown (int sig)
- (id)init
{
- if (self = [super init])
+ if ((self = [super init]))
{
#ifdef NS_IMPL_COCOA
self->isFirst = YES;
@@ -4795,21 +4893,43 @@ ns_term_shutdown (int sig)
EV_TRAILER ((id)nil);
}
+static bool
+runAlertPanel(NSString *title,
+ NSString *msgFormat,
+ NSString *defaultButton,
+ NSString *alternateButton)
+{
+#if !defined (NS_IMPL_COCOA) || \
+ MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9
+ return NSRunAlertPanel(title, msgFormat, defaultButton, alternateButton, nil)
+ == NSAlertDefaultReturn;
+#else
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setAlertStyle: NSCriticalAlertStyle];
+ [alert setMessageText: msgFormat];
+ [alert addButtonWithTitle: defaultButton];
+ [alert addButtonWithTitle: alternateButton];
+ NSInteger ret = [alert runModal];
+ [alert release];
+ return ret == NSAlertFirstButtonReturn;
+#endif
+}
+
- (NSApplicationTerminateReply)applicationShouldTerminate: (id)sender
{
- int ret;
+ bool ret;
if (NILP (ns_confirm_quit)) // || ns_shutdown_properly --> TO DO
return NSTerminateNow;
- ret = NSRunAlertPanel(ns_app_name,
- @"Exit requested. Would you like to Save Buffers and Exit, or Cancel the request?",
- @"Save Buffers and Exit", @"Cancel", nil);
+ ret = runAlertPanel(ns_app_name,
+ @"Exit requested. Would you like to Save Buffers and Exit, or Cancel the request?",
+ @"Save Buffers and Exit", @"Cancel");
- if (ret == NSAlertDefaultReturn)
+ if (ret)
return NSTerminateNow;
- else if (ret == NSAlertAlternateReturn)
+ else
return NSTerminateCancel;
return NSTerminateNow; /* just in case */
}
@@ -5153,9 +5273,6 @@ not_in_argv (NSString *arg)
int code;
unsigned fnKeysym = 0;
static NSMutableArray *nsEvArray;
-#ifdef NS_IMPL_GNUSTEP
- static BOOL firstTime = YES;
-#endif
int left_is_none;
unsigned int flags = [theEvent modifierFlags];
@@ -5384,18 +5501,6 @@ not_in_argv (NSString *arg)
}
-#ifdef NS_IMPL_GNUSTEP
- /* if we get here we should send the key for input manager processing */
- /* Disable warning, there is nothing a user can do about it anyway, and
- it does not seem to matter. */
-#if 0
- if (firstTime && [[NSInputManager currentInputManager]
- wantsToDelayTextChangeNotifications] == NO)
- fprintf (stderr,
- "Emacs: WARNING: TextInput mgr wants marked text to be permanent!\n");
-#endif
- firstTime = NO;
-#endif
if (NS_KEYLOG && !processingCompose)
fprintf (stderr, "keyDown: Begin compose sequence.\n");
@@ -6160,8 +6265,10 @@ if (cols > 0 && rows > 0)
[win setAcceptsMouseMovedEvents: YES];
[win setDelegate: self];
+#if !defined (NS_IMPL_COCOA) || \
+ MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9
[win useOptimizedDrawing: YES];
-
+#endif
sz.width = frame_resize_pixelwise ? 1 : FRAME_COLUMN_WIDTH (f);
sz.height = frame_resize_pixelwise ? 1 : FRAME_LINE_HEIGHT (f);
[win setResizeIncrements: sz];
@@ -6222,8 +6329,10 @@ if (cols > 0 && rows > 0)
if ([col alphaComponent] != (EmacsCGFloat) 1.0)
[win setOpaque: NO];
+#if !defined (NS_IMPL_COCOA) || \
+ MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9
[self allocateGState];
-
+#endif
[NSApp registerServicesMenuSendTypes: ns_send_types
returnTypes: nil];
@@ -6278,7 +6387,7 @@ if (cols > 0 && rows > 0)
}
else if (next_maximized == FULLSCREEN_HEIGHT
|| (next_maximized == -1
- && abs (defaultFrame.size.height - result.size.height)
+ && abs ((int)(defaultFrame.size.height - result.size.height))
> FRAME_LINE_HEIGHT (emacsframe)))
{
/* first click */
@@ -6301,7 +6410,7 @@ if (cols > 0 && rows > 0)
}
else if (next_maximized == FULLSCREEN_MAXIMIZED
|| (next_maximized == -1
- && abs (defaultFrame.size.width - result.size.width)
+ && abs ((int)(defaultFrame.size.width - result.size.width))
> FRAME_COLUMN_WIDTH (emacsframe)))
{
result = defaultFrame; /* second click */
@@ -6548,7 +6657,10 @@ if (cols > 0 && rows > 0)
[fw setTitle:[w title]];
[fw setDelegate:self];
[fw setAcceptsMouseMovedEvents: YES];
+#if !defined (NS_IMPL_COCOA) || \
+ MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_9
[fw useOptimizedDrawing: YES];
+#endif
[fw setResizeIncrements: sz];
[fw setBackgroundColor: col];
if ([col alphaComponent] != (EmacsCGFloat) 1.0)
@@ -6791,7 +6903,7 @@ if (cols > 0 && rows > 0)
/* NSDraggingDestination protocol methods. Actually this is not really a
protocol, but a category of Object. O well... */
--(NSUInteger) draggingEntered: (id <NSDraggingInfo>) sender
+-(NSDragOperation) draggingEntered: (id <NSDraggingInfo>) sender
{
NSTRACE (draggingEntered);
return NSDragOperationGeneric;
@@ -7076,7 +7188,6 @@ if (cols > 0 && rows > 0)
one screen, we want to constrain. Other times not. */
NSArray *screens = [NSScreen screens];
NSUInteger nr_screens = [screens count], nr_eff_screens = 0, i;
- struct frame *f = ((EmacsView *)[self delegate])->emacsframe;
NSTRACE (constrainFrameRect);
NSTRACE_RECT ("input", frameRect);
@@ -7172,7 +7283,15 @@ if (cols > 0 && rows > 0)
{
/* TODO: if we want to allow variable widths, this is the place to do it,
however neither GNUstep nor Cocoa support it very well */
- return [NSScroller scrollerWidth];
+ CGFloat r;
+#if !defined (NS_IMPL_COCOA) || \
+ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
+ r = [NSScroller scrollerWidth];
+#else
+ r = [NSScroller scrollerWidthForControlSize: NSRegularControlSize
+ scrollerStyle: NSScrollerStyleLegacy];
+#endif
+ return r;
}
diff --git a/src/process.c b/src/process.c
index 3e04cb76387..ce78d818e29 100644
--- a/src/process.c
+++ b/src/process.c
@@ -136,8 +136,8 @@ extern int sys_select (int, fd_set *, fd_set *, fd_set *,
/* Work around GCC 4.7.0 bug with strict overflow checking; see
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52904>.
- These lines can be removed once the GCC bug is fixed. */
-#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+ This bug appears to be fixed in GCC 5.1, so don't work around it there. */
+#if __GNUC__ == 4 && __GNUC_MINOR__ >= 3
# pragma GCC diagnostic ignored "-Wstrict-overflow"
#endif
diff --git a/src/syntax.c b/src/syntax.c
index 2f821564294..1695815902a 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -186,7 +186,7 @@ static bool in_classes (int, Lisp_Object);
static void
bset_syntax_table (struct buffer *b, Lisp_Object val)
{
- b->INTERNAL_FIELD (syntax_table) = val;
+ b->syntax_table_ = val;
}
/* Whether the syntax of the character C has the prefix flag set. */
diff --git a/src/window.c b/src/window.c
index 0fcf82d43f4..b8281661b4d 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1748,7 +1748,11 @@ if it isn't already recorded. */)
|| b->clip_changed
|| b->prevent_redisplay_optimizations_p
|| window_outdated (w))
- && !noninteractive)
+ /* Don't call display routines if we didn't yet create any real
+ frames, because the glyph matrices are not yet allocated in
+ that case. This could happen in some code that runs in the
+ daemon during initialization (e.g., see bug#20565). */
+ && !(noninteractive || FRAME_INITIAL_P (WINDOW_XFRAME (w))))
{
struct text_pos startp;
struct it it;
diff --git a/src/xdisp.c b/src/xdisp.c
index 5a27adc2b18..c2f0b747c6e 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -13359,6 +13359,13 @@ redisplay_internal (void)
if (f->fonts_changed)
{
adjust_frame_glyphs (f);
+ /* Disable all redisplay optimizations for this frame.
+ This is because adjust_frame_glyphs resets the
+ enabled_p flag for all glyph rows of all windows, so
+ many optimizations will fail anyway, and some might
+ fail to test that flag and do bogus things as
+ result. */
+ SET_FRAME_GARBAGED (f);
f->fonts_changed = false;
}
/* If cursor type has been changed on the frame
@@ -13753,6 +13760,10 @@ redisplay_internal (void)
if (f->fonts_changed)
{
adjust_frame_glyphs (f);
+ /* Disable all redisplay optimizations for this
+ frame. For the reasons, see the comment near
+ the previous call to adjust_frame_glyphs above. */
+ SET_FRAME_GARBAGED (f);
f->fonts_changed = false;
goto retry_frame;
}
diff --git a/src/xterm.c b/src/xterm.c
index 3d3e0a70cfa..8f595c87214 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -263,7 +263,7 @@ static int x_dispatch_event (XEvent *, Display *);
#endif
/* Don't declare this _Noreturn because we want no
interference with debugging failing X calls. */
-static void x_connection_closed (Display *, const char *);
+static void x_connection_closed (Display *, const char *, bool);
static void x_wm_set_window_state (struct frame *, int);
static void x_wm_set_icon_pixmap (struct frame *, ptrdiff_t);
static void x_initialize (void);
@@ -3664,7 +3664,9 @@ x_draw_glyph_string (struct glyph_string *s)
static void
x_shift_glyphs_for_insert (struct frame *f, int x, int y, int width, int height, int shift_by)
{
- x_free_cr_resources (f);
+/* Never called on a GUI frame, see
+ http://lists.gnu.org/archive/html/emacs-devel/2015-05/msg00456.html
+*/
XCopyArea (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), FRAME_X_WINDOW (f),
f->output_data.x->normal_gc,
x, y, width, height,
@@ -9249,7 +9251,7 @@ static char *error_msg;
the text of an error message that lead to the connection loss. */
static void
-x_connection_closed (Display *dpy, const char *error_message)
+x_connection_closed (Display *dpy, const char *error_message, bool ioerror)
{
struct x_display_info *dpyinfo = x_display_info_for_display (dpy);
Lisp_Object frame, tail;
@@ -9268,6 +9270,7 @@ x_connection_closed (Display *dpy, const char *error_message)
dpyinfo->reference_count++;
dpyinfo->terminal->reference_count++;
}
+ if (ioerror) dpyinfo->display = 0;
/* First delete frames whose mini-buffers are on frames
that are on the dead display. */
@@ -9405,7 +9408,7 @@ x_error_quitter (Display *display, XErrorEvent *event)
XGetErrorText (display, event->error_code, buf, sizeof (buf));
sprintf (buf1, "X protocol error: %s on protocol request %d",
buf, event->request_code);
- x_connection_closed (display, buf1);
+ x_connection_closed (display, buf1, false);
}
@@ -9420,7 +9423,7 @@ x_io_error_quitter (Display *display)
snprintf (buf, sizeof buf, "Connection lost to X server `%s'",
DisplayString (display));
- x_connection_closed (display, buf);
+ x_connection_closed (display, buf, true);
return 0;
}
@@ -12251,7 +12254,7 @@ static struct redisplay_interface x_redisplay_interface =
x_draw_window_cursor,
x_draw_vertical_window_border,
x_draw_window_divider,
- x_shift_glyphs_for_insert,
+ x_shift_glyphs_for_insert, /* Never called, se comment in function. */
x_show_hourglass,
x_hide_hourglass
};
diff --git a/test/automated/cl-generic-tests.el b/test/automated/cl-generic-tests.el
index 5194802fa00..a6035d1cba2 100644
--- a/test/automated/cl-generic-tests.el
+++ b/test/automated/cl-generic-tests.el
@@ -179,5 +179,15 @@
(cl-list* "quatre" (cl-next-method-p) (cl-call-next-method)))
(should (equal (cl--generic-1 4 5) '("quatre" t 4 5 nil))))
+(ert-deftest sm-generic-test-12-context ()
+ (cl-defgeneric cl--generic-1 ())
+ (cl-defmethod cl--generic-1 (&context (overwrite-mode (eql t))) 'is-t)
+ (cl-defmethod cl--generic-1 (&context (overwrite-mode (eql nil))) 'is-nil)
+ (cl-defmethod cl--generic-1 () 'other)
+ (should (equal (list (let ((overwrite-mode t)) (cl--generic-1))
+ (let ((overwrite-mode nil)) (cl--generic-1))
+ (let ((overwrite-mode 1)) (cl--generic-1)))
+ '(is-t is-nil other))))
+
(provide 'cl-generic-tests)
;;; cl-generic-tests.el ends here
diff --git a/test/automated/cl-lib-tests.el b/test/automated/cl-lib-tests.el
index ce0e5918653..1bdc6d7ca09 100644
--- a/test/automated/cl-lib-tests.el
+++ b/test/automated/cl-lib-tests.el
@@ -422,6 +422,47 @@
;; should return a copy
(should-not (eq (cl-ldiff l '()) l))))
+(ert-deftest cl-lib-adjoin-test ()
+ (let ((nums '(1 2))
+ (myfn-p '=))
+ ;; add non-existing item to the front
+ (should (equal '(3 1 2) (cl-adjoin 3 nums)))
+ ;; just add - don't copy rest
+ (should (eq nums (cdr (cl-adjoin 3 nums))))
+ ;; add only when not already there
+ (should (eq nums (cl-adjoin 2 nums)))
+ (should (equal '(2 1 (2)) (cl-adjoin 2 '(1 (2)))))
+ ;; default test function is eql
+ (should (equal '(1.0 1 2) (cl-adjoin 1.0 nums)))
+ ;; own :test function - returns true if match
+ (should (equal '(1.0 1 2) (cl-adjoin 1.0 nums :test nil))) ;defaults to eql
+ (should (eq nums (cl-adjoin 2 nums :test myfn-p))) ;match
+ (should (equal '(3 1 2) (cl-adjoin 3 nums :test myfn-p))) ;no match
+ ;; own :test-not function - returns false if match
+ (should (equal '(1.0 1 2) (cl-adjoin 1.0 nums :test-not nil))) ;defaults to eql
+ (should (equal '(2 2) (cl-adjoin 2 '(2) :test-not myfn-p))) ; no match
+ (should (eq nums (cl-adjoin 2 nums :test-not myfn-p))) ; 1 matches
+ (should (eq nums (cl-adjoin 3 nums :test-not myfn-p))) ; 1 and 2 matches
+
+ ;; according to CLtL2 passing both :test and :test-not should signal error
+ ;;(should-error (cl-adjoin 3 nums :test 'myfn-p :test-not myfn-p))
+
+ ;; own :key fn
+ (should (eq nums (cl-adjoin 3 nums :key (lambda (x) (if (cl-evenp x) (1+ x) x)))))
+ (should (equal '(3 1 2) (cl-adjoin 3 nums :key (lambda (x) (if (cl-evenp x) (+ 2 x) x)))))
+
+ ;; convert using :key, then compare with :test
+ (should (eq nums (cl-adjoin 1 nums :key 'int-to-string :test 'string=)))
+ (should (equal '(3 1 2) (cl-adjoin 3 nums :key 'int-to-string :test 'string=)))
+ (should-error (cl-adjoin 3 nums :key 'int-to-string :test myfn-p)
+ :type 'wrong-type-argument)
+
+ ;; convert using :key, then compare with :test-not
+ (should (eq nums (cl-adjoin 3 nums :key 'int-to-string :test-not 'string=)))
+ (should (equal '(1 1) (cl-adjoin 1 '(1) :key 'int-to-string :test-not 'string=)))
+ (should-error (cl-adjoin 1 nums :key 'int-to-string :test-not myfn-p)
+ :type 'wrong-type-argument)))
+
(ert-deftest cl-parse-integer ()
(should-error (cl-parse-integer "abc"))
(should (null (cl-parse-integer "abc" :junk-allowed t)))
diff --git a/test/automated/elisp-mode-tests.el b/test/automated/elisp-mode-tests.el
new file mode 100644
index 00000000000..7af6dfcdc03
--- /dev/null
+++ b/test/automated/elisp-mode-tests.el
@@ -0,0 +1,129 @@
+;;; elisp-mode-tests.el --- Tests for emacs-lisp-mode -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2015 Free Software Foundation, Inc.
+
+;; Author: Dmitry Gutov <dgutov@yandex.ru>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Code:
+
+(require 'ert)
+(require 'xref)
+
+;;; Completion
+
+(defun elisp--test-completions ()
+ (let ((data (elisp-completion-at-point)))
+ (all-completions (buffer-substring (nth 0 data) (nth 1 data))
+ (nth 2 data)
+ (plist-get (nthcdr 3 data) :predicate))))
+
+(ert-deftest elisp-completes-functions ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(ba")
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-buffer" comps))
+ (should-not (member "backup-inhibited" comps)))))
+
+(ert-deftest elisp-completes-variables ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(foo ba")
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-inhibited" comps))
+ (should-not (member "backup-buffer" comps)))))
+
+(ert-deftest elisp-completes-anything-quoted ()
+ (dolist (text '("`(foo ba" "(foo 'ba"
+ "`(,foo ba" "`,(foo `ba"
+ "'(foo (ba"))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert text)
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-inhibited" comps))
+ (should (member "backup-buffer" comps))
+ (should (member "backup" comps))))))
+
+(ert-deftest elisp-completes-variables-unquoted ()
+ (dolist (text '("`(foo ,ba" "`(,(foo ba" "`(,ba"))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert text)
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-inhibited" comps))
+ (should-not (member "backup-buffer" comps))))))
+
+(ert-deftest elisp-completes-functions-in-special-macros ()
+ (dolist (text '("(declare-function ba" "(cl-callf2 ba"))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert text)
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-buffer" comps))
+ (should-not (member "backup-inhibited" comps))))))
+
+(ert-deftest elisp-completes-local-variables ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(let ((bar 1) baz) (foo ba")
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-inhibited" comps))
+ (should (member "bar" comps))
+ (should (member "baz" comps)))))
+
+(ert-deftest elisp-completest-variables-in-let-bindings ()
+ (dolist (text '("(let (ba" "(let* ((ba"))
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert text)
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-inhibited" comps))
+ (should-not (member "backup-buffer" comps))))))
+
+(ert-deftest elisp-completes-functions-after-let-bindings ()
+ (with-temp-buffer
+ (emacs-lisp-mode)
+ (insert "(let ((bar 1) (baz 2)) (ba")
+ (let ((comps (elisp--test-completions)))
+ (should (member "backup-buffer" comps))
+ (should-not (member "backup-inhibited" comps)))))
+
+;;; Navigation
+
+(ert-deftest elisp-xref-finds-both-function-and-variable ()
+ ;; "system-name" is both: a variable and a function
+ (let ((defs (elisp-xref-find 'definitions "system-name")))
+ (should (= (length defs) 2))
+ (should (string= (xref--xref-description (nth 0 defs))
+ "(defun system-name)"))
+ (should (string= (xref--xref-description (nth 1 defs))
+ "(defvar system-name)")))
+ ;; It's a minor mode, but the variable is defined in buffer.c
+ (let ((defs (elisp-xref-find 'definitions "abbrev-mode")))
+ (should (= (length defs) 2))))
+
+(ert-deftest elisp-xref-finds-only-function-for-minor-mode ()
+ ;; Both variable and function are defined in the same place.
+ (let ((defs (elisp-xref-find 'definitions "visible-mode")))
+ (should (= (length defs) 1))
+ (should (string= (xref--xref-description (nth 0 defs))
+ "(defun visible-mode)"))))
+
+(provide 'elisp-mode-tests)
+;;; elisp-mode-tests.el ends here
diff --git a/test/automated/package-test.el b/test/automated/package-test.el
index 4385ee0bd48..ed2e3cf25aa 100644
--- a/test/automated/package-test.el
+++ b/test/automated/package-test.el
@@ -343,6 +343,8 @@ Must called from within a `tar-mode' buffer."
(ert-deftest package-test-update-archives-async ()
"Test updating package archives asynchronously."
(skip-unless (executable-find "python2"))
+ ;; For some reason this test doesn't work reliably on hydra.nixos.org.
+ (skip-unless (not (getenv "NIX_STORE")))
(with-package-test (:basedir
package-test-data-dir
:location "http://0.0.0.0:8000/")
@@ -361,10 +363,13 @@ Must called from within a `tar-mode' buffer."
(while package--downloads-in-progress
(accept-process-output nil 1))
nil))
+ ;; If the server process died, there's some non-Emacs problem.
+ ;; Eg maybe the port was already in use.
+ (skip-unless (process-live-p process))
(goto-char (point-min))
(should
(search-forward-regexp "^ +simple-single" nil t)))
- (kill-process process)))))
+ (if (process-live-p process) (kill-process process))))))
(ert-deftest package-test-describe-package ()
"Test displaying help for a package."
diff --git a/test/automated/seq-tests.el b/test/automated/seq-tests.el
index 7f6e06cc4b6..ab46eb85f76 100644
--- a/test/automated/seq-tests.el
+++ b/test/automated/seq-tests.el
@@ -276,5 +276,26 @@ Evaluate BODY for each created sequence.
(v2 [2 4 6]))
(should (seq-empty-p (seq-difference v1 v2)))))
+(ert-deftest test-seq-let ()
+ (with-test-sequences (seq '(1 2 3 4))
+ (seq-let (a b c d e) seq
+ (should (= a 1))
+ (should (= b 2))
+ (should (= c 3))
+ (should (= d 4))
+ (should (null e)))
+ (seq-let (a b &rest others) seq
+ (should (= a 1))
+ (should (= b 2))
+ (should (same-contents-p others (seq-drop seq 2)))))
+ (let ((seq '(1 (2 (3 (4))))))
+ (seq-let (_ (_ (_ (a)))) seq
+ (should (= a 4))))
+ (let (seq)
+ (seq-let (a b c) seq
+ (should (null a))
+ (should (null b))
+ (should (null c)))))
+
(provide 'seq-tests)
;;; seq-tests.el ends here
diff --git a/test/etags/CTAGS.good b/test/etags/CTAGS.good
new file mode 100644
index 00000000000..1a885cc95fa
--- /dev/null
+++ b/test/etags/CTAGS.good
@@ -0,0 +1,4530 @@
+#a-defer-word forth-src/test-forth.fth /^defer #a-defer-word$/
+#some-storage forth-src/test-forth.fth /^2000 buffer: #some-storage$/
+$ make-src/Makefile /^ @-$(MAKE) OPTIONS='--no-members' ${LATEST}ediff$/
+$ make-src/Makefile /^ @-$(MAKE) OPTIONS='--declarations --no-members' $/
+$ make-src/Makefile /^ @-$(MAKE) OPTIONS='--members' ${LATEST}ediff$/
+$ make-src/Makefile /^ @-$(MAKE) OPTIONS='--regex=@regexfile --no-member/
+$ make-src/Makefile /^ @-$(MAKE) OPTIONS='nonexistent --members --declar/
+$ make-src/Makefile /^ @-$(MAKE) ${LATEST}cdiff$/
+$ make-src/Makefile /^ $(CC) ${FASTCFLAGS} -c $?$/
+$ make-src/Makefile /^ $(CC) ${FASTCFLAGS} -c $?$/
+$ make-src/Makefile /^ $(CC) ${FASTCFLAGS} -c $?$/
+$ make-src/Makefile /^ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o etags e/
+$ make-src/Makefile /^ $(CC) $(CFLAGS) $(CPPFLAGS) -DCTAGS $(LDFLAGS) -o/
+$$i make-src/Makefile 140
+$0x80 c-src/sysdep.h 32
+$SYS_##syscall_na c-src/sysdep.h 31
+$domain php-src/lce_functions.php 175
+$filename php-src/lce_functions.php 174
+$ignore_ws php-src/lce_functions.php 171
+$memassign php-src/ptest.php 9
+$memassign_space php-src/ptest.php 10
+$member php-src/ptest.php 8
+$msgid php-src/lce_functions.php 107
+$msgid php-src/lce_functions.php 165
+$msgid_lc php-src/lce_functions.php 113
+$msgstr php-src/lce_functions.php 108
+$msgstr php-src/lce_functions.php 166
+$msgstr_lc php-src/lce_functions.php 114
+$po_entries php-src/lce_functions.php 172
+$poe_num php-src/lce_functions.php 173
+$por_a php-src/lce_functions.php 500
+$prefix php-src/lce_functions.php 72
+$state php-src/lce_functions.php 170
+$sys_comment php-src/lce_functions.php 110
+$sys_comment php-src/lce_functions.php 168
+$sys_comment_lc php-src/lce_functions.php 116
+$test php-src/ptest.php 12
+$unk_comment php-src/lce_functions.php 111
+$unk_comment php-src/lce_functions.php 169
+$unk_comment_lc php-src/lce_functions.php 117
+$user_comment php-src/lce_functions.php 109
+$user_comment php-src/lce_functions.php 167
+$user_comment_lc php-src/lce_functions.php 115
+($_,$flag,$opt,$f,$r,@temp perl-src/yagrip.pl 8
+($prog,$_,@list perl-src/yagrip.pl 39
+($string,$flag,@string,@temp,@last perl-src/yagrip.pl 40
+(a-forth-constant forth-src/test-forth.fth /^constant (a-forth-constant$/
+(another-forth-word forth-src/test-forth.fth /^: (another-forth-word) ( -- )$/
++ tex-src/texinfo.tex /^\\def+{{\\tt \\char 43}}$/
+.PRECIOUS Makefile /^.PRECIOUS: ETAGS.good CTAGS.good$/
+/.notdef ps-src/rfc1245.ps /^\/.notdef \/.notdef \/.notdef \/.notdef \/.notdef \/.not/
+/.notdef ps-src/rfc1245.ps /^\/.notdef \/.notdef \/.notdef \/.notdef \/.notdef \/.not/
+/.notdef ps-src/rfc1245.ps /^\/.notdef \/.notdef \/.notdef \/.notdef \/.notdef \/.not/
+/.notdef ps-src/rfc1245.ps /^\/.notdef \/.notdef \/.notdef \/.notdef \/.notdef \/.not/
+/.notdef ps-src/rfc1245.ps /^\/.notdef \/.notdef \/.notdef \/.notdef \/space \/exclam/
+/A ps-src/rfc1245.ps /^\/A { $/
+/Acircumflex ps-src/rfc1245.ps /^\/Acircumflex \/Ecircumflex \/Aacute \/Edieresis \/Egra/
+/B ps-src/rfc1245.ps /^\/B { $/
+/BEGINBITMAP2BIT ps-src/rfc1245.ps /^\/BEGINBITMAP2BIT { $/
+/BEGINBITMAP2BITc ps-src/rfc1245.ps /^\/BEGINBITMAP2BITc { $/
+/BEGINBITMAPBW ps-src/rfc1245.ps /^\/BEGINBITMAPBW { $/
+/BEGINBITMAPBWc ps-src/rfc1245.ps /^\/BEGINBITMAPBWc { $/
+/BEGINBITMAPGRAY ps-src/rfc1245.ps /^\/BEGINBITMAPGRAY { $/
+/BEGINBITMAPGRAYc ps-src/rfc1245.ps /^\/BEGINBITMAPGRAYc { $/
+/BEGINPRINTCODE ps-src/rfc1245.ps /^\/BEGINPRINTCODE { $/
+/BF ps-src/rfc1245.ps /^\/BF { $/
+/BITMAPCOLOR ps-src/rfc1245.ps /^\/BITMAPCOLOR { $/
+/BITMAPCOLORc ps-src/rfc1245.ps /^\/BITMAPCOLORc { $/
+/BITMAPGRAY ps-src/rfc1245.ps /^\/BITMAPGRAY { $/
+/BITMAPGRAYc ps-src/rfc1245.ps /^\/BITMAPGRAYc { $/
+/C ps-src/rfc1245.ps /^\/C { $/
+/COMMONBITMAP ps-src/rfc1245.ps /^\/COMMONBITMAP { $/
+/COMMONBITMAPc ps-src/rfc1245.ps /^\/COMMONBITMAPc { $/
+/D ps-src/rfc1245.ps /^\/D {curveto} bind def$/
+/DiacriticEncoding ps-src/rfc1245.ps /^\/DiacriticEncoding [$/
+/E ps-src/rfc1245.ps /^\/E {lineto} bind def$/
+/ENDBITMAP ps-src/rfc1245.ps /^\/ENDBITMAP {$/
+/ENDPRINTCODE ps-src/rfc1245.ps /^\/ENDPRINTCODE {$/
+/F ps-src/rfc1245.ps /^\/F { $/
+/FMBEGINEPSF ps-src/rfc1245.ps /^\/FMBEGINEPSF { $/
+/FMBEGINPAGE ps-src/rfc1245.ps /^\/FMBEGINPAGE { $/
+/FMDEFINEFONT ps-src/rfc1245.ps /^\/FMDEFINEFONT { $/
+/FMDOCUMENT ps-src/rfc1245.ps /^\/FMDOCUMENT { $/
+/FMENDEPSF ps-src/rfc1245.ps /^\/FMENDEPSF {$/
+/FMENDPAGE ps-src/rfc1245.ps /^\/FMENDPAGE {$/
+/FMLOCAL ps-src/rfc1245.ps /^\/FMLOCAL {$/
+/FMNORMALIZEGRAPHICS ps-src/rfc1245.ps /^\/FMNORMALIZEGRAPHICS { $/
+/FMVERSION ps-src/rfc1245.ps /^\/FMVERSION {$/
+/FMversion ps-src/rfc1245.ps /^\/FMversion (2.0) def $/
+/Fmcc ps-src/rfc1245.ps /^\/Fmcc {$/
+/FrameDict ps-src/rfc1245.ps /^\/FrameDict 190 dict def $/
+/G ps-src/rfc1245.ps /^\/G { $/
+/H ps-src/rfc1245.ps /^\/H { $/
+/Icircumflex ps-src/rfc1245.ps /^\/Icircumflex \/Idieresis \/Igrave \/Oacute \/Ocircumfl/
+/L ps-src/rfc1245.ps /^\/L \/M \/N \/O \/P \/Q \/R \/S \/T \/U \/V \/W \/X \/Y \/Z \/brac/
+/L ps-src/rfc1245.ps /^\/L { $/
+/M ps-src/rfc1245.ps /^\/M {newpath moveto} bind def$/
+/N ps-src/rfc1245.ps /^\/N { $/
+/Ntilde ps-src/rfc1245.ps /^\/Ntilde \/Odieresis \/Udieresis \/aacute \/agrave \/aci/
+/O ps-src/rfc1245.ps /^\/O {closepath} bind def$/
+/Otilde ps-src/rfc1245.ps /^\/Otilde \/OE \/oe \/endash \/emdash \/quotedblleft \/quo/
+/P ps-src/rfc1245.ps /^\/P { $/
+/PF ps-src/rfc1245.ps /^\/PF { $/
+/R ps-src/rfc1245.ps /^\/R { $/
+/RF ps-src/rfc1245.ps /^\/RF { $/
+/RR ps-src/rfc1245.ps /^\/RR { $/
+/ReEncode ps-src/rfc1245.ps /^\/ReEncode { $/
+/S ps-src/rfc1245.ps /^\/S { $/
+/SF ps-src/rfc1245.ps /^\/SF { $/
+/T ps-src/rfc1245.ps /^\/T { $/
+/TF ps-src/rfc1245.ps /^\/TF { $/
+/U ps-src/rfc1245.ps /^\/U { $/
+/Uacute ps-src/rfc1245.ps /^\/Uacute \/Ucircumflex \/Ugrave \/dotlessi \/circumflex/
+/V ps-src/rfc1245.ps /^\/V { $/
+/W ps-src/rfc1245.ps /^\/W { $/
+/X ps-src/rfc1245.ps /^\/X { $/
+/Y ps-src/rfc1245.ps /^\/Y { $/
+/Z ps-src/rfc1245.ps /^\/Z {$/
+/atilde ps-src/rfc1245.ps /^\/atilde \/aring \/ccedilla \/eacute \/egrave \/ecircumf/
+/bl ps-src/rfc1245.ps /^\/bl { $/
+/braceright ps-src/rfc1245.ps /^\/braceright \/asciitilde \/.notdef \/Adieresis \/Aring/
+/bracketright ps-src/rfc1245.ps /^\/bracketright \/asciicircum \/underscore \/grave \/a \//
+/breve ps-src/rfc1245.ps /^\/breve \/dotaccent \/ring \/cedilla \/hungarumlaut \/og/
+/cfs ps-src/rfc1245.ps /^\/cfs { $/
+/colorsetup ps-src/rfc1245.ps /^\/colorsetup {$/
+/desperatepapersize ps-src/rfc1245.ps /^\/desperatepapersize {$/
+/dieresis ps-src/rfc1245.ps /^\/dieresis \/.notdef \/AE \/Oslash \/.notdef \/.notdef \//
+/dmatrix ps-src/rfc1245.ps /^\/dmatrix matrix def$/
+/dnormalize ps-src/rfc1245.ps /^\/dnormalize {$/
+/dpi ps-src/rfc1245.ps /^\/dpi 72 0 dmatrix defaultmatrix dtransform$/
+/exclamdown ps-src/rfc1245.ps /^\/exclamdown \/logicalnot \/.notdef \/florin \/.notdef /
+/fakecolorsetup ps-src/rfc1245.ps /^\/fakecolorsetup {$/
+/fillprocs ps-src/rfc1245.ps /^\/fillprocs 32 array def$/
+/fl ps-src/rfc1245.ps /^\/fl { $/
+/fraction ps-src/rfc1245.ps /^\/fraction \/currency \/guilsinglleft \/guilsinglright/
+/freq ps-src/rfc1245.ps /^\/freq dpi 18.75 div 8 div round dup 0 eq {pop 1} i/
+/gn ps-src/rfc1245.ps /^\/gn { $/
+/graymode ps-src/rfc1245.ps /^\/graymode true def$/
+/grayness ps-src/rfc1245.ps /^\/grayness {$/
+/guillemotleft ps-src/rfc1245.ps /^\/guillemotleft \/guillemotright \/ellipsis \/.notdef /
+/hx ps-src/rfc1245.ps /^\/hx { $/
+/i ps-src/rfc1245.ps /^\/i \/j \/k \/l \/m \/n \/o \/p \/q \/r \/s \/t \/u \/v \/w \/x \/y/
+/iacute ps-src/rfc1245.ps /^\/iacute \/igrave \/icircumflex \/idieresis \/ntilde \/o/
+/ic ps-src/rfc1245.ps /^\/ic [ $/
+/inch ps-src/rfc1245.ps /^\/inch {72 mul} def$/
+/ip ps-src/rfc1245.ps /^\/ip { $/
+/less ps-src/rfc1245.ps /^\/less \/equal \/greater \/question \/at \/A \/B \/C \/D \/E/
+/lnormalize ps-src/rfc1245.ps /^\/lnormalize { $/
+/manualpapersize ps-src/rfc1245.ps /^\/manualpapersize {$/
+/max ps-src/rfc1245.ps /^\/max {2 copy lt {exch} if pop} bind def$/
+/min ps-src/rfc1245.ps /^\/min {2 copy gt {exch} if pop} bind def$/
+/ms ps-src/rfc1245.ps /^\/ms { $/
+/nbluet ps-src/rfc1245.ps /^\/nbluet 256 array def$/
+/ngrayt ps-src/rfc1245.ps /^\/ngrayt 256 array def$/
+/ngreent ps-src/rfc1245.ps /^\/ngreent 256 array def$/
+/normalize ps-src/rfc1245.ps /^\/normalize {$/
+/nredt ps-src/rfc1245.ps /^\/nredt 256 array def$/
+/numbersign ps-src/rfc1245.ps /^\/numbersign \/dollar \/percent \/ampersand \/quotesing/
+/ocircumflex ps-src/rfc1245.ps /^\/ocircumflex \/odieresis \/otilde \/uacute \/ugrave \/u/
+/ordfeminine ps-src/rfc1245.ps /^\/ordfeminine \/ordmasculine \/.notdef \/ae \/oslash \/q/
+/pagedimen ps-src/rfc1245.ps /^\/pagedimen { $/
+/papersize ps-src/rfc1245.ps /^\/papersize {$/
+/paragraph ps-src/rfc1245.ps /^\/paragraph \/germandbls \/registered \/copyright \/tra/
+/parenright ps-src/rfc1245.ps /^\/parenright \/asterisk \/plus \/comma \/hyphen \/period/
+/periodcentered ps-src/rfc1245.ps /^\/periodcentered \/quotesinglbase \/quotedblbase \/per/
+/quoteleft ps-src/rfc1245.ps /^\/quoteleft \/quoteright \/.notdef \/.notdef \/ydieresi/
+/restorematrix ps-src/rfc1245.ps /^\/restorematrix {$/
+/s1 ps-src/rfc1245.ps /^\/s1 1 string def$/
+/sangle ps-src/rfc1245.ps /^\/sangle 1 0 dmatrix defaultmatrix dtransform exch /
+/savematrix ps-src/rfc1245.ps /^\/savematrix {$/
+/setmanualfeed ps-src/rfc1245.ps /^\/setmanualfeed {$/
+/setpapername ps-src/rfc1245.ps /^\/setpapername { $/
+/setpattern ps-src/rfc1245.ps /^\/setpattern {$/
+/two ps-src/rfc1245.ps /^\/two \/three \/four \/five \/six \/seven \/eight \/nine \//
+/udieresis ps-src/rfc1245.ps /^\/udieresis \/dagger \/.notdef \/cent \/sterling \/secti/
+/wbytes ps-src/rfc1245.ps /^\/wbytes { $/
+/wh ps-src/rfc1245.ps /^\/wh { $/
+/yen ps-src/rfc1245.ps /^\/yen \/.notdef \/.notdef \/.notdef \/.notdef \/.notdef /
+::cat cp-src/c.C 126
+::dog cp-src/c.C 126
+::f cp-src/c.C /^ void f() {}$/
+::teats cp-src/c.C 127
+:a-forth-dictionary-entry forth-src/test-forth.fth /^create :a-forth-dictionary-entry$/
+< tex-src/texinfo.tex /^\\def<{{\\tt \\less}}$/
+= tex-src/texinfo.tex /^\\global\\let\\section = \\numberedsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsection = \\numberedsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsubsection = \\numberedsubsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\section = \\appendixsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsection = \\appendixsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsubsection = \\appendixsubsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\section = \\unnumberedsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsection = \\unnumberedsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsubsection = \\unnumberedsubsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\section = \\numberedsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsection = \\numberedsubsec$/
+= tex-src/texinfo.tex /^\\global\\let\\subsubsection = \\numberedsubsubsec$/
+= tex-src/texinfo.tex /^\\global\\def={{\\tt \\char 61}}}$/
+=/f ada-src/etags-test-for.ada /^ function "=" (L, R : System.Address) return Boo/
+=\indexdummyfont tex-src/texinfo.tex /^\\let\\cite=\\indexdummyfont$/
+=\relax tex-src/texinfo.tex /^\\let\\chapter=\\relax$/
+=\relax tex-src/texinfo.tex /^\\let\\section=\\relax$/
+=\relax tex-src/texinfo.tex /^\\let\\subsection=\\relax$/
+=\relax tex-src/texinfo.tex /^\\let\\subsubsection=\\relax$/
+=\relax tex-src/texinfo.tex /^\\let\\appendix=\\relax$/
+=\smartitalic tex-src/texinfo.tex /^\\let\\cite=\\smartitalic$/
+> tex-src/texinfo.tex /^\\def>{{\\tt \\gtr}}$/
+>field1 forth-src/test-forth.fth /^ 9 field >field1$/
+>field2 forth-src/test-forth.fth /^ 5 field >field2$/
+@$ make-src/Makefile /^ @$(MAKE) OPTIONS='--no-members' ${LATEST}ediff$/
+@$ make-src/Makefile /^ @$(MAKE) OPTIONS='--declarations --no-members' ${/
+@$ make-src/Makefile /^ @$(MAKE) OPTIONS='--members' ${LATEST}ediff$/
+@$ make-src/Makefile /^ @$(MAKE) OPTIONS='--regex=@regexfile --no-members/
+@$ make-src/Makefile /^ @$(MAKE) OPTIONS='nonexistent --members --declara/
+@$ make-src/Makefile /^ @$(MAKE) ${LATEST}cdiff$/
+@$ make-src/Makefile /^ @$(MAKE) etags "CPPFLAGS=-UVERSION"$/
+@$ make-src/Makefile /^ @$(MAKE) CHECKOBJS= CHECKFLAGS= etags "CFLAGS=-an/
+@$ make-src/Makefile /^ @$(MAKE) CHECKOBJS= CHECKFLAGS= ctags "CFLAGS=-an/
+@$ make-src/Makefile /^ @$(MAKE) etags CHECKOBJS= CHECKFLAGS= REGEXOBJS= /
+A c.c 162
+A cp-src/c.C 39
+A cp-src/c.C 56
+A cp-src/c.C 57
+A cp-src/c.C 73
+A cp-src/c.C 117
+A cp-src/fail.C 7
+A cp-src/fail.C 23
+A::A cp-src/c.C /^void A::A() {}$/
+A::B cp-src/c.C 56
+A::B cp-src/fail.C 8
+A::B cp-src/fail.C 24
+A::B::C cp-src/fail.C 9
+A::B::C cp-src/fail.C 25
+A::B::C::C cp-src/fail.C /^ C(int i) {x = i;}$/
+A::B::C::operator int cp-src/fail.C /^ operator int() const {return x;}$/
+A::B::C::x cp-src/fail.C 10
+A::B::T cp-src/fail.C 14
+A::B::f cp-src/fail.C /^ int f() { return 5; }$/
+A::B::f cp-src/fail.C /^int A::B::f() { return 2; }$/
+A::T2 cp-src/fail.C 16
+A::colori cp-src/c.C 40
+A::giallo cp-src/c.C 40
+A::operator+ cp-src/c.C /^const A& A::operator+(const A&) { }$/
+A::operator+ cp-src/c.C /^ A operator+(A& a) {};$/
+A::rosso cp-src/c.C 40
+A::verde cp-src/c.C 40
+A::~A cp-src/c.C /^A::~A() {}$/
+ADASRC Makefile /^ADASRC=$(addprefix .\/ada-src\/,etags-test-for.ada 2/
+ADDRESS c-src/emacs/src/gmalloc.c /^#define ADDRESS(B) ((void *) (((B) - 1) * BLOCKSIZ/
+ALIGNOF_STRUCT_LISP_VECTOR c-src/emacs/src/lisp.h 1378
+ALLOCATED_BEFORE_DUMPING c-src/emacs/src/gmalloc.c /^#define ALLOCATED_BEFORE_DUMPING(P) \\$/
+ALLOCATE_PSEUDOVECTOR c-src/emacs/src/lisp.h /^#define ALLOCATE_PSEUDOVECTOR(type, field, tag) /
+ALLOCATE_ZEROED_PSEUDOVECTOR c-src/emacs/src/lisp.h /^#define ALLOCATE_ZEROED_PSEUDOVECTOR(type, field, /
+AND y-src/cccp.c 11
+ANSIC c-src/h.h 84
+ANSIC c-src/h.h 85
+AREF c-src/emacs/src/lisp.h /^AREF (Lisp_Object array, ptrdiff_t idx)$/
+ARGS Makefile /^ARGS=- < srclist$/
+ARITH_EQUAL c-src/emacs/src/lisp.h 3498
+ARITH_GRTR c-src/emacs/src/lisp.h 3501
+ARITH_GRTR_OR_EQUAL c-src/emacs/src/lisp.h 3503
+ARITH_LESS c-src/emacs/src/lisp.h 3500
+ARITH_LESS_OR_EQUAL c-src/emacs/src/lisp.h 3502
+ARITH_NOTEQUAL c-src/emacs/src/lisp.h 3499
+ARRAYELTS c-src/emacs/src/lisp.h /^#define ARRAYELTS(arr) (sizeof (arr) \/ sizeof (arr/
+ARRAYP c-src/emacs/src/lisp.h /^ARRAYP (Lisp_Object x)$/
+ARRAY_MARK_FLAG c-src/emacs/src/lisp.h 768
+ASCII_CHAR_P c-src/emacs/src/lisp.h /^#define ASCII_CHAR_P(c) UNSIGNED_CMP (c, <, 0x80)$/
+ASET c-src/emacs/src/lisp.h /^ASET (Lisp_Object array, ptrdiff_t idx, Lisp_Objec/
+ASIZE c-src/emacs/src/lisp.h /^ASIZE (Lisp_Object array)$/
+ASRC Makefile /^ASRC=$(addprefix .\/a-src\/,empty.zz empty.zz.gz)$/
+AST_Array::AST_Array cp-src/c.C /^AST_Array::AST_Array(UTL_ScopedName *n, unsigned l/
+AST_ConcreteType::AST_ConcreteType cp-src/c.C /^AST_ConcreteType::AST_ConcreteType(AST_Decl::NodeT/
+AST_Root cp-src/c.C 92
+AT cp-src/c.C 52
+AT::t cp-src/c.C 52
+AU cp-src/c.C 53
+AU::x cp-src/c.C 53
+AUTOLOADP c-src/emacs/src/lisp.h /^AUTOLOADP (Lisp_Object x)$/
+AUTO_CONS c-src/emacs/src/lisp.h /^#define AUTO_CONS(name, a, b) Lisp_Object name = A/
+AUTO_CONS_EXPR c-src/emacs/src/lisp.h /^#define AUTO_CONS_EXPR(a, b) \\$/
+AUTO_LIST1 c-src/emacs/src/lisp.h /^#define AUTO_LIST1(name, a) \\$/
+AUTO_LIST2 c-src/emacs/src/lisp.h /^#define AUTO_LIST2(name, a, b) \\$/
+AUTO_LIST3 c-src/emacs/src/lisp.h /^#define AUTO_LIST3(name, a, b, c) \\$/
+AUTO_LIST4 c-src/emacs/src/lisp.h /^#define AUTO_LIST4(name, a, b, c, d) \\$/
+AUTO_STRING c-src/emacs/src/lisp.h /^#define AUTO_STRING(name, str) \\$/
+AVAIL_ALLOCA c-src/emacs/src/lisp.h /^#define AVAIL_ALLOCA(size) (sa_avail -= (size), al/
+Abort_Handler_Pointer/t ada-src/2ataspri.ads /^ type Abort_Handler_Pointer is access procedure /
+Abort_Task/p ada-src/2ataspri.adb /^ procedure Abort_Task (T : TCB_Ptr) is$/
+Abort_Task/p ada-src/2ataspri.ads /^ procedure Abort_Task (T : TCB_Ptr);$/
+Abort_Wrapper/p ada-src/2ataspri.adb /^ procedure Abort_Wrapper$/
+Abort_Wrapper/p ada-src/2ataspri.adb /^ procedure Abort_Wrapper$/
+Ada_funcs c-src/etags.c /^Ada_funcs (FILE *inf)$/
+Ada_getit c-src/etags.c /^Ada_getit (FILE *inf, const char *name_qualifier)$/
+Ada_help c-src/etags.c 475
+Ada_suffixes c-src/etags.c 473
+AddNullToNmStr pas-src/common.pas /^function AddNullToNmStr; (*($/
+Address_To_Call_State/f ada-src/2ataspri.adb /^ function Address_To_Call_State is new$/
+Address_To_TCB_Ptr/f ada-src/2ataspri.ads /^ function Address_To_TCB_Ptr is new$/
+Advanced usage tex-src/gzip.texi /^@node Advanced usage, Environment, Invoking gzip, /
+Aligned_Cons c-src/emacs/src/lisp.h 4670
+Aligned_String c-src/emacs/src/lisp.h 4676
+AppendTextString pas-src/common.pas /^function AppendTextString;(*($/
+Arith_Comparison c-src/emacs/src/lisp.h 3497
+Asm_help c-src/etags.c 504
+Asm_labels c-src/etags.c /^Asm_labels (FILE *inf)$/
+Asm_suffixes c-src/etags.c 493
+B cp-src/c.C 54
+B cp-src/c.C 74
+B cp-src/c.C 122
+B::B cp-src/c.C /^void B::B() {}$/
+B::f cp-src/c.C /^class B<int> { void f() {} };$/
+B::~B cp-src/c.C /^ ~B() {};$/
+BE_Node cp-src/c.C 77
+BE_Node::BE_Node cp-src/c.C /^void BE_Node::BE_Node() {}$/
+BITS_PER_BITS_WORD c-src/emacs/src/lisp.h 125
+BITS_PER_BITS_WORD c-src/emacs/src/lisp.h 129
+BITS_PER_CHAR c-src/emacs/src/lisp.h 136
+BITS_PER_EMACS_INT c-src/emacs/src/lisp.h 139
+BITS_PER_LONG c-src/emacs/src/lisp.h 138
+BITS_PER_SHORT c-src/emacs/src/lisp.h 137
+BITS_WORD_MAX c-src/emacs/src/lisp.h 124
+BITS_WORD_MAX c-src/emacs/src/lisp.h 128
+BLOCK c-src/emacs/src/gmalloc.c /^#define BLOCK(A) (((char *) (A) - _heapbase) \/ BLO/
+BLOCKIFY c-src/emacs/src/gmalloc.c /^#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) \//
+BLOCKLOG c-src/emacs/src/gmalloc.c 125
+BLOCKSIZE c-src/emacs/src/gmalloc.c 126
+BOOL_VECTOR_BITS_PER_CHAR c-src/emacs/src/lisp.h 114
+BOOL_VECTOR_BITS_PER_CHAR c-src/emacs/src/lisp.h 115
+BOOL_VECTOR_P c-src/emacs/src/lisp.h /^BOOL_VECTOR_P (Lisp_Object a)$/
+BUFFERP c-src/emacs/src/lisp.h /^BUFFERP (Lisp_Object a)$/
+BUFFERSIZE objc-src/Subprocess.h 43
+BUFFER_OBJFWDP c-src/emacs/src/lisp.h /^BUFFER_OBJFWDP (union Lisp_Fwd *a)$/
+BYTE_MARK_STACK c-src/emacs/src/lisp.h 3181
+Bar perl-src/kai-test.pl /^package Bar;$/
+Bar::f4 perl-src/kai-test.pl /^sub Bar::f4 {$/
+Bar::f5 perl-src/kai-test.pl /^sub f5 {$/
+Barrier_Function_Pointer/t ada-src/etags-test-for.ada /^ type Barrier_Function_Pointer is access$/
+Bidule/b ada-src/etags-test-for.ada /^ protected body Bidule is$/
+Bidule/b ada-src/waroquiers.ada /^ protected body Bidule is$/
+Bidule/t ada-src/etags-test-for.ada /^ protected Bidule is$/
+Bidule/t ada-src/waroquiers.ada /^ protected Bidule is$/
+Body_Required/f ada-src/etags-test-for.ada /^ function Body_Required$/
+Boo cp-src/c.C 129
+Boo::Boo cp-src/c.C /^ Boo(int _i, int _a, int _b) : i(_i), a(_a), b(/
+Boo::Boo cp-src/c.C /^Boo::Boo(Boo) :$/
+Boo::a cp-src/c.C 132
+Boo::animals cp-src/c.C 130
+Boo::b cp-src/c.C 132
+Boo::cat cp-src/c.C 130
+Boo::cow cp-src/c.C 131
+Boo::dog cp-src/c.C 130
+Boo::foo cp-src/c.C /^ foo() {$/
+Boo::i cp-src/c.C 132
+Boo::treats cp-src/c.C 131
+ButtonBar pyt-src/server.py /^def ButtonBar(frame, legend, ref, alternatives, co/
+CALLMANY c-src/emacs/src/lisp.h /^#define CALLMANY(f, array) (f) (ARRAYELTS (array),/
+CALLN c-src/emacs/src/lisp.h /^#define CALLN(f, ...) CALLMANY (f, ((Lisp_Object [/
+CAR c-src/emacs/src/lisp.h /^CAR (Lisp_Object c)$/
+CAR_SAFE c-src/emacs/src/lisp.h /^CAR_SAFE (Lisp_Object c)$/
+CATCHER c-src/emacs/src/lisp.h 3021
+CDR c-src/emacs/src/lisp.h /^CDR (Lisp_Object c)$/
+CDR_SAFE c-src/emacs/src/lisp.h /^CDR_SAFE (Lisp_Object c)$/
+CFLAGS make-src/Makefile 88
+CHAR c-src/etags.c /^#define CHAR(x) ((unsigned int)(x) & (CHARS - 1))/
+CHAR y-src/cccp.c 7
+CHARACTERBITS c-src/emacs/src/lisp.h 2457
+CHARS c-src/etags.c 157
+CHARTAB_SIZE_BITS c-src/emacs/src/lisp.h 1565
+CHARTAB_SIZE_BITS_0 c-src/emacs/src/lisp.h 1567
+CHARTAB_SIZE_BITS_1 c-src/emacs/src/lisp.h 1568
+CHARTAB_SIZE_BITS_2 c-src/emacs/src/lisp.h 1569
+CHARTAB_SIZE_BITS_3 c-src/emacs/src/lisp.h 1570
+CHAR_ALT c-src/emacs/src/lisp.h 2445
+CHAR_CLASS_MAX_LENGTH c-src/emacs/src/regex.h 593
+CHAR_CLASS_MAX_LENGTH c-src/emacs/src/regex.h 597
+CHAR_CLASS_MAX_LENGTH c-src/emacs/src/regex.h 605
+CHAR_CTL c-src/emacs/src/lisp.h 2449
+CHAR_HYPER c-src/emacs/src/lisp.h 2447
+CHAR_META c-src/emacs/src/lisp.h 2450
+CHAR_MODIFIER_MASK c-src/emacs/src/lisp.h 2452
+CHAR_SHIFT c-src/emacs/src/lisp.h 2448
+CHAR_SUPER c-src/emacs/src/lisp.h 2446
+CHAR_TABLE_EXTRA_SLOTS c-src/emacs/src/lisp.h /^CHAR_TABLE_EXTRA_SLOTS (struct Lisp_Char_Table *ct/
+CHAR_TABLE_P c-src/emacs/src/lisp.h /^CHAR_TABLE_P (Lisp_Object a)$/
+CHAR_TABLE_REF c-src/emacs/src/lisp.h /^CHAR_TABLE_REF (Lisp_Object ct, int idx)$/
+CHAR_TABLE_REF_ASCII c-src/emacs/src/lisp.h /^CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t id/
+CHAR_TABLE_SET c-src/emacs/src/lisp.h /^CHAR_TABLE_SET (Lisp_Object ct, int idx, Lisp_Obje/
+CHAR_TABLE_STANDARD_SLOTS c-src/emacs/src/lisp.h 1697
+CHAR_TYPE_SIZE cccp.y 87
+CHAR_TYPE_SIZE y-src/cccp.y 87
+CHECKEROPTS make-src/Makefile 92
+CHECK_ARRAY c-src/emacs/src/lisp.h /^CHECK_ARRAY (Lisp_Object x, Lisp_Object predicate)/
+CHECK_BOOL_VECTOR c-src/emacs/src/lisp.h /^CHECK_BOOL_VECTOR (Lisp_Object x)$/
+CHECK_BUFFER c-src/emacs/src/lisp.h /^CHECK_BUFFER (Lisp_Object x)$/
+CHECK_CONS c-src/emacs/src/lisp.h /^CHECK_CONS (Lisp_Object x)$/
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h 571
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h 572
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h 572
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h 579
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h 579
+CHECK_LIST c-src/emacs/src/lisp.h /^CHECK_LIST (Lisp_Object x)$/
+CHECK_LIST_CONS c-src/emacs/src/lisp.h /^# define CHECK_LIST_CONS(x, y) lisp_h_CHECK_LIST_C/
+CHECK_NATNUM c-src/emacs/src/lisp.h /^CHECK_NATNUM (Lisp_Object x)$/
+CHECK_NUMBER c-src/emacs/src/lisp.h /^# define CHECK_NUMBER(x) lisp_h_CHECK_NUMBER (x)$/
+CHECK_NUMBER_CAR c-src/emacs/src/lisp.h /^CHECK_NUMBER_CAR (Lisp_Object x)$/
+CHECK_NUMBER_CDR c-src/emacs/src/lisp.h /^CHECK_NUMBER_CDR (Lisp_Object x)$/
+CHECK_NUMBER_COERCE_MARKER c-src/emacs/src/lisp.h /^#define CHECK_NUMBER_COERCE_MARKER(x) \\$/
+CHECK_NUMBER_OR_FLOAT c-src/emacs/src/lisp.h /^CHECK_NUMBER_OR_FLOAT (Lisp_Object x)$/
+CHECK_NUMBER_OR_FLOAT_COERCE_MARKER c-src/emacs/src/lisp.h /^#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x) /
+CHECK_PROCESS c-src/emacs/src/lisp.h /^CHECK_PROCESS (Lisp_Object x)$/
+CHECK_RANGED_INTEGER c-src/emacs/src/lisp.h /^#define CHECK_RANGED_INTEGER(x, lo, hi) \\$/
+CHECK_STRING_CAR c-src/emacs/src/lisp.h /^CHECK_STRING_CAR (Lisp_Object x)$/
+CHECK_SYMBOL c-src/emacs/src/lisp.h /^# define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x)$/
+CHECK_TYPE c-src/emacs/src/lisp.h /^# define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK/
+CHECK_TYPE_RANGED_INTEGER c-src/emacs/src/lisp.h /^#define CHECK_TYPE_RANGED_INTEGER(type, x) \\$/
+CHECK_VECTOR c-src/emacs/src/lisp.h /^CHECK_VECTOR (Lisp_Object x)$/
+CHECK_VECTOR_OR_STRING c-src/emacs/src/lisp.h /^CHECK_VECTOR_OR_STRING (Lisp_Object x)$/
+CHECK_WINDOW c-src/emacs/src/lisp.h /^CHECK_WINDOW (Lisp_Object x)$/
+CK_ABS_C y-src/parse.y /^#define CK_ABS_C(x) if((x)<MIN_COL || (x)>MAX_COL)/
+CK_ABS_C parse.y /^#define CK_ABS_C(x) if((x)<MIN_COL || (x)>MAX_COL)/
+CK_ABS_R y-src/parse.y /^#define CK_ABS_R(x) if((x)<MIN_ROW || (x)>MAX_ROW)/
+CK_ABS_R parse.y /^#define CK_ABS_R(x) if((x)<MIN_ROW || (x)>MAX_ROW)/
+CK_REL_C y-src/parse.y /^#define CK_REL_C(x) if( ((x)>0 && MAX_COL-(x)<cu/
+CK_REL_C parse.y /^#define CK_REL_C(x) if( ((x)>0 && MAX_COL-(x)<cu/
+CK_REL_R y-src/parse.y /^#define CK_REL_R(x) if( ((x)>0 && MAX_ROW-(x)<cu/
+CK_REL_R parse.y /^#define CK_REL_R(x) if( ((x)>0 && MAX_ROW-(x)<cu/
+CMultiChannelCSC19_3D cp-src/c.C 2
+CMultiChannelCSC19_3D::cscInitTime cp-src/c.C 7
+CMultiChannelCSC19_3D::cscSegmentationTime cp-src/c.C 8
+CMultiChannelCSC19_3D::execute cp-src/c.C /^ void execute(CPluginCSCState& p, int w, in/
+CMultiChannelCSC19_3D::ipc3dCSC19 cp-src/c.C 6
+CMultiChannelCSC19_3D::mcCSC cp-src/c.C 6
+CMultiChannelCSC19_3D::outputTime cp-src/c.C 9
+CMultiChannelCSC19_3D::setup cp-src/c.C 5
+CNL c-src/etags.c /^#define CNL() \\$/
+CNL_SAVE_DEFINEDEF c-src/etags.c /^#define CNL_SAVE_DEFINEDEF() \\$/
+COLORS cp-src/screen.hpp 11
+COLORS::BLACK cp-src/screen.hpp 12
+COLORS::BLUE cp-src/screen.hpp 13
+COLORS::BROWN cp-src/screen.hpp 18
+COLORS::CYAN cp-src/screen.hpp 15
+COLORS::DARKGRAY cp-src/screen.hpp 20
+COLORS::GREEN cp-src/screen.hpp 14
+COLORS::LIGHTBLUE cp-src/screen.hpp 21
+COLORS::LIGHTCYAN cp-src/screen.hpp 23
+COLORS::LIGHTGRAY cp-src/screen.hpp 19
+COLORS::LIGHTGREEN cp-src/screen.hpp 22
+COLORS::LIGHTMAGENTA cp-src/screen.hpp 25
+COLORS::LIGHTRED cp-src/screen.hpp 24
+COLORS::MAGENTA cp-src/screen.hpp 17
+COLORS::RED cp-src/screen.hpp 16
+COLORS::WHITE cp-src/screen.hpp 27
+COLORS::YELLOW cp-src/screen.hpp 26
+COMPILEDP c-src/emacs/src/lisp.h /^COMPILEDP (Lisp_Object a)$/
+COMPILED_ARGLIST c-src/emacs/src/lisp.h 2431
+COMPILED_BYTECODE c-src/emacs/src/lisp.h 2432
+COMPILED_CONSTANTS c-src/emacs/src/lisp.h 2433
+COMPILED_DOC_STRING c-src/emacs/src/lisp.h 2435
+COMPILED_INTERACTIVE c-src/emacs/src/lisp.h 2436
+COMPILED_STACK_DEPTH c-src/emacs/src/lisp.h 2434
+CONDITION_CASE c-src/emacs/src/lisp.h 3021
+CONSP c-src/emacs/src/lisp.h /^# define CONSP(x) lisp_h_CONSP (x)$/
+CONSTYPE_HEAP c-src/emacs/src/lisp.h 3739
+CONSTYPE_PURE c-src/emacs/src/lisp.h 3739
+CONS_TO_INTEGER c-src/emacs/src/lisp.h /^#define CONS_TO_INTEGER(cons, type, var) \\$/
+CONVERT_CHARSTRING_TO_VALUE pas-src/common.pas /^procedure CONVERT_CHARSTRING_TO_VALUE;(*($/
+CPPFLAGS make-src/Makefile 49
+CPSRC Makefile /^CPSRC=$(addprefix .\/cp-src\/,c.C burton.cpp burton./
+CSRC Makefile /^CSRC=$(addprefix .\/c-src\/,abbrev.c .\/\/c.c torture./
+CTAGS Makefile /^CTAGS: FRC ${infiles}$/
+CTAGS c-src/etags.c 146
+CTAGS c-src/etags.c 147
+CTAGS c-src/etags.c 149
+CTAGS_PROG Makefile /^CTAGS_PROG=..\/..\/lib-src\/ctags$/
+C_AUTO c-src/etags.c 2198
+C_EXT c-src/etags.c 2193
+C_JAVA c-src/etags.c 2197
+C_PLAIN c-src/etags.c 2194
+C_PLPL c-src/etags.c 2195
+C_STAR c-src/etags.c 2196
+C_entries c-src/etags.c /^C_entries (int c_ext, FILE *inf)$/
+C_stab_entry c-src/etags.c 2271
+C_symtype c-src/etags.c /^C_symtype (char *str, int len, int c_ext)$/
+ChangeFileType pas-src/common.pas /^function ChangeFileType; (*(FileName : NameString;/
+Cjava_entries c-src/etags.c /^Cjava_entries (FILE *inf)$/
+Cjava_help c-src/etags.c 551
+Cjava_suffixes c-src/etags.c 549
+Clear/p ada-src/2ataspri.adb /^ procedure Clear (Cell : in out TAS_Cell) is$/
+Clear/p ada-src/2ataspri.ads /^ procedure Clear (Cell : in out TAS_Cell)/
+Cobol_help c-src/etags.c 558
+Cobol_paragraphs c-src/etags.c /^Cobol_paragraphs (FILE *inf)$/
+Cobol_suffixes c-src/etags.c 556
+CommentAD php-src/lce_functions.php 70
+CommentAD php-src/lce_functions.php /^ function CommentAD($/
+ConcatT pas-src/common.pas /^function ConcatT;(*($/
+Concept Index tex-src/gzip.texi /^@node Concept Index, , Problems, Top$/
+Cond_Signal/p ada-src/2ataspri.adb /^ procedure Cond_Signal (Cond : in out Condition_/
+Cond_Signal/p ada-src/2ataspri.ads /^ procedure Cond_Signal (Cond : in out Condition_/
+Cond_Timed_Wait/p ada-src/2ataspri.adb /^ procedure Cond_Timed_Wait$/
+Cond_Timed_Wait/p ada-src/2ataspri.ads /^ procedure Cond_Timed_Wait$/
+Cond_Wait/p ada-src/2ataspri.adb /^ procedure Cond_Wait (Cond : in out Condition_Va/
+Cond_Wait/p ada-src/2ataspri.ads /^ procedure Cond_Wait (Cond : in out Condition_Va/
+Condition_Variable/t ada-src/2ataspri.ads /^ type Condition_Variable is private;$/
+Condition_Variable/t ada-src/2ataspri.ads /^ type Condition_Variable is$/
+Configure pyt-src/server.py /^class Configure(Frame, ControlEdit):$/
+ConfirmQuit pyt-src/server.py /^def ConfirmQuit(frame, context):$/
+ControlEdit pyt-src/server.py /^class ControlEdit(Frame):$/
+Controls pyt-src/server.py /^class Controls:$/
+CopyTextString pas-src/common.pas /^function CopyTextString;(*($/
+Copying tex-src/gzip.texi /^@node Copying, Overview, , Top$/
+Cplusplus_entries c-src/etags.c /^Cplusplus_entries (FILE *inf)$/
+Cplusplus_help c-src/etags.c 540
+Cplusplus_suffixes c-src/etags.c 535
+Create_LL_Task/p ada-src/2ataspri.adb /^ procedure Create_LL_Task$/
+Create_LL_Task/p ada-src/2ataspri.ads /^ procedure Create_LL_Task$/
+Cstar_entries c-src/etags.c /^Cstar_entries (FILE *inf)$/
+Cstar_suffixes c-src/etags.c 562
+D cp-src/fail.C 41
+D::D cp-src/fail.C /^ D() : ::A::T2::T(97), x(1066) {}$/
+D::x cp-src/fail.C 44
+DAEMON_RUNNING c-src/emacs/src/lisp.h 4258
+DAEMON_RUNNING c-src/emacs/src/lisp.h 4262
+DEAFUN c.c /^DEAFUN ("expand-file-name", Fexpand_file_name, Sex/
+DEBUG c-src/etags.c 84
+DEBUG c-src/etags.c 85
+DEBUG c-src/etags.c 87
+DEBUG objc-src/PackInsp.m 37
+DECLARE_GDB_SYM c-src/emacs/src/lisp.h /^#define DECLARE_GDB_SYM(type, id) type const id EX/
+DEFAULT_HASH_SIZE c-src/emacs/src/lisp.h 1940
+DEFAULT_HASH_SIZE c-src/emacs/src/lisp.h 1940
+DEFAULT_REHASH_SIZE c-src/emacs/src/lisp.h 1950
+DEFAULT_REHASH_THRESHOLD c-src/emacs/src/lisp.h 1946
+DEFINE_GDB_SYMBOL_BEGIN c-src/emacs/src/lisp.h /^# define DEFINE_GDB_SYMBOL_BEGIN(type, id) DECLARE/
+DEFINE_GDB_SYMBOL_BEGIN c-src/emacs/src/lisp.h /^# define DEFINE_GDB_SYMBOL_BEGIN(type, id) extern /
+DEFINE_GDB_SYMBOL_END c-src/emacs/src/lisp.h /^# define DEFINE_GDB_SYMBOL_END(id) = id;$/
+DEFINE_GDB_SYMBOL_END c-src/emacs/src/lisp.h /^# define DEFINE_GDB_SYMBOL_END(val) ;$/
+DEFINE_LISP_SYMBOL c-src/emacs/src/lisp.h /^#define DEFINE_LISP_SYMBOL(name) \\$/
+DEFINE_NON_NIL_Q_SYMBOL_MACROS c-src/emacs/src/lisp.h 755
+DEFSYM c-src/emacs/src/lisp.h /^#define DEFSYM(sym, name) \/* empty *\/$/
+DEFSYM c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (SYMBOL_CONSTANT_P, int, (Lisp_Ob/
+DEFUN c-src/emacs/src/lisp.h /^#define DEFUN(lname, fnname, sname, minargs, maxar/
+DEFUN c-src/emacs/src/lisp.h /^#define DEFUN(lname, fnname, sname, minargs, maxar/
+DEFUN_ARGS_0 c-src/emacs/src/lisp.h 714
+DEFUN_ARGS_1 c-src/emacs/src/lisp.h 715
+DEFUN_ARGS_2 c-src/emacs/src/lisp.h 716
+DEFUN_ARGS_3 c-src/emacs/src/lisp.h 717
+DEFUN_ARGS_4 c-src/emacs/src/lisp.h 718
+DEFUN_ARGS_5 c-src/emacs/src/lisp.h 719
+DEFUN_ARGS_6 c-src/emacs/src/lisp.h 721
+DEFUN_ARGS_7 c-src/emacs/src/lisp.h 723
+DEFUN_ARGS_8 c-src/emacs/src/lisp.h 725
+DEFUN_ARGS_MANY c-src/emacs/src/lisp.h 712
+DEFUN_ARGS_UNEVALLED c-src/emacs/src/lisp.h 713
+DEFUN_func2 c.c /^DEFUN_func2()$/
+DEFVAR_BOOL c-src/emacs/src/lisp.h /^#define DEFVAR_BOOL(lname, vname, doc) \\$/
+DEFVAR_BUFFER_DEFAULTS c-src/emacs/src/lisp.h /^#define DEFVAR_BUFFER_DEFAULTS(lname, vname, doc) /
+DEFVAR_INT c-src/emacs/src/lisp.h /^#define DEFVAR_INT(lname, vname, doc) \\$/
+DEFVAR_KBOARD c-src/emacs/src/lisp.h /^#define DEFVAR_KBOARD(lname, vname, doc) \\$/
+DEFVAR_LISP c-src/emacs/src/lisp.h /^#define DEFVAR_LISP(lname, vname, doc) \\$/
+DEFVAR_LISP_NOPRO c-src/emacs/src/lisp.h /^#define DEFVAR_LISP_NOPRO(lname, vname, doc) \\$/
+DEVICE_LAST c-src/h.h 24
+DEVICE_SWP c-src/h.h 23
+DOS_NT c-src/etags.c 117
+DOS_NT c-src/etags.c 118
+DUMPED c-src/emacs/src/gmalloc.c 80
+Date::minus cp-src/functions.cpp /^void Date::minus ( int days , int month , int year/
+Date::operator ++ cp-src/functions.cpp /^Date & Date::operator ++ ( void ){$/
+Date::operator += cp-src/functions.cpp /^Date & Date::operator += ( int days ){$/
+Date::operator - cp-src/functions.cpp /^int Date::operator - ( Date d ){$/
+Date::operator -- cp-src/functions.cpp /^Date & Date::operator -- ( void ){$/
+Date::operator -= cp-src/functions.cpp /^Date & Date::operator -= ( int days ){$/
+Date::operator < cp-src/functions.cpp /^int Date::operator < ( Date d ) {$/
+Date::operator = cp-src/functions.cpp /^Date & Date::operator = ( Date d ){$/
+Date::operator == cp-src/functions.cpp /^int Date::operator == ( Date d ) {$/
+Date::operator > cp-src/functions.cpp /^int Date::operator > ( Date d ) {$/
+Date::plus cp-src/functions.cpp /^void Date::plus ( int days , int month , int year /
+Date::setDate cp-src/functions.cpp /^void Date::setDate ( int d , int m , int y ){$/
+Date::shift cp-src/functions.cpp /^void Date::shift ( void ){\/\/Shift this date to pre/
+Debug cp-src/functions.cpp /^void Debug ( int lineno, int level, char* func , c/
+DisposeANameList pas-src/common.pas /^procedure DisposeANameList( $/
+DisposeNameList pas-src/common.pas /^procedure DisposeNameList;$/
+ELEM_I c-src/h.h 3
+ELSRC Makefile /^ELSRC=$(addprefix .\/el-src\/,TAGTEST.EL emacs\/lisp\//
+EMACS_INT c-src/emacs/src/lisp.h 91
+EMACS_INT c-src/emacs/src/lisp.h 96
+EMACS_INT c-src/emacs/src/lisp.h 103
+EMACS_INT_MAX c-src/emacs/src/lisp.h 93
+EMACS_INT_MAX c-src/emacs/src/lisp.h 98
+EMACS_INT_MAX c-src/emacs/src/lisp.h 105
+EMACS_LISP_H c-src/emacs/src/lisp.h 22
+EMACS_NAME c-src/etags.c 786
+EMACS_UINT c-src/emacs/src/lisp.h 92
+EMACS_UINT c-src/emacs/src/lisp.h 97
+EMACS_UINT c-src/emacs/src/lisp.h 104
+ENTRY c-src/sysdep.h /^#define ENTRY(name) \\$/
+ENUM_BF c-src/emacs/src/lisp.h /^#define ENUM_BF(TYPE) unsigned int$/
+ENUM_BF c-src/emacs/src/lisp.h /^#define ENUM_BF(TYPE) enum TYPE$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (symbol_redirect) redirect : 3;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (Lisp_Misc_Type) type : 16; \/* = Lisp_M/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (Lisp_Misc_Type) type : 16; \/* = Lisp_M/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (Lisp_Misc_Type) type : 16; \/* = Lisp_/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (Lisp_Misc_Type) type : 16; \/* = Lisp_/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (Lisp_Misc_Type) type : 16; \/* = Lisp_/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+ENUM_BF c-src/emacs/src/lisp.h /^ ENUM_BF (specbind_tag) kind : CHAR_BIT;$/
+EQ c-src/emacs/src/lisp.h /^# define EQ(x, y) lisp_h_EQ (x, y)$/
+EQUAL y-src/cccp.c 12
+ERLSRC Makefile /^ERLSRC=$(addprefix .\/erl-src\/,gs_dialog.erl)$/
+ERROR y-src/parse.y 303
+ERROR parse.y 303
+ERROR y-src/cccp.c 9
+ETAGS Makefile /^ETAGS: FRC ${infiles}$/
+ETAGS_PROG Makefile /^ETAGS_PROG=..\/..\/lib-src\/etags$/
+EXFUN c-src/emacs/src/lisp.h /^#define EXFUN(fnname, maxargs) \\$/
+EXTERNALLY_VISIBLE c-src/emacs/src/keyboard.c 3497
+EXTERNALLY_VISIBLE c-src/emacs/src/keyboard.c 4372
+EmptyNmStr pas-src/common.pas /^function EmptyNmStr(* : NameString*);$/
+Environment tex-src/gzip.texi /^@node Environment, Tapes, Advanced usage, Top$/
+Erlang_functions c-src/etags.c /^Erlang_functions (FILE *inf)$/
+Erlang_help c-src/etags.c 567
+Erlang_suffixes c-src/etags.c 565
+ErrStrToNmStr pas-src/common.pas /^function ErrStrToNmStr;(*($/
+Error_Information/t ada-src/2ataspri.ads /^ type Error_Information is new Interfaces.C.POSI/
+Exit_LL_Task/p ada-src/2ataspri.adb /^ procedure Exit_LL_Task is$/
+Exit_LL_Task/p ada-src/2ataspri.ads /^ procedure Exit_LL_Task;$/
+ExtractCommentInfo pas-src/common.pas /^procedure ExtractCommentInfo; (*($/
+FASTCFLAGS make-src/Makefile 55
+FILTER make-src/Makefile 58
+FINALIZERP c-src/emacs/src/lisp.h /^FINALIZERP (Lisp_Object x)$/
+FINAL_FREE_BLOCKS c-src/emacs/src/gmalloc.c 135
+FIXNUM_BITS c-src/emacs/src/lisp.h 252
+FIXNUM_OVERFLOW_P c-src/emacs/src/lisp.h /^#define FIXNUM_OVERFLOW_P(i) \\$/
+FIXNUM_OVERFLOW_P c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (EQ, bool, (Lisp_Object x, Lisp_O/
+FLOATP c-src/emacs/src/lisp.h /^# define FLOATP(x) lisp_h_FLOATP (x)$/
+FLOAT_TO_STRING_BUFSIZE c-src/emacs/src/lisp.h 3927
+FORTHSRC Makefile /^FORTHSRC=$(addprefix .\/forth-src\/,test-forth.fth)$/
+FOR_EACH_ALIST_VALUE c-src/emacs/src/lisp.h /^#define FOR_EACH_ALIST_VALUE(head_var, list_var, v/
+FOR_EACH_TAIL c-src/emacs/src/lisp.h /^#define FOR_EACH_TAIL(hare, list, tortoise, n) \\$/
+FRAMEP c-src/emacs/src/lisp.h /^FRAMEP (Lisp_Object a)$/
+FRC Makefile /^FRC:;$/
+FREEFLOOD c-src/emacs/src/gmalloc.c 1858
+FSRC Makefile /^FSRC=$(addprefix .\/f-src\/,entry.for entry.strange_/
+FUN0 y-src/parse.y /^yylex FUN0()$/
+FUN0 parse.y /^yylex FUN0()$/
+FUN1 y-src/parse.y /^yyerror FUN1(char *, s)$/
+FUN1 y-src/parse.y /^str_to_col FUN1(char **,str)$/
+FUN1 parse.y /^yyerror FUN1(char *, s)$/
+FUN1 parse.y /^str_to_col FUN1(char **,str)$/
+FUN2 y-src/parse.y /^make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)$/
+FUN2 y-src/parse.y /^parse_cell_or_range FUN2(char **,ptr, struct rng */
+FUN2 parse.y /^make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)$/
+FUN2 parse.y /^parse_cell_or_range FUN2(char **,ptr, struct rng */
+FUNCTIONP c-src/emacs/src/lisp.h /^FUNCTIONP (Lisp_Object obj)$/
+FUNCTION_KEY_OFFSET c-src/emacs/src/keyboard.c 4766
+FUNCTION_KEY_OFFSET c-src/emacs/src/keyboard.c 5061
+F_getit c-src/etags.c /^F_getit (FILE *inf)$/
+F_takeprec c-src/etags.c /^F_takeprec (void)$/
+Fails_t c-src/h.h 5
+Finalize_Cond/p ada-src/2ataspri.adb /^ procedure Finalize_Cond (Cond : in out Conditio/
+Finalize_Cond/p ada-src/2ataspri.ads /^ procedure Finalize_Cond (Cond : in out Conditio/
+Finalize_Lock/p ada-src/2ataspri.adb /^ procedure Finalize_Lock (L : in out Lock) is$/
+Finalize_Lock/p ada-src/2ataspri.ads /^ procedure Finalize_Lock (L : in out Lock);$/
+Finalize_TAS_Cell/p ada-src/2ataspri.adb /^ procedure Finalize_TAS_Cell (Cell : in out TAS_/
+Finalize_TAS_Cell/p ada-src/2ataspri.ads /^ procedure Finalize_TAS_Cell (Cell : in out TA/
+First100Chars pas-src/common.pas /^procedure First100Chars; (*($/
+Foo perl-src/kai-test.pl /^package Foo;$/
+Foo::Bar perl-src/kai-test.pl /^package Foo::Bar;$/
+Foo::Bar::f6 perl-src/kai-test.pl /^sub f6 {$/
+Foo::f3 perl-src/kai-test.pl /^sub f3 {$/
+Forth_help c-src/etags.c 573
+Forth_suffixes c-src/etags.c 571
+Forth_words c-src/etags.c /^Forth_words (FILE *inf)$/
+Fortran_functions c-src/etags.c /^Fortran_functions (FILE *inf)$/
+Fortran_help c-src/etags.c 579
+Fortran_suffixes c-src/etags.c 577
+GCALIGNED c-src/emacs/src/lisp.h 288
+GCALIGNED c-src/emacs/src/lisp.h 290
+GCALIGNMENT c-src/emacs/src/lisp.h 243
+GCPRO1 c-src/emacs/src/lisp.h /^#define GCPRO1(varname) ((void) gcpro1)$/
+GCPRO1 c-src/emacs/src/lisp.h /^#define GCPRO1(a) \\$/
+GCPRO1 c-src/emacs/src/lisp.h /^#define GCPRO1(a) \\$/
+GCPRO2 c-src/emacs/src/lisp.h /^#define GCPRO2(varname1, varname2) ((void) gcpro2,/
+GCPRO2 c-src/emacs/src/lisp.h /^#define GCPRO2(a, b) \\$/
+GCPRO2 c-src/emacs/src/lisp.h /^#define GCPRO2(a, b) \\$/
+GCPRO3 c-src/emacs/src/lisp.h /^#define GCPRO3(varname1, varname2, varname3) \\$/
+GCPRO3 c-src/emacs/src/lisp.h /^#define GCPRO3(a, b, c) \\$/
+GCPRO3 c-src/emacs/src/lisp.h /^#define GCPRO3(a, b, c) \\$/
+GCPRO4 c-src/emacs/src/lisp.h /^#define GCPRO4(varname1, varname2, varname3, varna/
+GCPRO4 c-src/emacs/src/lisp.h /^#define GCPRO4(a, b, c, d) \\$/
+GCPRO4 c-src/emacs/src/lisp.h /^#define GCPRO4(a, b, c, d) \\$/
+GCPRO5 c-src/emacs/src/lisp.h /^#define GCPRO5(varname1, varname2, varname3, varna/
+GCPRO5 c-src/emacs/src/lisp.h /^#define GCPRO5(a, b, c, d, e) \\$/
+GCPRO5 c-src/emacs/src/lisp.h /^#define GCPRO5(a, b, c, d, e) \\$/
+GCPRO6 c-src/emacs/src/lisp.h /^#define GCPRO6(varname1, varname2, varname3, varna/
+GCPRO6 c-src/emacs/src/lisp.h /^#define GCPRO6(a, b, c, d, e, f) \\$/
+GCPRO6 c-src/emacs/src/lisp.h /^#define GCPRO6(a, b, c, d, e, f) \\$/
+GCPRO7 c-src/emacs/src/lisp.h /^#define GCPRO7(a, b, c, d, e, f, g) (GCPRO6 (a, b,/
+GCPRO7 c-src/emacs/src/lisp.h /^#define GCPRO7(a, b, c, d, e, f, g) \\$/
+GCPRO7 c-src/emacs/src/lisp.h /^#define GCPRO7(a, b, c, d, e, f, g) \\$/
+GCTYPEBITS c-src/emacs/src/lisp.h 67
+GCTYPEBITS c-src/emacs/src/lisp.h /^DEFINE_GDB_SYMBOL_BEGIN (int, GCTYPEBITS)$/
+GC_MAKE_GCPROS_NOOPS c-src/emacs/src/lisp.h 3172
+GC_MARK_STACK c-src/emacs/src/lisp.h 3177
+GC_MARK_STACK_CHECK_GCPROS c-src/emacs/src/lisp.h 3173
+GC_USE_GCPROS_AS_BEFORE c-src/emacs/src/lisp.h 3171
+GC_USE_GCPROS_CHECK_ZOMBIES c-src/emacs/src/lisp.h 3174
+GE y-src/parse.c 8
+GENERIC_PTR cccp.y 56
+GENERIC_PTR cccp.y 58
+GENERIC_PTR y-src/cccp.y 56
+GENERIC_PTR y-src/cccp.y 58
+GEQ y-src/cccp.c 15
+GROW_RAW_KEYBUF c-src/emacs/src/keyboard.c 119
+GatherControls pyt-src/server.py /^ def GatherControls(self):$/
+GetLayerByName lua-src/allegro.lua /^function GetLayerByName (name)$/
+GetNameList pas-src/common.pas /^function GetNameList; (* : BinNodePointer;*)$/
+GetNewNameListNode pas-src/common.pas /^function GetNewNameListNode;(*($/
+GetTextRef pas-src/common.pas /^function GetTextRef;(*($/
+GetUniqueLayerName lua-src/allegro.lua /^function GetUniqueLayerName ()$/
+Get_Own_Priority/f ada-src/2ataspri.adb /^ function Get_Own_Priority return System.Any_Pri/
+Get_Own_Priority/f ada-src/2ataspri.ads /^ function Get_Own_Priority return System.Any_Pri/
+Get_Priority/f ada-src/2ataspri.adb /^ function Get_Priority (T : TCB_Ptr) return Syst/
+Get_Priority/f ada-src/2ataspri.ads /^ function Get_Priority (T : TCB_Ptr) return Syst/
+HASH_HASH c-src/emacs/src/lisp.h /^HASH_HASH (struct Lisp_Hash_Table *h, ptrdiff_t id/
+HASH_INDEX c-src/emacs/src/lisp.h /^HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t i/
+HASH_KEY c-src/emacs/src/lisp.h /^HASH_KEY (struct Lisp_Hash_Table *h, ptrdiff_t idx/
+HASH_NEXT c-src/emacs/src/lisp.h /^HASH_NEXT (struct Lisp_Hash_Table *h, ptrdiff_t id/
+HASH_TABLE_P c-src/emacs/src/lisp.h /^HASH_TABLE_P (Lisp_Object a)$/
+HASH_TABLE_SIZE c-src/emacs/src/lisp.h /^HASH_TABLE_SIZE (struct Lisp_Hash_Table *h)$/
+HASH_VALUE c-src/emacs/src/lisp.h /^HASH_VALUE (struct Lisp_Hash_Table *h, ptrdiff_t i/
+HAVE_NTGUI c-src/etags.c 116
+HEAP c-src/emacs/src/gmalloc.c 131
+HTMLSRC Makefile /^HTMLSRC=$(addprefix .\/html-src\/,softwarelibero.htm/
+HTML_help c-src/etags.c 584
+HTML_labels c-src/etags.c /^HTML_labels (FILE *inf)$/
+HTML_suffixes c-src/etags.c 582
+IEEE_FLOATING_POINT c-src/emacs/src/lisp.h 2415
+IMAGEP c-src/emacs/src/lisp.h /^IMAGEP (Lisp_Object x)$/
+INPUT_EVENT_POS_MAX c-src/emacs/src/keyboard.c 3698
+INPUT_EVENT_POS_MIN c-src/emacs/src/keyboard.c 3701
+INSERT_TREE_NODE pas-src/common.pas /^procedure INSERT_TREE_NODE;(*( $/
+INSTANTIATE_MDIAGARRAY_FRIENDS cp-src/MDiagArray2.h /^#define INSTANTIATE_MDIAGARRAY_FRIENDS(T) \\$/
+INT c-src/h.h 32
+INT y-src/cccp.c 6
+INTEGERP c-src/emacs/src/lisp.h /^# define INTEGERP(x) lisp_h_INTEGERP (x)$/
+INTEGER_TO_CONS c-src/emacs/src/lisp.h /^#define INTEGER_TO_CONS(i) \\$/
+INTERVAL c-src/emacs/src/lisp.h 1149
+INTMASK c-src/emacs/src/lisp.h 437
+INTTYPEBITS c-src/emacs/src/lisp.h 249
+INT_BIT c-src/emacs/src/gmalloc.c 124
+INT_TYPE_SIZE cccp.y 91
+INT_TYPE_SIZE y-src/cccp.y 91
+ISALNUM c-src/etags.c /^#define ISALNUM(c) isalnum (CHAR (c))$/
+ISALPHA c-src/etags.c /^#define ISALPHA(c) isalpha (CHAR (c))$/
+ISDIGIT c-src/etags.c /^#define ISDIGIT(c) isdigit (CHAR (c))$/
+ISLOWER c-src/etags.c /^#define ISLOWER(c) islower (CHAR (c))$/
+ISO_FUNCTION_KEY_OFFSET c-src/emacs/src/keyboard.c 5149
+ISUPPER c-src/etags.c /^# define ISUPPER(c) isupper (CHAR (c))$/
+IS_DAEMON c-src/emacs/src/lisp.h 4257
+IS_DAEMON c-src/emacs/src/lisp.h 4261
+InitNameList pas-src/common.pas /^procedure InitNameList;$/
+InitNameStringPool pas-src/common.pas /^procedure InitNameStringPool;$/
+InitializeStringPackage pas-src/common.pas /^procedure InitializeStringPackage;$/
+Initialize_Cond/p ada-src/2ataspri.adb /^ procedure Initialize_Cond (Cond : in out Condit/
+Initialize_Cond/p ada-src/2ataspri.ads /^ procedure Initialize_Cond (Cond : in out Condit/
+Initialize_LL_Tasks/p ada-src/2ataspri.adb /^ procedure Initialize_LL_Tasks (T : TCB_Ptr) is$/
+Initialize_LL_Tasks/p ada-src/2ataspri.ads /^ procedure Initialize_LL_Tasks (T : TCB_Ptr);$/
+Initialize_Lock/p ada-src/2ataspri.adb /^ procedure Initialize_Lock$/
+Initialize_Lock/p ada-src/2ataspri.ads /^ procedure Initialize_Lock (Prio : System.Any_Pr/
+Initialize_TAS_Cell/p ada-src/2ataspri.adb /^ procedure Initialize_TAS_Cell (Cell : out TAS_C/
+Initialize_TAS_Cell/p ada-src/2ataspri.ads /^ procedure Initialize_TAS_Cell (Cell : out TA/
+Inner1/b ada-src/etags-test-for.ada /^ package body Inner1 is$/
+Inner1/b ada-src/waroquiers.ada /^ package body Inner1 is$/
+Inner1/s ada-src/etags-test-for.ada /^ package Inner1 is$/
+Inner1/s ada-src/waroquiers.ada /^ package Inner1 is$/
+Inner2/b ada-src/etags-test-for.ada /^ package body Inner2 is$/
+Inner2/b ada-src/waroquiers.ada /^ package body Inner2 is$/
+Inner2/s ada-src/etags-test-for.ada /^ package Inner2 is$/
+Inner2/s ada-src/waroquiers.ada /^ package Inner2 is$/
+Install_Abort_Handler/p ada-src/2ataspri.adb /^ procedure Install_Abort_Handler (Handler : Abor/
+Install_Abort_Handler/p ada-src/2ataspri.ads /^ procedure Install_Abort_Handler (Handler : Abor/
+Install_Error_Handler/p ada-src/2ataspri.adb /^ procedure Install_Error_Handler (Handler : Syst/
+Install_Error_Handler/p ada-src/2ataspri.ads /^ procedure Install_Error_Handler (Handler : Syst/
+Invoking gzip tex-src/gzip.texi /^@node Invoking gzip, Advanced usage, Sample, Top$/
+IsControlChar pas-src/common.pas /^function IsControlChar; (*($/
+IsControlCharName pas-src/common.pas /^function IsControlCharName($/
+Is_Set/f ada-src/2ataspri.adb /^ function Is_Set (Cell : in TAS_Cell) return Bo/
+Is_Set/f ada-src/2ataspri.ads /^ function Is_Set (Cell : in TAS_Cell)/
+KBD_BUFFER_SIZE c-src/emacs/src/keyboard.c 82
+KBYTES objc-src/PackInsp.m 58
+KEY_TO_CHAR c-src/emacs/src/keyboard.c /^#define KEY_TO_CHAR(k) (XINT (k) & ((1 << CHARACTE/
+LATEST make-src/Makefile 1
+LCE_COMMENT php-src/lce_functions.php 13
+LCE_COMMENT_TOOL php-src/lce_functions.php 17
+LCE_COMMENT_USER php-src/lce_functions.php 15
+LCE_FUNCTIONS php-src/lce_functions.php 4
+LCE_MSGID php-src/lce_functions.php 19
+LCE_MSGSTR php-src/lce_functions.php 21
+LCE_TEXT php-src/lce_functions.php 23
+LCE_UNKNOWN php-src/lce_functions.php 9
+LCE_WS php-src/lce_functions.php 11
+LDFLAGS make-src/Makefile 50
+LE y-src/parse.c 7
+LEQ y-src/cccp.c 14
+LISP_INITIALLY c-src/emacs/src/lisp.h /^#define LISP_INITIALLY(i) {i}$/
+LISP_INITIALLY c-src/emacs/src/lisp.h /^#define LISP_INITIALLY(i) (i)$/
+LISP_INITIALLY_ZERO c-src/emacs/src/lisp.h 582
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^#define LISP_MACRO_DEFUN(name, type, argdecls, arg/
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (XLI, EMACS_INT, (Lisp_Object o),/
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (XPNTR, void *, (Lisp_Object a), /
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (XHASH, EMACS_INT, (Lisp_Object a/
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (XCONS, struct Lisp_Cons *, (Lisp/
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (XCAR, Lisp_Object, (Lisp_Object /
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (SYMBOL_VAL, Lisp_Object, (struct/
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (NILP, bool, (Lisp_Object x), (x)/
+LISP_MACRO_DEFUN c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN (CONSP, bool, (Lisp_Object x), (x/
+LISP_MACRO_DEFUN_VOID c-src/emacs/src/lisp.h /^#define LISP_MACRO_DEFUN_VOID(name, argdecls, args/
+LISP_MACRO_DEFUN_VOID c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN_VOID (CHECK_TYPE,$/
+LISP_MACRO_DEFUN_VOID c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN_VOID (SET_SYMBOL_VAL,$/
+LISP_MACRO_DEFUN_VOID c-src/emacs/src/lisp.h /^LISP_MACRO_DEFUN_VOID (CHECK_LIST_CONS, (Lisp_Obje/
+LISTCONTENTS objc-src/PackInsp.m 39
+LISTCONTENTSBUTTON objc-src/PackInsp.m 48
+LISTDESCRIPTIONBUTTON objc-src/PackInsp.m 49
+LL_Assert/p ada-src/2ataspri.adb /^ procedure LL_Assert (B : Boolean; M : String) i/
+LL_Assert/p ada-src/2ataspri.ads /^ procedure LL_Assert (B : Boolean; M : String);$/
+LL_Task_Procedure_Access/t ada-src/etags-test-for.ada /^ type LL_Task_Procedure_Access is access procedu/
+LL_Task_Procedure_Access/t ada-src/2ataspri.ads /^ type LL_Task_Procedure_Access is access procedu/
+LL_Wrapper/p ada-src/etags-test-for.ada /^ procedure LL_Wrapper (T : TCB_Ptr);$/
+LL_Wrapper/p ada-src/2ataspri.adb /^ procedure LL_Wrapper (T : TCB_Ptr);$/
+LL_Wrapper/p ada-src/2ataspri.adb /^ procedure LL_Wrapper (T : TCB_Ptr) is$/
+LOCALIZE objc-src/PackInsp.m /^#define LOCALIZE(s) NXLoadLocalizedStringFromTabl/
+LOCALIZE_ARCH objc-src/PackInsp.m /^#define LOCALIZE_ARCH(s) NXLoadLocalizedStringFrom/
+LOCK c-src/emacs/src/gmalloc.c /^#define LOCK() \\$/
+LOCK c-src/emacs/src/gmalloc.c /^#define LOCK()$/
+LOCK_ALIGNED_BLOCKS c-src/emacs/src/gmalloc.c /^#define LOCK_ALIGNED_BLOCKS() \\$/
+LOCK_ALIGNED_BLOCKS c-src/emacs/src/gmalloc.c /^#define LOCK_ALIGNED_BLOCKS()$/
+LONG_TYPE_SIZE cccp.y 95
+LONG_TYPE_SIZE y-src/cccp.y 95
+LOOKING_AT c-src/etags.c /^#define LOOKING_AT(cp, kw) \/* kw is the keyword, /
+LOOKING_AT_NOCASE c-src/etags.c /^#define LOOKING_AT_NOCASE(cp, kw) \/* the keyword i/
+LOOKUP objc-src/PackInsp.m /^#define LOOKUP(key, notfound) ([table isKey:key] ?/
+LOOKUP objc-src/PackInsp.m 176
+LOOP_ON_INPUT_LINES c-src/etags.c /^#define LOOP_ON_INPUT_LINES(file_pointer, line_buf/
+LSH y-src/cccp.c 16
+LTGT cp-src/MDiagArray2.h 35
+LTGT cp-src/MDiagArray2.h 39
+LTGT cp-src/MDiagArray2.h 42
+LTGT cp-src/MDiagArray2.h 144
+LUASRC Makefile /^LUASRC=$(addprefix .\/lua-src\/,allegro.lua)$/
+L_CELL y-src/parse.c 10
+L_CONST y-src/parse.c 13
+L_FN0 y-src/parse.c 14
+L_FN1 y-src/parse.c 15
+L_FN1R y-src/parse.c 20
+L_FN2 y-src/parse.c 16
+L_FN2R y-src/parse.c 21
+L_FN3 y-src/parse.c 17
+L_FN3R y-src/parse.c 22
+L_FN4 y-src/parse.c 18
+L_FN4R y-src/parse.c 23
+L_FNN y-src/parse.c 19
+L_FNNR y-src/parse.c 24
+L_GE y-src/parse.c 27
+L_LE y-src/parse.c 25
+L_NE y-src/parse.c 26
+L_RANGE y-src/parse.c 11
+L_VAR y-src/parse.c 12
+L_getit c-src/etags.c /^L_getit (void)$/
+LabeledEntry pyt-src/server.py /^class LabeledEntry(Frame):$/
+Lang_function c-src/etags.c 182
+Lang_function c-src/h.h 6
+Lisp_Bits c-src/emacs/src/lisp.h 239
+Lisp_Bool_Vector c-src/emacs/src/lisp.h 1384
+Lisp_Boolfwd c-src/emacs/src/lisp.h 2284
+Lisp_Buffer_Local_Value c-src/emacs/src/lisp.h 2334
+Lisp_Buffer_Objfwd c-src/emacs/src/lisp.h 2302
+Lisp_Char_Table c-src/emacs/src/lisp.h 1575
+Lisp_Compiled c-src/emacs/src/lisp.h 2429
+Lisp_Cons c-src/emacs/src/lisp.h 475
+Lisp_Finalizer c-src/emacs/src/lisp.h 2186
+Lisp_Float c-src/emacs/src/lisp.h 477
+Lisp_Float c-src/emacs/src/lisp.h 2391
+Lisp_Free c-src/emacs/src/lisp.h 2201
+Lisp_Fwd c-src/emacs/src/lisp.h 2368
+Lisp_Fwd_Bool c-src/emacs/src/lisp.h 505
+Lisp_Fwd_Buffer_Obj c-src/emacs/src/lisp.h 507
+Lisp_Fwd_Int c-src/emacs/src/lisp.h 504
+Lisp_Fwd_Kboard_Obj c-src/emacs/src/lisp.h 508
+Lisp_Fwd_Obj c-src/emacs/src/lisp.h 506
+Lisp_Fwd_Type c-src/emacs/src/lisp.h 502
+Lisp_Hash_Table c-src/emacs/src/lisp.h 1823
+Lisp_Int0 c-src/emacs/src/lisp.h 461
+Lisp_Int1 c-src/emacs/src/lisp.h 462
+Lisp_Intfwd c-src/emacs/src/lisp.h 2274
+Lisp_Kboard_Objfwd c-src/emacs/src/lisp.h 2362
+Lisp_Marker c-src/emacs/src/lisp.h 1978
+Lisp_Misc c-src/emacs/src/lisp.h 458
+Lisp_Misc c-src/emacs/src/lisp.h 2212
+Lisp_Misc_Any c-src/emacs/src/lisp.h 1971
+Lisp_Misc_Finalizer c-src/emacs/src/lisp.h 491
+Lisp_Misc_Float c-src/emacs/src/lisp.h 494
+Lisp_Misc_Free c-src/emacs/src/lisp.h 487
+Lisp_Misc_Limit c-src/emacs/src/lisp.h 496
+Lisp_Misc_Marker c-src/emacs/src/lisp.h 488
+Lisp_Misc_Overlay c-src/emacs/src/lisp.h 489
+Lisp_Misc_Save_Value c-src/emacs/src/lisp.h 490
+Lisp_Misc_Type c-src/emacs/src/lisp.h 485
+Lisp_Object c-src/emacs/src/lisp.h 567
+Lisp_Object c-src/emacs/src/lisp.h 577
+Lisp_Objfwd c-src/emacs/src/lisp.h 2294
+Lisp_Overlay c-src/emacs/src/lisp.h 2021
+Lisp_Save_Type c-src/emacs/src/lisp.h 2064
+Lisp_Save_Value c-src/emacs/src/lisp.h 2110
+Lisp_String c-src/emacs/src/lisp.h 466
+Lisp_Sub_Char_Table c-src/emacs/src/lisp.h 1606
+Lisp_Subr c-src/emacs/src/lisp.h 1670
+Lisp_Symbol c-src/emacs/src/lisp.h 454
+Lisp_Symbol c-src/emacs/src/lisp.h 654
+Lisp_Type c-src/emacs/src/lisp.h 451
+Lisp_Vector c-src/emacs/src/lisp.h 1369
+Lisp_Vectorlike c-src/emacs/src/lisp.h 472
+Lisp_functions c-src/etags.c /^Lisp_functions (FILE *inf)$/
+Lisp_help c-src/etags.c 591
+Lisp_suffixes c-src/etags.c 589
+ListEdit pyt-src/server.py /^class ListEdit(Frame):$/
+Locate pas-src/common.pas /^function Locate; (*($/
+Lock/t ada-src/2ataspri.ads /^ type Lock is private;$/
+Lock/t ada-src/2ataspri.ads /^ type Lock is$/
+LowerCaseNmStr pas-src/common.pas /^function LowerCaseNmStr; (*($/
+Lua_functions c-src/etags.c /^Lua_functions (FILE *inf)$/
+Lua_help c-src/etags.c 600
+Lua_suffixes c-src/etags.c 598
+MAGICBYTE c-src/emacs/src/gmalloc.c 1856
+MAGICFREE c-src/emacs/src/gmalloc.c 1855
+MAGICWORD c-src/emacs/src/gmalloc.c 1854
+MAKESRC Makefile /^MAKESRC=$(addprefix .\/make-src\/,Makefile)$/
+MALLOCFLOOD c-src/emacs/src/gmalloc.c 1857
+MANY c-src/emacs/src/lisp.h 2833
+MARKERP c-src/emacs/src/lisp.h /^# define MARKERP(x) lisp_h_MARKERP (x)$/
+MAXPATHLEN c-src/etags.c 115
+MAX_ALLOCA c-src/emacs/src/lisp.h 4556
+MAX_ALLOCA c-src/emacs/src/lisp.h 4556
+MAX_ENCODED_BYTES c-src/emacs/src/keyboard.c 2254
+MAX_HASH_VALUE c-src/etags.c 2329
+MAX_WORD_LENGTH c-src/etags.c 2327
+MAYBEREL y-src/parse.y /^#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1])/
+MAYBEREL parse.y /^#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1])/
+MBYTES objc-src/PackInsp.m 59
+MCHECK_DISABLED c-src/emacs/src/gmalloc.c 285
+MCHECK_FREE c-src/emacs/src/gmalloc.c 287
+MCHECK_HEAD c-src/emacs/src/gmalloc.c 288
+MCHECK_OK c-src/emacs/src/gmalloc.c 286
+MCHECK_TAIL c-src/emacs/src/gmalloc.c 289
+MDiagArray2 cp-src/MDiagArray2.h 78
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (T *d, int r, int c) : DiagArray2<T>/
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (void) : DiagArray2<T> () { }$/
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (int r, int c) : DiagArray2<T> (r, c/
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (int r, int c, const T& val) : DiagA/
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (const Array<T>& a) : DiagArray2<T> /
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (const DiagArray2<T>& a) : DiagArray/
+MDiagArray2::MDiagArray2 cp-src/MDiagArray2.h /^ MDiagArray2 (const MDiagArray2<T>& a) : DiagArra/
+MDiagArray2::operator = cp-src/MDiagArray2.h /^ MDiagArray2<T>& operator = (const MDiagArray2<T>/
+MDiagArray2::operator MArray2<T> cp-src/MDiagArray2.h /^ operator MArray2<T> () const$/
+MDiagArray2::~MDiagArray2 cp-src/MDiagArray2.h /^ ~MDiagArray2 (void) { }$/
+MIN_HASH_VALUE c-src/etags.c 2328
+MIN_WORD_LENGTH c-src/etags.c 2326
+MISCP c-src/emacs/src/lisp.h /^# define MISCP(x) lisp_h_MISCP (x)$/
+MOST_NEGATIVE_FIXNUM c-src/emacs/src/lisp.h 835
+MOST_POSITIVE_FIXNUM c-src/emacs/src/lisp.h 834
+MOVE c-src/sysdep.h /^#define MOVE(x,y) movl x, y$/
+MSDOS c-src/etags.c 100
+MSDOS c-src/etags.c 106
+MSDOS c-src/etags.c 107
+MSDOS c-src/etags.c 110
+MSGSEL f-src/entry.for /^ ENTRY MSGSEL ( TYPE )$/
+MSGSEL f-src/entry.strange_suffix /^ ENTRY MSGSEL ( TYPE )$/
+MSGSEL f-src/entry.strange /^ ENTRY MSGSEL ( TYPE )$/
+MULTI_LETTER_MOD c-src/emacs/src/keyboard.c /^#define MULTI_LETTER_MOD(BIT, NAME, LEN) \\$/
+MULTI_LETTER_MOD c-src/emacs/src/keyboard.c 6231
+MULTI_LETTER_MOD c-src/emacs/src/keyboard.c /^#define MULTI_LETTER_MOD(BIT, NAME, LEN) \\$/
+MULTI_LETTER_MOD c-src/emacs/src/keyboard.c 6764
+Machin_T/b ada-src/waroquiers.ada /^ protected body Machin_T is$/
+Machin_T/t ada-src/etags-test-for.ada /^ protected type Machin_T is$/
+Machin_T/t ada-src/etags-test-for.ada /^ protected Machin_T is$/
+Machin_T/t ada-src/waroquiers.ada /^ protected type Machin_T is$/
+Machine_Exceptions/t ada-src/2ataspri.ads /^ type Machine_Exceptions is new Interfaces.C.POS/
+MakeDispose pyt-src/server.py /^ def MakeDispose(self):$/
+MakeSitelist pyt-src/server.py /^ def MakeSitelist(self, master):$/
+Makefile_filenames c-src/etags.c 603
+Makefile_help c-src/etags.c 605
+Makefile_targets c-src/etags.c /^Makefile_targets (FILE *inf)$/
+Mc cp-src/c.C /^int main (void) { my_function0(0); my_function1(1)/
+Mcccp cccp.y /^main ()$/
+Mcccp y-src/cccp.y /^main ()$/
+Mconway.cpp cp-src/conway.cpp /^void main(void)$/
+Metags c-src/etags.c /^main (int argc, char **argv)$/
+Mfail cp-src/fail.C /^main()$/
+Mkai-test.pl perl-src/kai-test.pl /^package main;$/
+More_Lisp_Bits c-src/emacs/src/lisp.h 801
+MoveLayerAfter lua-src/allegro.lua /^function MoveLayerAfter (this_one)$/
+MoveLayerBefore lua-src/allegro.lua /^function MoveLayerBefore (this_one)$/
+MoveLayerBottom lua-src/allegro.lua /^function MoveLayerBottom ()$/
+MoveLayerTop lua-src/allegro.lua /^function MoveLayerTop ()$/
+NAME y-src/cccp.c 8
+NATNUMP c-src/emacs/src/lisp.h /^NATNUMP (Lisp_Object x)$/
+NDEBUG c-src/etags.c 88
+NE y-src/parse.c 6
+NEG y-src/parse.c 9
+NEXT_ALMOST_PRIME_LIMIT c-src/emacs/src/lisp.h 3573
+NILP c-src/emacs/src/lisp.h /^# define NILP(x) lisp_h_NILP (x)$/
+NIL_IS_ZERO c-src/emacs/src/lisp.h 1515
+NONPOINTER_BITS c-src/emacs/src/lisp.h 78
+NONPOINTER_BITS c-src/emacs/src/lisp.h 80
+NONSRCS Makefile /^NONSRCS=.\/f-src\/entry.strange .\/erl-src\/lists.erl /
+NONSRCS make-src/Makefile 35
+NOTEQUAL y-src/cccp.c 13
+NULL cccp.y 51
+NULL y-src/cccp.y 51
+NULL_PTR cccp.y 63
+NULL_PTR y-src/cccp.y 63
+NUMSTATS objc-src/PackInsp.h 36
+NUM_MOD_NAMES c-src/emacs/src/keyboard.c 6325
+NUM_RECENT_KEYS c-src/emacs/src/keyboard.c 91
+NameHasChar pas-src/common.pas /^function NameHasChar; (* (TheName : NameString; Th/
+NameStringLess pas-src/common.pas /^function NameStringLess;(*(var Name1,Name2 : NameS/
+NewLayer lua-src/allegro.lua /^function NewLayer (name, x, y, w, h)$/
+NewLayerSet lua-src/allegro.lua /^function NewLayerSet (name)$/
+NewNameString pas-src/common.pas /^procedure NewNameString; (* (var NSP: NameStringPo/
+NmStrToErrStr pas-src/common.pas /^function NmStrToErrStr;(*($/
+NmStrToInteger pas-src/common.pas /^function NmStrToInteger; (* (Str : NameString) : i/
+OBJCPPSRC Makefile /^OBJCPPSRC=$(addprefix .\/objcpp-src\/,SimpleCalc.H S/
+OBJCSRC Makefile /^OBJCSRC=$(addprefix .\/objc-src\/,Subprocess.h Subpr/
+OPENBUTTON objc-src/PackInsp.m 47
+OPTIONS Makefile /^OPTIONS=--members --declarations --regex=@regexfil/
+OR y-src/cccp.c 10
+OVERLAYP c-src/emacs/src/lisp.h /^OVERLAYP (Lisp_Object x)$/
+Objc_help c-src/etags.c 613
+Objc_suffixes c-src/etags.c 609
+OperatorFun c-src/h.h 88
+Overview tex-src/gzip.texi /^@node Overview, Sample, Copying, Top$/
+PASSRC Makefile /^PASSRC=$(addprefix .\/pas-src\/,common.pas)$/
+PDT c-src/h.h /^ Date 04 May 87 235311 PDT (Mon)$/
+PERLSRC Makefile /^PERLSRC=$(addprefix .\/perl-src\/,htlmify-cystic yag/
+PHPSRC Makefile /^PHPSRC=$(addprefix .\/php-src\/,lce_functions.php pt/
+PHP_functions c-src/etags.c /^PHP_functions (FILE *inf)$/
+PHP_help c-src/etags.c 639
+PHP_suffixes c-src/etags.c 637
+POEntry php-src/lce_functions.php 105
+POEntry php-src/lce_functions.php /^ function POEntry()$/
+POEntryAD php-src/lce_functions.php 29
+PORManager php-src/lce_functions.php 498
+PORManager php-src/lce_functions.php /^ function PORManager()$/
+POReader php-src/lce_functions.php 163
+POReader php-src/lce_functions.php /^ function POReader($domain, $filename)$/
+PRINT_UNDOCUMENTED_OPTIONS_HELP c-src/etags.c 804
+PROCESSP c-src/emacs/src/lisp.h /^PROCESSP (Lisp_Object a)$/
+PROLSRC Makefile /^PROLSRC=$(addprefix .\/prol-src\/,ordsets.prolog nat/
+PROP c-src/emacs/src/keyboard.c /^#define PROP(IDX) AREF (tool_bar_item_properties, /
+PROP c-src/emacs/src/keyboard.c 8379
+PROTECT_MALLOC_STATE c-src/emacs/src/gmalloc.c /^#define PROTECT_MALLOC_STATE(PROT) protect_malloc_/
+PROTECT_MALLOC_STATE c-src/emacs/src/gmalloc.c /^#define PROTECT_MALLOC_STATE(PROT) \/* empty *\/$/
+PRTPKG f-src/entry.for /^ LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL,/
+PRTPKG f-src/entry.strange_suffix /^ LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL,/
+PSEUDO c-src/sysdep.h /^#define PSEUDO(name, syscall_name, args) /
+PSEUDOVECSIZE c-src/emacs/src/lisp.h /^#define PSEUDOVECSIZE(type, nonlispfield) \\$/
+PSEUDOVECTORP c-src/emacs/src/lisp.h /^PSEUDOVECTORP (Lisp_Object a, int code)$/
+PSEUDOVECTOR_AREA_BITS c-src/emacs/src/lisp.h 818
+PSEUDOVECTOR_FLAG c-src/emacs/src/lisp.h 774
+PSEUDOVECTOR_REST_BITS c-src/emacs/src/lisp.h 813
+PSEUDOVECTOR_REST_MASK c-src/emacs/src/lisp.h 814
+PSEUDOVECTOR_SIZE_BITS c-src/emacs/src/lisp.h 808
+PSEUDOVECTOR_SIZE_MASK c-src/emacs/src/lisp.h 809
+PSEUDOVECTOR_TYPEP c-src/emacs/src/lisp.h /^PSEUDOVECTOR_TYPEP (struct vectorlike_header *a, i/
+PSSRC Makefile /^PSSRC=$(addprefix .\/ps-src\/,rfc1245.ps)$/
+PS_functions c-src/etags.c /^PS_functions (FILE *inf)$/
+PS_help c-src/etags.c 649
+PS_suffixes c-src/etags.c 647
+PTY_LENGTH objc-src/Subprocess.m 21
+PTY_TEMPLATE objc-src/Subprocess.m 20
+PUSH_C_STR c-src/emacs/src/keyboard.c /^#define PUSH_C_STR(str, listvar) \\$/
+PUSH_HANDLER c-src/emacs/src/lisp.h /^#define PUSH_HANDLER(c, tag_ch_val, handlertype) \\/
+PVEC_BOOL_VECTOR c-src/emacs/src/lisp.h 787
+PVEC_BUFFER c-src/emacs/src/lisp.h 788
+PVEC_CHAR_TABLE c-src/emacs/src/lisp.h 796
+PVEC_COMPILED c-src/emacs/src/lisp.h 795
+PVEC_FONT c-src/emacs/src/lisp.h 798
+PVEC_FRAME c-src/emacs/src/lisp.h 785
+PVEC_FREE c-src/emacs/src/lisp.h 783
+PVEC_HASH_TABLE c-src/emacs/src/lisp.h 789
+PVEC_NORMAL_VECTOR c-src/emacs/src/lisp.h 782
+PVEC_OTHER c-src/emacs/src/lisp.h 793
+PVEC_PROCESS c-src/emacs/src/lisp.h 784
+PVEC_SUBR c-src/emacs/src/lisp.h 792
+PVEC_SUB_CHAR_TABLE c-src/emacs/src/lisp.h 797
+PVEC_TERMINAL c-src/emacs/src/lisp.h 790
+PVEC_TYPE_MASK c-src/emacs/src/lisp.h 819
+PVEC_WINDOW c-src/emacs/src/lisp.h 786
+PVEC_WINDOW_CONFIGURATION c-src/emacs/src/lisp.h 791
+PYTSRC Makefile /^PYTSRC=$(addprefix .\/pyt-src\/,server.py)$/
+PackageInspector objc-src/PackInsp.h /^@interface PackageInspector:WMInspector$/
+Pascal_functions c-src/etags.c /^Pascal_functions (FILE *inf)$/
+Pascal_help c-src/etags.c 621
+Pascal_suffixes c-src/etags.c 619
+Perl_functions c-src/etags.c /^Perl_functions (FILE *inf)$/
+Perl_help c-src/etags.c 630
+Perl_interpreters c-src/etags.c 628
+Perl_suffixes c-src/etags.c 626
+Pkg1/b ada-src/etags-test-for.ada /^package body Pkg1 is$/
+Pkg1/b ada-src/waroquiers.ada /^package body Pkg1 is$/
+Pkg1/s ada-src/etags-test-for.ada /^package Pkg1 is$/
+Pkg1/s ada-src/waroquiers.ada /^package Pkg1 is$/
+Pkg1_Func1/f ada-src/etags-test-for.ada /^ function Pkg1_Func1 return Boolean;$/
+Pkg1_Func1/f ada-src/etags-test-for.ada /^ function Pkg1_Func1 return Boolean is separate;$/
+Pkg1_Func1/f ada-src/etags-test-for.ada /^function Pkg1_Func1 return Boolean is$/
+Pkg1_Func1/f ada-src/waroquiers.ada /^ function Pkg1_Func1 return Boolean;$/
+Pkg1_Func1/f ada-src/waroquiers.ada /^ function Pkg1_Func1 return Boolean is separate;$/
+Pkg1_Func1/f ada-src/waroquiers.ada /^function Pkg1_Func1 return Boolean is$/
+Pkg1_Func2/f ada-src/etags-test-for.ada /^ function Pkg1_Func2 (Ijk : Integer; Z : Integer)/
+Pkg1_Func2/f ada-src/etags-test-for.ada /^ function Pkg1_Func2 (Ijk : Integer; Z : Integer)/
+Pkg1_Func2/f ada-src/waroquiers.ada /^ function Pkg1_Func2 (Ijk : Integer; Z : Integer)/
+Pkg1_Func2/f ada-src/waroquiers.ada /^ function Pkg1_Func2 (Ijk : Integer; Z : Integer)/
+Pkg1_Pkg1/b ada-src/etags-test-for.ada /^ package body Pkg1_Pkg1 is separate;$/
+Pkg1_Pkg1/b ada-src/etags-test-for.ada /^package body Pkg1_Pkg1 is$/
+Pkg1_Pkg1/b ada-src/waroquiers.ada /^ package body Pkg1_Pkg1 is separate;$/
+Pkg1_Pkg1/b ada-src/waroquiers.ada /^package body Pkg1_Pkg1 is$/
+Pkg1_Pkg1/s ada-src/etags-test-for.ada /^ package Pkg1_Pkg1 is$/
+Pkg1_Pkg1/s ada-src/waroquiers.ada /^ package Pkg1_Pkg1 is$/
+Pkg1_Pkg1_Proc1/p ada-src/etags-test-for.ada /^ procedure Pkg1_Pkg1_Proc1;$/
+Pkg1_Pkg1_Proc1/p ada-src/etags-test-for.ada /^ procedure Pkg1_Pkg1_Proc1 is$/
+Pkg1_Pkg1_Proc1/p ada-src/waroquiers.ada /^ procedure Pkg1_Pkg1_Proc1;$/
+Pkg1_Pkg1_Proc1/p ada-src/waroquiers.ada /^ procedure Pkg1_Pkg1_Proc1 is$/
+Pkg1_Proc1/p ada-src/etags-test-for.ada /^ procedure Pkg1_Proc1;$/
+Pkg1_Proc1/p ada-src/etags-test-for.ada /^ procedure Pkg1_Proc1 is$/
+Pkg1_Proc1/p ada-src/waroquiers.ada /^ procedure Pkg1_Proc1;$/
+Pkg1_Proc1/p ada-src/waroquiers.ada /^ procedure Pkg1_Proc1 is$/
+Pkg1_Proc2/p ada-src/etags-test-for.ada /^ procedure Pkg1_Proc2 (I : Integer);$/
+Pkg1_Proc2/p ada-src/etags-test-for.ada /^ procedure Pkg1_Proc2 (I : Integer) is$/
+Pkg1_Proc2/p ada-src/waroquiers.ada /^ procedure Pkg1_Proc2 (I : Integer);$/
+Pkg1_Proc2/p ada-src/waroquiers.ada /^ procedure Pkg1_Proc2 (I : Integer) is$/
+PostControls pyt-src/server.py /^ def PostControls(self):$/
+Pre_Call_State/t ada-src/2ataspri.ads /^ type Pre_Call_State is new System.Address;$/
+Private_T/b ada-src/etags-test-for.ada /^ task body Private_T is$/
+Private_T/b ada-src/waroquiers.ada /^ task body Private_T is$/
+Private_T/k ada-src/etags-test-for.ada /^ task Private_T;$/
+Private_T/k ada-src/waroquiers.ada /^ task Private_T;$/
+Private_T/p ada-src/etags-test-for.ada /^ procedure Private_T;$/
+Private_T/p ada-src/etags-test-for.ada /^ procedure Private_T is$/
+Private_T/p ada-src/waroquiers.ada /^ procedure Private_T;$/
+Private_T/p ada-src/waroquiers.ada /^ procedure Private_T is$/
+Private_T/t ada-src/etags-test-for.ada /^ type Private_T is private;$/
+Private_T/t ada-src/etags-test-for.ada /^ type Private_T is$/
+Private_T/t ada-src/waroquiers.ada /^ type Private_T is private;$/
+Private_T/t ada-src/waroquiers.ada /^ type Private_T is$/
+Problems tex-src/gzip.texi /^@node Problems, Concept Index, Tapes, Top$/
+Proc/t ada-src/2ataspri.ads /^ type Proc is access procedure (Addr : System.Ad/
+Prolog_functions c-src/etags.c /^Prolog_functions (FILE *inf)$/
+Prolog_help c-src/etags.c 654
+Prolog_suffixes c-src/etags.c 652
+Public_T/t ada-src/etags-test-for.ada /^ type Public_T is$/
+Public_T/t ada-src/waroquiers.ada /^ type Public_T is$/
+Python_functions c-src/etags.c /^Python_functions (FILE *inf)$/
+Python_help c-src/etags.c 660
+Python_suffixes c-src/etags.c 658
+QUIT c-src/emacs/src/lisp.h 3101
+QUITP c-src/emacs/src/lisp.h 3112
+Qpre_abbrev_expand_hook c-src/abbrev.c 82
+RANGED_INTEGERP c-src/emacs/src/lisp.h /^RANGED_INTEGERP (intmax_t lo, Lisp_Object x, intma/
+RCSid objc-src/PackInsp.m 30
+READABLE_EVENTS_DO_TIMERS_NOW c-src/emacs/src/keyboard.c 346
+READABLE_EVENTS_FILTER_EVENTS c-src/emacs/src/keyboard.c 347
+READABLE_EVENTS_IGNORE_SQUEEZABLES c-src/emacs/src/keyboard.c 348
+RECC_ALNUM c-src/emacs/src/regex.h 610
+RECC_ALPHA c-src/emacs/src/regex.h 610
+RECC_ASCII c-src/emacs/src/regex.h 617
+RECC_BLANK c-src/emacs/src/regex.h 615
+RECC_CNTRL c-src/emacs/src/regex.h 613
+RECC_DIGIT c-src/emacs/src/regex.h 614
+RECC_ERROR c-src/emacs/src/regex.h 609
+RECC_GRAPH c-src/emacs/src/regex.h 611
+RECC_LOWER c-src/emacs/src/regex.h 612
+RECC_MULTIBYTE c-src/emacs/src/regex.h 616
+RECC_NONASCII c-src/emacs/src/regex.h 616
+RECC_PRINT c-src/emacs/src/regex.h 611
+RECC_PUNCT c-src/emacs/src/regex.h 613
+RECC_SPACE c-src/emacs/src/regex.h 615
+RECC_UNIBYTE c-src/emacs/src/regex.h 617
+RECC_UPPER c-src/emacs/src/regex.h 612
+RECC_WORD c-src/emacs/src/regex.h 610
+RECC_XDIGIT c-src/emacs/src/regex.h 614
+REGEX Makefile /^REGEX=\/[ \\t]*DEFVAR_[A-Z_ \\t\\n(]+"\\([^"]+\\)"\/$/
+REGS_FIXED c-src/emacs/src/regex.h 378
+REGS_REALLOCATE c-src/emacs/src/regex.h 377
+REGS_UNALLOCATED c-src/emacs/src/regex.h 376
+REG_BADBR c-src/emacs/src/regex.h 313
+REG_BADPAT c-src/emacs/src/regex.h 305
+REG_BADRPT c-src/emacs/src/regex.h 316
+REG_EBRACE c-src/emacs/src/regex.h 312
+REG_EBRACK c-src/emacs/src/regex.h 310
+REG_ECOLLATE c-src/emacs/src/regex.h 306
+REG_ECTYPE c-src/emacs/src/regex.h 307
+REG_EEND c-src/emacs/src/regex.h 319
+REG_EESCAPE c-src/emacs/src/regex.h 308
+REG_ENOSYS c.c 279
+REG_ENOSYS c-src/emacs/src/regex.h 297
+REG_EPAREN c-src/emacs/src/regex.h 311
+REG_ERANGE c-src/emacs/src/regex.h 314
+REG_ERANGEX c-src/emacs/src/regex.h 322
+REG_ERPAREN c-src/emacs/src/regex.h 321
+REG_ESIZE c-src/emacs/src/regex.h 320
+REG_ESPACE c-src/emacs/src/regex.h 315
+REG_ESUBREG c-src/emacs/src/regex.h 309
+REG_EXTENDED c-src/emacs/src/regex.h 263
+REG_ICASE c-src/emacs/src/regex.h 267
+REG_NEWLINE c-src/emacs/src/regex.h 272
+REG_NOERROR c-src/emacs/src/regex.h 300
+REG_NOMATCH c-src/emacs/src/regex.h 301
+REG_NOSUB c-src/emacs/src/regex.h 276
+REG_NOTBOL c-src/emacs/src/regex.h 286
+REG_NOTEOL c-src/emacs/src/regex.h 289
+RESUME_POLLING c-src/emacs/src/keyboard.c 2170
+RETURN_UNGCPRO c-src/emacs/src/lisp.h /^#define RETURN_UNGCPRO(expr) \\$/
+RE_BACKSLASH_ESCAPE_IN_LISTS c-src/emacs/src/regex.h 47
+RE_BK_PLUS_QM c-src/emacs/src/regex.h 52
+RE_CHAR_CLASSES c-src/emacs/src/regex.h 58
+RE_CONTEXT_INDEP_ANCHORS c-src/emacs/src/regex.h 72
+RE_CONTEXT_INDEP_OPS c-src/emacs/src/regex.h 80
+RE_CONTEXT_INVALID_OPS c-src/emacs/src/regex.h 84
+RE_DEBUG c-src/emacs/src/regex.h 161
+RE_DOT_NEWLINE c-src/emacs/src/regex.h 88
+RE_DOT_NOT_NULL c-src/emacs/src/regex.h 92
+RE_DUP_MAX c-src/emacs/src/regex.h 253
+RE_DUP_MAX c-src/emacs/src/regex.h 256
+RE_FRUGAL c-src/emacs/src/regex.h 147
+RE_HAT_LISTS_NOT_NEWLINE c-src/emacs/src/regex.h 96
+RE_INTERVALS c-src/emacs/src/regex.h 101
+RE_LIMITED_OPS c-src/emacs/src/regex.h 105
+RE_NEWLINE_ALT c-src/emacs/src/regex.h 109
+RE_NO_BK_BRACES c-src/emacs/src/regex.h 114
+RE_NO_BK_PARENS c-src/emacs/src/regex.h 118
+RE_NO_BK_REFS c-src/emacs/src/regex.h 122
+RE_NO_BK_VBAR c-src/emacs/src/regex.h 126
+RE_NO_EMPTY_RANGES c-src/emacs/src/regex.h 132
+RE_NO_GNU_OPS c-src/emacs/src/regex.h 144
+RE_NO_NEWLINE_ANCHOR c-src/emacs/src/regex.h 153
+RE_NO_POSIX_BACKTRACKING c-src/emacs/src/regex.h 140
+RE_NREGS c-src/emacs/src/regex.h 440
+RE_SHY_GROUPS c-src/emacs/src/regex.h 150
+RE_SYNTAX_AWK c-src/emacs/src/regex.h 186
+RE_SYNTAX_ED c-src/emacs/src/regex.h 216
+RE_SYNTAX_EGREP c-src/emacs/src/regex.h 206
+RE_SYNTAX_EMACS c-src/emacs/src/regex.h 183
+RE_SYNTAX_GNU_AWK c-src/emacs/src/regex.h 193
+RE_SYNTAX_GREP c-src/emacs/src/regex.h 201
+RE_SYNTAX_POSIX_AWK c-src/emacs/src/regex.h 197
+RE_SYNTAX_POSIX_BASIC c-src/emacs/src/regex.h 225
+RE_SYNTAX_POSIX_EGREP c-src/emacs/src/regex.h 212
+RE_SYNTAX_POSIX_EXTENDED c-src/emacs/src/regex.h 234
+RE_SYNTAX_POSIX_MINIMAL_BASIC c-src/emacs/src/regex.h 231
+RE_SYNTAX_POSIX_MINIMAL_EXTENDED c-src/emacs/src/regex.h 242
+RE_SYNTAX_SED c-src/emacs/src/regex.h 218
+RE_TRANSLATE_TYPE c-src/emacs/src/regex.h 332
+RE_UNMATCHED_RIGHT_PAREN_ORD c-src/emacs/src/regex.h 136
+RSH y-src/cccp.c 17
+RTE/s ada-src/2ataspri.adb /^ package RTE renames Interfaces.C.POSIX_RTE;$/
+RUN Makefile /^RUN=$/
+Range cp-src/Range.h 35
+Range::Range cp-src/Range.h /^ Range (void)$/
+Range::Range cp-src/Range.h /^ Range (const Range& r)$/
+Range::Range cp-src/Range.h /^ Range (double b, double l)$/
+Range::Range cp-src/Range.h /^ Range (double b, double l, double i)$/
+Range::base cp-src/Range.h /^ double base (void) const { return rng_base; }$/
+Range::inc cp-src/Range.h /^ double inc (void) const { return rng_inc; }$/
+Range::limit cp-src/Range.h /^ double limit (void) const { return rng_limit; }$/
+Range::nelem cp-src/Range.h /^ int nelem (void) const { return rng_nelem; }$/
+Range::rng_base cp-src/Range.h 79
+Range::rng_inc cp-src/Range.h 81
+Range::rng_limit cp-src/Range.h 80
+Range::rng_nelem cp-src/Range.h 83
+Range::set_base cp-src/Range.h /^ void set_base (double b) { rng_base = b; }$/
+Range::set_inc cp-src/Range.h /^ void set_inc (double i) { rng_inc = i; }$/
+Range::set_limit cp-src/Range.h /^ void set_limit (double l) { rng_limit = l; }$/
+ReadVacation cp-src/functions.cpp /^void ReadVacation ( char *filename ) {$/
+Read_Lock/p ada-src/2ataspri.adb /^ procedure Read_Lock (L : in out Lock; Ceiling_V/
+Read_Lock/p ada-src/2ataspri.ads /^ procedure Read_Lock (L : in out Lock; Ceiling_V/
+ReleaseNameString pas-src/common.pas /^procedure ReleaseNameString; (* (var NSP: NameStri/
+RemoveLayer lua-src/allegro.lua /^function RemoveLayer ()$/
+RemoveUnderlineControl pas-src/common.pas /^function RemoveUnderlineControl; (*($/
+ReprOfChar pas-src/common.pas /^function ReprOfChar; (*( ch : char) : NameString;*/
+S c.c 156
+SAFE_ALLOCA c-src/emacs/src/lisp.h /^#define SAFE_ALLOCA(size) ((size) <= sa_avail \\/
+SAFE_ALLOCA_LISP c-src/emacs/src/lisp.h /^#define SAFE_ALLOCA_LISP(buf, nelt) \\$/
+SAFE_ALLOCA_STRING c-src/emacs/src/lisp.h /^#define SAFE_ALLOCA_STRING(ptr, string) \\$/
+SAFE_FREE c-src/emacs/src/lisp.h /^#define SAFE_FREE() \\$/
+SAFE_NALLOCA c-src/emacs/src/lisp.h /^#define SAFE_NALLOCA(buf, multiplier, nitems) \\/
+SAVE_FUNCPOINTER c-src/emacs/src/lisp.h 2049
+SAVE_INTEGER c-src/emacs/src/lisp.h 2048
+SAVE_OBJECT c-src/emacs/src/lisp.h 2051
+SAVE_POINTER c-src/emacs/src/lisp.h 2050
+SAVE_SLOT_BITS c-src/emacs/src/lisp.h 2055
+SAVE_TYPE_BITS c-src/emacs/src/lisp.h 2062
+SAVE_TYPE_FUNCPTR_PTR_OBJ c-src/emacs/src/lisp.h 2076
+SAVE_TYPE_INT_INT c-src/emacs/src/lisp.h 2066
+SAVE_TYPE_INT_INT_INT c-src/emacs/src/lisp.h 2067
+SAVE_TYPE_MEMORY c-src/emacs/src/lisp.h 2080
+SAVE_TYPE_OBJ_OBJ c-src/emacs/src/lisp.h 2069
+SAVE_TYPE_OBJ_OBJ_OBJ c-src/emacs/src/lisp.h 2070
+SAVE_TYPE_OBJ_OBJ_OBJ_OBJ c-src/emacs/src/lisp.h 2071
+SAVE_TYPE_PTR_INT c-src/emacs/src/lisp.h 2073
+SAVE_TYPE_PTR_OBJ c-src/emacs/src/lisp.h 2074
+SAVE_TYPE_PTR_PTR c-src/emacs/src/lisp.h 2075
+SAVE_UNUSED c-src/emacs/src/lisp.h 2047
+SAVE_VALUEP c-src/emacs/src/lisp.h /^SAVE_VALUEP (Lisp_Object x)$/
+SAVE_VALUE_SLOTS c-src/emacs/src/lisp.h 2058
+SBYTES c-src/emacs/src/lisp.h /^SBYTES (Lisp_Object string)$/
+SCHARS c-src/emacs/src/lisp.h /^SCHARS (Lisp_Object string)$/
+SCREEN_FP cp-src/screen.hpp /^#define SCREEN_FP(x,y) \\$/
+SCREEN_START cp-src/screen.hpp 33
+SDATA c-src/emacs/src/lisp.h /^SDATA (Lisp_Object string)$/
+SDTrefGetInteger pas-src/common.pas /^function SDTrefGetInteger : integer;$/
+SDTrefIsEnd pas-src/common.pas /^function SDTrefIsEnd : Boolean;$/
+SDTrefRecToString pas-src/common.pas /^procedure SDTrefRecToString (* ($/
+SDTrefSkipSpaces pas-src/common.pas /^procedure SDTrefSkipSpaces;$/
+SDTrefStringToRec pas-src/common.pas /^procedure SDTrefStringToRec (* ($/
+SETPRT f-src/entry.for /^ ENTRY SETPRT ( SHORT, EXPL, LONG, TRACE, D/
+SETPRT f-src/entry.strange_suffix /^ ENTRY SETPRT ( SHORT, EXPL, LONG, TRACE, D/
+SET_SYMBOL_BLV c-src/emacs/src/lisp.h /^SET_SYMBOL_BLV (struct Lisp_Symbol *sym, struct Li/
+SET_SYMBOL_FWD c-src/emacs/src/lisp.h /^SET_SYMBOL_FWD (struct Lisp_Symbol *sym, union Lis/
+SET_SYMBOL_VAL c-src/emacs/src/lisp.h /^# define SET_SYMBOL_VAL(sym, v) lisp_h_SET_SYMBOL_/
+SINGLE_LETTER_MOD c-src/emacs/src/keyboard.c /^#define SINGLE_LETTER_MOD(BIT) \\$/
+SINGLE_LETTER_MOD c-src/emacs/src/keyboard.c 6212
+SINGLE_LETTER_MOD c-src/emacs/src/keyboard.c /^#define SINGLE_LETTER_MOD(BIT) \\$/
+SINGLE_LETTER_MOD c-src/emacs/src/keyboard.c 6763
+SIZEFORMAT objc-src/PackInsp.m 57
+SPECPDL_BACKTRACE c-src/emacs/src/lisp.h 2948
+SPECPDL_LET c-src/emacs/src/lisp.h 2949
+SPECPDL_LET_DEFAULT c-src/emacs/src/lisp.h 2952
+SPECPDL_LET_LOCAL c-src/emacs/src/lisp.h 2951
+SPECPDL_UNWIND c-src/emacs/src/lisp.h 2944
+SPECPDL_UNWIND_INT c-src/emacs/src/lisp.h 2946
+SPECPDL_UNWIND_PTR c-src/emacs/src/lisp.h 2945
+SPECPDL_UNWIND_VOID c-src/emacs/src/lisp.h 2947
+SRCS Makefile /^SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} $/
+SREF c-src/emacs/src/lisp.h /^SREF (Lisp_Object string, ptrdiff_t index)$/
+SSDATA c-src/emacs/src/lisp.h /^SSDATA (Lisp_Object string)$/
+SSET c-src/emacs/src/lisp.h /^SSET (Lisp_Object string, ptrdiff_t index, unsigne/
+STACK_CONS c-src/emacs/src/lisp.h /^#define STACK_CONS(a, b) \\$/
+STATE_ABORT php-src/lce_functions.php 25
+STATE_COMPRESSD objc-src/PackInsp.m 54
+STATE_INSTALLED objc-src/PackInsp.m 53
+STATE_LOOP php-src/lce_functions.php 27
+STATE_OK php-src/lce_functions.php 26
+STATE_UNINSTALLED objc-src/PackInsp.m 52
+STAT_EQ objc-src/PackInsp.m /^#define STAT_EQ(s1, s2) ((s1)->st_ino == (s2)->st_/
+STDIN c-src/etags.c 408
+STDIN c-src/etags.c 411
+STOP_POLLING c-src/emacs/src/keyboard.c 2166
+STRING_BYTES c-src/emacs/src/lisp.h /^STRING_BYTES (struct Lisp_String *s)$/
+STRING_BYTES_BOUND c-src/emacs/src/lisp.h 1261
+STRING_MULTIBYTE c-src/emacs/src/lisp.h /^STRING_MULTIBYTE (Lisp_Object str)$/
+STRING_SET_CHARS c-src/emacs/src/lisp.h /^STRING_SET_CHARS (Lisp_Object string, ptrdiff_t ne/
+STRING_SET_MULTIBYTE c-src/emacs/src/lisp.h /^#define STRING_SET_MULTIBYTE(STR) \\$/
+STRING_SET_UNIBYTE c-src/emacs/src/lisp.h /^#define STRING_SET_UNIBYTE(STR) \\$/
+SUBRP c-src/emacs/src/lisp.h /^SUBRP (Lisp_Object a)$/
+SUB_CHAR_TABLE_OFFSET c-src/emacs/src/lisp.h 1701
+SUB_CHAR_TABLE_P c-src/emacs/src/lisp.h /^SUB_CHAR_TABLE_P (Lisp_Object a)$/
+SXHASH_REDUCE c-src/emacs/src/lisp.h /^SXHASH_REDUCE (EMACS_UINT x)$/
+SYMBOLP c-src/emacs/src/lisp.h /^# define SYMBOLP(x) lisp_h_SYMBOLP (x)$/
+SYMBOL_BLV c-src/emacs/src/lisp.h /^SYMBOL_BLV (struct Lisp_Symbol *sym)$/
+SYMBOL_CONSTANT_P c-src/emacs/src/lisp.h /^# define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONS/
+SYMBOL_FORWARDED c-src/emacs/src/lisp.h 651
+SYMBOL_FWD c-src/emacs/src/lisp.h /^SYMBOL_FWD (struct Lisp_Symbol *sym)$/
+SYMBOL_INDEX c-src/emacs/src/lisp.h /^#define SYMBOL_INDEX(sym) i##sym$/
+SYMBOL_INTERNED c-src/emacs/src/lisp.h 642
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY c-src/emacs/src/lisp.h 643
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P c-src/emacs/src/lisp.h /^SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object /
+SYMBOL_INTERNED_P c-src/emacs/src/lisp.h /^SYMBOL_INTERNED_P (Lisp_Object sym)$/
+SYMBOL_LOCALIZED c-src/emacs/src/lisp.h 650
+SYMBOL_NAME c-src/emacs/src/lisp.h /^SYMBOL_NAME (Lisp_Object sym)$/
+SYMBOL_PLAINVAL c-src/emacs/src/lisp.h 648
+SYMBOL_UNINTERNED c-src/emacs/src/lisp.h 641
+SYMBOL_VAL c-src/emacs/src/lisp.h /^# define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym)$/
+SYMBOL_VARALIAS c-src/emacs/src/lisp.h 649
+SYSCALL c-src/machsyscalls.c /^#define SYSCALL(name, number, type, args, typed_ar/
+Sample tex-src/gzip.texi /^@node Sample, Invoking gzip, Overview, Top$/
+Scheme_functions c-src/etags.c /^Scheme_functions (FILE *inf)$/
+Scheme_help c-src/etags.c 667
+Scheme_suffixes c-src/etags.c 665
+SelectLayer lua-src/allegro.lua /^function SelectLayer (layer)$/
+Self/f ada-src/2ataspri.adb /^ function Self return TCB_Ptr is$/
+Self/f ada-src/2ataspri.ads /^ function Self return TCB_Ptr;$/
+Server pyt-src/server.py /^class Server:$/
+ServerEdit pyt-src/server.py /^class ServerEdit(Frame):$/
+Set_Own_Priority/p ada-src/2ataspri.adb /^ procedure Set_Own_Priority (Prio : System.Any_P/
+Set_Own_Priority/p ada-src/2ataspri.ads /^ procedure Set_Own_Priority (Prio : System.Any_P/
+Set_Priority/p ada-src/2ataspri.adb /^ procedure Set_Priority$/
+Set_Priority/p ada-src/2ataspri.ads /^ procedure Set_Priority (T : TCB_Ptr; Prio : Sys/
+SimpleCalc objcpp-src/SimpleCalc.H /^@interface SimpleCalc:Object$/
+SkipBlanks pas-src/common.pas /^function SkipBlanks; (*($/
+SkipChars pas-src/common.pas /^function SkipChars; (*($/
+SkipSpaces pas-src/common.pas /^procedure SkipSpaces; (* (Str : NameString; var I /
+StartDay cp-src/functions.cpp /^Date StartDay(Date a,int days){\/\/Function to calcu/
+StripPath pas-src/common.pas /^function StripPath; (*($/
+SubString pas-src/common.pas /^function SubString; (*($/
+Subprocess objc-src/Subprocess.h 41
+Subprocess objc-src/Subprocess.h /^@interface Subprocess:Object$/
+Subprocess(Private) objc-src/Subprocess.m /^@interface Subprocess(Private)$/
+System.Task_Primitives/b ada-src/2ataspri.adb /^package body System.Task_Primitives is$/
+System.Task_Primitives/s ada-src/2ataspri.ads /^package System.Task_Primitives is$/
+T3 c.c 163
+TAG_PTR c-src/emacs/src/lisp.h /^#define TAG_PTR(tag, ptr) \\$/
+TAG_SYMOFFSET c-src/emacs/src/lisp.h /^#define TAG_SYMOFFSET(offset) \\$/
+TAS_Cell/t ada-src/2ataspri.ads /^ type TAS_Cell is private;$/
+TAS_Cell/t ada-src/2ataspri.ads /^ type TAS_Cell is$/
+TCB_Ptr/t ada-src/2ataspri.ads /^ type TCB_Ptr is access all Task_Control_Block;$/
+TERMINALP c-src/emacs/src/lisp.h /^TERMINALP (Lisp_Object a)$/
+TEST php-src/ptest.php 1
+TEXSRC Makefile /^TEXSRC=$(addprefix .\/tex-src\/,testenv.tex gzip.tex/
+TEXTAGS make-src/Makefile 204
+TEXTAGS make-src/Makefile 219
+TEX_LESC c-src/etags.c 4986
+TEX_SESC c-src/etags.c 4987
+TEX_clgrp c-src/etags.c 4922
+TEX_decode_env c-src/etags.c /^TEX_decode_env (const char *evarname, const char */
+TEX_defenv c-src/etags.c 4912
+TEX_esc c-src/etags.c 4920
+TEX_mode c-src/etags.c /^TEX_mode (FILE *inf)$/
+TEX_opgrp c-src/etags.c 4921
+TEX_toktab c-src/etags.c 4908
+TOTAL_KEYWORDS c-src/etags.c 2325
+TSL/s ada-src/2ataspri.adb /^ package TSL renames System.Tasking_Soft_Links;$/
+TYPESTOSTAT objc-src/PackInsp.h 37
+TYPE_RANGED_INTEGERP c-src/emacs/src/lisp.h /^#define TYPE_RANGED_INTEGERP(type, x) \\$/
+Tapes tex-src/gzip.texi /^@node Tapes, Problems, Environment, Top$/
+Task_Control_Block/t ada-src/2ataspri.ads /^ type Task_Control_Block is record$/
+Task_Storage_Size/t ada-src/2ataspri.ads /^ type Task_Storage_Size is new Interfaces.C.size/
+Task_Type/b ada-src/etags-test-for.ada /^ task body Task_Type is$/
+Task_Type/b ada-src/waroquiers.ada /^ task body Task_Type is$/
+Task_Type/k ada-src/etags-test-for.ada /^ task type Task_Type is$/
+Task_Type/k ada-src/waroquiers.ada /^ task type Task_Type is$/
+TeX_commands c-src/etags.c /^TeX_commands (FILE *inf)$/
+TeX_help c-src/etags.c 674
+TeX_suffixes c-src/etags.c 672
+Test_Abort/p ada-src/2ataspri.adb /^ procedure Test_Abort is$/
+Test_Abort/p ada-src/2ataspri.ads /^ procedure Test_Abort;$/
+Test_And_Set/p ada-src/2ataspri.adb /^ procedure Test_And_Set (Cell : in out TAS_Cell;/
+Test_And_Set/p ada-src/2ataspri.ads /^ procedure Test_And_Set (Cell : in out TAS_Cell;/
+Texinfo_help c-src/etags.c 688
+Texinfo_nodes c-src/etags.c /^Texinfo_nodes (FILE *inf)$/
+Texinfo_suffixes c-src/etags.c 686
+Time_to_position c-src/emacs/src/keyboard.c /^Time_to_position (Time encoded_pos)$/
+To_Lower pas-src/common.pas /^function To_Lower;(*(ch:char) : char;*)$/
+To_Start_Addr/f ada-src/2ataspri.adb /^ function To_Start_Addr is new$/
+To_TCB_Ptr/f ada-src/2ataspri.adb /^ function To_TCB_Ptr is new$/
+To_Upper pas-src/common.pas /^function To_Upper;(*(ch:char) : char;*)$/
+To_void_ptr/f ada-src/2ataspri.adb /^ function To_void_ptr is new$/
+Top tex-src/gzip.texi /^@node Top, , , (dir)$/
+Truc.Bidule/b ada-src/etags-test-for.ada /^package body Truc.Bidule is$/
+Truc.Bidule/b ada-src/waroquiers.ada /^package body Truc.Bidule is$/
+Truc.Bidule/s ada-src/etags-test-for.ada /^package Truc.Bidule is$/
+Truc.Bidule/s ada-src/waroquiers.ada /^package Truc.Bidule is$/
+Truc/s ada-src/etags-test-for.ada /^package Truc is$/
+Truc/s ada-src/waroquiers.ada /^package Truc is$/
+Type_Specific_Data/t ada-src/etags-test-for.ada /^ type Type_Specific_Data is record$/
+UCHAR c-src/emacs/src/lisp.h 2424
+UNARY y-src/cccp.c 18
+UNDEFINED c-src/h.h 118
+UNEVALLED c-src/emacs/src/lisp.h 2834
+UNGCPRO c-src/emacs/src/lisp.h 3202
+UNGCPRO c-src/emacs/src/lisp.h 3257
+UNGCPRO c-src/emacs/src/lisp.h 3353
+UNLOCK c-src/emacs/src/gmalloc.c /^#define UNLOCK() \\$/
+UNLOCK c-src/emacs/src/gmalloc.c /^#define UNLOCK()$/
+UNLOCK_ALIGNED_BLOCKS c-src/emacs/src/gmalloc.c /^#define UNLOCK_ALIGNED_BLOCKS() \\$/
+UNLOCK_ALIGNED_BLOCKS c-src/emacs/src/gmalloc.c /^#define UNLOCK_ALIGNED_BLOCKS()$/
+UNSIGNED_CMP c-src/emacs/src/lisp.h /^#define UNSIGNED_CMP(a, op, b) \\$/
+USE_LSB_TAG c-src/emacs/src/lisp.h 271
+USE_LSB_TAG c-src/emacs/src/lisp.h /^DEFINE_GDB_SYMBOL_BEGIN (bool, USE_LSB_TAG)$/
+USE_PTHREAD c-src/emacs/src/gmalloc.c 25
+USE_SAFE_ALLOCA c-src/emacs/src/lisp.h 4560
+USE_STACK_CONS c-src/emacs/src/lisp.h 4689
+USE_STACK_LISP_OBJECTS c-src/emacs/src/lisp.h 4652
+USE_STACK_LISP_OBJECTS c-src/emacs/src/lisp.h 4658
+USE_STACK_LISP_OBJECTS c-src/emacs/src/lisp.h 4659
+USE_STACK_STRING c-src/emacs/src/lisp.h 4691
+U_CHAR cccp.y 38
+U_CHAR y-src/cccp.y 38
+Unlock/p ada-src/2ataspri.adb /^ procedure Unlock (L : in out Lock) is$/
+Unlock/p ada-src/2ataspri.ads /^ procedure Unlock (L : in out Lock);$/
+User pyt-src/server.py /^class User:$/
+UserEdit pyt-src/server.py /^class UserEdit(Frame):$/
+VALBITS c-src/emacs/src/lisp.h 246
+VALMASK c-src/emacs/src/lisp.h 829
+VALMASK c-src/emacs/src/lisp.h /^DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK)$/
+VAL_MAX c-src/emacs/src/lisp.h 263
+VECSIZE c-src/emacs/src/lisp.h /^#define VECSIZE(type) \\$/
+VECTORLIKEP c-src/emacs/src/lisp.h /^# define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x)$/
+VECTORP c-src/emacs/src/lisp.h /^VECTORP (Lisp_Object x)$/
+VERSION c-src/etags.c 789
+VERSION erl-src/gs_dialog.erl /^-define(VERSION, '2001.1101').$/
+VERSION objc-src/PackInsp.m 34
+Vabbrev_start_location c-src/abbrev.c 62
+Vabbrev_start_location_buffer c-src/abbrev.c 65
+Vabbrev_table_name_list c-src/abbrev.c 42
+ValToNmStr pas-src/common.pas /^function ValToNmStr; (*($/
+Vfundamental_mode_abbrev_table c-src/abbrev.c 51
+Vglobal_abbrev_table c-src/abbrev.c 47
+Vlast_abbrev c-src/abbrev.c 69
+Vlast_abbrev_text c-src/abbrev.c 74
+Vlispy_mouse_stem c-src/emacs/src/keyboard.c 5172
+Vpre_abbrev_expand_hook c-src/abbrev.c 82
+WAIT_READING_MAX c-src/emacs/src/lisp.h 4281
+WAIT_READING_MAX c-src/emacs/src/lisp.h 4283
+WCHAR_TYPE_SIZE cccp.y 99
+WCHAR_TYPE_SIZE y-src/cccp.y 99
+WINDOWP c-src/emacs/src/lisp.h /^WINDOWP (Lisp_Object a)$/
+WINDOWSNT c-src/etags.c 101
+WINDOWSNT c-src/etags.c 102
+WINDOW_CONFIGURATIONP c-src/emacs/src/lisp.h /^WINDOW_CONFIGURATIONP (Lisp_Object a)$/
+WORKING objc-src/PackInsp.m 368
+WorkingDays cp-src/functions.cpp /^int WorkingDays(Date a, Date b){$/
+Write_Lock/p ada-src/2ataspri.adb /^ procedure Write_Lock (L : in out Lock; Ceiling_/
+Write_Lock/p ada-src/2ataspri.ads /^ procedure Write_Lock (L : in out Lock; Ceiling_/
+X c-src/h.h 100
+XBOOL_VECTOR c-src/emacs/src/lisp.h /^XBOOL_VECTOR (Lisp_Object a)$/
+XBUFFER c-src/emacs/src/lisp.h /^XBUFFER (Lisp_Object a)$/
+XBUFFER_OBJFWD c-src/emacs/src/lisp.h /^XBUFFER_OBJFWD (union Lisp_Fwd *a)$/
+XCAR c-src/emacs/src/lisp.h /^# define XCAR(c) lisp_h_XCAR (c)$/
+XCDR c-src/emacs/src/lisp.h /^# define XCDR(c) lisp_h_XCDR (c)$/
+XCHAR_TABLE c-src/emacs/src/lisp.h /^XCHAR_TABLE (Lisp_Object a)$/
+XCHG_0 c-src/sysdep.h 47
+XCHG_1 c-src/sysdep.h 48
+XCHG_2 c-src/sysdep.h 49
+XCHG_3 c-src/sysdep.h 50
+XCHG_4 c-src/sysdep.h 51
+XCHG_5 c-src/sysdep.h 52
+XCONS c-src/emacs/src/lisp.h /^# define XCONS(a) lisp_h_XCONS (a)$/
+XDEFUN c.c /^XDEFUN ("x-get-selection-internal", Fx_get_selecti/
+XFASTINT c-src/emacs/src/lisp.h /^# define XFASTINT(a) lisp_h_XFASTINT (a)$/
+XFASTINT c-src/emacs/src/lisp.h /^XFASTINT (Lisp_Object a)$/
+XFINALIZER c-src/emacs/src/lisp.h /^XFINALIZER (Lisp_Object a)$/
+XFLOAT c-src/emacs/src/lisp.h /^XFLOAT (Lisp_Object a)$/
+XFLOATINT c-src/emacs/src/lisp.h /^XFLOATINT (Lisp_Object n)$/
+XFLOAT_DATA c-src/emacs/src/lisp.h /^XFLOAT_DATA (Lisp_Object f)$/
+XFWDTYPE c-src/emacs/src/lisp.h /^XFWDTYPE (union Lisp_Fwd *a)$/
+XHASH c-src/emacs/src/lisp.h /^# define XHASH(a) lisp_h_XHASH (a)$/
+XHASH_TABLE c-src/emacs/src/lisp.h /^XHASH_TABLE (Lisp_Object a)$/
+XIL c-src/emacs/src/lisp.h /^# define XIL(i) lisp_h_XIL (i)$/
+XINT c-src/emacs/src/lisp.h /^# define XINT(a) lisp_h_XINT (a)$/
+XINT c-src/emacs/src/lisp.h /^XINT (Lisp_Object a)$/
+XINTPTR c-src/emacs/src/lisp.h /^XINTPTR (Lisp_Object a)$/
+XLI c-src/emacs/src/lisp.h /^# define XLI(o) lisp_h_XLI (o)$/
+XLI_BUILTIN_LISPSYM c-src/emacs/src/lisp.h /^#define XLI_BUILTIN_LISPSYM(iname) TAG_SYMOFFSET (/
+XMARKER c-src/emacs/src/lisp.h /^XMARKER (Lisp_Object a)$/
+XMISC c-src/emacs/src/lisp.h /^XMISC (Lisp_Object a)$/
+XMISCANY c-src/emacs/src/lisp.h /^XMISCANY (Lisp_Object a)$/
+XMISCTYPE c-src/emacs/src/lisp.h /^XMISCTYPE (Lisp_Object a)$/
+XOVERLAY c-src/emacs/src/lisp.h /^XOVERLAY (Lisp_Object a)$/
+XPNTR c-src/emacs/src/lisp.h /^# define XPNTR(a) lisp_h_XPNTR (a)$/
+XPROCESS c-src/emacs/src/lisp.h /^XPROCESS (Lisp_Object a)$/
+XSAVE_FUNCPOINTER c-src/emacs/src/lisp.h /^XSAVE_FUNCPOINTER (Lisp_Object obj, int n)$/
+XSAVE_INTEGER c-src/emacs/src/lisp.h /^XSAVE_INTEGER (Lisp_Object obj, int n)$/
+XSAVE_OBJECT c-src/emacs/src/lisp.h /^XSAVE_OBJECT (Lisp_Object obj, int n)$/
+XSAVE_POINTER c-src/emacs/src/lisp.h /^XSAVE_POINTER (Lisp_Object obj, int n)$/
+XSAVE_VALUE c-src/emacs/src/lisp.h /^XSAVE_VALUE (Lisp_Object a)$/
+XSETBOOL_VECTOR c-src/emacs/src/lisp.h /^#define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a/
+XSETBUFFER c-src/emacs/src/lisp.h /^#define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, /
+XSETCDR c-src/emacs/src/lisp.h /^XSETCDR (Lisp_Object c, Lisp_Object n)$/
+XSETCHAR_TABLE c-src/emacs/src/lisp.h /^#define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a,/
+XSETCOMPILED c-src/emacs/src/lisp.h /^#define XSETCOMPILED(a, b) (XSETPSEUDOVECTOR (a, b/
+XSETCONS c-src/emacs/src/lisp.h /^#define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Li/
+XSETFASTINT c-src/emacs/src/lisp.h /^#define XSETFASTINT(a, b) ((a) = make_natnum (b))$/
+XSETFLOAT c-src/emacs/src/lisp.h /^#define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, L/
+XSETINT c-src/emacs/src/lisp.h /^#define XSETINT(a, b) ((a) = make_number (b))$/
+XSETMISC c-src/emacs/src/lisp.h /^#define XSETMISC(a, b) ((a) = make_lisp_ptr (b, Li/
+XSETPROCESS c-src/emacs/src/lisp.h /^#define XSETPROCESS(a, b) (XSETPSEUDOVECTOR (a, b,/
+XSETPSEUDOVECTOR c-src/emacs/src/lisp.h /^#define XSETPSEUDOVECTOR(a, b, code) \\$/
+XSETPVECTYPE c-src/emacs/src/lisp.h /^#define XSETPVECTYPE(v, code) \\$/
+XSETPVECTYPESIZE c-src/emacs/src/lisp.h /^#define XSETPVECTYPESIZE(v, code, lispsize, restsi/
+XSETSTRING c-src/emacs/src/lisp.h /^#define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, /
+XSETSUBR c-src/emacs/src/lisp.h /^#define XSETSUBR(a, b) (XSETPSEUDOVECTOR (a, b, PV/
+XSETSUB_CHAR_TABLE c-src/emacs/src/lisp.h /^#define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR/
+XSETSYMBOL c-src/emacs/src/lisp.h /^#define XSETSYMBOL(a, b) ((a) = make_lisp_symbol (/
+XSETTERMINAL c-src/emacs/src/lisp.h /^#define XSETTERMINAL(a, b) (XSETPSEUDOVECTOR (a, b/
+XSETTYPED_PSEUDOVECTOR c-src/emacs/src/lisp.h /^#define XSETTYPED_PSEUDOVECTOR(a, b, size, code) /
+XSETVECTOR c-src/emacs/src/lisp.h /^#define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, /
+XSETWINDOW c-src/emacs/src/lisp.h /^#define XSETWINDOW(a, b) (XSETPSEUDOVECTOR (a, b, /
+XSETWINDOW_CONFIGURATION c-src/emacs/src/lisp.h /^#define XSETWINDOW_CONFIGURATION(a, b) \\$/
+XSET_HASH_TABLE c-src/emacs/src/lisp.h /^#define XSET_HASH_TABLE(VAR, PTR) \\$/
+XSTRING c-src/emacs/src/lisp.h /^XSTRING (Lisp_Object a)$/
+XSUBR c-src/emacs/src/lisp.h /^XSUBR (Lisp_Object a)$/
+XSUB_CHAR_TABLE c-src/emacs/src/lisp.h /^XSUB_CHAR_TABLE (Lisp_Object a)$/
+XSYMBOL c-src/emacs/src/lisp.h /^# define XSYMBOL(a) lisp_h_XSYMBOL (a)$/
+XSYMBOL c-src/emacs/src/lisp.h /^XSYMBOL (Lisp_Object a)$/
+XTERMINAL c-src/emacs/src/lisp.h /^XTERMINAL (Lisp_Object a)$/
+XTYPE c-src/emacs/src/lisp.h /^# define XTYPE(a) lisp_h_XTYPE (a)$/
+XTYPE c-src/emacs/src/lisp.h /^XTYPE (Lisp_Object a)$/
+XUNTAG c-src/emacs/src/lisp.h /^# define XUNTAG(a, type) lisp_h_XUNTAG (a, type)$/
+XUNTAG c-src/emacs/src/lisp.h /^XUNTAG (Lisp_Object a, int type)$/
+XWINDOW c-src/emacs/src/lisp.h /^XWINDOW (Lisp_Object a)$/
+Y c-src/h.h 100
+YACC c-src/etags.c 2199
+YSRC Makefile /^YSRC=$(addprefix .\/y-src\/,parse.y parse.c atest.y /
+YYABORT /usr/share/bison/bison.simple 153
+YYABORT /usr/share/bison/bison.simple 153
+YYACCEPT /usr/share/bison/bison.simple 152
+YYACCEPT /usr/share/bison/bison.simple 152
+YYBACKUP /usr/share/bison/bison.simple /^#define YYBACKUP(Token, Value) \\$/
+YYBACKUP /usr/share/bison/bison.simple /^#define YYBACKUP(Token, Value) \\$/
+YYBISON y-src/parse.c 4
+YYBISON y-src/cccp.c 4
+YYDEBUG parse.y 88
+YYDEBUG cccp.y 122
+YYDPRINTF /usr/share/bison/bison.simple /^# define YYDPRINTF(Args) \\$/
+YYDPRINTF /usr/share/bison/bison.simple /^# define YYDPRINTF(Args)$/
+YYDPRINTF /usr/share/bison/bison.simple /^# define YYDPRINTF(Args) \\$/
+YYDPRINTF /usr/share/bison/bison.simple /^# define YYDPRINTF(Args)$/
+YYEMPTY /usr/share/bison/bison.simple 150
+YYEMPTY /usr/share/bison/bison.simple 150
+YYEOF /usr/share/bison/bison.simple 151
+YYEOF /usr/share/bison/bison.simple 151
+YYERRCODE /usr/share/bison/bison.simple 178
+YYERRCODE /usr/share/bison/bison.simple 178
+YYERROR /usr/share/bison/bison.simple 154
+YYERROR /usr/share/bison/bison.simple 154
+YYFAIL /usr/share/bison/bison.simple 158
+YYFAIL /usr/share/bison/bison.simple 158
+YYFINAL parse.y 93
+YYFINAL cccp.y 127
+YYFLAG parse.y 94
+YYFLAG cccp.y 128
+YYFPRINTF /usr/share/bison/bison.simple 225
+YYFPRINTF /usr/share/bison/bison.simple 225
+YYINITDEPTH /usr/share/bison/bison.simple 244
+YYINITDEPTH /usr/share/bison/bison.simple 244
+YYLAST parse.y 266
+YYLAST cccp.y 274
+YYLEX /usr/share/bison/bison.simple 200
+YYLEX /usr/share/bison/bison.simple 202
+YYLEX /usr/share/bison/bison.simple 206
+YYLEX /usr/share/bison/bison.simple 208
+YYLEX /usr/share/bison/bison.simple 212
+YYLEX /usr/share/bison/bison.simple 200
+YYLEX /usr/share/bison/bison.simple 202
+YYLEX /usr/share/bison/bison.simple 206
+YYLEX /usr/share/bison/bison.simple 208
+YYLEX /usr/share/bison/bison.simple 212
+YYLLOC_DEFAULT /usr/share/bison/bison.simple /^# define YYLLOC_DEFAULT(Current, Rhs, N) \\$/
+YYLLOC_DEFAULT /usr/share/bison/bison.simple /^# define YYLLOC_DEFAULT(Current, Rhs, N) \\$/
+YYMAXDEPTH /usr/share/bison/bison.simple 255
+YYMAXDEPTH /usr/share/bison/bison.simple 259
+YYMAXDEPTH /usr/share/bison/bison.simple 255
+YYMAXDEPTH /usr/share/bison/bison.simple 259
+YYNTBASE parse.y 95
+YYNTBASE cccp.y 129
+YYPARSE_PARAM_ARG /usr/share/bison/bison.simple 351
+YYPARSE_PARAM_ARG /usr/share/bison/bison.simple 354
+YYPARSE_PARAM_ARG /usr/share/bison/bison.simple 358
+YYPARSE_PARAM_ARG /usr/share/bison/bison.simple 351
+YYPARSE_PARAM_ARG /usr/share/bison/bison.simple 354
+YYPARSE_PARAM_ARG /usr/share/bison/bison.simple 358
+YYPARSE_PARAM_DECL /usr/share/bison/bison.simple 352
+YYPARSE_PARAM_DECL /usr/share/bison/bison.simple 355
+YYPARSE_PARAM_DECL /usr/share/bison/bison.simple 359
+YYPARSE_PARAM_DECL /usr/share/bison/bison.simple 352
+YYPARSE_PARAM_DECL /usr/share/bison/bison.simple 355
+YYPARSE_PARAM_DECL /usr/share/bison/bison.simple 359
+YYPOPSTACK /usr/share/bison/bison.simple 445
+YYPOPSTACK /usr/share/bison/bison.simple 447
+YYPOPSTACK /usr/share/bison/bison.simple 445
+YYPOPSTACK /usr/share/bison/bison.simple 447
+YYRECOVERING /usr/share/bison/bison.simple /^#define YYRECOVERING() (!!yyerrstatus)$/
+YYRECOVERING /usr/share/bison/bison.simple /^#define YYRECOVERING() (!!yyerrstatus)$/
+YYSIZE_T /usr/share/bison/bison.simple 51
+YYSIZE_T /usr/share/bison/bison.simple 56
+YYSIZE_T /usr/share/bison/bison.simple 71
+YYSIZE_T /usr/share/bison/bison.simple 75
+YYSIZE_T /usr/share/bison/bison.simple 128
+YYSIZE_T /usr/share/bison/bison.simple 131
+YYSIZE_T /usr/share/bison/bison.simple 136
+YYSIZE_T /usr/share/bison/bison.simple 140
+YYSIZE_T /usr/share/bison/bison.simple 145
+YYSIZE_T /usr/share/bison/bison.simple 51
+YYSIZE_T /usr/share/bison/bison.simple 56
+YYSIZE_T /usr/share/bison/bison.simple 71
+YYSIZE_T /usr/share/bison/bison.simple 75
+YYSIZE_T /usr/share/bison/bison.simple 128
+YYSIZE_T /usr/share/bison/bison.simple 131
+YYSIZE_T /usr/share/bison/bison.simple 136
+YYSIZE_T /usr/share/bison/bison.simple 140
+YYSIZE_T /usr/share/bison/bison.simple 145
+YYSTACK_ALLOC /usr/share/bison/bison.simple 50
+YYSTACK_ALLOC /usr/share/bison/bison.simple 55
+YYSTACK_ALLOC /usr/share/bison/bison.simple 59
+YYSTACK_ALLOC /usr/share/bison/bison.simple 78
+YYSTACK_ALLOC /usr/share/bison/bison.simple 50
+YYSTACK_ALLOC /usr/share/bison/bison.simple 55
+YYSTACK_ALLOC /usr/share/bison/bison.simple 59
+YYSTACK_ALLOC /usr/share/bison/bison.simple 78
+YYSTACK_BYTES /usr/share/bison/bison.simple /^# define YYSTACK_BYTES(N) \\$/
+YYSTACK_BYTES /usr/share/bison/bison.simple /^# define YYSTACK_BYTES(N) \\$/
+YYSTACK_BYTES /usr/share/bison/bison.simple /^# define YYSTACK_BYTES(N) \\$/
+YYSTACK_BYTES /usr/share/bison/bison.simple /^# define YYSTACK_BYTES(N) \\$/
+YYSTACK_FREE /usr/share/bison/bison.simple /^# define YYSTACK_FREE(Ptr) do { \/* empty *\/; } wh/
+YYSTACK_FREE /usr/share/bison/bison.simple 79
+YYSTACK_FREE /usr/share/bison/bison.simple /^# define YYSTACK_FREE(Ptr) do { \/* empty *\/; } wh/
+YYSTACK_FREE /usr/share/bison/bison.simple 79
+YYSTACK_GAP_MAX /usr/share/bison/bison.simple 93
+YYSTACK_GAP_MAX /usr/share/bison/bison.simple 93
+YYSTACK_RELOCATE /usr/share/bison/bison.simple /^# define YYSTACK_RELOCATE(Type, Stack) \\$/
+YYSTACK_RELOCATE /usr/share/bison/bison.simple 548
+YYSTACK_RELOCATE /usr/share/bison/bison.simple /^# define YYSTACK_RELOCATE(Type, Stack) \\$/
+YYSTACK_RELOCATE /usr/share/bison/bison.simple 548
+YYSTD /usr/share/bison/bison.simple /^# define YYSTD(x) std::x$/
+YYSTD /usr/share/bison/bison.simple /^# define YYSTD(x) x$/
+YYSTD /usr/share/bison/bison.simple /^# define YYSTD(x) std::x$/
+YYSTD /usr/share/bison/bison.simple /^# define YYSTD(x) x$/
+YYSTYPE y-src/parse.y 71
+YYSTYPE y-src/parse.y 72
+YYSTYPE parse.y 71
+YYSTYPE parse.y 72
+YYSTYPE parse.y 85
+YYSTYPE cccp.y 119
+YYTERROR /usr/share/bison/bison.simple 177
+YYTERROR /usr/share/bison/bison.simple 177
+YYTRANSLATE parse.y /^#define YYTRANSLATE(x) ((unsigned)(x) <= 278 ? yyt/
+YYTRANSLATE cccp.y /^#define YYTRANSLATE(x) ((unsigned)(x) <= 269 ? yyt/
+YY_DECL_NON_LSP_VARIABLES /usr/share/bison/bison.simple 374
+YY_DECL_NON_LSP_VARIABLES /usr/share/bison/bison.simple 374
+YY_DECL_VARIABLES /usr/share/bison/bison.simple 385
+YY_DECL_VARIABLES /usr/share/bison/bison.simple 391
+YY_DECL_VARIABLES /usr/share/bison/bison.simple 385
+YY_DECL_VARIABLES /usr/share/bison/bison.simple 391
+Yacc_entries c-src/etags.c /^Yacc_entries (FILE *inf)$/
+Yacc_help c-src/etags.c 693
+Yacc_suffixes c-src/etags.c 691
+Z c-src/h.h 100
+\ tex-src/texinfo.tex /^\\def\\ {{\\fontdimen2\\font=\\tclosesave{} }}%$/
+\ tex-src/texinfo.tex /^\\gdef\\sepspaces{\\def {\\ }}}$/
+\' tex-src/texinfo.tex /^\\def\\'{{'}}$/
+\* tex-src/texinfo.tex /^\\def\\*{\\hfil\\break\\hbox{}\\ignorespaces}$/
+\. tex-src/texinfo.tex /^\\def\\.{.\\spacefactor=3000 }$/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("abbrev-table-name-list", &Vabbrev_/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("global-abbrev-table", &Vglobal_abb/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("fundamental-mode-abbrev-table", &V/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("last-abbrev", &Vlast_abbrev,
+ "/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_t/
+\1 c-src/abbrev.c /^ DEFVAR_INT ("last-abbrev-location", &last_abbrev/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("abbrev-start-location", &Vabbrev_s/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("abbrev-start-location-buffer", &Va/
+\1 c-src/abbrev.c /^ DEFVAR_PER_BUFFER ("local-abbrev-table", &curren/
+\1 c-src/abbrev.c /^ DEFVAR_BOOL ("abbrevs-changed", &abbrevs_changed/
+\1 c-src/abbrev.c /^ DEFVAR_BOOL ("abbrev-all-caps", &abbrev_all_caps/
+\1 c-src/abbrev.c /^ DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abb/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("internal--top-level-message", Vint/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("last-command-event", last_command_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("last-nonmenu-event", last_nonmenu_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("last-input-event", last_input_even/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("unread-command-events", Vunread_co/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("unread-post-input-method-events", /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("unread-input-method-events", Vunre/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("meta-prefix-char", meta_prefix_cha/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("last-command", Vlast_command,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("real-last-command", Vreal_last_c/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("last-repeatable-command", Vlast_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("this-command", Vthis_command,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("real-this-command", Vreal_this_com/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("this-command-keys-shift-translated/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("this-original-command", Vthis_orig/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_INT ("auto-save-interval", auto_save_inte/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("auto-save-timeout", Vauto_save_tim/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("echo-keystrokes", Vecho_keystrokes/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_INT ("polling-period", polling_period,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("double-click-time", Vdouble_click_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_INT ("double-click-fuzz", double_click_fu/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_INT ("num-input-keys", num_input_keys,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_INT ("num-nonmacro-input-events", num_non/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("last-event-frame", Vlast_event_fra/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("tty-erase-char", Vtty_erase_char,
+/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("help-char", Vhelp_char,
+ do/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("help-event-list", Vhelp_event_list/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("help-form", Vhelp_form,
+ do/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("prefix-help-command", Vprefix_help/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("top-level", Vtop_level,
+ do/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("keyboard-translate-table", Vkeyb/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_BOOL ("cannot-suspend", cannot_suspend,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_BOOL ("menu-prompting", menu_prompting,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("menu-prompt-more-char", menu_promp/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_INT ("extra-keyboard-modifiers", extra_ke/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("deactivate-mark", Vdeactivate_mark/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("pre-command-hook", Vpre_command_ho/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("post-command-hook", Vpost_command_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("echo-area-clear-hook", ...,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("lucid-menu-bar-dirty-flag", Vlucid/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("menu-bar-final-items", Vmenu_bar_f/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("tool-bar-separator-image-expressio/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("overriding-terminal-local-map",
+/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("overriding-local-map", Voverriding/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("overriding-local-map-menu-flag", V/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("special-event-map", Vspecial_event/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("track-mouse", do_mouse_tracking,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("system-key-alist", Vsystem_key_a/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("local-function-key-map", Vlocal_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_KBOARD ("input-decode-map", Vinput_decode/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("function-key-map", Vfunction_key_m/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("key-translation-map", Vkey_transla/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("deferred-action-list", Vdeferred_a/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("deferred-action-function", Vdeferr/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("delayed-warnings-list", Vdelayed_w/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("timer-list", Vtimer_list,
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("timer-idle-list", Vtimer_idle_list/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("input-method-function", Vinput_met/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("input-method-previous-message",
+ /
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("show-help-function", Vshow_help_fu/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("disable-point-adjustment", Vdisabl/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("global-disable-point-adjustment",
+/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("minibuffer-message-timeout", Vmini/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("throw-on-input", Vthrow_on_input,
+/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("command-error-function", Vcommand_/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("enable-disabled-menus-and-buttons"/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("select-active-regions",
+ Vs/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("saved-region-selection",
+ V/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("selection-inhibit-update-commands"/
+\1 c-src/emacs/src/keyboard.c /^ DEFVAR_LISP ("debug-on-event",
+ Vd/
+\: tex-src/texinfo.tex /^\\def\\:{\\spacefactor=1000 }$/
+\@ tex-src/texinfo.tex /^\\def\\@{{\\tt \\char '100}}$/
+\@ tex-src/texinfo.tex /^\\def\\@{@}%$/
+\CHAPFopen tex-src/texinfo.tex /^\\def\\CHAPFopen{$/
+\CHAPFplain tex-src/texinfo.tex /^\\def\\CHAPFplain{$/
+\CHAPPAGodd tex-src/texinfo.tex /^\\def\\CHAPPAGodd{$/
+\CHAPPAGoff tex-src/texinfo.tex /^\\def\\CHAPPAGoff{$/
+\CHAPPAGon tex-src/texinfo.tex /^\\def\\CHAPPAGon{$/
+\ENVcheck tex-src/texinfo.tex /^\\def\\ENVcheck{%$/
+\Ealphaenumerate tex-src/texinfo.tex /^\\def\\Ealphaenumerate{\\Eenumerate}$/
+\Ecapsenumerate tex-src/texinfo.tex /^\\def\\Ecapsenumerate{\\Eenumerate}$/
+\Ecartouche tex-src/texinfo.tex /^\\def\\Ecartouche{%$/
+\Edescription tex-src/texinfo.tex /^\\def\\Edescription{\\Etable}% Neccessary kludge.$/
+\Edisplay tex-src/texinfo.tex /^\\def\\Edisplay{\\endgroup\\afterenvbreak}%$/
+\Eexample tex-src/texinfo.tex /^\\def\\Eexample{\\Elisp}$/
+\Eflushleft tex-src/texinfo.tex /^\\def\\Eflushleft{\\endgroup\\afterenvbreak}%$/
+\Eflushright tex-src/texinfo.tex /^\\def\\Eflushright{\\endgroup\\afterenvbreak}%$/
+\Eformat tex-src/texinfo.tex /^\\def\\Eformat{\\endgroup\\afterenvbreak}$/
+\Eftable tex-src/texinfo.tex /^\\def\\Eftable{\\endgraf\\endgroup\\afterenvbreak}%$/
+\Egroup tex-src/texinfo.tex /^ \\def\\Egroup{\\egroup\\endgroup}%$/
+\Eifclear tex-src/texinfo.tex /^\\def\\Eifclear{}$/
+\Eifset tex-src/texinfo.tex /^\\def\\Eifset{}$/
+\Eiftex tex-src/texinfo.tex /^\\def\\Eiftex{}$/
+\Elisp tex-src/texinfo.tex /^\\def\\Elisp{\\endgroup\\afterenvbreak}%$/
+\Equotation tex-src/texinfo.tex /^\\def\\Equotation{\\par\\endgroup\\afterenvbreak}%$/
+\Esmallexample tex-src/texinfo.tex /^\\def\\Esmallexample{\\Elisp}$/
+\Esmallexample tex-src/texinfo.tex /^\\global\\def\\Esmallexample{\\Esmalllisp}$/
+\Esmalllisp tex-src/texinfo.tex /^\\def\\Esmalllisp{\\endgroup\\afterenvbreak}%$/
+\Etable tex-src/texinfo.tex /^\\def\\Etable{\\endgraf\\endgroup\\afterenvbreak}%$/
+\Etitlepage tex-src/texinfo.tex /^\\def\\Etitlepage{%$/
+\Evtable tex-src/texinfo.tex /^\\def\\Evtable{\\endgraf\\endgroup\\afterenvbreak}%$/
+\HEADINGSafter tex-src/texinfo.tex /^\\def\\HEADINGSafter{\\let\\HEADINGShook=\\HEADINGSdoub/
+\HEADINGSdouble tex-src/texinfo.tex /^\\def\\HEADINGSdouble{$/
+\HEADINGSdoublex tex-src/texinfo.tex /^\\def\\HEADINGSdoublex{%$/
+\HEADINGSoff tex-src/texinfo.tex /^\\def\\HEADINGSoff{$/
+\HEADINGSon tex-src/texinfo.tex /^\\def\\HEADINGSon{\\HEADINGSdouble}$/
+\HEADINGSon tex-src/texinfo.tex /^\\global\\def\\HEADINGSon{\\HEADINGSsingle}}$/
+\HEADINGSon tex-src/texinfo.tex /^\\global\\def\\HEADINGSon{\\HEADINGSdouble}}$/
+\HEADINGSsingle tex-src/texinfo.tex /^\\def\\HEADINGSsingle{$/
+\HEADINGSsingleafter tex-src/texinfo.tex /^\\def\\HEADINGSsingleafter{\\let\\HEADINGShook=\\HEADIN/
+\HEADINGSsinglex tex-src/texinfo.tex /^\\def\\HEADINGSsinglex{%$/
+\TeX tex-src/texinfo.tex /^\\def\\TeX{\\realbackslash TeX}%$/
+\TeX tex-src/texinfo.tex /^\\def\\TeX{\\realbackslash TeX}$/
+\Yappendixletterandtype tex-src/texinfo.tex /^\\def\\Yappendixletterandtype{%$/
+\Ynothing tex-src/texinfo.tex /^\\def\\Ynothing{}$/
+\Ypagenumber tex-src/texinfo.tex /^\\def\\Ypagenumber{\\folio}$/
+\Ysectionnumberandtype tex-src/texinfo.tex /^\\def\\Ysectionnumberandtype{%$/
+\Ytitle tex-src/texinfo.tex /^\\def\\Ytitle{\\thischapter}$/
+\_ tex-src/texinfo.tex /^\\def\\_{{\\realbackslash _}}%$/
+\_ tex-src/texinfo.tex /^\\def\\_{\\lvvmode \\kern.06em \\vbox{\\hrule width.3em /
+\` tex-src/texinfo.tex /^\\def\\`{{`}}$/
+\aboveenvbreak tex-src/texinfo.tex /^\\def\\aboveenvbreak{{\\advance\\aboveenvskipamount by/
+\activedoublequote tex-src/texinfo.tex /^\\def\\activedoublequote{{\\tt \\char '042}}$/
+\activeparens tex-src/texinfo.tex /^\\def\\activeparens{%$/
+\afourpaper tex-src/texinfo.tex /^\\def\\afourpaper{$/
+\afterenvbreak tex-src/texinfo.tex /^\\def\\afterenvbreak{\\endgraf \\ifdim\\lastskip<\\above/
+\alphaenumerate tex-src/texinfo.tex /^\\def\\alphaenumerate{\\enumerate{a}}$/
+\appendix tex-src/texinfo.tex /^\\outer\\def\\appendix{\\parsearg\\appendixzzz}$/
+\appendixletter tex-src/texinfo.tex /^\\def\\appendixletter{\\char\\the\\appendixno}$/
+\appendixnoderef tex-src/texinfo.tex /^\\def\\appendixnoderef{\\ifx\\lastnode\\relax\\else$/
+\appendixsec tex-src/texinfo.tex /^\\outer\\def\\appendixsec{\\parsearg\\appendixsectionzz/
+\appendixsection tex-src/texinfo.tex /^\\outer\\def\\appendixsection{\\parsearg\\appendixsecti/
+\appendixsectionzzz tex-src/texinfo.tex /^\\def\\appendixsectionzzz #1{\\seccheck{appendixsecti/
+\appendixsetref tex-src/texinfo.tex /^\\def\\appendixsetref#1{%$/
+\appendixsubsec tex-src/texinfo.tex /^\\outer\\def\\appendixsubsec{\\parsearg\\appendixsubsec/
+\appendixsubseczzz tex-src/texinfo.tex /^\\def\\appendixsubseczzz #1{\\seccheck{appendixsubsec/
+\appendixsubsubsec tex-src/texinfo.tex /^\\outer\\def\\appendixsubsubsec{\\parsearg\\appendixsub/
+\appendixsubsubseczzz tex-src/texinfo.tex /^\\def\\appendixsubsubseczzz #1{\\seccheck{appendixsub/
+\appendixzzz tex-src/texinfo.tex /^\\def\\appendixzzz #1{\\seccheck{appendix}%$/
+\asis tex-src/texinfo.tex /^\\def\\asis#1{#1}$/
+\author tex-src/texinfo.tex /^ \\def\\author{\\parsearg\\authorzzz}%$/
+\authorfont tex-src/texinfo.tex /^ \\def\\authorfont{\\authorrm \\normalbaselineskip =/
+\authorzzz tex-src/texinfo.tex /^ \\def\\authorzzz##1{\\ifseenauthor\\else\\vskip 0pt /
+\b tex-src/texinfo.tex /^\\def\\b#1{{\\bf #1}}$/
+\b tex-src/texinfo.tex /^\\def\\b##1{\\realbackslash b {##1}}%$/
+\b tex-src/texinfo.tex /^\\def\\b##1{\\realbackslash b {##1}}$/
+\balancecolumns tex-src/texinfo.tex /^\\def\\balancecolumns{%$/
+\begin tex-src/texinfo.tex /^\\outer\\def\\begin{\\parsearg\\beginxxx}$/
+\begindoublecolumns tex-src/texinfo.tex /^\\def\\begindoublecolumns{\\begingroup$/
+\beginxxx tex-src/texinfo.tex /^\\def\\beginxxx #1{%$/
+\bf tex-src/texinfo.tex /^\\def\\bf{\\realbackslash bf }%$/
+\bf tex-src/texinfo.tex /^\\def\\bf{\\realbackslash bf }$/
+\bullet tex-src/texinfo.tex /^\\def\\bullet{$\\ptexbullet$}$/
+\bye tex-src/texinfo.tex /^\\outer\\def\\bye{\\pagealignmacro\\tracingstats=1\\ptex/
+\capsenumerate tex-src/texinfo.tex /^\\def\\capsenumerate{\\enumerate{A}}$/
+\cartbot tex-src/texinfo.tex /^\\def\\cartbot{\\hbox to \\cartouter{\\hskip\\lskip$/
+\cartouche tex-src/texinfo.tex /^\\long\\def\\cartouche{%$/
+\carttop tex-src/texinfo.tex /^\\def\\carttop{\\hbox to \\cartouter{\\hskip\\lskip$/
+\cbl tex-src/texinfo.tex /^\\def\\cbl{{\\circle\\char'012\\hskip -6pt}}$/
+\cbr tex-src/texinfo.tex /^\\def\\cbr{{\\hskip 6pt\\circle\\char'011}}$/
+\center tex-src/texinfo.tex /^\\def\\center{\\parsearg\\centerzzz}$/
+\centerzzz tex-src/texinfo.tex /^\\def\\centerzzz #1{{\\advance\\hsize by -\\leftskip$/
+\chapbreak tex-src/texinfo.tex /^\\def\\chapbreak{\\dobreak \\chapheadingskip {-4000}}$/
+\chapentry tex-src/texinfo.tex /^\\def\\chapentry#1#2#3{\\dochapentry{#2\\labelspace#1}/
+\chapentryfonts tex-src/texinfo.tex /^\\def\\chapentryfonts{\\secfonts \\rm}$/
+\chapfonts tex-src/texinfo.tex /^\\def\\chapfonts{%$/
+\chapheading tex-src/texinfo.tex /^\\def\\chapheading{\\parsearg\\chapheadingzzz}$/
+\chapheadingzzz tex-src/texinfo.tex /^\\def\\chapheadingzzz #1{\\chapbreak %$/
+\chapoddpage tex-src/texinfo.tex /^\\def\\chapoddpage{\\chappager \\ifodd\\pageno \\else \\h/
+\chappager tex-src/texinfo.tex /^\\def\\chappager{\\par\\vfill\\supereject}$/
+\chapter tex-src/texinfo.tex /^\\outer\\def\\chapter{\\parsearg\\chapterzzz}$/
+\chapternofonts tex-src/texinfo.tex /^\\def\\chapternofonts{%$/
+\chapterzzz tex-src/texinfo.tex /^\\def\\chapterzzz #1{\\seccheck{chapter}%$/
+\char tex-src/texinfo.tex /^\\def\\char{\\realbackslash char}%$/
+\char tex-src/texinfo.tex /^\\def\\char{\\realbackslash char}$/
+\chfopen tex-src/texinfo.tex /^\\def\\chfopen #1#2{\\chapoddpage {\\chapfonts$/
+\chfplain tex-src/texinfo.tex /^\\def\\chfplain #1#2{%$/
+\cindex tex-src/texinfo.tex /^\\def\\cindex {\\cpindex}$/
+\cindexsub tex-src/texinfo.tex /^\\def\\cindexsub {\\begingroup\\obeylines\\cindexsub}$/
+\cite tex-src/texinfo.tex /^\\def\\cite##1{\\realbackslash cite {##1}}%$/
+\cite tex-src/texinfo.tex /^\\def\\cite##1{\\realbackslash cite {##1}}$/
+\clear tex-src/texinfo.tex /^\\def\\clear{\\parsearg\\clearxxx}$/
+\clearxxx tex-src/texinfo.tex /^\\def\\clearxxx #1{$/
+\code tex-src/texinfo.tex /^\\def\\code##1{\\realbackslash code {##1}}%$/
+\code tex-src/texinfo.tex /^\\def\\code##1{\\realbackslash code {##1}}$/
+\comment tex-src/texinfo.tex /^\\def\\comment{\\catcode 64=\\other \\catcode 123=\\othe/
+\commentxxx tex-src/texinfo.tex /^\\def\\commentxxx #1{\\catcode 64=0 \\catcode 123=1 \\c/
+\contents tex-src/texinfo.tex /^\\outer\\def\\contents{%$/
+\copyright tex-src/texinfo.tex /^\\def\\copyright{\\realbackslash copyright }%$/
+\copyright tex-src/texinfo.tex /^\\def\\copyright{\\realbackslash copyright}$/
+\cropmarks tex-src/texinfo.tex /^\\def\\cropmarks{\\let\\onepageout=\\croppageout }$/
+\croppageout tex-src/texinfo.tex /^\\def\\croppageout#1{\\hoffset=0pt % make sure this d/
+\ctl tex-src/texinfo.tex /^\\def\\ctl{{\\circle\\char'013\\hskip -6pt}}% 6pt from /
+\ctr tex-src/texinfo.tex /^\\def\\ctr{{\\hskip 6pt\\circle\\char'010}}$/
+\ctrl tex-src/texinfo.tex /^\\def\\ctrl #1{{\\tt \\rawbackslash \\hat}#1}$/
+\defcodeindex tex-src/texinfo.tex /^\\def\\defcodeindex{\\parsearg\\newcodeindex}$/
+\defcv tex-src/texinfo.tex /^\\def\\defcv #1 {\\def\\defcvtype{#1}%$/
+\defcvarheader tex-src/texinfo.tex /^\\def\\defcvarheader #1#2#3{%$/
+\defcvx tex-src/texinfo.tex /^\\def\\defcvx #1 {\\errmessage{@defcvx in invalid con/
+\deffn tex-src/texinfo.tex /^\\def\\deffn{\\defmethparsebody\\Edeffn\\deffnx\\deffnhe/
+\deffnheader tex-src/texinfo.tex /^\\def\\deffnheader #1#2#3{\\doind {fn}{\\code{#2}}%$/
+\deffnx tex-src/texinfo.tex /^\\def\\deffnx #1 {\\errmessage{@deffnx in invalid con/
+\defindex tex-src/texinfo.tex /^\\def\\defindex{\\parsearg\\newindex}$/
+\defivar tex-src/texinfo.tex /^\\def\\defivar{\\defvrparsebody\\Edefivar\\defivarx\\def/
+\defivarheader tex-src/texinfo.tex /^\\def\\defivarheader #1#2#3{%$/
+\defivarx tex-src/texinfo.tex /^\\def\\defivarx #1 {\\errmessage{@defivarx in invalid/
+\defmac tex-src/texinfo.tex /^\\def\\defmac{\\defparsebody\\Edefmac\\defmacx\\defmache/
+\defmacheader tex-src/texinfo.tex /^\\def\\defmacheader #1#2{\\doind {fn}{\\code{#1}}% Mak/
+\defmacx tex-src/texinfo.tex /^\\def\\defmacx #1 {\\errmessage{@defmacx in invalid c/
+\defmethod tex-src/texinfo.tex /^\\def\\defmethod{\\defmethparsebody\\Edefmethod\\defmet/
+\defmethodheader tex-src/texinfo.tex /^\\def\\defmethodheader #1#2#3{%$/
+\defmethodx tex-src/texinfo.tex /^\\def\\defmethodx #1 {\\errmessage{@defmethodx in inv/
+\defmethparsebody tex-src/texinfo.tex /^\\def\\defmethparsebody #1#2#3#4 {\\begingroup\\inENV /
+\defname tex-src/texinfo.tex /^\\def\\defname #1#2{%$/
+\defop tex-src/texinfo.tex /^\\def\\defop #1 {\\def\\defoptype{#1}%$/
+\defopheader tex-src/texinfo.tex /^\\def\\defopheader #1#2#3{%$/
+\defopparsebody tex-src/texinfo.tex /^\\def\\defopparsebody #1#2#3#4#5 {\\begingroup\\inENV /
+\defopt tex-src/texinfo.tex /^\\def\\defopt{\\defvarparsebody\\Edefopt\\defoptx\\defop/
+\defoptheader tex-src/texinfo.tex /^\\def\\defoptheader #1#2{\\doind {vr}{\\code{#1}}% Mak/
+\defoptx tex-src/texinfo.tex /^\\def\\defoptx #1 {\\errmessage{@defoptx in invalid c/
+\defopvarparsebody tex-src/texinfo.tex /^\\def\\defopvarparsebody #1#2#3#4#5 {\\begingroup\\inE/
+\defopx tex-src/texinfo.tex /^\\def\\defopx #1 {\\errmessage{@defopx in invalid con/
+\defparsebody tex-src/texinfo.tex /^\\def\\defparsebody #1#2#3{\\begingroup\\inENV% Enviro/
+\defspec tex-src/texinfo.tex /^\\def\\defspec{\\defparsebody\\Edefspec\\defspecx\\defsp/
+\defspecheader tex-src/texinfo.tex /^\\def\\defspecheader #1#2{\\doind {fn}{\\code{#1}}% Ma/
+\defspecx tex-src/texinfo.tex /^\\def\\defspecx #1 {\\errmessage{@defspecx in invalid/
+\deftp tex-src/texinfo.tex /^\\def\\deftp{\\defvrparsebody\\Edeftp\\deftpx\\deftphead/
+\deftpargs tex-src/texinfo.tex /^\\def\\deftpargs #1{\\bf \\defvarargs{#1}}$/
+\deftpheader tex-src/texinfo.tex /^\\def\\deftpheader #1#2#3{\\doind {tp}{\\code{#2}}%$/
+\deftpx tex-src/texinfo.tex /^\\def\\deftpx #1 {\\errmessage{@deftpx in invalid con/
+\deftypefn tex-src/texinfo.tex /^\\def\\deftypefn{\\defmethparsebody\\Edeftypefn\\deftyp/
+\deftypefnheader tex-src/texinfo.tex /^\\def\\deftypefnheader #1#2#3{\\deftypefnheaderx{#1}{/
+\deftypefnheaderx tex-src/texinfo.tex /^\\def\\deftypefnheaderx #1#2#3 #4\\relax{%$/
+\deftypefnx tex-src/texinfo.tex /^\\def\\deftypefnx #1 {\\errmessage{@deftypefnx in inv/
+\deftypefun tex-src/texinfo.tex /^\\def\\deftypefun{\\defparsebody\\Edeftypefun\\deftypef/
+\deftypefunargs tex-src/texinfo.tex /^\\def\\deftypefunargs #1{%$/
+\deftypefunheader tex-src/texinfo.tex /^\\def\\deftypefunheader #1#2{\\deftypefunheaderx{#1}#/
+\deftypefunheaderx tex-src/texinfo.tex /^\\def\\deftypefunheaderx #1#2 #3\\relax{%$/
+\deftypeunx tex-src/texinfo.tex /^\\def\\deftypeunx #1 {\\errmessage{@deftypeunx in inv/
+\deftypevar tex-src/texinfo.tex /^\\def\\deftypevar{\\defvarparsebody\\Edeftypevar\\defty/
+\deftypevarheader tex-src/texinfo.tex /^\\def\\deftypevarheader #1#2{%$/
+\deftypevarx tex-src/texinfo.tex /^\\def\\deftypevarx #1 {\\errmessage{@deftypevarx in i/
+\deftypevr tex-src/texinfo.tex /^\\def\\deftypevr{\\defvrparsebody\\Edeftypevr\\deftypev/
+\deftypevrheader tex-src/texinfo.tex /^\\def\\deftypevrheader #1#2#3{\\doind {vr}{\\code{#3}}/
+\deftypevrx tex-src/texinfo.tex /^\\def\\deftypevrx #1 {\\errmessage{@deftypevrx in inv/
+\defun tex-src/texinfo.tex /^\\def\\defun{\\defparsebody\\Edefun\\defunx\\defunheader/
+\defunargs tex-src/texinfo.tex /^\\def\\defunargs #1{\\functionparens \\sl$/
+\defunheader tex-src/texinfo.tex /^\\def\\defunheader #1#2{\\doind {fn}{\\code{#1}}% Make/
+\defunx tex-src/texinfo.tex /^\\def\\defunx #1 {\\errmessage{@defunx in invalid con/
+\defvar tex-src/texinfo.tex /^\\def\\defvar{\\defvarparsebody\\Edefvar\\defvarx\\defva/
+\defvarargs tex-src/texinfo.tex /^\\def\\defvarargs #1{\\normalparens #1%$/
+\defvarheader tex-src/texinfo.tex /^\\def\\defvarheader #1#2{\\doind {vr}{\\code{#1}}% Mak/
+\defvarparsebody tex-src/texinfo.tex /^\\def\\defvarparsebody #1#2#3{\\begingroup\\inENV% Env/
+\defvarx tex-src/texinfo.tex /^\\def\\defvarx #1 {\\errmessage{@defvarx in invalid c/
+\defvr tex-src/texinfo.tex /^\\def\\defvr{\\defvrparsebody\\Edefvr\\defvrx\\defvrhead/
+\defvrheader tex-src/texinfo.tex /^\\def\\defvrheader #1#2#3{\\doind {vr}{\\code{#2}}%$/
+\defvrparsebody tex-src/texinfo.tex /^\\def\\defvrparsebody #1#2#3#4 {\\begingroup\\inENV %$/
+\defvrx tex-src/texinfo.tex /^\\def\\defvrx #1 {\\errmessage{@defvrx in invalid con/
+\description tex-src/texinfo.tex /^\\def\\description{\\tablez{\\dontindex}{1}{}{}{}{}}$/
+\df tex-src/texinfo.tex /^\\def\\df{\\let\\tentt=\\deftt \\let\\tenbf = \\defbf \\bf}/
+\dfn tex-src/texinfo.tex /^\\def\\dfn##1{\\realbackslash dfn {##1}}$/
+\direntry tex-src/texinfo.tex /^\\def\\direntry{\\begingroup\\direntryxxx}$/
+\direntryxxx tex-src/texinfo.tex /^\\long\\def\\direntryxxx #1\\end direntry{\\endgroup\\ig/
+\display tex-src/texinfo.tex /^\\def\\display{\\begingroup\\inENV %This group ends at/
+\dmn tex-src/texinfo.tex /^\\def\\dmn#1{\\thinspace #1}$/
+\dobreak tex-src/texinfo.tex /^\\def\\dobreak#1#2{\\par\\ifdim\\lastskip<#1\\removelast/
+\dochapentry tex-src/texinfo.tex /^\\def\\dochapentry#1#2{%$/
+\docodeindex tex-src/texinfo.tex /^\\def\\docodeindex#1{\\edef\\indexname{#1}\\parsearg\\si/
+\doind tex-src/texinfo.tex /^\\def\\doind #1#2{%$/
+\doindex tex-src/texinfo.tex /^\\def\\doindex#1{\\edef\\indexname{#1}\\parsearg\\single/
+\donoderef tex-src/texinfo.tex /^\\def\\donoderef{\\ifx\\lastnode\\relax\\else$/
+\dontindex tex-src/texinfo.tex /^\\def\\dontindex #1{}$/
+\dopageno tex-src/texinfo.tex /^\\def\\dopageno#1{{\\rm #1}}$/
+\doprintindex tex-src/texinfo.tex /^\\def\\doprintindex#1{%$/
+\dosecentry tex-src/texinfo.tex /^\\def\\dosecentry#1#2{%$/
+\dosetq tex-src/texinfo.tex /^\\def\\dosetq #1#2{{\\let\\folio=0 \\turnoffactive%$/
+\doshortpageno tex-src/texinfo.tex /^\\def\\doshortpageno#1{{\\rm #1}}$/
+\dosubind tex-src/texinfo.tex /^\\def\\dosubind #1#2#3{%$/
+\dosubsecentry tex-src/texinfo.tex /^\\def\\dosubsecentry#1#2{%$/
+\dosubsubsecentry tex-src/texinfo.tex /^\\def\\dosubsubsecentry#1#2{%$/
+\dots tex-src/texinfo.tex /^\\def\\dots{$\\ldots$}$/
+\dots tex-src/texinfo.tex /^\\def\\dots{\\realbackslash dots }%$/
+\dots tex-src/texinfo.tex /^\\def\\dots{\\realbackslash dots}$/
+\doublecolumnout tex-src/texinfo.tex /^\\def\\doublecolumnout{\\splittopskip=\\topskip \\split/
+\emph tex-src/texinfo.tex /^\\def\\emph##1{\\realbackslash emph {##1}}$/
+\end tex-src/texinfo.tex /^\\def\\end{\\parsearg\\endxxx}$/
+\enddoublecolumns tex-src/texinfo.tex /^\\def\\enddoublecolumns{\\output={\\balancecolumns}\\ej/
+\endxxx tex-src/texinfo.tex /^\\def\\endxxx #1{%$/
+\entry tex-src/texinfo.tex /^\\def\\entry #1#2{\\begingroup$/
+\enumerate tex-src/texinfo.tex /^\\def\\enumerate{\\parsearg\\enumeratezzz}$/
+\enumeratey tex-src/texinfo.tex /^\\def\\enumeratey #1 #2\\endenumeratey{%$/
+\enumeratezzz tex-src/texinfo.tex /^\\def\\enumeratezzz #1{\\enumeratey #1 \\endenumerate/
+\equiv tex-src/texinfo.tex /^\\def\\equiv{\\realbackslash equiv}$/
+\equiv tex-src/texinfo.tex /^\\def\\equiv{\\leavevmode\\lower.1ex\\hbox to 1em{\\hfil/
+\error tex-src/texinfo.tex /^\\def\\error{\\leavevmode\\lower.7ex\\copy\\errorbox}$/
+\errorE tex-src/texinfo.tex /^\\def\\errorE#1{$/
+\evenfooting tex-src/texinfo.tex /^\\def\\evenfooting{\\parsearg\\evenfootingxxx}$/
+\evenheading tex-src/texinfo.tex /^\\def\\evenheading{\\parsearg\\evenheadingxxx}$/
+\everyfooting tex-src/texinfo.tex /^\\def\\everyfooting{\\parsearg\\everyfootingxxx}$/
+\everyheading tex-src/texinfo.tex /^\\def\\everyheading{\\parsearg\\everyheadingxxx}$/
+\ewbot tex-src/texinfo.tex /^\\def\\ewbot{\\vrule height0pt depth\\cornerthick widt/
+\ewtop tex-src/texinfo.tex /^\\def\\ewtop{\\vrule height\\cornerthick depth0pt widt/
+\exdent tex-src/texinfo.tex /^\\def\\exdent{\\parsearg\\exdentyyy}$/
+\exdentyyy tex-src/texinfo.tex /^\\def\\exdentyyy #1{{\\hfil\\break\\hbox{\\kern -\\exdent/
+\expansion tex-src/texinfo.tex /^\\def\\expansion{\\realbackslash expansion}$/
+\expansion tex-src/texinfo.tex /^\\def\\expansion{\\leavevmode\\raise.1ex\\hbox to 1em{\\/
+\file tex-src/texinfo.tex /^\\def\\file##1{\\realbackslash file {##1}}%$/
+\file tex-src/texinfo.tex /^\\def\\file##1{\\realbackslash file {##1}}$/
+\finalout tex-src/texinfo.tex /^\\def\\finalout{\\overfullrule=0pt}$/
+\findex tex-src/texinfo.tex /^\\def\\findex {\\fnindex}$/
+\finishtitlepage tex-src/texinfo.tex /^\\def\\finishtitlepage{%$/
+\flushcr tex-src/texinfo.tex /^\\def\\flushcr{\\ifx\\par\\lisppar \\def\\next##1{}\\else /
+\flushleft tex-src/texinfo.tex /^\\def\\flushleft{%$/
+\flushright tex-src/texinfo.tex /^\\def\\flushright{%$/
+\fnitemindex tex-src/texinfo.tex /^\\def\\fnitemindex #1{\\doind {fn}{\\code{#1}}}%$/
+\format tex-src/texinfo.tex /^\\def\\format{\\begingroup\\inENV %This group ends at /
+\frenchspacing tex-src/texinfo.tex /^\\def\\frenchspacing{\\sfcode46=1000 \\sfcode63=1000 \\/
+\ftable tex-src/texinfo.tex /^\\def\\ftable{\\begingroup\\inENV\\obeylines\\obeyspaces/
+\gloggingall tex-src/texinfo.tex /^\\def\\gloggingall{\\begingroup \\globaldefs = 1 \\logg/
+\group tex-src/texinfo.tex /^\\def\\group{\\begingroup$/
+\gtr tex-src/texinfo.tex /^\\def\\gtr{\\realbackslash gtr}%$/
+\gtr tex-src/texinfo.tex /^\\def\\gtr{\\realbackslash gtr}$/
+\hat tex-src/texinfo.tex /^\\def\\hat{\\realbackslash hat}%$/
+\hat tex-src/texinfo.tex /^\\def\\hat{\\realbackslash hat}$/
+\heading tex-src/texinfo.tex /^\\def\\heading{\\parsearg\\secheadingi}$/
+\headings tex-src/texinfo.tex /^\\def\\headings #1 {\\csname HEADINGS#1\\endcsname}$/
+\i tex-src/texinfo.tex /^\\def\\i##1{\\realbackslash i {##1}}%$/
+\i tex-src/texinfo.tex /^\\def\\i##1{\\realbackslash i {##1}}$/
+\ifclear tex-src/texinfo.tex /^\\def\\ifclear{\\begingroup\\ignoresections\\parsearg\\i/
+\ifclearfail tex-src/texinfo.tex /^\\def\\ifclearfail{\\begingroup\\ignoresections\\ifclea/
+\ifclearfailxxx tex-src/texinfo.tex /^\\long\\def\\ifclearfailxxx #1\\end ifclear{\\endgroup\\/
+\ifclearxxx tex-src/texinfo.tex /^\\def\\ifclearxxx #1{\\endgroup$/
+\ifinfo tex-src/texinfo.tex /^\\def\\ifinfo{\\begingroup\\ignoresections\\ifinfoxxx}$/
+\ifinfoxxx tex-src/texinfo.tex /^\\long\\def\\ifinfoxxx #1\\end ifinfo{\\endgroup\\ignore/
+\ifset tex-src/texinfo.tex /^\\def\\ifset{\\begingroup\\ignoresections\\parsearg\\ifs/
+\ifsetfail tex-src/texinfo.tex /^\\def\\ifsetfail{\\begingroup\\ignoresections\\ifsetfai/
+\ifsetfailxxx tex-src/texinfo.tex /^\\long\\def\\ifsetfailxxx #1\\end ifset{\\endgroup\\igno/
+\ifsetxxx tex-src/texinfo.tex /^\\def\\ifsetxxx #1{\\endgroup$/
+\iftex tex-src/texinfo.tex /^\\def\\iftex{}$/
+\ifusingtt tex-src/texinfo.tex /^\\def\\ifusingtt#1#2{\\ifdim \\fontdimen3\\the\\font=0pt/
+\ignore tex-src/texinfo.tex /^\\def\\ignore{\\begingroup\\ignoresections$/
+\ignoresections tex-src/texinfo.tex /^\\def\\ignoresections{%$/
+\ignorexxx tex-src/texinfo.tex /^\\long\\def\\ignorexxx #1\\end ignore{\\endgroup\\ignore/
+\ii tex-src/texinfo.tex /^\\def\\ii#1{{\\it #1}} % italic font$/
+\inENV tex-src/texinfo.tex /^\\newif\\ifENV \\ENVfalse \\def\\inENV{\\ifENV\\relax\\els/
+\include tex-src/texinfo.tex /^\\def\\include{\\parsearg\\includezzz}$/
+\includezzz tex-src/texinfo.tex /^\\def\\includezzz #1{{\\def\\thisfile{#1}\\input #1$/
+\indexbackslash tex-src/texinfo.tex /^ \\def\\indexbackslash{\\rawbackslashxx}$/
+\indexdotfill tex-src/texinfo.tex /^\\def\\indexdotfill{\\cleaders$/
+\indexdummies tex-src/texinfo.tex /^\\def\\indexdummies{%$/
+\indexdummydots tex-src/texinfo.tex /^\\def\\indexdummydots{...}$/
+\indexdummyfont tex-src/texinfo.tex /^\\def\\indexdummyfont#1{#1}$/
+\indexdummytex tex-src/texinfo.tex /^\\def\\indexdummytex{TeX}$/
+\indexfonts tex-src/texinfo.tex /^\\def\\indexfonts{%$/
+\indexnofonts tex-src/texinfo.tex /^\\def\\indexnofonts{%$/
+\infoappendix tex-src/texinfo.tex /^\\def\\infoappendix{\\parsearg\\appendixzzz}$/
+\infoappendixsec tex-src/texinfo.tex /^\\def\\infoappendixsec{\\parsearg\\appendixseczzz}$/
+\infoappendixsubsec tex-src/texinfo.tex /^\\def\\infoappendixsubsec{\\parsearg\\appendixsubseczz/
+\infoappendixsubsubsec tex-src/texinfo.tex /^\\def\\infoappendixsubsubsec{\\parsearg\\appendixsubsu/
+\infochapter tex-src/texinfo.tex /^\\def\\infochapter{\\parsearg\\chapterzzz}$/
+\inforef tex-src/texinfo.tex /^\\def\\inforef #1{\\inforefzzz #1,,,,**}$/
+\inforefzzz tex-src/texinfo.tex /^\\def\\inforefzzz #1,#2,#3,#4**{See Info file \\file{/
+\infosection tex-src/texinfo.tex /^\\def\\infosection{\\parsearg\\sectionzzz}$/
+\infosubsection tex-src/texinfo.tex /^\\def\\infosubsection{\\parsearg\\subsectionzzz}$/
+\infosubsubsection tex-src/texinfo.tex /^\\def\\infosubsubsection{\\parsearg\\subsubsectionzzz}/
+\infotop tex-src/texinfo.tex /^\\def\\infotop{\\parsearg\\unnumberedzzz}$/
+\infounnumbered tex-src/texinfo.tex /^\\def\\infounnumbered{\\parsearg\\unnumberedzzz}$/
+\infounnumberedsec tex-src/texinfo.tex /^\\def\\infounnumberedsec{\\parsearg\\unnumberedseczzz}/
+\infounnumberedsubsec tex-src/texinfo.tex /^\\def\\infounnumberedsubsec{\\parsearg\\unnumberedsubs/
+\infounnumberedsubsubsec tex-src/texinfo.tex /^\\def\\infounnumberedsubsubsec{\\parsearg\\unnumbereds/
+\initial tex-src/texinfo.tex /^\\def\\initial #1{%$/
+\internalBitem tex-src/texinfo.tex /^\\def\\internalBitem{\\smallbreak \\parsearg\\itemzzz}$/
+\internalBitemx tex-src/texinfo.tex /^\\def\\internalBitemx{\\par \\parsearg\\itemzzz}$/
+\internalBkitem tex-src/texinfo.tex /^\\def\\internalBkitem{\\smallbreak \\parsearg\\kitemzzz/
+\internalBkitemx tex-src/texinfo.tex /^\\def\\internalBkitemx{\\par \\parsearg\\kitemzzz}$/
+\internalBxitem tex-src/texinfo.tex /^\\def\\internalBxitem "#1"{\\def\\xitemsubtopix{#1} \\s/
+\internalBxitemx tex-src/texinfo.tex /^\\def\\internalBxitemx "#1"{\\def\\xitemsubtopix{#1} \\/
+\internalsetq tex-src/texinfo.tex /^\\def\\internalsetq #1#2{'xrdef {#1}{\\csname #2\\endc/
+\item tex-src/texinfo.tex /^\\def\\item{\\errmessage{@item while not in a table}}/
+\itemcontents tex-src/texinfo.tex /^\\def\\itemcontents{#1}%$/
+\itemfont tex-src/texinfo.tex /^\\def\\itemfont{#2}%$/
+\itemize tex-src/texinfo.tex /^\\def\\itemize{\\parsearg\\itemizezzz}$/
+\itemizeitem tex-src/texinfo.tex /^\\def\\itemizeitem{%$/
+\itemizey tex-src/texinfo.tex /^\\def\\itemizey #1#2{%$/
+\itemizezzz tex-src/texinfo.tex /^\\def\\itemizezzz #1{%$/
+\itemx tex-src/texinfo.tex /^\\def\\itemx{\\errmessage{@itemx while not in a table/
+\itemzzz tex-src/texinfo.tex /^\\def\\itemzzz #1{\\begingroup %$/
+\kbd tex-src/texinfo.tex /^\\def\\kbd#1{\\def\\look{#1}\\expandafter\\kbdfoo\\look??/
+\kbd tex-src/texinfo.tex /^\\def\\kbd##1{\\realbackslash kbd {##1}}%$/
+\kbd tex-src/texinfo.tex /^\\def\\kbd##1{\\realbackslash kbd {##1}}$/
+\kbdfoo tex-src/texinfo.tex /^\\def\\kbdfoo#1#2#3\\par{\\def\\one{#1}\\def\\three{#3}\\d/
+\key tex-src/texinfo.tex /^\\def\\key #1{{\\tt \\exhyphenpenalty=10000\\uppercase{/
+\key tex-src/texinfo.tex /^\\def\\key##1{\\realbackslash key {##1}}%$/
+\key tex-src/texinfo.tex /^\\def\\key##1{\\realbackslash key {##1}}$/
+\kindex tex-src/texinfo.tex /^\\def\\kindex {\\kyindex}$/
+\kitem tex-src/texinfo.tex /^\\def\\kitem{\\errmessage{@kitem while not in a table/
+\kitemx tex-src/texinfo.tex /^\\def\\kitemx{\\errmessage{@kitemx while not in a tab/
+\kitemzzz tex-src/texinfo.tex /^\\def\\kitemzzz #1{\\dosubind {kw}{\\code{#1}}{for {\\b/
+\l tex-src/texinfo.tex /^\\def\\l#1{{\\li #1}\\null} % $/
+\labelspace tex-src/texinfo.tex /^\\def\\labelspace{\\hskip1em \\relax}$/
+\lbrb tex-src/texinfo.tex /^\\def\\lbrb{{\\bf\\char`\\[}} \\def\\rbrb{{\\bf\\char`\\]}}$/
+\less tex-src/texinfo.tex /^\\def\\less{\\realbackslash less}%$/
+\less tex-src/texinfo.tex /^\\def\\less{\\realbackslash less}$/
+\linenumber tex-src/texinfo.tex /^ \\def\\linenumber{\\the\\inputlineno:\\space}$/
+\lisp tex-src/texinfo.tex /^\\def\\lisp{\\aboveenvbreak$/
+\loggingall tex-src/texinfo.tex /^\\def\\loggingall{\\tracingcommands2 \\tracingstats2 $/
+\losespace tex-src/texinfo.tex /^\\def\\losespace #1{#1}$/
+\lowercaseenumerate tex-src/texinfo.tex /^\\def\\lowercaseenumerate{%$/
+\lvvmode tex-src/texinfo.tex /^\\def\\lvvmode{\\vbox to 0pt{}}$/
+\majorheading tex-src/texinfo.tex /^\\def\\majorheading{\\parsearg\\majorheadingzzz}$/
+\majorheadingzzz tex-src/texinfo.tex /^\\def\\majorheadingzzz #1{%$/
+\math tex-src/texinfo.tex /^\\def\\math#1{\\implicitmath #1\\implicitmath}$/
+\menu tex-src/texinfo.tex /^\\long\\def\\menu #1\\end menu{}$/
+\minus tex-src/texinfo.tex /^\\def\\minus{$-$}$/
+\mylbrace tex-src/texinfo.tex /^\\def\\mylbrace {{\\tt \\char '173}}$/
+\myrbrace tex-src/texinfo.tex /^\\def\\myrbrace {{\\tt \\char '175}}$/
+\need tex-src/texinfo.tex /^\\def\\need{\\parsearg\\needx}$/
+\needx tex-src/texinfo.tex /^\\def\\needx#1{%$/
+\newcodeindex tex-src/texinfo.tex /^\\def\\newcodeindex #1{$/
+\newindex tex-src/texinfo.tex /^\\def\\newindex #1{$/
+\next tex-src/texinfo.tex /^\\def\\next##1{}\\next}$/
+\next tex-src/texinfo.tex /^\\def\\next##1{}\\next}$/
+\next tex-src/texinfo.tex /^\\def\\next##1{}\\next}$/
+\next tex-src/texinfo.tex /^\\def\\next##1{}\\next}$/
+\next tex-src/texinfo.tex /^\\def\\next##1{}\\next}$/
+\next tex-src/texinfo.tex /^\\def\\next##1{}\\next}$/
+\nm tex-src/testenv.tex /^\\newcommand{\\nm}[2]{\\nomenclature{#1}{#2}}$/
+\node tex-src/texinfo.tex /^\\def\\node{\\ENVcheck\\parsearg\\nodezzz}$/
+\nodexxx[ tex-src/texinfo.tex /^\\def\\nodexxx[#1,#2]{\\gdef\\lastnode{#1}}$/
+\nodezzz tex-src/texinfo.tex /^\\def\\nodezzz#1{\\nodexxx [#1,]}$/
+\nofillexdent tex-src/texinfo.tex /^\\def\\nofillexdent{\\parsearg\\nofillexdentyyy}$/
+\nofillexdentyyy tex-src/texinfo.tex /^\\def\\nofillexdentyyy #1{{\\advance \\leftskip by -\\e/
+\normalbackslash tex-src/texinfo.tex /^\\def\\normalbackslash{{\\tt\\rawbackslashxx}}$/
+\normalcaret tex-src/texinfo.tex /^\\def\\normalcaret{^}$/
+\normaldoublequote tex-src/texinfo.tex /^\\def\\normaldoublequote{"}$/
+\normalgreater tex-src/texinfo.tex /^\\def\\normalgreater{>}$/
+\normalless tex-src/texinfo.tex /^\\def\\normalless{<}$/
+\normalplus tex-src/texinfo.tex /^\\def\\normalplus{+}$/
+\normaltilde tex-src/texinfo.tex /^\\def\\normaltilde{~}$/
+\normalunderscore tex-src/texinfo.tex /^\\def\\normalunderscore{_}$/
+\normalverticalbar tex-src/texinfo.tex /^\\def\\normalverticalbar{|}$/
+\nsbot tex-src/texinfo.tex /^\\def\\nsbot{\\vbox$/
+\nstop tex-src/texinfo.tex /^\\def\\nstop{\\vbox$/
+\numberedsec tex-src/texinfo.tex /^\\outer\\def\\numberedsec{\\parsearg\\seczzz}$/
+\numberedsubsec tex-src/texinfo.tex /^\\outer\\def\\numberedsubsec{\\parsearg\\numberedsubsec/
+\numberedsubseczzz tex-src/texinfo.tex /^\\def\\numberedsubseczzz #1{\\seccheck{subsection}%$/
+\numberedsubsubsec tex-src/texinfo.tex /^\\outer\\def\\numberedsubsubsec{\\parsearg\\numberedsub/
+\numberedsubsubseczzz tex-src/texinfo.tex /^\\def\\numberedsubsubseczzz #1{\\seccheck{subsubsecti/
+\numericenumerate tex-src/texinfo.tex /^\\def\\numericenumerate{%$/
+\oddfooting tex-src/texinfo.tex /^\\def\\oddfooting{\\parsearg\\oddfootingxxx}$/
+\oddheading tex-src/texinfo.tex /^\\def\\oddheading{\\parsearg\\oddheadingxxx}$/
+\onepageout tex-src/texinfo.tex /^\\def\\onepageout#1{\\hoffset=\\normaloffset$/
+\opencontents tex-src/texinfo.tex /^\\def\\opencontents{\\openout \\contentsfile = \\jobnam/
+\openindices tex-src/texinfo.tex /^\\def\\openindices{%$/
+\opnr tex-src/texinfo.tex /^\\def\\opnr{{\\sf\\char`\\(}} \\def\\clnr{{\\sf\\char`\\)}} /
+\page tex-src/texinfo.tex /^\\def\\page{\\par\\vfill\\supereject}$/
+\page tex-src/texinfo.tex /^ \\def\\page{%$/
+\pagebody tex-src/texinfo.tex /^\\def\\pagebody#1{\\vbox to\\pageheight{\\boxmaxdepth=\\/
+\pagesofar tex-src/texinfo.tex /^\\def\\pagesofar{\\unvbox\\partialpage %$/
+\parsearg tex-src/texinfo.tex /^\\def\\parsearg #1{\\let\\next=#1\\begingroup\\obeylines/
+\parseargline tex-src/texinfo.tex /^\\def\\parseargline{\\begingroup \\obeylines \\parsearg/
+\parseargx tex-src/texinfo.tex /^\\def\\parseargx{%$/
+\pindex tex-src/texinfo.tex /^\\def\\pindex {\\pgindex}$/
+\plainsecheading tex-src/texinfo.tex /^\\def\\plainsecheading #1{\\secheadingi {#1}}$/
+\point tex-src/texinfo.tex /^\\def\\point{$\\star$}$/
+\primary tex-src/texinfo.tex /^\\def\\primary #1{\\line{#1\\hfil}}$/
+\print tex-src/texinfo.tex /^\\def\\print{\\realbackslash print}$/
+\print tex-src/texinfo.tex /^\\def\\print{\\leavevmode\\lower.1ex\\hbox to 1em{\\hfil/
+\printedmanual tex-src/texinfo.tex /^\\def\\printedmanual{\\ignorespaces #5}%$/
+\printedmanual tex-src/texinfo.tex /^section ``\\printednodename'' in \\cite{\\printedmanu/
+\printednodename tex-src/texinfo.tex /^\\def\\printednodename{\\ignorespaces #3}%$/
+\printednodename tex-src/texinfo.tex /^\\def\\printednodename{\\ignorespaces #1}%$/
+\printindex tex-src/texinfo.tex /^\\def\\printindex{\\parsearg\\doprintindex}$/
+\pxref tex-src/texinfo.tex /^\\def\\pxref#1{see \\xrefX[#1,,,,,,,]}$/
+\quotation tex-src/texinfo.tex /^\\def\\quotation{%$/
+\r tex-src/texinfo.tex /^\\def\\r#1{{\\rm #1}} % roman font$/
+\r tex-src/texinfo.tex /^\\def\\r##1{\\realbackslash r {##1}}%$/
+\r tex-src/texinfo.tex /^\\def\\r##1{\\realbackslash r {##1}}$/
+\rawbackslashxx tex-src/texinfo.tex /^\\def\\rawbackslashxx{\\indexbackslash}% \\indexbacksl/
+\rawbackslashxx tex-src/texinfo.tex /^\\def\\rawbackslashxx{\\indexbackslash}%$/
+\readauxfile tex-src/texinfo.tex /^\\def\\readauxfile{%$/
+\ref tex-src/texinfo.tex /^\\def\\ref#1{\\xrefX[#1,,,,,,,]}$/
+\refx tex-src/texinfo.tex /^\\def\\refx#1#2{%$/
+\resetmathfonts tex-src/texinfo.tex /^\\def\\resetmathfonts{%$/
+\result tex-src/texinfo.tex /^\\def\\result{\\realbackslash result}$/
+\result tex-src/texinfo.tex /^\\def\\result{\\leavevmode\\raise.15ex\\hbox to 1em{\\hf/
+\rm tex-src/texinfo.tex /^\\def\\rm{\\realbackslash rm }%$/
+\samp tex-src/texinfo.tex /^\\def\\samp #1{`\\tclose{#1}'\\null}$/
+\samp tex-src/texinfo.tex /^\\def\\samp##1{\\realbackslash samp {##1}}%$/
+\samp tex-src/texinfo.tex /^\\def\\samp##1{\\realbackslash samp {##1}}$/
+\sc tex-src/texinfo.tex /^\\def\\sc#1{{\\smallcaps#1}} % smallcaps font$/
+\seccheck tex-src/texinfo.tex /^\\def\\seccheck#1{\\if \\pageno<0 %$/
+\secentry tex-src/texinfo.tex /^ \\def\\secentry ##1##2##3##4{}$/
+\secentry tex-src/texinfo.tex /^\\def\\secentry#1#2#3#4{\\dosecentry{#2.#3\\labelspace/
+\secentryfonts tex-src/texinfo.tex /^\\def\\secentryfonts{\\textfonts}$/
+\secfonts tex-src/texinfo.tex /^\\def\\secfonts{%$/
+\secheading tex-src/texinfo.tex /^\\def\\secheading #1#2#3{\\secheadingi {#2.#3\\enspace/
+\secheadingbreak tex-src/texinfo.tex /^\\def\\secheadingbreak{\\dobreak \\secheadingskip {-10/
+\secheadingi tex-src/texinfo.tex /^\\def\\secheadingi #1{{\\advance \\secheadingskip by \\/
+\secondary tex-src/texinfo.tex /^\\def\\secondary #1#2{$/
+\seczzz tex-src/texinfo.tex /^\\def\\seczzz #1{\\seccheck{section}%$/
+\set tex-src/texinfo.tex /^\\def\\set{\\parsearg\\setxxx}$/
+\setchapternewpage tex-src/texinfo.tex /^\\def\\setchapternewpage #1 {\\csname CHAPPAG#1\\endcs/
+\setchapterstyle tex-src/texinfo.tex /^\\def\\setchapterstyle #1 {\\csname CHAPF#1\\endcsname/
+\setdeffont tex-src/texinfo.tex /^\\def\\setdeffont #1 {\\csname DEF#1\\endcsname}$/
+\setfilename tex-src/texinfo.tex /^\\def\\setfilename{%$/
+\setref tex-src/texinfo.tex /^\\def\\setref#1{%$/
+\settitle tex-src/texinfo.tex /^\\def\\settitle{\\parsearg\\settitlezzz}$/
+\settitlezzz tex-src/texinfo.tex /^\\def\\settitlezzz #1{\\gdef\\thistitle{#1}}$/
+\setxxx tex-src/texinfo.tex /^\\def\\setxxx #1{$/
+\sf tex-src/texinfo.tex /^\\def\\sf{\\fam=\\sffam \\tensf}$/
+\sf tex-src/texinfo.tex /^\\def\\sf{\\realbackslash sf}%$/
+\shortchapentry tex-src/texinfo.tex /^\\def\\shortchapentry#1#2#3{%$/
+\shortunnumberedentry tex-src/texinfo.tex /^\\def\\shortunnumberedentry#1#2{%$/
+\singlecodeindexer tex-src/texinfo.tex /^\\def\\singlecodeindexer #1{\\doind{\\indexname}{\\code/
+\singleindexer tex-src/texinfo.tex /^\\def\\singleindexer #1{\\doind{\\indexname}{#1}}$/
+\singlespace tex-src/texinfo.tex /^\\def\\singlespace{%$/
+\sl tex-src/texinfo.tex /^\\def\\sl{\\realbackslash sl }%$/
+\smallbook tex-src/texinfo.tex /^\\def\\smallbook{$/
+\smalllispx tex-src/texinfo.tex /^\\def\\smalllispx{\\aboveenvbreak\\begingroup\\inENV$/
+\smartitalic tex-src/texinfo.tex /^\\def\\smartitalic#1{{\\sl #1}\\futurelet\\next\\smartit/
+\smartitalicx tex-src/texinfo.tex /^\\def\\smartitalicx{\\ifx\\next,\\else\\ifx\\next-\\else\\i/
+\sp tex-src/texinfo.tex /^\\def\\sp{\\parsearg\\spxxx}$/
+\splitoff tex-src/texinfo.tex /^\\def\\splitoff#1#2\\endmark{\\def\\first{#1}\\def\\rest{/
+\spxxx tex-src/texinfo.tex /^\\def\\spxxx #1{\\par \\vskip #1\\baselineskip}$/
+\startcontents tex-src/texinfo.tex /^\\def\\startcontents#1{%$/
+\startenumeration tex-src/texinfo.tex /^\\def\\startenumeration#1{%$/
+\subheading tex-src/texinfo.tex /^\\def\\subheading{\\parsearg\\subsecheadingi}$/
+\subsecentry tex-src/texinfo.tex /^ \\def\\subsecentry ##1##2##3##4##5{}$/
+\subsecentry tex-src/texinfo.tex /^\\def\\subsecentry#1#2#3#4#5{\\dosubsecentry{#2.#3.#4/
+\subsecfonts tex-src/texinfo.tex /^\\def\\subsecfonts{%$/
+\subsecheading tex-src/texinfo.tex /^\\def\\subsecheading #1#2#3#4{\\subsecheadingi {#2.#3/
+\subsecheadingbreak tex-src/texinfo.tex /^\\def\\subsecheadingbreak{\\dobreak \\subsecheadingski/
+\subsecheadingi tex-src/texinfo.tex /^\\def\\subsecheadingi #1{{\\advance \\subsecheadingski/
+\subsubheading tex-src/texinfo.tex /^\\def\\subsubheading{\\parsearg\\subsubsecheadingi}$/
+\subsubsecentry tex-src/texinfo.tex /^ \\def\\subsubsecentry ##1##2##3##4##5##6{}$/
+\subsubsecentry tex-src/texinfo.tex /^\\def\\subsubsecentry#1#2#3#4#5#6{%$/
+\subsubsecfonts tex-src/texinfo.tex /^\\def\\subsubsecfonts{\\subsecfonts} % Maybe this sho/
+\subsubsecheading tex-src/texinfo.tex /^\\def\\subsubsecheading #1#2#3#4#5{\\subsubsecheading/
+\subsubsecheadingi tex-src/texinfo.tex /^\\def\\subsubsecheadingi #1{{\\advance \\subsecheading/
+\subtitle tex-src/texinfo.tex /^ \\def\\subtitle{\\parsearg\\subtitlezzz}%$/
+\subtitlefont tex-src/texinfo.tex /^ \\def\\subtitlefont{\\subtitlerm \\normalbaselinesk/
+\subtitlezzz tex-src/texinfo.tex /^ \\def\\subtitlezzz##1{{\\subtitlefont \\rightline{#/
+\summarycontents tex-src/texinfo.tex /^\\outer\\def\\summarycontents{%$/
+\supereject tex-src/texinfo.tex /^\\def\\supereject{\\par\\penalty -20000\\footnoteno =0 /
+\syncodeindex tex-src/texinfo.tex /^\\def\\syncodeindex #1 #2 {%$/
+\synindex tex-src/texinfo.tex /^\\def\\synindex #1 #2 {%$/
+\t tex-src/texinfo.tex /^\\def\\t#1{{\\tt \\exhyphenpenalty=10000\\rawbackslash /
+\t tex-src/texinfo.tex /^\\def\\t##1{\\realbackslash r {##1}}%$/
+\table tex-src/texinfo.tex /^\\def\\table{\\begingroup\\inENV\\obeylines\\obeyspaces\\/
+\tablez tex-src/texinfo.tex /^\\def\\tablez #1#2#3#4#5#6{%$/
+\tclose tex-src/texinfo.tex /^\\def\\tclose#1{{\\rm \\tcloserm=\\fontdimen2\\font \\tt /
+\tclose tex-src/texinfo.tex /^\\def\\tclose##1{\\realbackslash tclose {##1}}%$/
+\tclose tex-src/texinfo.tex /^\\def\\tclose##1{\\realbackslash tclose {##1}}$/
+\tex tex-src/texinfo.tex /^\\def\\tex{\\begingroup$/
+\texinfoversion tex-src/texinfo.tex /^\\def\\texinfoversion{2.73}$/
+\textfonts tex-src/texinfo.tex /^\\def\\textfonts{%$/
+\thearg tex-src/texinfo.tex /^ \\def\\thearg{#1}%$/
+\thearg tex-src/texinfo.tex /^ \\ifx\\thearg\\empty \\def\\thearg{1}\\fi$/
+\thischapter tex-src/texinfo.tex /^\\def\\thischapter{} \\def\\thissection{}$/
+\thischapter tex-src/texinfo.tex /^ \\unnumbchapmacro{#1}\\def\\thischapter{}%$/
+\thischaptername tex-src/texinfo.tex /^\\def\\thischaptername{No Chapter Title}$/
+\thisfile tex-src/texinfo.tex /^\\def\\thisfile{}$/
+\thistitle tex-src/texinfo.tex /^\\def\\thistitle{No Title}$/
+\tie tex-src/texinfo.tex /^\\def\\tie{\\penalty 10000\\ } % Save plain tex de/
+\tindex tex-src/texinfo.tex /^\\def\\tindex {\\tpindex}$/
+\title tex-src/texinfo.tex /^ \\def\\title{\\parsearg\\titlezzz}%$/
+\titlefont tex-src/texinfo.tex /^\\def\\titlefont#1{{\\titlerm #1}}$/
+\titlepage tex-src/texinfo.tex /^\\def\\titlepage{\\begingroup \\parindent=0pt \\textfon/
+\titlezzz tex-src/texinfo.tex /^ \\def\\titlezzz##1{\\leftline{\\titlefont{##1}}$/
+\today tex-src/texinfo.tex /^\\def\\today{\\number\\day\\space$/
+\top tex-src/texinfo.tex /^\\outer\\def\\top{\\parsearg\\unnumberedzzz}$/
+\tt tex-src/texinfo.tex /^\\def\\tt{\\realbackslash tt}%$/
+\tt tex-src/texinfo.tex /^\\def\\tt{\\realbackslash tt}$/
+\turnoffactive tex-src/texinfo.tex /^\\def\\turnoffactive{\\let"=\\normaldoublequote$/
+\unnchfopen tex-src/texinfo.tex /^\\def\\unnchfopen #1{%$/
+\unnchfplain tex-src/texinfo.tex /^\\def\\unnchfplain #1{%$/
+\unnumbchapentry tex-src/texinfo.tex /^\\def\\unnumbchapentry#1#2{\\dochapentry{#1}{#2}}$/
+\unnumbered tex-src/texinfo.tex /^\\outer\\def\\unnumbered{\\parsearg\\unnumberedzzz}$/
+\unnumberedsec tex-src/texinfo.tex /^\\outer\\def\\unnumberedsec{\\parsearg\\unnumberedseczz/
+\unnumberedseczzz tex-src/texinfo.tex /^\\def\\unnumberedseczzz #1{\\seccheck{unnumberedsec}%/
+\unnumberedsubsec tex-src/texinfo.tex /^\\outer\\def\\unnumberedsubsec{\\parsearg\\unnumberedsu/
+\unnumberedsubseczzz tex-src/texinfo.tex /^\\def\\unnumberedsubseczzz #1{\\seccheck{unnumberedsu/
+\unnumberedsubsubsec tex-src/texinfo.tex /^\\outer\\def\\unnumberedsubsubsec{\\parsearg\\unnumbere/
+\unnumberedsubsubseczzz tex-src/texinfo.tex /^\\def\\unnumberedsubsubseczzz #1{\\seccheck{unnumbere/
+\unnumberedzzz tex-src/texinfo.tex /^\\def\\unnumberedzzz #1{\\seccheck{unnumbered}%$/
+\unnumbnoderef tex-src/texinfo.tex /^\\def\\unnumbnoderef{\\ifx\\lastnode\\relax\\else$/
+\unnumbsecentry tex-src/texinfo.tex /^ \\def\\unnumbsecentry ##1##2{}$/
+\unnumbsecentry tex-src/texinfo.tex /^\\def\\unnumbsecentry#1#2{\\dosecentry{#1}{#2}}$/
+\unnumbsetref tex-src/texinfo.tex /^\\def\\unnumbsetref#1{%$/
+\unnumbsubsecentry tex-src/texinfo.tex /^ \\def\\unnumbsubsecentry ##1##2{}$/
+\unnumbsubsecentry tex-src/texinfo.tex /^\\def\\unnumbsubsecentry#1#2{\\dosubsecentry{#1}{#2}}/
+\unnumbsubsubsecentry tex-src/texinfo.tex /^ \\def\\unnumbsubsubsecentry ##1##2{}$/
+\unnumbsubsubsecentry tex-src/texinfo.tex /^\\def\\unnumbsubsubsecentry#1#2{\\dosubsubsecentry{#1/
+\uppercaseenumerate tex-src/texinfo.tex /^\\def\\uppercaseenumerate{%$/
+\var tex-src/texinfo.tex /^\\def\\var##1{\\realbackslash var {##1}}%$/
+\var tex-src/texinfo.tex /^\\def\\var##1{\\realbackslash var {##1}}$/
+\vindex tex-src/texinfo.tex /^\\def\\vindex {\\vrindex}$/
+\vritemindex tex-src/texinfo.tex /^\\def\\vritemindex #1{\\doind {vr}{\\code{#1}}}%$/
+\vtable tex-src/texinfo.tex /^\\def\\vtable{\\begingroup\\inENV\\obeylines\\obeyspaces/
+\w tex-src/texinfo.tex /^\\def\\w#1{\\leavevmode\\hbox{#1}}$/
+\w tex-src/texinfo.tex /^\\def\\w{\\realbackslash w }%$/
+\w tex-src/texinfo.tex /^\\def\\w{\\realbackslash w}$/
+\xitem tex-src/texinfo.tex /^\\def\\xitem{\\errmessage{@xitem while not in a table/
+\xitemx tex-src/texinfo.tex /^\\def\\xitemx{\\errmessage{@xitemx while not in a tab/
+\xitemzzz tex-src/texinfo.tex /^\\def\\xitemzzz #1{\\dosubind {kw}{\\code{#1}}{for {\\b/
+\xkey tex-src/texinfo.tex /^\\def\\xkey{\\key}$/
+\xrdef tex-src/texinfo.tex /^\\def\\xrdef #1#2{$/
+\xref tex-src/texinfo.tex /^\\def\\xref#1{See \\xrefX[#1,,,,,,,]}$/
+\xrefX[ tex-src/texinfo.tex /^\\def\\xrefX[#1,#2,#3,#4,#5,#6]{\\begingroup%$/
+^ tex-src/texinfo.tex /^\\def^{{\\tt \\hat}}$/
+_ tex-src/texinfo.tex /^\\def_{\\ifusingtt\\normalunderscore\\_}$/
+_GETOPT_H c-src/getopt.h 19
+_GNU_SOURCE c-src/etags.c 94
+_REGEX_H c-src/emacs/src/regex.h 21
+_RE_SYNTAX_POSIX_COMMON c-src/emacs/src/regex.h 221
+_Restrict_ c-src/emacs/src/regex.h 540
+_Restrict_ c-src/emacs/src/regex.h 542
+_Restrict_ c-src/emacs/src/regex.h 544
+_Restrict_arr_ c-src/emacs/src/regex.h 555
+_Restrict_arr_ c-src/emacs/src/regex.h 557
+_UCHAR_T c-src/emacs/src/lisp.h 2423
+__COLORS cp-src/screen.hpp 9
+__default_morecore c-src/emacs/src/gmalloc.c /^__default_morecore (ptrdiff_t increment)$/
+__init__ pyt-src/server.py /^ def __init__(self):$/
+__init__ pyt-src/server.py /^ def __init__(self):$/
+__init__ pyt-src/server.py /^ def __init__(self):$/
+__init__ pyt-src/server.py /^ def __init__(self, Master, text, textvar, widt/
+__init__ pyt-src/server.py /^ def __init__(self, newlegend, list, editor, ma/
+__init__ pyt-src/server.py /^ def __init__(self, host, sitelist, master=None/
+__init__ pyt-src/server.py /^ def __init__(self, user, userlist, master=None/
+__init__ pyt-src/server.py /^ def __init__(self, master=None):$/
+__ip c.c 159
+__libc_atexit c-src/exit.c 30
+__libc_atexit c-src/exit.strange_suffix 30
+__malloc_extra_blocks c-src/emacs/src/gmalloc.c 381
+__malloc_initialize c-src/emacs/src/gmalloc.c /^__malloc_initialize (void)$/
+__malloc_initialized c-src/emacs/src/gmalloc.c 379
+__repr__ pyt-src/server.py /^ def __repr__(self):$/
+__repr__ pyt-src/server.py /^ def __repr__(self):$/
+__repr__ pyt-src/server.py /^ def __repr__(self):$/
+__sbrk c-src/emacs/src/gmalloc.c 1513
+__str__ pyt-src/server.py /^ def __str__(self):$/
+__str__ pyt-src/server.py /^ def __str__(self):$/
+__str__ pyt-src/server.py /^ def __str__(self):$/
+__up c.c 160
+_aligned_blocks c-src/emacs/src/gmalloc.c 1004
+_aligned_blocks_mutex c-src/emacs/src/gmalloc.c 518
+_bytes_free c-src/emacs/src/gmalloc.c 376
+_bytes_used c-src/emacs/src/gmalloc.c 374
+_chunks_free c-src/emacs/src/gmalloc.c 375
+_chunks_used c-src/emacs/src/gmalloc.c 373
+_fraghead c-src/emacs/src/gmalloc.c 370
+_free c-src/emacs/src/gmalloc.c /^_free (void *ptr)$/
+_free_internal c-src/emacs/src/gmalloc.c /^_free_internal (void *ptr)$/
+_free_internal_nolock c-src/emacs/src/gmalloc.c /^_free_internal_nolock (void *ptr)$/
+_heapbase c-src/emacs/src/gmalloc.c 355
+_heapindex c-src/emacs/src/gmalloc.c 364
+_heapinfo c-src/emacs/src/gmalloc.c 358
+_heaplimit c-src/emacs/src/gmalloc.c 367
+_malloc c-src/emacs/src/gmalloc.c /^_malloc (size_t size)$/
+_malloc_internal c-src/emacs/src/gmalloc.c /^_malloc_internal (size_t size)$/
+_malloc_internal_nolock c-src/emacs/src/gmalloc.c /^_malloc_internal_nolock (size_t size)$/
+_malloc_mutex c-src/emacs/src/gmalloc.c 517
+_malloc_thread_enabled_p c-src/emacs/src/gmalloc.c 519
+_realloc c-src/emacs/src/gmalloc.c /^_realloc (void *ptr, size_t size)$/
+_realloc_internal c-src/emacs/src/gmalloc.c /^_realloc_internal (void *ptr, size_t size)$/
+_realloc_internal_nolock c-src/emacs/src/gmalloc.c /^_realloc_internal_nolock (void *ptr, size_t size)$/
+a c.c 152
+a c.c 180
+a c.c /^a()$/
+a c.c /^a ()$/
+a c-src/h.h 40
+a c-src/h.h 103
+a-forth-constant! forth-src/test-forth.fth /^99 constant a-forth-constant!$/
+a-forth-value? forth-src/test-forth.fth /^55 value a-forth-value?$/
+a-forth-word forth-src/test-forth.fth /^: a-forth-word ( a b c -- a*b+c ) + * ;$/
+a-forth-word forth-src/test-forth.fth /^: a-forth-word ( a b c -- )$/
+a0 c-src/emacs/src/lisp.h /^ Lisp_Object (*a0) (void);$/
+a1 c-src/emacs/src/lisp.h /^ Lisp_Object (*a1) (Lisp_Object);$/
+a2 c-src/emacs/src/lisp.h /^ Lisp_Object (*a2) (Lisp_Object, Lisp_Object)/
+a3 c-src/emacs/src/lisp.h /^ Lisp_Object (*a3) (Lisp_Object, Lisp_Object,/
+a4 c-src/emacs/src/lisp.h /^ Lisp_Object (*a4) (Lisp_Object, Lisp_Object,/
+a5 c-src/emacs/src/lisp.h /^ Lisp_Object (*a5) (Lisp_Object, Lisp_Object,/
+a6 c-src/emacs/src/lisp.h /^ Lisp_Object (*a6) (Lisp_Object, Lisp_Object,/
+a7 c-src/emacs/src/lisp.h /^ Lisp_Object (*a7) (Lisp_Object, Lisp_Object,/
+a8 c-src/emacs/src/lisp.h /^ Lisp_Object (*a8) (Lisp_Object, Lisp_Object,/
+aMANY c-src/emacs/src/lisp.h /^ Lisp_Object (*aMANY) (ptrdiff_t, Lisp_Object/
+aUNEVALLED c-src/emacs/src/lisp.h /^ Lisp_Object (*aUNEVALLED) (Lisp_Object args)/
+aa c.c 269
+aa c.c 279
+aaa c.c 249
+aaa c.c 269
+aaaaaa c-src/h.h 111
+abbrev-expansion c-src/abbrev.c /^DEFUN ("abbrev-expansion", Fabbrev_expansion, Sabb/
+abbrev-symbol c-src/abbrev.c /^DEFUN ("abbrev-symbol", Fabbrev_symbol, Sabbrev_sy/
+abbrev_all_caps c-src/abbrev.c 57
+abbrevs_changed c-src/abbrev.c 55
+abc c-src/h.h 33
+abc c-src/h.h 37
+abort-recursive-edit c-src/emacs/src/keyboard.c /^DEFUN ("abort-recursive-edit", Fabort_recursive_ed/
+abs/f ada-src/etags-test-for.ada /^ function "abs" (Right : Complex) return Real'/
+absolute_dirname c-src/etags.c /^absolute_dirname (char *file, char *dir)$/
+absolute_filename c-src/etags.c /^absolute_filename (char *file, char *dir)$/
+abt cp-src/c.C 55
+accent_key_syms c-src/emacs/src/keyboard.c 4625
+access_keymap_keyremap c-src/emacs/src/keyboard.c /^access_keymap_keyremap (Lisp_Object map, Lisp_Obje/
+act prol-src/natded.prolog /^act(OutForm,OutSyn,Ws):-$/
+action prol-src/natded.prolog /^action(KeyVals):-$/
+active_maps c-src/emacs/src/keyboard.c /^active_maps (Lisp_Object first_event)$/
+actout prol-src/natded.prolog /^actout('Text',Trees):-$/
+addArchs: objc-src/PackInsp.m /^-(void)addArchs:(const char *)string$/
+addPOReader php-src/lce_functions.php /^ function addPOReader($d_name, &$por)$/
+add_active prol-src/natded.prolog /^add_active([],Cat,Goal):-$/
+add_command_key c-src/emacs/src/keyboard.c /^add_command_key (Lisp_Object key)$/
+add_edge prol-src/natded.prolog /^add_edge(Left,Right,Cat):-$/
+add_node c-src/etags.c /^add_node (node *np, node **cur_node_p)$/
+add_regex c-src/etags.c /^add_regex (char *regexp_pattern, language *lang)$/
+add_user_signal c-src/emacs/src/keyboard.c /^add_user_signal (int sig, const char *name)$/
+addnoise html-src/algrthms.html /^Adding Noise to the$/
+address cccp.y 114
+address y-src/cccp.y 113
+adjust_point_for_property c-src/emacs/src/keyboard.c /^adjust_point_for_property (ptrdiff_t last_pt, bool/
+agent cp-src/clheir.hpp 75
+agent::move cp-src/clheir.cpp /^void agent::move(int direction)$/
+agent::where cp-src/clheir.hpp 77
+algorithms html-src/algrthms.html /^Description$/
+alias c-src/emacs/src/lisp.h 688
+align c-src/emacs/src/gmalloc.c /^align (size_t size)$/
+alignas c-src/emacs/src/lisp.h /^# define alignas(alignment) \/* empty *\/$/
+aligned c-src/emacs/src/gmalloc.c 199
+aligned_alloc c-src/emacs/src/gmalloc.c 71
+aligned_alloc c-src/emacs/src/gmalloc.c /^aligned_alloc (size_t alignment, size_t size)$/
+aligned_alloc c-src/emacs/src/gmalloc.c 1718
+alignlist c-src/emacs/src/gmalloc.c 196
+all_kboards c-src/emacs/src/keyboard.c 86
+allocate_kboard c-src/emacs/src/keyboard.c /^allocate_kboard (Lisp_Object type)$/
+allocated c-src/emacs/src/regex.h 344
+an_extern_linkage c-src/h.h 44
+an_extern_linkage c-src/h.h 56
+an_extern_linkage_ptr c-src/h.h 43
+analyze_regex c-src/etags.c /^analyze_regex (char *regex_arg)$/
+andkeyvalseq prol-src/natded.prolog /^andkeyvalseq(KeyVals) --> ['&'], keyvalseq(KeyVals/
+animals c-src/h.h 81
+animals cp-src/c.C 126
+any_kboard_state c-src/emacs/src/keyboard.c /^any_kboard_state ()$/
+appDidInit: objcpp-src/SimpleCalc.M /^- appDidInit:sender$/
+append prol-src/natded.prolog /^append([],Xs,Xs).$/
+appendToDisplay: objcpp-src/SimpleCalc.M /^- appendToDisplay:(const char *)theDigit$/
+append_list prol-src/natded.prolog /^append_list([],[]).$/
+append_string pas-src/common.pas /^procedure append_string;(*($/
+append_tool_bar_item c-src/emacs/src/keyboard.c /^append_tool_bar_item (void)$/
+appendix perl-src/htlmify-cystic 24
+appendix_name perl-src/htlmify-cystic 13
+appendix_toc perl-src/htlmify-cystic 16
+apply_modifiers c-src/emacs/src/keyboard.c /^apply_modifiers (int modifiers, Lisp_Object base)$/
+apply_modifiers_uncached c-src/emacs/src/keyboard.c /^apply_modifiers_uncached (int modifiers, char *bas/
+aref_addr c-src/emacs/src/lisp.h /^aref_addr (Lisp_Object array, ptrdiff_t idx)$/
+arg c-src/h.h 13
+arg_type c-src/etags.c 250
+arglist cccp.y 41
+arglist y-src/cccp.y 41
+argno cccp.y 45
+argno y-src/cccp.y 45
+args c-src/h.h 30
+argsindent tex-src/texinfo.tex /^\\newskip\\defargsindent \\defargsindent=50pt$/
+argsindent tex-src/texinfo.tex /^\\dimen1=\\hsize \\advance \\dimen1 by -\\defargsindent/
+argsindent tex-src/texinfo.tex /^\\parshape 2 0in \\dimen0 \\defargsindent \\dimen1 /
+argument c-src/etags.c 253
+argvals prol-src/natded.prolog /^argvals([]) --> [].$/
+array c.c 190
+ascii c-src/emacs/src/lisp.h 1598
+asort cp-src/functions.cpp /^void asort(int *a, int num){$/
+assemby-code-word forth-src/test-forth.fth /^code assemby-code-word ( dunno what it does )$/
+assert c-src/etags.c 135
+assert c-src/etags.c /^# define assert(x) ((void) 0)$/
+at_end c-src/etags.c 249
+at_filename c-src/etags.c 247
+at_language c-src/etags.c 245
+at_least_one_member prol-src/natded.prolog /^at_least_one_member(X,[X|_]):-!.$/
+at_regexp c-src/etags.c 246
+at_stdin c-src/etags.c 248
+atom prol-src/natded.prolog /^atom(X) --> [X], {atomic(X)}.$/
+atomval prol-src/natded.prolog /^atomval(X) --> atom(X).$/
+aultparindent tex-src/texinfo.tex /^\\newdimen\\defaultparindent \\defaultparindent = 15p/
+aultparindent tex-src/texinfo.tex /^\\parindent = \\defaultparindent$/
+aultparindent\hang\textindent tex-src/texinfo.tex /^\\footstrut\\parindent=\\defaultparindent\\hang\\textin/
+auto_help c-src/etags.c 699
+b c.c 180
+b c.c 259
+b c.c 260
+b c.c 262
+b c.c /^b ()$/
+b c-src/h.h 41
+b c-src/h.h 103
+b c-src/h.h 104
+backslash=0 tex-src/texinfo.tex /^\\let\\indexbackslash=0 %overridden during \\printin/
+bar c-src//c.c /^void bar() {while(0) {}}$/
+bar c.c 143
+bar c-src/h.h 19
+bas_syn prol-src/natded.prolog /^bas_syn(n(_)).$/
+base c-src/emacs/src/lisp.h 2188
+base cp-src/c.C /^double base (void) const { return rng_base; }$/
+bb c.c 275
+bbb c.c 251
+bbbbbb c-src/h.h 113
+been_warned c-src/etags.c 222
+before_command_echo_length c-src/emacs/src/keyboard.c 130
+before_command_key_count c-src/emacs/src/keyboard.c 129
+begtoken c-src/etags.c /^#define begtoken(c) (_btk[CHAR (c)]) \/* c can star/
+behaviour_info erl-src/gs_dialog.erl /^behaviour_info(callbacks) ->$/
+bf=cmbx10 tex-src/texinfo.tex /^\\font\\defbf=cmbx10 scaled \\magstep1 %was 1314$/
+bind pyt-src/server.py /^ def bind(self, key, action):$/
+bind_polling_period c-src/emacs/src/keyboard.c /^bind_polling_period (int n)$/
+bits_word c-src/emacs/src/lisp.h 123
+bits_word c-src/emacs/src/lisp.h 127
+bla c.c /^int bla ()$/
+blah tex-src/testenv.tex /^\\section{blah}$/
+bletch el-src/TAGTEST.EL /^(foo::defmumble bletch beuarghh)$/
+blv c-src/emacs/src/lisp.h 689
+blv_found c-src/emacs/src/lisp.h /^blv_found (struct Lisp_Buffer_Local_Value *blv)$/
+bodyindent tex-src/texinfo.tex /^\\newskip\\defbodyindent \\defbodyindent=.4in$/
+bodyindent tex-src/texinfo.tex /^\\advance\\dimen2 by -\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\dimen3 by -\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by -\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by \\defbodyindent \\advance \\righ/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by \\defbodyindent \\advance \\righ/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by \\defbodyindent \\advance \\righ/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by \\defbodyindent \\advance \\righ/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by \\defbodyindent \\advance \\righ/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bodyindent tex-src/texinfo.tex /^\\advance\\leftskip by \\defbodyindent \\advance \\righ/
+bodyindent tex-src/texinfo.tex /^\\exdentamount=\\defbodyindent$/
+bool c.c 222
+bool_header_size c-src/emacs/src/lisp.h 1472
+bool_vector_bitref c-src/emacs/src/lisp.h /^bool_vector_bitref (Lisp_Object a, EMACS_INT i)$/
+bool_vector_bytes c-src/emacs/src/lisp.h /^bool_vector_bytes (EMACS_INT size)$/
+bool_vector_data c-src/emacs/src/lisp.h /^bool_vector_data (Lisp_Object a)$/
+bool_vector_ref c-src/emacs/src/lisp.h /^bool_vector_ref (Lisp_Object a, EMACS_INT i)$/
+bool_vector_set c-src/emacs/src/lisp.h /^bool_vector_set (Lisp_Object a, EMACS_INT i, bool /
+bool_vector_size c-src/emacs/src/lisp.h /^bool_vector_size (Lisp_Object a)$/
+bool_vector_uchar_data c-src/emacs/src/lisp.h /^bool_vector_uchar_data (Lisp_Object a)$/
+bool_vector_words c-src/emacs/src/lisp.h /^bool_vector_words (EMACS_INT size)$/
+boolvar c-src/emacs/src/lisp.h 2287
+bracelev c-src/etags.c 2520
+bsp_DevId c-src/h.h 25
+btowc c-src/emacs/src/regex.h /^# define btowc(c) c$/
+buffer c-src/etags.c 238
+buffer c-src/emacs/src/regex.h 341
+buffer c-src/h.h 119
+build prol-src/natded.prolog /^build([],Left,Left).$/
+build_pure_c_string c-src/emacs/src/lisp.h /^build_pure_c_string (const char *str)$/
+build_string c-src/emacs/src/lisp.h /^build_string (const char *str)$/
+buildact prol-src/natded.prolog /^buildact([SynIn],Right,RightPlus1):-$/
+builtin_lisp_symbol c-src/emacs/src/lisp.h /^builtin_lisp_symbol (int index)$/
+burst c-src/h.h 28
+busy c-src/emacs/src/gmalloc.c 158
+button_down_location c-src/emacs/src/keyboard.c 5210
+button_down_time c-src/emacs/src/keyboard.c 5218
+byte_stack c-src/emacs/src/lisp.h 3049
+bytecode_dest c-src/emacs/src/lisp.h 3037
+bytecode_top c-src/emacs/src/lisp.h 3036
+bytes_free c-src/emacs/src/gmalloc.c 314
+bytes_total c-src/emacs/src/gmalloc.c 310
+bytes_used c-src/emacs/src/gmalloc.c 312
+c c.c 180
+c c-src/h.h /^#define c() d$/
+c c-src/h.h 106
+c make-src/Makefile 222
+c_ext c-src/etags.c 2271
+caccacacca c.c /^caccacacca (a,b,c,d,e,f,g)$/
+cacheLRUEntry_s c.c 172
+cacheLRUEntry_t c.c 177
+calloc c-src/emacs/src/gmalloc.c 66
+calloc c-src/emacs/src/gmalloc.c 70
+calloc c-src/emacs/src/gmalloc.c /^calloc (size_t nmemb, size_t size)$/
+calloc c-src/emacs/src/gmalloc.c 1717
+can_be_null c-src/emacs/src/regex.h 370
+cancel_echoing c-src/emacs/src/keyboard.c /^cancel_echoing (void)$/
+canonicalize_filename c-src/etags.c /^canonicalize_filename (register char *fn)$/
+case_Lisp_Int c-src/emacs/src/lisp.h 438
+cat c-src/h.h 81
+cat prol-src/natded.prolog /^cat(A, Alpha@Beta, Ass3, Qs3, tree(fe,A:Alpha@Beta/
+cat_atoms prol-src/natded.prolog /^cat_atoms(A1,A2,A3):-$/
+cccccccccc c-src/h.h 115
+cdiff Makefile /^cdiff: CTAGS.good CTAGS ${infiles}$/
+cdr c-src/emacs/src/lisp.h 1159
+cell y-src/parse.y 278
+cgrep html-src/software.html /^cgrep$/
+chain c-src/emacs/src/lisp.h 1162
+chain c-src/emacs/src/lisp.h 2396
+char_bits c-src/emacs/src/lisp.h 2443
+char_table_specials c-src/emacs/src/lisp.h 1692
+charset_unibyte c-src/emacs/src/regex.h 410
+chartonmstr pas-src/common.pas /^function chartonmstr; (*($/
+check Makefile /^check:$/
+checkQuotation php-src/lce_functions.php /^ function checkQuotation($str)$/
+check_cons_list c-src/emacs/src/lisp.h /^# define check_cons_list() lisp_h_check_cons_list/
+checkhdr c-src/emacs/src/gmalloc.c /^checkhdr (const struct hdr *hdr)$/
+checkiso html-src/software.html /^checkiso$/
+childDidExit objc-src/Subprocess.m /^- childDidExit$/
+chunks_free c-src/emacs/src/gmalloc.c 313
+chunks_used c-src/emacs/src/gmalloc.c 311
+cjava c-src/etags.c 2936
+classifyLine php-src/lce_functions.php /^ function classifyLine($line)$/
+clear-abbrev-table c-src/abbrev.c /^DEFUN ("clear-abbrev-table", Fclear_abbrev_table, /
+clear-this-command-keys c-src/emacs/src/keyboard.c /^DEFUN ("clear-this-command-keys", Fclear_this_comm/
+clearAllKey: objcpp-src/SimpleCalc.M /^- clearAllKey:sender$/
+clearKey: objcpp-src/SimpleCalc.M /^- clearKey:sender$/
+clear_event c-src/emacs/src/keyboard.c /^clear_event (struct input_event *event)$/
+clear_input_pending c-src/emacs/src/keyboard.c /^clear_input_pending (void)$/
+clear_screen cp-src/screen.cpp /^void clear_screen(void)$/
+clear_waiting_for_input c-src/emacs/src/keyboard.c /^clear_waiting_for_input (void)$/
+cmd_error c-src/emacs/src/keyboard.c /^cmd_error (Lisp_Object data)$/
+cmd_error_internal c-src/emacs/src/keyboard.c /^cmd_error_internal (Lisp_Object data, const char */
+cmpfn c-src/emacs/src/lisp.h /^ bool (*cmpfn) (struct hash_table_test *t, Lisp_O/
+cmt prol-src/natded.prolog /^cmt:-$/
+cname c-src/etags.c 2519
+cno c-src/etags.c 224
+commaargvals prol-src/natded.prolog /^commaargvals(Args) -->$/
+command c-src/etags.c 187
+command-error-default-function c-src/emacs/src/keyboard.c /^DEFUN ("command-error-default-function", Fcommand_/
+command_loop c-src/emacs/src/keyboard.c /^command_loop (void)$/
+command_loop_1 c-src/emacs/src/keyboard.c /^command_loop_1 (void)$/
+command_loop_2 c-src/emacs/src/keyboard.c /^command_loop_2 (Lisp_Object ignore)$/
+command_loop_level c-src/emacs/src/keyboard.c 195
+comment php-src/lce_functions.php /^ function comment($line, $class)$/
+compile_empty prol-src/natded.prolog /^compile_empty:-$/
+compile_lex prol-src/natded.prolog /^compile_lex(File):-$/
+complete prol-src/natded.prolog /^complete(Cat):-$/
+complete-tag el-src/emacs/lisp/progmodes/etags.el /^(defun complete-tag ()$/
+compressor c-src/etags.c 188
+compressors c-src/etags.c 457
+conalgorithm html-src/algrthms.html /^Convolutionally$/
+concat c-src/etags.c /^concat (const char *s1, const char *s2, const char/
+concatenatenamestrings pas-src/common.pas /^function concatenatenamestrings; (*($/
+consider_token c-src/etags.c /^consider_token (char *str, int len, int c, int *c_/
+constant c-src/h.h 29
+constant cccp.y 113
+constant y-src/cccp.y 112
+constant_args c-src/h.h 27
+constype c-src/emacs/src/lisp.h 3739
+consult_lex prol-src/natded.prolog /^consult_lex:-$/
+contents c-src/emacs/src/lisp.h 1372
+contents c-src/emacs/src/lisp.h 1600
+contents c-src/emacs/src/lisp.h 1624
+count c-src/emacs/src/lisp.h 1863
+count_layers lua-src/allegro.lua /^local function count_layers (layer)$/
+count_words c-src/tab.c /^static int count_words(char *str, char delim)$/
+cow cp-src/c.C 127
+cplpl c-src/etags.c 2935
+createPOEntries php-src/lce_functions.php /^ function createPOEntries()$/
+createWidgets pyt-src/server.py /^ def createWidgets(self, host):$/
+createWidgets pyt-src/server.py /^ def createWidgets(self):$/
+cstack c-src/etags.c 2523
+curlb c-src/etags.c 2929
+curlinepos c-src/etags.c 2931
+current-idle-time c-src/emacs/src/keyboard.c /^DEFUN ("current-idle-time", Fcurrent_idle_time, Sc/
+current-input-mode c-src/emacs/src/keyboard.c /^DEFUN ("current-input-mode", Fcurrent_input_mode, /
+current_kboard c-src/emacs/src/keyboard.c 85
+current_lb_is_new c-src/etags.c 2926
+cursor_position cp-src/screen.cpp /^void cursor_position(void)$/
+cursor_x cp-src/screen.cpp 15
+cursor_y cp-src/screen.cpp 15
+d c.c 180
+d c-src/emacs/src/lisp.h 4673
+d c-src/emacs/src/lisp.h 4679
+data c-src/emacs/src/lisp.h 1395
+data c-src/emacs/src/lisp.h 2129
+data c-src/emacs/src/lisp.h 2395
+ddefineseen c-src/etags.c 2462
+debian-bug html-src/software.html /^debian-bug.el$/
+decimalKey: objcpp-src/SimpleCalc.M /^- decimalKey:sender$/
+decode_timer c-src/emacs/src/keyboard.c /^decode_timer (Lisp_Object timer, struct timespec */
+def c-src/h.h 35
+def c-src/h.h 38
+defalt c-src/emacs/src/lisp.h 1585
+default-tags-table-function el-src/emacs/lisp/progmodes/etags.el /^(defvar default-tags-table-function nil$/
+default_C_entries c-src/etags.c /^default_C_entries (FILE *inf)$/
+default_C_help c-src/etags.c 515
+default_C_help c-src/etags.c 523
+default_C_suffixes c-src/etags.c 512
+defcell c-src/emacs/src/lisp.h 2351
+define-abbrev c-src/abbrev.c /^DEFUN ("define-abbrev", Fdefine_abbrev, Sdefine_ab/
+define-abbrev-table c-src/abbrev.c /^DEFUN ("define-abbrev-table", Fdefine_abbrev_table/
+define-global-abbrev c-src/abbrev.c /^DEFUN ("define-global-abbrev", Fdefine_global_abbr/
+define-mode-abbrev c-src/abbrev.c /^DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev, /
+defined_GC_CHECK_STRING_BYTES c-src/emacs/src/lisp.h 4663
+defined_GC_CHECK_STRING_BYTES c-src/emacs/src/lisp.h 4665
+definedef c-src/etags.c 2464
+defun_func1 c.c /^defun_func1()$/
+delegate objc-src/Subprocess.m /^- delegate$/
+deleteItem pyt-src/server.py /^ def deleteItem(self):$/
+delete_kboard c-src/emacs/src/keyboard.c /^delete_kboard (KBOARD *kb)$/
+deliver_input_available_signal c-src/emacs/src/keyboard.c /^deliver_input_available_signal (int sig)$/
+deliver_interrupt_signal c-src/emacs/src/keyboard.c /^deliver_interrupt_signal (int sig)$/
+deliver_user_signal c-src/emacs/src/keyboard.c /^deliver_user_signal (int sig)$/
+depth c-src/emacs/src/lisp.h 1618
+derived_analyses prol-src/natded.prolog /^derived_analyses([],[]).$/
+describe_abbrev c-src/abbrev.c /^describe_abbrev (sym, stream)$/
+detect_input_pending c-src/emacs/src/keyboard.c /^detect_input_pending (void)$/
+detect_input_pending_ignore_squeezables c-src/emacs/src/keyboard.c /^detect_input_pending_ignore_squeezables (void)$/
+detect_input_pending_run_timers c-src/emacs/src/keyboard.c /^detect_input_pending_run_timers (bool do_display)$/
+dialog_loop erl-src/gs_dialog.erl /^dialog_loop(Module, Window, Frame, Extra, Args) ->/
+dignorerest c-src/etags.c 2463
+discard-input c-src/emacs/src/keyboard.c /^DEFUN ("discard-input", Fdiscard_input, Sdiscard_i/
+discard_mouse_events c-src/emacs/src/keyboard.c /^discard_mouse_events (void)$/
+discrete_location cp-src/clheir.hpp 56
+discrete_location::assign_neighbor cp-src/clheir.hpp /^ void assign_neighbor(int direction, location */
+discrete_location::clear_neighbors cp-src/clheir.cpp /^void discrete_location::clear_neighbors(void)$/
+discrete_location::discrete_location cp-src/clheir.hpp /^ discrete_location(int xi, int yi, int zi):$/
+discrete_location::neighbors cp-src/clheir.hpp 59
+discrete_location::x cp-src/clheir.hpp 58
+discrete_location::y cp-src/clheir.hpp 58
+discrete_location::z cp-src/clheir.hpp 58
+display cp-src/conway.cpp /^void display(void)$/
+disposetextstring pas-src/common.pas /^procedure disposetextstring;(*($/
+dnone c-src/etags.c 2460
+doc c-src/emacs/src/lisp.h 1689
+dog c-src/h.h 81
+dotfill tex-src/texinfo.tex /^ \\null\\nobreak\\indexdotfill % Have leaders before/
+dotfill tex-src/texinfo.tex /^\\noindent\\hskip\\secondaryindent\\hbox{#1}\\indexdotf/
+double_click_count c-src/emacs/src/keyboard.c 5222
+drag_n_drop_syms c-src/emacs/src/keyboard.c 4629
+dribble c-src/emacs/src/keyboard.c 236
+dsharpseen c-src/etags.c 2461
+dummies tex-src/texinfo.tex /^{\\indexdummies % Must do this here, since \\bf, etc/
+dummies tex-src/texinfo.tex /^{\\indexdummies % Must do this here, since \\bf, etc/
+dummydots tex-src/texinfo.tex /^\\let\\dots=\\indexdummydots$/
+dummyfont tex-src/texinfo.tex /^\\let\\w=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\t=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\r=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\i=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\b=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\emph=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\strong=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\sc=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\tclose=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\code=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\file=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\samp=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\kbd=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\key=\\indexdummyfont$/
+dummyfont tex-src/texinfo.tex /^\\let\\var=\\indexdummyfont$/
+dummytex tex-src/texinfo.tex /^\\let\\TeX=\\indexdummytex$/
+dump pyt-src/server.py /^ def dump(self, folded):$/
+eabs c-src/emacs/src/lisp.h /^#define eabs(x) ((x) < 0 ? -(x) : (x))$/
+eassert c-src/emacs/src/lisp.h /^# define eassert(cond) ((void) (false && (cond))) /
+eassert c-src/emacs/src/lisp.h /^# define eassert(cond) \\$/
+eassume c-src/emacs/src/lisp.h /^# define eassume(cond) assume (cond)$/
+eassume c-src/emacs/src/lisp.h /^# define eassume(cond) \\$/
+eax c-src/sysdep.h 31
+eax c-src/sysdep.h 33
+eax c-src/sysdep.h 33
+echo_add_key c-src/emacs/src/keyboard.c /^echo_add_key (Lisp_Object c)$/
+echo_char c-src/emacs/src/keyboard.c /^echo_char (Lisp_Object c)$/
+echo_dash c-src/emacs/src/keyboard.c /^echo_dash (void)$/
+echo_kboard c-src/emacs/src/keyboard.c 166
+echo_keystrokes_p c-src/emacs/src/keyboard.c /^echo_keystrokes_p (void)$/
+echo_length c-src/emacs/src/keyboard.c /^echo_length (void)$/
+echo_message_buffer c-src/emacs/src/keyboard.c 171
+echo_now c-src/emacs/src/keyboard.c /^echo_now (void)$/
+echo_truncate c-src/emacs/src/keyboard.c /^echo_truncate (ptrdiff_t nchars)$/
+echoing c-src/emacs/src/keyboard.c 154
+ediff% Makefile /^ediff%: ETAGS.good% ETAGS ${infiles}$/
+editItem pyt-src/server.py /^ def editItem(self):$/
+editsite pyt-src/server.py /^ def editsite(self, site):$/
+edituser pyt-src/server.py /^ def edituser(self, user):$/
+egetenv c-src/emacs/src/lisp.h /^egetenv (const char *var)$/
+emacs_abort c-src/emacs/src/lisp.h /^extern _Noreturn void emacs_abort (void) NO_INLINE/
+end c-src/emacs/src/regex.h 432
+end c-src/emacs/src/keyboard.c 8753
+endtoken c-src/etags.c /^#define endtoken(c) (_etk[CHAR (c)]) \/* c ends tok/
+enter_critical_section c-src/h.h 116
+entry perl-src/htlmify-cystic 218
+entry perl-src/htlmify-cystic 234
+entry perl-src/htlmify-cystic 245
+entry perl-src/htlmify-cystic 252
+entry perl-src/htlmify-cystic 268
+entry perl-src/htlmify-cystic 276
+entry perl-src/htlmify-cystic 281
+entry perl-src/htlmify-cystic 296
+equalsKey: objcpp-src/SimpleCalc.M /^- equalsKey:sender$/
+erlang_atom c-src/etags.c /^erlang_atom (char *s)$/
+erlang_attribute c-src/etags.c /^erlang_attribute (char *s)$/
+erlang_func c-src/etags.c /^erlang_func (char *s, char *last)$/
+error c-src/etags.c /^static void error (const char *, ...) ATTRIBUTE_FO/
+error c-src/etags.c /^error (const char *format, ...)$/
+error c-src/emacs/src/lisp.h /^extern _Noreturn void error (const char *, ...) AT/
+error cccp.y /^error (msg)$/
+error y-src/cccp.y /^error (msg)$/
+error_signaled c-src/etags.c 264
+etags el-src/emacs/lisp/progmodes/etags.el /^(defgroup etags nil "Tags tables."$/
+etags html-src/software.html /^Etags$/
+etags--xref-find-definitions el-src/emacs/lisp/progmodes/etags.el /^(defun etags--xref-find-definitions (pattern &opti/
+etags--xref-limit el-src/emacs/lisp/progmodes/etags.el /^(defconst etags--xref-limit 1000)$/
+etags-file-of-tag el-src/emacs/lisp/progmodes/etags.el /^(defun etags-file-of-tag (&optional relative) ; Do/
+etags-goto-tag-location el-src/emacs/lisp/progmodes/etags.el /^(defun etags-goto-tag-location (tag-info)$/
+etags-list-tags el-src/emacs/lisp/progmodes/etags.el /^(defun etags-list-tags (file) ; Doc string?$/
+etags-recognize-tags-table el-src/emacs/lisp/progmodes/etags.el /^(defun etags-recognize-tags-table ()$/
+etags-snarf-tag el-src/emacs/lisp/progmodes/etags.el /^(defun etags-snarf-tag (&optional use-explicit) ; /
+etags-tags-apropos el-src/emacs/lisp/progmodes/etags.el /^(defun etags-tags-apropos (string) ; Doc string?$/
+etags-tags-apropos-additional el-src/emacs/lisp/progmodes/etags.el /^(defun etags-tags-apropos-additional (regexp)$/
+etags-tags-completion-table el-src/emacs/lisp/progmodes/etags.el /^(defun etags-tags-completion-table () ; Doc string/
+etags-tags-included-tables el-src/emacs/lisp/progmodes/etags.el /^(defun etags-tags-included-tables () ; Doc string?/
+etags-tags-table-files el-src/emacs/lisp/progmodes/etags.el /^(defun etags-tags-table-files () ; Doc string?$/
+etags-verify-tags-table el-src/emacs/lisp/progmodes/etags.el /^(defun etags-verify-tags-table ()$/
+etags-xref-find el-src/emacs/lisp/progmodes/etags.el /^(defun etags-xref-find (action id)$/
+etags-xref-find-definitions-tag-order el-src/emacs/lisp/progmodes/etags.el /^(defvar etags-xref-find-definitions-tag-order '(ta/
+etags_getcwd c-src/etags.c /^etags_getcwd (void)$/
+eval_dyn c-src/emacs/src/keyboard.c /^eval_dyn (Lisp_Object form)$/
+event-convert-list c-src/emacs/src/keyboard.c /^DEFUN ("event-convert-list", Fevent_convert_list, /
+event-symbol-parse-modifiers c-src/emacs/src/keyboard.c /^DEFUN ("internal-event-symbol-parse-modifiers", Fe/
+event_head c-src/emacs/src/keyboard.c 11021
+event_to_kboard c-src/emacs/src/keyboard.c /^event_to_kboard (struct input_event *event)$/
+exact c-src/emacs/src/gmalloc.c 200
+exit c-src/exit.c /^DEFUN(exit, (status), int status)$/
+exit c-src/exit.strange_suffix /^DEFUN(exit, (status), int status)$/
+exit-recursive-edit c-src/emacs/src/keyboard.c /^DEFUN ("exit-recursive-edit", Fexit_recursive_edit/
+exit_critical_to_previous c-src/h.h 117
+exp y-src/parse.y 94
+exp y-src/atest.y 2
+exp y-src/cccp.y 156
+exp y-src/cccp.y 185
+exp1 y-src/cccp.y 148
+exp_list y-src/parse.y 262
+expand-abbrev c-src/abbrev.c /^DEFUN ("expand-abbrev", Fexpand_abbrev, Sexpand_ab/
+expandmng prol-src/natded.prolog /^expandmng(var(V),var(V)).$/
+expandmng_tree prol-src/natded.prolog /^expandmng_tree(tree(Rule,Syn:Sem,Trees),$/
+expandmng_trees prol-src/natded.prolog /^expandmng_trees([],[]).$/
+expandsyn prol-src/natded.prolog /^expandsyn(Syn,Syn):-$/
+explicitly-quoted-pending-delete-mode el-src/TAGTEST.EL /^(defalias (quote explicitly-quoted-pending-delete-/
+expression_value cccp.y 68
+expression_value y-src/cccp.y 68
+extras c-src/emacs/src/lisp.h 1603
+extvar c-src/h.h 109
+f c-src//c.c /^T f(){if(x){}$/
+f c.c 145
+f c.c 156
+f c.c 168
+f c.c /^int f$/
+f c-src/h.h 89
+f cp-src/c.C /^A<int>* f() {}$/
+f cp-src/c.C /^int f(A<int> x) {}$/
+f cp-src/c.C /^int A<int>::f(A<int>* x) {}$/
+f cp-src/c.C /^A<float,B<int> > A<B<float>,int>::f(A<int>* x) {}$/
+f1 c.c /^ f1 () { \/* Do something. *\/; }$/
+f2 c.c /^void f2 () { \/* Do something. *\/; }$/
+fast_string_match_ignore_case c-src/emacs/src/lisp.h /^fast_string_match_ignore_case (Lisp_Object regexp,/
+fastmap c-src/emacs/src/regex.h 355
+fastmap_accurate c-src/emacs/src/regex.h 383
+fatal c-src/etags.c /^fatal (const char *s1, const char *s2)$/
+fatala c.c /^void fatala () __attribute__ ((noreturn));$/
+fdHandler objc-src/Subprocess.m /^fdHandler (int theFd, id self)$/
+fdHandler: objc-src/Subprocess.m /^- fdHandler:(int)theFd$/
+fdefunkey c-src/etags.c 2409
+fdefunname c-src/etags.c 2410
+fdesc c-src/etags.c 201
+fdesc c-src/etags.c 212
+fdp c-src/etags.c 217
+field_of_play cp-src/conway.cpp 18
+fignore c-src/etags.c 2416
+file-of-tag el-src/emacs/lisp/progmodes/etags.el /^(defun file-of-tag (&optional relative)$/
+file-of-tag-function el-src/emacs/lisp/progmodes/etags.el /^(defvar file-of-tag-function nil$/
+fileJoin php-src/lce_functions.php /^ function fileJoin()$/
+file_index perl-src/htlmify-cystic 33
+file_tocs perl-src/htlmify-cystic 30
+filename_is_absolute c-src/etags.c /^filename_is_absolute (char *fn)$/
+filenames c-src/etags.c 196
+find-tag el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag (tagname &optional next-p regexp-p/
+find-tag-default-function el-src/emacs/lisp/progmodes/etags.el /^(defcustom find-tag-default-function nil$/
+find-tag-history el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-history nil) ; Doc string?$/
+find-tag-hook el-src/emacs/lisp/progmodes/etags.el /^(defcustom find-tag-hook nil$/
+find-tag-in-order el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-in-order (pattern$/
+find-tag-interactive el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-interactive (prompt &optional no-d/
+find-tag-marker-ring el-src/emacs/lisp/progmodes/etags.el /^(defvaralias 'find-tag-marker-ring 'xref--marker-r/
+find-tag-marker-ring-length el-src/emacs/lisp/progmodes/etags.el /^(define-obsolete-variable-alias 'find-tag-marker-r/
+find-tag-next-line-after-failure-p el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-next-line-after-failure-p nil$/
+find-tag-noselect el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-noselect (tagname &optional next-p/
+find-tag-other-frame el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-other-frame (tagname &optional nex/
+find-tag-other-window el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-other-window (tagname &optional ne/
+find-tag-regexp el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-regexp (regexp &optional next-p ot/
+find-tag-regexp-next-line-after-failure-p el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-regexp-next-line-after-failure-p /
+find-tag-regexp-search-function el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-regexp-search-function nil$/
+find-tag-regexp-tag-order el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-regexp-tag-order nil$/
+find-tag-search-function el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-search-function nil$/
+find-tag-tag el-src/emacs/lisp/progmodes/etags.el /^(defun find-tag-tag (string)$/
+find-tag-tag-order el-src/emacs/lisp/progmodes/etags.el /^(defvar find-tag-tag-order nil$/
+find_entries c-src/etags.c /^find_entries (FILE *inf)$/
+find_user_signal_name c-src/emacs/src/keyboard.c /^find_user_signal_name (int sig)$/
+findcats prol-src/natded.prolog /^findcats([],Left,Left).$/
+finlist c-src/etags.c 2414
+first c-src/emacs/src/gmalloc.c 151
+fitchtreelist prol-src/natded.prolog /^fitchtreelist([]).$/
+fixup_locale c-src/emacs/src/lisp.h /^INLINE void fixup_locale (void) {}$/
+flag c-src/getopt.h 83
+flag2str pyt-src/server.py /^def flag2str(value, string):$/
+flistseen c-src/etags.c 2415
+fn c-src/exit.c /^ void EXFUN((*fn[1]), (NOARGS));$/
+fn c-src/exit.strange_suffix /^ void EXFUN((*fn[1]), (NOARGS));$/
+fnin y-src/parse.y 67
+fnin parse.y 67
+focus_set pyt-src/server.py /^ def focus_set(self):$/
+follow_key c-src/emacs/src/keyboard.c /^follow_key (Lisp_Object keymap, Lisp_Object key)$/
+fonts tex-src/texinfo.tex /^\\obeyspaces \\obeylines \\ninett \\indexfonts \\rawbac/
+fonts\rm tex-src/texinfo.tex /^ \\indexfonts\\rm \\tolerance=9500 \\advance\\baseline/
+foo c.c 150
+foo c.c 166
+foo c.c 167
+foo c.c 178
+foo c.c 189
+foo c-src/h.h 18
+foo cp-src/c.C 68
+foo cp-src/c.C 79
+foo f-src/entry.for /^ character*(*) function foo()$/
+foo f-src/entry.strange_suffix /^ character*(*) function foo()$/
+foo f-src/entry.strange /^ character*(*) function foo()$/
+foo php-src/ptest.php /^foo()$/
+foo::f cp-src/c.C /^ void f() {}$/
+foo::x cp-src/c.C 80
+foobar c-src//c.c /^int foobar() {;}$/
+foobar c.c /^extern void foobar (void) __attribute__ ((section /
+foobar2 c-src/h.h 20
+foobar2_ c-src/h.h 16
+foperator c-src/etags.c 2411
+force_auto_save_soon c-src/emacs/src/keyboard.c /^force_auto_save_soon (void)$/
+force_explicit_name c-src/etags.c 265
+force_quit_count c-src/emacs/src/keyboard.c 10387
+formatSize:inBuf: objc-src/PackInsp.m /^-(const char *)formatSize:(const char *)size inBuf/
+found c-src/emacs/src/lisp.h 2344
+fracas html-src/software.html /^Fracas$/
+frag c-src/emacs/src/gmalloc.c 152
+frame_local c-src/emacs/src/lisp.h 2341
+free c-src/emacs/src/gmalloc.c 67
+free c-src/emacs/src/gmalloc.c 72
+free c-src/emacs/src/gmalloc.c 166
+free c-src/emacs/src/gmalloc.c /^free (void *ptr)$/
+free c-src/emacs/src/gmalloc.c 1719
+free_fdesc c-src/etags.c /^free_fdesc (register fdesc *fdp)$/
+free_for prol-src/natded.prolog /^free_for(var(_),_,_).$/
+free_regexps c-src/etags.c /^free_regexps (void)$/
+free_tree c-src/etags.c /^free_tree (register node *np)$/
+free_var prol-src/natded.prolog /^free_var(var(V),var(V)).$/
+freehook c-src/emacs/src/gmalloc.c /^freehook (void *ptr)$/
+fresh_vars prol-src/natded.prolog /^fresh_vars(var(V),var(V)).$/
+fstartlist c-src/etags.c 2413
+func1 c.c /^int func1$/
+func2 c.c /^int func2 (a,b$/
+func_key_syms c-src/emacs/src/keyboard.c 4626
+funcboo c.c /^bool funcboo ()$/
+funcpointer c-src/emacs/src/lisp.h 2126
+funcptr c-src/h.h /^ fu int (*funcptr) (void *ptr);$/
+function c-src/etags.c 194
+function c-src/emacs/src/lisp.h 694
+function c-src/emacs/src/lisp.h 1685
+function c-src/emacs/src/lisp.h 2197
+functionp c-src/emacs/src/lisp.h /^functionp (Lisp_Object object)$/
+fvdef c-src/etags.c 2418
+fvextern c-src/etags.c 2420
+fvnameseen c-src/etags.c 2412
+fvnone c-src/etags.c 2408
+fwd c-src/emacs/src/lisp.h 690
+fwd c-src/emacs/src/lisp.h 2346
+galileo html-src/software.html /^GaliLEO$/
+gather pyt-src/server.py /^ def gather(self):$/
+gather pyt-src/server.py /^ def gather(self):$/
+gc_aset c-src/emacs/src/lisp.h /^gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Ob/
+gcmarkbit c-src/emacs/src/lisp.h 656
+gcpro c-src/emacs/src/lisp.h 3042
+gcpro c-src/emacs/src/lisp.h 3132
+gen_help_event c-src/emacs/src/keyboard.c /^gen_help_event (Lisp_Object help, Lisp_Object fram/
+genalgorithm html-src/algrthms.html /^Generating the Data<\/font><\/i><\/b>$/
+generic_object cp-src/clheir.hpp 13
+generic_object::compute_next_state cp-src/clheir.hpp /^ virtual void compute_next_state(void) { }$/
+generic_object::generic_object cp-src/clheir.cpp /^generic_object::generic_object(void)$/
+generic_object::step cp-src/clheir.hpp /^ virtual void step(void) { }$/
+generic_object::where_in_registry cp-src/clheir.hpp 15
+generic_object::~generic_object cp-src/clheir.cpp /^generic_object::~generic_object(void)$/
+getArchs objc-src/PackInsp.m /^-(void)getArchs$/
+getDomainNames php-src/lce_functions.php /^ function getDomainNames()$/
+getPOReader php-src/lce_functions.php /^ function &getPOReader($domain)$/
+getPath:forType: objc-src/PackInsp.m /^-(const char *)getPath:(char *)buf forType:(const /
+getTextDomains php-src/lce_functions.php /^ function getTextDomains($lines)$/
+get_compressor_from_suffix c-src/etags.c /^get_compressor_from_suffix (char *file, char **ext/
+get_contiguous_space c-src/emacs/src/gmalloc.c /^get_contiguous_space (ptrdiff_t size, void *positi/
+get_current_dir_name c-src/emacs/src/gmalloc.c 33
+get_input_pending c-src/emacs/src/keyboard.c /^get_input_pending (int flags)$/
+get_language_from_filename c-src/etags.c /^get_language_from_filename (char *file, int case_s/
+get_language_from_interpreter c-src/etags.c /^get_language_from_interpreter (char *interpreter)$/
+get_language_from_langname c-src/etags.c /^get_language_from_langname (const char *name)$/
+get_layer_by_name lua-src/allegro.lua /^local function get_layer_by_name (sprite, layer, n/
+get_tag c-src/etags.c /^get_tag (register char *bp, char **namepp)$/
+get_word c-src/tab.c /^static char *get_word(char **str, char delim)$/
+getcjmp c-src/emacs/src/keyboard.c 147
+getptys objc-src/Subprocess.m /^getptys (int *master, int *slave)$/
+gettext php-src/lce_functions.php /^ function gettext($msgid)$/
+ggg c-src/h.h 10
+ghi1 c-src/h.h 36
+ghi2 c-src/h.h 39
+glider cp-src/conway.cpp /^void glider(int x, int y)$/
+gnu html-src/software.html /^Free software that I wrote for the GNU project or /
+gobble_input c-src/emacs/src/keyboard.c /^gobble_input (void)$/
+goto-tag-location-function el-src/emacs/lisp/progmodes/etags.el /^(defvar goto-tag-location-function nil$/
+goto_xy cp-src/screen.cpp /^void goto_xy(unsigned char x, unsigned char y)$/
+handleList pyt-src/server.py /^ def handleList(self, event):$/
+handleNew pyt-src/server.py /^ def handleNew(self, event):$/
+handle_async_input c-src/emacs/src/keyboard.c /^handle_async_input (void)$/
+handle_input_available_signal c-src/emacs/src/keyboard.c /^handle_input_available_signal (int sig)$/
+handle_interrupt c-src/emacs/src/keyboard.c /^handle_interrupt (bool in_signal_handler)$/
+handle_interrupt_signal c-src/emacs/src/keyboard.c /^handle_interrupt_signal (int sig)$/
+handle_user_signal c-src/emacs/src/keyboard.c /^handle_user_signal (int sig)$/
+handler c-src/emacs/src/lisp.h 3023
+handlertype c-src/emacs/src/lisp.h 3021
+has_arg c-src/getopt.h 82
+hash c-src/etags.c /^hash (const char *str, int len)$/
+hash c-src/emacs/src/lisp.h 1843
+hash_table_test c-src/emacs/src/lisp.h 1805
+hashfn c-src/emacs/src/lisp.h /^ EMACS_UINT (*hashfn) (struct hash_table_test *t,/
+hdr c-src/emacs/src/gmalloc.c 1860
+head_table c-src/emacs/src/keyboard.c 11027
+header c-src/emacs/src/lisp.h 1371
+header c-src/emacs/src/lisp.h 1388
+header c-src/emacs/src/lisp.h 1581
+header c-src/emacs/src/lisp.h 1610
+header c-src/emacs/src/lisp.h 1672
+header c-src/emacs/src/lisp.h 1826
+header_size c-src/emacs/src/lisp.h 1471
+heapsize c-src/emacs/src/gmalloc.c 361
+help c-src/etags.c 193
+helpPanel: objcpp-src/SimpleCalc.M /^- helpPanel:sender$/
+help_char_p c-src/emacs/src/keyboard.c /^help_char_p (Lisp_Object c)$/
+help_form_saved_window_configs c-src/emacs/src/keyboard.c 2156
+helpwin pyt-src/server.py /^def helpwin(helpdict):$/
+hide_cursor cp-src/screen.cpp /^void hide_cursor(void)$/
+htmltreelist prol-src/natded.prolog /^htmltreelist([]).$/
+hybrid_aligned_alloc c-src/emacs/src/gmalloc.c /^hybrid_aligned_alloc (size_t alignment, size_t siz/
+hybrid_calloc c-src/emacs/src/gmalloc.c /^hybrid_calloc (size_t nmemb, size_t size)$/
+hybrid_free c-src/emacs/src/gmalloc.c /^hybrid_free (void *ptr)$/
+hybrid_get_current_dir_name c-src/emacs/src/gmalloc.c /^hybrid_get_current_dir_name (void)$/
+hybrid_malloc c-src/emacs/src/gmalloc.c /^hybrid_malloc (size_t size)$/
+hybrid_realloc c-src/emacs/src/gmalloc.c /^hybrid_realloc (void *ptr, size_t size)$/
+hypothetical_mem prol-src/natded.prolog /^hypothetical_mem(fi(N),Ass,_):-$/
+i c-src//c.c 2
+i c.c 169
+i c-src/emacs/src/lisp.h 567
+i c-src/emacs/src/lisp.h 4673
+i c-src/emacs/src/lisp.h 4679
+ialpage tex-src/texinfo.tex /^\\newbox\\partialpage$/
+ialpage tex-src/texinfo.tex /^ \\dimen@=\\pageheight \\advance\\dimen@ by-\\ht\\parti/
+ialpage tex-src/texinfo.tex /^ \\availdimen@=\\pageheight \\advance\\availdimen@ by/
+ialpage tex-src/texinfo.tex /^ \\dimen@=\\pageheight \\advance\\dimen@ by-\\ht\\pa/
+ialpage= tex-src/texinfo.tex /^ \\output={\\global\\setbox\\partialpage=$/
+idx c-src/emacs/src/lisp.h 3150
+ignore_case c-src/etags.c 266
+ignore_mouse_drag_p c-src/emacs/src/keyboard.c 1256
+ill=\relax tex-src/texinfo.tex /^\\let\\refill=\\relax$/
+immediate_quit c-src/emacs/src/keyboard.c 174
+impatto html-src/softwarelibero.html /^Impatto pratico del software libero$/
+in_word_set c-src/etags.c /^in_word_set (register const char *str, register un/
+inattribute c-src/etags.c 2400
+index c-src/emacs/src/lisp.h 1856
+infabsdir c-src/etags.c 206
+infabsname c-src/etags.c 205
+infiles Makefile /^infiles = $(filter-out ${NONSRCS},${SRCS}) srclist/
+infname c-src/etags.c 204
+info c-src/emacs/src/gmalloc.c 157
+infoPanel: objcpp-src/SimpleCalc.M /^- infoPanel:sender$/
+init c-src/etags.c /^init (void)$/
+init objcpp-src/SimpleCalc.M /^- init$/
+init: objc-src/Subprocess.m /^- init:(const char *)subprocessString$/
+init:withDelegate:andPtySupport:andStdErr: objc-src/Subprocess.m /^ andStdErr:(BOOL)wantsStdErr$/
+init_control c.c 239
+init_kboard c-src/emacs/src/keyboard.c /^init_kboard (KBOARD *kb, Lisp_Object type)$/
+init_keyboard c-src/emacs/src/keyboard.c /^init_keyboard (void)$/
+init_registry cp-src/clheir.cpp /^void init_registry(void)$/
+init_tool_bar_items c-src/emacs/src/keyboard.c /^init_tool_bar_items (Lisp_Object reuse)$/
+inita c.c /^static void inita () {}$/
+initb c.c /^static void initb () {}$/
+initial_kboard c-src/emacs/src/keyboard.c 84
+initialize-new-tags-table el-src/emacs/lisp/progmodes/etags.el /^(defun initialize-new-tags-table ()$/
+initialize_random_junk cccp.y /^initialize_random_junk ()$/
+initialize_random_junk y-src/cccp.y /^initialize_random_junk ()$/
+input-pending-p c-src/emacs/src/keyboard.c /^DEFUN ("input-pending-p", Finput_pending_p, Sinput/
+input_available_clear_time c-src/emacs/src/keyboard.c 324
+input_pending c-src/emacs/src/keyboard.c 239
+input_polling_used c-src/emacs/src/keyboard.c /^input_polling_used (void)$/
+input_was_pending c-src/emacs/src/keyboard.c 287
+insert-abbrev-table-description c-src/abbrev.c /^DEFUN ("insert-abbrev-table-description", Finsert_/
+insertname pas-src/common.pas /^function insertname;(*($/
+instr y-src/parse.y 80
+instr parse.y 80
+instruct c-src/etags.c 2527
+integer c-src/emacs/src/lisp.h 2127
+integer cccp.y 113
+integer y-src/cccp.y 112
+integer_overflow cccp.y /^integer_overflow ()$/
+integer_overflow y-src/cccp.y /^integer_overflow ()$/
+integertonmstr pas-src/common.pas /^function integertonmstr; (* (TheInteger : integer)/
+intensity1 f-src/entry.for /^ & intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+intensity1 f-src/entry.strange_suffix /^ & intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+intensity1 f-src/entry.strange /^ & intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+interface_locate c-src//c.c /^interface_locate(void)$/
+intern c-src/emacs/src/lisp.h /^intern (const char *str)$/
+intern_c_string c-src/emacs/src/lisp.h /^intern_c_string (const char *str)$/
+internal_last_event_frame c-src/emacs/src/keyboard.c 228
+interpreters c-src/etags.c 197
+interrupt_input c-src/emacs/src/keyboard.c 328
+interrupt_input_blocked c-src/emacs/src/keyboard.c 76
+interrupt_input_blocked c-src/emacs/src/lisp.h 3048
+interrupts_deferred c-src/emacs/src/keyboard.c 331
+intoken c-src/etags.c /^#define intoken(c) (_itk[CHAR (c)]) \/* c can be in/
+intspec c-src/emacs/src/lisp.h 1688
+intvar c-src/emacs/src/lisp.h 2277
+invalidate_nodes c-src/etags.c /^invalidate_nodes (fdesc *badfdp, node **npp)$/
+ipc3dChannelType cp-src/c.C 1
+ipc3dIslandHierarchy cp-src/c.C 1
+ipc3dLinkControl cp-src/c.C 1
+irregular_location cp-src/clheir.hpp 47
+irregular_location::irregular_location cp-src/clheir.hpp /^ irregular_location(double xi, double yi, doubl/
+irregular_location::x cp-src/clheir.hpp 49
+irregular_location::y cp-src/clheir.hpp 49
+irregular_location::z cp-src/clheir.hpp 49
+isComment php-src/lce_functions.php /^ function isComment($class)$/
+isHoliday cp-src/functions.cpp /^bool isHoliday ( Date d ){$/
+isLeap cp-src/functions.cpp /^bool isLeap ( int year ){$/
+is_curly_brace_form c-src/h.h 54
+is_explicit c-src/h.h 49
+is_func c-src/etags.c 221
+is_hor_space cccp.y 953
+is_hor_space y-src/cccp.y 953
+is_idchar cccp.y 948
+is_idchar y-src/cccp.y 948
+is_idstart cccp.y 950
+is_idstart y-src/cccp.y 950
+is_muldiv_operation cp-src/c.C /^is_muldiv_operation(pc)$/
+is_ordset prol-src/ordsets.prolog /^is_ordset(X) :- var(X), !, fail.$/
+iso_lispy_function_keys c-src/emacs/src/keyboard.c 5151
+isoperator prol-src/natded.prolog /^isoperator(Char):-$/
+isoptab prol-src/natded.prolog /^isoptab('%').$/
+iswhite c-src/etags.c /^#define iswhite(c) (_wht[CHAR (c)]) \/* c is white /
+item_properties c-src/emacs/src/keyboard.c 7568
+jmp c-src/emacs/src/lisp.h 3044
+just_read_file c-src/etags.c /^just_read_file (FILE *inf)$/
+kbd_buffer c-src/emacs/src/keyboard.c 291
+kbd_buffer_events_waiting c-src/emacs/src/keyboard.c /^kbd_buffer_events_waiting (void)$/
+kbd_buffer_get_event c-src/emacs/src/keyboard.c /^kbd_buffer_get_event (KBOARD **kbp,$/
+kbd_buffer_nr_stored c-src/emacs/src/keyboard.c /^kbd_buffer_nr_stored (void)$/
+kbd_buffer_store_event c-src/emacs/src/keyboard.c /^kbd_buffer_store_event (register struct input_even/
+kbd_buffer_store_event_hold c-src/emacs/src/keyboard.c /^kbd_buffer_store_event_hold (register struct input/
+kbd_buffer_store_help_event c-src/emacs/src/keyboard.c /^kbd_buffer_store_help_event (Lisp_Object frame, Li/
+kbd_buffer_unget_event c-src/emacs/src/keyboard.c /^kbd_buffer_unget_event (register struct input_even/
+kbd_fetch_ptr c-src/emacs/src/keyboard.c 297
+kbd_store_ptr c-src/emacs/src/keyboard.c 302
+kboard c-src/emacs/src/keyboard.c 860
+kboard_stack c-src/emacs/src/keyboard.c 858
+kboard_stack c-src/emacs/src/keyboard.c 864
+key_and_value c-src/emacs/src/lisp.h 1868
+keyremap c-src/emacs/src/keyboard.c 8742
+keyremap c-src/emacs/src/keyboard.c 8754
+keyremap_step c-src/emacs/src/keyboard.c /^keyremap_step (Lisp_Object *keybuf, int bufsize, v/
+keys_of_keyboard c-src/emacs/src/keyboard.c /^keys_of_keyboard (void)$/
+keyval prol-src/natded.prolog /^keyval(key(Key,Val)) --> [Key,'='], valseq(Val).$/
+keyvalcgi prol-src/natded.prolog /^keyvalcgi(Key,Val):-$/
+keyvalscgi prol-src/natded.prolog /^keyvalscgi(KeyVals),$/
+keyvalseq prol-src/natded.prolog /^keyvalseq([KeyVal|KeyVals]) --> $/
+keyword_parsing cccp.y 73
+keyword_parsing y-src/cccp.y 73
+keywords cccp.y 115
+keywords y-src/cccp.y 114
+keywords y-src/cccp.y 306
+kind c-src/emacs/src/keyboard.c 11024
+kind c-src/h.h 46
+kset_echo_string c-src/emacs/src/keyboard.c /^kset_echo_string (struct kboard *kb, Lisp_Object v/
+kset_kbd_queue c-src/emacs/src/keyboard.c /^kset_kbd_queue (struct kboard *kb, Lisp_Object val/
+kset_keyboard_translate_table c-src/emacs/src/keyboard.c /^kset_keyboard_translate_table (struct kboard *kb, /
+kset_last_prefix_arg c-src/emacs/src/keyboard.c /^kset_last_prefix_arg (struct kboard *kb, Lisp_Obje/
+kset_last_repeatable_command c-src/emacs/src/keyboard.c /^kset_last_repeatable_command (struct kboard *kb, L/
+kset_local_function_key_map c-src/emacs/src/keyboard.c /^kset_local_function_key_map (struct kboard *kb, Li/
+kset_overriding_terminal_local_map c-src/emacs/src/keyboard.c /^kset_overriding_terminal_local_map (struct kboard /
+kset_real_last_command c-src/emacs/src/keyboard.c /^kset_real_last_command (struct kboard *kb, Lisp_Ob/
+kset_system_key_syms c-src/emacs/src/keyboard.c /^kset_system_key_syms (struct kboard *kb, Lisp_Obje/
+lang c-src/etags.c 208
+lang c-src/etags.c 251
+lang c-src/etags.c 259
+lang_names c-src/etags.c 718
+language c-src/etags.c 199
+last-tag el-src/emacs/lisp/progmodes/etags.el /^(defvar last-tag nil$/
+last_abbrev_point c-src/abbrev.c 78
+last_auto_save c-src/emacs/src/keyboard.c 214
+last_heapinfo c-src/emacs/src/gmalloc.c 402
+last_mouse_button c-src/emacs/src/keyboard.c 5215
+last_mouse_x c-src/emacs/src/keyboard.c 5216
+last_mouse_y c-src/emacs/src/keyboard.c 5217
+last_non_minibuf_size c-src/emacs/src/keyboard.c 207
+last_point_position c-src/emacs/src/keyboard.c 217
+last_state_size c-src/emacs/src/gmalloc.c 401
+last_undo_boundary c-src/emacs/src/keyboard.c 1287
+lasta c.c 272
+lastargmargin tex-src/texinfo.tex /^\\newskip\\deflastargmargin \\deflastargmargin=18pt$/
+lastargmargin tex-src/texinfo.tex /^\\setbox0=\\hbox{\\hskip \\deflastargmargin{\\rm #2}\\hs/
+lastb c.c 278
+lb c-src/etags.c 2923
+lbs c-src/etags.c 2924
+lce php-src/lce_functions.php /^ function lce()$/
+lce php-src/lce_functions.php /^ function lce()$/
+lce_bindtextdomain php-src/lce_functions.php /^ function lce_bindtextdomain($d_name, $d_path/
+lce_bindtextdomain php-src/lce_functions.php /^ function lce_bindtextdomain($domain, $path)$/
+lce_dgettext php-src/lce_functions.php /^ function lce_dgettext($domain, $msgid)$/
+lce_dgettext php-src/lce_functions.php /^ function lce_dgettext($domain, $msgid)$/
+lce_geteditcode php-src/lce_functions.php /^ function lce_geteditcode($type, $name, $text, $r/
+lce_gettext php-src/lce_functions.php /^ function lce_gettext($msgid)$/
+lce_gettext php-src/lce_functions.php /^ function lce_gettext($msgid)$/
+lce_textdomain php-src/lce_functions.php /^ function lce_textdomain($domain)$/
+lce_textdomain php-src/lce_functions.php /^ function lce_textdomain($domain)$/
+leasqr html-src/software.html /^Leasqr$/
+left c-src/etags.c 216
+left_shift cccp.y /^left_shift (a, b)$/
+left_shift y-src/cccp.y /^left_shift (a, b)$/
+len c-src/etags.c 237
+length c-src/etags.c 2495
+length cccp.y 44
+length cccp.y 114
+length y-src/cccp.y 44
+length y-src/cccp.y 113
+letter tex-src/texinfo.tex /^\\chapmacro {#1}{Appendix \\appendixletter}%$/
+letter tex-src/texinfo.tex /^ {#1}{Appendix \\appendixletter}{\\noexpand\\folio}}/
+letter tex-src/texinfo.tex /^\\gdef\\thissection{#1}\\secheading {#1}{\\appendixlet/
+letter tex-src/texinfo.tex /^{#1}{\\appendixletter}{\\the\\secno}{\\noexpand\\folio}/
+letter tex-src/texinfo.tex /^\\subsecheading {#1}{\\appendixletter}{\\the\\secno}{\\/
+letter tex-src/texinfo.tex /^{#1}{\\appendixletter}{\\the\\secno}{\\the\\subsecno}{\\/
+letter tex-src/texinfo.tex /^ {\\appendixletter}{\\the\\secno}{\\the\\subsecno}{\\th/
+letter tex-src/texinfo.tex /^ {\\appendixletter}$/
+letter: tex-src/texinfo.tex /^\\xdef\\thischapter{Appendix \\appendixletter: \\noexp/
+level c-src/emacs/src/lisp.h 3153
+lex prol-src/natded.prolog /^lex(W,SynOut,Sem):-$/
+lexptr cccp.y 332
+lexptr y-src/cccp.y 332
+licenze html-src/softwarelibero.html /^Licenze d'uso di un programma$/
+line c-src/etags.c 2493
+line perl-src/htlmify-cystic 37
+line y-src/parse.y 86
+lineCount php-src/lce_functions.php /^ function lineCount($entry)$/
+linebuffer c-src/etags.c 239
+linebuffer_init c-src/etags.c /^linebuffer_init (linebuffer *lbp)$/
+linebuffer_setlen c-src/etags.c /^linebuffer_setlen (linebuffer *lbp, int toksize)$/
+lineno c-src/etags.c 2506
+lineno c-src/emacs/src/lisp.h 3147
+linepos c-src/etags.c 2507
+linepos c-src/etags.c 2922
+links html-src/software.html /^Links to interesting software$/
+lisp_eval_depth c-src/emacs/src/lisp.h 3045
+lisp_h_CHECK_LIST_CONS c-src/emacs/src/lisp.h /^#define lisp_h_CHECK_LIST_CONS(x, y) CHECK_TYPE (C/
+lisp_h_CHECK_NUMBER c-src/emacs/src/lisp.h /^#define lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGER/
+lisp_h_CHECK_SYMBOL c-src/emacs/src/lisp.h /^#define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP/
+lisp_h_CHECK_TYPE c-src/emacs/src/lisp.h /^#define lisp_h_CHECK_TYPE(ok, predicate, x) \\$/
+lisp_h_CONSP c-src/emacs/src/lisp.h /^#define lisp_h_CONSP(x) (XTYPE (x) == Lisp_Cons)$/
+lisp_h_EQ c-src/emacs/src/lisp.h /^#define lisp_h_EQ(x, y) (XLI (x) == XLI (y))$/
+lisp_h_FLOATP c-src/emacs/src/lisp.h /^#define lisp_h_FLOATP(x) (XTYPE (x) == Lisp_Float)/
+lisp_h_INTEGERP c-src/emacs/src/lisp.h /^#define lisp_h_INTEGERP(x) ((XTYPE (x) & (Lisp_Int/
+lisp_h_MARKERP c-src/emacs/src/lisp.h /^#define lisp_h_MARKERP(x) (MISCP (x) && XMISCTYPE /
+lisp_h_MISCP c-src/emacs/src/lisp.h /^#define lisp_h_MISCP(x) (XTYPE (x) == Lisp_Misc)$/
+lisp_h_NILP c-src/emacs/src/lisp.h /^#define lisp_h_NILP(x) EQ (x, Qnil)$/
+lisp_h_SET_SYMBOL_VAL c-src/emacs/src/lisp.h /^#define lisp_h_SET_SYMBOL_VAL(sym, v) \\$/
+lisp_h_SYMBOLP c-src/emacs/src/lisp.h /^#define lisp_h_SYMBOLP(x) (XTYPE (x) == Lisp_Symbo/
+lisp_h_SYMBOL_CONSTANT_P c-src/emacs/src/lisp.h /^#define lisp_h_SYMBOL_CONSTANT_P(sym) (XSYMBOL (sy/
+lisp_h_SYMBOL_VAL c-src/emacs/src/lisp.h /^#define lisp_h_SYMBOL_VAL(sym) \\$/
+lisp_h_VECTORLIKEP c-src/emacs/src/lisp.h /^#define lisp_h_VECTORLIKEP(x) (XTYPE (x) == Lisp_V/
+lisp_h_XCAR c-src/emacs/src/lisp.h /^#define lisp_h_XCAR(c) XCONS (c)->car$/
+lisp_h_XCDR c-src/emacs/src/lisp.h /^#define lisp_h_XCDR(c) XCONS (c)->u.cdr$/
+lisp_h_XCONS c-src/emacs/src/lisp.h /^#define lisp_h_XCONS(a) \\$/
+lisp_h_XFASTINT c-src/emacs/src/lisp.h /^# define lisp_h_XFASTINT(a) XINT (a)$/
+lisp_h_XHASH c-src/emacs/src/lisp.h /^#define lisp_h_XHASH(a) XUINT (a)$/
+lisp_h_XIL c-src/emacs/src/lisp.h /^# define lisp_h_XIL(i) ((Lisp_Object) { i })$/
+lisp_h_XIL c-src/emacs/src/lisp.h /^# define lisp_h_XIL(i) (i)$/
+lisp_h_XINT c-src/emacs/src/lisp.h /^# define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)$/
+lisp_h_XLI c-src/emacs/src/lisp.h /^# define lisp_h_XLI(o) ((o).i)$/
+lisp_h_XLI c-src/emacs/src/lisp.h /^# define lisp_h_XLI(o) (o)$/
+lisp_h_XPNTR c-src/emacs/src/lisp.h /^#define lisp_h_XPNTR(a) \\$/
+lisp_h_XSYMBOL c-src/emacs/src/lisp.h /^# define lisp_h_XSYMBOL(a) \\$/
+lisp_h_XTYPE c-src/emacs/src/lisp.h /^# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a/
+lisp_h_XUNTAG c-src/emacs/src/lisp.h /^# define lisp_h_XUNTAG(a, type) ((void *) (intptr_/
+lisp_h_check_cons_list c-src/emacs/src/lisp.h /^# define lisp_h_check_cons_list() ((void) 0)$/
+lisp_h_make_number c-src/emacs/src/lisp.h /^# define lisp_h_make_number(n) \\$/
+lispy_accent_codes c-src/emacs/src/keyboard.c 4634
+lispy_accent_keys c-src/emacs/src/keyboard.c 4741
+lispy_drag_n_drop_names c-src/emacs/src/keyboard.c 5181
+lispy_function_keys c-src/emacs/src/keyboard.c 4768
+lispy_function_keys c-src/emacs/src/keyboard.c 5065
+lispy_kana_keys c-src/emacs/src/keyboard.c 5026
+lispy_modifier_list c-src/emacs/src/keyboard.c /^lispy_modifier_list (int modifiers)$/
+lispy_multimedia_keys c-src/emacs/src/keyboard.c 4962
+lispy_wheel_names c-src/emacs/src/keyboard.c 5174
+list c-src/emacs/src/gmalloc.c 186
+list-tags el-src/emacs/lisp/progmodes/etags.el /^(defun list-tags (file &optional _next-match)$/
+list-tags-function el-src/emacs/lisp/progmodes/etags.el /^(defvar list-tags-function nil$/
+list2i c-src/emacs/src/lisp.h /^list2i (EMACS_INT x, EMACS_INT y)$/
+list3i c-src/emacs/src/lisp.h /^list3i (EMACS_INT x, EMACS_INT y, EMACS_INT w)$/
+list4i c-src/emacs/src/lisp.h /^list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMA/
+list_to_ord_set prol-src/ordsets.prolog /^list_to_ord_set(List, Set) :-$/
+lno c-src/etags.c 223
+load objc-src/PackInsp.m /^-load$/
+loadContentsOf:inTable: objc-src/PackInsp.m /^-loadContentsOf:(const char *)type inTable:(HashTa/
+loadImage objc-src/PackInsp.m /^-loadImage$/
+loadKeyValuesFrom:inTable: objc-src/PackInsp.m /^-loadKeyValuesFrom:(const char *)type inTable:(Has/
+loadPORManager php-src/lce_functions.php /^ function &loadPORManager()$/
+local_if_set c-src/emacs/src/lisp.h 2338
+location cp-src/clheir.hpp 33
+location::location cp-src/clheir.hpp /^ location() { }$/
+lookup cccp.y /^lookup (name, len, hash)$/
+lookup y-src/cccp.y /^lookup (name, len, hash)$/
+lowcase c-src/etags.c /^#define lowcase(c) tolower (CHAR (c))$/
+lucid_event_type_list_p c-src/emacs/src/keyboard.c /^lucid_event_type_list_p (Lisp_Object object)$/
+mabort c-src/emacs/src/gmalloc.c /^mabort (enum mcheck_status status)$/
+mach_host_self c-src/machsyscalls.h /^SYSCALL (mach_host_self, -29,$/
+mach_msg_trap c-src/machsyscalls.h /^SYSCALL (mach_msg_trap, -25,$/
+mach_reply_port c-src/machsyscalls.h /^SYSCALL (mach_reply_port, -26,$/
+mach_task_self c-src/machsyscalls.h /^SYSCALL (mach_task_self, -28,$/
+mach_thread_self c-src/machsyscalls.h /^SYSCALL (mach_thread_self, -27,$/
+magic c-src/emacs/src/gmalloc.c 1863
+main::f1 perl-src/kai-test.pl /^sub f1 {$/
+main::f2 perl-src/kai-test.pl /^sub main::f2 {$/
+main::f7 perl-src/kai-test.pl /^sub f7 {$/
+main::file_end perl-src/htlmify-cystic /^sub file_end ()$/
+main::finish_appendices perl-src/htlmify-cystic /^sub finish_appendices ()$/
+main::finish_sections perl-src/htlmify-cystic /^sub finish_sections ()$/
+main::finish_subsections perl-src/htlmify-cystic /^sub finish_subsections ()$/
+main::finish_subsubsections perl-src/htlmify-cystic /^sub finish_subsubsections ()$/
+main::getopt perl-src/yagrip.pl /^sub getopt {$/
+main::read_toc perl-src/htlmify-cystic /^sub read_toc ()$/
+main::section_href perl-src/htlmify-cystic /^sub section_href ($)$/
+main::section_name perl-src/htlmify-cystic /^sub section_name ($)$/
+main::section_url perl-src/htlmify-cystic /^sub section_url ()$/
+main::section_url_base perl-src/htlmify-cystic /^sub section_url_base ()$/
+main::section_url_name perl-src/htlmify-cystic /^sub section_url_name ()$/
+main::toc_line perl-src/htlmify-cystic /^sub toc_line ($)$/
+main::usage perl-src/yagrip.pl /^sub usage {$/
+make-abbrev-table c-src/abbrev.c /^DEFUN ("make-abbrev-table", Fmake_abbrev_table, Sm/
+make_C_tag c-src/etags.c /^make_C_tag (bool isfun)$/
+make_coor prol-src/natded.prolog /^make_coor(s(_),Alpha,Sem1,Sem2,Alpha@Sem1@Sem2).$/
+make_ctrl_char c-src/emacs/src/keyboard.c /^make_ctrl_char (int c)$/
+make_fixnum_or_float c-src/emacs/src/lisp.h /^#define make_fixnum_or_float(val) \\$/
+make_formatted_string c-src/emacs/src/lisp.h /^extern Lisp_Object make_formatted_string (char *, /
+make_lisp_ptr c-src/emacs/src/lisp.h /^make_lisp_ptr (void *ptr, enum Lisp_Type type)$/
+make_lisp_symbol c-src/emacs/src/lisp.h /^make_lisp_symbol (struct Lisp_Symbol *sym)$/
+make_lispy_event c-src/emacs/src/keyboard.c /^make_lispy_event (struct input_event *event)$/
+make_lispy_focus_in c-src/emacs/src/keyboard.c /^make_lispy_focus_in (Lisp_Object frame)$/
+make_lispy_focus_out c-src/emacs/src/keyboard.c /^make_lispy_focus_out (Lisp_Object frame)$/
+make_lispy_movement c-src/emacs/src/keyboard.c /^make_lispy_movement (struct frame *frame, Lisp_Obj/
+make_lispy_position c-src/emacs/src/keyboard.c /^make_lispy_position (struct frame *f, Lisp_Object /
+make_lispy_switch_frame c-src/emacs/src/keyboard.c /^make_lispy_switch_frame (Lisp_Object frame)$/
+make_number c-src/emacs/src/lisp.h /^# define make_number(n) lisp_h_make_number (n)$/
+make_pointer_integer c-src/emacs/src/lisp.h /^make_pointer_integer (void *p)$/
+make_scroll_bar_position c-src/emacs/src/keyboard.c /^make_scroll_bar_position (struct input_event *ev, /
+make_tag c-src/etags.c /^make_tag (const char *name, \/* tag name, or NULL /
+make_uninit_sub_char_table c-src/emacs/src/lisp.h /^make_uninit_sub_char_table (int depth, int min_cha/
+make_uninit_vector c-src/emacs/src/lisp.h /^make_uninit_vector (ptrdiff_t size)$/
+malloc c-src/emacs/src/gmalloc.c 64
+malloc c-src/emacs/src/gmalloc.c 68
+malloc c-src/emacs/src/gmalloc.c /^extern void *malloc (size_t size) ATTRIBUTE_MALLOC/
+malloc c-src/emacs/src/gmalloc.c /^malloc (size_t size)$/
+malloc c-src/emacs/src/gmalloc.c 1715
+malloc_atfork_handler_child c-src/emacs/src/gmalloc.c /^malloc_atfork_handler_child (void)$/
+malloc_atfork_handler_parent c-src/emacs/src/gmalloc.c /^malloc_atfork_handler_parent (void)$/
+malloc_atfork_handler_prepare c-src/emacs/src/gmalloc.c /^malloc_atfork_handler_prepare (void)$/
+malloc_enable_thread c-src/emacs/src/gmalloc.c /^malloc_enable_thread (void)$/
+malloc_info c-src/emacs/src/gmalloc.c 167
+malloc_initialize_1 c-src/emacs/src/gmalloc.c /^malloc_initialize_1 (void)$/
+mallochook c-src/emacs/src/gmalloc.c /^mallochook (size_t size)$/
+mao c-src/h.h 101
+map c-src/emacs/src/keyboard.c 8748
+map_word prol-src/natded.prolog /^map_word([[_]|Ws],Exp):-$/
+mapping html-src/algrthms.html /^Mapping the Channel Symbols$/
+mapsyn prol-src/natded.prolog /^mapsyn(A\/B,AM\/BM):-$/
+mark_kboards c-src/emacs/src/keyboard.c /^mark_kboards (void)$/
+max c.c /^max (int a, int b)$/
+max c.c /^__attribute__ ((always_inline)) max (int a, int b)/
+max c-src/emacs/src/lisp.h 58
+max c-src/emacs/src/lisp.h /^#define max(a, b) ((a) > (b) ? (a) : (b))$/
+max cp-src/conway.cpp /^#define max(x,y) ((x > y) ? x : y)$/
+max_args c-src/emacs/src/lisp.h 1686
+max_num_directions cp-src/clheir.hpp 31
+max_num_generic_objects cp-src/clheir.cpp 9
+maxargs c-src/emacs/src/lisp.h 2831
+maybe_gc c-src/emacs/src/lisp.h /^maybe_gc (void)$/
+mcheck c-src/emacs/src/gmalloc.c /^mcheck (void (*func) (enum mcheck_status))$/
+mcheck_status c-src/emacs/src/gmalloc.c 283
+mcheck_used c-src/emacs/src/gmalloc.c 2012
+memalign c-src/emacs/src/gmalloc.c /^memalign (size_t alignment, size_t size)$/
+member prol-src/natded.prolog /^member(X,[X|_]).$/
+memclear c-src/emacs/src/lisp.h /^memclear (void *p, ptrdiff_t nbytes)$/
+menu_bar_item c-src/emacs/src/keyboard.c /^menu_bar_item (Lisp_Object key, Lisp_Object item, /
+menu_bar_items c-src/emacs/src/keyboard.c /^menu_bar_items (Lisp_Object old)$/
+menu_bar_items_index c-src/emacs/src/keyboard.c 7369
+menu_bar_items_vector c-src/emacs/src/keyboard.c 7368
+menu_bar_one_keymap_changed_items c-src/emacs/src/keyboard.c 7363
+menu_item_eval_property c-src/emacs/src/keyboard.c /^menu_item_eval_property (Lisp_Object sexpr)$/
+menu_item_eval_property_1 c-src/emacs/src/keyboard.c /^menu_item_eval_property_1 (Lisp_Object arg)$/
+menu_separator_name_p c-src/emacs/src/keyboard.c /^menu_separator_name_p (const char *label)$/
+metasource c-src/etags.c 198
+min c-src/emacs/src/gmalloc.c /^#define min(a, b) ((a) < (b) ? (a) : (b))$/
+min c-src/emacs/src/lisp.h 57
+min c-src/emacs/src/lisp.h /^#define min(a, b) ((a) < (b) ? (a) : (b))$/
+min cp-src/conway.cpp /^#define min(x,y) ((x > y) ? y : x)$/
+min_args c-src/emacs/src/lisp.h 1686
+min_char c-src/emacs/src/lisp.h 1621
+miti html-src/softwarelibero.html /^Sfatiamo alcuni miti$/
+modifier_names c-src/emacs/src/keyboard.c 6319
+modifier_symbols c-src/emacs/src/keyboard.c 6327
+modify_event_symbol c-src/emacs/src/keyboard.c /^modify_event_symbol (ptrdiff_t symbol_num, int mod/
+more_aligned_int c.c 165
+morecore_nolock c-src/emacs/src/gmalloc.c /^morecore_nolock (size_t size)$/
+morecore_recursing c-src/emacs/src/gmalloc.c 604
+mouse_syms c-src/emacs/src/keyboard.c 4627
+mprobe c-src/emacs/src/gmalloc.c /^mprobe (void *ptr)$/
+msgid php-src/lce_functions.php /^ function msgid($line, $class)$/
+msgstr php-src/lce_functions.php /^ function msgstr($line, $class)$/
+mstats c-src/emacs/src/gmalloc.c 308
+mt prol-src/natded.prolog /^mt:-$/
+mtg html-src/software.html /^MTG$/
+multi_line c-src/etags.c 267
+multibyte c-src/emacs/src/regex.h 403
+my_printf c.c /^my_printf (void *my_object, const char *my_format,/
+my_struct c.c 226
+my_struct c-src/h.h 91
+my_typedef c.c 228
+my_typedef c-src/h.h 93
+n c-src/exit.c 28
+n c-src/exit.strange_suffix 28
+name c-src/getopt.h 76
+name c-src/getopt.h 78
+name c-src/etags.c 192
+name c-src/etags.c 218
+name c-src/etags.c 261
+name c-src/etags.c 2271
+name c-src/emacs/src/keyboard.c 7241
+name c-src/emacs/src/lisp.h 1808
+name c-src/emacs/src/lisp.h 3144
+name perl-src/htlmify-cystic 357
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{#1}\\defunargs{#3}\\endgrou/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#1}{Function}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {\\code{#1} #2}{Function}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {\\code{#2} #3}{#1}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#1}{Macro}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#1}{Special Form}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{\\defoptype{} on #1}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{Method on #1}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{\\defcvtype{} of #1}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{Instance Variable of #1}%/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{#1}\\defvarargs{#3}\\endgro/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#1}{Variable}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#1}{User Option}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {\\code{#1} #2}{Variable}%$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {\\code{#2} #3}{#1}$/
+name tex-src/texinfo.tex /^\\begingroup\\defname {#2}{#1}\\deftpargs{#3}\\endgrou/
+name cccp.y 43
+name cccp.y 114
+name cccp.y 114
+name y-src/cccp.y 43
+name y-src/cccp.y 113
+name y-src/cccp.y 113
+named c-src/etags.c 2505
+namestringequal pas-src/common.pas /^function namestringequal;(*(var Name1,Name2 : Name/
+nestlev c-src/etags.c 2525
+new objc-src/PackInsp.m /^+new$/
+new perl-src/htlmify-cystic 163
+new_tag perl-src/htlmify-cystic 18
+newlb c-src/etags.c 2930
+newlinepos c-src/etags.c 2932
+newtextstring pas-src/common.pas /^function newtextstring; (*: TextString;*)$/
+next c.c 174
+next c-src/etags.c 203
+next c-src/emacs/src/gmalloc.c 164
+next c-src/emacs/src/gmalloc.c 188
+next c-src/emacs/src/gmalloc.c 198
+next c-src/emacs/src/keyboard.c 861
+next c-src/emacs/src/keyboard.c 7246
+next c-src/emacs/src/lisp.h 700
+next c-src/emacs/src/lisp.h 1848
+next c-src/emacs/src/lisp.h 2192
+next c-src/emacs/src/lisp.h 3028
+next c-src/emacs/src/lisp.h 3134
+next cccp.y 42
+next y-src/cccp.y 42
+next-file el-src/emacs/lisp/progmodes/etags.el /^(defun next-file (&optional initialize novisit)$/
+next-file-list el-src/emacs/lisp/progmodes/etags.el /^(defvar next-file-list nil$/
+next_almost_prime c-src/emacs/src/lisp.h /^extern EMACS_INT next_almost_prime (EMACS_INT) ATT/
+next_free c-src/emacs/src/lisp.h 1851
+next_weak c-src/emacs/src/lisp.h 1875
+nextfree c-src/emacs/src/lisp.h 3029
+nfree c-src/emacs/src/gmalloc.c 150
+nl c-src/etags.c 2521
+no tex-src/texinfo.tex /^\\newcount \\appendixno \\appendixno = `\\@$/
+no tex-src/texinfo.tex /^\\global\\advance \\appendixno by 1 \\message{Appendix/
+no tex-src/texinfo.tex /^\\ifnum\\secno=0 Appendix\\xreftie'char\\the\\appendixn/
+no.\the\secno tex-src/texinfo.tex /^\\else \\ifnum \\subsecno=0 Section\\xreftie'char\\the\\/
+no.\the\secno.\the\subsecno tex-src/texinfo.tex /^Section\\xreftie'char\\the\\appendixno.\\the\\secno.\\th/
+no.\the\secno.\the\subsecno.\the\subsubsecno tex-src/texinfo.tex /^Section\\xreftie'char\\the\\appendixno.\\the\\secno.\\th/
+no_argument c-src/getopt.h 89
+no_lang_help c-src/etags.c 707
+no_sub c-src/emacs/src/regex.h 387
+nocase_tail c-src/etags.c /^nocase_tail (const char *cp)$/
+node c-src/etags.c 225
+node_st c-src/etags.c 214
+noderef tex-src/texinfo.tex /^\\appendixnoderef %$/
+noderef tex-src/texinfo.tex /^\\appendixnoderef %$/
+noderef tex-src/texinfo.tex /^\\appendixnoderef %$/
+noderef tex-src/texinfo.tex /^\\appendixnoderef %$/
+nofonts tex-src/texinfo.tex /^{\\indexnofonts$/
+nofonts tex-src/texinfo.tex /^{\\indexnofonts$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+nofonts% tex-src/texinfo.tex /^{\\chapternofonts%$/
+none_help c-src/etags.c 703
+normalize prol-src/natded.prolog /^normalize(M,MNorm):-$/
+normalize_fresh prol-src/natded.prolog /^normalize_fresh(M,N):-$/
+normalize_tree prol-src/natded.prolog /^normalize_tree(tree(Rule,Syn:Sem,Trees),$/
+normalize_trees prol-src/natded.prolog /^normalize_trees([],[]).$/
+nosave pyt-src/server.py /^ def nosave(self):$/
+nosave pyt-src/server.py /^ def nosave(self):$/
+nosave pyt-src/server.py /^ def nosave(self):$/
+not_bol c-src/emacs/src/regex.h 391
+not_eol c-src/emacs/src/regex.h 394
+not_single_kboard_state c-src/emacs/src/keyboard.c /^not_single_kboard_state (KBOARD *kboard)$/
+notag2 c-src/torture.c 26
+notag2 c-src/dostorture.c 26
+notag4 c-src/torture.c 45
+notag4 c-src/dostorture.c 45
+notinname c-src/etags.c /^#define notinname(c) (_nin[CHAR (c)]) \/* c is not /
+npending c-src/emacs/src/keyboard.c 7244
+ntool_bar_items c-src/emacs/src/keyboard.c 7974
+numOfChannels cp-src/c.C 1
+num_columns cp-src/conway.cpp 16
+num_input_events c-src/emacs/src/keyboard.c 210
+num_regs c-src/emacs/src/regex.h 430
+num_rows cp-src/conway.cpp 15
+numberKeys: objcpp-src/SimpleCalc.M /^- numberKeys:sender$/
+number_len c-src/etags.c /^static int number_len (long) ATTRIBUTE_CONST;$/
+numbervars prol-src/natded.prolog /^numbervars(X):-$/
+nvars c-src/emacs/src/lisp.h 3140
+objdef c-src/etags.c 2484
+object c-src/emacs/src/lisp.h 2128
+object_registry cp-src/clheir.cpp 10
+objtag c-src/etags.c 2453
+objvar c-src/emacs/src/lisp.h 2297
+obstack_chunk_alloc y-src/parse.y 46
+obstack_chunk_alloc parse.y 46
+obstack_chunk_free y-src/parse.y 47
+obstack_chunk_free parse.y 47
+ocatseen c-src/etags.c 2477
+octave_MDiagArray2_h cp-src/MDiagArray2.h 29
+octave_Range_h cp-src/Range.h 24
+offset c-src/etags.c 2494
+offset c-src/emacs/src/lisp.h 2305
+offset c-src/emacs/src/lisp.h 2365
+oignore c-src/etags.c 2483
+oimplementation c-src/etags.c 2474
+oinbody c-src/etags.c 2478
+ok: objc-src/PackInsp.m /^-ok:sender$/
+ok_to_echo_at_next_pause c-src/emacs/src/keyboard.c 159
+omethodcolon c-src/etags.c 2481
+omethodparm c-src/etags.c 2482
+omethodsign c-src/etags.c 2479
+omethodtag c-src/etags.c 2480
+onone c-src/etags.c 2472
+oparenseen c-src/etags.c 2476
+open-dribble-file c-src/emacs/src/keyboard.c /^DEFUN ("open-dribble-file", Fopen_dribble_file, So/
+open: objc-src/PackInsp.m /^-open:sender$/
+openInWorkspace objc-src/PackInsp.m /^static void openInWorkspace(const char *filename)$/
+operationKeys: objcpp-src/SimpleCalc.M /^- operationKeys:sender$/
+operator cccp.y 438
+operator y-src/cccp.y 438
+operator - cp-src/c.C /^void operator -(int, int) {}$/
+operator << cp-src/functions.cpp /^ostream& operator << ( ostream &c, Date d ) {$/
+operator >> cp-src/functions.cpp /^istream& operator >> ( istream &i, Date & dd ){$/
+operator int cp-src/c.C /^void operator int(int, int) {}$/
+operator+ cp-src/c.C /^void operator+(int, int) {}$/
+opparsebody\Edefop\defopx\defopheader\defoptype tex-src/texinfo.tex /^\\defopparsebody\\Edefop\\defopx\\defopheader\\defoptyp/
+oprotocol c-src/etags.c 2473
+option c-src/getopt.h 73
+optional_argument c-src/getopt.h 91
+opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype tex-src/texinfo.tex /^\\defopvarparsebody\\Edefcv\\defcvx\\defcvarheader\\def/
+ord_add_element prol-src/ordsets.prolog /^ord_add_element([], Element, [Element]).$/
+ord_del_element prol-src/ordsets.prolog /^ord_del_element([], _, []).$/
+ord_disjoint prol-src/ordsets.prolog /^ord_disjoint(Set1, Set2) :-$/
+ord_intersect prol-src/ordsets.prolog /^ord_intersect([Head1|Tail1], [Head2|Tail2]) :-$/
+ord_intersection prol-src/ordsets.prolog /^ord_intersection([], _, []).$/
+ord_intersection prol-src/ordsets.prolog /^ord_intersection([], Set2, [], Set2).$/
+ord_intersection prol-src/ordsets.prolog /^ord_intersection(Sets, Intersection) :- $/
+ord_intersection2 prol-src/ordsets.prolog /^ord_intersection2(1, [Set|Sets], Set0, Sets0) :- !/
+ord_intersection3 prol-src/ordsets.prolog /^ord_intersection3(<, _, Set1, Head2, Tail2, Inters/
+ord_intersection4 prol-src/ordsets.prolog /^ord_intersection4(<, _, Set1, Head2, Tail2, Inters/
+ord_member prol-src/ordsets.prolog /^ord_member(X, [E|Es]) :-$/
+ord_seteq prol-src/ordsets.prolog /^ord_seteq(Set1, Set2) :-$/
+ord_setproduct prol-src/ordsets.prolog /^ord_setproduct([], _, []).$/
+ord_subset prol-src/ordsets.prolog /^ord_subset([], _).$/
+ord_subtract prol-src/ordsets.prolog /^ord_subtract(Set1, Set2, Union) :-$/
+ord_symdiff prol-src/ordsets.prolog /^ord_symdiff([], Set2, Set2).$/
+ord_union prol-src/ordsets.prolog /^ord_union(Set1, Set2, Union) :-$/
+ord_union prol-src/ordsets.prolog /^ord_union([], Union) :- !, Union = [].$/
+ord_union4 prol-src/ordsets.prolog /^ord_union4(<, Head, Set1, Head2, Tail2, [Head|Unio/
+ord_union_all prol-src/ordsets.prolog /^ord_union_all(1, [Set|Sets], Set, Sets) :- !.$/
+oss html-src/softwarelibero.html /^Il movimento open source$/
+otagseen c-src/etags.c 2475
+output_file perl-src/htlmify-cystic 35
+output_files perl-src/htlmify-cystic 32
+outputtable html-src/algrthms.html /^Output$/
+outsyn prol-src/natded.prolog /^outsyn(['Any'],_).$/
+p c-src/emacs/src/lisp.h 4673
+p c-src/emacs/src/lisp.h 4679
+p/f ada-src/etags-test-for.ada /^ function p pragma Import (C,$/
+p/f ada-src/etags-test-for.ada /^function p ("p");$/
+pD c-src/emacs/src/lisp.h 165
+pD c-src/emacs/src/lisp.h 167
+pD c-src/emacs/src/lisp.h 169
+pD c-src/emacs/src/lisp.h 171
+pI c-src/emacs/src/lisp.h 94
+pI c-src/emacs/src/lisp.h 99
+pI c-src/emacs/src/lisp.h 106
+pMd c-src/emacs/src/lisp.h 150
+pMd c-src/emacs/src/lisp.h 155
+pMu c-src/emacs/src/lisp.h 151
+pMu c-src/emacs/src/lisp.h 156
+p_next c-src/etags.c 258
+pagesize c-src/emacs/src/gmalloc.c 1703
+parent c-src/emacs/src/keyboard.c 8745
+parent c-src/emacs/src/lisp.h 1590
+parse prol-src/natded.prolog /^parse(Ws,Cat):-$/
+parseFromVars php-src/lce_functions.php /^ function parseFromVars($prefix)$/
+parse_c_expression cccp.y /^parse_c_expression (string)$/
+parse_c_expression y-src/cccp.y /^parse_c_expression (string)$/
+parse_cgi prol-src/natded.prolog /^parse_cgi(TokenList,KeyVals):-$/
+parse_error y-src/parse.y 81
+parse_error parse.y 81
+parse_escape cccp.y /^parse_escape (string_ptr)$/
+parse_escape y-src/cccp.y /^parse_escape (string_ptr)$/
+parse_hash y-src/parse.y 63
+parse_hash parse.y 63
+parse_menu_item c-src/emacs/src/keyboard.c /^parse_menu_item (Lisp_Object item, int inmenubar)$/
+parse_modifiers c-src/emacs/src/keyboard.c /^parse_modifiers (Lisp_Object symbol)$/
+parse_modifiers_uncached c-src/emacs/src/keyboard.c /^parse_modifiers_uncached (Lisp_Object symbol, ptrd/
+parse_number cccp.y /^parse_number (olen)$/
+parse_number y-src/cccp.y /^parse_number (olen)$/
+parse_return y-src/parse.y 73
+parse_return parse.y 73
+parse_return_error cccp.y 70
+parse_return_error y-src/cccp.y 70
+parse_solitary_modifier c-src/emacs/src/keyboard.c /^parse_solitary_modifier (Lisp_Object symbol)$/
+parse_tool_bar_item c-src/emacs/src/keyboard.c /^parse_tool_bar_item (Lisp_Object key, Lisp_Object /
+pat c-src/etags.c 262
+pattern c-src/etags.c 260
+pdlcount c-src/emacs/src/lisp.h 3046
+pending-delete-mode el-src/TAGTEST.EL /^(defalias 'pending-delete-mode 'delete-selection-m/
+pending_funcalls c-src/emacs/src/keyboard.c 4377
+pending_signals c-src/emacs/src/keyboard.c 80
+pfatal c-src/etags.c /^pfatal (const char *s1)$/
+pfdset c-src/h.h 57
+pfnote c-src/etags.c /^pfnote (char *name, bool is_func, char *linestart,/
+plain_C_entries c-src/etags.c /^plain_C_entries (FILE *inf)$/
+plain_C_suffixes c-src/etags.c 643
+plainc c-src/etags.c 2934
+plist c-src/emacs/src/lisp.h 697
+plusvalseq prol-src/natded.prolog /^plusvalseq([]) --> [].$/
+pointer c-src/emacs/src/lisp.h 2125
+poll_for_input c-src/emacs/src/keyboard.c /^poll_for_input (struct atimer *timer)$/
+poll_for_input_1 c-src/emacs/src/keyboard.c /^poll_for_input_1 (void)$/
+poll_suppress_count c-src/emacs/src/keyboard.c 1908
+poll_suppress_count c-src/emacs/src/lisp.h 3047
+poll_timer c-src/emacs/src/keyboard.c 1915
+pop-tag-mark el-src/emacs/lisp/progmodes/etags.el /^(defalias 'pop-tag-mark 'xref-pop-marker-stack)$/
+pop_kboard c-src/emacs/src/keyboard.c /^pop_kboard (void)$/
+popclass_above c-src/etags.c /^popclass_above (int bracelev)$/
+position_to_Time c-src/emacs/src/keyboard.c /^position_to_Time (ptrdiff_t pos)$/
+posix_memalign c-src/emacs/src/gmalloc.c /^posix_memalign (void **memptr, size_t alignment, s/
+posn-at-point c-src/emacs/src/keyboard.c /^DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_p/
+posn-at-x-y c-src/emacs/src/keyboard.c /^DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, /
+possible_sum_sign cccp.y /^#define possible_sum_sign(a, b, sum) ((((a) ^ (b))/
+possible_sum_sign y-src/cccp.y /^#define possible_sum_sign(a, b, sum) ((((a) ^ (b))/
+post pyt-src/server.py /^ def post(self):$/
+post pyt-src/server.py /^ def post(self):$/
+pot_etags_version c-src/etags.c 81
+pp1 c-src/torture.c /^int pp1($/
+pp1 c-src/dostorture.c /^int pp1($/
+pp2 c-src/torture.c /^pp2$/
+pp2 c-src/dostorture.c /^pp2$/
+pp3 c-src/torture.c /^pp3(int bar)$/
+pp3 c-src/dostorture.c /^pp3(int bar)$/
+pp_bas_cat prol-src/natded.prolog /^pp_bas_cat(Cat):-$/
+pp_cat prol-src/natded.prolog /^pp_cat(Syn:Sem):-$/
+pp_exp prol-src/natded.prolog /^pp_exp('NIL'):-$/
+pp_exps prol-src/natded.prolog /^pp_exps([]).$/
+pp_html_fitch_tree prol-src/natded.prolog /^pp_html_fitch_tree(tree(der,Root,[ders(Words)]),M,/
+pp_html_table_fitch_tree prol-src/natded.prolog /^pp_html_table_fitch_tree(T):-$/
+pp_html_table_tree prol-src/natded.prolog /^pp_html_table_tree(T):-$/
+pp_html_tree prol-src/natded.prolog /^pp_html_tree(ass(Syn,V,'$VAR'(N))):-$/
+pp_html_trees prol-src/natded.prolog /^pp_html_trees([T|Ts],N,M):-$/
+pp_lam prol-src/natded.prolog /^pp_lam(Var^Alpha):-$/
+pp_lam_bracket prol-src/natded.prolog /^pp_lam_bracket(A^B):-$/
+pp_lam_paren prol-src/natded.prolog /^pp_lam_paren(Var^Alpha):-$/
+pp_paren prol-src/natded.prolog /^pp_paren(C):-$/
+pp_rule prol-src/natded.prolog /^pp_rule(fe):-write('\/E').$/
+pp_syn prol-src/natded.prolog /^pp_syn(A\/B):-$/
+pp_syn_back prol-src/natded.prolog /^pp_syn_back(A\/B):-$/
+pp_syn_paren prol-src/natded.prolog /^pp_syn_paren(A\/B):-$/
+pp_tree prol-src/natded.prolog /^pp_tree(T):-$/
+pp_trees prol-src/natded.prolog /^pp_trees([T|Ts],Column):-$/
+pp_word prol-src/natded.prolog /^pp_word(W):-$/
+pp_word_list prol-src/natded.prolog /^pp_word_list([]).$/
+pp_word_list_rest prol-src/natded.prolog /^pp_word_list_rest([]).$/
+predicate c-src/emacs/src/lisp.h 2307
+prev c.c 175
+prev c-src/emacs/src/gmalloc.c 165
+prev c-src/emacs/src/gmalloc.c 189
+prev c-src/emacs/src/lisp.h 2191
+printClassification php-src/lce_functions.php /^ function printClassification()$/
+print_help c-src/etags.c /^print_help (argument *argbuffer)$/
+print_language_names c-src/etags.c /^print_language_names (void)$/
+print_version c-src/etags.c /^print_version (void)$/
+printmax_t c-src/emacs/src/lisp.h 148
+printmax_t c-src/emacs/src/lisp.h 153
+proc c-src/h.h 87
+process_file c-src/etags.c /^process_file (FILE *fh, char *fn, language *lang)$/
+process_file_name c-src/etags.c /^process_file_name (char *file, language *lang)$/
+process_pending_signals c-src/emacs/src/keyboard.c /^process_pending_signals (void)$/
+process_special_events c-src/emacs/src/keyboard.c /^process_special_events (void)$/
+process_tool_bar_item c-src/emacs/src/keyboard.c /^process_tool_bar_item (Lisp_Object key, Lisp_Objec/
+prolog_atom c-src/etags.c /^prolog_atom (char *s, size_t pos)$/
+prolog_pr c-src/etags.c /^prolog_pr (char *s, char *last)$/
+prolog_skip_comment c-src/etags.c /^prolog_skip_comment (linebuffer *plb, FILE *inf)$/
+prop c-src/etags.c 209
+protect_malloc_state c-src/emacs/src/gmalloc.c /^protect_malloc_state (int protect_p)$/
+pthread_mutexattr_setprio_ceiling/f ada-src/2ataspri.adb /^ function pthread_mutexattr_setprio_ceiling$/
+pthread_mutexattr_setprotocol/f ada-src/2ataspri.adb /^ function pthread_mutexattr_setprotocol$/
+purpose c-src/emacs/src/lisp.h 1594
+push_kboard c-src/emacs/src/keyboard.c /^push_kboard (struct kboard *k)$/
+pushclass_above c-src/etags.c /^pushclass_above (int bracelev, char *str, int len)/
+put_entries c-src/etags.c /^put_entries (register node *np)$/
+pvec_type c-src/emacs/src/lisp.h 780
+quantizing html-src/algrthms.html /^Quantizing the Received$/
+questo ../c/c.web 34
+quit_char c-src/emacs/src/keyboard.c 192
+quit_throw_to_read_char c-src/emacs/src/keyboard.c /^quit_throw_to_read_char (bool from_signal)$/
+r0 c-src/sysdep.h 54
+r1 c-src/sysdep.h 55
+r_alloc c-src/emacs/src/lisp.h /^extern void *r_alloc (void **, size_t) ATTRIBUTE_A/
+range_exp y-src/parse.y 268
+range_exp_list y-src/parse.y 272
+raw_keybuf c-src/emacs/src/keyboard.c 116
+raw_keybuf_count c-src/emacs/src/keyboard.c 117
+rbtp c.c 240
+re_iswctype c-src/emacs/src/regex.h 602
+re_nsub c-src/emacs/src/regex.h 364
+re_pattern_buffer c-src/emacs/src/regex.h 335
+re_pattern_buffer c-src/h.h 119
+re_registers c-src/emacs/src/regex.h 428
+re_wchar_t c-src/emacs/src/regex.h 600
+re_wchar_t c-src/emacs/src/regex.h 623
+re_wctype c-src/emacs/src/regex.h 601
+re_wctype_t c-src/emacs/src/regex.h 599
+re_wctype_t c-src/emacs/src/regex.h 618
+re_wctype_to_bit c-src/emacs/src/regex.h /^# define re_wctype_to_bit(cc) 0$/
+read php-src/lce_functions.php /^ function read()$/
+read-key-sequence c-src/emacs/src/keyboard.c /^DEFUN ("read-key-sequence", Fread_key_sequence, Sr/
+read-key-sequence-vector c-src/emacs/src/keyboard.c /^DEFUN ("read-key-sequence-vector", Fread_key_seque/
+read_char c-src/emacs/src/keyboard.c /^read_char (int commandflag, Lisp_Object map,$/
+read_char_help_form_unwind c-src/emacs/src/keyboard.c /^read_char_help_form_unwind (void)$/
+read_char_minibuf_menu_prompt c-src/emacs/src/keyboard.c /^read_char_minibuf_menu_prompt (int commandflag,$/
+read_char_x_menu_prompt c-src/emacs/src/keyboard.c /^read_char_x_menu_prompt (Lisp_Object map,$/
+read_decoded_event_from_main_queue c-src/emacs/src/keyboard.c /^read_decoded_event_from_main_queue (struct timespe/
+read_event_from_main_queue c-src/emacs/src/keyboard.c /^read_event_from_main_queue (struct timespec *end_t/
+read_key_sequence c-src/emacs/src/keyboard.c /^read_key_sequence (Lisp_Object *keybuf, int bufsiz/
+read_key_sequence_cmd c-src/emacs/src/keyboard.c 232
+read_key_sequence_remapped c-src/emacs/src/keyboard.c 233
+read_key_sequence_vs c-src/emacs/src/keyboard.c /^read_key_sequence_vs (Lisp_Object prompt, Lisp_Obj/
+read_menu_command c-src/emacs/src/keyboard.c /^read_menu_command (void)$/
+readable_events c-src/emacs/src/keyboard.c /^readable_events (int flags)$/
+readline c-src/etags.c /^readline (linebuffer *lbp, FILE *stream)$/
+readline_internal c-src/etags.c /^readline_internal (linebuffer *lbp, register FILE /
+realloc c-src/emacs/src/gmalloc.c 65
+realloc c-src/emacs/src/gmalloc.c 69
+realloc c-src/emacs/src/gmalloc.c /^realloc (void *ptr, size_t size)$/
+realloc c-src/emacs/src/gmalloc.c 1716
+reallochook c-src/emacs/src/gmalloc.c /^reallochook (void *ptr, size_t size)$/
+recent-keys c-src/emacs/src/keyboard.c /^DEFUN ("recent-keys", Frecent_keys, Srecent_keys, /
+recent_keys c-src/emacs/src/keyboard.c 100
+recent_keys_index c-src/emacs/src/keyboard.c 94
+record_asynch_buffer_change c-src/emacs/src/keyboard.c /^record_asynch_buffer_change (void)$/
+record_auto_save c-src/emacs/src/keyboard.c /^record_auto_save (void)$/
+record_char c-src/emacs/src/keyboard.c /^record_char (Lisp_Object c)$/
+record_menu_key c-src/emacs/src/keyboard.c /^record_menu_key (Lisp_Object c)$/
+record_single_kboard_state c-src/emacs/src/keyboard.c /^record_single_kboard_state ()$/
+record_xmalloc c-src/emacs/src/lisp.h /^extern void *record_xmalloc (size_t) ATTRIBUTE_ALL/
+recover_top_level_message c-src/emacs/src/keyboard.c 138
+recursion-depth c-src/emacs/src/keyboard.c /^DEFUN ("recursion-depth", Frecursion_depth, Srecur/
+recursive-edit c-src/emacs/src/keyboard.c /^DEFUN ("recursive-edit", Frecursive_edit, Srecursi/
+recursive_edit_1 c-src/emacs/src/keyboard.c /^recursive_edit_1 (void)$/
+recursive_edit_unwind c-src/emacs/src/keyboard.c /^recursive_edit_unwind (Lisp_Object buffer)$/
+reduce prol-src/natded.prolog /^reduce((X^M)@N,L):- % beta reduction$/
+reduce_subterm prol-src/natded.prolog /^reduce_subterm(M,M2):-$/
+refreshPort pyt-src/server.py /^ def refreshPort(self):$/
+reg_errcode_t c.c 279
+reg_errcode_t c-src/emacs/src/regex.h 323
+reg_syntax_t c-src/emacs/src/regex.h 43
+regex c-src/etags.c 219
+regex make-src/Makefile 204
+regex make-src/Makefile 207
+regex make-src/Makefile 213
+regex make-src/Makefile 216
+regex make-src/Makefile 219
+regex_t c-src/emacs/src/regex.h 416
+regex_tag_multiline c-src/etags.c /^regex_tag_multiline (void)$/
+regexfile Makefile /^regexfile: Makefile$/
+regexp c-src/etags.c 256
+regexp c-src/etags.c 268
+registerAction: objcpp-src/SimpleCalc.M /^- registerAction:(SEL)action$/
+register_heapinfo c-src/emacs/src/gmalloc.c /^register_heapinfo (void)$/
+regmatch_t c-src/emacs/src/regex.h 451
+regoff_t c-src/emacs/src/regex.h 423
+regs c-src/etags.c 263
+regs cp-src/screen.cpp 16
+regs_allocated c-src/emacs/src/regex.h 379
+regset c-src/h.h 31
+regular_top_level_message c-src/emacs/src/keyboard.c 143
+rehash_size c-src/emacs/src/lisp.h 1835
+rehash_threshold c-src/emacs/src/lisp.h 1839
+relative_filename c-src/etags.c /^relative_filename (char *file, char *dir)$/
+removeexp prol-src/natded.prolog /^removeexp(E,E,'NIL'):-!.$/
+reorder_modifiers c-src/emacs/src/keyboard.c /^reorder_modifiers (Lisp_Object symbol)$/
+request c.c /^request request (a, b)$/
+requeued_events_pending_p c-src/emacs/src/keyboard.c /^requeued_events_pending_p (void)$/
+required_argument c-src/getopt.h 90
+reset-this-command-lengths c-src/emacs/src/keyboard.c /^DEFUN ("reset-this-command-lengths", Freset_this_c/
+restore_getcjmp c-src/emacs/src/keyboard.c /^restore_getcjmp (sys_jmp_buf temp)$/
+restore_kboard_configuration c-src/emacs/src/keyboard.c /^restore_kboard_configuration (int was_locked)$/
+return_to_command_loop c-src/emacs/src/keyboard.c 135
+reverse prol-src/natded.prolog /^reverse([],Ws,Ws).$/
+revert: objc-src/PackInsp.m /^-revert:sender$/
+right c-src/etags.c 216
+right_shift cccp.y /^right_shift (a, b)$/
+right_shift y-src/cccp.y /^right_shift (a, b)$/
+ring1 c.c 241
+ring2 c.c 242
+rm_eo c-src/emacs/src/regex.h 450
+rm_so c-src/emacs/src/regex.h 449
+rtint c-src/h.h 60
+rtint c-src/h.h 68
+rtstr c-src/h.h 61
+rtstr c-src/h.h 69
+rtunion_def c-src/h.h 58
+rtunion_def c-src/h.h 64
+rtx c-src/h.h 62
+rtxnp c-src/h.h 71
+rtxp c-src/h.h 70
+s c-src/emacs/src/lisp.h 4672
+s c-src/emacs/src/lisp.h 4678
+s1 cp-src/c.C 32
+s1::counter cp-src/c.C 33
+s2 cp-src/c.C 35
+s2::counter cp-src/c.C 36
+safe_run_hook_funcall c-src/emacs/src/keyboard.c /^safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Objec/
+safe_run_hooks c-src/emacs/src/keyboard.c /^safe_run_hooks (Lisp_Object hook)$/
+safe_run_hooks_1 c-src/emacs/src/keyboard.c /^safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *ar/
+safe_run_hooks_error c-src/emacs/src/keyboard.c /^safe_run_hooks_error (Lisp_Object error, ptrdiff_t/
+save pyt-src/server.py /^ def save(self):$/
+save pyt-src/server.py /^ def save(self):$/
+save pyt-src/server.py /^ def save(self):$/
+save_getcjmp c-src/emacs/src/keyboard.c /^save_getcjmp (sys_jmp_buf temp)$/
+save_type c-src/emacs/src/lisp.h /^save_type (struct Lisp_Save_Value *v, int n)$/
+savenstr c-src/etags.c /^savenstr (const char *cp, int len)$/
+savestr c-src/etags.c /^savestr (const char *cp)$/
+scan_separators c-src/etags.c /^scan_separators (char *name)$/
+scolonseen c-src/etags.c 2447
+scratch c-src/sysdep.h 56
+scroll_bar_parts c-src/emacs/src/keyboard.c 5189
+sec=\relax tex-src/texinfo.tex /^\\let\\appendixsec=\\relax$/
+section perl-src/htlmify-cystic 25
+section=\relax tex-src/texinfo.tex /^\\let\\appendixsection=\\relax$/
+section_name perl-src/htlmify-cystic 12
+section_toc perl-src/htlmify-cystic 15
+select prol-src/natded.prolog /^select(X,[X|Xs],Xs).$/
+select-tags-table el-src/emacs/lisp/progmodes/etags.el /^(defun select-tags-table ()$/
+select-tags-table-mode el-src/emacs/lisp/progmodes/etags.el /^(define-derived-mode select-tags-table-mode specia/
+select-tags-table-mode-map el-src/emacs/lisp/progmodes/etags.el /^(defvar select-tags-table-mode-map ; Doc string?$/
+select-tags-table-quit el-src/emacs/lisp/progmodes/etags.el /^(defun select-tags-table-quit ()$/
+select-tags-table-select el-src/emacs/lisp/progmodes/etags.el /^(defun select-tags-table-select (button)$/
+select_last prol-src/natded.prolog /^select_last([X],X,[]).$/
+send: objc-src/Subprocess.m /^- send:(const char *)string$/
+send:withNewline: objc-src/Subprocess.m /^- send:(const char *)string withNewline:(BOOL)want/
+separator_names c-src/emacs/src/keyboard.c 7372
+serializeToVars php-src/lce_functions.php /^ function serializeToVars($prefix)$/
+serializeToVars php-src/lce_functions.php /^ function serializeToVars($prefix)$/
+set-input-interrupt-mode c-src/emacs/src/keyboard.c /^DEFUN ("set-input-interrupt-mode", Fset_input_inte/
+set-input-meta-mode c-src/emacs/src/keyboard.c /^DEFUN ("set-input-meta-mode", Fset_input_meta_mode/
+set-input-mode c-src/emacs/src/keyboard.c /^DEFUN ("set-input-mode", Fset_input_mode, Sset_inp/
+set-output-flow-control c-src/emacs/src/keyboard.c /^DEFUN ("set-output-flow-control", Fset_output_flow/
+set-quit-char c-src/emacs/src/keyboard.c /^DEFUN ("set-quit-char", Fset_quit_char, Sset_quit_/
+setDelegate: objc-src/Subprocess.m /^- setDelegate:anObject$/
+setRevertButtonTitle objc-src/PackInsp.m /^-setRevertButtonTitle$/
+set_char_table_contents c-src/emacs/src/lisp.h /^set_char_table_contents (Lisp_Object table, ptrdif/
+set_char_table_defalt c-src/emacs/src/lisp.h /^set_char_table_defalt (Lisp_Object table, Lisp_Obj/
+set_char_table_extras c-src/emacs/src/lisp.h /^set_char_table_extras (Lisp_Object table, ptrdiff_/
+set_char_table_purpose c-src/emacs/src/lisp.h /^set_char_table_purpose (Lisp_Object table, Lisp_Ob/
+set_hash_key_slot c-src/emacs/src/lisp.h /^set_hash_key_slot (struct Lisp_Hash_Table *h, ptrd/
+set_hash_value_slot c-src/emacs/src/lisp.h /^set_hash_value_slot (struct Lisp_Hash_Table *h, pt/
+set_overlay_plist c-src/emacs/src/lisp.h /^set_overlay_plist (Lisp_Object overlay, Lisp_Objec/
+set_poll_suppress_count c-src/emacs/src/keyboard.c /^set_poll_suppress_count (int count)$/
+set_prop c-src/emacs/src/keyboard.c /^set_prop (ptrdiff_t idx, Lisp_Object val)$/
+set_save_integer c-src/emacs/src/lisp.h /^set_save_integer (Lisp_Object obj, int n, ptrdiff_/
+set_save_pointer c-src/emacs/src/lisp.h /^set_save_pointer (Lisp_Object obj, int n, void *va/
+set_string_intervals c-src/emacs/src/lisp.h /^set_string_intervals (Lisp_Object s, INTERVAL i)$/
+set_sub_char_table_contents c-src/emacs/src/lisp.h /^set_sub_char_table_contents (Lisp_Object table, pt/
+set_symbol_function c-src/emacs/src/lisp.h /^set_symbol_function (Lisp_Object sym, Lisp_Object /
+set_symbol_next c-src/emacs/src/lisp.h /^set_symbol_next (Lisp_Object sym, struct Lisp_Symb/
+set_symbol_plist c-src/emacs/src/lisp.h /^set_symbol_plist (Lisp_Object sym, Lisp_Object pli/
+set_waiting_for_input c-src/emacs/src/keyboard.c /^set_waiting_for_input (struct timespec *time_to_cl/
+setref tex-src/texinfo.tex /^\\expandafter\\expandafter\\expandafter\\appendixsetre/
+shouldLoad objc-src/PackInsp.m /^-(BOOL)shouldLoad$/
+should_see_this_array_type cp-src/c.C 156
+should_see_this_function_pointer cp-src/c.C 153
+should_see_this_one_enclosed_in_extern_C cp-src/c.C 149
+show erl-src/gs_dialog.erl /^show(Module, Title, Message, Args) ->$/
+showError objc-src/Subprocess.m /^showError (const char *errorString, id theDelegate/
+showInfo: objc-src/PackInsp.m /^-showInfo:sender$/
+show_help_echo c-src/emacs/src/keyboard.c /^show_help_echo (Lisp_Object help, Lisp_Object wind/
+sig c-src/emacs/src/keyboard.c 7238
+signal_handler c-src/h.h 82
+signal_handler1 c-src/h.h 83
+signal_handler_t c-src/h.h 94
+simulation html-src/software.html /^Software that I wrote for supporting my research a/
+single_kboard c-src/emacs/src/keyboard.c 89
+single_kboard_state c-src/emacs/src/keyboard.c /^single_kboard_state ()$/
+site cp-src/conway.hpp 5
+site::alive cp-src/conway.hpp 7
+site::clear cp-src/conway.hpp /^ void clear(void) { alive = 0; }$/
+site::compute_next_state cp-src/conway.hpp /^ void compute_next_state(void)$/
+site::next_alive cp-src/conway.hpp 7
+site::read cp-src/conway.hpp /^ char read() { return alive; }$/
+site::set cp-src/conway.hpp /^ void set(void) { alive = 1; }$/
+site::site cp-src/conway.hpp /^ site(int xi, int yi): x(xi), y(yi), alive(0) {/
+site::step cp-src/conway.hpp /^ void step(void) { alive = next_alive; }$/
+site::total_surrounding cp-src/conway.cpp /^int site::total_surrounding(void)$/
+site::x cp-src/conway.hpp 7
+site::y cp-src/conway.hpp 7
+size c-src/etags.c 236
+size c-src/etags.c 2522
+size c-src/emacs/src/gmalloc.c 156
+size c-src/emacs/src/gmalloc.c 163
+size c-src/emacs/src/gmalloc.c 1862
+size c-src/emacs/src/lisp.h 1364
+size c-src/emacs/src/lisp.h 1390
+skeyseen c-src/etags.c 2445
+skip_name c-src/etags.c /^skip_name (char *cp)$/
+skip_non_spaces c-src/etags.c /^skip_non_spaces (char *cp)$/
+skip_spaces c-src/etags.c /^skip_spaces (char *cp)$/
+snarf-tag-function el-src/emacs/lisp/progmodes/etags.el /^(defvar snarf-tag-function nil$/
+snone c-src/etags.c 2443
+some_mouse_moved c-src/emacs/src/keyboard.c /^some_mouse_moved (void)$/
+space tex-src/texinfo.tex /^ {#2\\labelspace #1}\\dotfill\\doshortpageno{#3}}%/
+space tex-src/texinfo.tex /^ \\dosubsubsecentry{#2.#3.#4.#5\\labelspace#1}{#6}}/
+specbind_tag c-src/emacs/src/lisp.h 2943
+specbinding c-src/emacs/src/lisp.h 2955
+specialsymbol prol-src/natded.prolog /^specialsymbol(C1,C2,S):-$/
+splitexp prol-src/natded.prolog /^splitexp(E,E,('NIL','NIL')):-!.$/
+srclist Makefile /^srclist: Makefile$/
+ss3 c.c 255
+sss1 c.c 252
+sss2 c.c 253
+sstab prol-src/natded.prolog /^sstab(2,'C',',').$/
+st_C_attribute c-src/etags.c 2209
+st_C_class c-src/etags.c 2212
+st_C_define c-src/etags.c 2213
+st_C_enum c-src/etags.c 2213
+st_C_extern c-src/etags.c 2213
+st_C_gnumacro c-src/etags.c 2208
+st_C_ignore c-src/etags.c 2209
+st_C_javastruct c-src/etags.c 2210
+st_C_objend c-src/etags.c 2207
+st_C_objimpl c-src/etags.c 2207
+st_C_objprot c-src/etags.c 2207
+st_C_operator c-src/etags.c 2211
+st_C_struct c-src/etags.c 2213
+st_C_template c-src/etags.c 2212
+st_C_typedef c-src/etags.c 2213
+st_none c-src/etags.c 2206
+stack c.c 155
+stagseen c-src/etags.c 2446
+start c-src/emacs/src/regex.h 431
+start c-src/emacs/src/keyboard.c 8753
+start php-src/lce_functions.php /^ function start($line, $class)$/
+start y-src/cccp.y 143
+start_polling c-src/emacs/src/keyboard.c /^start_polling (void)$/
+start_up prol-src/natded.prolog /^start_up:-$/
+state_protected_p c-src/emacs/src/gmalloc.c 400
+statetable html-src/algrthms.html /^Next$/
+step_everybody cp-src/clheir.cpp /^void step_everybody(void)$/
+stop_polling c-src/emacs/src/keyboard.c /^stop_polling (void)$/
+store_user_signal_events c-src/emacs/src/keyboard.c /^store_user_signal_events (void)$/
+strcaseeq c-src/etags.c /^#define strcaseeq(s,t) (assert ((s)!=NULL && (t)!=/
+streq c-src/etags.c /^#define streq(s,t) (assert ((s)!=NULL || (t)!=NULL/
+string_intervals c-src/emacs/src/lisp.h /^string_intervals (Lisp_Object s)$/
+stripLine php-src/lce_functions.php /^ function stripLine($line, $class)$/
+stripname pas-src/common.pas /^function stripname; (* ($/
+strncaseeq c-src/etags.c /^#define strncaseeq(s,t,n) (assert ((s)!=NULL && (t/
+strneq c-src/etags.c /^#define strneq(s,t,n) (assert ((s)!=NULL || (t)!=N/
+structdef c-src/etags.c 2448
+stuff_buffered_input c-src/emacs/src/keyboard.c /^stuff_buffered_input (Lisp_Object stuffstring)$/
+subprocess:output: objc-src/PackInsp.m /^-subprocess:(Subprocess *)sender output:(char *)bu/
+subprocessDone: objc-src/PackInsp.m /^-subprocessDone:(Subprocess *)sender$/
+subsec=\relax tex-src/texinfo.tex /^\\let\\appendixsubsec=\\relax$/
+subsection perl-src/htlmify-cystic 26
+subsection=\relax tex-src/texinfo.tex /^\\let\\appendixsubsection=\\relax$/
+subsection_marker perl-src/htlmify-cystic 161
+subst prol-src/natded.prolog /^subst(var(Y),var(X),M,N):-$/
+substitute c-src/etags.c /^substitute (char *in, char *out, struct re_registe/
+subsubsec=\relax tex-src/texinfo.tex /^\\let\\appendixsubsubsec=\\relax$/
+subsubsection perl-src/htlmify-cystic 27
+subsubsection=\relax tex-src/texinfo.tex /^\\let\\appendixsubsubsection=\\relax$/
+subtree prol-src/natded.prolog /^subtree(T,T).$/
+suffix c-src/etags.c 186
+suffixes c-src/etags.c 195
+suggest_asking_for_help c-src/etags.c /^suggest_asking_for_help (void)$/
+suspend-emacs c-src/emacs/src/keyboard.c /^DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_e/
+sval cccp.y 117
+sval y-src/cccp.y 116
+swallow_events c-src/emacs/src/keyboard.c /^swallow_events (bool do_display)$/
+switch_line_buffers c-src/etags.c /^#define switch_line_buffers() (curndx = 1 - curndx/
+sxhash_combine c-src/emacs/src/lisp.h /^sxhash_combine (EMACS_UINT x, EMACS_UINT y)$/
+sym_type c-src/etags.c 2204
+symbol_interned c-src/emacs/src/lisp.h 639
+symbol_name c-src/emacs/src/lisp.h 1687
+symbol_redirect c-src/emacs/src/lisp.h 646
+syms_of_abbrev c-src/abbrev.c /^syms_of_abbrev ()$/
+syms_of_keyboard c-src/emacs/src/keyboard.c /^syms_of_keyboard (void)$/
+synchronize_system_messages_locale c-src/emacs/src/lisp.h /^INLINE void synchronize_system_messages_locale (vo/
+synchronize_system_time_locale c-src/emacs/src/lisp.h /^INLINE void synchronize_system_time_locale (void) /
+syntax c-src/emacs/src/regex.h 350
+sys_jmp_buf c-src/emacs/src/lisp.h 2906
+sys_jmp_buf c-src/emacs/src/lisp.h 2910
+sys_jmp_buf c-src/emacs/src/lisp.h 2916
+sys_longjmp c-src/emacs/src/lisp.h /^# define sys_longjmp(j, v) _longjmp (j, v)$/
+sys_longjmp c-src/emacs/src/lisp.h /^# define sys_longjmp(j, v) siglongjmp (j, v)$/
+sys_longjmp c-src/emacs/src/lisp.h /^# define sys_longjmp(j, v) longjmp (j, v)$/
+sys_setjmp c-src/emacs/src/lisp.h /^# define sys_setjmp(j) _setjmp (j)$/
+sys_setjmp c-src/emacs/src/lisp.h /^# define sys_setjmp(j) sigsetjmp (j, 0)$/
+sys_setjmp c-src/emacs/src/lisp.h /^# define sys_setjmp(j) setjmp (j)$/
+syscall_error c-src/sysdep.h 34
+t1 cp-src/c.C 34
+t2 cp-src/c.C 38
+tab_count_words c-src/tab.c /^int tab_count_words(char **tab)$/
+tab_delete_first c-src/tab.c /^int tab_delete_first(char **tab)$/
+tab_fill c-src/tab.c /^char **tab_fill(char *str, char delim)$/
+tab_free c-src/tab.c /^void tab_free(char **tab)$/
+tag-any-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-any-match-p (_tag)$/
+tag-exact-file-name-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-exact-file-name-match-p (tag)$/
+tag-exact-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-exact-match-p (tag)$/
+tag-file-name-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-file-name-match-p (tag)$/
+tag-find-file-of-tag el-src/emacs/lisp/progmodes/etags.el /^(defun tag-find-file-of-tag (file) ; Doc string?$/
+tag-find-file-of-tag-noselect el-src/emacs/lisp/progmodes/etags.el /^(defun tag-find-file-of-tag-noselect (file)$/
+tag-implicit-name-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-implicit-name-match-p (tag)$/
+tag-lines-already-matched el-src/emacs/lisp/progmodes/etags.el /^(defvar tag-lines-already-matched nil$/
+tag-partial-file-name-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-partial-file-name-match-p (_tag)$/
+tag-re-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-re-match-p (re)$/
+tag-symbol-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-symbol-match-p (tag)$/
+tag-word-match-p el-src/emacs/lisp/progmodes/etags.el /^(defun tag-word-match-p (tag)$/
+tag1 c-src/torture.c /^(*tag1 (sig, handler)) ()$/
+tag1 c-src/dostorture.c /^(*tag1 (sig, handler)) ()$/
+tag1 c-src/h.h 110
+tag2 c-src/torture.c /^(*tag2 (sig, handler)) ()$/
+tag2 c-src/dostorture.c /^(*tag2 (sig, handler)) ()$/
+tag3 c-src/torture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/
+tag3 c-src/dostorture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/
+tag4 c-src/torture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/
+tag4 c-src/dostorture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/
+tag5 c-src/torture.c /^tag5 (handler, arg)$/
+tag5 c-src/dostorture.c /^tag5 (handler, arg)$/
+tag6 c-src/torture.c /^tag6 (void (*handler) (void *), void *arg)$/
+tag6 c-src/dostorture.c /^tag6 (void (*handler) (void *), void *arg)$/
+tag_or_ch c-src/emacs/src/lisp.h 3026
+taggedfname c-src/etags.c 207
+tags-add-tables el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-add-tables 'ask-user$/
+tags-apropos el-src/emacs/lisp/progmodes/etags.el /^(defun tags-apropos (regexp)$/
+tags-apropos-additional-actions el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-apropos-additional-actions nil$/
+tags-apropos-function el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-apropos-function nil$/
+tags-apropos-verbose el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-apropos-verbose nil$/
+tags-case-fold-search el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-case-fold-search 'default$/
+tags-complete-tags-table-file el-src/emacs/lisp/progmodes/etags.el /^(defun tags-complete-tags-table-file (string predi/
+tags-completion-at-point-function el-src/emacs/lisp/progmodes/etags.el /^(defun tags-completion-at-point-function ()$/
+tags-completion-table el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-completion-table nil$/
+tags-completion-table el-src/emacs/lisp/progmodes/etags.el /^(defun tags-completion-table ()$/
+tags-completion-table-function el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-completion-table-function nil$/
+tags-compression-info-list el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-compression-info-list$/
+tags-expand-table-name el-src/emacs/lisp/progmodes/etags.el /^(defun tags-expand-table-name (file)$/
+tags-file-name el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-file-name nil$/
+tags-included-tables el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-included-tables nil$/
+tags-included-tables el-src/emacs/lisp/progmodes/etags.el /^(defun tags-included-tables ()$/
+tags-included-tables-function el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-included-tables-function nil$/
+tags-lazy-completion-table el-src/emacs/lisp/progmodes/etags.el /^(defun tags-lazy-completion-table ()$/
+tags-location-ring el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-location-ring (make-ring xref-marker-/
+tags-loop-continue el-src/emacs/lisp/progmodes/etags.el /^(defun tags-loop-continue (&optional first-time)$/
+tags-loop-eval el-src/emacs/lisp/progmodes/etags.el /^(defun tags-loop-eval (form)$/
+tags-loop-operate el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-loop-operate nil$/
+tags-loop-revert-buffers el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-loop-revert-buffers nil$/
+tags-loop-scan el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-loop-scan$/
+tags-next-table el-src/emacs/lisp/progmodes/etags.el /^(defun tags-next-table ()$/
+tags-query-replace el-src/emacs/lisp/progmodes/etags.el /^(defun tags-query-replace (from to &optional delim/
+tags-recognize-empty-tags-table el-src/emacs/lisp/progmodes/etags.el /^(defun tags-recognize-empty-tags-table ()$/
+tags-reset-tags-tables el-src/emacs/lisp/progmodes/etags.el /^(defun tags-reset-tags-tables ()$/
+tags-revert-without-query el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-revert-without-query nil$/
+tags-search el-src/emacs/lisp/progmodes/etags.el /^(defun tags-search (regexp &optional file-list-for/
+tags-select-tags-table el-src/emacs/lisp/progmodes/etags.el /^(define-button-type 'tags-select-tags-table$/
+tags-table-check-computed-list el-src/emacs/lisp/progmodes/etags.el /^(defun tags-table-check-computed-list ()$/
+tags-table-computed-list el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-computed-list nil$/
+tags-table-computed-list-for el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-computed-list-for nil$/
+tags-table-extend-computed-list el-src/emacs/lisp/progmodes/etags.el /^(defun tags-table-extend-computed-list ()$/
+tags-table-files el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-files nil$/
+tags-table-files el-src/emacs/lisp/progmodes/etags.el /^(defun tags-table-files ()$/
+tags-table-files-function el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-files-function nil$/
+tags-table-format-functions el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-format-functions '(etags-recogn/
+tags-table-including el-src/emacs/lisp/progmodes/etags.el /^(defun tags-table-including (this-file core-only)$/
+tags-table-list el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-table-list nil$/
+tags-table-list-member el-src/emacs/lisp/progmodes/etags.el /^(defun tags-table-list-member (file list)$/
+tags-table-list-pointer el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-list-pointer nil$/
+tags-table-list-started-at el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-list-started-at nil$/
+tags-table-mode el-src/emacs/lisp/progmodes/etags.el /^(defun tags-table-mode ()$/
+tags-table-set-list el-src/emacs/lisp/progmodes/etags.el /^(defvar tags-table-set-list nil$/
+tags-tag-face el-src/emacs/lisp/progmodes/etags.el /^(defcustom tags-tag-face 'default$/
+tags-verify-table el-src/emacs/lisp/progmodes/etags.el /^(defun tags-verify-table (file)$/
+tags-with-face el-src/emacs/lisp/progmodes/etags.el /^(defmacro tags-with-face (face &rest body)$/
+target_multibyte c-src/emacs/src/regex.h 407
+tcpdump html-src/software.html /^tcpdump$/
+temporarily_switch_to_single_kboard c-src/emacs/src/keyboard.c /^temporarily_switch_to_single_kboard (struct frame /
+tend c-src/etags.c 2432
+terminate: objc-src/Subprocess.m /^- terminate:sender$/
+terminateInput objc-src/Subprocess.m /^- terminateInput$/
+test c-src/emacs/src/lisp.h 1871
+test cp-src/c.C 86
+test erl-src/gs_dialog.erl /^test() ->$/
+test php-src/ptest.php /^test $/
+test::dummy1 cp-src/burton.cpp /^::dummy::dummy test::dummy1(void)$/
+test::dummy2 cp-src/burton.cpp /^::dummy::dummy test::dummy2(::CORBA::Long dummy)$/
+test::dummy3 cp-src/burton.cpp /^::dummy::dummy test::dummy3(char* name, ::CORBA::L/
+test::f cp-src/c.C /^ int f(){return 0;}; \/\/ first comment$/
+test::ff cp-src/c.C /^ int ff(){return 1;};$/
+test::g cp-src/c.C /^ int g(){return 2;};$/
+test_undefined c-src/emacs/src/keyboard.c /^test_undefined (Lisp_Object binding)$/
+texttreelist prol-src/natded.prolog /^texttreelist([]).$/
+this c-src/a/b/b.c 1
+this-command-keys c-src/emacs/src/keyboard.c /^DEFUN ("this-command-keys", Fthis_command_keys, St/
+this-command-keys-vector c-src/emacs/src/keyboard.c /^DEFUN ("this-command-keys-vector", Fthis_command_k/
+this-single-command-keys c-src/emacs/src/keyboard.c /^DEFUN ("this-single-command-keys", Fthis_single_co/
+this-single-command-raw-keys c-src/emacs/src/keyboard.c /^DEFUN ("this-single-command-raw-keys", Fthis_singl/
+this_command_key_count c-src/emacs/src/keyboard.c 108
+this_command_key_count_reset c-src/emacs/src/keyboard.c 112
+this_command_keys c-src/emacs/src/keyboard.c 107
+this_file_toc perl-src/htlmify-cystic 29
+this_single_command_key_start c-src/emacs/src/keyboard.c 125
+tignore c-src/etags.c 2433
+timer_check c-src/emacs/src/keyboard.c /^timer_check (void)$/
+timer_check_2 c-src/emacs/src/keyboard.c /^timer_check_2 (Lisp_Object timers, Lisp_Object idl/
+timer_idleness_start_time c-src/emacs/src/keyboard.c 335
+timer_last_idleness_start_time c-src/emacs/src/keyboard.c 340
+timer_resume_idle c-src/emacs/src/keyboard.c /^timer_resume_idle (void)$/
+timer_start_idle c-src/emacs/src/keyboard.c /^timer_start_idle (void)$/
+timer_stop_idle c-src/emacs/src/keyboard.c /^timer_stop_idle (void)$/
+timers_run c-src/emacs/src/keyboard.c 320
+tinbody c-src/etags.c 2431
+tkeyseen c-src/etags.c 2429
+tnone c-src/etags.c 2428
+toggleDescription objc-src/PackInsp.m /^-toggleDescription$/
+tok c-src/etags.c 2491
+token c-src/etags.c 2508
+token cccp.y 437
+token cccp.y 439
+token y-src/cccp.y 437
+token y-src/cccp.y 439
+tokenize prol-src/natded.prolog /^tokenize([C1,C2,C3|Cs],Xs-Ys,TsResult):- % spe/
+tokenizeatom prol-src/natded.prolog /^tokenizeatom(Atom,Ws):-$/
+tokentab2 cccp.y 442
+tokentab2 y-src/cccp.y 442
+tool_bar_item_properties c-src/emacs/src/keyboard.c 7970
+tool_bar_items c-src/emacs/src/keyboard.c /^tool_bar_items (Lisp_Object reuse, int *nitems)$/
+tool_bar_items_vector c-src/emacs/src/keyboard.c 7965
+toolkit_menubar_in_use c-src/emacs/src/keyboard.c /^toolkit_menubar_in_use (struct frame *f)$/
+top-level c-src/emacs/src/keyboard.c /^DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, /
+top_level_1 c-src/emacs/src/keyboard.c /^top_level_1 (Lisp_Object ignore)$/
+top_level_2 c-src/emacs/src/keyboard.c /^top_level_2 (void)$/
+total_keys c-src/emacs/src/keyboard.c 97
+total_size_of_entries c-src/etags.c /^total_size_of_entries (register node *np)$/
+totally_unblock_input c-src/emacs/src/keyboard.c /^totally_unblock_input (void)$/
+tpcmd c-src/h.h 8
+tpcmd c-src/h.h 15
+track-mouse c-src/emacs/src/keyboard.c /^DEFUN ("internal--track-mouse", Ftrack_mouse, Stra/
+tracking_off c-src/emacs/src/keyboard.c /^tracking_off (Lisp_Object old_value)$/
+traffic_light cp-src/conway.cpp /^void traffic_light(int x, int y)$/
+translate c-src/emacs/src/regex.h 361
+tt prol-src/natded.prolog /^tt:-$/
+tt=cmtt10 tex-src/texinfo.tex /^\\font\\deftt=cmtt10 scaled \\magstep1$/
+tty_read_avail_input c-src/emacs/src/keyboard.c /^tty_read_avail_input (struct terminal *terminal,$/
+ttypeseen c-src/etags.c 2430
+typdef c-src/etags.c 2434
+type c-src/etags.c 2271
+type c-src/emacs/src/gmalloc.c 145
+type c-src/emacs/src/lisp.h 2276
+type c-src/emacs/src/lisp.h 2286
+type c-src/emacs/src/lisp.h 2296
+type c-src/emacs/src/lisp.h 2304
+type c-src/emacs/src/lisp.h 2364
+type c-src/emacs/src/lisp.h 3025
+typefunargs tex-src/texinfo.tex /^\\deftypefunargs {#3}\\endgroup %$/
+typefunargs tex-src/texinfo.tex /^\\deftypefunargs {#4}\\endgroup %$/
+typemargin tex-src/texinfo.tex /^\\newskip\\deftypemargin \\deftypemargin=12pt$/
+typemargin tex-src/texinfo.tex /^\\rlap{\\rightline{{\\rm #2}\\hskip \\deftypemargin}}}%/
+u c-src/emacs/src/lisp.h 2397
+u_any c-src/emacs/src/lisp.h 2214
+u_boolfwd c-src/emacs/src/lisp.h 2371
+u_buffer_objfwd c-src/emacs/src/lisp.h 2373
+u_finalizer c-src/emacs/src/lisp.h 2219
+u_free c-src/emacs/src/lisp.h 2215
+u_intfwd c-src/emacs/src/lisp.h 2370
+u_kboard_objfwd c-src/emacs/src/lisp.h 2374
+u_marker c-src/emacs/src/lisp.h 2216
+u_objfwd c-src/emacs/src/lisp.h 2372
+u_overlay c-src/emacs/src/lisp.h 2217
+u_save_value c-src/emacs/src/lisp.h 2218
+unargs tex-src/texinfo.tex /^\\defunargs {#2}\\endgroup %$/
+unargs tex-src/texinfo.tex /^\\defunargs {#2}\\endgroup %$/
+unargs tex-src/texinfo.tex /^\\defunargs {#2}\\endgroup %$/
+unargs tex-src/texinfo.tex /^\\defunargs {#3}\\endgroup %$/
+unargs tex-src/texinfo.tex /^\\defunargs {#3}\\endgroup %$/
+unblock_input c-src/emacs/src/keyboard.c /^unblock_input (void)$/
+unblock_input_to c-src/emacs/src/keyboard.c /^unblock_input_to (int level)$/
+unchar c-src/h.h 99
+unexpand-abbrev c-src/abbrev.c /^DEFUN ("unexpand-abbrev", Funexpand_abbrev, Sunexp/
+unread_switch_frame c-src/emacs/src/keyboard.c 204
+unsignedp cccp.y 113
+unsignedp y-src/cccp.y 112
+uprintmax_t c-src/emacs/src/lisp.h 149
+uprintmax_t c-src/emacs/src/lisp.h 154
+usecharno c-src/etags.c 210
+used c-src/emacs/src/regex.h 347
+used_syntax c-src/emacs/src/regex.h 398
+user_cmp_function c-src/emacs/src/lisp.h 1814
+user_error c-src/emacs/src/keyboard.c /^user_error (const char *msg)$/
+user_hash_function c-src/emacs/src/lisp.h 1811
+user_signal_info c-src/emacs/src/keyboard.c 7235
+user_signals c-src/emacs/src/keyboard.c 7250
+usfreelock_ptr/t ada-src/etags-test-for.ada /^ type usfreelock_ptr is access$/
+val c-src/getopt.h 84
+val c-src/emacs/src/lisp.h 691
+val c-src/emacs/src/lisp.h 3027
+val prol-src/natded.prolog /^val(X) --> ['['], valseq(X), [']'].$/
+valcell c-src/emacs/src/lisp.h 2357
+valid c-src/etags.c 220
+valid c-src/etags.c 2502
+validate php-src/lce_functions.php /^ function validate($value)$/
+validate php-src/lce_functions.php /^ function validate($value)$/
+valloc c-src/emacs/src/gmalloc.c /^valloc (size_t size)$/
+valseq prol-src/natded.prolog /^valseq([Val|Vals]) --> val(Val), plusvalseq(Vals)./
+value c-src/emacs/src/lisp.h 687
+value cccp.y 113
+value y-src/cccp.y 112
+var c-src/emacs/src/keyboard.c 11023
+var c-src/emacs/src/lisp.h 3137
+varargs tex-src/texinfo.tex /^\\defvarargs {#3}\\endgroup %$/
+varargs tex-src/texinfo.tex /^\\defvarargs {#3}\\endgroup %$/
+varargs tex-src/texinfo.tex /^\\defvarargs {#2}\\endgroup %$/
+varargs tex-src/texinfo.tex /^\\defvarargs {#2}\\endgroup %$/
+vcopy c-src/emacs/src/lisp.h /^vcopy (Lisp_Object v, ptrdiff_t offset, Lisp_Objec/
+vectorlike_header c-src/emacs/src/lisp.h 1343
+verify-tags-table-function el-src/emacs/lisp/progmodes/etags.el /^(defvar verify-tags-table-function nil$/
+verify_ascii c-src/emacs/src/lisp.h /^# define verify_ascii(str) (str)$/
+vignore c-src/etags.c 2417
+visit-tags-table el-src/emacs/lisp/progmodes/etags.el /^(defun visit-tags-table (file &optional local)$/
+visit-tags-table-buffer el-src/emacs/lisp/progmodes/etags.el /^(defun visit-tags-table-buffer (&optional cont)$/
+void c-src/emacs/src/lisp.h /^INLINE void (check_cons_list) (void) { lisp_h_chec/
+voidfuncptr c-src/emacs/src/lisp.h 2108
+voidval cccp.y 116
+voidval y-src/cccp.y 115
+wait_status_ptr_t c.c 161
+waiting_for_input c-src/emacs/src/keyboard.c 150
+warning cccp.y /^warning (msg)$/
+warning y-src/cccp.y /^warning (msg)$/
+weak c-src/emacs/src/lisp.h 1830
+weak_alias c-src/emacs/src/gmalloc.c /^weak_alias (free, cfree)$/
+what c-src/etags.c 252
+wheel_syms c-src/emacs/src/keyboard.c 4628
+where c-src/emacs/src/lisp.h 2348
+width make-src/Makefile 186
+width make-src/Makefile 189
+width make-src/Makefile 192
+width make-src/Makefile 195
+windowWillClose: objcpp-src/SimpleCalc.M /^- windowWillClose:sender$/
+wipe_kboard c-src/emacs/src/keyboard.c /^wipe_kboard (KBOARD *kb)$/
+womboid c-src/h.h 63
+womboid c-src/h.h 75
+word_size c-src/emacs/src/lisp.h 1473
+write php-src/lce_functions.php /^ function write()$/
+write php-src/lce_functions.php /^ function write($save="yes")$/
+write_abbrev c-src/abbrev.c /^write_abbrev (sym, stream)$/
+write_classname c-src/etags.c /^write_classname (linebuffer *cn, const char *quali/
+write_lex prol-src/natded.prolog /^write_lex(File):-$/
+write_lex_cat prol-src/natded.prolog /^write_lex_cat(File):-$/
+write_xyc cp-src/screen.cpp /^void write_xyc(int x, int y, char c)$/
+writebreak prol-src/natded.prolog /^writebreak([]).$/
+writebreaklex prol-src/natded.prolog /^writebreaklex([]).$/
+writecat prol-src/natded.prolog /^writecat(np(ind(sng),nm(_)),np,[],[]):-!.$/
+writelist prol-src/natded.prolog /^writelist([der(Ws)|Ws2]):-$/
+writelistsubs prol-src/natded.prolog /^writelistsubs([],X):-$/
+writenamestring pas-src/common.pas /^procedure writenamestring;(*($/
+writesubs prol-src/natded.prolog /^writesubs([]).$/
+writesups prol-src/natded.prolog /^writesups([]).$/
+written c-src/etags.c 211
+x c.c 153
+x c.c 179
+x c.c 188
+x c.c 189
+x tex-src/texinfo.tex /^\\refx{#1-snt}{} [\\printednodename], page\\tie\\refx{/
+x-get-selection-internal c.c /^DEFUN ("x-get-selection-internal", Fx_get_selectio/
+x-get-selection-internal c.c /^ Fx_get_selection_internal, Sx_get_selection/
+xcar_addr c-src/emacs/src/lisp.h /^xcar_addr (Lisp_Object c)$/
+xcdr_addr c-src/emacs/src/lisp.h /^xcdr_addr (Lisp_Object c)$/
+xmalloc c-src/etags.c /^xmalloc (size_t size)$/
+xnew c-src/etags.c /^#define xnew(n, Type) ((Type *) xmalloc ((n) /
+xrealloc c-src/etags.c /^xrealloc (void *ptr, size_t size)$/
+xref-etags-location el-src/emacs/lisp/progmodes/etags.el /^(defclass xref-etags-location (xref-location)$/
+xref-location-line el-src/emacs/lisp/progmodes/etags.el /^(cl-defmethod xref-location-line ((l xref-etags-lo/
+xref-location-marker el-src/emacs/lisp/progmodes/etags.el /^(cl-defmethod xref-location-marker ((l xref-etags-/
+xref-make-etags-location el-src/emacs/lisp/progmodes/etags.el /^(defun xref-make-etags-location (tag-info file)$/
+xrnew c-src/etags.c /^#define xrnew(op, n, Type) ((op) = (Type *) xreall/
+xx Makefile /^xx="this line is here because of a fontlock bug$/
+y-get-selection-internal c.c /^ Fy_get_selection_internal, Sy_get_selection_/
+yyalloc /usr/share/bison/bison.simple 83
+yyalloc /usr/share/bison/bison.simple 83
+yycheck parse.y 330
+yycheck cccp.y 301
+yyclearin /usr/share/bison/bison.simple 149
+yyclearin /usr/share/bison/bison.simple 149
+yydebug /usr/share/bison/bison.simple 237
+yydebug /usr/share/bison/bison.simple 237
+yydefact parse.y 219
+yydefact cccp.y 239
+yydefgoto parse.y 237
+yydefgoto cccp.y 251
+yyerrhandle /usr/share/bison/bison.simple 848
+yyerrhandle /usr/share/bison/bison.simple 848
+yyerrlab1 /usr/share/bison/bison.simple 823
+yyerrlab1 /usr/share/bison/bison.simple 823
+yyerrok /usr/share/bison/bison.simple 148
+yyerrok /usr/share/bison/bison.simple 148
+yyerror cccp.y /^yyerror (s)$/
+yyerror y-src/cccp.y /^yyerror (s)$/
+yyerrstatus /usr/share/bison/bison.simple 846
+yyerrstatus /usr/share/bison/bison.simple 846
+yylex cccp.y /^yylex ()$/
+yylex y-src/cccp.y /^yylex ()$/
+yyls /usr/share/bison/bison.simple 88
+yyls /usr/share/bison/bison.simple 88
+yylsp /usr/share/bison/bison.simple 748
+yylsp /usr/share/bison/bison.simple 921
+yylsp /usr/share/bison/bison.simple 748
+yylsp /usr/share/bison/bison.simple 921
+yymemcpy /usr/share/bison/bison.simple 264
+yymemcpy /usr/share/bison/bison.simple /^yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T/
+yymemcpy /usr/share/bison/bison.simple 264
+yymemcpy /usr/share/bison/bison.simple /^yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T/
+yyn /usr/share/bison/bison.simple 755
+yyn /usr/share/bison/bison.simple 861
+yyn /usr/share/bison/bison.simple 895
+yyn /usr/share/bison/bison.simple 903
+yyn /usr/share/bison/bison.simple 755
+yyn /usr/share/bison/bison.simple 861
+yyn /usr/share/bison/bison.simple 895
+yyn /usr/share/bison/bison.simple 903
+yynewstate /usr/share/bison/bison.simple 763
+yynewstate /usr/share/bison/bison.simple 925
+yynewstate /usr/share/bison/bison.simple 763
+yynewstate /usr/share/bison/bison.simple 925
+yypact parse.y 242
+yypact cccp.y 256
+yyparse /usr/share/bison/bison.simple /^yyparse (YYPARSE_PARAM_ARG)$/
+yyparse /usr/share/bison/bison.simple /^yyparse (YYPARSE_PARAM_ARG)$/
+yypgoto parse.y 260
+yypgoto cccp.y 268
+yyprhs parse.y 134
+yyprhs cccp.y 167
+yyr1 parse.y 197
+yyr1 cccp.y 219
+yyr2 parse.y 207
+yyr2 cccp.y 228
+yyresult /usr/share/bison/bison.simple 932
+yyresult /usr/share/bison/bison.simple 939
+yyresult /usr/share/bison/bison.simple 947
+yyresult /usr/share/bison/bison.simple 932
+yyresult /usr/share/bison/bison.simple 939
+yyresult /usr/share/bison/bison.simple 947
+yyreturn /usr/share/bison/bison.simple 933
+yyreturn /usr/share/bison/bison.simple 940
+yyreturn /usr/share/bison/bison.simple 933
+yyreturn /usr/share/bison/bison.simple 940
+yyrhs parse.y 142
+yyrhs cccp.y 174
+yyrline parse.y 171
+yyrline cccp.y 195
+yyss /usr/share/bison/bison.simple 85
+yyss /usr/share/bison/bison.simple 85
+yystate /usr/share/bison/bison.simple 757
+yystate /usr/share/bison/bison.simple 761
+yystate /usr/share/bison/bison.simple 875
+yystate /usr/share/bison/bison.simple 924
+yystate /usr/share/bison/bison.simple 757
+yystate /usr/share/bison/bison.simple 761
+yystate /usr/share/bison/bison.simple 875
+yystate /usr/share/bison/bison.simple 924
+yystpcpy /usr/share/bison/bison.simple 316
+yystpcpy /usr/share/bison/bison.simple /^yystpcpy (char *yydest, const char *yysrc)$/
+yystpcpy /usr/share/bison/bison.simple 316
+yystpcpy /usr/share/bison/bison.simple /^yystpcpy (char *yydest, const char *yysrc)$/
+yystrlen /usr/share/bison/bison.simple 293
+yystrlen /usr/share/bison/bison.simple /^yystrlen (const char *yystr)$/
+yystrlen /usr/share/bison/bison.simple 293
+yystrlen /usr/share/bison/bison.simple /^yystrlen (const char *yystr)$/
+yystype cccp.y 118
+yytable parse.y 269
+yytable cccp.y 277
+yytname parse.y 185
+yytname cccp.y 208
+yytranslate parse.y 101
+yytranslate cccp.y 135
+yyvs /usr/share/bison/bison.simple 86
+yyvs /usr/share/bison/bison.simple 86
+yyvsp /usr/share/bison/bison.simple 746
+yyvsp /usr/share/bison/bison.simple 919
+yyvsp /usr/share/bison/bison.simple 746
+yyvsp /usr/share/bison/bison.simple 919
+z c.c 144
+z c.c 164
+| tex-src/texinfo.tex /^\\def|{{\\tt \\char '174}}$/
+~ tex-src/texinfo.tex /^\\def~{{\\tt \\char '176}}$/
diff --git a/test/etags/ETAGS.good_1 b/test/etags/ETAGS.good_1
new file mode 100644
index 00000000000..6762bf30b44
--- /dev/null
+++ b/test/etags/ETAGS.good_1
@@ -0,0 +1,4216 @@
+
+Makefile,683
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,584
+ERLSRC=11,654
+FORTHSRC=12,699
+FSRC=13,749
+HTMLSRC=14,821
+LUASRC=16,950
+MAKESRC=17,993
+OBJCSRC=18,1035
+OBJCPPSRC=19,1116
+PASSRC=20,1179
+PERLSRC=21,1221
+PHPSRC=22,1291
+PSSRC=23,1363
+PROLSRC=24,1403
+PYTSRC=25,1465
+TEXSRC=26,1506
+YSRC=27,1585
+SRCS=28,1650
+NONSRCS=32,1902
+ETAGS_PROG=34,1976
+CTAGS_PROG=35,2007
+REGEX=37,2039
+xx=38,2085
+RUN=40,2134
+OPTIONS=42,2140
+ARGS=43,2192
+infiles 45,2210
+check:check47,2272
+ediff%:ediff%55,2575
+cdiff:cdiff58,2676
+ETAGS:ETAGS61,2773
+CTAGS:CTAGS64,2843
+srclist:srclist67,2921
+regexfile:regexfile71,3012
+.PRECIOUS:.PRECIOUS77,3189
+FRC:FRC79,3223
+
+ada-src/etags-test-for.ada,1969
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+ function Body_RequiredBody_Required/f3,78
+ type Type_Specific_Data Type_Specific_Data/t11,280
+ function "abs"abs/f19,504
+ type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+ function "="=/f27,722
+ type usfreelock_ptr usfreelock_ptr/t30,803
+ function p p/f33,891
+ procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+ type Private_T Private_T/t46,1220
+ package Inner1 Inner1/s48,1250
+ procedure Private_T;Private_T/p49,1270
+ package Inner2 Inner2/s52,1310
+ task Private_T;Private_T/k53,1330
+ type Public_T Public_T/t56,1365
+ procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+ procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+ function Pkg1_Func1 Pkg1_Func1/f66,1514
+ function Pkg1_Func2 Pkg1_Func2/f68,1553
+ package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+ task type Task_Type Task_Type/k75,1694
+ type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+ procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+ package body Inner1 Inner1/b96,1956
+ procedure Private_T Private_T/p97,1981
+ package body Inner2 Inner2/b103,2054
+ task body Private_T Private_T/b104,2079
+ task body Task_Type Task_Type/b112,2181
+ procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+ function Pkg1_Func1 Pkg1_Func1/f132,2445
+ function Pkg1_Func2 Pkg1_Func2/f134,2496
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+ protected Bidule Bidule/t168,2953
+ protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+ protected body Bidule Bidule/b179,3115
+ protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+ package RTE RTE/s69,2712
+ package TSL TSL/s70,2759
+ function To_void_ptr To_void_ptr/f86,3287
+ function To_TCB_Ptr To_TCB_Ptr/f89,3366
+ function pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+ function pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+ procedure Abort_WrapperAbort_Wrapper/p115,4302
+ procedure LL_Wrapper LL_Wrapper/p122,4526
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+ function Self Self/f160,5586
+ procedure Initialize_LockInitialize_Lock/p174,5958
+ procedure Finalize_Lock Finalize_Lock/p210,6927
+ procedure Write_Lock Write_Lock/p226,7338
+ procedure Read_Lock Read_Lock/p239,7700
+ procedure Unlock Unlock/p246,7850
+ procedure Initialize_Cond Initialize_Cond/p258,8160
+ procedure Finalize_Cond Finalize_Cond/p286,8979
+ procedure Cond_Wait Cond_Wait/p300,9303
+ procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+ procedure Cond_Signal Cond_Signal/p343,10510
+ procedure Set_PrioritySet_Priority/p355,10836
+ procedure Set_Own_Priority Set_Own_Priority/p372,11243
+ function Get_Priority Get_Priority/f385,11598
+ function Get_Own_Priority Get_Own_Priority/f398,12023
+ procedure Create_LL_TaskCreate_LL_Task/p412,12438
+ function To_Start_Addr To_Start_Addr/f426,12873
+ procedure Exit_LL_Task Exit_LL_Task/p491,14995
+ procedure Abort_Task Abort_Task/p500,15158
+ procedure Test_Abort Test_Abort/p518,15716
+ procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+ procedure Abort_WrapperAbort_Wrapper/p557,16939
+ function Address_To_Call_State Address_To_Call_State/f562,17062
+ procedure Install_Error_Handler Install_Error_Handler/p573,17351
+ procedure LL_Assert LL_Assert/p599,18146
+ procedure LL_Wrapper LL_Wrapper/p608,18299
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+ procedure Clear Clear/p640,19236
+ procedure Test_And_Set Test_And_Set/p645,19330
+ function Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+ type Pre_Call_State Pre_Call_State/t64,3331
+ type Task_Storage_Size Task_Storage_Size/t66,3378
+ type Machine_Exceptions Machine_Exceptions/t68,3433
+ type Error_Information Error_Information/t70,3499
+ type Lock Lock/t72,3569
+ type Condition_Variable Condition_Variable/t73,3594
+ type Task_Control_Block Task_Control_Block/t81,3955
+ type TCB_Ptr TCB_Ptr/t89,4241
+ function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+ function Self Self/f100,4602
+ procedure Initialize_Lock Initialize_Lock/p103,4707
+ procedure Finalize_Lock Finalize_Lock/p107,4879
+ procedure Write_Lock Write_Lock/p111,5034
+ procedure Read_Lock Read_Lock/p118,5428
+ procedure Unlock Unlock/p128,5995
+ procedure Initialize_Cond Initialize_Cond/p135,6300
+ procedure Finalize_Cond Finalize_Cond/p138,6413
+ procedure Cond_Wait Cond_Wait/p142,6591
+ procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+ procedure Cond_Signal Cond_Signal/p164,7812
+ procedure Set_Priority Set_Priority/p169,8040
+ procedure Set_Own_Priority Set_Own_Priority/p173,8200
+ function Get_Priority Get_Priority/f177,8348
+ function Get_Own_Priority Get_Own_Priority/f181,8504
+ procedure Create_LL_TaskCreate_LL_Task/p185,8647
+ procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+ procedure Abort_Task Abort_Task/p203,9516
+ procedure Test_Abort;Test_Abort/p210,9878
+ type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+ procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+ procedure Install_Error_Handler Install_Error_Handler/p226,10741
+ procedure LL_Assert LL_Assert/p231,10983
+ type Proc Proc/t238,11240
+ type TAS_Cell TAS_Cell/t242,11328
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+ procedure Clear Clear/p260,12157
+ procedure Test_And_Set Test_And_Set/p267,12462
+ function Is_Set Is_Set/f275,12877
+ type Lock Lock/t283,13155
+ type Condition_Variable Condition_Variable/t288,13267
+ type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+ type Private_T Private_T/t5,106
+ package Inner1 Inner1/s7,136
+ procedure Private_T;Private_T/p8,156
+ package Inner2 Inner2/s11,196
+ task Private_T;Private_T/k12,216
+ type Public_T Public_T/t15,251
+ procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+ procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+ function Pkg1_Func1 Pkg1_Func1/f25,400
+ function Pkg1_Func2 Pkg1_Func2/f27,439
+ package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+ task type Task_Type Task_Type/k34,580
+ type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+ procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+ package body Inner1 Inner1/b53,840
+ procedure Private_T Private_T/p54,865
+ package body Inner2 Inner2/b60,938
+ task body Private_T Private_T/b61,963
+ task body Task_Type Task_Type/b68,1064
+ procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+ function Pkg1_Func1 Pkg1_Func1/f88,1328
+ function Pkg1_Func2 Pkg1_Func2/f90,1379
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+ protected Bidule Bidule/t125,1964
+ protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+ protected body Bidule Bidule/b139,2181
+ protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,1432
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,147
+#define _GETOPT_H 19,801
+struct option73,2797
+#define no_argument 89,3124
+#define required_argument 90,3147
+#define optional_argument 91,3175
+
+c-src/etags.c,10045
+char pot_etags_version[pot_etags_version81,3470
+# undef DEBUG84,3552
+# define DEBUG 85,3567
+# define DEBUG 87,3594
+# define NDEBUG 88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef DOS_NT117,4160
+# define DOS_NT118,4176
+# undef assert 135,4482
+# define assert(136,4541
+# undef CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define iswhite(159,5329
+#define notinname(160,5394
+#define begtoken(161,5469
+#define intoken(162,5542
+#define endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+} compressor;188,6365
+} language;199,6835
+typedef struct fdesc201,6848
+} fdesc;212,7366
+typedef struct node_st214,7376
+} node;225,7894
+} linebuffer;239,8248
+ at_language,245,8344
+ at_regexp,246,8393
+ at_filename,247,8437
+ at_stdin,248,8473
+ at_end 249,8516
+} argument;253,8698
+typedef struct regexp256,8758
+} regexp;268,9325
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT 2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC 2199,69242
+enum sym_type2204,69312
+ st_none,2206,69328
+ st_C_objprot,2207,69339
+ st_C_objprot, st_C_objimpl,2207,69339
+ st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+ st_C_gnumacro,2208,69382
+ st_C_ignore,2209,69399
+ st_C_ignore, st_C_attribute,2209,69399
+ st_C_javastruct,2210,69430
+ st_C_operator,2211,69449
+ st_C_class,2212,69466
+ st_C_class, st_C_template,2212,69466
+ st_C_struct,2213,69495
+ st_C_struct, st_C_extern,2213,69495
+ st_C_struct, st_C_extern, st_C_enum,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+ TOTAL_KEYWORDS 2325,73018
+ MIN_WORD_LENGTH 2326,73045
+ MAX_WORD_LENGTH 2327,73072
+ MIN_HASH_VALUE 2328,73100
+ MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+ fvnone,2408,75435
+ fdefunkey,2409,75466
+ fdefunname,2410,75512
+ foperator,2411,75556
+ fvnameseen,2412,75613
+ fstartlist,2413,75666
+ finlist,2414,75722
+ flistseen,2415,75765
+ fignore,2416,75813
+ vignore 2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+ tnone,2428,76089
+ tkeyseen,2429,76119
+ ttypeseen,2430,76160
+ tinbody,2431,76199
+ tend,2432,76238
+ tignore 2433,76279
+} typdef;2434,76320
+ snone,2443,76499
+ skeyseen,2445,76575
+ stagseen,2446,76620
+ scolonseen 2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+ dnone,2460,76942
+ dsharpseen,2461,76972
+ ddefineseen,2462,77025
+ dignorerest 2463,77070
+} definedef;2464,77112
+ onone,2472,77267
+ oprotocol,2473,77297
+ oimplementation,2474,77347
+ otagseen,2475,77395
+ oparenseen,2476,77431
+ ocatseen,2477,77486
+ oinbody,2478,77525
+ omethodsign,2479,77568
+ omethodtag,2480,77626
+ omethodcolon,2481,77666
+ omethodparm,2482,77709
+ oignore 2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+} token;2508,78626
+} cstack;2523,79136
+#define nestlev 2525,79264
+#define instruct 2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+consider_token 2613,81341
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,47
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,47
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define ENTRY(21,865
+#define PSEUDO(26,972
+ movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+ movl $SYS_##syscall_name, %eax;eax31,1132
+ int $0x80;32,1180
+ test %eax,eax33,1210
+ test %eax, %eax;eax33,1210
+ jl syscall_error;34,1245
+#define XCHG_0 47,1562
+#define XCHG_1 48,1606
+#define XCHG_2 49,1648
+#define XCHG_3 50,1691
+#define XCHG_4 51,1734
+#define XCHG_5 52,1777
+#define r0 54,1821
+#define r1 55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int count_words(15,263
+static char *get_word(get_word35,553
+void tab_free(59,966
+char **tab_fill(tab_fill70,1129
+int tab_delete_first(91,1638
+int tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,3539
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT 124,3934
+#define BLOCKLOG 125,3977
+#define BLOCKSIZE 126,4018
+#define BLOCKIFY(127,4052
+#define HEAP 131,4215
+#define FINAL_FREE_BLOCKS 135,4391
+ } malloc_info;167,5388
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+struct list186,5939
+struct alignlist196,6153
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+enum mcheck_status283,9092
+ MCHECK_DISABLED 285,9115
+ MCHECK_OK,286,9187
+ MCHECK_FREE,287,9226
+ MCHECK_HEAD,288,9270
+ MCHECK_TAIL 289,9334
+struct mstats308,10153
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define __sbrk 1513,46042
+__default_morecore 1525,46511
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+hybrid_get_current_dir_name 1811,53797
+#define MAGICWORD 1854,55206
+#define MAGICFREE 1855,55261
+#define MAGICBYTE 1856,55316
+#define MALLOCFLOOD 1857,55348
+#define FREEFLOOD 1858,55382
+struct hdr1860,55415
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,3761
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+#define RE_SYNTAX_EMACS 183,7684
+#define RE_SYNTAX_AWK 186,7780
+#define RE_SYNTAX_GNU_AWK 193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP 206,8549
+#define RE_SYNTAX_POSIX_EGREP 212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON 221,9072
+#define RE_SYNTAX_POSIX_BASIC 225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC 231,9508
+#define RE_SYNTAX_POSIX_EXTENDED 234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED 242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+ REG_ENOSYS 297,11859
+ REG_NOERROR 300,11941
+ REG_NOMATCH,301,11976
+ REG_BADPAT,305,12123
+ REG_ECOLLATE,306,12162
+ REG_ECTYPE,307,12203
+ REG_EESCAPE,308,12255
+ REG_ESUBREG,309,12298
+ REG_EBRACK,310,12345
+ REG_EPAREN,311,12391
+ REG_EBRACE,312,12436
+ REG_BADBR,313,12472
+ REG_ERANGE,314,12519
+ REG_ESPACE,315,12560
+ REG_BADRPT,316,12601
+ REG_EEND,319,12693
+ REG_ESIZE,320,12728
+ REG_ERPAREN,321,12790
+ REG_ERANGEX 322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+# define RE_NREGS 440,16942
+} regmatch_t;451,17317
+# define _Restrict_ 540,20886
+# define _Restrict_ 542,20979
+# define _Restrict_544,21018
+# define _Restrict_arr_ 555,21418
+# define _Restrict_arr_557,21461
+# define CHAR_CLASS_MAX_LENGTH 593,22470
+# define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+ RECC_ALNUM,610,22984
+ RECC_ALNUM, RECC_ALPHA,610,22984
+ RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+ RECC_GRAPH,611,23027
+ RECC_GRAPH, RECC_PRINT,611,23027
+ RECC_LOWER,612,23059
+ RECC_LOWER, RECC_UPPER,612,23059
+ RECC_PUNCT,613,23091
+ RECC_PUNCT, RECC_CNTRL,613,23091
+ RECC_DIGIT,614,23123
+ RECC_DIGIT, RECC_XDIGIT,614,23123
+ RECC_BLANK,615,23156
+ RECC_BLANK, RECC_SPACE,615,23156
+ RECC_MULTIBYTE,616,23188
+ RECC_MULTIBYTE, RECC_NONASCII,616,23188
+ RECC_ASCII,617,23227
+ RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+typedef int re_wchar_t;623,23387
+
+c-src/emacs/src/keyboard.c,13565
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF 119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard *ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+unsigned timers_run;320,11296
+struct timespec *input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW 346,12046
+#define READABLE_EVENTS_FILTER_EVENTS 347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES 348,12142
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", Fcommand_error_default_function,command-error-default-function1043,32030
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING 2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+
+c-src/emacs/src/lisp.h,20567
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+# define EMACS_INT_MAX 93,3079
+# define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+# define EMACS_INT_MAX 98,3265
+# define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+# define EMACS_INT_MAX 105,3553
+# define pI 106,3587
+enum { BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+ BITS_PER_CHAR 136,4570
+ BITS_PER_SHORT 137,4605
+ BITS_PER_LONG 138,4657
+ BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+ VALBITS 246,8742
+ INTTYPEBITS 249,8838
+ FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+# define check_cons_list(405,15097
+# define make_number(408,15176
+# define XFASTINT(409,15224
+# define XINT(410,15266
+# define XSYMBOL(411,15300
+# define XTYPE(412,15340
+# define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+ Lisp_Symbol 454,16851
+ Lisp_Misc 458,16993
+ Lisp_Int0 461,17067
+ Lisp_Int1 462,17086
+ Lisp_String 466,17264
+ Lisp_Vectorlike 472,17543
+ Lisp_Cons 475,17632
+ Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+ Lisp_Misc_Free 487,18040
+ Lisp_Misc_Marker,488,18069
+ Lisp_Misc_Overlay,489,18091
+ Lisp_Misc_Save_Value,490,18114
+ Lisp_Misc_Finalizer,491,18140
+ Lisp_Misc_Float,494,18275
+ Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+ Lisp_Fwd_Int,504,18566
+ Lisp_Fwd_Bool,505,18619
+ Lisp_Fwd_Obj,506,18670
+ Lisp_Fwd_Buffer_Obj,507,18729
+ Lisp_Fwd_Kboard_Obj 508,18800
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+enum symbol_interned639,24199
+ SYMBOL_UNINTERNED 641,24222
+ SYMBOL_INTERNED 642,24247
+ SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+ SYMBOL_PLAINVAL 648,24338
+ SYMBOL_VARALIAS 649,24362
+ SYMBOL_LOCALIZED 650,24386
+ SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+ ENUM_BF 663,24793
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY 712,26446
+#define DEFUN_ARGS_UNEVALLED 713,26498
+#define DEFUN_ARGS_0 714,26541
+#define DEFUN_ARGS_1 715,26569
+#define DEFUN_ARGS_2 716,26604
+#define DEFUN_ARGS_3 717,26652
+#define DEFUN_ARGS_4 718,26713
+#define DEFUN_ARGS_5 719,26787
+#define DEFUN_ARGS_6 721,26880
+#define DEFUN_ARGS_7 723,26986
+#define DEFUN_ARGS_8 725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+ PVEC_NORMAL_VECTOR,782,29585
+ PVEC_FREE,783,29607
+ PVEC_PROCESS,784,29620
+ PVEC_FRAME,785,29636
+ PVEC_WINDOW,786,29650
+ PVEC_BOOL_VECTOR,787,29665
+ PVEC_BUFFER,788,29685
+ PVEC_HASH_TABLE,789,29700
+ PVEC_TERMINAL,790,29719
+ PVEC_WINDOW_CONFIGURATION,791,29736
+ PVEC_SUBR,792,29765
+ PVEC_OTHER,793,29778
+ PVEC_COMPILED,795,29856
+ PVEC_CHAR_TABLE,796,29873
+ PVEC_SUB_CHAR_TABLE,797,29892
+ PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+ PSEUDOVECTOR_SIZE_BITS 808,30382
+ PSEUDOVECTOR_SIZE_MASK 809,30415
+ PSEUDOVECTOR_REST_BITS 813,30625
+ PSEUDOVECTOR_REST_MASK 814,30658
+ PSEUDOVECTOR_AREA_BITS 818,30823
+ PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+struct Lisp_Vector1369,46482
+ ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+ header_size 1471,49047
+ bool_header_size 1472,49106
+ word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+ CHARTAB_SIZE_BITS_0 1567,52516
+ CHARTAB_SIZE_BITS_1 1568,52545
+ CHARTAB_SIZE_BITS_2 1569,52574
+ CHARTAB_SIZE_BITS_3 1570,52603
+struct Lisp_Char_Table1575,52672
+struct Lisp_Sub_Char_Table1606,53752
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+enum char_table_specials1692,56798
+ CHAR_TABLE_STANDARD_SLOTS 1697,56993
+ SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+struct Lisp_Hash_Table1823,60555
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any 1971,64806
+ ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+ ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+ ENUM_BF 2034,67346
+ SAVE_UNUSED,2047,67641
+ SAVE_INTEGER,2048,67658
+ SAVE_FUNCPOINTER,2049,67676
+ SAVE_POINTER,2050,67698
+ SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+ SAVE_TYPE_INT_INT 2066,68096
+ SAVE_TYPE_INT_INT_INT2067,68169
+ SAVE_TYPE_OBJ_OBJ 2069,68259
+ SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+ SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+ SAVE_TYPE_PTR_INT 2073,68506
+ SAVE_TYPE_PTR_OBJ 2074,68579
+ SAVE_TYPE_PTR_PTR 2075,68651
+ SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+ SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+ ENUM_BF 2112,69900
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+struct Lisp_Free2201,72581
+ ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+struct Lisp_Boolfwd2284,74411
+struct Lisp_Objfwd2294,74702
+struct Lisp_Buffer_Objfwd2302,74934
+struct Lisp_Buffer_Local_Value2334,76470
+struct Lisp_Kboard_Objfwd2362,77729
+union Lisp_Fwd2368,77838
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+XFLOAT_DATA 2401,78434
+ IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+ COMPILED_ARGLIST 2431,79389
+ COMPILED_BYTECODE 2432,79415
+ COMPILED_CONSTANTS 2433,79442
+ COMPILED_STACK_DEPTH 2434,79470
+ COMPILED_DOC_STRING 2435,79500
+ COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+ CHAR_ALT 2445,79850
+ CHAR_SUPER 2446,79876
+ CHAR_HYPER 2447,79904
+ CHAR_SHIFT 2448,79932
+ CHAR_CTL 2449,79960
+ CHAR_META 2450,79986
+ CHAR_MODIFIER_MASK 2452,80014
+ CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+enum maxargs2831,89401
+ MANY 2833,89418
+ UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+ SPECPDL_UNWIND,2944,93822
+ SPECPDL_UNWIND_PTR,2945,93891
+ SPECPDL_UNWIND_INT,2946,93942
+ SPECPDL_UNWIND_VOID,2947,93990
+ SPECPDL_BACKTRACE,2948,94044
+ SPECPDL_LET,2949,94102
+ SPECPDL_LET_LOCAL,2951,94232
+ SPECPDL_LET_DEFAULT 2952,94289
+union specbinding2955,94361
+ ENUM_BF 2957,94383
+ ENUM_BF 2959,94440
+ ENUM_BF 2964,94570
+ ENUM_BF 2969,94693
+ ENUM_BF 2974,94811
+ ENUM_BF 2978,94916
+ ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+#define PUSH_HANDLER(3053,97443
+#define QUIT 3101,99220
+#define QUITP 3112,99470
+struct gcpro3132,100313
+#define GC_USE_GCPROS_AS_BEFORE 3171,101294
+#define GC_MAKE_GCPROS_NOOPS 3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS 3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES 3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO 3353,109913
+#define RETURN_UNGCPRO(3363,110180
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+enum Arith_Comparison 3497,113300
+ ARITH_EQUAL,3498,113324
+ ARITH_NOTEQUAL,3499,113339
+ ARITH_LESS,3500,113357
+ ARITH_GRTR,3501,113371
+ ARITH_LESS_OR_EQUAL,3502,113385
+ ARITH_GRTR_OR_EQUAL3503,113408
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_formatted_string 3767,124631
+build_pure_c_string 3792,125659
+build_string 3801,125864
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+intern 3968,132131
+intern_c_string 3974,132219
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern _Noreturn void emacs_abort 4374,148383
+egetenv 4532,152806
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA 4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+union Aligned_String4676,157349
+ USE_STACK_CONS 4689,157704
+ USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/h.h,1850
+ ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+typedef struct tpcmd8,147
+#define ggg 10,170
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+} foobar2;20,307
+ DEVICE_SWP,23,333
+ DEVICE_LAST24,349
+} bsp_DevId;25,365
+ struct constant_args 27,394
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+} ghi1;36,534
+typedef union abc 37,542
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage *an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+} an_extern_linkage;56,1054
+typedef struct pollfd pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+ } womboid 63,1206
+typedef union rtunion_def64,1220
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+ Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous 117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+
+cp-src/c.C,2225
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+ void execute(CMultiChannelCSC19_3D::execute11,493
+int main 25,1026
+double base 26,1088
+typedef struct s1 32,1251
+} t1;34,1287
+struct s2 35,1293
+typedef struct s2 t2;38,1324
+class A 39,1346
+ enum { rosso,A::rosso40,1356
+ enum { rosso, giallo,A::giallo40,1356
+ enum { rosso, giallo, verde A::verde40,1356
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+class AU 53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A 57,1826
+ A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+ void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct B 74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+class test 86,2156
+ int f(test::f87,2169
+ int ff(test::ff89,2231
+ int g(test::g90,2254
+class AST_Root 92,2278
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+ void f(::f115,2733
+struct A 117,2753
+A::~A(120,2777
+struct B 122,2789
+ ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+ enum {dog,Boo::dog130,2880
+ enum {dog, cat}Boo::cat130,2880
+ foo(Boo::foo133,2954
+ Boo(Boo::Boo137,2995
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,709
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2 78,2022
+ MDiagArray2 MDiagArray2::MDiagArray282,2077
+ MDiagArray2 MDiagArray2::MDiagArray286,2154
+ MDiagArray2 MDiagArray2::MDiagArray287,2198
+ MDiagArray2 MDiagArray2::MDiagArray288,2254
+ MDiagArray2 MDiagArray2::MDiagArray289,2329
+ MDiagArray2 MDiagArray2::MDiagArray290,2387
+ MDiagArray2 MDiagArray2::MDiagArray291,2450
+ ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+ MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+ operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Range.h,424
+#define octave_Range_h 24,765
+Range35,891
+ Range Range::Range39,909
+ Range Range::Range42,995
+ Range Range::Range46,1130
+ Range Range::Range50,1248
+ double base Range::base54,1376
+ double limit Range::limit55,1425
+ double inc Range::inc56,1475
+ int nelem Range::nelem57,1523
+ void set_base Range::set_base68,1728
+ void set_limit Range::set_limit69,1774
+ void set_inc Range::set_inc70,1821
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,667
+#define __COLORS9,401
+enum COLORS 11,419
+ BLACK,COLORS::BLACK12,433
+ BLUE,COLORS::BLUE13,471
+ GREEN,COLORS::GREEN14,481
+ CYAN,COLORS::CYAN15,492
+ RED,COLORS::RED16,502
+ MAGENTA,COLORS::MAGENTA17,511
+ BROWN,COLORS::BROWN18,524
+ LIGHTGRAY,COLORS::LIGHTGRAY19,535
+ DARKGRAY,COLORS::DARKGRAY20,550
+ LIGHTBLUE,COLORS::LIGHTBLUE21,589
+ LIGHTGREEN,COLORS::LIGHTGREEN22,604
+ LIGHTCYAN,COLORS::LIGHTCYAN23,620
+ LIGHTRED,COLORS::LIGHTRED24,635
+ LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+ YELLOW,COLORS::YELLOW26,667
+ WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,244
+class site:site5,235
+ site(site::site10,344
+ char read(site::read12,410
+ void set(site::set13,444
+ void clear(site::clear14,478
+ void compute_next_state(site::compute_next_state15,514
+ void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,609
+class generic_object13,520
+ virtual void compute_next_state(generic_object::compute_next_state21,842
+ virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+ location(location::location43,1642
+class irregular_location:irregular_location47,1686
+ irregular_location(irregular_location::irregular_location51,1762
+class discrete_location:discrete_location56,1889
+ discrete_location(discrete_location::discrete_location62,2044
+ void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+
+cp-src/fail.C,365
+struct A 7,263
+ struct B A::B8,274
+ struct C A::B::C9,289
+ C(A::B::C::C11,318
+ operator int(A::B::C::operator int12,342
+ typedef C T;A::B::T14,389
+ typedef B T2;A::T216,414
+class A 23,453
+ class B A::B24,463
+ class C A::B::C25,474
+ int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+ class D 41,622
+ D(D::D43,659
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5069
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+f-src/entry.for,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+ ENTRY MSGSEL 193,4382
+ & intensity1(375,8135
+ character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+ 9 field >field136,582
+ 5 field >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1133
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+ @-$($72,3064
+ @-$($73,3113
+ @-$($74,3177
+ @-$($75,3223
+ @-$($76,3291
+ @-$($77,3383
+ @$(81,3466
+ @$(82,3514
+ @$(83,3577
+ @$(84,3622
+ @$(85,3689
+ @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+ @env CHECKEROPTS=92,3922
+ @$(98,4094
+ @$(106,4250
+ @$(110,4374
+ @$(114,4500
+ @for i in $(SRCS); do echo $$i;140,5315
+ $(160,6053
+ $(163,6114
+ $(166,6177
+ $(169,6228
+ $(172,6317
+ sdiff --suppress-common-lines --width=width186,6614
+ sdiff --suppress-common-lines --width=width189,6703
+ sdiff --suppress-common-lines --width=width192,6791
+ sdiff --suppress-common-lines --width=width195,6880
+ TEXTAGS=204,7122
+ TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* --regex=regex204,7122
+ ${RUN} etags12 --members -o $@ --regex=regex207,7239
+ ${RUN} ./ctags -o $@ --regex=regex213,7388
+ ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+ TEXTAGS=219,7583
+ TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ --regex=regex219,7583
+ ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
+@interface Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,475
+#define PTY_TEMPLATE 20,494
+#define PTY_LENGTH 21,528
+@interface Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+ andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS 36,1101
+#define TYPESTOSTAT 37,1120
+@interface PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION 34,1116
+# define DEBUG 37,1155
+#define LISTCONTENTS 39,1181
+#define OPENBUTTON 47,1352
+#define LISTCONTENTSBUTTON 48,1449
+#define LISTDESCRIPTIONBUTTON 49,1562
+#define STATE_UNINSTALLED 52,1687
+#define STATE_INSTALLED 53,1807
+#define STATE_COMPRESSD 54,1948
+#define SIZEFORMAT 57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING 368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
+@interface SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2152
+ define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+ define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+ define("LCE_WS"LCE_WS11,194
+ define("LCE_COMMENT"LCE_COMMENT13,244
+ define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+ define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+ define("LCE_MSGID"LCE_MSGID19,430
+ define("LCE_MSGSTR"LCE_MSGSTR21,488
+ define("LCE_TEXT"LCE_TEXT23,541
+ define("STATE_ABORT"STATE_ABORT25,567
+ define("STATE_OK"STATE_OK26,595
+ define("STATE_LOOP"STATE_LOOP27,620
+ class POEntryAD 29,648
+ function validate(31,683
+ function checkQuotation(59,1384
+ class CommentAD 70,1639
+ function CommentAD(73,1693
+ function validate(83,1944
+ class POEntry 105,2410
+ function POEntry(119,2711
+ function lineCount(135,3255
+ function serializeToVars(141,3365
+ function write(151,3800
+ class POReader 163,4178
+ function gettext(177,4457
+ function parseFromVars(189,4705
+ function serializeToVars(215,5331
+ function POReader(229,5613
+ function read(243,5983
+ function write(259,6307
+ function isComment(277,6645
+ function comment(284,6822
+ function msgid(304,7247
+ function msgstr(320,7574
+ function start(340,8232
+ function createPOEntries(360,8644
+ function stripLine(394,9472
+ function printClassification(421,10056
+ function classifyLine(432,10301
+ function getTextDomains(471,11094
+ class PORManager 498,11756
+ function PORManager(502,11822
+ function addPOReader(507,11896
+ function &getPOReader(getPOReader512,11992
+ function getDomainNames(517,12081
+ function &loadPORManager(loadPORManager523,12174
+ function fileJoin(536,12436
+ function lce_bindtextdomain(557,12839
+ function lce_textdomain(614,14530
+ function lce_gettext(620,14641
+ function lce_dgettext(626,14767
+ function lce(634,14966
+ function lce_bindtextdomain(651,15488
+ function lce_textdomain(656,15592
+ function lce_gettext(661,15674
+ function lce_dgettext(666,15755
+ function lce(670,15855
+ function lce_geteditcode(676,15898
+
+php-src/ptest.php,46
+define("TEST"TEST1,0
+test 4,26
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+ my $entry entry218,5621
+ my $entry entry234,6077
+ my $entry entry245,6351
+ my $entry entry252,6536
+ my $entry entry268,7010
+ my $entry entry276,7204
+ my $entry entry281,7328
+ my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+ my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+ local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+ local($prog,$_,@list)($prog,$_,@list39,868
+ local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+ def __init__(18,374
+ def __repr__(24,590
+ def __str__(34,871
+class Server:Server37,934
+ def __init__(38,948
+ def dump(73,2198
+ def __repr__(125,3896
+ def __str__(128,3945
+class User:User131,4014
+ def __init__(132,4026
+ def __repr__(172,5445
+ def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+ def bind(234,7525
+ def focus_set(236,7584
+ def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+ def __init__(269,8808
+ def handleList(303,10042
+ def handleNew(306,10094
+ def editItem(314,10426
+ def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+ def PostControls(376,12403
+ def GatherControls(421,13530
+class ServerEdit(512,16264
+ def __init__(513,16289
+ def post(525,16629
+ def gather(543,17191
+ def nosave(547,17304
+ def save(551,17408
+ def refreshPort(556,17509
+ def createWidgets(561,17663
+ def edituser(631,20708
+class UserEdit(645,20921
+ def __init__(646,20944
+ def post(658,21283
+ def gather(676,21841
+ def nosave(680,21950
+ def save(684,22052
+ def createWidgets(689,22151
+class Configure(760,24879
+ def __init__(761,24916
+ def MakeDispose(772,25211
+ def MakeSitelist(786,25706
+ def editsite(794,25949
+ def save(797,26022
+ def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
+@node Top,62,2139
+@node Copying,80,2652
+@node Overview,83,2705
+@node Sample,166,7272
+@node Invoking gzip,Invoking gzip210,8828
+@node Advanced usage,Advanced usage357,13495
+@node Environment,420,15207
+@node Tapes,437,15768
+@node Problems,460,16767
+@node Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
+\def\@{\@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+ \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+ \def\subtitlefont{\subtitlefont765,24968
+ \def\authorfont{\authorfont767,25052
+ \def\title{\title773,25262
+ \def\titlezzz##1{\titlezzz774,25297
+ \def\subtitle{\subtitle782,25612
+ \def\subtitlezzz##1{\subtitlezzz783,25653
+ \def\author{\author786,25771
+ \def\authorzzz##1{\authorzzz787,25808
+ \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+ \def\thearg{\thearg1145,37720
+ \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0 %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+ \def\indexbackslash{\indexbackslash1480,48406
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+ \null\nobreak\indexdotfill % Have leaders before the page number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+ \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno \appendixno = `\@no1626,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+ {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+ {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+ {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+ \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+ \def\secentry ##1##2##3##4{\secentry2066,68220
+ \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+ \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+ \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+ \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+ \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+ {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
+\def\@{\@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+ \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1663
+my_printf 135,
+void fatala 138,
+max 141,
+struct bar 143,
+__attribute__ ((always_inline)) max 147,
+struct foo150,
+char stack[stack155,
+struct S 156,
+} wait_status_ptr_t 161,
+Some_Class A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+ f1 183,
+void f2 184,
+int x 188,
+struct foo 189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,x-get-selection-internal206,
+ Fx_get_selection_internal,x-get-selection-internal212,
+ Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+ aaa;249,
+ bbb;251,
+struct sss1 252,
+struct sss2253,
+ struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+ **b;b262,
+caccacacca 263,
+a 267,
+ typedef struct aa 269,
+ typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+ typedef int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,738
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+VOIDSTAR parse_hash;63,1400
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+char *instr;instr80,1790
+int parse_error 81,1803
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define NE 6,114
+# define LE 7,130
+# define GE 8,146
+# define NEG 9,162
+# define L_CELL 10,179
+# define L_RANGE 11,199
+# define L_VAR 12,220
+# define L_CONST 13,239
+# define L_FN0 14,260
+# define L_FN1 15,279
+# define L_FN2 16,298
+# define L_FN3 17,317
+# define L_FN4 18,336
+# define L_FNN 19,355
+# define L_FN1R 20,374
+# define L_FN2R 21,394
+# define L_FN3R 22,414
+# define L_FN4R 23,434
+# define L_FNNR 24,454
+# define L_LE 25,474
+# define L_NE 26,492
+# define L_GE 27,510
+
+parse.y,1181
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+VOIDSTAR parse_hash;63,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+char *instr;instr80,
+int parse_error 81,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define YYFINAL 93,
+#define YYFLAG 94,
+#define YYNTBASE 95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define YYLAST 266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyresult 947,
+
+y-src/atest.y,9
+exp 2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define INT 6,113
+# define CHAR 7,130
+# define NAME 8,148
+# define ERROR 9,166
+# define OR 10,185
+# define AND 11,201
+# define EQUAL 12,218
+# define NOTEQUAL 13,237
+# define LEQ 14,259
+# define GEQ 15,276
+# define LSH 16,293
+# define RSH 17,310
+# define UNARY 18,327
+
+cccp.y,1579
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+ struct constant 113,
+ struct name 114,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define YYFINAL 127,
+#define YYFLAG 128,
+#define YYNTBASE 129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define YYLAST 274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyresult 947,
+
+y-src/cccp.y,1107
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+ struct constant 112,2733
+ struct name 113,2789
+start 143,3226
+exp1 148,3330
+exp 156,3505
+exp 185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+c-src/fail.c,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_2 b/test/etags/ETAGS.good_2
new file mode 100644
index 00000000000..32b58d87984
--- /dev/null
+++ b/test/etags/ETAGS.good_2
@@ -0,0 +1,4842 @@
+
+Makefile,683
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,584
+ERLSRC=11,654
+FORTHSRC=12,699
+FSRC=13,749
+HTMLSRC=14,821
+LUASRC=16,950
+MAKESRC=17,993
+OBJCSRC=18,1035
+OBJCPPSRC=19,1116
+PASSRC=20,1179
+PERLSRC=21,1221
+PHPSRC=22,1291
+PSSRC=23,1363
+PROLSRC=24,1403
+PYTSRC=25,1465
+TEXSRC=26,1506
+YSRC=27,1585
+SRCS=28,1650
+NONSRCS=32,1902
+ETAGS_PROG=34,1976
+CTAGS_PROG=35,2007
+REGEX=37,2039
+xx=38,2085
+RUN=40,2134
+OPTIONS=42,2140
+ARGS=43,2192
+infiles 45,2210
+check:check47,2272
+ediff%:ediff%55,2575
+cdiff:cdiff58,2676
+ETAGS:ETAGS61,2773
+CTAGS:CTAGS64,2843
+srclist:srclist67,2921
+regexfile:regexfile71,3012
+.PRECIOUS:.PRECIOUS77,3189
+FRC:FRC79,3223
+
+ada-src/etags-test-for.ada,1969
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+ function Body_RequiredBody_Required/f3,78
+ type Type_Specific_Data Type_Specific_Data/t11,280
+ function "abs"abs/f19,504
+ type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+ function "="=/f27,722
+ type usfreelock_ptr usfreelock_ptr/t30,803
+ function p p/f33,891
+ procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+ type Private_T Private_T/t46,1220
+ package Inner1 Inner1/s48,1250
+ procedure Private_T;Private_T/p49,1270
+ package Inner2 Inner2/s52,1310
+ task Private_T;Private_T/k53,1330
+ type Public_T Public_T/t56,1365
+ procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+ procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+ function Pkg1_Func1 Pkg1_Func1/f66,1514
+ function Pkg1_Func2 Pkg1_Func2/f68,1553
+ package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+ task type Task_Type Task_Type/k75,1694
+ type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+ procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+ package body Inner1 Inner1/b96,1956
+ procedure Private_T Private_T/p97,1981
+ package body Inner2 Inner2/b103,2054
+ task body Private_T Private_T/b104,2079
+ task body Task_Type Task_Type/b112,2181
+ procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+ function Pkg1_Func1 Pkg1_Func1/f132,2445
+ function Pkg1_Func2 Pkg1_Func2/f134,2496
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+ protected Bidule Bidule/t168,2953
+ protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+ protected body Bidule Bidule/b179,3115
+ protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+ package RTE RTE/s69,2712
+ package TSL TSL/s70,2759
+ function To_void_ptr To_void_ptr/f86,3287
+ function To_TCB_Ptr To_TCB_Ptr/f89,3366
+ function pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+ function pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+ procedure Abort_WrapperAbort_Wrapper/p115,4302
+ procedure LL_Wrapper LL_Wrapper/p122,4526
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+ function Self Self/f160,5586
+ procedure Initialize_LockInitialize_Lock/p174,5958
+ procedure Finalize_Lock Finalize_Lock/p210,6927
+ procedure Write_Lock Write_Lock/p226,7338
+ procedure Read_Lock Read_Lock/p239,7700
+ procedure Unlock Unlock/p246,7850
+ procedure Initialize_Cond Initialize_Cond/p258,8160
+ procedure Finalize_Cond Finalize_Cond/p286,8979
+ procedure Cond_Wait Cond_Wait/p300,9303
+ procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+ procedure Cond_Signal Cond_Signal/p343,10510
+ procedure Set_PrioritySet_Priority/p355,10836
+ procedure Set_Own_Priority Set_Own_Priority/p372,11243
+ function Get_Priority Get_Priority/f385,11598
+ function Get_Own_Priority Get_Own_Priority/f398,12023
+ procedure Create_LL_TaskCreate_LL_Task/p412,12438
+ function To_Start_Addr To_Start_Addr/f426,12873
+ procedure Exit_LL_Task Exit_LL_Task/p491,14995
+ procedure Abort_Task Abort_Task/p500,15158
+ procedure Test_Abort Test_Abort/p518,15716
+ procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+ procedure Abort_WrapperAbort_Wrapper/p557,16939
+ function Address_To_Call_State Address_To_Call_State/f562,17062
+ procedure Install_Error_Handler Install_Error_Handler/p573,17351
+ procedure LL_Assert LL_Assert/p599,18146
+ procedure LL_Wrapper LL_Wrapper/p608,18299
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+ procedure Clear Clear/p640,19236
+ procedure Test_And_Set Test_And_Set/p645,19330
+ function Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+ type Pre_Call_State Pre_Call_State/t64,3331
+ type Task_Storage_Size Task_Storage_Size/t66,3378
+ type Machine_Exceptions Machine_Exceptions/t68,3433
+ type Error_Information Error_Information/t70,3499
+ type Lock Lock/t72,3569
+ type Condition_Variable Condition_Variable/t73,3594
+ type Task_Control_Block Task_Control_Block/t81,3955
+ type TCB_Ptr TCB_Ptr/t89,4241
+ function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+ function Self Self/f100,4602
+ procedure Initialize_Lock Initialize_Lock/p103,4707
+ procedure Finalize_Lock Finalize_Lock/p107,4879
+ procedure Write_Lock Write_Lock/p111,5034
+ procedure Read_Lock Read_Lock/p118,5428
+ procedure Unlock Unlock/p128,5995
+ procedure Initialize_Cond Initialize_Cond/p135,6300
+ procedure Finalize_Cond Finalize_Cond/p138,6413
+ procedure Cond_Wait Cond_Wait/p142,6591
+ procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+ procedure Cond_Signal Cond_Signal/p164,7812
+ procedure Set_Priority Set_Priority/p169,8040
+ procedure Set_Own_Priority Set_Own_Priority/p173,8200
+ function Get_Priority Get_Priority/f177,8348
+ function Get_Own_Priority Get_Own_Priority/f181,8504
+ procedure Create_LL_TaskCreate_LL_Task/p185,8647
+ procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+ procedure Abort_Task Abort_Task/p203,9516
+ procedure Test_Abort;Test_Abort/p210,9878
+ type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+ procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+ procedure Install_Error_Handler Install_Error_Handler/p226,10741
+ procedure LL_Assert LL_Assert/p231,10983
+ type Proc Proc/t238,11240
+ type TAS_Cell TAS_Cell/t242,11328
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+ procedure Clear Clear/p260,12157
+ procedure Test_And_Set Test_And_Set/p267,12462
+ function Is_Set Is_Set/f275,12877
+ type Lock Lock/t283,13155
+ type Condition_Variable Condition_Variable/t288,13267
+ type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+ type Private_T Private_T/t5,106
+ package Inner1 Inner1/s7,136
+ procedure Private_T;Private_T/p8,156
+ package Inner2 Inner2/s11,196
+ task Private_T;Private_T/k12,216
+ type Public_T Public_T/t15,251
+ procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+ procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+ function Pkg1_Func1 Pkg1_Func1/f25,400
+ function Pkg1_Func2 Pkg1_Func2/f27,439
+ package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+ task type Task_Type Task_Type/k34,580
+ type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+ procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+ package body Inner1 Inner1/b53,840
+ procedure Private_T Private_T/p54,865
+ package body Inner2 Inner2/b60,938
+ task body Private_T Private_T/b61,963
+ task body Task_Type Task_Type/b68,1064
+ procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+ function Pkg1_Func1 Pkg1_Func1/f88,1328
+ function Pkg1_Func2 Pkg1_Func2/f90,1379
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+ protected Bidule Bidule/t125,1964
+ protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+ protected body Bidule Bidule/b139,2181
+ protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,1432
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,538
+#define _GETOPT_H 19,801
+extern char *optarg;optarg31,1109
+extern int optind;45,1617
+extern int opterr;50,1743
+struct option73,2797
+#define no_argument 89,3124
+#define required_argument 90,3147
+#define optional_argument 91,3175
+extern int getopt 98,3440
+extern int getopt 100,3544
+extern int getopt_long 102,3599
+extern int getopt_long_only 104,3731
+extern int _getopt_internal 109,3942
+extern int getopt 114,4140
+extern int getopt_long 115,4162
+extern int getopt_long_only 116,4189
+extern int _getopt_internal 118,4222
+
+c-src/etags.c,12175
+char pot_etags_version[pot_etags_version81,3470
+# undef DEBUG84,3552
+# define DEBUG 85,3567
+# define DEBUG 87,3594
+# define NDEBUG 88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef DOS_NT117,4160
+# define DOS_NT118,4176
+# undef assert 135,4482
+# define assert(136,4541
+# undef CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define iswhite(159,5329
+#define notinname(160,5394
+#define begtoken(161,5469
+#define intoken(162,5542
+#define endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+} compressor;188,6365
+} language;199,6835
+typedef struct fdesc201,6848
+} fdesc;212,7366
+typedef struct node_st214,7376
+} node;225,7894
+} linebuffer;239,8248
+ at_language,245,8344
+ at_regexp,246,8393
+ at_filename,247,8437
+ at_stdin,248,8473
+ at_end 249,8516
+} argument;253,8698
+typedef struct regexp256,8758
+} regexp;268,9325
+static void Ada_funcs 274,9428
+static void Asm_labels 275,9460
+static void C_entries 276,9493
+static void default_C_entries 277,9536
+static void plain_C_entries 278,9576
+static void Cjava_entries 279,9614
+static void Cobol_paragraphs 280,9650
+static void Cplusplus_entries 281,9689
+static void Cstar_entries 282,9729
+static void Erlang_functions 283,9765
+static void Forth_words 284,9804
+static void Fortran_functions 285,9838
+static void HTML_labels 286,9878
+static void Lisp_functions 287,9912
+static void Lua_functions 288,9949
+static void Makefile_targets 289,9985
+static void Pascal_functions 290,10024
+static void Perl_functions 291,10063
+static void PHP_functions 292,10100
+static void PS_functions 293,10136
+static void Prolog_functions 294,10171
+static void Python_functions 295,10210
+static void Scheme_functions 296,10249
+static void TeX_commands 297,10288
+static void Texinfo_nodes 298,10323
+static void Yacc_entries 299,10359
+static void just_read_file 300,10394
+static language *get_language_from_langname get_language_from_langname302,10432
+static void readline 303,10492
+static long readline_internal 304,10537
+static bool nocase_tail 305,10591
+static void get_tag 306,10631
+static void analyze_regex 308,10671
+static void free_regexps 309,10707
+static void regex_tag_multiline 310,10740
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int total_size_of_entries 2067,66150
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT 2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC 2199,69242
+enum sym_type2204,69312
+ st_none,2206,69328
+ st_C_objprot,2207,69339
+ st_C_objprot, st_C_objimpl,2207,69339
+ st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+ st_C_gnumacro,2208,69382
+ st_C_ignore,2209,69399
+ st_C_ignore, st_C_attribute,2209,69399
+ st_C_javastruct,2210,69430
+ st_C_operator,2211,69449
+ st_C_class,2212,69466
+ st_C_class, st_C_template,2212,69466
+ st_C_struct,2213,69495
+ st_C_struct, st_C_extern,2213,69495
+ st_C_struct, st_C_extern, st_C_enum,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+ TOTAL_KEYWORDS 2325,73018
+ MIN_WORD_LENGTH 2326,73045
+ MAX_WORD_LENGTH 2327,73072
+ MIN_HASH_VALUE 2328,73100
+ MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+ fvnone,2408,75435
+ fdefunkey,2409,75466
+ fdefunname,2410,75512
+ foperator,2411,75556
+ fvnameseen,2412,75613
+ fstartlist,2413,75666
+ finlist,2414,75722
+ flistseen,2415,75765
+ fignore,2416,75813
+ vignore 2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+ tnone,2428,76089
+ tkeyseen,2429,76119
+ ttypeseen,2430,76160
+ tinbody,2431,76199
+ tend,2432,76238
+ tignore 2433,76279
+} typdef;2434,76320
+ snone,2443,76499
+ skeyseen,2445,76575
+ stagseen,2446,76620
+ scolonseen 2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+ dnone,2460,76942
+ dsharpseen,2461,76972
+ ddefineseen,2462,77025
+ dignorerest 2463,77070
+} definedef;2464,77112
+ onone,2472,77267
+ oprotocol,2473,77297
+ oimplementation,2474,77347
+ otagseen,2475,77395
+ oparenseen,2476,77431
+ ocatseen,2477,77486
+ oinbody,2478,77525
+ omethodsign,2479,77568
+ omethodtag,2480,77626
+ omethodcolon,2481,77666
+ omethodparm,2482,77709
+ oignore 2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+} token;2508,78626
+static void pushclass_above 2514,78784
+static void popclass_above 2515,78832
+static void write_classname 2516,78866
+} cstack;2523,79136
+#define nestlev 2525,79264
+#define instruct 2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+static bool consider_token 2592,80761
+static void make_C_tag 2593,80833
+consider_token 2613,81341
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+static void F_takeprec 3910,111965
+static void F_getit 3911,111996
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+static void L_getit 4706,130277
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static void TEX_mode 4917,135172
+static void TEX_decode_env 4918,135203
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+static size_t prolog_pr 5214,142192
+static void prolog_skip_comment 5215,142234
+static size_t prolog_atom 5216,142290
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+static int erlang_func 5374,145540
+static void erlang_attribute 5375,145581
+static int erlang_atom 5376,145620
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+static char *scan_separators scan_separators5520,148487
+static void add_regex 5521,148526
+static char *substitute substitute5522,148570
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,47
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,47
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define ENTRY(21,865
+#define PSEUDO(26,972
+ movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+ movl $SYS_##syscall_name, %eax;eax31,1132
+ int $0x80;32,1180
+ test %eax,eax33,1210
+ test %eax, %eax;eax33,1210
+ jl syscall_error;34,1245
+#define XCHG_0 47,1562
+#define XCHG_1 48,1606
+#define XCHG_2 49,1648
+#define XCHG_3 50,1691
+#define XCHG_4 51,1734
+#define XCHG_5 52,1777
+#define r0 54,1821
+#define r1 55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int count_words(15,263
+static char *get_word(get_word35,553
+void tab_free(59,966
+char **tab_fill(tab_fill70,1129
+int tab_delete_first(91,1638
+int tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,6643
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+extern void emacs_abort 47,1305
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+extern void *bss_sbrk bss_sbrk76,2335
+extern int bss_sbrk_did_unexec;77,2375
+extern char bss_sbrk_buffer[bss_sbrk_buffer78,2407
+extern void *bss_sbrk_buffer_end;bss_sbrk_buffer_end79,2438
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT 124,3934
+#define BLOCKLOG 125,3977
+#define BLOCKSIZE 126,4018
+#define BLOCKIFY(127,4052
+#define HEAP 131,4215
+#define FINAL_FREE_BLOCKS 135,4391
+ } malloc_info;167,5388
+extern char *_heapbase;_heapbase170,5449
+extern malloc_info *_heapinfo;_heapinfo173,5541
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+extern size_t _heapindex;180,5797
+extern size_t _heaplimit;183,5866
+struct list186,5939
+extern struct list _fraghead[_fraghead193,6056
+struct alignlist196,6153
+extern struct alignlist *_aligned_blocks;_aligned_blocks202,6334
+extern size_t _chunks_used;205,6401
+extern size_t _bytes_used;206,6429
+extern size_t _chunks_free;207,6456
+extern size_t _bytes_free;208,6484
+extern void *_malloc_internal _malloc_internal213,6673
+extern void *_realloc_internal _realloc_internal214,6713
+extern void _free_internal 215,6762
+extern void *_malloc_internal_nolock _malloc_internal_nolock216,6799
+extern void *_realloc_internal_nolock _realloc_internal_nolock217,6846
+extern void _free_internal_nolock 218,6902
+extern pthread_mutex_t _malloc_mutex,221,6966
+extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;221,6966
+extern int _malloc_thread_enabled_p;222,7027
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+extern void *malloc_find_object_address malloc_find_object_address252,7865
+extern void *(*__morecore)__morecore256,8021
+extern void *__default_morecore __default_morecore259,8105
+extern void (*__after_morecore_hook)__after_morecore_hook263,8269
+extern size_t __malloc_extra_blocks;267,8442
+extern int __malloc_initialized;270,8552
+extern int __malloc_initialize 272,8646
+extern void (*__malloc_initialize_hook)__malloc_initialize_hook275,8723
+extern void (*__free_hook)__free_hook276,8771
+extern void *(*__malloc_hook)__malloc_hook277,8811
+extern void *(*__realloc_hook)__realloc_hook278,8856
+extern void *(*__memalign_hook)__memalign_hook279,8913
+enum mcheck_status283,9092
+ MCHECK_DISABLED 285,9115
+ MCHECK_OK,286,9187
+ MCHECK_FREE,287,9226
+ MCHECK_HEAD,288,9270
+ MCHECK_TAIL 289,9334
+extern int mcheck 296,9701
+extern enum mcheck_status mprobe 301,9952
+extern void mtrace 304,10055
+extern void muntrace 305,10082
+struct mstats308,10153
+extern struct mstats mstats 318,10518
+extern void memory_warnings 321,10625
+void *(*__malloc_hook)__malloc_hook352,11743
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+void (*__malloc_initialize_hook)__malloc_initialize_hook383,12398
+void (*__after_morecore_hook)__after_morecore_hook384,12439
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+extern void *_malloc _malloc956,29033
+extern void _free 957,29064
+extern void *_realloc _realloc958,29092
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+void (*__free_hook)__free_hook1001,30259
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+void *(*__realloc_hook)__realloc_hook1310,39898
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define __sbrk 1513,46042
+extern void *__sbrk __sbrk1518,46247
+__default_morecore 1525,46511
+void *(*__memalign_hook)__memalign_hook1554,47456
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+extern void *valloc valloc1695,51140
+extern int getpagesize 1700,51278
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+extern void *malloc malloc1722,51609
+extern void *realloc realloc1723,51644
+extern void *calloc calloc1724,51691
+extern void free 1725,51740
+extern void *aligned_alloc aligned_alloc1727,51796
+extern int posix_memalign 1729,51890
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+char *gget_current_dir_name gget_current_dir_name1808,53753
+hybrid_get_current_dir_name 1811,53797
+static void (*old_free_hook)old_free_hook1846,54921
+static void *(*old_malloc_hook)old_malloc_hook1847,54963
+static void *(*old_realloc_hook)old_realloc_hook1848,55010
+static void (*abortfunc)abortfunc1851,55124
+#define MAGICWORD 1854,55206
+#define MAGICFREE 1855,55261
+#define MAGICBYTE 1856,55316
+#define MALLOCFLOOD 1857,55348
+#define FREEFLOOD 1858,55382
+struct hdr1860,55415
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,4576
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+extern reg_syntax_t re_syntax_options;167,7170
+extern Lisp_Object re_match_object;172,7344
+extern size_t re_max_failures;176,7454
+#define RE_SYNTAX_EMACS 183,7684
+#define RE_SYNTAX_AWK 186,7780
+#define RE_SYNTAX_GNU_AWK 193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP 206,8549
+#define RE_SYNTAX_POSIX_EGREP 212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON 221,9072
+#define RE_SYNTAX_POSIX_BASIC 225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC 231,9508
+#define RE_SYNTAX_POSIX_EXTENDED 234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED 242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+ REG_ENOSYS 297,11859
+ REG_NOERROR 300,11941
+ REG_NOMATCH,301,11976
+ REG_BADPAT,305,12123
+ REG_ECOLLATE,306,12162
+ REG_ECTYPE,307,12203
+ REG_EESCAPE,308,12255
+ REG_ESUBREG,309,12298
+ REG_EBRACK,310,12345
+ REG_EPAREN,311,12391
+ REG_EBRACE,312,12436
+ REG_BADBR,313,12472
+ REG_ERANGE,314,12519
+ REG_ESPACE,315,12560
+ REG_BADRPT,316,12601
+ REG_EEND,319,12693
+ REG_ESIZE,320,12728
+ REG_ERPAREN,321,12790
+ REG_ERANGEX 322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+# define RE_NREGS 440,16942
+} regmatch_t;451,17317
+extern reg_syntax_t re_set_syntax 457,17512
+extern const char *re_compile_pattern re_compile_pattern462,17776
+extern int re_compile_fastmap 469,18058
+extern regoff_t re_search 477,18466
+extern regoff_t re_search_2 485,18781
+extern regoff_t re_match 495,19177
+extern regoff_t re_match_2 501,19407
+extern void re_set_registers 520,20197
+extern char *re_comp re_comp528,20469
+extern int re_exec 529,20506
+# define _Restrict_ 540,20886
+# define _Restrict_ 542,20979
+# define _Restrict_544,21018
+# define _Restrict_arr_ 555,21418
+# define _Restrict_arr_557,21461
+extern reg_errcode_t regcomp 562,21530
+extern reg_errcode_t regexec 566,21656
+extern size_t regerror 571,21850
+extern void regfree 574,21956
+# define CHAR_CLASS_MAX_LENGTH 593,22470
+# define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+ RECC_ALNUM,610,22984
+ RECC_ALNUM, RECC_ALPHA,610,22984
+ RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+ RECC_GRAPH,611,23027
+ RECC_GRAPH, RECC_PRINT,611,23027
+ RECC_LOWER,612,23059
+ RECC_LOWER, RECC_UPPER,612,23059
+ RECC_PUNCT,613,23091
+ RECC_PUNCT, RECC_CNTRL,613,23091
+ RECC_DIGIT,614,23123
+ RECC_DIGIT, RECC_XDIGIT,614,23123
+ RECC_BLANK,615,23156
+ RECC_BLANK, RECC_SPACE,615,23156
+ RECC_MULTIBYTE,616,23188
+ RECC_MULTIBYTE, RECC_NONASCII,616,23188
+ RECC_ASCII,617,23227
+ RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+extern char re_iswctype 620,23276
+extern re_wctype_t re_wctype 621,23329
+typedef int re_wchar_t;623,23387
+extern void re_set_whitespace_regexp 625,23412
+
+c-src/emacs/src/keyboard.c,15493
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF 119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard *ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+static void recursive_edit_unwind 313,11088
+static Lisp_Object command_loop 314,11144
+static void echo_now 316,11185
+static ptrdiff_t echo_length 317,11214
+unsigned timers_run;320,11296
+struct timespec *input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW 346,12046
+#define READABLE_EVENTS_FILTER_EVENTS 347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES 348,12142
+static void (*keyboard_init_hook)keyboard_init_hook351,12264
+static bool get_input_pending 353,12307
+static bool readable_events 354,12344
+static Lisp_Object read_char_x_menu_prompt 355,12379
+static Lisp_Object read_char_minibuf_menu_prompt 357,12502
+static Lisp_Object make_lispy_event 358,12571
+static Lisp_Object make_lispy_movement 359,12631
+static Lisp_Object modify_event_symbol 363,12840
+static Lisp_Object make_lispy_switch_frame 366,13050
+static Lisp_Object make_lispy_focus_in 367,13108
+static Lisp_Object make_lispy_focus_out 369,13188
+static bool help_char_p 371,13275
+static void save_getcjmp 372,13314
+static void restore_getcjmp 373,13354
+static Lisp_Object apply_modifiers 374,13397
+static void clear_event 375,13452
+static void restore_kboard_configuration 376,13500
+static void deliver_input_available_signal 378,13568
+static void handle_interrupt 380,13631
+static _Noreturn void quit_throw_to_read_char 381,13668
+static void process_special_events 382,13722
+static void timer_start_idle 383,13765
+static void timer_stop_idle 384,13802
+static void timer_resume_idle 385,13838
+static void deliver_user_signal 386,13876
+static char *find_user_signal_name find_user_signal_name387,13915
+static void store_user_signal_events 388,13957
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", Fcommand_error_default_function,command-error-default-function1043,32030
+static Lisp_Object command_loop_2 1086,33637
+static Lisp_Object top_level_1 1087,33686
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+static int read_key_sequence 1282,38799
+static void adjust_point_for_property 1284,38917
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object kbd_buffer_get_event 2152,65484
+static void record_char 2154,65596
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING 2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+
+c-src/emacs/src/lisp.h,33973
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+# define EMACS_INT_MAX 93,3079
+# define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+# define EMACS_INT_MAX 98,3265
+# define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+# define EMACS_INT_MAX 105,3553
+# define pI 106,3587
+enum { BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+verify 131,4450
+ BITS_PER_CHAR 136,4570
+ BITS_PER_SHORT 137,4605
+ BITS_PER_LONG 138,4657
+ BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+extern _Noreturn void die 204,7206
+extern bool suppress_checking EXTERNALLY_VISIBLE;206,7268
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+ VALBITS 246,8742
+ INTTYPEBITS 249,8838
+ FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+# define check_cons_list(405,15097
+# define make_number(408,15176
+# define XFASTINT(409,15224
+# define XINT(410,15266
+# define XSYMBOL(411,15300
+# define XTYPE(412,15340
+# define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+ Lisp_Symbol 454,16851
+ Lisp_Misc 458,16993
+ Lisp_Int0 461,17067
+ Lisp_Int1 462,17086
+ Lisp_String 466,17264
+ Lisp_Vectorlike 472,17543
+ Lisp_Cons 475,17632
+ Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+ Lisp_Misc_Free 487,18040
+ Lisp_Misc_Marker,488,18069
+ Lisp_Misc_Overlay,489,18091
+ Lisp_Misc_Save_Value,490,18114
+ Lisp_Misc_Finalizer,491,18140
+ Lisp_Misc_Float,494,18275
+ Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+ Lisp_Fwd_Int,504,18566
+ Lisp_Fwd_Bool,505,18619
+ Lisp_Fwd_Obj,506,18670
+ Lisp_Fwd_Buffer_Obj,507,18729
+ Lisp_Fwd_Kboard_Obj 508,18800
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+INLINE bool BOOL_VECTOR_P 588,22350
+INLINE bool BUFFER_OBJFWDP 589,22391
+INLINE bool BUFFERP 590,22438
+INLINE bool CHAR_TABLE_P 591,22473
+INLINE Lisp_Object CHAR_TABLE_REF_ASCII 592,22513
+INLINE bool 593,22579
+INLINE bool 594,22614
+INLINE bool functionp 595,22650
+INLINE bool 596,22687
+INLINE bool 597,22725
+INLINE bool 598,22762
+INLINE bool 599,22797
+INLINE bool OVERLAYP 600,22831
+INLINE bool PROCESSP 601,22867
+INLINE bool PSEUDOVECTORP 602,22903
+INLINE bool SAVE_VALUEP 603,22949
+INLINE bool FINALIZERP 604,22988
+INLINE void set_sub_char_table_contents 605,23026
+INLINE bool STRINGP 607,23116
+INLINE bool SUB_CHAR_TABLE_P 608,23151
+INLINE bool SUBRP 609,23195
+INLINE bool 610,23228
+INLINE bool 611,23265
+INLINE bool WINDOWP 612,23306
+INLINE bool TERMINALP 613,23341
+INLINE struct Lisp_Save_Value *XSAVE_VALUE XSAVE_VALUE614,23378
+INLINE struct Lisp_Finalizer *XFINALIZER XFINALIZER615,23436
+INLINE struct Lisp_Symbol *(XSYMBOL)616,23492
+INLINE void 617,23544
+extern Lisp_Object char_table_ref 620,23616
+extern void char_table_set 621,23670
+extern _Noreturn Lisp_Object wrong_type_argument 624,23757
+extern _Noreturn void wrong_choice 625,23834
+extern bool might_dump;628,23925
+extern bool initialized;631,24061
+extern double extract_float 634,24117
+enum symbol_interned639,24199
+ SYMBOL_UNINTERNED 641,24222
+ SYMBOL_INTERNED 642,24247
+ SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+ SYMBOL_PLAINVAL 648,24338
+ SYMBOL_VARALIAS 649,24362
+ SYMBOL_LOCALIZED 650,24386
+ SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+ ENUM_BF 663,24793
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY 712,26446
+#define DEFUN_ARGS_UNEVALLED 713,26498
+#define DEFUN_ARGS_0 714,26541
+#define DEFUN_ARGS_1 715,26569
+#define DEFUN_ARGS_2 716,26604
+#define DEFUN_ARGS_3 717,26652
+#define DEFUN_ARGS_4 718,26713
+#define DEFUN_ARGS_5 719,26787
+#define DEFUN_ARGS_6 721,26880
+#define DEFUN_ARGS_7 723,26986
+#define DEFUN_ARGS_8 725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+ PVEC_NORMAL_VECTOR,782,29585
+ PVEC_FREE,783,29607
+ PVEC_PROCESS,784,29620
+ PVEC_FRAME,785,29636
+ PVEC_WINDOW,786,29650
+ PVEC_BOOL_VECTOR,787,29665
+ PVEC_BUFFER,788,29685
+ PVEC_HASH_TABLE,789,29700
+ PVEC_TERMINAL,790,29719
+ PVEC_WINDOW_CONFIGURATION,791,29736
+ PVEC_SUBR,792,29765
+ PVEC_OTHER,793,29778
+ PVEC_COMPILED,795,29856
+ PVEC_CHAR_TABLE,796,29873
+ PVEC_SUB_CHAR_TABLE,797,29892
+ PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+ PSEUDOVECTOR_SIZE_BITS 808,30382
+ PSEUDOVECTOR_SIZE_MASK 809,30415
+ PSEUDOVECTOR_REST_BITS 813,30625
+ PSEUDOVECTOR_REST_MASK 814,30658
+ PSEUDOVECTOR_AREA_BITS 818,30823
+ PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+extern ptrdiff_t string_bytes 1313,44337
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+struct Lisp_Vector1369,46482
+ ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+ header_size 1471,49047
+ bool_header_size 1472,49106
+ word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+ CHARTAB_SIZE_BITS_0 1567,52516
+ CHARTAB_SIZE_BITS_1 1568,52545
+ CHARTAB_SIZE_BITS_2 1569,52574
+ CHARTAB_SIZE_BITS_3 1570,52603
+extern const int chartab_size[chartab_size1573,52637
+struct Lisp_Char_Table1575,52672
+struct Lisp_Sub_Char_Table1606,53752
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+enum char_table_specials1692,56798
+ CHAR_TABLE_STANDARD_SLOTS 1697,56993
+ SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+verify 1714,57596
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+struct Lisp_Hash_Table1823,60555
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any 1971,64806
+ ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+ ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+ ENUM_BF 2034,67346
+ SAVE_UNUSED,2047,67641
+ SAVE_INTEGER,2048,67658
+ SAVE_FUNCPOINTER,2049,67676
+ SAVE_POINTER,2050,67698
+ SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+ SAVE_TYPE_INT_INT 2066,68096
+ SAVE_TYPE_INT_INT_INT2067,68169
+ SAVE_TYPE_OBJ_OBJ 2069,68259
+ SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+ SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+ SAVE_TYPE_PTR_INT 2073,68506
+ SAVE_TYPE_PTR_OBJ 2074,68579
+ SAVE_TYPE_PTR_PTR 2075,68651
+ SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+ SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+ ENUM_BF 2112,69900
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+struct Lisp_Free2201,72581
+ ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+struct Lisp_Boolfwd2284,74411
+struct Lisp_Objfwd2294,74702
+struct Lisp_Buffer_Objfwd2302,74934
+struct Lisp_Buffer_Local_Value2334,76470
+struct Lisp_Kboard_Objfwd2362,77729
+union Lisp_Fwd2368,77838
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+XFLOAT_DATA 2401,78434
+ IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+ COMPILED_ARGLIST 2431,79389
+ COMPILED_BYTECODE 2432,79415
+ COMPILED_CONSTANTS 2433,79442
+ COMPILED_STACK_DEPTH 2434,79470
+ COMPILED_DOC_STRING 2435,79500
+ COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+ CHAR_ALT 2445,79850
+ CHAR_SUPER 2446,79876
+ CHAR_HYPER 2447,79904
+ CHAR_SHIFT 2448,79932
+ CHAR_CTL 2449,79960
+ CHAR_META 2450,79986
+ CHAR_MODIFIER_MASK 2452,80014
+ CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+extern void defsubr 2829,89358
+enum maxargs2831,89401
+ MANY 2833,89418
+ UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+extern void defvar_lisp 2846,89959
+extern void defvar_lisp_nopro 2847,90036
+extern void defvar_bool 2848,90119
+extern void defvar_int 2849,90190
+extern void defvar_kboard 2850,90264
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+ SPECPDL_UNWIND,2944,93822
+ SPECPDL_UNWIND_PTR,2945,93891
+ SPECPDL_UNWIND_INT,2946,93942
+ SPECPDL_UNWIND_VOID,2947,93990
+ SPECPDL_BACKTRACE,2948,94044
+ SPECPDL_LET,2949,94102
+ SPECPDL_LET_LOCAL,2951,94232
+ SPECPDL_LET_DEFAULT 2952,94289
+union specbinding2955,94361
+ ENUM_BF 2957,94383
+ ENUM_BF 2959,94440
+ ENUM_BF 2964,94570
+ ENUM_BF 2969,94693
+ ENUM_BF 2974,94811
+ ENUM_BF 2978,94916
+ ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+#define PUSH_HANDLER(3053,97443
+extern Lisp_Object memory_signal_data;3075,98149
+extern char *stack_bottom;stack_bottom3079,98282
+extern void process_pending_signals 3097,99099
+extern bool volatile pending_signals;3098,99143
+extern void process_quit_flag 3100,99182
+#define QUIT 3101,99220
+#define QUITP 3112,99470
+extern Lisp_Object Vascii_downcase_table;3114,99531
+extern Lisp_Object Vascii_canon_table;3115,99573
+extern struct gcpro *gcprolist;gcprolist3130,100280
+struct gcpro3132,100313
+#define GC_USE_GCPROS_AS_BEFORE 3171,101294
+#define GC_MAKE_GCPROS_NOOPS 3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS 3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES 3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+extern int gcpro_level;3261,105037
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO 3353,109913
+#define RETURN_UNGCPRO(3363,110180
+void staticpro 3375,110453
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+extern Lisp_Object indirect_function 3495,113196
+extern Lisp_Object find_symbol_value 3496,113248
+enum Arith_Comparison 3497,113300
+ ARITH_EQUAL,3498,113324
+ ARITH_NOTEQUAL,3499,113339
+ ARITH_LESS,3500,113357
+ ARITH_GRTR,3501,113371
+ ARITH_LESS_OR_EQUAL,3502,113385
+ ARITH_GRTR_OR_EQUAL3503,113408
+extern Lisp_Object arithcompare 3505,113433
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+extern intmax_t cons_to_signed 3533,114837
+extern uintmax_t cons_to_unsigned 3534,114903
+extern struct Lisp_Symbol *indirect_variable indirect_variable3536,114964
+extern _Noreturn void args_out_of_range 3537,115033
+extern _Noreturn void args_out_of_range_3 3538,115101
+extern Lisp_Object do_symval_forwarding 3540,115192
+extern void set_internal 3541,115252
+extern void syms_of_data 3542,115324
+extern void swap_in_global_binding 3543,115357
+extern void syms_of_cmds 3546,115441
+extern void keys_of_cmds 3547,115474
+extern Lisp_Object detect_coding_system 3550,115536
+extern void init_coding 3552,115689
+extern void init_coding_once 3553,115721
+extern void syms_of_coding 3554,115758
+extern ptrdiff_t chars_in_text 3557,115825
+extern ptrdiff_t multibyte_chars_in_text 3558,115892
+extern void syms_of_character 3559,115969
+extern void init_charset 3562,116037
+extern void init_charset_once 3563,116070
+extern void syms_of_charset 3564,116108
+extern void init_syntax_once 3569,116228
+extern void syms_of_syntax 3570,116265
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+extern Lisp_Object listn 3740,123863
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_uninit_bool_vector 3763,124407
+extern Lisp_Object bool_vector_fill 3764,124463
+extern _Noreturn void string_overflow 3765,124527
+extern Lisp_Object make_string 3766,124573
+extern Lisp_Object make_formatted_string 3767,124631
+extern Lisp_Object make_multibyte_string 3779,124985
+extern Lisp_Object make_event_array 3780,125064
+extern Lisp_Object make_uninit_string 3781,125128
+extern Lisp_Object make_uninit_multibyte_string 3782,125179
+extern Lisp_Object make_string_from_bytes 3783,125251
+extern Lisp_Object make_specified_string 3784,125331
+extern Lisp_Object make_pure_string 3786,125423
+extern Lisp_Object make_pure_c_string 3787,125503
+build_pure_c_string 3792,125659
+build_string 3801,125864
+extern Lisp_Object pure_cons 3806,125942
+extern void make_byte_code 3807,125999
+extern struct Lisp_Vector *allocate_vector allocate_vector3808,126050
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+extern struct Lisp_Vector *allocate_pseudovector allocate_pseudovector3844,126963
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+extern bool gc_in_progress;3863,127735
+extern bool abort_on_gc;3864,127763
+extern Lisp_Object make_float 3865,127788
+extern void display_malloc_warning 3866,127828
+extern ptrdiff_t inhibit_garbage_collection 3867,127871
+extern Lisp_Object make_save_int_int_int 3868,127923
+extern Lisp_Object make_save_obj_obj_obj_obj 3869,127999
+extern Lisp_Object make_save_ptr 3871,128109
+extern Lisp_Object make_save_ptr_int 3872,128152
+extern Lisp_Object make_save_ptr_ptr 3873,128210
+extern Lisp_Object make_save_funcptr_ptr_obj 3874,128265
+extern Lisp_Object make_save_memory 3876,128361
+extern void free_save_value 3877,128425
+extern Lisp_Object build_overlay 3878,128468
+extern void free_marker 3879,128542
+extern void free_cons 3880,128581
+extern void init_alloc_once 3881,128625
+extern void init_alloc 3882,128661
+extern void syms_of_alloc 3883,128692
+extern struct buffer * allocate_buffer 3884,128726
+extern int valid_lisp_object_p 3885,128773
+extern int relocatable_string_data_p 3886,128819
+extern void check_cons_list 3888,128898
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+extern int openp 3957,131673
+extern Lisp_Object string_to_number 3959,131783
+extern void map_obarray 3960,131846
+extern void dir_warning 3962,131960
+extern void init_obarray 3963,132013
+extern void init_lread 3964,132046
+extern void syms_of_lread 3965,132077
+intern 3968,132131
+intern_c_string 3974,132219
+extern EMACS_INT lisp_eval_depth;3980,132332
+extern Lisp_Object Vautoload_queue;3981,132366
+extern Lisp_Object Vrun_hooks;3982,132402
+extern Lisp_Object Vsignaling_function;3983,132433
+extern Lisp_Object inhibit_lisp_code;3984,132473
+extern struct handler *handlerlist;handlerlist3985,132511
+extern void run_hook 3994,132753
+extern void run_hook_with_args_2 3995,132789
+extern Lisp_Object run_hook_with_args 3996,132863
+extern _Noreturn void xsignal 3999,133022
+extern _Noreturn void xsignal0 4000,133080
+extern _Noreturn void xsignal1 4001,133126
+extern _Noreturn void xsignal2 4002,133185
+extern _Noreturn void xsignal3 4003,133257
+extern _Noreturn void signal_error 4005,133346
+extern Lisp_Object eval_sub 4006,133410
+extern Lisp_Object apply1 4007,133458
+extern Lisp_Object call0 4008,133512
+extern Lisp_Object call1 4009,133552
+extern Lisp_Object call2 4010,133605
+extern Lisp_Object call3 4011,133671
+extern Lisp_Object call4 4012,133750
+extern Lisp_Object call5 4013,133842
+extern Lisp_Object call6 4014,133947
+extern Lisp_Object call7 4015,134065
+extern Lisp_Object internal_catch 4016,134196
+extern Lisp_Object internal_lisp_condition_case 4017,134289
+extern Lisp_Object internal_condition_case 4018,134378
+extern Lisp_Object internal_condition_case_1 4019,134491
+extern Lisp_Object internal_condition_case_2 4020,134626
+extern Lisp_Object internal_condition_case_n4021,134787
+extern void specbind 4024,134983
+extern void record_unwind_protect 4025,135032
+extern void record_unwind_protect_ptr 4026,135105
+extern void record_unwind_protect_int 4027,135172
+extern void record_unwind_protect_void 4028,135233
+extern void record_unwind_protect_nothing 4029,135291
+extern void clear_unwind_protect 4030,135341
+extern void set_unwind_protect 4031,135387
+extern void set_unwind_protect_ptr 4032,135468
+extern Lisp_Object unbind_to 4033,135543
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+extern ptrdiff_t fast_c_string_match_ignore_case 4141,140236
+extern ptrdiff_t fast_looking_at 4143,140333
+extern ptrdiff_t find_newline 4145,140472
+extern ptrdiff_t scan_newline 4147,140601
+extern ptrdiff_t scan_newline_from_point 4149,140704
+extern ptrdiff_t find_newline_no_quit 4150,140784
+extern ptrdiff_t find_before_next_newline 4152,140881
+extern void syms_of_search 4154,140979
+extern void clear_regexp_cache 4155,141014
+extern Lisp_Object Vminibuffer_list;4159,141084
+extern Lisp_Object last_minibuf_string;4160,141121
+extern Lisp_Object get_minibuffer 4161,141161
+extern void init_minibuf_once 4162,141208
+extern void syms_of_minibuf 4163,141246
+extern void syms_of_callint 4167,141313
+extern void syms_of_casefiddle 4171,141383
+extern void keys_of_casefiddle 4172,141422
+extern void init_casetab_once 4176,141492
+extern void syms_of_casetab 4177,141530
+extern Lisp_Object echo_message_buffer;4181,141598
+extern struct kboard *echo_kboard;echo_kboard4182,141638
+extern void cancel_echoing 4183,141673
+extern Lisp_Object last_undo_boundary;4184,141708
+extern bool input_pending;4185,141747
+extern sigjmp_buf return_to_command_loop;4187,141810
+extern Lisp_Object menu_bar_items 4189,141859
+extern Lisp_Object tool_bar_items 4190,141908
+extern void discard_mouse_events 4191,141964
+void handle_input_available_signal 4193,142025
+extern Lisp_Object pending_funcalls;4195,142074
+extern bool detect_input_pending 4196,142111
+extern bool detect_input_pending_ignore_squeezables 4197,142152
+extern bool detect_input_pending_run_timers 4198,142212
+extern void safe_run_hooks 4199,142264
+extern void cmd_error_internal 4200,142306
+extern Lisp_Object command_loop_1 4201,142366
+extern Lisp_Object read_menu_command 4202,142408
+extern Lisp_Object recursive_edit_1 4203,142453
+extern void record_auto_save 4204,142497
+extern void force_auto_save_soon 4205,142534
+extern void init_keyboard 4206,142575
+extern void syms_of_keyboard 4207,142609
+extern void keys_of_keyboard 4208,142646
+extern ptrdiff_t current_column 4211,142712
+extern void invalidate_current_column 4212,142752
+extern bool indented_beyond_p 4213,142798
+extern void syms_of_indent 4214,142863
+extern void store_frame_param 4217,142926
+extern void store_in_alist 4218,143000
+extern Lisp_Object do_switch_frame 4219,143070
+extern Lisp_Object get_frame_param 4220,143143
+extern void frames_discard_buffer 4221,143209
+extern void syms_of_frame 4222,143258
+extern char **initial_argv;initial_argv4225,143320
+extern int initial_argc;4226,143348
+extern bool display_arg;4228,143423
+extern Lisp_Object decode_env_path 4230,143455
+extern Lisp_Object empty_unibyte_string,4231,143526
+extern Lisp_Object empty_unibyte_string, empty_multibyte_string;4231,143526
+extern _Noreturn void terminate_due_to_signal 4232,143591
+extern Lisp_Object Vlibrary_cache;4234,143666
+void fixup_locale 4237,143727
+void synchronize_system_messages_locale 4238,143753
+void synchronize_system_time_locale 4239,143801
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+extern void shut_down_emacs 4245,144003
+extern bool noninteractive;4248,144129
+extern bool no_site_lisp;4251,144221
+extern int daemon_pipe[daemon_pipe4256,144389
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+extern void *w32_daemon_event;w32_daemon_event4260,144524
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+extern bool fatal_error_in_progress;4266,144721
+extern bool inhibit_window_system;4269,144827
+extern bool running_asynch_code;4271,144920
+extern void kill_buffer_processes 4274,144983
+extern int wait_reading_process_output 4275,145032
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern void add_timer_wait_descriptor 4286,145555
+extern void add_keyboard_wait_descriptor 4288,145607
+extern void delete_keyboard_wait_descriptor 4289,145655
+extern void add_gpm_wait_descriptor 4291,145722
+extern void delete_gpm_wait_descriptor 4292,145765
+extern void init_process_emacs 4294,145818
+extern void syms_of_process 4295,145857
+extern void setup_process_coding_systems 4296,145893
+extern int child_setup 4302,146013
+extern void init_callproc_1 4303,146081
+extern void init_callproc 4304,146117
+extern void set_initial_environment 4305,146151
+extern void syms_of_callproc 4306,146195
+extern Lisp_Object read_doc_string 4309,146258
+extern Lisp_Object get_doc_string 4310,146308
+extern void syms_of_doc 4311,146369
+extern int read_bytecode_char 4312,146401
+extern void syms_of_bytecode 4315,146470
+extern struct byte_stack *byte_stack_list;byte_stack_list4316,146507
+extern void mark_byte_stack 4318,146570
+extern void unmark_byte_stack 4320,146613
+extern Lisp_Object exec_byte_code 4321,146651
+extern void init_macros 4325,146801
+extern void syms_of_macros 4326,146833
+extern void truncate_undo_list 4329,146895
+extern void record_insert 4330,146945
+extern void record_delete 4331,146995
+extern void record_first_change 4332,147053
+extern void record_change 4333,147093
+extern void record_property_change 4334,147143
+extern void syms_of_undo 4337,147285
+extern void report_interval_modification 4340,147349
+extern void syms_of_menu 4343,147445
+extern void syms_of_xmenu 4346,147506
+extern char *get_current_dir_name get_current_dir_name4356,147708
+extern void stuff_char 4358,147757
+extern void init_foreground_group 4359,147790
+extern void sys_subshell 4360,147832
+extern void sys_suspend 4361,147865
+extern void discard_tty_input 4362,147897
+extern void init_sys_modes 4363,147935
+extern void reset_sys_modes 4364,147991
+extern void init_all_sys_modes 4365,148048
+extern void reset_all_sys_modes 4366,148087
+extern void child_setup_tty 4367,148127
+extern void setup_pty 4368,148162
+extern int set_window_size 4369,148191
+extern EMACS_INT get_random 4370,148235
+extern void seed_random 4371,148271
+extern void init_random 4372,148316
+extern void emacs_backtrace 4373,148348
+extern _Noreturn void emacs_abort 4374,148383
+extern void xputenv 4527,152697
+extern char *egetenv_internal egetenv_internal4529,152734
+egetenv 4532,152806
+extern void init_system_name 4539,153009
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA 4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+union Aligned_String4676,157349
+ USE_STACK_CONS 4689,157704
+ USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+extern const char *verify_ascii verify_ascii4730,159453
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/fail.c,30
+void (*prt_call(prt_call1,0
+
+c-src/h.h,1962
+ ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+void Asm_labels 7,127
+typedef struct tpcmd8,147
+#define ggg 10,170
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+} foobar2;20,307
+ DEVICE_SWP,23,333
+ DEVICE_LAST24,349
+} bsp_DevId;25,365
+ struct constant_args 27,394
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+} ghi1;36,534
+typedef union abc 37,542
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage *an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+} an_extern_linkage;56,1054
+typedef struct pollfd pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+ } womboid 63,1206
+typedef union rtunion_def64,1220
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+ Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+extern void ab(102,1948
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int (*oldhup)oldhup107,2014
+request (*oldhup)oldhup108,2031
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous 117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+
+cp-src/c.C,2567
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+ void execute(CMultiChannelCSC19_3D::execute11,493
+static void my_function1(24,984
+int main 25,1026
+double base 26,1088
+operator += operator +=29,1174
+class TestRecord;31,1233
+typedef struct s1 32,1251
+} t1;34,1287
+struct s2 35,1293
+typedef struct s2 t2;38,1324
+class A 39,1346
+ enum { rosso,A::rosso40,1356
+ enum { rosso, giallo,A::giallo40,1356
+ enum { rosso, giallo, verde A::verde40,1356
+ const A& operator+(A::operator+41,1396
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+class AU 53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A { class B { int f(A::B::f56,1791
+class A 57,1826
+ int get_data(A::get_data58,1836
+ A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+ void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct A { A(A::A73,2004
+struct B 74,2022
+struct B { B(B::B74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+class test 86,2156
+ int f(test::f87,2169
+ int ff(test::ff89,2231
+ int g(test::g90,2254
+class AST_Root 92,2278
+class AST_Root;96,2327
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+ void f(::f115,2733
+struct A 117,2753
+ ~A(A::~A118,2764
+A::~A(120,2777
+struct B 122,2789
+ ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+ enum {dog,Boo::dog130,2880
+ enum {dog, cat}Boo::cat130,2880
+ foo(Boo::foo133,2954
+ Boo(Boo::Boo137,2995
+ Boo(Boo::Boo138,3052
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,1538
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2;45,1087
+operator += operator +=48,1145
+operator -= operator -=51,1242
+operator * operator *54,1339
+operator / operator /57,1428
+operator * operator *60,1517
+operator + operator +63,1605
+operator - operator -66,1707
+product 69,1808
+operator - operator -72,1907
+class MDiagArray2 78,2022
+ MDiagArray2 MDiagArray2::MDiagArray282,2077
+ MDiagArray2 MDiagArray2::MDiagArray286,2154
+ MDiagArray2 MDiagArray2::MDiagArray287,2198
+ MDiagArray2 MDiagArray2::MDiagArray288,2254
+ MDiagArray2 MDiagArray2::MDiagArray289,2329
+ MDiagArray2 MDiagArray2::MDiagArray290,2387
+ MDiagArray2 MDiagArray2::MDiagArray291,2450
+ ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+ MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+ DiagArray2<T>::operator = MDiagArray2::operator =97,2603
+ operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+ operator += MDiagArray2::operator +=116,2966
+ operator -= MDiagArray2::operator -=119,3057
+ friend MDiagArray2<T> operator * MDiagArray2::operator *123,3174
+ friend MDiagArray2<T> operator / MDiagArray2::operator /124,3253
+ friend MDiagArray2<T> operator * MDiagArray2::operator *128,3384
+ operator + MDiagArray2::operator +133,3544
+ operator - MDiagArray2::operator -136,3640
+ friend MDiagArray2<T> operator - MDiagArray2::operator -141,3803
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Range.h,965
+#define octave_Range_h 24,765
+class istream;30,840
+class ostream;31,855
+class Matrix;32,870
+Range35,891
+ Range Range::Range39,909
+ Range Range::Range42,995
+ Range Range::Range46,1130
+ Range Range::Range50,1248
+ double base Range::base54,1376
+ double limit Range::limit55,1425
+ double inc Range::inc56,1475
+ int nelem Range::nelem57,1523
+ bool all_elements_are_ints Range::all_elements_are_ints59,1571
+ Matrix matrix_value Range::matrix_value61,1615
+ double min Range::min63,1652
+ double max Range::max64,1679
+ void sort Range::sort66,1707
+ void set_base Range::set_base68,1728
+ void set_limit Range::set_limit69,1774
+ void set_inc Range::set_inc70,1821
+ friend ostream& operator << Range::operator <<72,1867
+ friend istream& operator >> Range::operator >>73,1928
+ void print_range Range::print_range75,1984
+ int nelem_internal Range::nelem_internal85,2099
+extern Range operator - operator -88,2138
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,791
+#define __COLORS9,401
+enum COLORS 11,419
+ BLACK,COLORS::BLACK12,433
+ BLUE,COLORS::BLUE13,471
+ GREEN,COLORS::GREEN14,481
+ CYAN,COLORS::CYAN15,492
+ RED,COLORS::RED16,502
+ MAGENTA,COLORS::MAGENTA17,511
+ BROWN,COLORS::BROWN18,524
+ LIGHTGRAY,COLORS::LIGHTGRAY19,535
+ DARKGRAY,COLORS::DARKGRAY20,550
+ LIGHTBLUE,COLORS::LIGHTBLUE21,589
+ LIGHTGREEN,COLORS::LIGHTGREEN22,604
+ LIGHTCYAN,COLORS::LIGHTCYAN23,620
+ LIGHTRED,COLORS::LIGHTRED24,635
+ LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+ YELLOW,COLORS::YELLOW26,667
+ WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+void goto_xy(35,835
+void hide_cursor(36,883
+void cursor_position(37,907
+void clear_screen(38,935
+void write_xyc(39,960
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,331
+class site:site5,235
+ int total_surrounding(site::total_surrounding8,303
+ site(site::site10,344
+ ~site(site::~site11,397
+ char read(site::read12,410
+ void set(site::set13,444
+ void clear(site::clear14,478
+ void compute_next_state(site::compute_next_state15,514
+ void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,1152
+extern void init_registry(10,452
+extern void step_everybody(11,485
+class generic_object13,520
+ generic_object(generic_object::generic_object17,582
+ ~generic_object(generic_object::~generic_object19,724
+ virtual void compute_next_state(generic_object::compute_next_state21,842
+ virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+ location(location::location43,1642
+ ~location(location::~location44,1661
+class irregular_location:irregular_location47,1686
+ irregular_location(irregular_location::irregular_location51,1762
+ ~irregular_location(irregular_location::~irregular_location53,1854
+class discrete_location:discrete_location56,1889
+ void clear_neighbors(discrete_location::clear_neighbors60,2004
+ discrete_location(discrete_location::discrete_location62,2044
+ ~discrete_location(discrete_location::~discrete_location65,2154
+ void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+ agent(agent::agent79,2578
+ ~agent(agent::~agent80,2591
+ void move(agent::move81,2605
+
+cp-src/fail.C,386
+struct A 7,263
+ struct B A::B8,274
+ struct C A::B::C9,289
+ C(A::B::C::C11,318
+ operator int(A::B::C::operator int12,342
+ typedef C T;A::B::T14,389
+ typedef B T2;A::T216,414
+class String;20,437
+class A 23,453
+ class B A::B24,463
+ class C A::B::C25,474
+ int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+ class D 41,622
+ D(D::D43,659
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5188
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defvar etags-case-fold-search)855,33906
+(defvar etags-syntax-table)856,33938
+(defvar local-find-tag-hook)857,33966
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+f-src/entry.for,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+ ENTRY MSGSEL 193,4382
+ & intensity1(375,8135
+ character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+ 9 field >field136,582
+ 5 field >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1156
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+ @-$($72,3064
+ @-$($73,3113
+ @-$($74,3177
+ @-$($75,3223
+ @-$($76,3291
+ @-$($77,3383
+ @$(81,3466
+ @$(82,3514
+ @$(83,3577
+ @$(84,3622
+ @$(85,3689
+ @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+ @env CHECKEROPTS=92,3922
+ @$(98,4094
+ @$(106,4250
+ @$(110,4374
+ @$(114,4500
+ @for i in $(140,5315
+ @for i in $(SRCS); do echo $$i;140,5315
+ $(160,6053
+ $(163,6114
+ $(166,6177
+ $(169,6228
+ $(172,6317
+ sdiff --suppress-common-lines --width=width186,6614
+ sdiff --suppress-common-lines --width=width189,6703
+ sdiff --suppress-common-lines --width=width192,6791
+ sdiff --suppress-common-lines --width=width195,6880
+ TEXTAGS=204,7122
+ TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* --regex=regex204,7122
+ ${RUN} etags12 --members -o $@ --regex=regex207,7239
+ ${RUN} ./ctags -o $@ --regex=regex213,7388
+ ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+ TEXTAGS=219,7583
+ TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ --regex=regex219,7583
+ ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
+@interface Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,505
+#define PTY_TEMPLATE 20,494
+#define PTY_LENGTH 21,528
+static void showError(23,551
+@interface Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+ andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS 36,1101
+#define TYPESTOSTAT 37,1120
+@interface PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION 34,1116
+# define DEBUG 37,1155
+#define LISTCONTENTS 39,1181
+#define OPENBUTTON 47,1352
+#define LISTCONTENTSBUTTON 48,1449
+#define LISTDESCRIPTIONBUTTON 49,1562
+#define STATE_UNINSTALLED 52,1687
+#define STATE_INSTALLED 53,1807
+#define STATE_COMPRESSD 54,1948
+#define SIZEFORMAT 57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING 368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
+@interface SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2152
+ define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+ define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+ define("LCE_WS"LCE_WS11,194
+ define("LCE_COMMENT"LCE_COMMENT13,244
+ define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+ define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+ define("LCE_MSGID"LCE_MSGID19,430
+ define("LCE_MSGSTR"LCE_MSGSTR21,488
+ define("LCE_TEXT"LCE_TEXT23,541
+ define("STATE_ABORT"STATE_ABORT25,567
+ define("STATE_OK"STATE_OK26,595
+ define("STATE_LOOP"STATE_LOOP27,620
+ class POEntryAD 29,648
+ function validate(31,683
+ function checkQuotation(59,1384
+ class CommentAD 70,1639
+ function CommentAD(73,1693
+ function validate(83,1944
+ class POEntry 105,2410
+ function POEntry(119,2711
+ function lineCount(135,3255
+ function serializeToVars(141,3365
+ function write(151,3800
+ class POReader 163,4178
+ function gettext(177,4457
+ function parseFromVars(189,4705
+ function serializeToVars(215,5331
+ function POReader(229,5613
+ function read(243,5983
+ function write(259,6307
+ function isComment(277,6645
+ function comment(284,6822
+ function msgid(304,7247
+ function msgstr(320,7574
+ function start(340,8232
+ function createPOEntries(360,8644
+ function stripLine(394,9472
+ function printClassification(421,10056
+ function classifyLine(432,10301
+ function getTextDomains(471,11094
+ class PORManager 498,11756
+ function PORManager(502,11822
+ function addPOReader(507,11896
+ function &getPOReader(getPOReader512,11992
+ function getDomainNames(517,12081
+ function &loadPORManager(loadPORManager523,12174
+ function fileJoin(536,12436
+ function lce_bindtextdomain(557,12839
+ function lce_textdomain(614,14530
+ function lce_gettext(620,14641
+ function lce_dgettext(626,14767
+ function lce(634,14966
+ function lce_bindtextdomain(651,15488
+ function lce_textdomain(656,15592
+ function lce_gettext(661,15674
+ function lce_dgettext(666,15755
+ function lce(670,15855
+ function lce_geteditcode(676,15898
+
+php-src/ptest.php,46
+define("TEST"TEST1,0
+test 4,26
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+ my $entry entry218,5621
+ my $entry entry234,6077
+ my $entry entry245,6351
+ my $entry entry252,6536
+ my $entry entry268,7010
+ my $entry entry276,7204
+ my $entry entry281,7328
+ my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+ my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+ local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+ local($prog,$_,@list)($prog,$_,@list39,868
+ local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+ def __init__(18,374
+ def __repr__(24,590
+ def __str__(34,871
+class Server:Server37,934
+ def __init__(38,948
+ def dump(73,2198
+ def __repr__(125,3896
+ def __str__(128,3945
+class User:User131,4014
+ def __init__(132,4026
+ def __repr__(172,5445
+ def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+ def bind(234,7525
+ def focus_set(236,7584
+ def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+ def __init__(269,8808
+ def handleList(303,10042
+ def handleNew(306,10094
+ def editItem(314,10426
+ def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+ def PostControls(376,12403
+ def GatherControls(421,13530
+class ServerEdit(512,16264
+ def __init__(513,16289
+ def post(525,16629
+ def gather(543,17191
+ def nosave(547,17304
+ def save(551,17408
+ def refreshPort(556,17509
+ def createWidgets(561,17663
+ def edituser(631,20708
+class UserEdit(645,20921
+ def __init__(646,20944
+ def post(658,21283
+ def gather(676,21841
+ def nosave(680,21950
+ def save(684,22052
+ def createWidgets(689,22151
+class Configure(760,24879
+ def __init__(761,24916
+ def MakeDispose(772,25211
+ def MakeSitelist(786,25706
+ def editsite(794,25949
+ def save(797,26022
+ def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
+@node Top,62,2139
+@node Copying,80,2652
+@node Overview,83,2705
+@node Sample,166,7272
+@node Invoking gzip,Invoking gzip210,8828
+@node Advanced usage,Advanced usage357,13495
+@node Environment,420,15207
+@node Tapes,437,15768
+@node Problems,460,16767
+@node Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
+\def\@{\@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+ \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+ \def\subtitlefont{\subtitlefont765,24968
+ \def\authorfont{\authorfont767,25052
+ \def\title{\title773,25262
+ \def\titlezzz##1{\titlezzz774,25297
+ \def\subtitle{\subtitle782,25612
+ \def\subtitlezzz##1{\subtitlezzz783,25653
+ \def\author{\author786,25771
+ \def\authorzzz##1{\authorzzz787,25808
+ \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+ \def\thearg{\thearg1145,37720
+ \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0 %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+ \def\indexbackslash{\indexbackslash1480,48406
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+ \null\nobreak\indexdotfill % Have leaders before the page number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+ \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno \appendixno = `\@no1626,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+ {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+ {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+ {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+ \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+ \def\secentry ##1##2##3##4{\secentry2066,68220
+ \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+ \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+ \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+ \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+ \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+ {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
+\def\@{\@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+ \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1836
+void (*fa)fa131,
+void 132,
+my_printf 135,
+void fatala 138,
+void fatalb 139,
+max 141,
+struct bar 143,
+__attribute__ ((always_inline)) max 147,
+extern int old_var 149,
+struct foo150,
+char stack[stack155,
+struct S 156,
+} wait_status_ptr_t 161,
+Some_Class A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+ f1 183,
+void f2 184,
+__attribute__((noreturn)) void d0 185,
+ __attribute__((format(printf, 1, 2))) d1 186,
+ d2 187,
+int x 188,
+struct foo 189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,x-get-selection-internal206,
+ Fx_get_selection_internal,x-get-selection-internal212,
+ Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+ aaa;249,
+ bbb;251,
+struct sss1 252,
+struct sss2253,
+ struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+ **b;b262,
+caccacacca 263,
+a 267,
+ typedef struct aa 269,
+ typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+ typedef int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,1061
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+int yylex 57,1317
+void yyerror 59,1347
+void yyerror 61,1376
+VOIDSTAR parse_hash;63,1400
+extern VOIDSTAR hash_find(64,1421
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+YYSTYPE make_list 75,1716
+YYSTYPE make_list 77,1760
+char *instr;instr80,1790
+int parse_error 81,1803
+extern struct obstack tmp_mem;82,1824
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+extern struct node *yylval;yylval305,6233
+unsigned char parse_cell_or_range 308,6278
+unsigned char parse_cell_or_range 310,6342
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define NE 6,114
+# define LE 7,130
+# define GE 8,146
+# define NEG 9,162
+# define L_CELL 10,179
+# define L_RANGE 11,199
+# define L_VAR 12,220
+# define L_CONST 13,239
+# define L_FN0 14,260
+# define L_FN1 15,279
+# define L_FN2 16,298
+# define L_FN3 17,317
+# define L_FN4 18,336
+# define L_FNN 19,355
+# define L_FN1R 20,374
+# define L_FN2R 21,394
+# define L_FN3R 22,414
+# define L_FN4R 23,434
+# define L_FNNR 24,454
+# define L_LE 25,474
+# define L_NE 26,492
+# define L_GE 27,510
+
+parse.y,1464
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+int yylex 57,
+void yyerror 59,
+void yyerror 61,
+VOIDSTAR parse_hash;63,
+extern VOIDSTAR hash_find(64,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+YYSTYPE make_list 75,
+YYSTYPE make_list 77,
+char *instr;instr80,
+int parse_error 81,
+extern struct obstack tmp_mem;82,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define YYFINAL 93,
+#define YYFLAG 94,
+#define YYNTBASE 95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define YYLAST 266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+extern struct node *yylval;yylval305,
+unsigned char parse_cell_or_range 308,
+unsigned char parse_cell_or_range 310,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2180
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ YYDPRINTF 917,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyerror 946,
+ yyresult 947,
+
+y-src/atest.y,9
+exp 2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define INT 6,113
+# define CHAR 7,130
+# define NAME 8,148
+# define ERROR 9,166
+# define OR 10,185
+# define AND 11,201
+# define EQUAL 12,218
+# define NOTEQUAL 13,237
+# define LEQ 14,259
+# define GEQ 15,276
+# define LSH 16,293
+# define RSH 17,310
+# define UNARY 18,327
+
+cccp.y,2005
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int yylex 66,
+void yyerror 67,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+extern unsigned char is_idstart[is_idstart76,
+extern unsigned char is_idstart[], is_idchar[is_idchar76,
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[is_hor_space76,
+extern char *xmalloc xmalloc78,
+extern int pedantic;81,
+extern int traditional;84,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+static void integer_overflow 106,
+static long left_shift 107,
+static long right_shift 108,
+ struct constant 113,
+ struct name 114,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define YYFINAL 127,
+#define YYFLAG 128,
+#define YYNTBASE 129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define YYLAST 274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+extern int yydebug;919,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2180
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ YYDPRINTF 917,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyerror 946,
+ yyresult 947,
+
+y-src/cccp.y,1582
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int yylex 66,1712
+void yyerror 67,1726
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+extern unsigned char is_idstart[is_idstart76,1944
+extern unsigned char is_idstart[], is_idchar[is_idchar76,1944
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[is_hor_space76,1944
+extern char *xmalloc xmalloc78,2009
+extern int pedantic;81,2062
+extern int traditional;84,2114
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+static void integer_overflow 106,2632
+static long left_shift 107,2665
+static long right_shift 108,2692
+ struct constant 112,2733
+ struct name 113,2789
+start 143,3226
+exp1 148,3330
+exp 156,3505
+exp 185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+extern int yydebug;919,21416
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_3 b/test/etags/ETAGS.good_3
new file mode 100644
index 00000000000..644ffe49df4
--- /dev/null
+++ b/test/etags/ETAGS.good_3
@@ -0,0 +1,4611 @@
+
+Makefile,683
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,584
+ERLSRC=11,654
+FORTHSRC=12,699
+FSRC=13,749
+HTMLSRC=14,821
+LUASRC=16,950
+MAKESRC=17,993
+OBJCSRC=18,1035
+OBJCPPSRC=19,1116
+PASSRC=20,1179
+PERLSRC=21,1221
+PHPSRC=22,1291
+PSSRC=23,1363
+PROLSRC=24,1403
+PYTSRC=25,1465
+TEXSRC=26,1506
+YSRC=27,1585
+SRCS=28,1650
+NONSRCS=32,1902
+ETAGS_PROG=34,1976
+CTAGS_PROG=35,2007
+REGEX=37,2039
+xx=38,2085
+RUN=40,2134
+OPTIONS=42,2140
+ARGS=43,2192
+infiles 45,2210
+check:check47,2272
+ediff%:ediff%55,2575
+cdiff:cdiff58,2676
+ETAGS:ETAGS61,2773
+CTAGS:CTAGS64,2843
+srclist:srclist67,2921
+regexfile:regexfile71,3012
+.PRECIOUS:.PRECIOUS77,3189
+FRC:FRC79,3223
+
+ada-src/etags-test-for.ada,1969
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+ function Body_RequiredBody_Required/f3,78
+ type Type_Specific_Data Type_Specific_Data/t11,280
+ function "abs"abs/f19,504
+ type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+ function "="=/f27,722
+ type usfreelock_ptr usfreelock_ptr/t30,803
+ function p p/f33,891
+ procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+ type Private_T Private_T/t46,1220
+ package Inner1 Inner1/s48,1250
+ procedure Private_T;Private_T/p49,1270
+ package Inner2 Inner2/s52,1310
+ task Private_T;Private_T/k53,1330
+ type Public_T Public_T/t56,1365
+ procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+ procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+ function Pkg1_Func1 Pkg1_Func1/f66,1514
+ function Pkg1_Func2 Pkg1_Func2/f68,1553
+ package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+ task type Task_Type Task_Type/k75,1694
+ type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+ procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+ package body Inner1 Inner1/b96,1956
+ procedure Private_T Private_T/p97,1981
+ package body Inner2 Inner2/b103,2054
+ task body Private_T Private_T/b104,2079
+ task body Task_Type Task_Type/b112,2181
+ procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+ function Pkg1_Func1 Pkg1_Func1/f132,2445
+ function Pkg1_Func2 Pkg1_Func2/f134,2496
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+ protected Bidule Bidule/t168,2953
+ protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+ protected body Bidule Bidule/b179,3115
+ protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+ package RTE RTE/s69,2712
+ package TSL TSL/s70,2759
+ function To_void_ptr To_void_ptr/f86,3287
+ function To_TCB_Ptr To_TCB_Ptr/f89,3366
+ function pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+ function pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+ procedure Abort_WrapperAbort_Wrapper/p115,4302
+ procedure LL_Wrapper LL_Wrapper/p122,4526
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+ function Self Self/f160,5586
+ procedure Initialize_LockInitialize_Lock/p174,5958
+ procedure Finalize_Lock Finalize_Lock/p210,6927
+ procedure Write_Lock Write_Lock/p226,7338
+ procedure Read_Lock Read_Lock/p239,7700
+ procedure Unlock Unlock/p246,7850
+ procedure Initialize_Cond Initialize_Cond/p258,8160
+ procedure Finalize_Cond Finalize_Cond/p286,8979
+ procedure Cond_Wait Cond_Wait/p300,9303
+ procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+ procedure Cond_Signal Cond_Signal/p343,10510
+ procedure Set_PrioritySet_Priority/p355,10836
+ procedure Set_Own_Priority Set_Own_Priority/p372,11243
+ function Get_Priority Get_Priority/f385,11598
+ function Get_Own_Priority Get_Own_Priority/f398,12023
+ procedure Create_LL_TaskCreate_LL_Task/p412,12438
+ function To_Start_Addr To_Start_Addr/f426,12873
+ procedure Exit_LL_Task Exit_LL_Task/p491,14995
+ procedure Abort_Task Abort_Task/p500,15158
+ procedure Test_Abort Test_Abort/p518,15716
+ procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+ procedure Abort_WrapperAbort_Wrapper/p557,16939
+ function Address_To_Call_State Address_To_Call_State/f562,17062
+ procedure Install_Error_Handler Install_Error_Handler/p573,17351
+ procedure LL_Assert LL_Assert/p599,18146
+ procedure LL_Wrapper LL_Wrapper/p608,18299
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+ procedure Clear Clear/p640,19236
+ procedure Test_And_Set Test_And_Set/p645,19330
+ function Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+ type Pre_Call_State Pre_Call_State/t64,3331
+ type Task_Storage_Size Task_Storage_Size/t66,3378
+ type Machine_Exceptions Machine_Exceptions/t68,3433
+ type Error_Information Error_Information/t70,3499
+ type Lock Lock/t72,3569
+ type Condition_Variable Condition_Variable/t73,3594
+ type Task_Control_Block Task_Control_Block/t81,3955
+ type TCB_Ptr TCB_Ptr/t89,4241
+ function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+ function Self Self/f100,4602
+ procedure Initialize_Lock Initialize_Lock/p103,4707
+ procedure Finalize_Lock Finalize_Lock/p107,4879
+ procedure Write_Lock Write_Lock/p111,5034
+ procedure Read_Lock Read_Lock/p118,5428
+ procedure Unlock Unlock/p128,5995
+ procedure Initialize_Cond Initialize_Cond/p135,6300
+ procedure Finalize_Cond Finalize_Cond/p138,6413
+ procedure Cond_Wait Cond_Wait/p142,6591
+ procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+ procedure Cond_Signal Cond_Signal/p164,7812
+ procedure Set_Priority Set_Priority/p169,8040
+ procedure Set_Own_Priority Set_Own_Priority/p173,8200
+ function Get_Priority Get_Priority/f177,8348
+ function Get_Own_Priority Get_Own_Priority/f181,8504
+ procedure Create_LL_TaskCreate_LL_Task/p185,8647
+ procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+ procedure Abort_Task Abort_Task/p203,9516
+ procedure Test_Abort;Test_Abort/p210,9878
+ type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+ procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+ procedure Install_Error_Handler Install_Error_Handler/p226,10741
+ procedure LL_Assert LL_Assert/p231,10983
+ type Proc Proc/t238,11240
+ type TAS_Cell TAS_Cell/t242,11328
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+ procedure Clear Clear/p260,12157
+ procedure Test_And_Set Test_And_Set/p267,12462
+ function Is_Set Is_Set/f275,12877
+ type Lock Lock/t283,13155
+ type Condition_Variable Condition_Variable/t288,13267
+ type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+ type Private_T Private_T/t5,106
+ package Inner1 Inner1/s7,136
+ procedure Private_T;Private_T/p8,156
+ package Inner2 Inner2/s11,196
+ task Private_T;Private_T/k12,216
+ type Public_T Public_T/t15,251
+ procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+ procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+ function Pkg1_Func1 Pkg1_Func1/f25,400
+ function Pkg1_Func2 Pkg1_Func2/f27,439
+ package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+ task type Task_Type Task_Type/k34,580
+ type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+ procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+ package body Inner1 Inner1/b53,840
+ procedure Private_T Private_T/p54,865
+ package body Inner2 Inner2/b60,938
+ task body Private_T Private_T/b61,963
+ task body Task_Type Task_Type/b68,1064
+ procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+ function Pkg1_Func1 Pkg1_Func1/f88,1328
+ function Pkg1_Func2 Pkg1_Func2/f90,1379
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+ protected Bidule Bidule/t125,1964
+ protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+ protected body Bidule Bidule/b139,2181
+ protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,1432
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,275
+#define _GETOPT_H 19,801
+struct option73,2797
+ const char *name;name76,2826
+ char *name;name78,2852
+ int has_arg;82,3009
+ int *flag;flag83,3024
+ int val;84,3037
+#define no_argument 89,3124
+#define required_argument 90,3147
+#define optional_argument 91,3175
+
+c-src/etags.c,12045
+char pot_etags_version[pot_etags_version81,3470
+# undef DEBUG84,3552
+# define DEBUG 85,3567
+# define DEBUG 87,3594
+# define NDEBUG 88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef DOS_NT117,4160
+# define DOS_NT118,4176
+# undef assert 135,4482
+# define assert(136,4541
+# undef CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define iswhite(159,5329
+#define notinname(160,5394
+#define begtoken(161,5469
+#define intoken(162,5542
+#define endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+ const char *suffix;suffix186,6219
+ const char *command;command187,6294
+} compressor;188,6365
+ const char *name;name192,6397
+ const char *help;help193,6449
+ Lang_function *function;function194,6508
+ const char **suffixes;suffixes195,6556
+ const char **filenames;filenames196,6633
+ const char **interpreters;interpreters197,6702
+ bool metasource;198,6771
+} language;199,6835
+typedef struct fdesc201,6848
+ struct fdesc *next;next203,6871
+ char *infname;infname204,6920
+ char *infabsname;infabsname205,6973
+ char *infabsdir;infabsdir206,7038
+ char *taggedfname;taggedfname207,7091
+ language *lang;lang208,7149
+ char *prop;prop209,7191
+ bool usecharno;210,7249
+ bool written;211,7311
+} fdesc;212,7366
+typedef struct node_st214,7376
+ struct node_st *left,left216,7428
+ struct node_st *left, *right;right216,7428
+ fdesc *fdp;fdp217,7486
+ char *name;name218,7548
+ char *regex;regex219,7580
+ bool valid;220,7617
+ bool is_func;221,7670
+ bool been_warned;222,7733
+ int lno;223,7801
+ long cno;224,7842
+} node;225,7894
+ long size;236,8208
+ int len;237,8221
+ char *buffer;buffer238,8232
+} linebuffer;239,8248
+ at_language,245,8344
+ at_regexp,246,8393
+ at_filename,247,8437
+ at_stdin,248,8473
+ at_end 249,8516
+ } arg_type;250,8557
+ language *lang;lang251,8593
+ char *what;what252,8656
+} argument;253,8698
+typedef struct regexp256,8758
+ struct regexp *p_next;p_next258,8782
+ language *lang;lang259,8837
+ char *pattern;pattern260,8897
+ char *name;name261,8940
+ struct re_pattern_buffer *pat;pat262,8971
+ struct re_registers regs;263,9031
+ bool error_signaled;264,9078
+ bool force_explicit_name;265,9141
+ bool ignore_case;266,9206
+ bool multi_line;267,9259
+} regexp;268,9325
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT 2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC 2199,69242
+enum sym_type2204,69312
+ st_none,2206,69328
+ st_C_objprot,2207,69339
+ st_C_objprot, st_C_objimpl,2207,69339
+ st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+ st_C_gnumacro,2208,69382
+ st_C_ignore,2209,69399
+ st_C_ignore, st_C_attribute,2209,69399
+ st_C_javastruct,2210,69430
+ st_C_operator,2211,69449
+ st_C_class,2212,69466
+ st_C_class, st_C_template,2212,69466
+ st_C_struct,2213,69495
+ st_C_struct, st_C_extern,2213,69495
+ st_C_struct, st_C_extern, st_C_enum,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+struct C_stab_entry { const char *name;name2271,71278
+struct C_stab_entry { const char *name; int c_ext;2271,71278
+struct C_stab_entry { const char *name; int c_ext; enum sym_type type;2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+ TOTAL_KEYWORDS 2325,73018
+ MIN_WORD_LENGTH 2326,73045
+ MAX_WORD_LENGTH 2327,73072
+ MIN_HASH_VALUE 2328,73100
+ MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+ fvnone,2408,75435
+ fdefunkey,2409,75466
+ fdefunname,2410,75512
+ foperator,2411,75556
+ fvnameseen,2412,75613
+ fstartlist,2413,75666
+ finlist,2414,75722
+ flistseen,2415,75765
+ fignore,2416,75813
+ vignore 2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+ tnone,2428,76089
+ tkeyseen,2429,76119
+ ttypeseen,2430,76160
+ tinbody,2431,76199
+ tend,2432,76238
+ tignore 2433,76279
+} typdef;2434,76320
+ snone,2443,76499
+ skeyseen,2445,76575
+ stagseen,2446,76620
+ scolonseen 2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+ dnone,2460,76942
+ dsharpseen,2461,76972
+ ddefineseen,2462,77025
+ dignorerest 2463,77070
+} definedef;2464,77112
+ onone,2472,77267
+ oprotocol,2473,77297
+ oimplementation,2474,77347
+ otagseen,2475,77395
+ oparenseen,2476,77431
+ ocatseen,2477,77486
+ oinbody,2478,77525
+ omethodsign,2479,77568
+ omethodtag,2480,77626
+ omethodcolon,2481,77666
+ omethodparm,2482,77709
+ oignore 2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+ char *line;line2493,77964
+ int offset;2494,78014
+ int length;2495,78067
+ bool valid;2502,78352
+ bool named;2505,78487
+ int lineno;2506,78528
+ long linepos;2507,78576
+} token;2508,78626
+ char **cname;cname2519,78950
+ int *bracelev;bracelev2520,78993
+ int nl;2521,79042
+ int size;2522,79096
+} cstack;2523,79136
+#define nestlev 2525,79264
+#define instruct 2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+consider_token 2613,81341
+ long linepos;2922,88499
+ linebuffer lb;2923,88515
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,99
+ size_t n;28,961
+ void EXFUN((*fn[fn29,975
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,99
+ size_t n;28,961
+ void EXFUN((*fn[fn29,975
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define ENTRY(21,865
+#define PSEUDO(26,972
+ movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+ movl $SYS_##syscall_name, %eax;eax31,1132
+ int $0x80;32,1180
+ test %eax,eax33,1210
+ test %eax, %eax;eax33,1210
+ jl syscall_error;34,1245
+#define XCHG_0 47,1562
+#define XCHG_1 48,1606
+#define XCHG_2 49,1648
+#define XCHG_3 50,1691
+#define XCHG_4 51,1734
+#define XCHG_5 52,1777
+#define r0 54,1821
+#define r1 55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int count_words(15,263
+static char *get_word(get_word35,553
+void tab_free(59,966
+char **tab_fill(tab_fill70,1129
+int tab_delete_first(91,1638
+int tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,4207
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT 124,3934
+#define BLOCKLOG 125,3977
+#define BLOCKSIZE 126,4018
+#define BLOCKIFY(127,4052
+#define HEAP 131,4215
+#define FINAL_FREE_BLOCKS 135,4391
+ int type;145,4676
+ size_t nfree;150,4720
+ size_t first;151,4777
+ } frag;152,4834
+ ptrdiff_t size;156,5055
+ } info;157,5076
+ } busy;158,5087
+ size_t size;163,5215
+ size_t next;164,5272
+ size_t prev;165,5321
+ } free;166,5374
+ } malloc_info;167,5388
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+struct list186,5939
+ struct list *next;next188,5955
+ struct list *prev;prev189,5978
+struct alignlist196,6153
+ struct alignlist *next;next198,6174
+ void *aligned;aligned199,6202
+ void *exact;exact200,6270
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+enum mcheck_status283,9092
+ MCHECK_DISABLED 285,9115
+ MCHECK_OK,286,9187
+ MCHECK_FREE,287,9226
+ MCHECK_HEAD,288,9270
+ MCHECK_TAIL 289,9334
+struct mstats308,10153
+ size_t bytes_total;310,10171
+ size_t chunks_used;311,10225
+ size_t bytes_used;312,10285
+ size_t chunks_free;313,10351
+ size_t bytes_free;314,10406
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define __sbrk 1513,46042
+__default_morecore 1525,46511
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+hybrid_get_current_dir_name 1811,53797
+#define MAGICWORD 1854,55206
+#define MAGICFREE 1855,55261
+#define MAGICBYTE 1856,55316
+#define MALLOCFLOOD 1857,55348
+#define FREEFLOOD 1858,55382
+struct hdr1860,55415
+ size_t size;1862,55430
+ size_t magic;1863,55484
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,4485
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+#define RE_SYNTAX_EMACS 183,7684
+#define RE_SYNTAX_AWK 186,7780
+#define RE_SYNTAX_GNU_AWK 193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP 206,8549
+#define RE_SYNTAX_POSIX_EGREP 212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON 221,9072
+#define RE_SYNTAX_POSIX_BASIC 225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC 231,9508
+#define RE_SYNTAX_POSIX_EXTENDED 234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED 242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+ REG_ENOSYS 297,11859
+ REG_NOERROR 300,11941
+ REG_NOMATCH,301,11976
+ REG_BADPAT,305,12123
+ REG_ECOLLATE,306,12162
+ REG_ECTYPE,307,12203
+ REG_EESCAPE,308,12255
+ REG_ESUBREG,309,12298
+ REG_EBRACK,310,12345
+ REG_EPAREN,311,12391
+ REG_EBRACE,312,12436
+ REG_BADBR,313,12472
+ REG_ERANGE,314,12519
+ REG_ESPACE,315,12560
+ REG_BADRPT,316,12601
+ REG_EEND,319,12693
+ REG_ESIZE,320,12728
+ REG_ERPAREN,321,12790
+ REG_ERANGEX 322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+ unsigned char *buffer;buffer341,13538
+ size_t allocated;344,13614
+ size_t used;347,13686
+ reg_syntax_t syntax;350,13769
+ char *fastmap;fastmap355,13975
+ RE_TRANSLATE_TYPE translate;361,14241
+ size_t re_nsub;364,14329
+ unsigned can_be_null 370,14624
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+ unsigned regs_allocated 379,14963
+ unsigned fastmap_accurate 383,15136
+ unsigned no_sub 387,15267
+ unsigned not_bol 391,15398
+ unsigned not_eol 394,15475
+ unsigned used_syntax 398,15655
+ unsigned multibyte 403,15805
+ unsigned target_multibyte 407,15941
+ int charset_unibyte;410,16032
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+ unsigned num_regs;430,16674
+ regoff_t *start;start431,16695
+ regoff_t *end;end432,16714
+# define RE_NREGS 440,16942
+ regoff_t rm_so;449,17159
+ regoff_t rm_eo;450,17239
+} regmatch_t;451,17317
+# define _Restrict_ 540,20886
+# define _Restrict_ 542,20979
+# define _Restrict_544,21018
+# define _Restrict_arr_ 555,21418
+# define _Restrict_arr_557,21461
+# define CHAR_CLASS_MAX_LENGTH 593,22470
+# define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+ RECC_ALNUM,610,22984
+ RECC_ALNUM, RECC_ALPHA,610,22984
+ RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+ RECC_GRAPH,611,23027
+ RECC_GRAPH, RECC_PRINT,611,23027
+ RECC_LOWER,612,23059
+ RECC_LOWER, RECC_UPPER,612,23059
+ RECC_PUNCT,613,23091
+ RECC_PUNCT, RECC_CNTRL,613,23091
+ RECC_DIGIT,614,23123
+ RECC_DIGIT, RECC_XDIGIT,614,23123
+ RECC_BLANK,615,23156
+ RECC_BLANK, RECC_SPACE,615,23156
+ RECC_MULTIBYTE,616,23188
+ RECC_MULTIBYTE, RECC_NONASCII,616,23188
+ RECC_ASCII,617,23227
+ RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+typedef int re_wchar_t;623,23387
+
+c-src/emacs/src/keyboard.c,13949
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF 119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard *ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+unsigned timers_run;320,11296
+struct timespec *input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW 346,12046
+#define READABLE_EVENTS_FILTER_EVENTS 347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES 348,12142
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+ KBOARD *kboard;kboard860,27087
+ struct kboard_stack *next;next861,27105
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", Fcommand_error_default_function,command-error-default-function1043,32030
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING 2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+ int sig;7238,215915
+ char *name;name7241,215956
+ int npending;7244,216007
+ struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+ Lisp_Object parent;8745,259107
+ Lisp_Object map;8748,259224
+ int start,8753,259446
+ int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+ short var;11023,332716
+ short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+
+c-src/emacs/src/lisp.h,25767
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+# define EMACS_INT_MAX 93,3079
+# define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+# define EMACS_INT_MAX 98,3265
+# define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+# define EMACS_INT_MAX 105,3553
+# define pI 106,3587
+enum { BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+ BITS_PER_CHAR 136,4570
+ BITS_PER_SHORT 137,4605
+ BITS_PER_LONG 138,4657
+ BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+ VALBITS 246,8742
+ INTTYPEBITS 249,8838
+ FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+# define check_cons_list(405,15097
+# define make_number(408,15176
+# define XFASTINT(409,15224
+# define XINT(410,15266
+# define XSYMBOL(411,15300
+# define XTYPE(412,15340
+# define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+ Lisp_Symbol 454,16851
+ Lisp_Misc 458,16993
+ Lisp_Int0 461,17067
+ Lisp_Int1 462,17086
+ Lisp_String 466,17264
+ Lisp_Vectorlike 472,17543
+ Lisp_Cons 475,17632
+ Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+ Lisp_Misc_Free 487,18040
+ Lisp_Misc_Marker,488,18069
+ Lisp_Misc_Overlay,489,18091
+ Lisp_Misc_Save_Value,490,18114
+ Lisp_Misc_Finalizer,491,18140
+ Lisp_Misc_Float,494,18275
+ Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+ Lisp_Fwd_Int,504,18566
+ Lisp_Fwd_Bool,505,18619
+ Lisp_Fwd_Obj,506,18670
+ Lisp_Fwd_Buffer_Obj,507,18729
+ Lisp_Fwd_Kboard_Obj 508,18800
+typedef struct { EMACS_INT i;567,21781
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+enum symbol_interned639,24199
+ SYMBOL_UNINTERNED 641,24222
+ SYMBOL_INTERNED 642,24247
+ SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+ SYMBOL_PLAINVAL 648,24338
+ SYMBOL_VARALIAS 649,24362
+ SYMBOL_LOCALIZED 650,24386
+ SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+ bool_bf gcmarkbit 656,24458
+ ENUM_BF 663,24793
+ Lisp_Object value;687,25631
+ struct Lisp_Symbol *alias;alias688,25654
+ struct Lisp_Buffer_Local_Value *blv;blv689,25685
+ union Lisp_Fwd *fwd;fwd690,25726
+ } val;691,25751
+ Lisp_Object function;694,25823
+ Lisp_Object plist;697,25885
+ struct Lisp_Symbol *next;next700,25974
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY 712,26446
+#define DEFUN_ARGS_UNEVALLED 713,26498
+#define DEFUN_ARGS_0 714,26541
+#define DEFUN_ARGS_1 715,26569
+#define DEFUN_ARGS_2 716,26604
+#define DEFUN_ARGS_3 717,26652
+#define DEFUN_ARGS_4 718,26713
+#define DEFUN_ARGS_5 719,26787
+#define DEFUN_ARGS_6 721,26880
+#define DEFUN_ARGS_7 723,26986
+#define DEFUN_ARGS_8 725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+ PVEC_NORMAL_VECTOR,782,29585
+ PVEC_FREE,783,29607
+ PVEC_PROCESS,784,29620
+ PVEC_FRAME,785,29636
+ PVEC_WINDOW,786,29650
+ PVEC_BOOL_VECTOR,787,29665
+ PVEC_BUFFER,788,29685
+ PVEC_HASH_TABLE,789,29700
+ PVEC_TERMINAL,790,29719
+ PVEC_WINDOW_CONFIGURATION,791,29736
+ PVEC_SUBR,792,29765
+ PVEC_OTHER,793,29778
+ PVEC_COMPILED,795,29856
+ PVEC_CHAR_TABLE,796,29873
+ PVEC_SUB_CHAR_TABLE,797,29892
+ PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+ PSEUDOVECTOR_SIZE_BITS 808,30382
+ PSEUDOVECTOR_SIZE_MASK 809,30415
+ PSEUDOVECTOR_REST_BITS 813,30625
+ PSEUDOVECTOR_REST_MASK 814,30658
+ PSEUDOVECTOR_AREA_BITS 818,30823
+ PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+ Lisp_Object cdr;1159,40162
+ struct Lisp_Cons *chain;chain1162,40236
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+ ptrdiff_t size;1364,46383
+struct Lisp_Vector1369,46482
+ struct vectorlike_header header;1371,46505
+ Lisp_Object contents[contents1372,46542
+ ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+ struct vectorlike_header header;1388,47012
+ EMACS_INT size;1390,47086
+ bits_word data[data1395,47319
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+ header_size 1471,49047
+ bool_header_size 1472,49106
+ word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+ CHARTAB_SIZE_BITS_0 1567,52516
+ CHARTAB_SIZE_BITS_1 1568,52545
+ CHARTAB_SIZE_BITS_2 1569,52574
+ CHARTAB_SIZE_BITS_3 1570,52603
+struct Lisp_Char_Table1575,52672
+ struct vectorlike_header header;1581,52928
+ Lisp_Object defalt;1585,53078
+ Lisp_Object parent;1590,53280
+ Lisp_Object purpose;1594,53398
+ Lisp_Object ascii;1598,53564
+ Lisp_Object contents[contents1600,53588
+ Lisp_Object extras[extras1603,53699
+struct Lisp_Sub_Char_Table1606,53752
+ struct vectorlike_header header;1610,53918
+ int depth;1618,54341
+ int min_char;1621,54417
+ Lisp_Object contents[contents1624,54492
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+ struct vectorlike_header header;1672,55807
+ Lisp_Object (*a0)a01674,55856
+ Lisp_Object (*a1)a11675,55888
+ Lisp_Object (*a2)a21676,55927
+ Lisp_Object (*a3)a31677,55979
+ Lisp_Object (*a4)a41678,56044
+ Lisp_Object (*a5)a51679,56122
+ Lisp_Object (*a6)a61680,56213
+ Lisp_Object (*a7)a71681,56317
+ Lisp_Object (*a8)a81682,56434
+ Lisp_Object (*aUNEVALLED)aUNEVALLED1683,56564
+ Lisp_Object (*aMANY)aMANY1684,56616
+ } function;1685,56671
+ short min_args,1686,56687
+ short min_args, max_args;1686,56687
+ const char *symbol_name;symbol_name1687,56717
+ const char *intspec;intspec1688,56746
+ const char *doc;doc1689,56771
+enum char_table_specials1692,56798
+ CHAR_TABLE_STANDARD_SLOTS 1697,56993
+ SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+ Lisp_Object name;1808,60139
+ Lisp_Object user_hash_function;1811,60206
+ Lisp_Object user_cmp_function;1814,60297
+ bool (*cmpfn)cmpfn1817,60372
+ EMACS_UINT (*hashfn)hashfn1820,60486
+struct Lisp_Hash_Table1823,60555
+ struct vectorlike_header header;1826,60649
+ Lisp_Object weak;1830,60783
+ Lisp_Object rehash_size;1835,61007
+ Lisp_Object rehash_threshold;1839,61129
+ Lisp_Object hash;1843,61260
+ Lisp_Object next;1848,61490
+ Lisp_Object next_free;1851,61560
+ Lisp_Object index;1856,61771
+ ptrdiff_t count;1863,62041
+ Lisp_Object key_and_value;1868,62240
+ struct hash_table_test test;1871,62314
+ struct Lisp_Hash_Table *next_weak;next_weak1875,62457
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any 1971,64806
+ ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+ ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+ ENUM_BF 2034,67346
+ SAVE_UNUSED,2047,67641
+ SAVE_INTEGER,2048,67658
+ SAVE_FUNCPOINTER,2049,67676
+ SAVE_POINTER,2050,67698
+ SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+ SAVE_TYPE_INT_INT 2066,68096
+ SAVE_TYPE_INT_INT_INT2067,68169
+ SAVE_TYPE_OBJ_OBJ 2069,68259
+ SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+ SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+ SAVE_TYPE_PTR_INT 2073,68506
+ SAVE_TYPE_PTR_OBJ 2074,68579
+ SAVE_TYPE_PTR_PTR 2075,68651
+ SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+ SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+ ENUM_BF 2112,69900
+ void *pointer;pointer2125,70555
+ voidfuncptr funcpointer;2126,70576
+ ptrdiff_t integer;2127,70607
+ Lisp_Object object;2128,70632
+ } data[data2129,70658
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+ struct Lisp_Misc_Any base;2188,72132
+ struct Lisp_Finalizer *prev;prev2191,72220
+ struct Lisp_Finalizer *next;next2192,72253
+ Lisp_Object function;2197,72490
+struct Lisp_Free2201,72581
+ ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+ struct Lisp_Misc_Any u_any;2214,72902
+ struct Lisp_Free u_free;2215,72973
+ struct Lisp_Marker u_marker;2216,73002
+ struct Lisp_Overlay u_overlay;2217,73035
+ struct Lisp_Save_Value u_save_value;2218,73070
+ struct Lisp_Finalizer u_finalizer;2219,73111
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+ enum Lisp_Fwd_Type type;2276,74140
+ EMACS_INT *intvar;intvar2277,74190
+struct Lisp_Boolfwd2284,74411
+ enum Lisp_Fwd_Type type;2286,74435
+ bool *boolvar;boolvar2287,74486
+struct Lisp_Objfwd2294,74702
+ enum Lisp_Fwd_Type type;2296,74725
+ Lisp_Object *objvar;objvar2297,74775
+struct Lisp_Buffer_Objfwd2302,74934
+ enum Lisp_Fwd_Type type;2304,74964
+ int offset;2305,75021
+ Lisp_Object predicate;2307,75113
+struct Lisp_Buffer_Local_Value2334,76470
+ bool_bf local_if_set 2338,76615
+ bool_bf frame_local 2341,76797
+ bool_bf found 2344,76939
+ union Lisp_Fwd *fwd;fwd2346,77041
+ Lisp_Object where;2348,77184
+ Lisp_Object defcell;2351,77310
+ Lisp_Object valcell;2357,77614
+struct Lisp_Kboard_Objfwd2362,77729
+ enum Lisp_Fwd_Type type;2364,77759
+ int offset;2365,77816
+union Lisp_Fwd2368,77838
+ struct Lisp_Intfwd u_intfwd;2370,77857
+ struct Lisp_Boolfwd u_boolfwd;2371,77890
+ struct Lisp_Objfwd u_objfwd;2372,77925
+ struct Lisp_Buffer_Objfwd u_buffer_objfwd;2373,77958
+ struct Lisp_Kboard_Objfwd u_kboard_objfwd;2374,78005
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+ double data;2395,78354
+ struct Lisp_Float *chain;chain2396,78373
+ } u;2397,78405
+XFLOAT_DATA 2401,78434
+ IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+ COMPILED_ARGLIST 2431,79389
+ COMPILED_BYTECODE 2432,79415
+ COMPILED_CONSTANTS 2433,79442
+ COMPILED_STACK_DEPTH 2434,79470
+ COMPILED_DOC_STRING 2435,79500
+ COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+ CHAR_ALT 2445,79850
+ CHAR_SUPER 2446,79876
+ CHAR_HYPER 2447,79904
+ CHAR_SHIFT 2448,79932
+ CHAR_CTL 2449,79960
+ CHAR_META 2450,79986
+ CHAR_MODIFIER_MASK 2452,80014
+ CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+enum maxargs2831,89401
+ MANY 2833,89418
+ UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+ SPECPDL_UNWIND,2944,93822
+ SPECPDL_UNWIND_PTR,2945,93891
+ SPECPDL_UNWIND_INT,2946,93942
+ SPECPDL_UNWIND_VOID,2947,93990
+ SPECPDL_BACKTRACE,2948,94044
+ SPECPDL_LET,2949,94102
+ SPECPDL_LET_LOCAL,2951,94232
+ SPECPDL_LET_DEFAULT 2952,94289
+union specbinding2955,94361
+ ENUM_BF 2957,94383
+ ENUM_BF 2959,94440
+ ENUM_BF 2964,94570
+ ENUM_BF 2969,94693
+ ENUM_BF 2974,94811
+ ENUM_BF 2978,94916
+ ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+ enum handlertype type;3025,96471
+ Lisp_Object tag_or_ch;3026,96496
+ Lisp_Object val;3027,96521
+ struct handler *next;next3028,96540
+ struct handler *nextfree;nextfree3029,96564
+ Lisp_Object *bytecode_top;bytecode_top3036,96922
+ int bytecode_dest;3037,96951
+ struct gcpro *gcpro;gcpro3042,97188
+ sys_jmp_buf jmp;3044,97218
+ EMACS_INT lisp_eval_depth;3045,97237
+ ptrdiff_t pdlcount;3046,97266
+ int poll_suppress_count;3047,97288
+ int interrupt_input_blocked;3048,97315
+ struct byte_stack *byte_stack;byte_stack3049,97346
+#define PUSH_HANDLER(3053,97443
+#define QUIT 3101,99220
+#define QUITP 3112,99470
+struct gcpro3132,100313
+ struct gcpro *next;next3134,100328
+ volatile Lisp_Object *var;var3137,100397
+ ptrdiff_t nvars;3140,100479
+ const char *name;name3144,100564
+ int lineno;3147,100620
+ int idx;3150,100681
+ int level;3153,100717
+#define GC_USE_GCPROS_AS_BEFORE 3171,101294
+#define GC_MAKE_GCPROS_NOOPS 3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS 3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES 3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO 3353,109913
+#define RETURN_UNGCPRO(3363,110180
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+enum Arith_Comparison 3497,113300
+ ARITH_EQUAL,3498,113324
+ ARITH_NOTEQUAL,3499,113339
+ ARITH_LESS,3500,113357
+ ARITH_GRTR,3501,113371
+ ARITH_LESS_OR_EQUAL,3502,113385
+ ARITH_GRTR_OR_EQUAL3503,113408
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_formatted_string 3767,124631
+build_pure_c_string 3792,125659
+build_string 3801,125864
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+intern 3968,132131
+intern_c_string 3974,132219
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern _Noreturn void emacs_abort 4374,148383
+egetenv 4532,152806
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA 4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+ struct Lisp_Cons s;4672,157290
+ double d;4673,157312
+ double d; intmax_t i;4673,157312
+ double d; intmax_t i; void *p;p4673,157312
+union Aligned_String4676,157349
+ struct Lisp_String s;4678,157372
+ double d;4679,157396
+ double d; intmax_t i;4679,157396
+ double d; intmax_t i; void *p;p4679,157396
+ USE_STACK_CONS 4689,157704
+ USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/h.h,2394
+ ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+typedef struct tpcmd8,147
+#define ggg 10,170
+ } arg;13,198
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+ fu int (*funcptr)funcptr17,242
+ long foo;18,279
+ char bar;19,293
+} foobar2;20,307
+ DEVICE_SWP,23,333
+ DEVICE_LAST24,349
+} bsp_DevId;25,365
+ struct constant_args 27,394
+ unsigned int burst;28,419
+ } constant;29,443
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+ int def;35,523
+} ghi1;36,534
+typedef union abc 37,542
+ int def;38,562
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage *an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+ kind;46,733
+ is_explicit;49,812
+ a_byte_boolean is_curly_brace_form;54,1009
+} an_extern_linkage;56,1054
+typedef struct pollfd pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+ int rtint;60,1149
+ char *rtstr;rtstr61,1164
+ struct rtx_def *rtx;rtx62,1181
+ } womboid 63,1206
+typedef union rtunion_def64,1220
+ int rtint;68,1250
+ char *rtstr;rtstr69,1263
+ struct rtx_def *rtxp;rtxp70,1278
+ struct rtx_def rtxnp;71,1302
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+ Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous 117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+struct re_pattern_buffer { unsigned char *buffer;buffer119,2277
+
+cp-src/c.C,3287
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+ ipc3dLinkControlSetup setup;CMultiChannelCSC19_3D::setup5,190
+ ipc3dCSC19<CMultiChannelCSC19_3D::ipc3dCSC196,227
+ ipc3dCSC19<ipc3dIslandHierarchy,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipc3dLinkControl> mcCSC;CMultiChannelCSC19_3D::mcCSC6,227
+ advTimer cscInitTime;CMultiChannelCSC19_3D::cscInitTime7,388
+ advTimer cscSegmentationTime;CMultiChannelCSC19_3D::cscSegmentationTime8,418
+ advTimer outputTime;CMultiChannelCSC19_3D::outputTime9,456
+ void execute(CMultiChannelCSC19_3D::execute11,493
+int main 25,1026
+double base 26,1088
+typedef struct s1 32,1251
+ int counter;s1::counter33,1271
+} t1;34,1287
+struct s2 35,1293
+ int counter;s2::counter36,1305
+typedef struct s2 t2;38,1324
+class A 39,1346
+ enum { rosso,A::rosso40,1356
+ enum { rosso, giallo,A::giallo40,1356
+ enum { rosso, giallo, verde A::verde40,1356
+ enum { rosso, giallo, verde } colori;A::colori40,1356
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+template <class C, int n> class AT { C t[AT::t52,1668
+class AU 53,1716
+class AU { T x;AU::x53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A 57,1826
+ A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+ void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct B 74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+ int x;foo::x80,2115
+class test 86,2156
+ int f(test::f87,2169
+ int ff(test::ff89,2231
+ int g(test::g90,2254
+class AST_Root 92,2278
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+ void f(::f115,2733
+struct A 117,2753
+A::~A(120,2777
+struct B 122,2789
+ ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;::teats127,2842
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+ enum {dog,Boo::dog130,2880
+ enum {dog, cat}Boo::cat130,2880
+ enum {dog, cat} animals;Boo::animals130,2880
+ struct {int treats;Boo::treats131,2909
+ struct {int treats;} cow;Boo::cow131,2909
+ int i,Boo::i132,2939
+ int i,a,Boo::a132,2939
+ int i,a,b;Boo::b132,2939
+ foo(Boo::foo133,2954
+ Boo(Boo::Boo137,2995
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,709
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2 78,2022
+ MDiagArray2 MDiagArray2::MDiagArray282,2077
+ MDiagArray2 MDiagArray2::MDiagArray286,2154
+ MDiagArray2 MDiagArray2::MDiagArray287,2198
+ MDiagArray2 MDiagArray2::MDiagArray288,2254
+ MDiagArray2 MDiagArray2::MDiagArray289,2329
+ MDiagArray2 MDiagArray2::MDiagArray290,2387
+ MDiagArray2 MDiagArray2::MDiagArray291,2450
+ ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+ MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+ operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Range.h,595
+#define octave_Range_h 24,765
+Range35,891
+ Range Range::Range39,909
+ Range Range::Range42,995
+ Range Range::Range46,1130
+ Range Range::Range50,1248
+ double base Range::base54,1376
+ double limit Range::limit55,1425
+ double inc Range::inc56,1475
+ int nelem Range::nelem57,1523
+ void set_base Range::set_base68,1728
+ void set_limit Range::set_limit69,1774
+ void set_inc Range::set_inc70,1821
+ double rng_base;Range::rng_base79,2023
+ double rng_limit;Range::rng_limit80,2042
+ double rng_inc;Range::rng_inc81,2062
+ int rng_nelem;Range::rng_nelem83,2081
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,667
+#define __COLORS9,401
+enum COLORS 11,419
+ BLACK,COLORS::BLACK12,433
+ BLUE,COLORS::BLUE13,471
+ GREEN,COLORS::GREEN14,481
+ CYAN,COLORS::CYAN15,492
+ RED,COLORS::RED16,502
+ MAGENTA,COLORS::MAGENTA17,511
+ BROWN,COLORS::BROWN18,524
+ LIGHTGRAY,COLORS::LIGHTGRAY19,535
+ DARKGRAY,COLORS::DARKGRAY20,550
+ LIGHTBLUE,COLORS::LIGHTBLUE21,589
+ LIGHTGREEN,COLORS::LIGHTGREEN22,604
+ LIGHTCYAN,COLORS::LIGHTCYAN23,620
+ LIGHTRED,COLORS::LIGHTRED24,635
+ LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+ YELLOW,COLORS::YELLOW26,667
+ WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,396
+class site:site5,235
+ char x,site::x7,269
+ char x, y,site::y7,269
+ char x, y, alive,site::alive7,269
+ char x, y, alive, next_alive;site::next_alive7,269
+ site(site::site10,344
+ char read(site::read12,410
+ void set(site::set13,444
+ void clear(site::clear14,478
+ void compute_next_state(site::compute_next_state15,514
+ void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,1057
+class generic_object13,520
+ int where_in_registry;generic_object::where_in_registry15,547
+ virtual void compute_next_state(generic_object::compute_next_state21,842
+ virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+ location(location::location43,1642
+class irregular_location:irregular_location47,1686
+ double x,irregular_location::x49,1734
+ double x, y,irregular_location::y49,1734
+ double x, y, z;irregular_location::z49,1734
+ irregular_location(irregular_location::irregular_location51,1762
+class discrete_location:discrete_location56,1889
+ int x,discrete_location::x58,1936
+ int x, y,discrete_location::y58,1936
+ int x, y, z;discrete_location::z58,1936
+ class location *neighbors[discrete_location::neighbors59,1953
+ discrete_location(discrete_location::discrete_location62,2044
+ void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+ location *where;agent::where77,2549
+
+cp-src/fail.C,417
+struct A 7,263
+ struct B A::B8,274
+ struct C A::B::C9,289
+ int x;A::B::C::x10,305
+ C(A::B::C::C11,318
+ operator int(A::B::C::operator int12,342
+ typedef C T;A::B::T14,389
+ typedef B T2;A::T216,414
+class A 23,453
+ class B A::B24,463
+ class C A::B::C25,474
+ int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+ class D 41,622
+ D(D::D43,659
+ int x;D::x44,694
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5069
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+f-src/entry.for,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+ ENTRY MSGSEL 193,4382
+ & intensity1(375,8135
+ character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+ 9 field >field136,582
+ 5 field >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1133
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+ @-$($72,3064
+ @-$($73,3113
+ @-$($74,3177
+ @-$($75,3223
+ @-$($76,3291
+ @-$($77,3383
+ @$(81,3466
+ @$(82,3514
+ @$(83,3577
+ @$(84,3622
+ @$(85,3689
+ @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+ @env CHECKEROPTS=92,3922
+ @$(98,4094
+ @$(106,4250
+ @$(110,4374
+ @$(114,4500
+ @for i in $(SRCS); do echo $$i;140,5315
+ $(160,6053
+ $(163,6114
+ $(166,6177
+ $(169,6228
+ $(172,6317
+ sdiff --suppress-common-lines --width=width186,6614
+ sdiff --suppress-common-lines --width=width189,6703
+ sdiff --suppress-common-lines --width=width192,6791
+ sdiff --suppress-common-lines --width=width195,6880
+ TEXTAGS=204,7122
+ TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* --regex=regex204,7122
+ ${RUN} etags12 --members -o $@ --regex=regex207,7239
+ ${RUN} ./ctags -o $@ --regex=regex213,7388
+ ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+ TEXTAGS=219,7583
+ TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ --regex=regex219,7583
+ ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
+@interface Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,475
+#define PTY_TEMPLATE 20,494
+#define PTY_LENGTH 21,528
+@interface Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+ andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS 36,1101
+#define TYPESTOSTAT 37,1120
+@interface PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION 34,1116
+# define DEBUG 37,1155
+#define LISTCONTENTS 39,1181
+#define OPENBUTTON 47,1352
+#define LISTCONTENTSBUTTON 48,1449
+#define LISTDESCRIPTIONBUTTON 49,1562
+#define STATE_UNINSTALLED 52,1687
+#define STATE_INSTALLED 53,1807
+#define STATE_COMPRESSD 54,1948
+#define SIZEFORMAT 57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING 368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
+@interface SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2864
+ define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+ define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+ define("LCE_WS"LCE_WS11,194
+ define("LCE_COMMENT"LCE_COMMENT13,244
+ define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+ define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+ define("LCE_MSGID"LCE_MSGID19,430
+ define("LCE_MSGSTR"LCE_MSGSTR21,488
+ define("LCE_TEXT"LCE_TEXT23,541
+ define("STATE_ABORT"STATE_ABORT25,567
+ define("STATE_OK"STATE_OK26,595
+ define("STATE_LOOP"STATE_LOOP27,620
+ class POEntryAD 29,648
+ function validate(31,683
+ function checkQuotation(59,1384
+ class CommentAD 70,1639
+ var $prefix;72,1674
+ function CommentAD(73,1693
+ function validate(83,1944
+ class POEntry 105,2410
+ var $msgid;107,2454
+ var $msgstr;108,2472
+ var $user_comment;109,2491
+ var $sys_comment;110,2516
+ var $unk_comment;111,2540
+ var $msgid_lc 113,2565
+ var $msgstr_lc 114,2590
+ var $user_comment_lc 115,2616
+ var $sys_comment_lc 116,2648
+ var $unk_comment_lc 117,2679
+ function POEntry(119,2711
+ function lineCount(135,3255
+ function serializeToVars(141,3365
+ function write(151,3800
+ class POReader 163,4178
+ var $msgid;165,4223
+ var $msgstr;166,4241
+ var $user_comment;167,4260
+ var $sys_comment;168,4285
+ var $unk_comment;169,4309
+ var $state;170,4333
+ var $ignore_ws;171,4351
+ var $po_entries;172,4373
+ var $poe_num;173,4396
+ var $filename;174,4416
+ var $domain;175,4437
+ function gettext(177,4457
+ function parseFromVars(189,4705
+ function serializeToVars(215,5331
+ function POReader(229,5613
+ function read(243,5983
+ function write(259,6307
+ function isComment(277,6645
+ function comment(284,6822
+ function msgid(304,7247
+ function msgstr(320,7574
+ function start(340,8232
+ function createPOEntries(360,8644
+ function stripLine(394,9472
+ function printClassification(421,10056
+ function classifyLine(432,10301
+ function getTextDomains(471,11094
+ class PORManager 498,11756
+ var $por_a;500,11803
+ function PORManager(502,11822
+ function addPOReader(507,11896
+ function &getPOReader(getPOReader512,11992
+ function getDomainNames(517,12081
+ function &loadPORManager(loadPORManager523,12174
+ function fileJoin(536,12436
+ function lce_bindtextdomain(557,12839
+ function lce_textdomain(614,14530
+ function lce_gettext(620,14641
+ function lce_dgettext(626,14767
+ function lce(634,14966
+ function lce_bindtextdomain(651,15488
+ function lce_textdomain(656,15592
+ function lce_gettext(661,15674
+ function lce_dgettext(666,15755
+ function lce(670,15855
+ function lce_geteditcode(676,15898
+
+php-src/ptest.php,135
+define("TEST"TEST1,0
+test 4,26
+ var $member;8,71
+ var $memassign=9,85
+ var $memassign_space 10,110
+ var $test12,176
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+ my $entry entry218,5621
+ my $entry entry234,6077
+ my $entry entry245,6351
+ my $entry entry252,6536
+ my $entry entry268,7010
+ my $entry entry276,7204
+ my $entry entry281,7328
+ my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+ my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+ local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+ local($prog,$_,@list)($prog,$_,@list39,868
+ local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+ def __init__(18,374
+ def __repr__(24,590
+ def __str__(34,871
+class Server:Server37,934
+ def __init__(38,948
+ def dump(73,2198
+ def __repr__(125,3896
+ def __str__(128,3945
+class User:User131,4014
+ def __init__(132,4026
+ def __repr__(172,5445
+ def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+ def bind(234,7525
+ def focus_set(236,7584
+ def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+ def __init__(269,8808
+ def handleList(303,10042
+ def handleNew(306,10094
+ def editItem(314,10426
+ def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+ def PostControls(376,12403
+ def GatherControls(421,13530
+class ServerEdit(512,16264
+ def __init__(513,16289
+ def post(525,16629
+ def gather(543,17191
+ def nosave(547,17304
+ def save(551,17408
+ def refreshPort(556,17509
+ def createWidgets(561,17663
+ def edituser(631,20708
+class UserEdit(645,20921
+ def __init__(646,20944
+ def post(658,21283
+ def gather(676,21841
+ def nosave(680,21950
+ def save(684,22052
+ def createWidgets(689,22151
+class Configure(760,24879
+ def __init__(761,24916
+ def MakeDispose(772,25211
+ def MakeSitelist(786,25706
+ def editsite(794,25949
+ def save(797,26022
+ def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
+@node Top,62,2139
+@node Copying,80,2652
+@node Overview,83,2705
+@node Sample,166,7272
+@node Invoking gzip,Invoking gzip210,8828
+@node Advanced usage,Advanced usage357,13495
+@node Environment,420,15207
+@node Tapes,437,15768
+@node Problems,460,16767
+@node Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
+\def\@{\@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+ \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+ \def\subtitlefont{\subtitlefont765,24968
+ \def\authorfont{\authorfont767,25052
+ \def\title{\title773,25262
+ \def\titlezzz##1{\titlezzz774,25297
+ \def\subtitle{\subtitle782,25612
+ \def\subtitlezzz##1{\subtitlezzz783,25653
+ \def\author{\author786,25771
+ \def\authorzzz##1{\authorzzz787,25808
+ \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+ \def\thearg{\thearg1145,37720
+ \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0 %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+ \def\indexbackslash{\indexbackslash1480,48406
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+ \null\nobreak\indexdotfill % Have leaders before the page number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+ \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno \appendixno = `\@no1626,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+ {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+ {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+ {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+ \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+ \def\secentry ##1##2##3##4{\secentry2066,68220
+ \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+ \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+ \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+ \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+ \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+ {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
+\def\@{\@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+ \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1963
+my_printf 135,
+void fatala 138,
+max 141,
+struct bar 143,
+ char z;144,
+ struct foo f;145,
+__attribute__ ((always_inline)) max 147,
+struct foo150,
+ char a;152,
+ int x[x153,
+char stack[stack155,
+struct S 156,
+struct S { short f[f156,
+ int *__ip;__ip159,
+ union wait *__up;__up160,
+} wait_status_ptr_t 161,
+Some_Class A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+ U16 next;174,
+ U16 prev;175,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+ int x;179,
+ char a,180,
+ char a, b,180,
+ char a, b, c,180,
+ char a, b, c, d;180,
+ f1 183,
+void f2 184,
+int x 188,
+struct foo 189,
+struct foo { int x[x189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,x-get-selection-internal206,
+ Fx_get_selection_internal,x-get-selection-internal212,
+ Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+ aaa;249,
+ bbb;251,
+struct sss1 252,
+struct sss2253,
+ struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+ **b;b262,
+caccacacca 263,
+a 267,
+ typedef struct aa 269,
+ typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+ typedef int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,738
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+VOIDSTAR parse_hash;63,1400
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+char *instr;instr80,1790
+int parse_error 81,1803
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define NE 6,114
+# define LE 7,130
+# define GE 8,146
+# define NEG 9,162
+# define L_CELL 10,179
+# define L_RANGE 11,199
+# define L_VAR 12,220
+# define L_CONST 13,239
+# define L_FN0 14,260
+# define L_FN1 15,279
+# define L_FN2 16,298
+# define L_FN3 17,317
+# define L_FN4 18,336
+# define L_FNN 19,355
+# define L_FN1R 20,374
+# define L_FN2R 21,394
+# define L_FN3R 22,414
+# define L_FN4R 23,434
+# define L_FNNR 24,454
+# define L_LE 25,474
+# define L_NE 26,492
+# define L_GE 27,510
+
+parse.y,1181
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+VOIDSTAR parse_hash;63,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+char *instr;instr80,
+int parse_error 81,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define YYFINAL 93,
+#define YYFLAG 94,
+#define YYNTBASE 95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define YYLAST 266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2168
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+ short yyss;85,
+ YYSTYPE yyvs;86,
+ YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyresult 947,
+
+y-src/atest.y,9
+exp 2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define INT 6,113
+# define CHAR 7,130
+# define NAME 8,148
+# define ERROR 9,166
+# define OR 10,185
+# define AND 11,201
+# define EQUAL 12,218
+# define NOTEQUAL 13,237
+# define LEQ 14,259
+# define GEQ 15,276
+# define LSH 16,293
+# define RSH 17,310
+# define UNARY 18,327
+
+cccp.y,2106
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+ struct arglist *next;next42,
+ U_CHAR *name;name43,
+ int length;44,
+ int argno;45,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+ struct constant 113,
+ struct constant {long value;113,
+ struct constant {long value; int unsignedp;113,
+ struct constant {long value; int unsignedp;} integer;113,
+ struct name 114,
+ struct name {U_CHAR *address;address114,
+ struct name {U_CHAR *address; int length;114,
+ struct name {U_CHAR *address; int length;} name;114,
+ struct arglist *keywords;keywords115,
+ int voidval;116,
+ char *sval;sval117,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define YYFINAL 127,
+#define YYFLAG 128,
+#define YYNTBASE 129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define YYLAST 274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+ char *operator;operator438,
+ int token;439,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2168
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+ short yyss;85,
+ YYSTYPE yyvs;86,
+ YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyresult 947,
+
+y-src/cccp.y,1696
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+ struct arglist *next;next42,1318
+ U_CHAR *name;name43,1342
+ int length;44,1358
+ int argno;45,1372
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+ struct constant 112,2733
+ struct constant {long value;112,2733
+ struct constant {long value; int unsignedp;112,2733
+ struct constant {long value; int unsignedp;} integer;112,2733
+ struct name 113,2789
+ struct name {U_CHAR *address;address113,2789
+ struct name {U_CHAR *address; int length;113,2789
+ struct name {U_CHAR *address; int length;} name;113,2789
+ struct arglist *keywords;keywords114,2840
+ int voidval;115,2868
+ char *sval;sval116,2883
+start 143,3226
+exp1 148,3330
+exp 156,3505
+exp 185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+ char *operator;operator438,11053
+ int token;439,11071
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+c-src/fail.c,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_4 b/test/etags/ETAGS.good_4
new file mode 100644
index 00000000000..5d31c366437
--- /dev/null
+++ b/test/etags/ETAGS.good_4
@@ -0,0 +1,4380 @@
+
+Makefile,683
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,584
+ERLSRC=11,654
+FORTHSRC=12,699
+FSRC=13,749
+HTMLSRC=14,821
+LUASRC=16,950
+MAKESRC=17,993
+OBJCSRC=18,1035
+OBJCPPSRC=19,1116
+PASSRC=20,1179
+PERLSRC=21,1221
+PHPSRC=22,1291
+PSSRC=23,1363
+PROLSRC=24,1403
+PYTSRC=25,1465
+TEXSRC=26,1506
+YSRC=27,1585
+SRCS=28,1650
+NONSRCS=32,1902
+ETAGS_PROG=34,1976
+CTAGS_PROG=35,2007
+REGEX=37,2039
+xx=38,2085
+RUN=40,2134
+OPTIONS=42,2140
+ARGS=43,2192
+infiles 45,2210
+check:check47,2272
+ediff%:ediff%55,2575
+cdiff:cdiff58,2676
+ETAGS:ETAGS61,2773
+CTAGS:CTAGS64,2843
+srclist:srclist67,2921
+regexfile:regexfile71,3012
+.PRECIOUS:.PRECIOUS77,3189
+FRC:FRC79,3223
+
+ada-src/etags-test-for.ada,1969
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+ function Body_RequiredBody_Required/f3,78
+ type Type_Specific_Data Type_Specific_Data/t11,280
+ function "abs"abs/f19,504
+ type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+ function "="=/f27,722
+ type usfreelock_ptr usfreelock_ptr/t30,803
+ function p p/f33,891
+ procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+ type Private_T Private_T/t46,1220
+ package Inner1 Inner1/s48,1250
+ procedure Private_T;Private_T/p49,1270
+ package Inner2 Inner2/s52,1310
+ task Private_T;Private_T/k53,1330
+ type Public_T Public_T/t56,1365
+ procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+ procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+ function Pkg1_Func1 Pkg1_Func1/f66,1514
+ function Pkg1_Func2 Pkg1_Func2/f68,1553
+ package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+ task type Task_Type Task_Type/k75,1694
+ type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+ procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+ package body Inner1 Inner1/b96,1956
+ procedure Private_T Private_T/p97,1981
+ package body Inner2 Inner2/b103,2054
+ task body Private_T Private_T/b104,2079
+ task body Task_Type Task_Type/b112,2181
+ procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+ function Pkg1_Func1 Pkg1_Func1/f132,2445
+ function Pkg1_Func2 Pkg1_Func2/f134,2496
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+ protected Bidule Bidule/t168,2953
+ protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+ protected body Bidule Bidule/b179,3115
+ protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+ package RTE RTE/s69,2712
+ package TSL TSL/s70,2759
+ function To_void_ptr To_void_ptr/f86,3287
+ function To_TCB_Ptr To_TCB_Ptr/f89,3366
+ function pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+ function pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+ procedure Abort_WrapperAbort_Wrapper/p115,4302
+ procedure LL_Wrapper LL_Wrapper/p122,4526
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+ function Self Self/f160,5586
+ procedure Initialize_LockInitialize_Lock/p174,5958
+ procedure Finalize_Lock Finalize_Lock/p210,6927
+ procedure Write_Lock Write_Lock/p226,7338
+ procedure Read_Lock Read_Lock/p239,7700
+ procedure Unlock Unlock/p246,7850
+ procedure Initialize_Cond Initialize_Cond/p258,8160
+ procedure Finalize_Cond Finalize_Cond/p286,8979
+ procedure Cond_Wait Cond_Wait/p300,9303
+ procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+ procedure Cond_Signal Cond_Signal/p343,10510
+ procedure Set_PrioritySet_Priority/p355,10836
+ procedure Set_Own_Priority Set_Own_Priority/p372,11243
+ function Get_Priority Get_Priority/f385,11598
+ function Get_Own_Priority Get_Own_Priority/f398,12023
+ procedure Create_LL_TaskCreate_LL_Task/p412,12438
+ function To_Start_Addr To_Start_Addr/f426,12873
+ procedure Exit_LL_Task Exit_LL_Task/p491,14995
+ procedure Abort_Task Abort_Task/p500,15158
+ procedure Test_Abort Test_Abort/p518,15716
+ procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+ procedure Abort_WrapperAbort_Wrapper/p557,16939
+ function Address_To_Call_State Address_To_Call_State/f562,17062
+ procedure Install_Error_Handler Install_Error_Handler/p573,17351
+ procedure LL_Assert LL_Assert/p599,18146
+ procedure LL_Wrapper LL_Wrapper/p608,18299
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+ procedure Clear Clear/p640,19236
+ procedure Test_And_Set Test_And_Set/p645,19330
+ function Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+ type Pre_Call_State Pre_Call_State/t64,3331
+ type Task_Storage_Size Task_Storage_Size/t66,3378
+ type Machine_Exceptions Machine_Exceptions/t68,3433
+ type Error_Information Error_Information/t70,3499
+ type Lock Lock/t72,3569
+ type Condition_Variable Condition_Variable/t73,3594
+ type Task_Control_Block Task_Control_Block/t81,3955
+ type TCB_Ptr TCB_Ptr/t89,4241
+ function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+ function Self Self/f100,4602
+ procedure Initialize_Lock Initialize_Lock/p103,4707
+ procedure Finalize_Lock Finalize_Lock/p107,4879
+ procedure Write_Lock Write_Lock/p111,5034
+ procedure Read_Lock Read_Lock/p118,5428
+ procedure Unlock Unlock/p128,5995
+ procedure Initialize_Cond Initialize_Cond/p135,6300
+ procedure Finalize_Cond Finalize_Cond/p138,6413
+ procedure Cond_Wait Cond_Wait/p142,6591
+ procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+ procedure Cond_Signal Cond_Signal/p164,7812
+ procedure Set_Priority Set_Priority/p169,8040
+ procedure Set_Own_Priority Set_Own_Priority/p173,8200
+ function Get_Priority Get_Priority/f177,8348
+ function Get_Own_Priority Get_Own_Priority/f181,8504
+ procedure Create_LL_TaskCreate_LL_Task/p185,8647
+ procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+ procedure Abort_Task Abort_Task/p203,9516
+ procedure Test_Abort;Test_Abort/p210,9878
+ type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+ procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+ procedure Install_Error_Handler Install_Error_Handler/p226,10741
+ procedure LL_Assert LL_Assert/p231,10983
+ type Proc Proc/t238,11240
+ type TAS_Cell TAS_Cell/t242,11328
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+ procedure Clear Clear/p260,12157
+ procedure Test_And_Set Test_And_Set/p267,12462
+ function Is_Set Is_Set/f275,12877
+ type Lock Lock/t283,13155
+ type Condition_Variable Condition_Variable/t288,13267
+ type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+ type Private_T Private_T/t5,106
+ package Inner1 Inner1/s7,136
+ procedure Private_T;Private_T/p8,156
+ package Inner2 Inner2/s11,196
+ task Private_T;Private_T/k12,216
+ type Public_T Public_T/t15,251
+ procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+ procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+ function Pkg1_Func1 Pkg1_Func1/f25,400
+ function Pkg1_Func2 Pkg1_Func2/f27,439
+ package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+ task type Task_Type Task_Type/k34,580
+ type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+ procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+ package body Inner1 Inner1/b53,840
+ procedure Private_T Private_T/p54,865
+ package body Inner2 Inner2/b60,938
+ task body Private_T Private_T/b61,963
+ task body Task_Type Task_Type/b68,1064
+ procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+ function Pkg1_Func1 Pkg1_Func1/f88,1328
+ function Pkg1_Func2 Pkg1_Func2/f90,1379
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+ protected Bidule Bidule/t125,1964
+ protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+ protected body Bidule Bidule/b139,2181
+ protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,2634
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+ DEFVAR_LISP ("abbrev-table-name-list"541,16079
+ DEFVAR_LISP ("global-abbrev-table"547,16341
+ DEFVAR_LISP ("fundamental-mode-abbrev-table"554,16663
+ DEFVAR_LISP ("last-abbrev"560,17005
+ DEFVAR_LISP ("last-abbrev-text"563,17128
+ DEFVAR_INT ("last-abbrev-location"567,17286
+ DEFVAR_LISP ("abbrev-start-location"574,17485
+ DEFVAR_LISP ("abbrev-start-location-buffer"580,17762
+ DEFVAR_PER_BUFFER ("local-abbrev-table"585,18026
+ DEFVAR_BOOL ("abbrevs-changed"588,18169
+ DEFVAR_BOOL ("abbrev-all-caps"593,18372
+ DEFVAR_LISP ("pre-abbrev-expand-hook"597,18528
+ DEFVAR_LISP ("abbrev-table-name-list",\1541,16079
+ DEFVAR_LISP ("global-abbrev-table",\1547,16341
+ DEFVAR_LISP ("fundamental-mode-abbrev-table",\1554,16663
+ DEFVAR_LISP ("last-abbrev",\1560,17005
+ DEFVAR_LISP ("last-abbrev-text",\1563,17128
+ DEFVAR_INT ("last-abbrev-location",\1567,17286
+ DEFVAR_LISP ("abbrev-start-location",\1574,17485
+ DEFVAR_LISP ("abbrev-start-location-buffer",\1580,17762
+ DEFVAR_PER_BUFFER ("local-abbrev-table",\1585,18026
+ DEFVAR_BOOL ("abbrevs-changed",\1588,18169
+ DEFVAR_BOOL ("abbrev-all-caps",\1593,18372
+ DEFVAR_LISP ("pre-abbrev-expand-hook",\1597,18528
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,147
+#define _GETOPT_H 19,801
+struct option73,2797
+#define no_argument 89,3124
+#define required_argument 90,3147
+#define optional_argument 91,3175
+
+c-src/etags.c,10045
+char pot_etags_version[pot_etags_version81,3470
+# undef DEBUG84,3552
+# define DEBUG 85,3567
+# define DEBUG 87,3594
+# define NDEBUG 88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef DOS_NT117,4160
+# define DOS_NT118,4176
+# undef assert 135,4482
+# define assert(136,4541
+# undef CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define iswhite(159,5329
+#define notinname(160,5394
+#define begtoken(161,5469
+#define intoken(162,5542
+#define endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+} compressor;188,6365
+} language;199,6835
+typedef struct fdesc201,6848
+} fdesc;212,7366
+typedef struct node_st214,7376
+} node;225,7894
+} linebuffer;239,8248
+ at_language,245,8344
+ at_regexp,246,8393
+ at_filename,247,8437
+ at_stdin,248,8473
+ at_end 249,8516
+} argument;253,8698
+typedef struct regexp256,8758
+} regexp;268,9325
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT 2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC 2199,69242
+enum sym_type2204,69312
+ st_none,2206,69328
+ st_C_objprot,2207,69339
+ st_C_objprot, st_C_objimpl,2207,69339
+ st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+ st_C_gnumacro,2208,69382
+ st_C_ignore,2209,69399
+ st_C_ignore, st_C_attribute,2209,69399
+ st_C_javastruct,2210,69430
+ st_C_operator,2211,69449
+ st_C_class,2212,69466
+ st_C_class, st_C_template,2212,69466
+ st_C_struct,2213,69495
+ st_C_struct, st_C_extern,2213,69495
+ st_C_struct, st_C_extern, st_C_enum,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+ TOTAL_KEYWORDS 2325,73018
+ MIN_WORD_LENGTH 2326,73045
+ MAX_WORD_LENGTH 2327,73072
+ MIN_HASH_VALUE 2328,73100
+ MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+ fvnone,2408,75435
+ fdefunkey,2409,75466
+ fdefunname,2410,75512
+ foperator,2411,75556
+ fvnameseen,2412,75613
+ fstartlist,2413,75666
+ finlist,2414,75722
+ flistseen,2415,75765
+ fignore,2416,75813
+ vignore 2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+ tnone,2428,76089
+ tkeyseen,2429,76119
+ ttypeseen,2430,76160
+ tinbody,2431,76199
+ tend,2432,76238
+ tignore 2433,76279
+} typdef;2434,76320
+ snone,2443,76499
+ skeyseen,2445,76575
+ stagseen,2446,76620
+ scolonseen 2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+ dnone,2460,76942
+ dsharpseen,2461,76972
+ ddefineseen,2462,77025
+ dignorerest 2463,77070
+} definedef;2464,77112
+ onone,2472,77267
+ oprotocol,2473,77297
+ oimplementation,2474,77347
+ otagseen,2475,77395
+ oparenseen,2476,77431
+ ocatseen,2477,77486
+ oinbody,2478,77525
+ omethodsign,2479,77568
+ omethodtag,2480,77626
+ omethodcolon,2481,77666
+ omethodparm,2482,77709
+ oignore 2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+} token;2508,78626
+} cstack;2523,79136
+#define nestlev 2525,79264
+#define instruct 2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+consider_token 2613,81341
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,47
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,47
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define ENTRY(21,865
+#define PSEUDO(26,972
+ movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+ movl $SYS_##syscall_name, %eax;eax31,1132
+ int $0x80;32,1180
+ test %eax,eax33,1210
+ test %eax, %eax;eax33,1210
+ jl syscall_error;34,1245
+#define XCHG_0 47,1562
+#define XCHG_1 48,1606
+#define XCHG_2 49,1648
+#define XCHG_3 50,1691
+#define XCHG_4 51,1734
+#define XCHG_5 52,1777
+#define r0 54,1821
+#define r1 55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int count_words(15,263
+static char *get_word(get_word35,553
+void tab_free(59,966
+char **tab_fill(tab_fill70,1129
+int tab_delete_first(91,1638
+int tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,3539
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT 124,3934
+#define BLOCKLOG 125,3977
+#define BLOCKSIZE 126,4018
+#define BLOCKIFY(127,4052
+#define HEAP 131,4215
+#define FINAL_FREE_BLOCKS 135,4391
+ } malloc_info;167,5388
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+struct list186,5939
+struct alignlist196,6153
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+enum mcheck_status283,9092
+ MCHECK_DISABLED 285,9115
+ MCHECK_OK,286,9187
+ MCHECK_FREE,287,9226
+ MCHECK_HEAD,288,9270
+ MCHECK_TAIL 289,9334
+struct mstats308,10153
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define __sbrk 1513,46042
+__default_morecore 1525,46511
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+hybrid_get_current_dir_name 1811,53797
+#define MAGICWORD 1854,55206
+#define MAGICFREE 1855,55261
+#define MAGICBYTE 1856,55316
+#define MALLOCFLOOD 1857,55348
+#define FREEFLOOD 1858,55382
+struct hdr1860,55415
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,3761
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+#define RE_SYNTAX_EMACS 183,7684
+#define RE_SYNTAX_AWK 186,7780
+#define RE_SYNTAX_GNU_AWK 193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP 206,8549
+#define RE_SYNTAX_POSIX_EGREP 212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON 221,9072
+#define RE_SYNTAX_POSIX_BASIC 225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC 231,9508
+#define RE_SYNTAX_POSIX_EXTENDED 234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED 242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+ REG_ENOSYS 297,11859
+ REG_NOERROR 300,11941
+ REG_NOMATCH,301,11976
+ REG_BADPAT,305,12123
+ REG_ECOLLATE,306,12162
+ REG_ECTYPE,307,12203
+ REG_EESCAPE,308,12255
+ REG_ESUBREG,309,12298
+ REG_EBRACK,310,12345
+ REG_EPAREN,311,12391
+ REG_EBRACE,312,12436
+ REG_BADBR,313,12472
+ REG_ERANGE,314,12519
+ REG_ESPACE,315,12560
+ REG_BADRPT,316,12601
+ REG_EEND,319,12693
+ REG_ESIZE,320,12728
+ REG_ERPAREN,321,12790
+ REG_ERANGEX 322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+# define RE_NREGS 440,16942
+} regmatch_t;451,17317
+# define _Restrict_ 540,20886
+# define _Restrict_ 542,20979
+# define _Restrict_544,21018
+# define _Restrict_arr_ 555,21418
+# define _Restrict_arr_557,21461
+# define CHAR_CLASS_MAX_LENGTH 593,22470
+# define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+ RECC_ALNUM,610,22984
+ RECC_ALNUM, RECC_ALPHA,610,22984
+ RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+ RECC_GRAPH,611,23027
+ RECC_GRAPH, RECC_PRINT,611,23027
+ RECC_LOWER,612,23059
+ RECC_LOWER, RECC_UPPER,612,23059
+ RECC_PUNCT,613,23091
+ RECC_PUNCT, RECC_CNTRL,613,23091
+ RECC_DIGIT,614,23123
+ RECC_DIGIT, RECC_XDIGIT,614,23123
+ RECC_BLANK,615,23156
+ RECC_BLANK, RECC_SPACE,615,23156
+ RECC_MULTIBYTE,616,23188
+ RECC_MULTIBYTE, RECC_NONASCII,616,23188
+ RECC_ASCII,617,23227
+ RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+typedef int re_wchar_t;623,23387
+
+c-src/emacs/src/keyboard.c,20957
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF 119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard *ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+unsigned timers_run;320,11296
+struct timespec *input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW 346,12046
+#define READABLE_EVENTS_FILTER_EVENTS 347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES 348,12142
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", Fcommand_error_default_function,command-error-default-function1043,32030
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING 2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+ DEFVAR_LISP ("internal--top-level-message"11058,333972
+ DEFVAR_LISP ("last-command-event"11312,342173
+ DEFVAR_LISP ("last-nonmenu-event"11315,342297
+ DEFVAR_LISP ("last-input-event"11321,342636
+ DEFVAR_LISP ("unread-command-events"11324,342730
+ DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+ DEFVAR_LISP ("unread-input-method-events"11338,343529
+ DEFVAR_LISP ("meta-prefix-char"11346,343898
+ DEFVAR_KBOARD ("last-command"11351,344106
+ DEFVAR_KBOARD ("real-last-command"11368,344787
+ DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+ DEFVAR_LISP ("this-command"11378,345261
+ DEFVAR_LISP ("real-this-command"11384,345498
+ DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+ DEFVAR_LISP ("this-original-command"11396,346123
+ DEFVAR_INT ("auto-save-interval"11403,346520
+ DEFVAR_LISP ("auto-save-timeout"11408,346734
+ DEFVAR_LISP ("echo-keystrokes"11415,347079
+ DEFVAR_INT ("polling-period"11421,347350
+ DEFVAR_LISP ("double-click-time"11428,347693
+ DEFVAR_INT ("double-click-fuzz"11435,348029
+ DEFVAR_INT ("num-input-keys"11446,348519
+ DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+ DEFVAR_LISP ("last-event-frame"11457,349032
+ DEFVAR_LISP ("tty-erase-char"11463,349311
+ DEFVAR_LISP ("help-char"11466,349434
+ DEFVAR_LISP ("help-event-list"11472,349717
+ DEFVAR_LISP ("help-form"11477,349928
+ DEFVAR_LISP ("prefix-help-command"11483,350176
+ DEFVAR_LISP ("top-level"11489,350454
+ DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+ DEFVAR_BOOL ("cannot-suspend"11511,351488
+ DEFVAR_BOOL ("menu-prompting"11516,351715
+ DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+ DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+ DEFVAR_LISP ("deactivate-mark"11545,353117
+ DEFVAR_LISP ("pre-command-hook"11553,353486
+ DEFVAR_LISP ("post-command-hook"11560,353841
+ DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+ DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+ DEFVAR_LISP ("menu-bar-final-items"11578,354622
+ DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+ DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+ DEFVAR_LISP ("overriding-local-map"11598,355652
+ DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+ DEFVAR_LISP ("special-event-map"11613,356442
+ DEFVAR_LISP ("track-mouse"11617,356630
+ DEFVAR_KBOARD ("system-key-alist"11620,356757
+ DEFVAR_KBOARD ("local-function-key-map"11629,357138
+ DEFVAR_KBOARD ("input-decode-map"11658,358597
+ DEFVAR_LISP ("function-key-map"11675,359385
+ DEFVAR_LISP ("key-translation-map"11683,359801
+ DEFVAR_LISP ("deferred-action-list"11689,360145
+ DEFVAR_LISP ("deferred-action-function"11694,360393
+ DEFVAR_LISP ("delayed-warnings-list"11700,360692
+ DEFVAR_LISP ("timer-list"11708,361100
+ DEFVAR_LISP ("timer-idle-list"11712,361252
+ DEFVAR_LISP ("input-method-function"11716,361415
+ DEFVAR_LISP ("input-method-previous-message"11737,362384
+ DEFVAR_LISP ("show-help-function"11744,362745
+ DEFVAR_LISP ("disable-point-adjustment"11749,362977
+ DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+ DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+ DEFVAR_LISP ("throw-on-input"11775,364171
+ DEFVAR_LISP ("command-error-function"11781,364422
+ DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+ DEFVAR_LISP ("select-active-regions"11798,365236
+ DEFVAR_LISP ("saved-region-selection"11807,365628
+ DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+ DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+ DEFVAR_LISP ("internal--top-level-message",\111058,333972
+ DEFVAR_LISP ("last-command-event",\111312,342173
+ DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+ DEFVAR_LISP ("last-input-event",\111321,342636
+ DEFVAR_LISP ("unread-command-events",\111324,342730
+ DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+ DEFVAR_LISP ("unread-input-method-events",\111338,343529
+ DEFVAR_LISP ("meta-prefix-char",\111346,343898
+ DEFVAR_KBOARD ("last-command",\111351,344106
+ DEFVAR_KBOARD ("real-last-command",\111368,344787
+ DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+ DEFVAR_LISP ("this-command",\111378,345261
+ DEFVAR_LISP ("real-this-command",\111384,345498
+ DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+ DEFVAR_LISP ("this-original-command",\111396,346123
+ DEFVAR_INT ("auto-save-interval",\111403,346520
+ DEFVAR_LISP ("auto-save-timeout",\111408,346734
+ DEFVAR_LISP ("echo-keystrokes",\111415,347079
+ DEFVAR_INT ("polling-period",\111421,347350
+ DEFVAR_LISP ("double-click-time",\111428,347693
+ DEFVAR_INT ("double-click-fuzz",\111435,348029
+ DEFVAR_INT ("num-input-keys",\111446,348519
+ DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+ DEFVAR_LISP ("last-event-frame",\111457,349032
+ DEFVAR_LISP ("tty-erase-char",\111463,349311
+ DEFVAR_LISP ("help-char",\111466,349434
+ DEFVAR_LISP ("help-event-list",\111472,349717
+ DEFVAR_LISP ("help-form",\111477,349928
+ DEFVAR_LISP ("prefix-help-command",\111483,350176
+ DEFVAR_LISP ("top-level",\111489,350454
+ DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+ DEFVAR_BOOL ("cannot-suspend",\111511,351488
+ DEFVAR_BOOL ("menu-prompting",\111516,351715
+ DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+ DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+ DEFVAR_LISP ("deactivate-mark",\111545,353117
+ DEFVAR_LISP ("pre-command-hook",\111553,353486
+ DEFVAR_LISP ("post-command-hook",\111560,353841
+ DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+ DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+ DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+ DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+ DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+ DEFVAR_LISP ("overriding-local-map",\111598,355652
+ DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+ DEFVAR_LISP ("special-event-map",\111613,356442
+ DEFVAR_LISP ("track-mouse",\111617,356630
+ DEFVAR_KBOARD ("system-key-alist",\111620,356757
+ DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+ DEFVAR_KBOARD ("input-decode-map",\111658,358597
+ DEFVAR_LISP ("function-key-map",\111675,359385
+ DEFVAR_LISP ("key-translation-map",\111683,359801
+ DEFVAR_LISP ("deferred-action-list",\111689,360145
+ DEFVAR_LISP ("deferred-action-function",\111694,360393
+ DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+ DEFVAR_LISP ("timer-list",\111708,361100
+ DEFVAR_LISP ("timer-idle-list",\111712,361252
+ DEFVAR_LISP ("input-method-function",\111716,361415
+ DEFVAR_LISP ("input-method-previous-message",\111737,362384
+ DEFVAR_LISP ("show-help-function",\111744,362745
+ DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+ DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+ DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+ DEFVAR_LISP ("throw-on-input",\111775,364171
+ DEFVAR_LISP ("command-error-function",\111781,364422
+ DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+ DEFVAR_LISP ("select-active-regions",\111798,365236
+ DEFVAR_LISP ("saved-region-selection",\111807,365628
+ DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+ DEFVAR_LISP ("debug-on-event",\111825,366554
+
+c-src/emacs/src/lisp.h,20567
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+# define EMACS_INT_MAX 93,3079
+# define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+# define EMACS_INT_MAX 98,3265
+# define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+# define EMACS_INT_MAX 105,3553
+# define pI 106,3587
+enum { BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+ BITS_PER_CHAR 136,4570
+ BITS_PER_SHORT 137,4605
+ BITS_PER_LONG 138,4657
+ BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+ VALBITS 246,8742
+ INTTYPEBITS 249,8838
+ FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+# define check_cons_list(405,15097
+# define make_number(408,15176
+# define XFASTINT(409,15224
+# define XINT(410,15266
+# define XSYMBOL(411,15300
+# define XTYPE(412,15340
+# define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+ Lisp_Symbol 454,16851
+ Lisp_Misc 458,16993
+ Lisp_Int0 461,17067
+ Lisp_Int1 462,17086
+ Lisp_String 466,17264
+ Lisp_Vectorlike 472,17543
+ Lisp_Cons 475,17632
+ Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+ Lisp_Misc_Free 487,18040
+ Lisp_Misc_Marker,488,18069
+ Lisp_Misc_Overlay,489,18091
+ Lisp_Misc_Save_Value,490,18114
+ Lisp_Misc_Finalizer,491,18140
+ Lisp_Misc_Float,494,18275
+ Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+ Lisp_Fwd_Int,504,18566
+ Lisp_Fwd_Bool,505,18619
+ Lisp_Fwd_Obj,506,18670
+ Lisp_Fwd_Buffer_Obj,507,18729
+ Lisp_Fwd_Kboard_Obj 508,18800
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+enum symbol_interned639,24199
+ SYMBOL_UNINTERNED 641,24222
+ SYMBOL_INTERNED 642,24247
+ SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+ SYMBOL_PLAINVAL 648,24338
+ SYMBOL_VARALIAS 649,24362
+ SYMBOL_LOCALIZED 650,24386
+ SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+ ENUM_BF 663,24793
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY 712,26446
+#define DEFUN_ARGS_UNEVALLED 713,26498
+#define DEFUN_ARGS_0 714,26541
+#define DEFUN_ARGS_1 715,26569
+#define DEFUN_ARGS_2 716,26604
+#define DEFUN_ARGS_3 717,26652
+#define DEFUN_ARGS_4 718,26713
+#define DEFUN_ARGS_5 719,26787
+#define DEFUN_ARGS_6 721,26880
+#define DEFUN_ARGS_7 723,26986
+#define DEFUN_ARGS_8 725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+ PVEC_NORMAL_VECTOR,782,29585
+ PVEC_FREE,783,29607
+ PVEC_PROCESS,784,29620
+ PVEC_FRAME,785,29636
+ PVEC_WINDOW,786,29650
+ PVEC_BOOL_VECTOR,787,29665
+ PVEC_BUFFER,788,29685
+ PVEC_HASH_TABLE,789,29700
+ PVEC_TERMINAL,790,29719
+ PVEC_WINDOW_CONFIGURATION,791,29736
+ PVEC_SUBR,792,29765
+ PVEC_OTHER,793,29778
+ PVEC_COMPILED,795,29856
+ PVEC_CHAR_TABLE,796,29873
+ PVEC_SUB_CHAR_TABLE,797,29892
+ PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+ PSEUDOVECTOR_SIZE_BITS 808,30382
+ PSEUDOVECTOR_SIZE_MASK 809,30415
+ PSEUDOVECTOR_REST_BITS 813,30625
+ PSEUDOVECTOR_REST_MASK 814,30658
+ PSEUDOVECTOR_AREA_BITS 818,30823
+ PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+struct Lisp_Vector1369,46482
+ ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+ header_size 1471,49047
+ bool_header_size 1472,49106
+ word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+ CHARTAB_SIZE_BITS_0 1567,52516
+ CHARTAB_SIZE_BITS_1 1568,52545
+ CHARTAB_SIZE_BITS_2 1569,52574
+ CHARTAB_SIZE_BITS_3 1570,52603
+struct Lisp_Char_Table1575,52672
+struct Lisp_Sub_Char_Table1606,53752
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+enum char_table_specials1692,56798
+ CHAR_TABLE_STANDARD_SLOTS 1697,56993
+ SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+struct Lisp_Hash_Table1823,60555
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any 1971,64806
+ ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+ ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+ ENUM_BF 2034,67346
+ SAVE_UNUSED,2047,67641
+ SAVE_INTEGER,2048,67658
+ SAVE_FUNCPOINTER,2049,67676
+ SAVE_POINTER,2050,67698
+ SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+ SAVE_TYPE_INT_INT 2066,68096
+ SAVE_TYPE_INT_INT_INT2067,68169
+ SAVE_TYPE_OBJ_OBJ 2069,68259
+ SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+ SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+ SAVE_TYPE_PTR_INT 2073,68506
+ SAVE_TYPE_PTR_OBJ 2074,68579
+ SAVE_TYPE_PTR_PTR 2075,68651
+ SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+ SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+ ENUM_BF 2112,69900
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+struct Lisp_Free2201,72581
+ ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+struct Lisp_Boolfwd2284,74411
+struct Lisp_Objfwd2294,74702
+struct Lisp_Buffer_Objfwd2302,74934
+struct Lisp_Buffer_Local_Value2334,76470
+struct Lisp_Kboard_Objfwd2362,77729
+union Lisp_Fwd2368,77838
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+XFLOAT_DATA 2401,78434
+ IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+ COMPILED_ARGLIST 2431,79389
+ COMPILED_BYTECODE 2432,79415
+ COMPILED_CONSTANTS 2433,79442
+ COMPILED_STACK_DEPTH 2434,79470
+ COMPILED_DOC_STRING 2435,79500
+ COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+ CHAR_ALT 2445,79850
+ CHAR_SUPER 2446,79876
+ CHAR_HYPER 2447,79904
+ CHAR_SHIFT 2448,79932
+ CHAR_CTL 2449,79960
+ CHAR_META 2450,79986
+ CHAR_MODIFIER_MASK 2452,80014
+ CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+enum maxargs2831,89401
+ MANY 2833,89418
+ UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+ SPECPDL_UNWIND,2944,93822
+ SPECPDL_UNWIND_PTR,2945,93891
+ SPECPDL_UNWIND_INT,2946,93942
+ SPECPDL_UNWIND_VOID,2947,93990
+ SPECPDL_BACKTRACE,2948,94044
+ SPECPDL_LET,2949,94102
+ SPECPDL_LET_LOCAL,2951,94232
+ SPECPDL_LET_DEFAULT 2952,94289
+union specbinding2955,94361
+ ENUM_BF 2957,94383
+ ENUM_BF 2959,94440
+ ENUM_BF 2964,94570
+ ENUM_BF 2969,94693
+ ENUM_BF 2974,94811
+ ENUM_BF 2978,94916
+ ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+#define PUSH_HANDLER(3053,97443
+#define QUIT 3101,99220
+#define QUITP 3112,99470
+struct gcpro3132,100313
+#define GC_USE_GCPROS_AS_BEFORE 3171,101294
+#define GC_MAKE_GCPROS_NOOPS 3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS 3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES 3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO 3353,109913
+#define RETURN_UNGCPRO(3363,110180
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+enum Arith_Comparison 3497,113300
+ ARITH_EQUAL,3498,113324
+ ARITH_NOTEQUAL,3499,113339
+ ARITH_LESS,3500,113357
+ ARITH_GRTR,3501,113371
+ ARITH_LESS_OR_EQUAL,3502,113385
+ ARITH_GRTR_OR_EQUAL3503,113408
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_formatted_string 3767,124631
+build_pure_c_string 3792,125659
+build_string 3801,125864
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+intern 3968,132131
+intern_c_string 3974,132219
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern _Noreturn void emacs_abort 4374,148383
+egetenv 4532,152806
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA 4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+union Aligned_String4676,157349
+ USE_STACK_CONS 4689,157704
+ USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/h.h,1850
+ ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+typedef struct tpcmd8,147
+#define ggg 10,170
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+} foobar2;20,307
+ DEVICE_SWP,23,333
+ DEVICE_LAST24,349
+} bsp_DevId;25,365
+ struct constant_args 27,394
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+} ghi1;36,534
+typedef union abc 37,542
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage *an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+} an_extern_linkage;56,1054
+typedef struct pollfd pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+ } womboid 63,1206
+typedef union rtunion_def64,1220
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+ Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous 117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+
+cp-src/c.C,2225
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+ void execute(CMultiChannelCSC19_3D::execute11,493
+int main 25,1026
+double base 26,1088
+typedef struct s1 32,1251
+} t1;34,1287
+struct s2 35,1293
+typedef struct s2 t2;38,1324
+class A 39,1346
+ enum { rosso,A::rosso40,1356
+ enum { rosso, giallo,A::giallo40,1356
+ enum { rosso, giallo, verde A::verde40,1356
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+class AU 53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A 57,1826
+ A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+ void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct B 74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+class test 86,2156
+ int f(test::f87,2169
+ int ff(test::ff89,2231
+ int g(test::g90,2254
+class AST_Root 92,2278
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+ void f(::f115,2733
+struct A 117,2753
+A::~A(120,2777
+struct B 122,2789
+ ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+ enum {dog,Boo::dog130,2880
+ enum {dog, cat}Boo::cat130,2880
+ foo(Boo::foo133,2954
+ Boo(Boo::Boo137,2995
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,709
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2 78,2022
+ MDiagArray2 MDiagArray2::MDiagArray282,2077
+ MDiagArray2 MDiagArray2::MDiagArray286,2154
+ MDiagArray2 MDiagArray2::MDiagArray287,2198
+ MDiagArray2 MDiagArray2::MDiagArray288,2254
+ MDiagArray2 MDiagArray2::MDiagArray289,2329
+ MDiagArray2 MDiagArray2::MDiagArray290,2387
+ MDiagArray2 MDiagArray2::MDiagArray291,2450
+ ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+ MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+ operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Range.h,424
+#define octave_Range_h 24,765
+Range35,891
+ Range Range::Range39,909
+ Range Range::Range42,995
+ Range Range::Range46,1130
+ Range Range::Range50,1248
+ double base Range::base54,1376
+ double limit Range::limit55,1425
+ double inc Range::inc56,1475
+ int nelem Range::nelem57,1523
+ void set_base Range::set_base68,1728
+ void set_limit Range::set_limit69,1774
+ void set_inc Range::set_inc70,1821
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,667
+#define __COLORS9,401
+enum COLORS 11,419
+ BLACK,COLORS::BLACK12,433
+ BLUE,COLORS::BLUE13,471
+ GREEN,COLORS::GREEN14,481
+ CYAN,COLORS::CYAN15,492
+ RED,COLORS::RED16,502
+ MAGENTA,COLORS::MAGENTA17,511
+ BROWN,COLORS::BROWN18,524
+ LIGHTGRAY,COLORS::LIGHTGRAY19,535
+ DARKGRAY,COLORS::DARKGRAY20,550
+ LIGHTBLUE,COLORS::LIGHTBLUE21,589
+ LIGHTGREEN,COLORS::LIGHTGREEN22,604
+ LIGHTCYAN,COLORS::LIGHTCYAN23,620
+ LIGHTRED,COLORS::LIGHTRED24,635
+ LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+ YELLOW,COLORS::YELLOW26,667
+ WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,244
+class site:site5,235
+ site(site::site10,344
+ char read(site::read12,410
+ void set(site::set13,444
+ void clear(site::clear14,478
+ void compute_next_state(site::compute_next_state15,514
+ void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,609
+class generic_object13,520
+ virtual void compute_next_state(generic_object::compute_next_state21,842
+ virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+ location(location::location43,1642
+class irregular_location:irregular_location47,1686
+ irregular_location(irregular_location::irregular_location51,1762
+class discrete_location:discrete_location56,1889
+ discrete_location(discrete_location::discrete_location62,2044
+ void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+
+cp-src/fail.C,365
+struct A 7,263
+ struct B A::B8,274
+ struct C A::B::C9,289
+ C(A::B::C::C11,318
+ operator int(A::B::C::operator int12,342
+ typedef C T;A::B::T14,389
+ typedef B T2;A::T216,414
+class A 23,453
+ class B A::B24,463
+ class C A::B::C25,474
+ int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+ class D 41,622
+ D(D::D43,659
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5069
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+f-src/entry.for,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+ ENTRY MSGSEL 193,4382
+ & intensity1(375,8135
+ character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+ 9 field >field136,582
+ 5 field >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1133
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+ @-$($72,3064
+ @-$($73,3113
+ @-$($74,3177
+ @-$($75,3223
+ @-$($76,3291
+ @-$($77,3383
+ @$(81,3466
+ @$(82,3514
+ @$(83,3577
+ @$(84,3622
+ @$(85,3689
+ @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+ @env CHECKEROPTS=92,3922
+ @$(98,4094
+ @$(106,4250
+ @$(110,4374
+ @$(114,4500
+ @for i in $(SRCS); do echo $$i;140,5315
+ $(160,6053
+ $(163,6114
+ $(166,6177
+ $(169,6228
+ $(172,6317
+ sdiff --suppress-common-lines --width=width186,6614
+ sdiff --suppress-common-lines --width=width189,6703
+ sdiff --suppress-common-lines --width=width192,6791
+ sdiff --suppress-common-lines --width=width195,6880
+ TEXTAGS=204,7122
+ TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* --regex=regex204,7122
+ ${RUN} etags12 --members -o $@ --regex=regex207,7239
+ ${RUN} ./ctags -o $@ --regex=regex213,7388
+ ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+ TEXTAGS=219,7583
+ TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ --regex=regex219,7583
+ ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
+@interface Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,475
+#define PTY_TEMPLATE 20,494
+#define PTY_LENGTH 21,528
+@interface Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+ andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS 36,1101
+#define TYPESTOSTAT 37,1120
+@interface PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION 34,1116
+# define DEBUG 37,1155
+#define LISTCONTENTS 39,1181
+#define OPENBUTTON 47,1352
+#define LISTCONTENTSBUTTON 48,1449
+#define LISTDESCRIPTIONBUTTON 49,1562
+#define STATE_UNINSTALLED 52,1687
+#define STATE_INSTALLED 53,1807
+#define STATE_COMPRESSD 54,1948
+#define SIZEFORMAT 57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING 368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
+@interface SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2152
+ define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+ define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+ define("LCE_WS"LCE_WS11,194
+ define("LCE_COMMENT"LCE_COMMENT13,244
+ define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+ define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+ define("LCE_MSGID"LCE_MSGID19,430
+ define("LCE_MSGSTR"LCE_MSGSTR21,488
+ define("LCE_TEXT"LCE_TEXT23,541
+ define("STATE_ABORT"STATE_ABORT25,567
+ define("STATE_OK"STATE_OK26,595
+ define("STATE_LOOP"STATE_LOOP27,620
+ class POEntryAD 29,648
+ function validate(31,683
+ function checkQuotation(59,1384
+ class CommentAD 70,1639
+ function CommentAD(73,1693
+ function validate(83,1944
+ class POEntry 105,2410
+ function POEntry(119,2711
+ function lineCount(135,3255
+ function serializeToVars(141,3365
+ function write(151,3800
+ class POReader 163,4178
+ function gettext(177,4457
+ function parseFromVars(189,4705
+ function serializeToVars(215,5331
+ function POReader(229,5613
+ function read(243,5983
+ function write(259,6307
+ function isComment(277,6645
+ function comment(284,6822
+ function msgid(304,7247
+ function msgstr(320,7574
+ function start(340,8232
+ function createPOEntries(360,8644
+ function stripLine(394,9472
+ function printClassification(421,10056
+ function classifyLine(432,10301
+ function getTextDomains(471,11094
+ class PORManager 498,11756
+ function PORManager(502,11822
+ function addPOReader(507,11896
+ function &getPOReader(getPOReader512,11992
+ function getDomainNames(517,12081
+ function &loadPORManager(loadPORManager523,12174
+ function fileJoin(536,12436
+ function lce_bindtextdomain(557,12839
+ function lce_textdomain(614,14530
+ function lce_gettext(620,14641
+ function lce_dgettext(626,14767
+ function lce(634,14966
+ function lce_bindtextdomain(651,15488
+ function lce_textdomain(656,15592
+ function lce_gettext(661,15674
+ function lce_dgettext(666,15755
+ function lce(670,15855
+ function lce_geteditcode(676,15898
+
+php-src/ptest.php,46
+define("TEST"TEST1,0
+test 4,26
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+ my $entry entry218,5621
+ my $entry entry234,6077
+ my $entry entry245,6351
+ my $entry entry252,6536
+ my $entry entry268,7010
+ my $entry entry276,7204
+ my $entry entry281,7328
+ my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+ my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+ local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+ local($prog,$_,@list)($prog,$_,@list39,868
+ local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+ def __init__(18,374
+ def __repr__(24,590
+ def __str__(34,871
+class Server:Server37,934
+ def __init__(38,948
+ def dump(73,2198
+ def __repr__(125,3896
+ def __str__(128,3945
+class User:User131,4014
+ def __init__(132,4026
+ def __repr__(172,5445
+ def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+ def bind(234,7525
+ def focus_set(236,7584
+ def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+ def __init__(269,8808
+ def handleList(303,10042
+ def handleNew(306,10094
+ def editItem(314,10426
+ def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+ def PostControls(376,12403
+ def GatherControls(421,13530
+class ServerEdit(512,16264
+ def __init__(513,16289
+ def post(525,16629
+ def gather(543,17191
+ def nosave(547,17304
+ def save(551,17408
+ def refreshPort(556,17509
+ def createWidgets(561,17663
+ def edituser(631,20708
+class UserEdit(645,20921
+ def __init__(646,20944
+ def post(658,21283
+ def gather(676,21841
+ def nosave(680,21950
+ def save(684,22052
+ def createWidgets(689,22151
+class Configure(760,24879
+ def __init__(761,24916
+ def MakeDispose(772,25211
+ def MakeSitelist(786,25706
+ def editsite(794,25949
+ def save(797,26022
+ def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
+@node Top,62,2139
+@node Copying,80,2652
+@node Overview,83,2705
+@node Sample,166,7272
+@node Invoking gzip,Invoking gzip210,8828
+@node Advanced usage,Advanced usage357,13495
+@node Environment,420,15207
+@node Tapes,437,15768
+@node Problems,460,16767
+@node Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
+\def\@{\@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+ \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+ \def\subtitlefont{\subtitlefont765,24968
+ \def\authorfont{\authorfont767,25052
+ \def\title{\title773,25262
+ \def\titlezzz##1{\titlezzz774,25297
+ \def\subtitle{\subtitle782,25612
+ \def\subtitlezzz##1{\subtitlezzz783,25653
+ \def\author{\author786,25771
+ \def\authorzzz##1{\authorzzz787,25808
+ \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+ \def\thearg{\thearg1145,37720
+ \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0 %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+ \def\indexbackslash{\indexbackslash1480,48406
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+ \null\nobreak\indexdotfill % Have leaders before the page number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+ \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno \appendixno = `\@no1626,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+ {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+ {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+ {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+ \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+ \def\secentry ##1##2##3##4{\secentry2066,68220
+ \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+ \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+ \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+ \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+ \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+ {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
+\def\@{\@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+ \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1663
+my_printf 135,
+void fatala 138,
+max 141,
+struct bar 143,
+__attribute__ ((always_inline)) max 147,
+struct foo150,
+char stack[stack155,
+struct S 156,
+} wait_status_ptr_t 161,
+Some_Class A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+ f1 183,
+void f2 184,
+int x 188,
+struct foo 189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,x-get-selection-internal206,
+ Fx_get_selection_internal,x-get-selection-internal212,
+ Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+ aaa;249,
+ bbb;251,
+struct sss1 252,
+struct sss2253,
+ struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+ **b;b262,
+caccacacca 263,
+a 267,
+ typedef struct aa 269,
+ typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+ typedef int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,738
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+VOIDSTAR parse_hash;63,1400
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+char *instr;instr80,1790
+int parse_error 81,1803
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define NE 6,114
+# define LE 7,130
+# define GE 8,146
+# define NEG 9,162
+# define L_CELL 10,179
+# define L_RANGE 11,199
+# define L_VAR 12,220
+# define L_CONST 13,239
+# define L_FN0 14,260
+# define L_FN1 15,279
+# define L_FN2 16,298
+# define L_FN3 17,317
+# define L_FN4 18,336
+# define L_FNN 19,355
+# define L_FN1R 20,374
+# define L_FN2R 21,394
+# define L_FN3R 22,414
+# define L_FN4R 23,434
+# define L_FNNR 24,454
+# define L_LE 25,474
+# define L_NE 26,492
+# define L_GE 27,510
+
+parse.y,1181
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+VOIDSTAR parse_hash;63,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+char *instr;instr80,
+int parse_error 81,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define YYFINAL 93,
+#define YYFLAG 94,
+#define YYNTBASE 95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define YYLAST 266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyresult 947,
+
+y-src/atest.y,9
+exp 2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define INT 6,113
+# define CHAR 7,130
+# define NAME 8,148
+# define ERROR 9,166
+# define OR 10,185
+# define AND 11,201
+# define EQUAL 12,218
+# define NOTEQUAL 13,237
+# define LEQ 14,259
+# define GEQ 15,276
+# define LSH 16,293
+# define RSH 17,310
+# define UNARY 18,327
+
+cccp.y,1579
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+ struct constant 113,
+ struct name 114,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define YYFINAL 127,
+#define YYFLAG 128,
+#define YYNTBASE 129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define YYLAST 274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyresult 947,
+
+y-src/cccp.y,1107
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+ struct constant 112,2733
+ struct name 113,2789
+start 143,3226
+exp1 148,3330
+exp 156,3505
+exp 185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+c-src/fail.c,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_5 b/test/etags/ETAGS.good_5
new file mode 100644
index 00000000000..c7357d083f5
--- /dev/null
+++ b/test/etags/ETAGS.good_5
@@ -0,0 +1,5401 @@
+
+Makefile,683
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,584
+ERLSRC=11,654
+FORTHSRC=12,699
+FSRC=13,749
+HTMLSRC=14,821
+LUASRC=16,950
+MAKESRC=17,993
+OBJCSRC=18,1035
+OBJCPPSRC=19,1116
+PASSRC=20,1179
+PERLSRC=21,1221
+PHPSRC=22,1291
+PSSRC=23,1363
+PROLSRC=24,1403
+PYTSRC=25,1465
+TEXSRC=26,1506
+YSRC=27,1585
+SRCS=28,1650
+NONSRCS=32,1902
+ETAGS_PROG=34,1976
+CTAGS_PROG=35,2007
+REGEX=37,2039
+xx=38,2085
+RUN=40,2134
+OPTIONS=42,2140
+ARGS=43,2192
+infiles 45,2210
+check:check47,2272
+ediff%:ediff%55,2575
+cdiff:cdiff58,2676
+ETAGS:ETAGS61,2773
+CTAGS:CTAGS64,2843
+srclist:srclist67,2921
+regexfile:regexfile71,3012
+.PRECIOUS:.PRECIOUS77,3189
+FRC:FRC79,3223
+
+ada-src/etags-test-for.ada,1969
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+ function Body_RequiredBody_Required/f3,78
+ type Type_Specific_Data Type_Specific_Data/t11,280
+ function "abs"abs/f19,504
+ type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+ function "="=/f27,722
+ type usfreelock_ptr usfreelock_ptr/t30,803
+ function p p/f33,891
+ procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+ type Private_T Private_T/t46,1220
+ package Inner1 Inner1/s48,1250
+ procedure Private_T;Private_T/p49,1270
+ package Inner2 Inner2/s52,1310
+ task Private_T;Private_T/k53,1330
+ type Public_T Public_T/t56,1365
+ procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+ procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+ function Pkg1_Func1 Pkg1_Func1/f66,1514
+ function Pkg1_Func2 Pkg1_Func2/f68,1553
+ package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+ task type Task_Type Task_Type/k75,1694
+ type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+ procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+ package body Inner1 Inner1/b96,1956
+ procedure Private_T Private_T/p97,1981
+ package body Inner2 Inner2/b103,2054
+ task body Private_T Private_T/b104,2079
+ task body Task_Type Task_Type/b112,2181
+ procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+ function Pkg1_Func1 Pkg1_Func1/f132,2445
+ function Pkg1_Func2 Pkg1_Func2/f134,2496
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+ protected Bidule Bidule/t168,2953
+ protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+ protected body Bidule Bidule/b179,3115
+ protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+ package RTE RTE/s69,2712
+ package TSL TSL/s70,2759
+ function To_void_ptr To_void_ptr/f86,3287
+ function To_TCB_Ptr To_TCB_Ptr/f89,3366
+ function pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+ function pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+ procedure Abort_WrapperAbort_Wrapper/p115,4302
+ procedure LL_Wrapper LL_Wrapper/p122,4526
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+ function Self Self/f160,5586
+ procedure Initialize_LockInitialize_Lock/p174,5958
+ procedure Finalize_Lock Finalize_Lock/p210,6927
+ procedure Write_Lock Write_Lock/p226,7338
+ procedure Read_Lock Read_Lock/p239,7700
+ procedure Unlock Unlock/p246,7850
+ procedure Initialize_Cond Initialize_Cond/p258,8160
+ procedure Finalize_Cond Finalize_Cond/p286,8979
+ procedure Cond_Wait Cond_Wait/p300,9303
+ procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+ procedure Cond_Signal Cond_Signal/p343,10510
+ procedure Set_PrioritySet_Priority/p355,10836
+ procedure Set_Own_Priority Set_Own_Priority/p372,11243
+ function Get_Priority Get_Priority/f385,11598
+ function Get_Own_Priority Get_Own_Priority/f398,12023
+ procedure Create_LL_TaskCreate_LL_Task/p412,12438
+ function To_Start_Addr To_Start_Addr/f426,12873
+ procedure Exit_LL_Task Exit_LL_Task/p491,14995
+ procedure Abort_Task Abort_Task/p500,15158
+ procedure Test_Abort Test_Abort/p518,15716
+ procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+ procedure Abort_WrapperAbort_Wrapper/p557,16939
+ function Address_To_Call_State Address_To_Call_State/f562,17062
+ procedure Install_Error_Handler Install_Error_Handler/p573,17351
+ procedure LL_Assert LL_Assert/p599,18146
+ procedure LL_Wrapper LL_Wrapper/p608,18299
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+ procedure Clear Clear/p640,19236
+ procedure Test_And_Set Test_And_Set/p645,19330
+ function Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+ type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+ type Pre_Call_State Pre_Call_State/t64,3331
+ type Task_Storage_Size Task_Storage_Size/t66,3378
+ type Machine_Exceptions Machine_Exceptions/t68,3433
+ type Error_Information Error_Information/t70,3499
+ type Lock Lock/t72,3569
+ type Condition_Variable Condition_Variable/t73,3594
+ type Task_Control_Block Task_Control_Block/t81,3955
+ type TCB_Ptr TCB_Ptr/t89,4241
+ function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+ procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+ function Self Self/f100,4602
+ procedure Initialize_Lock Initialize_Lock/p103,4707
+ procedure Finalize_Lock Finalize_Lock/p107,4879
+ procedure Write_Lock Write_Lock/p111,5034
+ procedure Read_Lock Read_Lock/p118,5428
+ procedure Unlock Unlock/p128,5995
+ procedure Initialize_Cond Initialize_Cond/p135,6300
+ procedure Finalize_Cond Finalize_Cond/p138,6413
+ procedure Cond_Wait Cond_Wait/p142,6591
+ procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+ procedure Cond_Signal Cond_Signal/p164,7812
+ procedure Set_Priority Set_Priority/p169,8040
+ procedure Set_Own_Priority Set_Own_Priority/p173,8200
+ function Get_Priority Get_Priority/f177,8348
+ function Get_Own_Priority Get_Own_Priority/f181,8504
+ procedure Create_LL_TaskCreate_LL_Task/p185,8647
+ procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+ procedure Abort_Task Abort_Task/p203,9516
+ procedure Test_Abort;Test_Abort/p210,9878
+ type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+ procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+ procedure Install_Error_Handler Install_Error_Handler/p226,10741
+ procedure LL_Assert LL_Assert/p231,10983
+ type Proc Proc/t238,11240
+ type TAS_Cell TAS_Cell/t242,11328
+ procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+ procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+ procedure Clear Clear/p260,12157
+ procedure Test_And_Set Test_And_Set/p267,12462
+ function Is_Set Is_Set/f275,12877
+ type Lock Lock/t283,13155
+ type Condition_Variable Condition_Variable/t288,13267
+ type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+ type Private_T Private_T/t5,106
+ package Inner1 Inner1/s7,136
+ procedure Private_T;Private_T/p8,156
+ package Inner2 Inner2/s11,196
+ task Private_T;Private_T/k12,216
+ type Public_T Public_T/t15,251
+ procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+ procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+ function Pkg1_Func1 Pkg1_Func1/f25,400
+ function Pkg1_Func2 Pkg1_Func2/f27,439
+ package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+ procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+ task type Task_Type Task_Type/k34,580
+ type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+ procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+ package body Inner1 Inner1/b53,840
+ procedure Private_T Private_T/p54,865
+ package body Inner2 Inner2/b60,938
+ task body Private_T Private_T/b61,963
+ task body Task_Type Task_Type/b68,1064
+ procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+ function Pkg1_Func1 Pkg1_Func1/f88,1328
+ function Pkg1_Func2 Pkg1_Func2/f90,1379
+ package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+ procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+ protected Bidule Bidule/t125,1964
+ protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+ protected body Bidule Bidule/b139,2181
+ protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,2634
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+ DEFVAR_LISP ("abbrev-table-name-list"541,16079
+ DEFVAR_LISP ("global-abbrev-table"547,16341
+ DEFVAR_LISP ("fundamental-mode-abbrev-table"554,16663
+ DEFVAR_LISP ("last-abbrev"560,17005
+ DEFVAR_LISP ("last-abbrev-text"563,17128
+ DEFVAR_INT ("last-abbrev-location"567,17286
+ DEFVAR_LISP ("abbrev-start-location"574,17485
+ DEFVAR_LISP ("abbrev-start-location-buffer"580,17762
+ DEFVAR_PER_BUFFER ("local-abbrev-table"585,18026
+ DEFVAR_BOOL ("abbrevs-changed"588,18169
+ DEFVAR_BOOL ("abbrev-all-caps"593,18372
+ DEFVAR_LISP ("pre-abbrev-expand-hook"597,18528
+ DEFVAR_LISP ("abbrev-table-name-list",\1541,16079
+ DEFVAR_LISP ("global-abbrev-table",\1547,16341
+ DEFVAR_LISP ("fundamental-mode-abbrev-table",\1554,16663
+ DEFVAR_LISP ("last-abbrev",\1560,17005
+ DEFVAR_LISP ("last-abbrev-text",\1563,17128
+ DEFVAR_INT ("last-abbrev-location",\1567,17286
+ DEFVAR_LISP ("abbrev-start-location",\1574,17485
+ DEFVAR_LISP ("abbrev-start-location-buffer",\1580,17762
+ DEFVAR_PER_BUFFER ("local-abbrev-table",\1585,18026
+ DEFVAR_BOOL ("abbrevs-changed",\1588,18169
+ DEFVAR_BOOL ("abbrev-all-caps",\1593,18372
+ DEFVAR_LISP ("pre-abbrev-expand-hook",\1597,18528
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,666
+#define _GETOPT_H 19,801
+extern char *optarg;optarg31,1109
+extern int optind;45,1617
+extern int opterr;50,1743
+struct option73,2797
+ const char *name;name76,2826
+ char *name;name78,2852
+ int has_arg;82,3009
+ int *flag;flag83,3024
+ int val;84,3037
+#define no_argument 89,3124
+#define required_argument 90,3147
+#define optional_argument 91,3175
+extern int getopt 98,3440
+extern int getopt 100,3544
+extern int getopt_long 102,3599
+extern int getopt_long_only 104,3731
+extern int _getopt_internal 109,3942
+extern int getopt 114,4140
+extern int getopt_long 115,4162
+extern int getopt_long_only 116,4189
+extern int _getopt_internal 118,4222
+
+c-src/etags.c,14175
+char pot_etags_version[pot_etags_version81,3470
+# undef DEBUG84,3552
+# define DEBUG 85,3567
+# define DEBUG 87,3594
+# define NDEBUG 88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef DOS_NT117,4160
+# define DOS_NT118,4176
+# undef assert 135,4482
+# define assert(136,4541
+# undef CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define iswhite(159,5329
+#define notinname(160,5394
+#define begtoken(161,5469
+#define intoken(162,5542
+#define endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+ const char *suffix;suffix186,6219
+ const char *command;command187,6294
+} compressor;188,6365
+ const char *name;name192,6397
+ const char *help;help193,6449
+ Lang_function *function;function194,6508
+ const char **suffixes;suffixes195,6556
+ const char **filenames;filenames196,6633
+ const char **interpreters;interpreters197,6702
+ bool metasource;198,6771
+} language;199,6835
+typedef struct fdesc201,6848
+ struct fdesc *next;next203,6871
+ char *infname;infname204,6920
+ char *infabsname;infabsname205,6973
+ char *infabsdir;infabsdir206,7038
+ char *taggedfname;taggedfname207,7091
+ language *lang;lang208,7149
+ char *prop;prop209,7191
+ bool usecharno;210,7249
+ bool written;211,7311
+} fdesc;212,7366
+typedef struct node_st214,7376
+ struct node_st *left,left216,7428
+ struct node_st *left, *right;right216,7428
+ fdesc *fdp;fdp217,7486
+ char *name;name218,7548
+ char *regex;regex219,7580
+ bool valid;220,7617
+ bool is_func;221,7670
+ bool been_warned;222,7733
+ int lno;223,7801
+ long cno;224,7842
+} node;225,7894
+ long size;236,8208
+ int len;237,8221
+ char *buffer;buffer238,8232
+} linebuffer;239,8248
+ at_language,245,8344
+ at_regexp,246,8393
+ at_filename,247,8437
+ at_stdin,248,8473
+ at_end 249,8516
+ } arg_type;250,8557
+ language *lang;lang251,8593
+ char *what;what252,8656
+} argument;253,8698
+typedef struct regexp256,8758
+ struct regexp *p_next;p_next258,8782
+ language *lang;lang259,8837
+ char *pattern;pattern260,8897
+ char *name;name261,8940
+ struct re_pattern_buffer *pat;pat262,8971
+ struct re_registers regs;263,9031
+ bool error_signaled;264,9078
+ bool force_explicit_name;265,9141
+ bool ignore_case;266,9206
+ bool multi_line;267,9259
+} regexp;268,9325
+static void Ada_funcs 274,9428
+static void Asm_labels 275,9460
+static void C_entries 276,9493
+static void default_C_entries 277,9536
+static void plain_C_entries 278,9576
+static void Cjava_entries 279,9614
+static void Cobol_paragraphs 280,9650
+static void Cplusplus_entries 281,9689
+static void Cstar_entries 282,9729
+static void Erlang_functions 283,9765
+static void Forth_words 284,9804
+static void Fortran_functions 285,9838
+static void HTML_labels 286,9878
+static void Lisp_functions 287,9912
+static void Lua_functions 288,9949
+static void Makefile_targets 289,9985
+static void Pascal_functions 290,10024
+static void Perl_functions 291,10063
+static void PHP_functions 292,10100
+static void PS_functions 293,10136
+static void Prolog_functions 294,10171
+static void Python_functions 295,10210
+static void Scheme_functions 296,10249
+static void TeX_commands 297,10288
+static void Texinfo_nodes 298,10323
+static void Yacc_entries 299,10359
+static void just_read_file 300,10394
+static language *get_language_from_langname get_language_from_langname302,10432
+static void readline 303,10492
+static long readline_internal 304,10537
+static bool nocase_tail 305,10591
+static void get_tag 306,10631
+static void analyze_regex 308,10671
+static void free_regexps 309,10707
+static void regex_tag_multiline 310,10740
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int total_size_of_entries 2067,66150
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT 2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC 2199,69242
+enum sym_type2204,69312
+ st_none,2206,69328
+ st_C_objprot,2207,69339
+ st_C_objprot, st_C_objimpl,2207,69339
+ st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+ st_C_gnumacro,2208,69382
+ st_C_ignore,2209,69399
+ st_C_ignore, st_C_attribute,2209,69399
+ st_C_javastruct,2210,69430
+ st_C_operator,2211,69449
+ st_C_class,2212,69466
+ st_C_class, st_C_template,2212,69466
+ st_C_struct,2213,69495
+ st_C_struct, st_C_extern,2213,69495
+ st_C_struct, st_C_extern, st_C_enum,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+struct C_stab_entry { const char *name;name2271,71278
+struct C_stab_entry { const char *name; int c_ext;2271,71278
+struct C_stab_entry { const char *name; int c_ext; enum sym_type type;2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+ TOTAL_KEYWORDS 2325,73018
+ MIN_WORD_LENGTH 2326,73045
+ MAX_WORD_LENGTH 2327,73072
+ MIN_HASH_VALUE 2328,73100
+ MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+ fvnone,2408,75435
+ fdefunkey,2409,75466
+ fdefunname,2410,75512
+ foperator,2411,75556
+ fvnameseen,2412,75613
+ fstartlist,2413,75666
+ finlist,2414,75722
+ flistseen,2415,75765
+ fignore,2416,75813
+ vignore 2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+ tnone,2428,76089
+ tkeyseen,2429,76119
+ ttypeseen,2430,76160
+ tinbody,2431,76199
+ tend,2432,76238
+ tignore 2433,76279
+} typdef;2434,76320
+ snone,2443,76499
+ skeyseen,2445,76575
+ stagseen,2446,76620
+ scolonseen 2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+ dnone,2460,76942
+ dsharpseen,2461,76972
+ ddefineseen,2462,77025
+ dignorerest 2463,77070
+} definedef;2464,77112
+ onone,2472,77267
+ oprotocol,2473,77297
+ oimplementation,2474,77347
+ otagseen,2475,77395
+ oparenseen,2476,77431
+ ocatseen,2477,77486
+ oinbody,2478,77525
+ omethodsign,2479,77568
+ omethodtag,2480,77626
+ omethodcolon,2481,77666
+ omethodparm,2482,77709
+ oignore 2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+ char *line;line2493,77964
+ int offset;2494,78014
+ int length;2495,78067
+ bool valid;2502,78352
+ bool named;2505,78487
+ int lineno;2506,78528
+ long linepos;2507,78576
+} token;2508,78626
+static void pushclass_above 2514,78784
+static void popclass_above 2515,78832
+static void write_classname 2516,78866
+ char **cname;cname2519,78950
+ int *bracelev;bracelev2520,78993
+ int nl;2521,79042
+ int size;2522,79096
+} cstack;2523,79136
+#define nestlev 2525,79264
+#define instruct 2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+static bool consider_token 2592,80761
+static void make_C_tag 2593,80833
+consider_token 2613,81341
+ long linepos;2922,88499
+ linebuffer lb;2923,88515
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+static void F_takeprec 3910,111965
+static void F_getit 3911,111996
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+static void L_getit 4706,130277
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static void TEX_mode 4917,135172
+static void TEX_decode_env 4918,135203
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+static size_t prolog_pr 5214,142192
+static void prolog_skip_comment 5215,142234
+static size_t prolog_atom 5216,142290
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+static int erlang_func 5374,145540
+static void erlang_attribute 5375,145581
+static int erlang_atom 5376,145620
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+static char *scan_separators scan_separators5520,148487
+static void add_regex 5521,148526
+static char *substitute substitute5522,148570
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,99
+ size_t n;28,961
+ void EXFUN((*fn[fn29,975
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,99
+ size_t n;28,961
+ void EXFUN((*fn[fn29,975
+ } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define ENTRY(21,865
+#define PSEUDO(26,972
+ movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+ movl $SYS_##syscall_name, %eax;eax31,1132
+ int $0x80;32,1180
+ test %eax,eax33,1210
+ test %eax, %eax;eax33,1210
+ jl syscall_error;34,1245
+#define XCHG_0 47,1562
+#define XCHG_1 48,1606
+#define XCHG_2 49,1648
+#define XCHG_3 50,1691
+#define XCHG_4 51,1734
+#define XCHG_5 52,1777
+#define r0 54,1821
+#define r1 55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int count_words(15,263
+static char *get_word(get_word35,553
+void tab_free(59,966
+char **tab_fill(tab_fill70,1129
+int tab_delete_first(91,1638
+int tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,7311
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+extern void emacs_abort 47,1305
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+extern void *bss_sbrk bss_sbrk76,2335
+extern int bss_sbrk_did_unexec;77,2375
+extern char bss_sbrk_buffer[bss_sbrk_buffer78,2407
+extern void *bss_sbrk_buffer_end;bss_sbrk_buffer_end79,2438
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT 124,3934
+#define BLOCKLOG 125,3977
+#define BLOCKSIZE 126,4018
+#define BLOCKIFY(127,4052
+#define HEAP 131,4215
+#define FINAL_FREE_BLOCKS 135,4391
+ int type;145,4676
+ size_t nfree;150,4720
+ size_t first;151,4777
+ } frag;152,4834
+ ptrdiff_t size;156,5055
+ } info;157,5076
+ } busy;158,5087
+ size_t size;163,5215
+ size_t next;164,5272
+ size_t prev;165,5321
+ } free;166,5374
+ } malloc_info;167,5388
+extern char *_heapbase;_heapbase170,5449
+extern malloc_info *_heapinfo;_heapinfo173,5541
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+extern size_t _heapindex;180,5797
+extern size_t _heaplimit;183,5866
+struct list186,5939
+ struct list *next;next188,5955
+ struct list *prev;prev189,5978
+extern struct list _fraghead[_fraghead193,6056
+struct alignlist196,6153
+ struct alignlist *next;next198,6174
+ void *aligned;aligned199,6202
+ void *exact;exact200,6270
+extern struct alignlist *_aligned_blocks;_aligned_blocks202,6334
+extern size_t _chunks_used;205,6401
+extern size_t _bytes_used;206,6429
+extern size_t _chunks_free;207,6456
+extern size_t _bytes_free;208,6484
+extern void *_malloc_internal _malloc_internal213,6673
+extern void *_realloc_internal _realloc_internal214,6713
+extern void _free_internal 215,6762
+extern void *_malloc_internal_nolock _malloc_internal_nolock216,6799
+extern void *_realloc_internal_nolock _realloc_internal_nolock217,6846
+extern void _free_internal_nolock 218,6902
+extern pthread_mutex_t _malloc_mutex,221,6966
+extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;221,6966
+extern int _malloc_thread_enabled_p;222,7027
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+extern void *malloc_find_object_address malloc_find_object_address252,7865
+extern void *(*__morecore)__morecore256,8021
+extern void *__default_morecore __default_morecore259,8105
+extern void (*__after_morecore_hook)__after_morecore_hook263,8269
+extern size_t __malloc_extra_blocks;267,8442
+extern int __malloc_initialized;270,8552
+extern int __malloc_initialize 272,8646
+extern void (*__malloc_initialize_hook)__malloc_initialize_hook275,8723
+extern void (*__free_hook)__free_hook276,8771
+extern void *(*__malloc_hook)__malloc_hook277,8811
+extern void *(*__realloc_hook)__realloc_hook278,8856
+extern void *(*__memalign_hook)__memalign_hook279,8913
+enum mcheck_status283,9092
+ MCHECK_DISABLED 285,9115
+ MCHECK_OK,286,9187
+ MCHECK_FREE,287,9226
+ MCHECK_HEAD,288,9270
+ MCHECK_TAIL 289,9334
+extern int mcheck 296,9701
+extern enum mcheck_status mprobe 301,9952
+extern void mtrace 304,10055
+extern void muntrace 305,10082
+struct mstats308,10153
+ size_t bytes_total;310,10171
+ size_t chunks_used;311,10225
+ size_t bytes_used;312,10285
+ size_t chunks_free;313,10351
+ size_t bytes_free;314,10406
+extern struct mstats mstats 318,10518
+extern void memory_warnings 321,10625
+void *(*__malloc_hook)__malloc_hook352,11743
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+void (*__malloc_initialize_hook)__malloc_initialize_hook383,12398
+void (*__after_morecore_hook)__after_morecore_hook384,12439
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+extern void *_malloc _malloc956,29033
+extern void _free 957,29064
+extern void *_realloc _realloc958,29092
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+void (*__free_hook)__free_hook1001,30259
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+void *(*__realloc_hook)__realloc_hook1310,39898
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define __sbrk 1513,46042
+extern void *__sbrk __sbrk1518,46247
+__default_morecore 1525,46511
+void *(*__memalign_hook)__memalign_hook1554,47456
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+extern void *valloc valloc1695,51140
+extern int getpagesize 1700,51278
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+extern void *malloc malloc1722,51609
+extern void *realloc realloc1723,51644
+extern void *calloc calloc1724,51691
+extern void free 1725,51740
+extern void *aligned_alloc aligned_alloc1727,51796
+extern int posix_memalign 1729,51890
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+char *gget_current_dir_name gget_current_dir_name1808,53753
+hybrid_get_current_dir_name 1811,53797
+static void (*old_free_hook)old_free_hook1846,54921
+static void *(*old_malloc_hook)old_malloc_hook1847,54963
+static void *(*old_realloc_hook)old_realloc_hook1848,55010
+static void (*abortfunc)abortfunc1851,55124
+#define MAGICWORD 1854,55206
+#define MAGICFREE 1855,55261
+#define MAGICBYTE 1856,55316
+#define MALLOCFLOOD 1857,55348
+#define FREEFLOOD 1858,55382
+struct hdr1860,55415
+ size_t size;1862,55430
+ size_t magic;1863,55484
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,5300
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+extern reg_syntax_t re_syntax_options;167,7170
+extern Lisp_Object re_match_object;172,7344
+extern size_t re_max_failures;176,7454
+#define RE_SYNTAX_EMACS 183,7684
+#define RE_SYNTAX_AWK 186,7780
+#define RE_SYNTAX_GNU_AWK 193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP 206,8549
+#define RE_SYNTAX_POSIX_EGREP 212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON 221,9072
+#define RE_SYNTAX_POSIX_BASIC 225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC 231,9508
+#define RE_SYNTAX_POSIX_EXTENDED 234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED 242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+ REG_ENOSYS 297,11859
+ REG_NOERROR 300,11941
+ REG_NOMATCH,301,11976
+ REG_BADPAT,305,12123
+ REG_ECOLLATE,306,12162
+ REG_ECTYPE,307,12203
+ REG_EESCAPE,308,12255
+ REG_ESUBREG,309,12298
+ REG_EBRACK,310,12345
+ REG_EPAREN,311,12391
+ REG_EBRACE,312,12436
+ REG_BADBR,313,12472
+ REG_ERANGE,314,12519
+ REG_ESPACE,315,12560
+ REG_BADRPT,316,12601
+ REG_EEND,319,12693
+ REG_ESIZE,320,12728
+ REG_ERPAREN,321,12790
+ REG_ERANGEX 322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+ unsigned char *buffer;buffer341,13538
+ size_t allocated;344,13614
+ size_t used;347,13686
+ reg_syntax_t syntax;350,13769
+ char *fastmap;fastmap355,13975
+ RE_TRANSLATE_TYPE translate;361,14241
+ size_t re_nsub;364,14329
+ unsigned can_be_null 370,14624
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+ unsigned regs_allocated 379,14963
+ unsigned fastmap_accurate 383,15136
+ unsigned no_sub 387,15267
+ unsigned not_bol 391,15398
+ unsigned not_eol 394,15475
+ unsigned used_syntax 398,15655
+ unsigned multibyte 403,15805
+ unsigned target_multibyte 407,15941
+ int charset_unibyte;410,16032
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+ unsigned num_regs;430,16674
+ regoff_t *start;start431,16695
+ regoff_t *end;end432,16714
+# define RE_NREGS 440,16942
+ regoff_t rm_so;449,17159
+ regoff_t rm_eo;450,17239
+} regmatch_t;451,17317
+extern reg_syntax_t re_set_syntax 457,17512
+extern const char *re_compile_pattern re_compile_pattern462,17776
+extern int re_compile_fastmap 469,18058
+extern regoff_t re_search 477,18466
+extern regoff_t re_search_2 485,18781
+extern regoff_t re_match 495,19177
+extern regoff_t re_match_2 501,19407
+extern void re_set_registers 520,20197
+extern char *re_comp re_comp528,20469
+extern int re_exec 529,20506
+# define _Restrict_ 540,20886
+# define _Restrict_ 542,20979
+# define _Restrict_544,21018
+# define _Restrict_arr_ 555,21418
+# define _Restrict_arr_557,21461
+extern reg_errcode_t regcomp 562,21530
+extern reg_errcode_t regexec 566,21656
+extern size_t regerror 571,21850
+extern void regfree 574,21956
+# define CHAR_CLASS_MAX_LENGTH 593,22470
+# define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+ RECC_ALNUM,610,22984
+ RECC_ALNUM, RECC_ALPHA,610,22984
+ RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+ RECC_GRAPH,611,23027
+ RECC_GRAPH, RECC_PRINT,611,23027
+ RECC_LOWER,612,23059
+ RECC_LOWER, RECC_UPPER,612,23059
+ RECC_PUNCT,613,23091
+ RECC_PUNCT, RECC_CNTRL,613,23091
+ RECC_DIGIT,614,23123
+ RECC_DIGIT, RECC_XDIGIT,614,23123
+ RECC_BLANK,615,23156
+ RECC_BLANK, RECC_SPACE,615,23156
+ RECC_MULTIBYTE,616,23188
+ RECC_MULTIBYTE, RECC_NONASCII,616,23188
+ RECC_ASCII,617,23227
+ RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+extern char re_iswctype 620,23276
+extern re_wctype_t re_wctype 621,23329
+typedef int re_wchar_t;623,23387
+extern void re_set_whitespace_regexp 625,23412
+
+c-src/emacs/src/keyboard.c,23269
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF 119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard *ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+static void recursive_edit_unwind 313,11088
+static Lisp_Object command_loop 314,11144
+static void echo_now 316,11185
+static ptrdiff_t echo_length 317,11214
+unsigned timers_run;320,11296
+struct timespec *input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW 346,12046
+#define READABLE_EVENTS_FILTER_EVENTS 347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES 348,12142
+static void (*keyboard_init_hook)keyboard_init_hook351,12264
+static bool get_input_pending 353,12307
+static bool readable_events 354,12344
+static Lisp_Object read_char_x_menu_prompt 355,12379
+static Lisp_Object read_char_minibuf_menu_prompt 357,12502
+static Lisp_Object make_lispy_event 358,12571
+static Lisp_Object make_lispy_movement 359,12631
+static Lisp_Object modify_event_symbol 363,12840
+static Lisp_Object make_lispy_switch_frame 366,13050
+static Lisp_Object make_lispy_focus_in 367,13108
+static Lisp_Object make_lispy_focus_out 369,13188
+static bool help_char_p 371,13275
+static void save_getcjmp 372,13314
+static void restore_getcjmp 373,13354
+static Lisp_Object apply_modifiers 374,13397
+static void clear_event 375,13452
+static void restore_kboard_configuration 376,13500
+static void deliver_input_available_signal 378,13568
+static void handle_interrupt 380,13631
+static _Noreturn void quit_throw_to_read_char 381,13668
+static void process_special_events 382,13722
+static void timer_start_idle 383,13765
+static void timer_stop_idle 384,13802
+static void timer_resume_idle 385,13838
+static void deliver_user_signal 386,13876
+static char *find_user_signal_name find_user_signal_name387,13915
+static void store_user_signal_events 388,13957
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+ KBOARD *kboard;kboard860,27087
+ struct kboard_stack *next;next861,27105
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", Fcommand_error_default_function,command-error-default-function1043,32030
+static Lisp_Object command_loop_2 1086,33637
+static Lisp_Object top_level_1 1087,33686
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+static int read_key_sequence 1282,38799
+static void adjust_point_for_property 1284,38917
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object kbd_buffer_get_event 2152,65484
+static void record_char 2154,65596
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING 2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+ int sig;7238,215915
+ char *name;name7241,215956
+ int npending;7244,216007
+ struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+ Lisp_Object parent;8745,259107
+ Lisp_Object map;8748,259224
+ int start,8753,259446
+ int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+ short var;11023,332716
+ short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+ DEFVAR_LISP ("internal--top-level-message"11058,333972
+ DEFVAR_LISP ("last-command-event"11312,342173
+ DEFVAR_LISP ("last-nonmenu-event"11315,342297
+ DEFVAR_LISP ("last-input-event"11321,342636
+ DEFVAR_LISP ("unread-command-events"11324,342730
+ DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+ DEFVAR_LISP ("unread-input-method-events"11338,343529
+ DEFVAR_LISP ("meta-prefix-char"11346,343898
+ DEFVAR_KBOARD ("last-command"11351,344106
+ DEFVAR_KBOARD ("real-last-command"11368,344787
+ DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+ DEFVAR_LISP ("this-command"11378,345261
+ DEFVAR_LISP ("real-this-command"11384,345498
+ DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+ DEFVAR_LISP ("this-original-command"11396,346123
+ DEFVAR_INT ("auto-save-interval"11403,346520
+ DEFVAR_LISP ("auto-save-timeout"11408,346734
+ DEFVAR_LISP ("echo-keystrokes"11415,347079
+ DEFVAR_INT ("polling-period"11421,347350
+ DEFVAR_LISP ("double-click-time"11428,347693
+ DEFVAR_INT ("double-click-fuzz"11435,348029
+ DEFVAR_INT ("num-input-keys"11446,348519
+ DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+ DEFVAR_LISP ("last-event-frame"11457,349032
+ DEFVAR_LISP ("tty-erase-char"11463,349311
+ DEFVAR_LISP ("help-char"11466,349434
+ DEFVAR_LISP ("help-event-list"11472,349717
+ DEFVAR_LISP ("help-form"11477,349928
+ DEFVAR_LISP ("prefix-help-command"11483,350176
+ DEFVAR_LISP ("top-level"11489,350454
+ DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+ DEFVAR_BOOL ("cannot-suspend"11511,351488
+ DEFVAR_BOOL ("menu-prompting"11516,351715
+ DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+ DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+ DEFVAR_LISP ("deactivate-mark"11545,353117
+ DEFVAR_LISP ("pre-command-hook"11553,353486
+ DEFVAR_LISP ("post-command-hook"11560,353841
+ DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+ DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+ DEFVAR_LISP ("menu-bar-final-items"11578,354622
+ DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+ DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+ DEFVAR_LISP ("overriding-local-map"11598,355652
+ DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+ DEFVAR_LISP ("special-event-map"11613,356442
+ DEFVAR_LISP ("track-mouse"11617,356630
+ DEFVAR_KBOARD ("system-key-alist"11620,356757
+ DEFVAR_KBOARD ("local-function-key-map"11629,357138
+ DEFVAR_KBOARD ("input-decode-map"11658,358597
+ DEFVAR_LISP ("function-key-map"11675,359385
+ DEFVAR_LISP ("key-translation-map"11683,359801
+ DEFVAR_LISP ("deferred-action-list"11689,360145
+ DEFVAR_LISP ("deferred-action-function"11694,360393
+ DEFVAR_LISP ("delayed-warnings-list"11700,360692
+ DEFVAR_LISP ("timer-list"11708,361100
+ DEFVAR_LISP ("timer-idle-list"11712,361252
+ DEFVAR_LISP ("input-method-function"11716,361415
+ DEFVAR_LISP ("input-method-previous-message"11737,362384
+ DEFVAR_LISP ("show-help-function"11744,362745
+ DEFVAR_LISP ("disable-point-adjustment"11749,362977
+ DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+ DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+ DEFVAR_LISP ("throw-on-input"11775,364171
+ DEFVAR_LISP ("command-error-function"11781,364422
+ DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+ DEFVAR_LISP ("select-active-regions"11798,365236
+ DEFVAR_LISP ("saved-region-selection"11807,365628
+ DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+ DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+ DEFVAR_LISP ("internal--top-level-message",\111058,333972
+ DEFVAR_LISP ("last-command-event",\111312,342173
+ DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+ DEFVAR_LISP ("last-input-event",\111321,342636
+ DEFVAR_LISP ("unread-command-events",\111324,342730
+ DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+ DEFVAR_LISP ("unread-input-method-events",\111338,343529
+ DEFVAR_LISP ("meta-prefix-char",\111346,343898
+ DEFVAR_KBOARD ("last-command",\111351,344106
+ DEFVAR_KBOARD ("real-last-command",\111368,344787
+ DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+ DEFVAR_LISP ("this-command",\111378,345261
+ DEFVAR_LISP ("real-this-command",\111384,345498
+ DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+ DEFVAR_LISP ("this-original-command",\111396,346123
+ DEFVAR_INT ("auto-save-interval",\111403,346520
+ DEFVAR_LISP ("auto-save-timeout",\111408,346734
+ DEFVAR_LISP ("echo-keystrokes",\111415,347079
+ DEFVAR_INT ("polling-period",\111421,347350
+ DEFVAR_LISP ("double-click-time",\111428,347693
+ DEFVAR_INT ("double-click-fuzz",\111435,348029
+ DEFVAR_INT ("num-input-keys",\111446,348519
+ DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+ DEFVAR_LISP ("last-event-frame",\111457,349032
+ DEFVAR_LISP ("tty-erase-char",\111463,349311
+ DEFVAR_LISP ("help-char",\111466,349434
+ DEFVAR_LISP ("help-event-list",\111472,349717
+ DEFVAR_LISP ("help-form",\111477,349928
+ DEFVAR_LISP ("prefix-help-command",\111483,350176
+ DEFVAR_LISP ("top-level",\111489,350454
+ DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+ DEFVAR_BOOL ("cannot-suspend",\111511,351488
+ DEFVAR_BOOL ("menu-prompting",\111516,351715
+ DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+ DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+ DEFVAR_LISP ("deactivate-mark",\111545,353117
+ DEFVAR_LISP ("pre-command-hook",\111553,353486
+ DEFVAR_LISP ("post-command-hook",\111560,353841
+ DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+ DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+ DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+ DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+ DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+ DEFVAR_LISP ("overriding-local-map",\111598,355652
+ DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+ DEFVAR_LISP ("special-event-map",\111613,356442
+ DEFVAR_LISP ("track-mouse",\111617,356630
+ DEFVAR_KBOARD ("system-key-alist",\111620,356757
+ DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+ DEFVAR_KBOARD ("input-decode-map",\111658,358597
+ DEFVAR_LISP ("function-key-map",\111675,359385
+ DEFVAR_LISP ("key-translation-map",\111683,359801
+ DEFVAR_LISP ("deferred-action-list",\111689,360145
+ DEFVAR_LISP ("deferred-action-function",\111694,360393
+ DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+ DEFVAR_LISP ("timer-list",\111708,361100
+ DEFVAR_LISP ("timer-idle-list",\111712,361252
+ DEFVAR_LISP ("input-method-function",\111716,361415
+ DEFVAR_LISP ("input-method-previous-message",\111737,362384
+ DEFVAR_LISP ("show-help-function",\111744,362745
+ DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+ DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+ DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+ DEFVAR_LISP ("throw-on-input",\111775,364171
+ DEFVAR_LISP ("command-error-function",\111781,364422
+ DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+ DEFVAR_LISP ("select-active-regions",\111798,365236
+ DEFVAR_LISP ("saved-region-selection",\111807,365628
+ DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+ DEFVAR_LISP ("debug-on-event",\111825,366554
+
+c-src/emacs/src/lisp.h,39173
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+# define EMACS_INT_MAX 93,3079
+# define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+# define EMACS_INT_MAX 98,3265
+# define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+# define EMACS_INT_MAX 105,3553
+# define pI 106,3587
+enum { BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+verify 131,4450
+ BITS_PER_CHAR 136,4570
+ BITS_PER_SHORT 137,4605
+ BITS_PER_LONG 138,4657
+ BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+extern _Noreturn void die 204,7206
+extern bool suppress_checking EXTERNALLY_VISIBLE;206,7268
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+ VALBITS 246,8742
+ INTTYPEBITS 249,8838
+ FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+# define check_cons_list(405,15097
+# define make_number(408,15176
+# define XFASTINT(409,15224
+# define XINT(410,15266
+# define XSYMBOL(411,15300
+# define XTYPE(412,15340
+# define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+ Lisp_Symbol 454,16851
+ Lisp_Misc 458,16993
+ Lisp_Int0 461,17067
+ Lisp_Int1 462,17086
+ Lisp_String 466,17264
+ Lisp_Vectorlike 472,17543
+ Lisp_Cons 475,17632
+ Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+ Lisp_Misc_Free 487,18040
+ Lisp_Misc_Marker,488,18069
+ Lisp_Misc_Overlay,489,18091
+ Lisp_Misc_Save_Value,490,18114
+ Lisp_Misc_Finalizer,491,18140
+ Lisp_Misc_Float,494,18275
+ Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+ Lisp_Fwd_Int,504,18566
+ Lisp_Fwd_Bool,505,18619
+ Lisp_Fwd_Obj,506,18670
+ Lisp_Fwd_Buffer_Obj,507,18729
+ Lisp_Fwd_Kboard_Obj 508,18800
+typedef struct { EMACS_INT i;567,21781
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+INLINE bool BOOL_VECTOR_P 588,22350
+INLINE bool BUFFER_OBJFWDP 589,22391
+INLINE bool BUFFERP 590,22438
+INLINE bool CHAR_TABLE_P 591,22473
+INLINE Lisp_Object CHAR_TABLE_REF_ASCII 592,22513
+INLINE bool 593,22579
+INLINE bool 594,22614
+INLINE bool functionp 595,22650
+INLINE bool 596,22687
+INLINE bool 597,22725
+INLINE bool 598,22762
+INLINE bool 599,22797
+INLINE bool OVERLAYP 600,22831
+INLINE bool PROCESSP 601,22867
+INLINE bool PSEUDOVECTORP 602,22903
+INLINE bool SAVE_VALUEP 603,22949
+INLINE bool FINALIZERP 604,22988
+INLINE void set_sub_char_table_contents 605,23026
+INLINE bool STRINGP 607,23116
+INLINE bool SUB_CHAR_TABLE_P 608,23151
+INLINE bool SUBRP 609,23195
+INLINE bool 610,23228
+INLINE bool 611,23265
+INLINE bool WINDOWP 612,23306
+INLINE bool TERMINALP 613,23341
+INLINE struct Lisp_Save_Value *XSAVE_VALUE XSAVE_VALUE614,23378
+INLINE struct Lisp_Finalizer *XFINALIZER XFINALIZER615,23436
+INLINE struct Lisp_Symbol *(XSYMBOL)616,23492
+INLINE void 617,23544
+extern Lisp_Object char_table_ref 620,23616
+extern void char_table_set 621,23670
+extern _Noreturn Lisp_Object wrong_type_argument 624,23757
+extern _Noreturn void wrong_choice 625,23834
+extern bool might_dump;628,23925
+extern bool initialized;631,24061
+extern double extract_float 634,24117
+enum symbol_interned639,24199
+ SYMBOL_UNINTERNED 641,24222
+ SYMBOL_INTERNED 642,24247
+ SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+ SYMBOL_PLAINVAL 648,24338
+ SYMBOL_VARALIAS 649,24362
+ SYMBOL_LOCALIZED 650,24386
+ SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+ bool_bf gcmarkbit 656,24458
+ ENUM_BF 663,24793
+ Lisp_Object value;687,25631
+ struct Lisp_Symbol *alias;alias688,25654
+ struct Lisp_Buffer_Local_Value *blv;blv689,25685
+ union Lisp_Fwd *fwd;fwd690,25726
+ } val;691,25751
+ Lisp_Object function;694,25823
+ Lisp_Object plist;697,25885
+ struct Lisp_Symbol *next;next700,25974
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY 712,26446
+#define DEFUN_ARGS_UNEVALLED 713,26498
+#define DEFUN_ARGS_0 714,26541
+#define DEFUN_ARGS_1 715,26569
+#define DEFUN_ARGS_2 716,26604
+#define DEFUN_ARGS_3 717,26652
+#define DEFUN_ARGS_4 718,26713
+#define DEFUN_ARGS_5 719,26787
+#define DEFUN_ARGS_6 721,26880
+#define DEFUN_ARGS_7 723,26986
+#define DEFUN_ARGS_8 725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+ PVEC_NORMAL_VECTOR,782,29585
+ PVEC_FREE,783,29607
+ PVEC_PROCESS,784,29620
+ PVEC_FRAME,785,29636
+ PVEC_WINDOW,786,29650
+ PVEC_BOOL_VECTOR,787,29665
+ PVEC_BUFFER,788,29685
+ PVEC_HASH_TABLE,789,29700
+ PVEC_TERMINAL,790,29719
+ PVEC_WINDOW_CONFIGURATION,791,29736
+ PVEC_SUBR,792,29765
+ PVEC_OTHER,793,29778
+ PVEC_COMPILED,795,29856
+ PVEC_CHAR_TABLE,796,29873
+ PVEC_SUB_CHAR_TABLE,797,29892
+ PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+ PSEUDOVECTOR_SIZE_BITS 808,30382
+ PSEUDOVECTOR_SIZE_MASK 809,30415
+ PSEUDOVECTOR_REST_BITS 813,30625
+ PSEUDOVECTOR_REST_MASK 814,30658
+ PSEUDOVECTOR_AREA_BITS 818,30823
+ PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+ Lisp_Object cdr;1159,40162
+ struct Lisp_Cons *chain;chain1162,40236
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+extern ptrdiff_t string_bytes 1313,44337
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+ ptrdiff_t size;1364,46383
+struct Lisp_Vector1369,46482
+ struct vectorlike_header header;1371,46505
+ Lisp_Object contents[contents1372,46542
+ ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+ struct vectorlike_header header;1388,47012
+ EMACS_INT size;1390,47086
+ bits_word data[data1395,47319
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+ header_size 1471,49047
+ bool_header_size 1472,49106
+ word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+ CHARTAB_SIZE_BITS_0 1567,52516
+ CHARTAB_SIZE_BITS_1 1568,52545
+ CHARTAB_SIZE_BITS_2 1569,52574
+ CHARTAB_SIZE_BITS_3 1570,52603
+extern const int chartab_size[chartab_size1573,52637
+struct Lisp_Char_Table1575,52672
+ struct vectorlike_header header;1581,52928
+ Lisp_Object defalt;1585,53078
+ Lisp_Object parent;1590,53280
+ Lisp_Object purpose;1594,53398
+ Lisp_Object ascii;1598,53564
+ Lisp_Object contents[contents1600,53588
+ Lisp_Object extras[extras1603,53699
+struct Lisp_Sub_Char_Table1606,53752
+ struct vectorlike_header header;1610,53918
+ int depth;1618,54341
+ int min_char;1621,54417
+ Lisp_Object contents[contents1624,54492
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+ struct vectorlike_header header;1672,55807
+ Lisp_Object (*a0)a01674,55856
+ Lisp_Object (*a1)a11675,55888
+ Lisp_Object (*a2)a21676,55927
+ Lisp_Object (*a3)a31677,55979
+ Lisp_Object (*a4)a41678,56044
+ Lisp_Object (*a5)a51679,56122
+ Lisp_Object (*a6)a61680,56213
+ Lisp_Object (*a7)a71681,56317
+ Lisp_Object (*a8)a81682,56434
+ Lisp_Object (*aUNEVALLED)aUNEVALLED1683,56564
+ Lisp_Object (*aMANY)aMANY1684,56616
+ } function;1685,56671
+ short min_args,1686,56687
+ short min_args, max_args;1686,56687
+ const char *symbol_name;symbol_name1687,56717
+ const char *intspec;intspec1688,56746
+ const char *doc;doc1689,56771
+enum char_table_specials1692,56798
+ CHAR_TABLE_STANDARD_SLOTS 1697,56993
+ SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+verify 1714,57596
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+ Lisp_Object name;1808,60139
+ Lisp_Object user_hash_function;1811,60206
+ Lisp_Object user_cmp_function;1814,60297
+ bool (*cmpfn)cmpfn1817,60372
+ EMACS_UINT (*hashfn)hashfn1820,60486
+struct Lisp_Hash_Table1823,60555
+ struct vectorlike_header header;1826,60649
+ Lisp_Object weak;1830,60783
+ Lisp_Object rehash_size;1835,61007
+ Lisp_Object rehash_threshold;1839,61129
+ Lisp_Object hash;1843,61260
+ Lisp_Object next;1848,61490
+ Lisp_Object next_free;1851,61560
+ Lisp_Object index;1856,61771
+ ptrdiff_t count;1863,62041
+ Lisp_Object key_and_value;1868,62240
+ struct hash_table_test test;1871,62314
+ struct Lisp_Hash_Table *next_weak;next_weak1875,62457
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any 1971,64806
+ ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+ ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+ ENUM_BF 2034,67346
+ SAVE_UNUSED,2047,67641
+ SAVE_INTEGER,2048,67658
+ SAVE_FUNCPOINTER,2049,67676
+ SAVE_POINTER,2050,67698
+ SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+ SAVE_TYPE_INT_INT 2066,68096
+ SAVE_TYPE_INT_INT_INT2067,68169
+ SAVE_TYPE_OBJ_OBJ 2069,68259
+ SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+ SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+ SAVE_TYPE_PTR_INT 2073,68506
+ SAVE_TYPE_PTR_OBJ 2074,68579
+ SAVE_TYPE_PTR_PTR 2075,68651
+ SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+ SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+ ENUM_BF 2112,69900
+ void *pointer;pointer2125,70555
+ voidfuncptr funcpointer;2126,70576
+ ptrdiff_t integer;2127,70607
+ Lisp_Object object;2128,70632
+ } data[data2129,70658
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+ struct Lisp_Misc_Any base;2188,72132
+ struct Lisp_Finalizer *prev;prev2191,72220
+ struct Lisp_Finalizer *next;next2192,72253
+ Lisp_Object function;2197,72490
+struct Lisp_Free2201,72581
+ ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+ struct Lisp_Misc_Any u_any;2214,72902
+ struct Lisp_Free u_free;2215,72973
+ struct Lisp_Marker u_marker;2216,73002
+ struct Lisp_Overlay u_overlay;2217,73035
+ struct Lisp_Save_Value u_save_value;2218,73070
+ struct Lisp_Finalizer u_finalizer;2219,73111
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+ enum Lisp_Fwd_Type type;2276,74140
+ EMACS_INT *intvar;intvar2277,74190
+struct Lisp_Boolfwd2284,74411
+ enum Lisp_Fwd_Type type;2286,74435
+ bool *boolvar;boolvar2287,74486
+struct Lisp_Objfwd2294,74702
+ enum Lisp_Fwd_Type type;2296,74725
+ Lisp_Object *objvar;objvar2297,74775
+struct Lisp_Buffer_Objfwd2302,74934
+ enum Lisp_Fwd_Type type;2304,74964
+ int offset;2305,75021
+ Lisp_Object predicate;2307,75113
+struct Lisp_Buffer_Local_Value2334,76470
+ bool_bf local_if_set 2338,76615
+ bool_bf frame_local 2341,76797
+ bool_bf found 2344,76939
+ union Lisp_Fwd *fwd;fwd2346,77041
+ Lisp_Object where;2348,77184
+ Lisp_Object defcell;2351,77310
+ Lisp_Object valcell;2357,77614
+struct Lisp_Kboard_Objfwd2362,77729
+ enum Lisp_Fwd_Type type;2364,77759
+ int offset;2365,77816
+union Lisp_Fwd2368,77838
+ struct Lisp_Intfwd u_intfwd;2370,77857
+ struct Lisp_Boolfwd u_boolfwd;2371,77890
+ struct Lisp_Objfwd u_objfwd;2372,77925
+ struct Lisp_Buffer_Objfwd u_buffer_objfwd;2373,77958
+ struct Lisp_Kboard_Objfwd u_kboard_objfwd;2374,78005
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+ double data;2395,78354
+ struct Lisp_Float *chain;chain2396,78373
+ } u;2397,78405
+XFLOAT_DATA 2401,78434
+ IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+ COMPILED_ARGLIST 2431,79389
+ COMPILED_BYTECODE 2432,79415
+ COMPILED_CONSTANTS 2433,79442
+ COMPILED_STACK_DEPTH 2434,79470
+ COMPILED_DOC_STRING 2435,79500
+ COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+ CHAR_ALT 2445,79850
+ CHAR_SUPER 2446,79876
+ CHAR_HYPER 2447,79904
+ CHAR_SHIFT 2448,79932
+ CHAR_CTL 2449,79960
+ CHAR_META 2450,79986
+ CHAR_MODIFIER_MASK 2452,80014
+ CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+extern void defsubr 2829,89358
+enum maxargs2831,89401
+ MANY 2833,89418
+ UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+extern void defvar_lisp 2846,89959
+extern void defvar_lisp_nopro 2847,90036
+extern void defvar_bool 2848,90119
+extern void defvar_int 2849,90190
+extern void defvar_kboard 2850,90264
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+ SPECPDL_UNWIND,2944,93822
+ SPECPDL_UNWIND_PTR,2945,93891
+ SPECPDL_UNWIND_INT,2946,93942
+ SPECPDL_UNWIND_VOID,2947,93990
+ SPECPDL_BACKTRACE,2948,94044
+ SPECPDL_LET,2949,94102
+ SPECPDL_LET_LOCAL,2951,94232
+ SPECPDL_LET_DEFAULT 2952,94289
+union specbinding2955,94361
+ ENUM_BF 2957,94383
+ ENUM_BF 2959,94440
+ ENUM_BF 2964,94570
+ ENUM_BF 2969,94693
+ ENUM_BF 2974,94811
+ ENUM_BF 2978,94916
+ ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+ enum handlertype type;3025,96471
+ Lisp_Object tag_or_ch;3026,96496
+ Lisp_Object val;3027,96521
+ struct handler *next;next3028,96540
+ struct handler *nextfree;nextfree3029,96564
+ Lisp_Object *bytecode_top;bytecode_top3036,96922
+ int bytecode_dest;3037,96951
+ struct gcpro *gcpro;gcpro3042,97188
+ sys_jmp_buf jmp;3044,97218
+ EMACS_INT lisp_eval_depth;3045,97237
+ ptrdiff_t pdlcount;3046,97266
+ int poll_suppress_count;3047,97288
+ int interrupt_input_blocked;3048,97315
+ struct byte_stack *byte_stack;byte_stack3049,97346
+#define PUSH_HANDLER(3053,97443
+extern Lisp_Object memory_signal_data;3075,98149
+extern char *stack_bottom;stack_bottom3079,98282
+extern void process_pending_signals 3097,99099
+extern bool volatile pending_signals;3098,99143
+extern void process_quit_flag 3100,99182
+#define QUIT 3101,99220
+#define QUITP 3112,99470
+extern Lisp_Object Vascii_downcase_table;3114,99531
+extern Lisp_Object Vascii_canon_table;3115,99573
+extern struct gcpro *gcprolist;gcprolist3130,100280
+struct gcpro3132,100313
+ struct gcpro *next;next3134,100328
+ volatile Lisp_Object *var;var3137,100397
+ ptrdiff_t nvars;3140,100479
+ const char *name;name3144,100564
+ int lineno;3147,100620
+ int idx;3150,100681
+ int level;3153,100717
+#define GC_USE_GCPROS_AS_BEFORE 3171,101294
+#define GC_MAKE_GCPROS_NOOPS 3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS 3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES 3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+extern int gcpro_level;3261,105037
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO 3353,109913
+#define RETURN_UNGCPRO(3363,110180
+void staticpro 3375,110453
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+extern Lisp_Object indirect_function 3495,113196
+extern Lisp_Object find_symbol_value 3496,113248
+enum Arith_Comparison 3497,113300
+ ARITH_EQUAL,3498,113324
+ ARITH_NOTEQUAL,3499,113339
+ ARITH_LESS,3500,113357
+ ARITH_GRTR,3501,113371
+ ARITH_LESS_OR_EQUAL,3502,113385
+ ARITH_GRTR_OR_EQUAL3503,113408
+extern Lisp_Object arithcompare 3505,113433
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+extern intmax_t cons_to_signed 3533,114837
+extern uintmax_t cons_to_unsigned 3534,114903
+extern struct Lisp_Symbol *indirect_variable indirect_variable3536,114964
+extern _Noreturn void args_out_of_range 3537,115033
+extern _Noreturn void args_out_of_range_3 3538,115101
+extern Lisp_Object do_symval_forwarding 3540,115192
+extern void set_internal 3541,115252
+extern void syms_of_data 3542,115324
+extern void swap_in_global_binding 3543,115357
+extern void syms_of_cmds 3546,115441
+extern void keys_of_cmds 3547,115474
+extern Lisp_Object detect_coding_system 3550,115536
+extern void init_coding 3552,115689
+extern void init_coding_once 3553,115721
+extern void syms_of_coding 3554,115758
+extern ptrdiff_t chars_in_text 3557,115825
+extern ptrdiff_t multibyte_chars_in_text 3558,115892
+extern void syms_of_character 3559,115969
+extern void init_charset 3562,116037
+extern void init_charset_once 3563,116070
+extern void syms_of_charset 3564,116108
+extern void init_syntax_once 3569,116228
+extern void syms_of_syntax 3570,116265
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+extern Lisp_Object listn 3740,123863
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_uninit_bool_vector 3763,124407
+extern Lisp_Object bool_vector_fill 3764,124463
+extern _Noreturn void string_overflow 3765,124527
+extern Lisp_Object make_string 3766,124573
+extern Lisp_Object make_formatted_string 3767,124631
+extern Lisp_Object make_multibyte_string 3779,124985
+extern Lisp_Object make_event_array 3780,125064
+extern Lisp_Object make_uninit_string 3781,125128
+extern Lisp_Object make_uninit_multibyte_string 3782,125179
+extern Lisp_Object make_string_from_bytes 3783,125251
+extern Lisp_Object make_specified_string 3784,125331
+extern Lisp_Object make_pure_string 3786,125423
+extern Lisp_Object make_pure_c_string 3787,125503
+build_pure_c_string 3792,125659
+build_string 3801,125864
+extern Lisp_Object pure_cons 3806,125942
+extern void make_byte_code 3807,125999
+extern struct Lisp_Vector *allocate_vector allocate_vector3808,126050
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+extern struct Lisp_Vector *allocate_pseudovector allocate_pseudovector3844,126963
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+extern bool gc_in_progress;3863,127735
+extern bool abort_on_gc;3864,127763
+extern Lisp_Object make_float 3865,127788
+extern void display_malloc_warning 3866,127828
+extern ptrdiff_t inhibit_garbage_collection 3867,127871
+extern Lisp_Object make_save_int_int_int 3868,127923
+extern Lisp_Object make_save_obj_obj_obj_obj 3869,127999
+extern Lisp_Object make_save_ptr 3871,128109
+extern Lisp_Object make_save_ptr_int 3872,128152
+extern Lisp_Object make_save_ptr_ptr 3873,128210
+extern Lisp_Object make_save_funcptr_ptr_obj 3874,128265
+extern Lisp_Object make_save_memory 3876,128361
+extern void free_save_value 3877,128425
+extern Lisp_Object build_overlay 3878,128468
+extern void free_marker 3879,128542
+extern void free_cons 3880,128581
+extern void init_alloc_once 3881,128625
+extern void init_alloc 3882,128661
+extern void syms_of_alloc 3883,128692
+extern struct buffer * allocate_buffer 3884,128726
+extern int valid_lisp_object_p 3885,128773
+extern int relocatable_string_data_p 3886,128819
+extern void check_cons_list 3888,128898
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+extern int openp 3957,131673
+extern Lisp_Object string_to_number 3959,131783
+extern void map_obarray 3960,131846
+extern void dir_warning 3962,131960
+extern void init_obarray 3963,132013
+extern void init_lread 3964,132046
+extern void syms_of_lread 3965,132077
+intern 3968,132131
+intern_c_string 3974,132219
+extern EMACS_INT lisp_eval_depth;3980,132332
+extern Lisp_Object Vautoload_queue;3981,132366
+extern Lisp_Object Vrun_hooks;3982,132402
+extern Lisp_Object Vsignaling_function;3983,132433
+extern Lisp_Object inhibit_lisp_code;3984,132473
+extern struct handler *handlerlist;handlerlist3985,132511
+extern void run_hook 3994,132753
+extern void run_hook_with_args_2 3995,132789
+extern Lisp_Object run_hook_with_args 3996,132863
+extern _Noreturn void xsignal 3999,133022
+extern _Noreturn void xsignal0 4000,133080
+extern _Noreturn void xsignal1 4001,133126
+extern _Noreturn void xsignal2 4002,133185
+extern _Noreturn void xsignal3 4003,133257
+extern _Noreturn void signal_error 4005,133346
+extern Lisp_Object eval_sub 4006,133410
+extern Lisp_Object apply1 4007,133458
+extern Lisp_Object call0 4008,133512
+extern Lisp_Object call1 4009,133552
+extern Lisp_Object call2 4010,133605
+extern Lisp_Object call3 4011,133671
+extern Lisp_Object call4 4012,133750
+extern Lisp_Object call5 4013,133842
+extern Lisp_Object call6 4014,133947
+extern Lisp_Object call7 4015,134065
+extern Lisp_Object internal_catch 4016,134196
+extern Lisp_Object internal_lisp_condition_case 4017,134289
+extern Lisp_Object internal_condition_case 4018,134378
+extern Lisp_Object internal_condition_case_1 4019,134491
+extern Lisp_Object internal_condition_case_2 4020,134626
+extern Lisp_Object internal_condition_case_n4021,134787
+extern void specbind 4024,134983
+extern void record_unwind_protect 4025,135032
+extern void record_unwind_protect_ptr 4026,135105
+extern void record_unwind_protect_int 4027,135172
+extern void record_unwind_protect_void 4028,135233
+extern void record_unwind_protect_nothing 4029,135291
+extern void clear_unwind_protect 4030,135341
+extern void set_unwind_protect 4031,135387
+extern void set_unwind_protect_ptr 4032,135468
+extern Lisp_Object unbind_to 4033,135543
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+extern ptrdiff_t fast_c_string_match_ignore_case 4141,140236
+extern ptrdiff_t fast_looking_at 4143,140333
+extern ptrdiff_t find_newline 4145,140472
+extern ptrdiff_t scan_newline 4147,140601
+extern ptrdiff_t scan_newline_from_point 4149,140704
+extern ptrdiff_t find_newline_no_quit 4150,140784
+extern ptrdiff_t find_before_next_newline 4152,140881
+extern void syms_of_search 4154,140979
+extern void clear_regexp_cache 4155,141014
+extern Lisp_Object Vminibuffer_list;4159,141084
+extern Lisp_Object last_minibuf_string;4160,141121
+extern Lisp_Object get_minibuffer 4161,141161
+extern void init_minibuf_once 4162,141208
+extern void syms_of_minibuf 4163,141246
+extern void syms_of_callint 4167,141313
+extern void syms_of_casefiddle 4171,141383
+extern void keys_of_casefiddle 4172,141422
+extern void init_casetab_once 4176,141492
+extern void syms_of_casetab 4177,141530
+extern Lisp_Object echo_message_buffer;4181,141598
+extern struct kboard *echo_kboard;echo_kboard4182,141638
+extern void cancel_echoing 4183,141673
+extern Lisp_Object last_undo_boundary;4184,141708
+extern bool input_pending;4185,141747
+extern sigjmp_buf return_to_command_loop;4187,141810
+extern Lisp_Object menu_bar_items 4189,141859
+extern Lisp_Object tool_bar_items 4190,141908
+extern void discard_mouse_events 4191,141964
+void handle_input_available_signal 4193,142025
+extern Lisp_Object pending_funcalls;4195,142074
+extern bool detect_input_pending 4196,142111
+extern bool detect_input_pending_ignore_squeezables 4197,142152
+extern bool detect_input_pending_run_timers 4198,142212
+extern void safe_run_hooks 4199,142264
+extern void cmd_error_internal 4200,142306
+extern Lisp_Object command_loop_1 4201,142366
+extern Lisp_Object read_menu_command 4202,142408
+extern Lisp_Object recursive_edit_1 4203,142453
+extern void record_auto_save 4204,142497
+extern void force_auto_save_soon 4205,142534
+extern void init_keyboard 4206,142575
+extern void syms_of_keyboard 4207,142609
+extern void keys_of_keyboard 4208,142646
+extern ptrdiff_t current_column 4211,142712
+extern void invalidate_current_column 4212,142752
+extern bool indented_beyond_p 4213,142798
+extern void syms_of_indent 4214,142863
+extern void store_frame_param 4217,142926
+extern void store_in_alist 4218,143000
+extern Lisp_Object do_switch_frame 4219,143070
+extern Lisp_Object get_frame_param 4220,143143
+extern void frames_discard_buffer 4221,143209
+extern void syms_of_frame 4222,143258
+extern char **initial_argv;initial_argv4225,143320
+extern int initial_argc;4226,143348
+extern bool display_arg;4228,143423
+extern Lisp_Object decode_env_path 4230,143455
+extern Lisp_Object empty_unibyte_string,4231,143526
+extern Lisp_Object empty_unibyte_string, empty_multibyte_string;4231,143526
+extern _Noreturn void terminate_due_to_signal 4232,143591
+extern Lisp_Object Vlibrary_cache;4234,143666
+void fixup_locale 4237,143727
+void synchronize_system_messages_locale 4238,143753
+void synchronize_system_time_locale 4239,143801
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+extern void shut_down_emacs 4245,144003
+extern bool noninteractive;4248,144129
+extern bool no_site_lisp;4251,144221
+extern int daemon_pipe[daemon_pipe4256,144389
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+extern void *w32_daemon_event;w32_daemon_event4260,144524
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+extern bool fatal_error_in_progress;4266,144721
+extern bool inhibit_window_system;4269,144827
+extern bool running_asynch_code;4271,144920
+extern void kill_buffer_processes 4274,144983
+extern int wait_reading_process_output 4275,145032
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern void add_timer_wait_descriptor 4286,145555
+extern void add_keyboard_wait_descriptor 4288,145607
+extern void delete_keyboard_wait_descriptor 4289,145655
+extern void add_gpm_wait_descriptor 4291,145722
+extern void delete_gpm_wait_descriptor 4292,145765
+extern void init_process_emacs 4294,145818
+extern void syms_of_process 4295,145857
+extern void setup_process_coding_systems 4296,145893
+extern int child_setup 4302,146013
+extern void init_callproc_1 4303,146081
+extern void init_callproc 4304,146117
+extern void set_initial_environment 4305,146151
+extern void syms_of_callproc 4306,146195
+extern Lisp_Object read_doc_string 4309,146258
+extern Lisp_Object get_doc_string 4310,146308
+extern void syms_of_doc 4311,146369
+extern int read_bytecode_char 4312,146401
+extern void syms_of_bytecode 4315,146470
+extern struct byte_stack *byte_stack_list;byte_stack_list4316,146507
+extern void mark_byte_stack 4318,146570
+extern void unmark_byte_stack 4320,146613
+extern Lisp_Object exec_byte_code 4321,146651
+extern void init_macros 4325,146801
+extern void syms_of_macros 4326,146833
+extern void truncate_undo_list 4329,146895
+extern void record_insert 4330,146945
+extern void record_delete 4331,146995
+extern void record_first_change 4332,147053
+extern void record_change 4333,147093
+extern void record_property_change 4334,147143
+extern void syms_of_undo 4337,147285
+extern void report_interval_modification 4340,147349
+extern void syms_of_menu 4343,147445
+extern void syms_of_xmenu 4346,147506
+extern char *get_current_dir_name get_current_dir_name4356,147708
+extern void stuff_char 4358,147757
+extern void init_foreground_group 4359,147790
+extern void sys_subshell 4360,147832
+extern void sys_suspend 4361,147865
+extern void discard_tty_input 4362,147897
+extern void init_sys_modes 4363,147935
+extern void reset_sys_modes 4364,147991
+extern void init_all_sys_modes 4365,148048
+extern void reset_all_sys_modes 4366,148087
+extern void child_setup_tty 4367,148127
+extern void setup_pty 4368,148162
+extern int set_window_size 4369,148191
+extern EMACS_INT get_random 4370,148235
+extern void seed_random 4371,148271
+extern void init_random 4372,148316
+extern void emacs_backtrace 4373,148348
+extern _Noreturn void emacs_abort 4374,148383
+extern void xputenv 4527,152697
+extern char *egetenv_internal egetenv_internal4529,152734
+egetenv 4532,152806
+extern void init_system_name 4539,153009
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA 4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+ struct Lisp_Cons s;4672,157290
+ double d;4673,157312
+ double d; intmax_t i;4673,157312
+ double d; intmax_t i; void *p;p4673,157312
+union Aligned_String4676,157349
+ struct Lisp_String s;4678,157372
+ double d;4679,157396
+ double d; intmax_t i;4679,157396
+ double d; intmax_t i; void *p;p4679,157396
+ USE_STACK_CONS 4689,157704
+ USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+extern const char *verify_ascii verify_ascii4730,159453
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/fail.c,30
+void (*prt_call(prt_call1,0
+
+c-src/h.h,2506
+ ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+void Asm_labels 7,127
+typedef struct tpcmd8,147
+#define ggg 10,170
+ } arg;13,198
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+ fu int (*funcptr)funcptr17,242
+ long foo;18,279
+ char bar;19,293
+} foobar2;20,307
+ DEVICE_SWP,23,333
+ DEVICE_LAST24,349
+} bsp_DevId;25,365
+ struct constant_args 27,394
+ unsigned int burst;28,419
+ } constant;29,443
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+ int def;35,523
+} ghi1;36,534
+typedef union abc 37,542
+ int def;38,562
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage *an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+ kind;46,733
+ is_explicit;49,812
+ a_byte_boolean is_curly_brace_form;54,1009
+} an_extern_linkage;56,1054
+typedef struct pollfd pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+ int rtint;60,1149
+ char *rtstr;rtstr61,1164
+ struct rtx_def *rtx;rtx62,1181
+ } womboid 63,1206
+typedef union rtunion_def64,1220
+ int rtint;68,1250
+ char *rtstr;rtstr69,1263
+ struct rtx_def *rtxp;rtxp70,1278
+ struct rtx_def rtxnp;71,1302
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+ Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+extern void ab(102,1948
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int (*oldhup)oldhup107,2014
+request (*oldhup)oldhup108,2031
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous 117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+struct re_pattern_buffer { unsigned char *buffer;buffer119,2277
+
+cp-src/c.C,3629
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+ ipc3dLinkControlSetup setup;CMultiChannelCSC19_3D::setup5,190
+ ipc3dCSC19<CMultiChannelCSC19_3D::ipc3dCSC196,227
+ ipc3dCSC19<ipc3dIslandHierarchy,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipc3dLinkControl> mcCSC;CMultiChannelCSC19_3D::mcCSC6,227
+ advTimer cscInitTime;CMultiChannelCSC19_3D::cscInitTime7,388
+ advTimer cscSegmentationTime;CMultiChannelCSC19_3D::cscSegmentationTime8,418
+ advTimer outputTime;CMultiChannelCSC19_3D::outputTime9,456
+ void execute(CMultiChannelCSC19_3D::execute11,493
+static void my_function1(24,984
+int main 25,1026
+double base 26,1088
+operator += operator +=29,1174
+class TestRecord;31,1233
+typedef struct s1 32,1251
+ int counter;s1::counter33,1271
+} t1;34,1287
+struct s2 35,1293
+ int counter;s2::counter36,1305
+typedef struct s2 t2;38,1324
+class A 39,1346
+ enum { rosso,A::rosso40,1356
+ enum { rosso, giallo,A::giallo40,1356
+ enum { rosso, giallo, verde A::verde40,1356
+ enum { rosso, giallo, verde } colori;A::colori40,1356
+ const A& operator+(A::operator+41,1396
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+template <class C, int n> class AT { C t[AT::t52,1668
+class AU 53,1716
+class AU { T x;AU::x53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A { class B { int f(A::B::f56,1791
+class A 57,1826
+ int get_data(A::get_data58,1836
+ A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+ void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct A { A(A::A73,2004
+struct B 74,2022
+struct B { B(B::B74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+ int x;foo::x80,2115
+class test 86,2156
+ int f(test::f87,2169
+ int ff(test::ff89,2231
+ int g(test::g90,2254
+class AST_Root 92,2278
+class AST_Root;96,2327
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+ void f(::f115,2733
+struct A 117,2753
+ ~A(A::~A118,2764
+A::~A(120,2777
+struct B 122,2789
+ ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;::teats127,2842
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+ enum {dog,Boo::dog130,2880
+ enum {dog, cat}Boo::cat130,2880
+ enum {dog, cat} animals;Boo::animals130,2880
+ struct {int treats;Boo::treats131,2909
+ struct {int treats;} cow;Boo::cow131,2909
+ int i,Boo::i132,2939
+ int i,a,Boo::a132,2939
+ int i,a,b;Boo::b132,2939
+ foo(Boo::foo133,2954
+ Boo(Boo::Boo137,2995
+ Boo(Boo::Boo138,3052
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int (*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,1538
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2;45,1087
+operator += operator +=48,1145
+operator -= operator -=51,1242
+operator * operator *54,1339
+operator / operator /57,1428
+operator * operator *60,1517
+operator + operator +63,1605
+operator - operator -66,1707
+product 69,1808
+operator - operator -72,1907
+class MDiagArray2 78,2022
+ MDiagArray2 MDiagArray2::MDiagArray282,2077
+ MDiagArray2 MDiagArray2::MDiagArray286,2154
+ MDiagArray2 MDiagArray2::MDiagArray287,2198
+ MDiagArray2 MDiagArray2::MDiagArray288,2254
+ MDiagArray2 MDiagArray2::MDiagArray289,2329
+ MDiagArray2 MDiagArray2::MDiagArray290,2387
+ MDiagArray2 MDiagArray2::MDiagArray291,2450
+ ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+ MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+ DiagArray2<T>::operator = MDiagArray2::operator =97,2603
+ operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+ operator += MDiagArray2::operator +=116,2966
+ operator -= MDiagArray2::operator -=119,3057
+ friend MDiagArray2<T> operator * MDiagArray2::operator *123,3174
+ friend MDiagArray2<T> operator / MDiagArray2::operator /124,3253
+ friend MDiagArray2<T> operator * MDiagArray2::operator *128,3384
+ operator + MDiagArray2::operator +133,3544
+ operator - MDiagArray2::operator -136,3640
+ friend MDiagArray2<T> operator - MDiagArray2::operator -141,3803
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Range.h,1136
+#define octave_Range_h 24,765
+class istream;30,840
+class ostream;31,855
+class Matrix;32,870
+Range35,891
+ Range Range::Range39,909
+ Range Range::Range42,995
+ Range Range::Range46,1130
+ Range Range::Range50,1248
+ double base Range::base54,1376
+ double limit Range::limit55,1425
+ double inc Range::inc56,1475
+ int nelem Range::nelem57,1523
+ bool all_elements_are_ints Range::all_elements_are_ints59,1571
+ Matrix matrix_value Range::matrix_value61,1615
+ double min Range::min63,1652
+ double max Range::max64,1679
+ void sort Range::sort66,1707
+ void set_base Range::set_base68,1728
+ void set_limit Range::set_limit69,1774
+ void set_inc Range::set_inc70,1821
+ friend ostream& operator << Range::operator <<72,1867
+ friend istream& operator >> Range::operator >>73,1928
+ void print_range Range::print_range75,1984
+ double rng_base;Range::rng_base79,2023
+ double rng_limit;Range::rng_limit80,2042
+ double rng_inc;Range::rng_inc81,2062
+ int rng_nelem;Range::rng_nelem83,2081
+ int nelem_internal Range::nelem_internal85,2099
+extern Range operator - operator -88,2138
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,791
+#define __COLORS9,401
+enum COLORS 11,419
+ BLACK,COLORS::BLACK12,433
+ BLUE,COLORS::BLUE13,471
+ GREEN,COLORS::GREEN14,481
+ CYAN,COLORS::CYAN15,492
+ RED,COLORS::RED16,502
+ MAGENTA,COLORS::MAGENTA17,511
+ BROWN,COLORS::BROWN18,524
+ LIGHTGRAY,COLORS::LIGHTGRAY19,535
+ DARKGRAY,COLORS::DARKGRAY20,550
+ LIGHTBLUE,COLORS::LIGHTBLUE21,589
+ LIGHTGREEN,COLORS::LIGHTGREEN22,604
+ LIGHTCYAN,COLORS::LIGHTCYAN23,620
+ LIGHTRED,COLORS::LIGHTRED24,635
+ LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+ YELLOW,COLORS::YELLOW26,667
+ WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+void goto_xy(35,835
+void hide_cursor(36,883
+void cursor_position(37,907
+void clear_screen(38,935
+void write_xyc(39,960
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,483
+class site:site5,235
+ char x,site::x7,269
+ char x, y,site::y7,269
+ char x, y, alive,site::alive7,269
+ char x, y, alive, next_alive;site::next_alive7,269
+ int total_surrounding(site::total_surrounding8,303
+ site(site::site10,344
+ ~site(site::~site11,397
+ char read(site::read12,410
+ void set(site::set13,444
+ void clear(site::clear14,478
+ void compute_next_state(site::compute_next_state15,514
+ void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,1600
+extern void init_registry(10,452
+extern void step_everybody(11,485
+class generic_object13,520
+ int where_in_registry;generic_object::where_in_registry15,547
+ generic_object(generic_object::generic_object17,582
+ ~generic_object(generic_object::~generic_object19,724
+ virtual void compute_next_state(generic_object::compute_next_state21,842
+ virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+ location(location::location43,1642
+ ~location(location::~location44,1661
+class irregular_location:irregular_location47,1686
+ double x,irregular_location::x49,1734
+ double x, y,irregular_location::y49,1734
+ double x, y, z;irregular_location::z49,1734
+ irregular_location(irregular_location::irregular_location51,1762
+ ~irregular_location(irregular_location::~irregular_location53,1854
+class discrete_location:discrete_location56,1889
+ int x,discrete_location::x58,1936
+ int x, y,discrete_location::y58,1936
+ int x, y, z;discrete_location::z58,1936
+ class location *neighbors[discrete_location::neighbors59,1953
+ void clear_neighbors(discrete_location::clear_neighbors60,2004
+ discrete_location(discrete_location::discrete_location62,2044
+ ~discrete_location(discrete_location::~discrete_location65,2154
+ void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+ location *where;agent::where77,2549
+ agent(agent::agent79,2578
+ ~agent(agent::~agent80,2591
+ void move(agent::move81,2605
+
+cp-src/fail.C,438
+struct A 7,263
+ struct B A::B8,274
+ struct C A::B::C9,289
+ int x;A::B::C::x10,305
+ C(A::B::C::C11,318
+ operator int(A::B::C::operator int12,342
+ typedef C T;A::B::T14,389
+ typedef B T2;A::T216,414
+class String;20,437
+class A 23,453
+ class B A::B24,463
+ class C A::B::C25,474
+ int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+ class D 41,622
+ D(D::D43,659
+ int x;D::x44,694
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5188
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defvar etags-case-fold-search)855,33906
+(defvar etags-syntax-table)856,33938
+(defvar local-find-tag-hook)857,33966
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+f-src/entry.for,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+ LOGICAL FUNCTION PRTPKG 3,75
+ ENTRY SETPRT 194,3866
+ ENTRY MSGSEL 395,8478
+ & intensity1(577,12231
+ character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+ ENTRY MSGSEL 193,4382
+ & intensity1(375,8135
+ character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+ 9 field >field136,582
+ 5 field >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'è il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potortì Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1156
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+ @-$($72,3064
+ @-$($73,3113
+ @-$($74,3177
+ @-$($75,3223
+ @-$($76,3291
+ @-$($77,3383
+ @$(81,3466
+ @$(82,3514
+ @$(83,3577
+ @$(84,3622
+ @$(85,3689
+ @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+ @env CHECKEROPTS=92,3922
+ @$(98,4094
+ @$(106,4250
+ @$(110,4374
+ @$(114,4500
+ @for i in $(140,5315
+ @for i in $(SRCS); do echo $$i;140,5315
+ $(160,6053
+ $(163,6114
+ $(166,6177
+ $(169,6228
+ $(172,6317
+ sdiff --suppress-common-lines --width=width186,6614
+ sdiff --suppress-common-lines --width=width189,6703
+ sdiff --suppress-common-lines --width=width192,6791
+ sdiff --suppress-common-lines --width=width195,6880
+ TEXTAGS=204,7122
+ TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* --regex=regex204,7122
+ ${RUN} etags12 --members -o $@ --regex=regex207,7239
+ ${RUN} ./ctags -o $@ --regex=regex213,7388
+ ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+ TEXTAGS=219,7583
+ TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ --regex=regex219,7583
+ ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
+@interface Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,505
+#define PTY_TEMPLATE 20,494
+#define PTY_LENGTH 21,528
+static void showError(23,551
+@interface Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+ andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS 36,1101
+#define TYPESTOSTAT 37,1120
+@interface PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION 34,1116
+# define DEBUG 37,1155
+#define LISTCONTENTS 39,1181
+#define OPENBUTTON 47,1352
+#define LISTCONTENTSBUTTON 48,1449
+#define LISTDESCRIPTIONBUTTON 49,1562
+#define STATE_UNINSTALLED 52,1687
+#define STATE_INSTALLED 53,1807
+#define STATE_COMPRESSD 54,1948
+#define SIZEFORMAT 57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING 368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
+@interface SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2864
+ define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+ define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+ define("LCE_WS"LCE_WS11,194
+ define("LCE_COMMENT"LCE_COMMENT13,244
+ define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+ define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+ define("LCE_MSGID"LCE_MSGID19,430
+ define("LCE_MSGSTR"LCE_MSGSTR21,488
+ define("LCE_TEXT"LCE_TEXT23,541
+ define("STATE_ABORT"STATE_ABORT25,567
+ define("STATE_OK"STATE_OK26,595
+ define("STATE_LOOP"STATE_LOOP27,620
+ class POEntryAD 29,648
+ function validate(31,683
+ function checkQuotation(59,1384
+ class CommentAD 70,1639
+ var $prefix;72,1674
+ function CommentAD(73,1693
+ function validate(83,1944
+ class POEntry 105,2410
+ var $msgid;107,2454
+ var $msgstr;108,2472
+ var $user_comment;109,2491
+ var $sys_comment;110,2516
+ var $unk_comment;111,2540
+ var $msgid_lc 113,2565
+ var $msgstr_lc 114,2590
+ var $user_comment_lc 115,2616
+ var $sys_comment_lc 116,2648
+ var $unk_comment_lc 117,2679
+ function POEntry(119,2711
+ function lineCount(135,3255
+ function serializeToVars(141,3365
+ function write(151,3800
+ class POReader 163,4178
+ var $msgid;165,4223
+ var $msgstr;166,4241
+ var $user_comment;167,4260
+ var $sys_comment;168,4285
+ var $unk_comment;169,4309
+ var $state;170,4333
+ var $ignore_ws;171,4351
+ var $po_entries;172,4373
+ var $poe_num;173,4396
+ var $filename;174,4416
+ var $domain;175,4437
+ function gettext(177,4457
+ function parseFromVars(189,4705
+ function serializeToVars(215,5331
+ function POReader(229,5613
+ function read(243,5983
+ function write(259,6307
+ function isComment(277,6645
+ function comment(284,6822
+ function msgid(304,7247
+ function msgstr(320,7574
+ function start(340,8232
+ function createPOEntries(360,8644
+ function stripLine(394,9472
+ function printClassification(421,10056
+ function classifyLine(432,10301
+ function getTextDomains(471,11094
+ class PORManager 498,11756
+ var $por_a;500,11803
+ function PORManager(502,11822
+ function addPOReader(507,11896
+ function &getPOReader(getPOReader512,11992
+ function getDomainNames(517,12081
+ function &loadPORManager(loadPORManager523,12174
+ function fileJoin(536,12436
+ function lce_bindtextdomain(557,12839
+ function lce_textdomain(614,14530
+ function lce_gettext(620,14641
+ function lce_dgettext(626,14767
+ function lce(634,14966
+ function lce_bindtextdomain(651,15488
+ function lce_textdomain(656,15592
+ function lce_gettext(661,15674
+ function lce_dgettext(666,15755
+ function lce(670,15855
+ function lce_geteditcode(676,15898
+
+php-src/ptest.php,135
+define("TEST"TEST1,0
+test 4,26
+ var $member;8,71
+ var $memassign=9,85
+ var $memassign_space 10,110
+ var $test12,176
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+ my $entry entry218,5621
+ my $entry entry234,6077
+ my $entry entry245,6351
+ my $entry entry252,6536
+ my $entry entry268,7010
+ my $entry entry276,7204
+ my $entry entry281,7328
+ my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+ my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+ local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+ local($prog,$_,@list)($prog,$_,@list39,868
+ local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+ def __init__(18,374
+ def __repr__(24,590
+ def __str__(34,871
+class Server:Server37,934
+ def __init__(38,948
+ def dump(73,2198
+ def __repr__(125,3896
+ def __str__(128,3945
+class User:User131,4014
+ def __init__(132,4026
+ def __repr__(172,5445
+ def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+ def bind(234,7525
+ def focus_set(236,7584
+ def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+ def __init__(269,8808
+ def handleList(303,10042
+ def handleNew(306,10094
+ def editItem(314,10426
+ def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+ def PostControls(376,12403
+ def GatherControls(421,13530
+class ServerEdit(512,16264
+ def __init__(513,16289
+ def post(525,16629
+ def gather(543,17191
+ def nosave(547,17304
+ def save(551,17408
+ def refreshPort(556,17509
+ def createWidgets(561,17663
+ def edituser(631,20708
+class UserEdit(645,20921
+ def __init__(646,20944
+ def post(658,21283
+ def gather(676,21841
+ def nosave(680,21950
+ def save(684,22052
+ def createWidgets(689,22151
+class Configure(760,24879
+ def __init__(761,24916
+ def MakeDispose(772,25211
+ def MakeSitelist(786,25706
+ def editsite(794,25949
+ def save(797,26022
+ def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
+@node Top,62,2139
+@node Copying,80,2652
+@node Overview,83,2705
+@node Sample,166,7272
+@node Invoking gzip,Invoking gzip210,8828
+@node Advanced usage,Advanced usage357,13495
+@node Environment,420,15207
+@node Tapes,437,15768
+@node Problems,460,16767
+@node Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
+\def\@{\@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+ \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+ \def\subtitlefont{\subtitlefont765,24968
+ \def\authorfont{\authorfont767,25052
+ \def\title{\title773,25262
+ \def\titlezzz##1{\titlezzz774,25297
+ \def\subtitle{\subtitle782,25612
+ \def\subtitlezzz##1{\subtitlezzz783,25653
+ \def\author{\author786,25771
+ \def\authorzzz##1{\authorzzz787,25808
+ \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+ \def\thearg{\thearg1145,37720
+ \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0 %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+ \def\indexbackslash{\indexbackslash1480,48406
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+ \null\nobreak\indexdotfill % Have leaders before the page number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+ \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno \appendixno = `\@no1626,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+ {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+ {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+ {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+ \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+ \def\secentry ##1##2##3##4{\secentry2066,68220
+ \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+ \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+ \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+ \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+ \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+ {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
+\def\@{\@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+ \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,2136
+void (*fa)fa131,
+void 132,
+my_printf 135,
+void fatala 138,
+void fatalb 139,
+max 141,
+struct bar 143,
+ char z;144,
+ struct foo f;145,
+__attribute__ ((always_inline)) max 147,
+extern int old_var 149,
+struct foo150,
+ char a;152,
+ int x[x153,
+char stack[stack155,
+struct S 156,
+struct S { short f[f156,
+ int *__ip;__ip159,
+ union wait *__up;__up160,
+} wait_status_ptr_t 161,
+Some_Class A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+ U16 next;174,
+ U16 prev;175,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+ int x;179,
+ char a,180,
+ char a, b,180,
+ char a, b, c,180,
+ char a, b, c, d;180,
+ f1 183,
+void f2 184,
+__attribute__((noreturn)) void d0 185,
+ __attribute__((format(printf, 1, 2))) d1 186,
+ d2 187,
+int x 188,
+struct foo 189,
+struct foo { int x[x189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,x-get-selection-internal206,
+ Fx_get_selection_internal,x-get-selection-internal212,
+ Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+ aaa;249,
+ bbb;251,
+struct sss1 252,
+struct sss2253,
+ struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+ **b;b262,
+caccacacca 263,
+a 267,
+ typedef struct aa 269,
+ typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+ typedef int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,1061
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+int yylex 57,1317
+void yyerror 59,1347
+void yyerror 61,1376
+VOIDSTAR parse_hash;63,1400
+extern VOIDSTAR hash_find(64,1421
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+YYSTYPE make_list 75,1716
+YYSTYPE make_list 77,1760
+char *instr;instr80,1790
+int parse_error 81,1803
+extern struct obstack tmp_mem;82,1824
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+extern struct node *yylval;yylval305,6233
+unsigned char parse_cell_or_range 308,6278
+unsigned char parse_cell_or_range 310,6342
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define NE 6,114
+# define LE 7,130
+# define GE 8,146
+# define NEG 9,162
+# define L_CELL 10,179
+# define L_RANGE 11,199
+# define L_VAR 12,220
+# define L_CONST 13,239
+# define L_FN0 14,260
+# define L_FN1 15,279
+# define L_FN2 16,298
+# define L_FN3 17,317
+# define L_FN4 18,336
+# define L_FNN 19,355
+# define L_FN1R 20,374
+# define L_FN2R 21,394
+# define L_FN3R 22,414
+# define L_FN4R 23,434
+# define L_FNNR 24,454
+# define L_LE 25,474
+# define L_NE 26,492
+# define L_GE 27,510
+
+parse.y,1464
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+int yylex 57,
+void yyerror 59,
+void yyerror 61,
+VOIDSTAR parse_hash;63,
+extern VOIDSTAR hash_find(64,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+YYSTYPE make_list 75,
+YYSTYPE make_list 77,
+char *instr;instr80,
+int parse_error 81,
+extern struct obstack tmp_mem;82,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define YYFINAL 93,
+#define YYFLAG 94,
+#define YYNTBASE 95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define YYLAST 266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+extern struct node *yylval;yylval305,
+unsigned char parse_cell_or_range 308,
+unsigned char parse_cell_or_range 310,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2238
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+ short yyss;85,
+ YYSTYPE yyvs;86,
+ YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ YYDPRINTF 917,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyerror 946,
+ yyresult 947,
+
+y-src/atest.y,9
+exp 2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define INT 6,113
+# define CHAR 7,130
+# define NAME 8,148
+# define ERROR 9,166
+# define OR 10,185
+# define AND 11,201
+# define EQUAL 12,218
+# define NOTEQUAL 13,237
+# define LEQ 14,259
+# define GEQ 15,276
+# define LSH 16,293
+# define RSH 17,310
+# define UNARY 18,327
+
+cccp.y,2532
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+ struct arglist *next;next42,
+ U_CHAR *name;name43,
+ int length;44,
+ int argno;45,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int yylex 66,
+void yyerror 67,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+extern unsigned char is_idstart[is_idstart76,
+extern unsigned char is_idstart[], is_idchar[is_idchar76,
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[is_hor_space76,
+extern char *xmalloc xmalloc78,
+extern int pedantic;81,
+extern int traditional;84,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+static void integer_overflow 106,
+static long left_shift 107,
+static long right_shift 108,
+ struct constant 113,
+ struct constant {long value;113,
+ struct constant {long value; int unsignedp;113,
+ struct constant {long value; int unsignedp;} integer;113,
+ struct name 114,
+ struct name {U_CHAR *address;address114,
+ struct name {U_CHAR *address; int length;114,
+ struct name {U_CHAR *address; int length;} name;114,
+ struct arglist *keywords;keywords115,
+ int voidval;116,
+ char *sval;sval117,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define YYFINAL 127,
+#define YYFLAG 128,
+#define YYNTBASE 129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define YYLAST 274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+ char *operator;operator438,
+ int token;439,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+extern int yydebug;919,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2238
+# define YYSTD(40,
+# define YYSTD(42,
+# define YYSTACK_ALLOC 50,
+# define YYSIZE_T 51,
+# define YYSTACK_ALLOC 55,
+# define YYSIZE_T 56,
+# define YYSTACK_ALLOC 59,
+# define YYSTACK_FREE(67,
+# define YYSIZE_T 71,
+# define YYSIZE_T 75,
+# define YYSTACK_ALLOC 78,
+# define YYSTACK_FREE 79,
+union yyalloc83,
+ short yyss;85,
+ YYSTYPE yyvs;86,
+ YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+# define YYSTACK_BYTES(98,
+# define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+# define YYSIZE_T 136,
+# define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok 148,
+#define yyclearin 149,
+#define YYEMPTY 150,
+#define YYEOF 151,
+#define YYACCEPT 152,
+#define YYABORT 153,
+#define YYERROR 154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR 177,
+#define YYERRCODE 178,
+# define YYLLOC_DEFAULT(189,
+# define YYLEX 200,
+# define YYLEX 202,
+# define YYLEX 206,
+# define YYLEX 208,
+# define YYLEX 212,
+# define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+# define yymemcpy 264,
+yymemcpy 271,
+# define yystrlen 293,
+yystrlen 298,
+# define yystpcpy 316,
+yystpcpy 322,
+# define YYPARSE_PARAM_ARG 351,
+# define YYPARSE_PARAM_DECL352,
+# define YYPARSE_PARAM_ARG 354,
+# define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES 374,
+# define YY_DECL_VARIABLES 385,
+# define YY_DECL_VARIABLES 391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+ *++yyvsp yyvsp746,
+ *++yylsp yylsp748,
+ yyn 755,
+ yystate 757,
+ yystate 761,
+ goto yynewstate;763,
+ goto yyerrlab1;823,
+ yyerrstatus 846,
+ goto yyerrhandle;848,
+ yyn 861,
+ yystate 875,
+ yyn 895,
+ yyn 903,
+ YYDPRINTF 917,
+ *++yyvsp yyvsp919,
+ *++yylsp yylsp921,
+ yystate 924,
+ goto yynewstate;925,
+ yyresult 932,
+ goto yyreturn;933,
+ yyresult 939,
+ goto yyreturn;940,
+ yyerror 946,
+ yyresult 947,
+
+y-src/cccp.y,2171
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+ struct arglist *next;next42,1318
+ U_CHAR *name;name43,1342
+ int length;44,1358
+ int argno;45,1372
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int yylex 66,1712
+void yyerror 67,1726
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+extern unsigned char is_idstart[is_idstart76,1944
+extern unsigned char is_idstart[], is_idchar[is_idchar76,1944
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[is_hor_space76,1944
+extern char *xmalloc xmalloc78,2009
+extern int pedantic;81,2062
+extern int traditional;84,2114
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+static void integer_overflow 106,2632
+static long left_shift 107,2665
+static long right_shift 108,2692
+ struct constant 112,2733
+ struct constant {long value;112,2733
+ struct constant {long value; int unsignedp;112,2733
+ struct constant {long value; int unsignedp;} integer;112,2733
+ struct name 113,2789
+ struct name {U_CHAR *address;address113,2789
+ struct name {U_CHAR *address; int length;113,2789
+ struct name {U_CHAR *address; int length;} name;113,2789
+ struct arglist *keywords;keywords114,2840
+ int voidval;115,2868
+ char *sval;sval116,2883
+start 143,3226
+exp1 148,3330
+exp 156,3505
+exp 185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+ char *operator;operator438,11053
+ int token;439,11071
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+extern int yydebug;919,21416
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+a-src/empty.zz,0
diff --git a/test/etags/Makefile b/test/etags/Makefile
new file mode 100644
index 00000000000..a0914e45204
--- /dev/null
+++ b/test/etags/Makefile
@@ -0,0 +1,79 @@
+ADASRC=$(addprefix ./ada-src/,etags-test-for.ada 2ataspri.adb 2ataspri.ads waroquiers.ada)
+ASRC=$(addprefix ./a-src/,empty.zz empty.zz.gz)
+CSRC=$(addprefix ./c-src/,abbrev.c .//c.c torture.c getopt.h etags.c\
+ exit.c exit.strange_suffix sysdep.h tab.c dostorture.c\
+ emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c emacs/src/lisp.h\
+ machsyscalls.c machsyscalls.h fail.c a/b/b.c) ../etags/c-src/h.h
+CPSRC=$(addprefix ./cp-src/,c.C burton.cpp burton.cpp\
+ functions.cpp MDiagArray2.h Range.h\
+ screen.cpp screen.hpp conway.cpp conway.hpp clheir.cpp.gz clheir.hpp.gz fail.C)
+ELSRC=$(addprefix ./el-src/,TAGTEST.EL emacs/lisp/progmodes/etags.el)
+ERLSRC=$(addprefix ./erl-src/,gs_dialog.erl)
+FORTHSRC=$(addprefix ./forth-src/,test-forth.fth)
+FSRC=$(addprefix ./f-src/,entry.for entry.strange_suffix entry.strange)
+HTMLSRC=$(addprefix ./html-src/,softwarelibero.html index.shtml algrthms.html software.html)
+#JAVASRC=$(addprefix ./java-src/, )
+LUASRC=$(addprefix ./lua-src/,allegro.lua)
+MAKESRC=$(addprefix ./make-src/,Makefile)
+OBJCSRC=$(addprefix ./objc-src/,Subprocess.h Subprocess.m PackInsp.h PackInsp.m)
+OBJCPPSRC=$(addprefix ./objcpp-src/,SimpleCalc.H SimpleCalc.M)
+PASSRC=$(addprefix ./pas-src/,common.pas)
+PERLSRC=$(addprefix ./perl-src/,htlmify-cystic yagrip.pl kai-test.pl)
+PHPSRC=$(addprefix ./php-src/,lce_functions.php ptest.php sendmail.php)
+PSSRC=$(addprefix ./ps-src/,rfc1245.ps)
+PROLSRC=$(addprefix ./prol-src/,ordsets.prolog natded.prolog)
+PYTSRC=$(addprefix ./pyt-src/,server.py)
+TEXSRC=$(addprefix ./tex-src/,testenv.tex gzip.texi texinfo.tex nonewline.tex)
+YSRC=$(addprefix ./y-src/,parse.y parse.c atest.y cccp.c cccp.y)
+SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
+ ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\
+ ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\
+ ${TEXSRC} ${YSRC}
+NONSRCS=./f-src/entry.strange ./erl-src/lists.erl ./cp-src/clheir.hpp.gz
+
+ETAGS_PROG=../../lib-src/etags
+CTAGS_PROG=../../lib-src/ctags
+
+REGEX=/[ \t]*DEFVAR_[A-Z_ \t\n(]+"\([^"]+\)"/
+xx="this line is here because of a fontlock bug
+
+RUN=
+
+OPTIONS=--members --declarations --regex=@regexfile
+ARGS=- < srclist
+
+infiles = $(filter-out ${NONSRCS},${SRCS}) srclist regexfile
+
+check:
+ @$(MAKE) OPTIONS='--no-members' ediff_1
+ @$(MAKE) OPTIONS='--declarations --no-members' ediff_2
+ @$(MAKE) OPTIONS='--members' ediff_3
+ @$(MAKE) OPTIONS='--regex=@regexfile --no-members' ediff_4
+ @$(MAKE) OPTIONS='nonexistent --members --declarations --regex=@regexfile' ediff_5
+ @$(MAKE) cdiff
+
+ediff%: ETAGS.good% ETAGS ${infiles}
+ diff -u --suppress-common-lines --width=80 ETAGS.good$* ETAGS
+
+cdiff: CTAGS.good CTAGS ${infiles}
+ diff -u --suppress-common-lines --width=80 CTAGS.good CTAGS
+
+ETAGS: FRC ${infiles}
+ ${RUN} ${ETAGS_PROG} ${OPTIONS} -o $@ ${ARGS}
+
+CTAGS: FRC ${infiles}
+ ${RUN} ${CTAGS_PROG} -o $@ --regex=@regexfile ${ARGS}
+
+srclist: Makefile
+ @for i in $(SRCS); do echo $$i; done > srclist
+ @echo "srclist remade"
+
+regexfile: Makefile
+ @echo ' -- This is for GNU Emacs source files' > regexfile
+ @echo '${REGEX}' >> regexfile
+ @echo '{c}${REGEX}\\1/m' >> regexfile
+ @echo "regexfile remade"
+
+.PRECIOUS: ETAGS.good CTAGS.good
+
+FRC:;
diff --git a/test/etags/a-src/empty.zz b/test/etags/a-src/empty.zz
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/test/etags/a-src/empty.zz
diff --git a/test/etags/a-src/empty.zz.gz b/test/etags/a-src/empty.zz.gz
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/test/etags/a-src/empty.zz.gz
diff --git a/test/etags/ada-src/2ataspri.adb b/test/etags/ada-src/2ataspri.adb
new file mode 100644
index 00000000000..43ca983824c
--- /dev/null
+++ b/test/etags/ada-src/2ataspri.adb
@@ -0,0 +1,665 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . T A S K _ P R I M I T I V E S --
+-- --
+-- B o d y --
+-- --
+-- $Revision: 1.1 $ --
+-- --
+-- Copyright (C) 1991,1992,1993,1994,1996 Florida State University --
+-- --
+-- GNARL is free software; you can redistribute it and/or modify it under --
+-- terms of the GNU Library General Public License as published by the --
+-- Free Software Foundation; either version 2, or (at your option) any --
+-- later version. GNARL is distributed in the hope that it will be use- --
+-- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
+-- eral Library Public License for more details. You should have received --
+-- a copy of the GNU Library General Public License along with GNARL; see --
+-- file COPYING.LIB. If not, write to the Free Software Foundation, 675 --
+-- Mass Ave, Cambridge, MA 02139, USA. --
+-- --
+------------------------------------------------------------------------------
+
+with GNAT.IO;
+with Interfaces.C.POSIX_timers;
+
+with Interfaces.C.POSIX_Error;
+use Interfaces.C.POSIX_Error;
+
+with Interfaces.C.POSIX_RTE;
+use Interfaces.C.POSIX_RTE;
+
+with Interfaces.C.Pthreads;
+use Interfaces.C.Pthreads;
+
+with Interfaces.C;
+use Interfaces.C;
+
+with System.Tasking;
+use System.Tasking;
+
+with System.Storage_Elements;
+use System.Storage_Elements;
+
+with System.Compiler_Exceptions;
+use System.Compiler_Exceptions;
+
+with System.Task_Specific_Data;
+use System.Task_Specific_Data;
+
+with System.Secondary_Stack;
+use System.Secondary_Stack;
+
+with System.Tasking_Soft_Links;
+
+with System.Task_Clock;
+use System.Task_Clock;
+
+with Unchecked_Conversion;
+with Interfaces.C.System_Constants;
+
+package body System.Task_Primitives is
+
+ use Interfaces.C.Pthreads;
+ use Interfaces.C.System_Constants;
+
+ package RTE renames Interfaces.C.POSIX_RTE;
+ package TSL renames System.Tasking_Soft_Links;
+
+ Test_And_Set_Mutex : Lock;
+
+ Abort_Signal : constant := 6;
+
+ Abort_Handler : Abort_Handler_Pointer;
+
+ ATCB_Key : aliased pthread_key_t;
+
+ Unblocked_Signal_Mask : aliased RTE.Signal_Set;
+ -- The set of signals that should be unblocked in a task.
+ -- This is in general the signals that can be generated synchronously,
+ -- and which should therefore be converted into Ada exceptions.
+ -- It also includes the Abort_Signal, to allow asynchronous abortion.
+
+ function To_void_ptr is new
+ Unchecked_Conversion (TCB_Ptr, void_ptr);
+
+ function To_TCB_Ptr is new
+ Unchecked_Conversion (void_ptr, TCB_Ptr);
+
+ function pthread_mutexattr_setprotocol
+ (attr : access pthread_attr_t; priority : integer) return int;
+ pragma Import (C,
+ pthread_mutexattr_setprotocol,
+ "pthread_mutexattr_setprotocol",
+ "pthread_mutexattr_setprotocol");
+
+ function pthread_mutexattr_setprio_ceiling
+ (attr : access pthread_attr_t; priority : int) return int;
+ pragma Import (C,
+ pthread_mutexattr_setprio_ceiling,
+ "pthread_mutexattr_setprio_ceiling",
+ "pthread_mutexattr_setprio_ceiling");
+
+ pthread_mutexattr_default : pthread_mutexattr_t;
+ pragma Import (C, pthread_mutexattr_default,
+ "pthread_mutexattr_default",
+ "pthread_mutexattr_default");
+
+ -----------------------
+ -- Local Subprograms --
+ -----------------------
+
+ procedure Abort_Wrapper
+ (signo : Integer;
+ info : RTE.siginfo_ptr;
+ context : System.Address);
+ -- This is a signal handler procedure which calls the user-specified
+ -- abort handler procedure.
+
+ procedure LL_Wrapper (T : TCB_Ptr);
+ -- A wrapper procedure that is called from a new low-level task.
+ -- It performs initializations for the new task and calls the
+ -- user-specified startup procedure.
+
+ -------------------------
+ -- Initialize_LL_Tasks --
+ -------------------------
+
+ procedure Initialize_LL_Tasks (T : TCB_Ptr) is
+ Result : int;
+ begin
+ T.LL_Entry_Point := null;
+ T.Thread := pthread_self;
+
+ Result := pthread_key_create (ATCB_Key'Access, null);
+
+ if Result = FUNC_ERR then
+ raise Storage_Error; -- Insufficient resources.
+ end if;
+
+ T.Thread := pthread_self;
+
+ Result := pthread_setspecific (ATCB_Key, To_void_ptr (T));
+
+ if Result = FUNC_ERR then
+ GNAT.IO.Put_Line ("Get specific failed");
+ raise Storage_Error; -- Insufficient resources.
+ end if;
+ pragma Assert (Result /= FUNC_ERR,
+ "GNULLI failure---pthread_setspecific");
+
+ end Initialize_LL_Tasks;
+
+ ----------
+ -- Self --
+ ----------
+
+ function Self return TCB_Ptr is
+ Temp : aliased void_ptr;
+ Result : int;
+ begin
+ Result := pthread_getspecific (ATCB_Key, Temp'Access);
+ pragma Assert (Result /= FUNC_ERR,
+ "GNULLI failure---pthread_getspecific");
+ return To_TCB_Ptr (Temp);
+ end Self;
+
+ ---------------------
+ -- Initialize_Lock --
+ ---------------------
+
+ procedure Initialize_Lock
+ (Prio : System.Any_Priority;
+ L : in out Lock)
+ is
+
+ Attributes : aliased pthread_mutexattr_t;
+ Result : int;
+ MUTEX_NONRECURSIVE_NP : constant := 2;
+
+ begin
+ Result := pthread_mutexattr_init (Attributes'Access);
+ if Result = FUNC_ERR then
+ raise STORAGE_ERROR; -- should be ENOMEM
+ end if;
+
+ Result := pthread_mutexattr_setkind
+ (Attributes'Access, MUTEX_NONRECURSIVE_NP);
+ if Result = FUNC_ERR then
+ raise STORAGE_ERROR; -- should be ENOMEM
+ end if;
+
+ Result := pthread_mutex_init (L.mutex'Access, Attributes);
+
+ if Result = FUNC_ERR then
+ Result := pthread_mutexattr_destroy (Attributes'Access);
+ raise STORAGE_ERROR; -- should be ENOMEM ???
+ end if;
+
+ Result := pthread_mutexattr_destroy (Attributes'Access);
+
+ end Initialize_Lock;
+
+ -------------------
+ -- Finalize_Lock --
+ -------------------
+
+ procedure Finalize_Lock (L : in out Lock) is
+ Result : int;
+ begin
+ Result := pthread_mutex_destroy (L.mutex'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_mutex_destroy");
+ end Finalize_Lock;
+
+ ----------------
+ -- Write_Lock --
+ ----------------
+
+ --
+ -- The current pthreads implementation does not check for Ceiling
+ -- violations.
+ --
+ procedure Write_Lock (L : in out Lock; Ceiling_Violation : out Boolean) is
+ Result : int;
+ begin
+ Ceiling_Violation := False;
+ Result := pthread_mutex_lock (L.mutex'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI FUNC_ERR---pthread_mutex_lock");
+ end Write_Lock;
+
+ ---------------
+ -- Read_Lock --
+ ---------------
+
+ procedure Read_Lock (L : in out Lock; Ceiling_Violation : out Boolean)
+ renames Write_Lock;
+
+ ------------
+ -- Unlock --
+ ------------
+
+ procedure Unlock (L : in out Lock) is
+ Result : int;
+ begin
+ Result := pthread_mutex_unlock (L.mutex'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI FUNC_ERR---pthread_mutex_unlock");
+ end Unlock;
+
+ ---------------------
+ -- Initialize_Cond --
+ ---------------------
+
+ procedure Initialize_Cond (Cond : in out Condition_Variable) is
+ Attributes : aliased Pthreads.pthread_condattr_t;
+ Result : int;
+ begin
+ Result := pthread_condattr_init (Attributes'Access);
+
+ if Result = FUNC_ERR then
+ raise STORAGE_ERROR; -- should be ENOMEM ???
+ end if;
+
+ -- Result := pthread_cond_init (Cond.CV'Access, Attributes'Access);
+ Result := pthread_cond_init (Cond.CV'Access, Attributes);
+
+
+ if Result = FUNC_ERR then
+ raise STORAGE_ERROR; -- should be ENOMEM ???
+ end if;
+
+ Result := pthread_condattr_destroy (Attributes'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI FUNC_ERR---pthread_condattr_destroy");
+
+ end Initialize_Cond;
+
+ -------------------
+ -- Finalize_Cond --
+ -------------------
+
+ procedure Finalize_Cond (Cond : in out Condition_Variable) is
+ Result : int;
+
+ begin
+ Result := pthread_cond_destroy (Cond.CV'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_destroy");
+ end Finalize_Cond;
+
+
+ ---------------
+ -- Cond_Wait --
+ ---------------
+
+ procedure Cond_Wait (Cond : in out Condition_Variable; L : in out Lock) is
+ Result : int;
+ begin
+ Result := pthread_cond_wait (Cond.CV'Access, L.mutex'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_wait");
+ end Cond_Wait;
+
+ ---------------------
+ -- Cond_Timed_Wait --
+ ---------------------
+
+ procedure Cond_Timed_Wait
+ (Cond : in out Condition_Variable;
+ L : in out Lock;
+ Abs_Time : System.Task_Clock.Stimespec;
+ Timed_Out : out Boolean) is
+
+ Result : int;
+ TV : aliased timespec;
+
+ use POSIX_Error;
+
+ begin
+ Timed_Out := False; -- Assume success until we know otherwise
+
+ TV.tv_sec := int (Interfaces.C.POSIX_timers.time_t
+ (Task_Clock.Stimespec_Seconds (Abs_Time)));
+
+ TV.tv_nsec := long (Interfaces.C.POSIX_timers.Nanoseconds
+ (Task_Clock.Stimespec_NSeconds (Abs_Time)));
+
+ Result := pthread_cond_timedwait
+ (Cond.CV'Access, L.mutex'Access, TV'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_timedwait");
+
+ end Cond_Timed_Wait;
+
+ -----------------
+ -- Cond_Signal --
+ -----------------
+
+ procedure Cond_Signal (Cond : in out Condition_Variable) is
+ Result : int;
+ begin
+ Result := pthread_cond_signal (Cond.CV'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_signal");
+ end Cond_Signal;
+
+ ------------------
+ -- Set_Priority --
+ ------------------
+
+ procedure Set_Priority
+ (T : TCB_Ptr;
+ Prio : System.Any_Priority) is
+
+ Result : int;
+ Thread : Pthreads.pthread_t renames T.Thread;
+
+ begin
+ Result := pthread_setprio (Thread, int (Prio));
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_setprio");
+ end Set_Priority;
+
+ ----------------------
+ -- Set_Own_Priority --
+ ----------------------
+
+ procedure Set_Own_Priority (Prio : System.Any_Priority) is
+ begin
+ null;
+ -- ENOSYS Result :=
+ -- pthread_setprio (pthread_self, int (Prio));
+ -- pragma Assert
+ -- (Result /= FUNC_ERR, "GNULLI failure---pthread_setprio");
+ end Set_Own_Priority;
+
+ ------------------
+ -- Get_Priority --
+ ------------------
+
+ function Get_Priority (T : TCB_Ptr) return System.Any_Priority is
+ Priority : aliased int := 0;
+ begin
+ -- ENOSYS Result := pthread_getprio (T.Thread, Priority'Access);
+ -- pragma Assert
+ -- (Result /= FUNC_ERR, "GNULLI failure---pthread_getprio");
+ return System.Priority (Priority);
+ end Get_Priority;
+
+ -----------------------
+ -- Get_Own_Priority --
+ -----------------------
+
+ function Get_Own_Priority return System.Any_Priority is
+ Result : int;
+ Priority : aliased int := 0;
+ begin
+ Result := pthread_getprio (pthread_self, Priority'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_getprio");
+ return System.Priority (Priority);
+ end Get_Own_Priority;
+
+ --------------------
+ -- Create_LL_Task --
+ --------------------
+
+ procedure Create_LL_Task
+ (Priority : System.Any_Priority;
+ Stack_Size : Task_Storage_Size;
+ Task_Info : System.Task_Info.Task_Info_Type;
+ LL_Entry_Point : LL_Task_Procedure_Access;
+ Arg : System.Address;
+ T : TCB_Ptr) is
+
+ use Pthreads;
+
+ Attributes : aliased pthread_attr_t;
+ Result : int;
+ L_Priority : System.Any_Priority := Priority;
+
+ function To_Start_Addr is new
+ Unchecked_Conversion (System.Address, start_addr);
+
+ begin
+ T.LL_Entry_Point := LL_Entry_Point;
+ T.LL_Arg := Arg;
+ T.Stack_Size := Stack_Size;
+
+ Result := pthread_attr_init (Attributes'Access);
+ pragma Assert (Result /= FUNC_ERR, "GNULLI failure---pthread_attr_init");
+
+-- Result := pthread_attr_setdetachstate (Attributes'Access, 1);
+-- pragma Assert
+-- (Result /= FUNC_ERR, "GNULLI failure---pthread_setdetachstate");
+
+ Result := pthread_attr_setstacksize
+ (Attributes'Access, size_t (Stack_Size));
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_setstacksize");
+
+ Result := pthread_attr_setinheritsched
+ (Attributes'Access, PTHREAD_DEFAULT_SCHED);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_setinheritsched");
+
+ Result := pthread_attr_setsched
+ (Attributes'Access, SCHED_FIFO);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_setinheritsched");
+
+ -- The following priority adjustment is a kludge to get around needing
+ -- root privileges to run at higher than 18 for FIFO or 19 for OTHER.
+
+ if (L_Priority > 18) then
+ L_Priority := 18;
+ elsif (L_Priority < 14) then
+ L_Priority := 14;
+ end if;
+
+ Result := pthread_attr_setprio
+ (Attributes'Access, int (L_Priority));
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_attr_setprio");
+
+ Result := pthread_create
+ (T.Thread'Access,
+ Attributes,
+ To_Start_Addr (LL_Wrapper'Address),
+ T.all'Address);
+ if Result = FUNC_ERR then
+ GNAT.IO.Put_Line ("pthread create failed");
+ raise Storage_Error;
+ end if;
+ pragma Assert (Result /= FUNC_ERR, "GNULLI failure---pthread_create");
+
+ Result := pthread_attr_destroy (Attributes'Access);
+ pragma Assert
+ (Result /= FUNC_ERR, "GNULLI failure---pthread_attr_destroy");
+
+ end Create_LL_Task;
+
+ -----------------
+ -- Exit_LL_Task --
+ ------------------
+
+ procedure Exit_LL_Task is
+ begin
+ pthread_exit (System.Null_Address);
+ end Exit_LL_Task;
+
+ ----------------
+ -- Abort_Task --
+ ----------------
+
+ procedure Abort_Task (T : TCB_Ptr) is
+ Result : int;
+ begin
+-- Result := pthread_kill (T.Thread);
+-- pragma Assert
+-- (Result /= FUNC_ERR, "GNULLI failure---pthread_kill");
+ null;
+ end Abort_Task;
+
+ ----------------
+ -- Test_Abort --
+ ----------------
+
+ -- This procedure does nothing. It is intended for systems without
+ -- asynchronous abortion, where the runtime system would have to
+ -- synchronously poll for pending abortions. This should be done
+ -- at least at every synchronization point.
+
+ procedure Test_Abort is
+ begin
+ null;
+ end Test_Abort;
+
+ ---------------------------
+ -- Install_Abort_Handler --
+ ---------------------------
+
+ procedure Install_Abort_Handler (Handler : Abort_Handler_Pointer) is
+ act : aliased RTE.struct_sigaction;
+ old_act : aliased RTE.struct_sigaction;
+ Result : POSIX_Error.Return_Code;
+ SA_SIGINFO : constant := 64;
+
+ use type POSIX_Error.Return_Code;
+
+ begin
+ Abort_Handler := Handler;
+
+ act.sa_flags := SA_SIGINFO;
+ act.sa_handler := Abort_Wrapper'Address;
+ RTE.sigemptyset (act.sa_mask'Access, Result);
+ pragma Assert (Result /= FUNC_ERR, "GNULLI failure---sigemptyset");
+
+ RTE.sigaction (Abort_Signal, act'Access, old_act'Access, Result);
+ pragma Assert (Result /= FUNC_ERR, "GNULLI failure---sigaction");
+ end Install_Abort_Handler;
+
+ -------------------
+ -- Abort_Wrapper --
+ -------------------
+
+ -- This is the handler called by the OS when an abort signal is
+ -- received; it in turn calls the handler installed by the client.
+ -- This procedure serves to isolate the client from the
+ -- implementation-specific calling conventions of asynchronous
+ -- handlers.
+
+ procedure Abort_Wrapper
+ (signo : Integer;
+ info : RTE.siginfo_ptr;
+ context : System.Address)
+ is
+ function Address_To_Call_State is new
+ Unchecked_Conversion (System.Address, Pre_Call_State);
+
+ begin
+ Abort_Handler (Address_To_Call_State (context));
+ end Abort_Wrapper;
+
+ ---------------------------
+ -- Install_Error_Handler --
+ ---------------------------
+
+ procedure Install_Error_Handler (Handler : System.Address) is
+
+ Temp : Address;
+
+ use Pthreads;
+
+ begin
+ -- Set up the soft links to tasking services used in the absence of
+ -- tasking. These replace tasking-free defaults.
+
+ Temp := TSL.Get_Jmpbuf_Address.all;
+ -- pthread_set_jumpbuf_address (Temp);
+
+ Temp := TSL.Get_Sec_Stack_Addr.all;
+ -- pthread_set_sec_stack_addr (Temp);
+
+ -- TSL.Get_Jmpbuf_Address := pthread_get_jumpbuf_address'Access;
+ -- TSL.Set_Jmpbuf_Address := pthread_set_jumpbuf_address'Access;
+ -- TSL.Get_Gnat_Exception := pthread_get_exception'Access;
+ -- TSL.Set_Gnat_Exception := pthread_set_exception'Access;
+ end Install_Error_Handler;
+
+ ---------------
+ -- LL_Assert --
+ ---------------
+
+ procedure LL_Assert (B : Boolean; M : String) is
+ begin
+ null;
+ end LL_Assert;
+
+ ----------------
+ -- LL_Wrapper --
+ ----------------
+
+ procedure LL_Wrapper (T : TCB_Ptr) is
+ Result : POSIX_Error.Return_Code;
+ Result1 : int;
+ Exc_Stack : String (1 .. 256);
+ Exc_Base : Address := Exc_Stack (Exc_Stack'Last)'Address + 1;
+ Old_Set : aliased RTE.Signal_Set;
+ begin
+ Result1 := pthread_setspecific (ATCB_Key, T.all'Address);
+
+ RTE.sigprocmask (
+ RTE.SIG_UNBLOCK, Unblocked_Signal_Mask'Access, Old_Set'Access, Result);
+ pragma Assert (
+ Result /= Failure, "GNULLI failure---sigprocmask");
+
+ -- Note that the following call may not return!
+ T.LL_Entry_Point (T.LL_Arg);
+ end LL_Wrapper;
+
+ --------------------------
+ -- Test and Set support --
+ --------------------------
+
+ procedure Initialize_TAS_Cell (Cell : out TAS_Cell) is
+ begin
+ Cell.Value := 0;
+ end Initialize_TAS_Cell;
+
+ procedure Finalize_TAS_Cell (Cell : in out TAS_Cell) is
+ begin
+ null;
+ end Finalize_TAS_Cell;
+
+ procedure Clear (Cell : in out TAS_Cell) is
+ begin
+ Cell.Value := 1;
+ end Clear;
+
+ procedure Test_And_Set (Cell : in out TAS_Cell; Result : out Boolean) is
+ Error : Boolean;
+ begin
+ Write_Lock (Test_And_Set_Mutex, Error);
+
+ if Cell.Value = 1 then
+ Result := False;
+ else
+ Result := True;
+ Cell.Value := 1;
+ end if;
+ Unlock (Test_And_Set_Mutex);
+ end Test_And_Set;
+
+ function Is_Set (Cell : in TAS_Cell) return Boolean is
+ begin
+ return Cell.Value = 1;
+ end Is_Set;
+begin
+ Initialize_Lock (System.Any_Priority'Last, Test_And_Set_Mutex);
+end System.Task_Primitives;
diff --git a/test/etags/ada-src/2ataspri.ads b/test/etags/ada-src/2ataspri.ads
new file mode 100644
index 00000000000..01c786028ab
--- /dev/null
+++ b/test/etags/ada-src/2ataspri.ads
@@ -0,0 +1,298 @@
+------------------------------------------------------------------------------
+-- --
+-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
+-- --
+-- S Y S T E M . T A S K _ P R I M I T I V E S --
+-- --
+-- S p e c --
+-- --
+-- $Revision: 1.1 $ --
+-- --
+-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University --
+-- --
+-- GNARL is free software; you can redistribute it and/or modify it under --
+-- terms of the GNU General Public License as published by the Free Soft- --
+-- ware Foundation; either version 2, or (at your option) any later ver- --
+-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
+-- for more details. You should have received a copy of the GNU General --
+-- Public License distributed with GNARL; see file COPYING. If not, write --
+-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
+-- MA 02111-1307, USA. --
+-- --
+-- As a special exception, if other files instantiate generics from this --
+-- unit, or you link this unit with other files to produce an executable, --
+-- this unit does not by itself cause the resulting executable to be --
+-- covered by the GNU General Public License. This exception does not --
+-- however invalidate any other reasons why the executable file might be --
+-- covered by the GNU Public License. --
+-- --
+-- GNARL was developed by the GNARL team at Florida State University. It is --
+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
+-- State University (http://www.gnat.com). --
+-- --
+------------------------------------------------------------------------------
+
+with Interfaces.C;
+-- Used for Size_t;
+
+with Interfaces.C.Pthreads;
+-- Used for, size_t,
+-- pthread_mutex_t,
+-- pthread_cond_t,
+-- pthread_t
+
+with Interfaces.C.POSIX_RTE;
+-- Used for, Signal,
+-- siginfo_ptr,
+
+with System.Task_Clock;
+-- Used for, Stimespec
+
+with Unchecked_Conversion;
+
+pragma Elaborate_All (Interfaces.C.Pthreads);
+
+with System.Task_Info;
+package System.Task_Primitives is
+
+ -- Low level Task size and state definition
+
+ type LL_Task_Procedure_Access is access procedure (Arg : System.Address);
+
+ type Pre_Call_State is new System.Address;
+
+ type Task_Storage_Size is new Interfaces.C.size_t;
+
+ type Machine_Exceptions is new Interfaces.C.POSIX_RTE.Signal;
+
+ type Error_Information is new Interfaces.C.POSIX_RTE.siginfo_ptr;
+
+ type Lock is private;
+ type Condition_Variable is private;
+
+ -- The above types should both be limited. They are not due to a hack in
+ -- ATCB allocation which allocates a block of the correct size and then
+ -- assigns an initialized ATCB to it. This won't work with limited types.
+ -- When allocation is done with new, these can become limited once again.
+ -- ???
+
+ type Task_Control_Block is record
+ LL_Entry_Point : LL_Task_Procedure_Access;
+ LL_Arg : System.Address;
+ Thread : aliased Interfaces.C.Pthreads.pthread_t;
+ Stack_Size : Task_Storage_Size;
+ Stack_Limit : System.Address;
+ end record;
+
+ type TCB_Ptr is access all Task_Control_Block;
+
+ -- Task ATCB related and variables.
+
+ function Address_To_TCB_Ptr is new
+ Unchecked_Conversion (System.Address, TCB_Ptr);
+
+ procedure Initialize_LL_Tasks (T : TCB_Ptr);
+ -- Initialize GNULLI. T points to the Task Control Block that should
+ -- be initialized for use by the environment task.
+
+ function Self return TCB_Ptr;
+ -- Return a pointer to the Task Control Block of the calling task.
+
+ procedure Initialize_Lock (Prio : System.Any_Priority; L : in out Lock);
+ -- Initialize a lock object. Prio is the ceiling priority associated
+ -- with the lock.
+
+ procedure Finalize_Lock (L : in out Lock);
+ -- Finalize a lock object, freeing any resources allocated by the
+ -- corresponding Initialize_Lock.
+
+ procedure Write_Lock (L : in out Lock; Ceiling_Violation : out Boolean);
+ pragma Inline (Write_Lock);
+ -- Lock a lock object for write access to a critical section. After
+ -- this operation returns, the calling task owns the lock, and
+ -- no other Write_Lock or Read_Lock operation on the same object will
+ -- return the owner executes an Unlock operation on the same object.
+
+ procedure Read_Lock (L : in out Lock; Ceiling_Violation : out Boolean);
+ pragma Inline (Read_Lock);
+ -- Lock a lock object for read access to a critical section. After
+ -- this operation returns, the calling task owns the lock, and
+ -- no other Write_Lock operation on the same object will return until
+ -- the owner(s) execute Unlock operation(s) on the same object.
+ -- A Read_Lock to an owned lock object may return while the lock is
+ -- still owned, though an implementation may also implement
+ -- Read_Lock to have the same semantics.
+
+ procedure Unlock (L : in out Lock);
+ pragma Inline (Unlock);
+ -- Unlock a locked lock object. The results are undefined if the
+ -- calling task does not own the lock. Lock/Unlock operations must
+ -- be nested, that is, the argument to Unlock must be the object
+ -- most recently locked.
+
+ procedure Initialize_Cond (Cond : in out Condition_Variable);
+ -- Initialize a condition variable object.
+
+ procedure Finalize_Cond (Cond : in out Condition_Variable);
+ -- Finalize a condition variable object, recovering any resources
+ -- allocated for it by Initialize_Cond.
+
+ procedure Cond_Wait (Cond : in out Condition_Variable; L : in out Lock);
+ pragma Inline (Cond_Wait);
+ -- Wait on a condition variable. The mutex object L is unlocked
+ -- atomically, such that another task that is able to lock the mutex
+ -- can be assured that the wait has actually commenced, and that
+ -- a Cond_Signal operation will cause the waiting task to become
+ -- eligible for execution once again. Before Cond_Wait returns,
+ -- the waiting task will again lock the mutex. The waiting task may become
+ -- eligible for execution at any time, but will become eligible for
+ -- execution when a Cond_Signal operation is performed on the
+ -- same condition variable object. The effect of more than one
+ -- task waiting on the same condition variable is unspecified.
+
+ procedure Cond_Timed_Wait
+ (Cond : in out Condition_Variable;
+ L : in out Lock; Abs_Time : System.Task_Clock.Stimespec;
+ Timed_Out : out Boolean);
+ pragma Inline (Cond_Timed_Wait);
+ -- Wait on a condition variable, as for Cond_Wait, above. In addition,
+ -- the waiting task will become eligible for execution again
+ -- when the absolute time specified by Timed_Out arrives.
+
+ procedure Cond_Signal (Cond : in out Condition_Variable);
+ pragma Inline (Cond_Signal);
+ -- Wake up a task waiting on the condition variable object specified
+ -- by Cond, making it eligible for execution once again.
+
+ procedure Set_Priority (T : TCB_Ptr; Prio : System.Any_Priority);
+ pragma Inline (Set_Priority);
+ -- Set the priority of the task specified by T to P.
+
+ procedure Set_Own_Priority (Prio : System.Any_Priority);
+ pragma Inline (Set_Own_Priority);
+ -- Set the priority of the calling task to P.
+
+ function Get_Priority (T : TCB_Ptr) return System.Any_Priority;
+ pragma Inline (Get_Priority);
+ -- Return the priority of the task specified by T.
+
+ function Get_Own_Priority return System.Any_Priority;
+ pragma Inline (Get_Own_Priority);
+ -- Return the priority of the calling task.
+
+ procedure Create_LL_Task
+ (Priority : System.Any_Priority;
+ Stack_Size : Task_Storage_Size;
+ Task_Info : System.Task_Info.Task_Info_Type;
+ LL_Entry_Point : LL_Task_Procedure_Access;
+ Arg : System.Address;
+ T : TCB_Ptr);
+ -- Create a new low-level task with priority Priority. A new thread
+ -- of control is created with a stack size of at least Stack_Size,
+ -- and the procedure LL_Entry_Point is called with the argument Arg
+ -- from this new thread of control. The Task Control Block pointed
+ -- to by T is initialized to refer to this new task.
+
+ procedure Exit_LL_Task;
+ -- Exit a low-level task. The resources allocated for the task
+ -- by Create_LL_Task are recovered. The task no longer executes, and
+ -- the effects of further operations on task are unspecified.
+
+ procedure Abort_Task (T : TCB_Ptr);
+ -- Abort the task specified by T (the target task). This causes
+ -- the target task to asynchronously execute the handler procedure
+ -- installed by the target task using Install_Abort_Handler. The
+ -- effect of this operation is unspecified if there is no abort
+ -- handler procedure for the target task.
+
+ procedure Test_Abort;
+ -- ??? Obsolete? This is intended to allow implementation of
+ -- abortion and ATC in the absence of an asynchronous Abort_Task,
+ -- but I think that we decided that GNARL can handle this on
+ -- its own by making sure that there is an Undefer_Abortion at
+ -- every abortion synchronization point.
+
+ type Abort_Handler_Pointer is access procedure (Context : Pre_Call_State);
+
+ procedure Install_Abort_Handler (Handler : Abort_Handler_Pointer);
+ -- Install an abort handler procedure. This procedure is called
+ -- asynchronously by the calling task whenever a call to Abort_Task
+ -- specifies the calling task as the target. If the abort handler
+ -- procedure is asynchronously executed during a GNULLI operation
+ -- and then calls some other GNULLI operation, the effect is unspecified.
+
+ procedure Install_Error_Handler (Handler : System.Address);
+ -- Install an error handler for the calling task. The handler will
+ -- be called synchronously if an error is encountered during the
+ -- execution of the calling task.
+
+ procedure LL_Assert (B : Boolean; M : String);
+ -- If B is False, print the string M to the console and halt the
+ -- program.
+
+ Task_Wrapper_Frame : constant Integer := 72;
+ -- This is the size of the frame for the Pthread_Wrapper procedure.
+
+ type Proc is access procedure (Addr : System.Address);
+
+
+ -- Test and Set support
+ type TAS_Cell is private;
+ -- On some systems we can not assume that an arbitrary memory location
+ -- can be used in an atomic test and set instruction (e.g. on some
+ -- multiprocessor machines, only memory regions are cache interlocked).
+ -- TAS_Cell is private to facilitate adaption to a variety of
+ -- implementations.
+
+ procedure Initialize_TAS_Cell (Cell : out TAS_Cell);
+ pragma Inline (Initialize_TAS_Cell);
+ -- Initialize a Test And Set Cell. On some targets this will allocate
+ -- a system-level lock object from a special pool. For most systems,
+ -- this is a nop.
+
+ procedure Finalize_TAS_Cell (Cell : in out TAS_Cell);
+ pragma Inline (Finalize_TAS_Cell);
+ -- Finalize a Test and Set cell, freeing any resources allocated by the
+ -- corresponding Initialize_TAS_Cell.
+
+ procedure Clear (Cell : in out TAS_Cell);
+ pragma Inline (Clear);
+ -- Set the state of the named TAS_Cell such that a subsequent call to
+ -- Is_Set will return False. This operation must be atomic with
+ -- respect to the Is_Set and Test_And_Set operations for the same
+ -- cell.
+
+ procedure Test_And_Set (Cell : in out TAS_Cell; Result : out Boolean);
+ pragma Inline (Test_And_Set);
+ -- Modify the state of the named TAS_Cell such that a subsequent call
+ -- to Is_Set will return True. Result is set to True if Is_Set
+ -- was False prior to the call, False otherwise. This operation must
+ -- be atomic with respect to the Clear and Is_Set operations for the
+ -- same cell.
+
+ function Is_Set (Cell : in TAS_Cell) return Boolean;
+ pragma Inline (Is_Set);
+ -- Returns the current value of the named TAS_Cell. This operation
+ -- must be atomic with respect to the Clear and Test_And_Set operations
+ -- for the same cell.
+
+private
+
+ type Lock is
+ record
+ mutex : aliased Interfaces.C.Pthreads.pthread_mutex_t;
+ end record;
+
+ type Condition_Variable is
+ record
+ CV : aliased Interfaces.C.Pthreads.pthread_cond_t;
+ end record;
+
+ type TAS_Cell is
+ record
+ Value : aliased Interfaces.C.unsigned := 0;
+ end record;
+
+end System.Task_Primitives;
diff --git a/test/etags/ada-src/etags-test-for.ada b/test/etags/ada-src/etags-test-for.ada
new file mode 100644
index 00000000000..09e5a1ec9bf
--- /dev/null
+++ b/test/etags/ada-src/etags-test-for.ada
@@ -0,0 +1,193 @@
+ type LL_Task_Procedure_Access is access procedure (Arg : System.Address);
+
+ function Body_Required
+ (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (False
+ or else NT (N).Nkind = N_Compilation_Unit);
+ return Flag13 (N);
+ end Body_Required;
+
+ type Type_Specific_Data is record
+ Idepth : Natural;
+ Expanded_Name : Cstring_Ptr;
+ External_Tag : Cstring_Ptr;
+ HT_Link : Tag;
+ Ancestor_Tags : Tag_Table (Natural);
+ end record;
+
+ function "abs" (Right : Complex) return Real'Base renames Modulus;
+
+ type Barrier_Function_Pointer is access
+ function
+ (O : System.Address;
+ E : Protected_Entry_Index)
+ return Boolean;
+
+ function "=" (L, R : System.Address) return Boolean
+ renames System."=";
+
+ type usfreelock_ptr is access
+ procedure (lock : ulock_t; arena : usptr_t_ptr);
+
+ function p pragma Import (C,
+ "pthread_mutexattr_setprio_ceiling",
+ "pthread_mutexattr_setprio_ceiling");
+ pragma Import ()
+ procedure LL_Wrapper (T : TCB_Ptr);
+
+function p ("p");
+
+-- This file is an Ada file containing test data
+-- for etags (Ada83 and Ada95 support).
+
+package Pkg1 is
+
+ type Private_T is private;
+
+ package Inner1 is
+ procedure Private_T;
+ end Inner1;
+
+ package Inner2 is
+ task Private_T;
+ end Inner2;
+
+ type Public_T is
+ record
+ A : Integer;
+ B : Integer;
+ end record;
+
+ procedure Pkg1_Proc1;
+
+ procedure Pkg1_Proc2 (I : Integer);
+
+ function Pkg1_Func1 return Boolean;
+
+ function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural;
+
+
+ package Pkg1_Pkg1 is
+ procedure Pkg1_Pkg1_Proc1;
+ end Pkg1_Pkg1;
+
+ task type Task_Type is
+ entry Entry1;
+ entry Entry2 (I : Integer);
+ end;
+
+private
+
+ type Private_T is
+ record
+ Z : Integer;
+ W : Boolean;
+ end record;
+end Pkg1;
+
+package body Pkg1 is
+
+ procedure Pkg1_Proc1 is
+ begin
+ null;
+ end;
+
+ package body Inner1 is
+ procedure Private_T is
+ begin
+ null;
+ end;
+ end Inner1;
+
+ package body Inner2 is
+ task body Private_T is
+ begin
+ loop
+ null;
+ end loop;
+ end;
+ end Inner2;
+
+ task body Task_Type is
+ begin
+ select
+ accept Entry1 do
+ null;
+ end;
+ or
+ accept Entry2 (I : Integer) do
+ null;
+ end;
+ end select;
+ end;
+
+
+ procedure Pkg1_Proc2 (I : Integer) is
+ begin
+ null;
+ end Pkg1_Proc2;
+
+
+ function Pkg1_Func1 return Boolean is separate;
+
+ function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural is
+ begin
+ return 1;
+ end;
+
+
+ package body Pkg1_Pkg1 is separate;
+
+
+end Pkg1;
+
+separate (Pkg1)
+package body Pkg1_Pkg1 is
+ procedure Pkg1_Pkg1_Proc1 is
+ begin
+ null;
+ end;
+end Pkg1_Pkg1;
+
+
+separate (Pkg1)
+function Pkg1_Func1 return Boolean is
+begin
+ return False;
+end;
+
+
+-- from now on, this is Ada 95 specific.
+package Truc is
+ I : Integer;
+end Truc;
+
+package Truc.Bidule is
+
+ protected Bidule is
+ entry Basar;
+ end Bidule;
+
+ protected type Machin_T is
+ entry Truc;
+ end Machin_T;
+
+end Truc.Bidule;
+
+package body Truc.Bidule is
+ protected body Bidule is
+ entry Basar is
+ begin
+ null;
+ end;
+ end Bidule;
+
+ protected Machin_T is
+ entry Truc is
+ begin
+ null;
+ end;
+ end Machin_T;
+
+end Truc.Bidule;
diff --git a/test/etags/ada-src/waroquiers.ada b/test/etags/ada-src/waroquiers.ada
new file mode 100644
index 00000000000..316120998f8
--- /dev/null
+++ b/test/etags/ada-src/waroquiers.ada
@@ -0,0 +1,153 @@
+-- This file is an Ada file containing test data
+-- for etags (Ada83 and Ada95 support).
+package Pkg1 is
+
+ type Private_T is private;
+
+ package Inner1 is
+ procedure Private_T;
+ end Inner1;
+
+ package Inner2 is
+ task Private_T;
+ end Inner2;
+
+ type Public_T is
+ record
+ A : Integer;
+ B : Integer;
+ end record;
+
+ procedure Pkg1_Proc1;
+
+ procedure Pkg1_Proc2 (I : Integer);
+
+ function Pkg1_Func1 return Boolean;
+
+ function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural;
+
+
+ package Pkg1_Pkg1 is
+ procedure Pkg1_Pkg1_Proc1;
+ end Pkg1_Pkg1;
+
+ task type Task_Type is
+ entry Entry1;
+ entry Entry2 (I : Integer);
+ end;
+private
+
+ type Private_T is
+ record
+ Z : Integer;
+ W : Boolean;
+ end record;
+end Pkg1;
+package body Pkg1 is
+
+ procedure Pkg1_Proc1 is
+ begin
+ null;
+ end;
+
+ package body Inner1 is
+ procedure Private_T is
+ begin
+ null;
+ end;
+ end Inner1;
+
+ package body Inner2 is
+ task body Private_T is
+ begin
+ loop
+ null;
+ end loop;
+ end;
+ end Inner2;
+ task body Task_Type is
+ begin
+ select
+ accept Entry1 do
+ null;
+ end;
+ or
+ accept Entry2 (I : Integer) do
+ null;
+ end;
+ end select;
+ end;
+
+
+ procedure Pkg1_Proc2 (I : Integer) is
+ begin
+ null;
+ end Pkg1_Proc2;
+
+
+ function Pkg1_Func1 return Boolean is separate;
+
+ function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural is
+ begin
+ return 1;
+ end;
+
+
+ package body Pkg1_Pkg1 is separate;
+
+end Pkg1;
+separate (Pkg1)
+package body Pkg1_Pkg1 is
+ procedure Pkg1_Pkg1_Proc1 is
+ begin
+ null;
+ end;
+end Pkg1_Pkg1;
+separate (Pkg1)
+function Pkg1_Func1 return Boolean is
+begin
+ return False;
+end;
+-- from now on, this is Ada 95 specific.
+package Truc is
+ I : Integer;
+end Truc;
+with Pkg1;
+package Truc.Bidule is
+ use type Pkg1.Public_T;
+ use Pkg1;
+ use
+ type Pkg1.Public_T;
+ use -- comment
+ type -- comment
+ Pkg1.Public_T;
+
+ protected Bidule is
+ entry Basar;
+ private
+ Ok : Boolean;
+ end Bidule;
+
+ protected type Machin_T is
+ entry Truc;
+ private
+ Ok : Boolean;
+ end Machin_T;
+
+end Truc.Bidule;
+package body Truc.Bidule is
+ protected body Bidule is
+ entry Basar when Ok is
+ begin
+ null;
+ end;
+ end Bidule;
+
+ protected body Machin_T is
+ entry Truc when Ok is
+ begin
+ null;
+ end;
+ end Machin_T;
+
+end Truc.Bidule;
diff --git a/test/etags/c-src/a/b/b.c b/test/etags/c-src/a/b/b.c
new file mode 100644
index 00000000000..ee3c97c2456
--- /dev/null
+++ b/test/etags/c-src/a/b/b.c
@@ -0,0 +1,5 @@
+#define this that
+
+#line 33 "../c/c.web"
+
+#define questo quello
diff --git a/test/etags/c-src/abbrev.c b/test/etags/c-src/abbrev.c
new file mode 100644
index 00000000000..f30986db343
--- /dev/null
+++ b/test/etags/c-src/abbrev.c
@@ -0,0 +1,616 @@
+/* Primitives for word-abbrev mode.
+ Copyright (C) 1985, 1986, 1993, 1996, 1998 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+
+#include <config.h>
+#include <stdio.h>
+#include "lisp.h"
+#include "commands.h"
+#include "buffer.h"
+#include "window.h"
+#include "charset.h"
+#include "syntax.h"
+
+/* An abbrev table is an obarray.
+ Each defined abbrev is represented by a symbol in that obarray
+ whose print name is the abbreviation.
+ The symbol's value is a string which is the expansion.
+ If its function definition is non-nil, it is called
+ after the expansion is done.
+ The plist slot of the abbrev symbol is its usage count. */
+
+/* List of all abbrev-table name symbols:
+ symbols whose values are abbrev tables. */
+
+Lisp_Object Vabbrev_table_name_list;
+
+/* The table of global abbrevs. These are in effect
+ in any buffer in which abbrev mode is turned on. */
+
+Lisp_Object Vglobal_abbrev_table;
+
+/* The local abbrev table used by default (in Fundamental Mode buffers) */
+
+Lisp_Object Vfundamental_mode_abbrev_table;
+
+/* Set nonzero when an abbrev definition is changed */
+
+int abbrevs_changed;
+
+int abbrev_all_caps;
+
+/* Non-nil => use this location as the start of abbrev to expand
+ (rather than taking the word before point as the abbrev) */
+
+Lisp_Object Vabbrev_start_location;
+
+/* Buffer that Vabbrev_start_location applies to */
+Lisp_Object Vabbrev_start_location_buffer;
+
+/* The symbol representing the abbrev most recently expanded */
+
+Lisp_Object Vlast_abbrev;
+
+/* A string for the actual text of the abbrev most recently expanded.
+ This has more info than Vlast_abbrev since case is significant. */
+
+Lisp_Object Vlast_abbrev_text;
+
+/* Character address of start of last abbrev expanded */
+
+int last_abbrev_point;
+
+/* Hook to run before expanding any abbrev. */
+
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
+
+DEFUN ("make-abbrev-table", Fmake_abbrev_table, Smake_abbrev_table, 0, 0, 0,
+ "Create a new, empty abbrev table object.")
+ ()
+{
+ return Fmake_vector (make_number (59), make_number (0));
+}
+
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table, Sclear_abbrev_table, 1, 1, 0,
+ "Undefine all abbrevs in abbrev table TABLE, leaving it empty.")
+ (table)
+ Lisp_Object table;
+{
+ int i, size;
+
+ CHECK_VECTOR (table, 0);
+ size = XVECTOR (table)->size;
+ abbrevs_changed = 1;
+ for (i = 0; i < size; i++)
+ XVECTOR (table)->contents[i] = make_number (0);
+ return Qnil;
+}
+
+DEFUN ("define-abbrev", Fdefine_abbrev, Sdefine_abbrev, 3, 5, 0,
+ "Define an abbrev in TABLE named NAME, to expand to EXPANSION and call HOOK.\n\
+NAME must be a string.\n\
+EXPANSION should usually be a string.\n\
+To undefine an abbrev, define it with EXPANSION = nil.\n\
+If HOOK is non-nil, it should be a function of no arguments;\n\
+it is called after EXPANSION is inserted.\n\
+If EXPANSION is not a string, the abbrev is a special one,\n\
+ which does not expand in the usual way but only runs HOOK.\n\
+COUNT, if specified, initializes the abbrev's usage-count\n\
+which is incremented each time the abbrev is used.")
+ (table, name, expansion, hook, count)
+ Lisp_Object table, name, expansion, hook, count;
+{
+ Lisp_Object sym, oexp, ohook, tem;
+ CHECK_VECTOR (table, 0);
+ CHECK_STRING (name, 1);
+
+ if (NILP (count))
+ count = make_number (0);
+ else
+ CHECK_NUMBER (count, 0);
+
+ sym = Fintern (name, table);
+
+ oexp = XSYMBOL (sym)->value;
+ ohook = XSYMBOL (sym)->function;
+ if (!((EQ (oexp, expansion)
+ || (STRINGP (oexp) && STRINGP (expansion)
+ && (tem = Fstring_equal (oexp, expansion), !NILP (tem))))
+ &&
+ (EQ (ohook, hook)
+ || (tem = Fequal (ohook, hook), !NILP (tem)))))
+ abbrevs_changed = 1;
+
+ Fset (sym, expansion);
+ Ffset (sym, hook);
+ Fsetplist (sym, count);
+
+ return name;
+}
+
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev, Sdefine_global_abbrev, 2, 2,
+ "sDefine global abbrev: \nsExpansion for %s: ",
+ "Define ABBREV as a global abbreviation for EXPANSION.")
+ (abbrev, expansion)
+ Lisp_Object abbrev, expansion;
+{
+ Fdefine_abbrev (Vglobal_abbrev_table, Fdowncase (abbrev),
+ expansion, Qnil, make_number (0));
+ return abbrev;
+}
+
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev, Sdefine_mode_abbrev, 2, 2,
+ "sDefine mode abbrev: \nsExpansion for %s: ",
+ "Define ABBREV as a mode-specific abbreviation for EXPANSION.")
+ (abbrev, expansion)
+ Lisp_Object abbrev, expansion;
+{
+ if (NILP (current_buffer->abbrev_table))
+ error ("Major mode has no abbrev table");
+
+ Fdefine_abbrev (current_buffer->abbrev_table, Fdowncase (abbrev),
+ expansion, Qnil, make_number (0));
+ return abbrev;
+}
+
+DEFUN ("abbrev-symbol", Fabbrev_symbol, Sabbrev_symbol, 1, 2, 0,
+ "Return the symbol representing abbrev named ABBREV.\n\
+This symbol's name is ABBREV, but it is not the canonical symbol of that name;\n\
+it is interned in an abbrev-table rather than the normal obarray.\n\
+The value is nil if that abbrev is not defined.\n\
+Optional second arg TABLE is abbrev table to look it up in.\n\
+The default is to try buffer's mode-specific abbrev table, then global table.")
+ (abbrev, table)
+ Lisp_Object abbrev, table;
+{
+ Lisp_Object sym;
+ CHECK_STRING (abbrev, 0);
+ if (!NILP (table))
+ sym = Fintern_soft (abbrev, table);
+ else
+ {
+ sym = Qnil;
+ if (!NILP (current_buffer->abbrev_table))
+ sym = Fintern_soft (abbrev, current_buffer->abbrev_table);
+ if (NILP (XSYMBOL (sym)->value))
+ sym = Qnil;
+ if (NILP (sym))
+ sym = Fintern_soft (abbrev, Vglobal_abbrev_table);
+ }
+ if (NILP (XSYMBOL (sym)->value)) return Qnil;
+ return sym;
+}
+
+DEFUN ("abbrev-expansion", Fabbrev_expansion, Sabbrev_expansion, 1, 2, 0,
+ "Return the string that ABBREV expands into in the current buffer.\n\
+Optionally specify an abbrev table as second arg;\n\
+then ABBREV is looked up in that table only.")
+ (abbrev, table)
+ Lisp_Object abbrev, table;
+{
+ Lisp_Object sym;
+ sym = Fabbrev_symbol (abbrev, table);
+ if (NILP (sym)) return sym;
+ return Fsymbol_value (sym);
+}
+
+/* Expand the word before point, if it is an abbrev.
+ Returns 1 if an expansion is done. */
+
+DEFUN ("expand-abbrev", Fexpand_abbrev, Sexpand_abbrev, 0, 0, "",
+ "Expand the abbrev before point, if there is an abbrev there.\n\
+Effective when explicitly called even when `abbrev-mode' is nil.\n\
+Returns the abbrev symbol, if expansion took place.")
+ ()
+{
+ register char *buffer, *p;
+ int wordstart, wordend;
+ register int wordstart_byte, wordend_byte, idx;
+ int whitecnt;
+ int uccount = 0, lccount = 0;
+ register Lisp_Object sym;
+ Lisp_Object expansion, hook, tem;
+ Lisp_Object value;
+
+ value = Qnil;
+
+ if (!NILP (Vrun_hooks))
+ call1 (Vrun_hooks, Qpre_abbrev_expand_hook);
+
+ wordstart = 0;
+ if (!(BUFFERP (Vabbrev_start_location_buffer)
+ && XBUFFER (Vabbrev_start_location_buffer) == current_buffer))
+ Vabbrev_start_location = Qnil;
+ if (!NILP (Vabbrev_start_location))
+ {
+ tem = Vabbrev_start_location;
+ CHECK_NUMBER_COERCE_MARKER (tem, 0);
+ wordstart = XINT (tem);
+ Vabbrev_start_location = Qnil;
+ if (wordstart < BEGV || wordstart > ZV)
+ wordstart = 0;
+ if (wordstart && wordstart != ZV)
+ {
+ wordstart_byte = CHAR_TO_BYTE (wordstart);
+ if (FETCH_BYTE (wordstart_byte) == '-')
+ del_range (wordstart, wordstart + 1);
+ }
+ }
+ if (!wordstart)
+ wordstart = scan_words (PT, -1);
+
+ if (!wordstart)
+ return value;
+
+ wordstart_byte = CHAR_TO_BYTE (wordstart);
+ wordend = scan_words (wordstart, 1);
+ if (!wordend)
+ return value;
+
+ if (wordend > PT)
+ wordend = PT;
+
+ wordend_byte = CHAR_TO_BYTE (wordend);
+ whitecnt = PT - wordend;
+ if (wordend <= wordstart)
+ return value;
+
+ p = buffer = (char *) alloca (wordend_byte - wordstart_byte);
+
+ for (idx = wordstart_byte; idx < wordend_byte; idx++)
+ {
+ /* ??? This loop needs to go by characters! */
+ register int c = FETCH_BYTE (idx);
+ if (UPPERCASEP (c))
+ c = DOWNCASE (c), uccount++;
+ else if (! NOCASEP (c))
+ lccount++;
+ *p++ = c;
+ }
+
+ if (VECTORP (current_buffer->abbrev_table))
+ sym = oblookup (current_buffer->abbrev_table, buffer,
+ wordend - wordstart, wordend_byte - wordstart_byte);
+ else
+ XSETFASTINT (sym, 0);
+ if (INTEGERP (sym) || NILP (XSYMBOL (sym)->value))
+ sym = oblookup (Vglobal_abbrev_table, buffer,
+ wordend - wordstart, wordend_byte - wordstart_byte);
+ if (INTEGERP (sym) || NILP (XSYMBOL (sym)->value))
+ return value;
+
+ if (INTERACTIVE && !EQ (minibuf_window, selected_window))
+ {
+ /* Add an undo boundary, in case we are doing this for
+ a self-inserting command which has avoided making one so far. */
+ SET_PT (wordend);
+ Fundo_boundary ();
+ }
+
+ Vlast_abbrev_text
+ = Fbuffer_substring (make_number (wordstart), make_number (wordend));
+
+ /* Now sym is the abbrev symbol. */
+ Vlast_abbrev = sym;
+ value = sym;
+ last_abbrev_point = wordstart;
+
+ if (INTEGERP (XSYMBOL (sym)->plist))
+ XSETINT (XSYMBOL (sym)->plist,
+ XINT (XSYMBOL (sym)->plist) + 1); /* Increment use count */
+
+ /* If this abbrev has an expansion, delete the abbrev
+ and insert the expansion. */
+ expansion = XSYMBOL (sym)->value;
+ if (STRINGP (expansion))
+ {
+ SET_PT (wordstart);
+
+ del_range_both (wordstart, wordstart_byte, wordend, wordend_byte, 1);
+
+ insert_from_string (expansion, 0, 0, XSTRING (expansion)->size,
+ STRING_BYTES (XSTRING (expansion)), 1);
+ SET_PT (PT + whitecnt);
+
+ if (uccount && !lccount)
+ {
+ /* Abbrev was all caps */
+ /* If expansion is multiple words, normally capitalize each word */
+ /* This used to be if (!... && ... >= ...) Fcapitalize; else Fupcase
+ but Megatest 68000 compiler can't handle that */
+ if (!abbrev_all_caps)
+ if (scan_words (PT, -1) > scan_words (wordstart, 1))
+ {
+ Fupcase_initials_region (make_number (wordstart),
+ make_number (PT));
+ goto caped;
+ }
+ /* If expansion is one word, or if user says so, upcase it all. */
+ Fupcase_region (make_number (wordstart), make_number (PT));
+ caped: ;
+ }
+ else if (uccount)
+ {
+ /* Abbrev included some caps. Cap first initial of expansion */
+ int pos = wordstart_byte;
+
+ /* Find the initial. */
+ while (pos < PT_BYTE
+ && SYNTAX (*BUF_BYTE_ADDRESS (current_buffer, pos)) != Sword)
+ pos++;
+
+ /* Change just that. */
+ pos = BYTE_TO_CHAR (pos);
+ Fupcase_initials_region (make_number (pos), make_number (pos + 1));
+ }
+ }
+
+ hook = XSYMBOL (sym)->function;
+ if (!NILP (hook))
+ {
+ Lisp_Object expanded, prop;
+
+ /* If the abbrev has a hook function, run it. */
+ expanded = call0 (hook);
+
+ /* In addition, if the hook function is a symbol with a a
+ non-nil `no-self-insert' property, let the value it returned
+ specify whether we consider that an expansion took place. If
+ it returns nil, no expansion has been done. */
+
+ if (SYMBOLP (hook)
+ && NILP (expanded)
+ && (prop = Fget (hook, intern ("no-self-insert")),
+ !NILP (prop)))
+ value = Qnil;
+ }
+
+ return value;
+}
+
+DEFUN ("unexpand-abbrev", Funexpand_abbrev, Sunexpand_abbrev, 0, 0, "",
+ "Undo the expansion of the last abbrev that expanded.\n\
+This differs from ordinary undo in that other editing done since then\n\
+is not undone.")
+ ()
+{
+ int opoint = PT;
+ int adjust = 0;
+ if (last_abbrev_point < BEGV
+ || last_abbrev_point > ZV)
+ return Qnil;
+ SET_PT (last_abbrev_point);
+ if (STRINGP (Vlast_abbrev_text))
+ {
+ /* This isn't correct if Vlast_abbrev->function was used
+ to do the expansion */
+ Lisp_Object val;
+ int zv_before;
+
+ val = XSYMBOL (Vlast_abbrev)->value;
+ if (!STRINGP (val))
+ error ("value of abbrev-symbol must be a string");
+ zv_before = ZV;
+ del_range_byte (PT_BYTE, PT_BYTE + STRING_BYTES (XSTRING (val)), 1);
+ /* Don't inherit properties here; just copy from old contents. */
+ insert_from_string (Vlast_abbrev_text, 0, 0,
+ XSTRING (Vlast_abbrev_text)->size,
+ STRING_BYTES (XSTRING (Vlast_abbrev_text)), 0);
+ Vlast_abbrev_text = Qnil;
+ /* Total number of characters deleted. */
+ adjust = ZV - zv_before;
+ }
+ SET_PT (last_abbrev_point < opoint ? opoint + adjust : opoint);
+ return Qnil;
+}
+
+static void
+write_abbrev (sym, stream)
+ Lisp_Object sym, stream;
+{
+ Lisp_Object name;
+ if (NILP (XSYMBOL (sym)->value))
+ return;
+ insert (" (", 5);
+ XSETSTRING (name, XSYMBOL (sym)->name);
+ Fprin1 (name, stream);
+ insert (" ", 1);
+ Fprin1 (XSYMBOL (sym)->value, stream);
+ insert (" ", 1);
+ Fprin1 (XSYMBOL (sym)->function, stream);
+ insert (" ", 1);
+ Fprin1 (XSYMBOL (sym)->plist, stream);
+ insert (")\n", 2);
+}
+
+static void
+describe_abbrev (sym, stream)
+ Lisp_Object sym, stream;
+{
+ Lisp_Object one;
+
+ if (NILP (XSYMBOL (sym)->value))
+ return;
+ one = make_number (1);
+ Fprin1 (Fsymbol_name (sym), stream);
+ Findent_to (make_number (15), one);
+ Fprin1 (XSYMBOL (sym)->plist, stream);
+ Findent_to (make_number (20), one);
+ Fprin1 (XSYMBOL (sym)->value, stream);
+ if (!NILP (XSYMBOL (sym)->function))
+ {
+ Findent_to (make_number (45), one);
+ Fprin1 (XSYMBOL (sym)->function, stream);
+ }
+ Fterpri (stream);
+}
+
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,
+ Sinsert_abbrev_table_description, 1, 2, 0,
+ "Insert before point a full description of abbrev table named NAME.\n\
+NAME is a symbol whose value is an abbrev table.\n\
+If optional 2nd arg READABLE is non-nil, a human-readable description\n\
+is inserted. Otherwise the description is an expression,\n\
+a call to `define-abbrev-table', which would\n\
+define the abbrev table NAME exactly as it is currently defined.")
+ (name, readable)
+ Lisp_Object name, readable;
+{
+ Lisp_Object table;
+ Lisp_Object stream;
+
+ CHECK_SYMBOL (name, 0);
+ table = Fsymbol_value (name);
+ CHECK_VECTOR (table, 0);
+
+ XSETBUFFER (stream, current_buffer);
+
+ if (!NILP (readable))
+ {
+ insert_string ("(");
+ Fprin1 (name, stream);
+ insert_string (")\n\n");
+ map_obarray (table, describe_abbrev, stream);
+ insert_string ("\n\n");
+ }
+ else
+ {
+ insert_string ("(define-abbrev-table '");
+ Fprin1 (name, stream);
+ insert_string (" '(\n");
+ map_obarray (table, write_abbrev, stream);
+ insert_string (" ))\n\n");
+ }
+
+ return Qnil;
+}
+
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table, Sdefine_abbrev_table,
+ 2, 2, 0,
+ "Define TABLENAME (a symbol) as an abbrev table name.\n\
+Define abbrevs in it according to DEFINITIONS, which is a list of elements\n\
+of the form (ABBREVNAME EXPANSION HOOK USECOUNT).")
+ (tablename, definitions)
+ Lisp_Object tablename, definitions;
+{
+ Lisp_Object name, exp, hook, count;
+ Lisp_Object table, elt;
+
+ CHECK_SYMBOL (tablename, 0);
+ table = Fboundp (tablename);
+ if (NILP (table) || (table = Fsymbol_value (tablename), NILP (table)))
+ {
+ table = Fmake_abbrev_table ();
+ Fset (tablename, table);
+ Vabbrev_table_name_list = Fcons (tablename, Vabbrev_table_name_list);
+ }
+ CHECK_VECTOR (table, 0);
+
+ for (; !NILP (definitions); definitions = Fcdr (definitions))
+ {
+ elt = Fcar (definitions);
+ name = Fcar (elt); elt = Fcdr (elt);
+ exp = Fcar (elt); elt = Fcdr (elt);
+ hook = Fcar (elt); elt = Fcdr (elt);
+ count = Fcar (elt);
+ Fdefine_abbrev (table, name, exp, hook, count);
+ }
+ return Qnil;
+}
+
+void
+syms_of_abbrev ()
+{
+ DEFVAR_LISP ("abbrev-table-name-list", &Vabbrev_table_name_list,
+ "List of symbols whose values are abbrev tables.");
+ Vabbrev_table_name_list = Fcons (intern ("fundamental-mode-abbrev-table"),
+ Fcons (intern ("global-abbrev-table"),
+ Qnil));
+
+ DEFVAR_LISP ("global-abbrev-table", &Vglobal_abbrev_table,
+ "The abbrev table whose abbrevs affect all buffers.\n\
+Each buffer may also have a local abbrev table.\n\
+If it does, the local table overrides the global one\n\
+for any particular abbrev defined in both.");
+ Vglobal_abbrev_table = Fmake_abbrev_table ();
+
+ DEFVAR_LISP ("fundamental-mode-abbrev-table", &Vfundamental_mode_abbrev_table,
+ "The abbrev table of mode-specific abbrevs for Fundamental Mode.");
+ Vfundamental_mode_abbrev_table = Fmake_abbrev_table ();
+ current_buffer->abbrev_table = Vfundamental_mode_abbrev_table;
+ buffer_defaults.abbrev_table = Vfundamental_mode_abbrev_table;
+
+ DEFVAR_LISP ("last-abbrev", &Vlast_abbrev,
+ "The abbrev-symbol of the last abbrev expanded. See `abbrev-symbol'.");
+
+ DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_text,
+ "The exact text of the last abbrev expanded.\n\
+nil if the abbrev has already been unexpanded.");
+
+ DEFVAR_INT ("last-abbrev-location", &last_abbrev_point,
+ "The location of the start of the last abbrev expanded.");
+
+ Vlast_abbrev = Qnil;
+ Vlast_abbrev_text = Qnil;
+ last_abbrev_point = 0;
+
+ DEFVAR_LISP ("abbrev-start-location", &Vabbrev_start_location,
+ "Buffer position for `expand-abbrev' to use as the start of the abbrev.\n\
+nil means use the word before point as the abbrev.\n\
+Calling `expand-abbrev' sets this to nil.");
+ Vabbrev_start_location = Qnil;
+
+ DEFVAR_LISP ("abbrev-start-location-buffer", &Vabbrev_start_location_buffer,
+ "Buffer that `abbrev-start-location' has been set for.\n\
+Trying to expand an abbrev in any other buffer clears `abbrev-start-location'.");
+ Vabbrev_start_location_buffer = Qnil;
+
+ DEFVAR_PER_BUFFER ("local-abbrev-table", &current_buffer->abbrev_table, Qnil,
+ "Local (mode-specific) abbrev table of current buffer.");
+
+ DEFVAR_BOOL ("abbrevs-changed", &abbrevs_changed,
+ "Set non-nil by defining or altering any word abbrevs.\n\
+This causes `save-some-buffers' to offer to save the abbrevs.");
+ abbrevs_changed = 0;
+
+ DEFVAR_BOOL ("abbrev-all-caps", &abbrev_all_caps,
+ "*Set non-nil means expand multi-word abbrevs all caps if abbrev was so.");
+ abbrev_all_caps = 0;
+
+ DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abbrev_expand_hook,
+ "Function or functions to be called before abbrev expansion is done.\n\
+This is the first thing that `expand-abbrev' does, and so this may change\n\
+the current abbrev table before abbrev lookup happens.");
+ Vpre_abbrev_expand_hook = Qnil;
+ Qpre_abbrev_expand_hook = intern ("pre-abbrev-expand-hook");
+ staticpro (&Qpre_abbrev_expand_hook);
+
+ defsubr (&Smake_abbrev_table);
+ defsubr (&Sclear_abbrev_table);
+ defsubr (&Sdefine_abbrev);
+ defsubr (&Sdefine_global_abbrev);
+ defsubr (&Sdefine_mode_abbrev);
+ defsubr (&Sabbrev_expansion);
+ defsubr (&Sabbrev_symbol);
+ defsubr (&Sexpand_abbrev);
+ defsubr (&Sunexpand_abbrev);
+ defsubr (&Sinsert_abbrev_table_description);
+ defsubr (&Sdefine_abbrev_table);
+}
diff --git a/test/etags/c-src/c.c b/test/etags/c-src/c.c
new file mode 100644
index 00000000000..77c8929afb2
--- /dev/null
+++ b/test/etags/c-src/c.c
@@ -0,0 +1,169 @@
+T f(){if(x){}
+}T i;
+
+// The next two functions must be kept together
+void bar() {while(0) {}}
+int foobar() {;}
+
+struct interface *
+interface_locate(void)
+{ return 0; }
+
+#line 123 "c.c"
+// 7.4: string literal in #line directive shall be a character string
+// literal.
+//E t_6_062.cpp(21): warning: ill formed #line directive: 123 L"wide"
+#line 123 L"wide.c"
+#line 123 L"wide.c"
+#line 123L"wide.c"
+
+
+void (*fa) (void);
+void (__attribute__((noreturn)) *fb) (void);
+
+extern int
+my_printf (void *my_object, const char *my_format, ...)
+ __attribute__ ((format (printf, 2, 3)));
+
+void fatala () __attribute__ ((noreturn));
+void fatalb ();
+
+max (int a, int b)
+{ if (a > b) return a; else return b; }
+struct bar {
+ char z;
+ struct foo f;
+};
+__attribute__ ((always_inline)) max (int a, int b)
+{ if (a > b) return a; else return b }
+extern int old_var __attribute__ ((deprecated));
+struct foo
+{
+ char a;
+ int x[2] __attribute__ ((packed));
+};
+char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
+struct S { short f[3]; } __attribute__ ((aligned (8)));
+typedef union
+{
+ int *__ip;
+ union wait *__up;
+} wait_status_ptr_t __attribute__ ((__transparent_union__));
+Some_Class A __attribute__ ((init_priority (2000)));
+typedef T1 T3 __attribute__ ((deprecated));
+T3 z __attribute__ ((deprecated));
+typedef int more_aligned_int __attribute__ ((aligned (8)));
+struct S __attribute__ ((vector_size (16))) foo;
+int foo __attribute__ ((vector_size (16)));
+char *__attribute__((aligned(8))) *f;
+int i __attribute__ ((visibility ("hidden")));
+extern void foobar (void) __attribute__ ((section ("bar")));
+
+typedef struct cacheLRUEntry_s
+{
+ U16 next;
+ U16 prev;
+}
+__attribute__ ((packed)) cacheLRUEntry_t;
+struct foo {
+ int x;
+ char a, b, c, d;
+} __attribute__((packed));
+void __attribute__ ((visibility ("protected")))
+ f1 () { /* Do something. */; }
+void f2 () { /* Do something. */; }
+__attribute__((noreturn)) void d0 (void),
+ __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
+ d2 (void);
+int x __attribute__ ((aligned (16))) = 0;
+struct foo { int x[2] __attribute__ ((aligned (8))); };
+short array[3] __attribute__ ((aligned));
+
+asm(" section 10");
+int f
+ () {}
+
+DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
+ "name.")
+ (name, defalt)
+ Lisp_Object name, defalt;
+{
+ unsigned char *nm;
+}
+XDEFUN ("x-get-selection-internal", Fx_get_selection_internal,
+ Sx_get_selection_internal, 2, 2, 0, "")
+{}
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
+ Sx_get_selection_internal, 2, 2, 0, "")
+{}
+/* The next two are not tagged correctly. To prevent this, the code in
+ Emacs should contain the two first args of DEFUN on the same line. */
+DEFUN ("x-get-selection-internal",
+ Fx_get_selection_internal, Sx_get_selection_internal, 2, 2, 0, "")
+{}
+DEFUN
+ ("y-get-selection-internal",
+ Fy_get_selection_internal, Sy_get_selection_internal, 2, 2, 0, "")
+{}
+defun_func1()
+{}
+DEFUN_func2()
+{}
+typedef int bool;
+bool funcboo ()
+{}
+static void (*lang_func) () = NULL;
+struct my_struct {
+};
+typedef struct my_struct my_typedef;
+int bla ()
+{
+ PrkList ExistingOperations =
+ ProcedureOperationSelections(PrkNull, CalledFromDomain);
+}
+a()
+ b c;
+{}
+int func1
+ (a,b,c,d) {};
+static struct cca_control init_control = { 0 };
+static tpcmd rbtp [RB_TPSZ];
+static byte ring1 [(RBUFNO + 1) + 8];
+static byte ring2 [(RBUFNO + 1) * sizeof (struct le_md) + 8];
+request request (a, b)
+{
+}
+int func2 (a,b
+ c,d) {};
+int wrongfunc
+ aaa;
+struct wrongstruct
+ bbb;
+struct sss1 {};
+struct sss2
+{
+ struct ss3
+ {
+ };
+};
+struct a b;
+struct aa *b;
+struct aaa
+ **b;
+caccacacca (a,b,c,d,e,f,g)
+ struct aa *b;
+{
+}
+a ()
+{
+ typedef struct aa {} aaa;
+}
+static void inita () {}
+node *lasta = NULL;
+b ()
+{
+ typedef int bb;
+}
+static void initb () {}
+node *lastb = NULL;
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;
diff --git a/test/etags/c-src/dostorture.c b/test/etags/c-src/dostorture.c
new file mode 100644
index 00000000000..5190734e0fe
--- /dev/null
+++ b/test/etags/c-src/dostorture.c
@@ -0,0 +1,107 @@
+/* Date: Thu, 05 Aug 1993 20:28:03 +0200
+ From: "Tom R.Hageman" <tom@basil.icce.rug.nl>
+ Subject: more etags torture;-) [etags 7.3 patch#3]
+ To: pot@CNUCE.CNR.IT
+
+ Hi,
+
+ This test file illustrates some more problems with etags (7.3):
+
+
+ 1. parentheses are confusing,
+ 2. preprocessor directives can disrupt other state machines. */
+
+/* A small torture test for etags. */
+
+/* The classic parenthesis nightmare, based on signal(). */
+void
+(*tag1 (sig, handler)) ()
+ int sig;
+ void (*handler) ();
+{
+ (*handler)(sig);
+ return handler;
+}
+
+#define notag2 void
+/* The classic, with user-defined return type. */
+notag2
+(*tag2 (sig, handler)) ()
+ int sig;
+ void (*handler) ();
+{
+ (*handler)(sig);
+ return handler;
+}
+
+/* The classic, in ANSI C style. */
+void
+(*tag3 (int sig, void (*handler) (int))) (int)
+{
+ (*handler)(sig);
+ return handler;
+}
+
+#define notag4 void
+/* The classic, with user-defined return type, in ANSI C style. */
+notag4
+(*tag4 (int sig, void (*handler) (int))) (int)
+{
+ (*handler)(sig);
+ return handler;
+}
+
+
+/* A less tortuous example. */
+void
+tag5 (handler, arg)
+void (*handler)();
+void *arg;
+{
+ (*handler)(arg);
+}
+
+/* A less tortuous example, in ANSI C style. */
+void
+tag6 (void (*handler) (void *), void *arg)
+{
+ (*handler)(arg);
+}
+
+
+/* Interfering preprocessing torture */
+
+int pp1(
+#if (__STDC__)
+ int
+#endif
+ bar)
+#if (!__STDC__)
+ int bar;
+#endif
+{
+ return bar;
+}
+
+int
+pp2
+#if __STDC__
+ (int bar)
+#else
+ (bar)
+ int bar;
+#endif
+{
+ return bar;
+}
+
+int
+#if __STDC__
+pp3(int bar)
+#else
+pp3(bar)
+ int bar;
+#endif
+{
+ return bar;
+}
diff --git a/test/etags/c-src/emacs/src/gmalloc.c b/test/etags/c-src/emacs/src/gmalloc.c
new file mode 100644
index 00000000000..a88f4ab75e0
--- /dev/null
+++ b/test/etags/c-src/emacs/src/gmalloc.c
@@ -0,0 +1,2040 @@
+/* Declarations for `malloc' and friends.
+ Copyright (C) 1990-1993, 1995-1996, 1999, 2002-2007, 2013-2015 Free
+ Software Foundation, Inc.
+ Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include <config.h>
+
+#if defined HAVE_PTHREAD && !defined HYBRID_MALLOC
+#define USE_PTHREAD
+#endif
+
+#include <string.h>
+#include <limits.h>
+#include <stdint.h>
+
+#ifdef HYBRID_GET_CURRENT_DIR_NAME
+#undef get_current_dir_name
+#endif
+
+#include <unistd.h>
+
+#ifdef USE_PTHREAD
+#include <pthread.h>
+#endif
+
+#ifdef WINDOWSNT
+#include <w32heap.h> /* for sbrk */
+#endif
+
+#ifdef emacs
+extern void emacs_abort (void);
+#endif
+
+/* If HYBRID_MALLOC is defined, then temacs will use malloc,
+ realloc... as defined in this file (and renamed gmalloc,
+ grealloc... via the macros that follow). The dumped emacs,
+ however, will use the system malloc, realloc.... In other source
+ files, malloc, realloc... are renamed hybrid_malloc,
+ hybrid_realloc... via macros in conf_post.h. hybrid_malloc and
+ friends are wrapper functions defined later in this file.
+ aligned_alloc is defined as a macro only in alloc.c.
+
+ As of this writing (August 2014), Cygwin is the only platform on
+ which HYBRID_MACRO is defined. Any other platform that wants to
+ define it will have to define the macros DUMPED and
+ ALLOCATED_BEFORE_DUMPING, defined below for Cygwin. */
+#ifdef HYBRID_MALLOC
+#undef malloc
+#undef realloc
+#undef calloc
+#undef free
+#define malloc gmalloc
+#define realloc grealloc
+#define calloc gcalloc
+#define aligned_alloc galigned_alloc
+#define free gfree
+#endif /* HYBRID_MALLOC */
+
+#ifdef CYGWIN
+extern void *bss_sbrk (ptrdiff_t size);
+extern int bss_sbrk_did_unexec;
+extern char bss_sbrk_buffer[];
+extern void *bss_sbrk_buffer_end;
+#define DUMPED bss_sbrk_did_unexec
+#define ALLOCATED_BEFORE_DUMPING(P) \
+ ((P) < bss_sbrk_buffer_end && (P) >= (void *) bss_sbrk_buffer)
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stddef.h>
+
+
+/* Allocate SIZE bytes of memory. */
+extern void *malloc (size_t size) ATTRIBUTE_MALLOC_SIZE ((1));
+/* Re-allocate the previously allocated block
+ in ptr, making the new block SIZE bytes long. */
+extern void *realloc (void *ptr, size_t size) ATTRIBUTE_ALLOC_SIZE ((2));
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */
+extern void *calloc (size_t nmemb, size_t size) ATTRIBUTE_MALLOC_SIZE ((1,2));
+/* Free a block allocated by `malloc', `realloc' or `calloc'. */
+extern void free (void *ptr);
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes. */
+#ifdef MSDOS
+extern void *aligned_alloc (size_t, size_t);
+extern void *memalign (size_t, size_t);
+extern int posix_memalign (void **, size_t, size_t);
+#endif
+
+#ifdef USE_PTHREAD
+/* Set up mutexes and make malloc etc. thread-safe. */
+extern void malloc_enable_thread (void);
+#endif
+
+#ifdef emacs
+extern void emacs_abort (void);
+#endif
+
+/* The allocator divides the heap into blocks of fixed size; large
+ requests receive one or more whole blocks, and small requests
+ receive a fragment of a block. Fragment sizes are powers of two,
+ and all fragments of a block are the same size. When all the
+ fragments in a block have been freed, the block itself is freed. */
+#define INT_BIT (CHAR_BIT * sizeof (int))
+#define BLOCKLOG (INT_BIT > 16 ? 12 : 9)
+#define BLOCKSIZE (1 << BLOCKLOG)
+#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* Determine the amount of memory spanned by the initial heap table
+ (not an absolute limit). */
+#define HEAP (INT_BIT > 16 ? 4194304 : 65536)
+
+/* Number of contiguous free blocks allowed to build up at the end of
+ memory before they will be returned to the system. */
+#define FINAL_FREE_BLOCKS 8
+
+/* Data structure giving per-block information. */
+typedef union
+ {
+ /* Heap information for a busy block. */
+ struct
+ {
+ /* Zero for a large (multiblock) object, or positive giving the
+ logarithm to the base two of the fragment size. */
+ int type;
+ union
+ {
+ struct
+ {
+ size_t nfree; /* Free frags in a fragmented block. */
+ size_t first; /* First free fragment of the block. */
+ } frag;
+ /* For a large object, in its first block, this has the number
+ of blocks in the object. In the other blocks, this has a
+ negative number which says how far back the first block is. */
+ ptrdiff_t size;
+ } info;
+ } busy;
+ /* Heap information for a free block
+ (that may be the first of a free cluster). */
+ struct
+ {
+ size_t size; /* Size (in blocks) of a free cluster. */
+ size_t next; /* Index of next free cluster. */
+ size_t prev; /* Index of previous free cluster. */
+ } free;
+ } malloc_info;
+
+/* Pointer to first block of the heap. */
+extern char *_heapbase;
+
+/* Table indexed by block number giving per-block information. */
+extern malloc_info *_heapinfo;
+
+/* Address to block number and vice versa. */
+#define BLOCK(A) (((char *) (A) - _heapbase) / BLOCKSIZE + 1)
+#define ADDRESS(B) ((void *) (((B) - 1) * BLOCKSIZE + _heapbase))
+
+/* Current search index for the heap table. */
+extern size_t _heapindex;
+
+/* Limit of valid info table indices. */
+extern size_t _heaplimit;
+
+/* Doubly linked lists of free fragments. */
+struct list
+ {
+ struct list *next;
+ struct list *prev;
+ };
+
+/* Free list headers for each fragment size. */
+extern struct list _fraghead[];
+
+/* List of blocks allocated with aligned_alloc and friends. */
+struct alignlist
+ {
+ struct alignlist *next;
+ void *aligned; /* The address that aligned_alloc returned. */
+ void *exact; /* The address that malloc returned. */
+ };
+extern struct alignlist *_aligned_blocks;
+
+/* Instrumentation. */
+extern size_t _chunks_used;
+extern size_t _bytes_used;
+extern size_t _chunks_free;
+extern size_t _bytes_free;
+
+/* Internal versions of `malloc', `realloc', and `free'
+ used when these functions need to call each other.
+ They are the same but don't call the hooks. */
+extern void *_malloc_internal (size_t);
+extern void *_realloc_internal (void *, size_t);
+extern void _free_internal (void *);
+extern void *_malloc_internal_nolock (size_t);
+extern void *_realloc_internal_nolock (void *, size_t);
+extern void _free_internal_nolock (void *);
+
+#ifdef USE_PTHREAD
+extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;
+extern int _malloc_thread_enabled_p;
+#define LOCK() \
+ do { \
+ if (_malloc_thread_enabled_p) \
+ pthread_mutex_lock (&_malloc_mutex); \
+ } while (0)
+#define UNLOCK() \
+ do { \
+ if (_malloc_thread_enabled_p) \
+ pthread_mutex_unlock (&_malloc_mutex); \
+ } while (0)
+#define LOCK_ALIGNED_BLOCKS() \
+ do { \
+ if (_malloc_thread_enabled_p) \
+ pthread_mutex_lock (&_aligned_blocks_mutex); \
+ } while (0)
+#define UNLOCK_ALIGNED_BLOCKS() \
+ do { \
+ if (_malloc_thread_enabled_p) \
+ pthread_mutex_unlock (&_aligned_blocks_mutex); \
+ } while (0)
+#else
+#define LOCK()
+#define UNLOCK()
+#define LOCK_ALIGNED_BLOCKS()
+#define UNLOCK_ALIGNED_BLOCKS()
+#endif
+
+/* Given an address in the middle of a malloc'd object,
+ return the address of the beginning of the object. */
+extern void *malloc_find_object_address (void *ptr);
+
+/* Underlying allocation function; successive calls should
+ return contiguous pieces of memory. */
+extern void *(*__morecore) (ptrdiff_t size);
+
+/* Default value of `__morecore'. */
+extern void *__default_morecore (ptrdiff_t size);
+
+/* If not NULL, this function is called after each time
+ `__morecore' is called to increase the data size. */
+extern void (*__after_morecore_hook) (void);
+
+/* Number of extra blocks to get each time we ask for more core.
+ This reduces the frequency of calling `(*__morecore)'. */
+extern size_t __malloc_extra_blocks;
+
+/* Nonzero if `malloc' has been called and done its initialization. */
+extern int __malloc_initialized;
+/* Function called to initialize malloc data structures. */
+extern int __malloc_initialize (void);
+
+/* Hooks for debugging versions. */
+extern void (*__malloc_initialize_hook) (void);
+extern void (*__free_hook) (void *ptr);
+extern void *(*__malloc_hook) (size_t size);
+extern void *(*__realloc_hook) (void *ptr, size_t size);
+extern void *(*__memalign_hook) (size_t size, size_t alignment);
+
+/* Return values for `mprobe': these are the kinds of inconsistencies that
+ `mcheck' enables detection of. */
+enum mcheck_status
+ {
+ MCHECK_DISABLED = -1, /* Consistency checking is not turned on. */
+ MCHECK_OK, /* Block is fine. */
+ MCHECK_FREE, /* Block freed twice. */
+ MCHECK_HEAD, /* Memory before the block was clobbered. */
+ MCHECK_TAIL /* Memory after the block was clobbered. */
+ };
+
+/* Activate a standard collection of debugging hooks. This must be called
+ before `malloc' is ever called. ABORTFUNC is called with an error code
+ (see enum above) when an inconsistency is detected. If ABORTFUNC is
+ null, the standard function prints on stderr and then calls `abort'. */
+extern int mcheck (void (*abortfunc) (enum mcheck_status));
+
+/* Check for aberrations in a particular malloc'd block. You must have
+ called `mcheck' already. These are the same checks that `mcheck' does
+ when you free or reallocate a block. */
+extern enum mcheck_status mprobe (void *ptr);
+
+/* Activate a standard collection of tracing hooks. */
+extern void mtrace (void);
+extern void muntrace (void);
+
+/* Statistics available to the user. */
+struct mstats
+ {
+ size_t bytes_total; /* Total size of the heap. */
+ size_t chunks_used; /* Chunks allocated by the user. */
+ size_t bytes_used; /* Byte total of user-allocated chunks. */
+ size_t chunks_free; /* Chunks in the free list. */
+ size_t bytes_free; /* Byte total of chunks in the free list. */
+ };
+
+/* Pick up the current statistics. */
+extern struct mstats mstats (void);
+
+/* Call WARNFUN with a warning message when memory usage is high. */
+extern void memory_warnings (void *start, void (*warnfun) (const char *));
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Memory allocator `malloc'.
+ Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include <errno.h>
+
+void *(*__morecore) (ptrdiff_t size) = __default_morecore;
+
+/* Debugging hook for `malloc'. */
+void *(*__malloc_hook) (size_t size);
+
+/* Pointer to the base of the first block. */
+char *_heapbase;
+
+/* Block information table. Allocated with align/__free (not malloc/free). */
+malloc_info *_heapinfo;
+
+/* Number of info entries. */
+static size_t heapsize;
+
+/* Search index in the info table. */
+size_t _heapindex;
+
+/* Limit of valid info table indices. */
+size_t _heaplimit;
+
+/* Free lists for each fragment size. */
+struct list _fraghead[BLOCKLOG];
+
+/* Instrumentation. */
+size_t _chunks_used;
+size_t _bytes_used;
+size_t _chunks_free;
+size_t _bytes_free;
+
+/* Are you experienced? */
+int __malloc_initialized;
+
+size_t __malloc_extra_blocks;
+
+void (*__malloc_initialize_hook) (void);
+void (*__after_morecore_hook) (void);
+
+#if defined GC_MALLOC_CHECK && defined GC_PROTECT_MALLOC_STATE
+
+/* Some code for hunting a bug writing into _heapinfo.
+
+ Call this macro with argument PROT non-zero to protect internal
+ malloc state against writing to it, call it with a zero argument to
+ make it readable and writable.
+
+ Note that this only works if BLOCKSIZE == page size, which is
+ the case on the i386. */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+static int state_protected_p;
+static size_t last_state_size;
+static malloc_info *last_heapinfo;
+
+void
+protect_malloc_state (int protect_p)
+{
+ /* If _heapinfo has been relocated, make sure its old location
+ isn't left read-only; it will be reused by malloc. */
+ if (_heapinfo != last_heapinfo
+ && last_heapinfo
+ && state_protected_p)
+ mprotect (last_heapinfo, last_state_size, PROT_READ | PROT_WRITE);
+
+ last_state_size = _heaplimit * sizeof *_heapinfo;
+ last_heapinfo = _heapinfo;
+
+ if (protect_p != state_protected_p)
+ {
+ state_protected_p = protect_p;
+ if (mprotect (_heapinfo, last_state_size,
+ protect_p ? PROT_READ : PROT_READ | PROT_WRITE) != 0)
+ abort ();
+ }
+}
+
+#define PROTECT_MALLOC_STATE(PROT) protect_malloc_state (PROT)
+
+#else
+#define PROTECT_MALLOC_STATE(PROT) /* empty */
+#endif
+
+
+/* Aligned allocation. */
+static void *
+align (size_t size)
+{
+ void *result;
+ ptrdiff_t adj;
+
+ /* align accepts an unsigned argument, but __morecore accepts a
+ signed one. This could lead to trouble if SIZE overflows the
+ ptrdiff_t type accepted by __morecore. We just punt in that
+ case, since they are requesting a ludicrous amount anyway. */
+ if (PTRDIFF_MAX < size)
+ result = 0;
+ else
+ result = (*__morecore) (size);
+ adj = (uintptr_t) result % BLOCKSIZE;
+ if (adj != 0)
+ {
+ adj = BLOCKSIZE - adj;
+ (*__morecore) (adj);
+ result = (char *) result + adj;
+ }
+
+ if (__after_morecore_hook)
+ (*__after_morecore_hook) ();
+
+ return result;
+}
+
+/* Get SIZE bytes, if we can get them starting at END.
+ Return the address of the space we got.
+ If we cannot get space at END, fail and return 0. */
+static void *
+get_contiguous_space (ptrdiff_t size, void *position)
+{
+ void *before;
+ void *after;
+
+ before = (*__morecore) (0);
+ /* If we can tell in advance that the break is at the wrong place,
+ fail now. */
+ if (before != position)
+ return 0;
+
+ /* Allocate SIZE bytes and get the address of them. */
+ after = (*__morecore) (size);
+ if (!after)
+ return 0;
+
+ /* It was not contiguous--reject it. */
+ if (after != position)
+ {
+ (*__morecore) (- size);
+ return 0;
+ }
+
+ return after;
+}
+
+
+/* This is called when `_heapinfo' and `heapsize' have just
+ been set to describe a new info table. Set up the table
+ to describe itself and account for it in the statistics. */
+static void
+register_heapinfo (void)
+{
+ size_t block, blocks;
+
+ block = BLOCK (_heapinfo);
+ blocks = BLOCKIFY (heapsize * sizeof (malloc_info));
+
+ /* Account for the _heapinfo block itself in the statistics. */
+ _bytes_used += blocks * BLOCKSIZE;
+ ++_chunks_used;
+
+ /* Describe the heapinfo block itself in the heapinfo. */
+ _heapinfo[block].busy.type = 0;
+ _heapinfo[block].busy.info.size = blocks;
+ /* Leave back-pointers for malloc_find_address. */
+ while (--blocks > 0)
+ _heapinfo[block + blocks].busy.info.size = -blocks;
+}
+
+#ifdef USE_PTHREAD
+pthread_mutex_t _malloc_mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t _aligned_blocks_mutex = PTHREAD_MUTEX_INITIALIZER;
+int _malloc_thread_enabled_p;
+
+static void
+malloc_atfork_handler_prepare (void)
+{
+ LOCK ();
+ LOCK_ALIGNED_BLOCKS ();
+}
+
+static void
+malloc_atfork_handler_parent (void)
+{
+ UNLOCK_ALIGNED_BLOCKS ();
+ UNLOCK ();
+}
+
+static void
+malloc_atfork_handler_child (void)
+{
+ UNLOCK_ALIGNED_BLOCKS ();
+ UNLOCK ();
+}
+
+/* Set up mutexes and make malloc etc. thread-safe. */
+void
+malloc_enable_thread (void)
+{
+ if (_malloc_thread_enabled_p)
+ return;
+
+ /* Some pthread implementations call malloc for statically
+ initialized mutexes when they are used first. To avoid such a
+ situation, we initialize mutexes here while their use is
+ disabled in malloc etc. */
+ pthread_mutex_init (&_malloc_mutex, NULL);
+ pthread_mutex_init (&_aligned_blocks_mutex, NULL);
+ pthread_atfork (malloc_atfork_handler_prepare,
+ malloc_atfork_handler_parent,
+ malloc_atfork_handler_child);
+ _malloc_thread_enabled_p = 1;
+}
+#endif /* USE_PTHREAD */
+
+static void
+malloc_initialize_1 (void)
+{
+#ifdef GC_MCHECK
+ mcheck (NULL);
+#endif
+
+ if (__malloc_initialize_hook)
+ (*__malloc_initialize_hook) ();
+
+ heapsize = HEAP / BLOCKSIZE;
+ _heapinfo = align (heapsize * sizeof (malloc_info));
+ if (_heapinfo == NULL)
+ return;
+ memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
+ _heapinfo[0].free.size = 0;
+ _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
+ _heapindex = 0;
+ _heapbase = (char *) _heapinfo;
+ _heaplimit = BLOCK (_heapbase + heapsize * sizeof (malloc_info));
+
+ register_heapinfo ();
+
+ __malloc_initialized = 1;
+ PROTECT_MALLOC_STATE (1);
+ return;
+}
+
+/* Set everything up and remember that we have.
+ main will call malloc which calls this function. That is before any threads
+ or signal handlers has been set up, so we don't need thread protection. */
+int
+__malloc_initialize (void)
+{
+ if (__malloc_initialized)
+ return 0;
+
+ malloc_initialize_1 ();
+
+ return __malloc_initialized;
+}
+
+static int morecore_recursing;
+
+/* Get neatly aligned memory, initializing or
+ growing the heap info table as necessary. */
+static void *
+morecore_nolock (size_t size)
+{
+ void *result;
+ malloc_info *newinfo, *oldinfo;
+ size_t newsize;
+
+ if (morecore_recursing)
+ /* Avoid recursion. The caller will know how to handle a null return. */
+ return NULL;
+
+ result = align (size);
+ if (result == NULL)
+ return NULL;
+
+ PROTECT_MALLOC_STATE (0);
+
+ /* Check if we need to grow the info table. */
+ if ((size_t) BLOCK ((char *) result + size) > heapsize)
+ {
+ /* Calculate the new _heapinfo table size. We do not account for the
+ added blocks in the table itself, as we hope to place them in
+ existing free space, which is already covered by part of the
+ existing table. */
+ newsize = heapsize;
+ do
+ newsize *= 2;
+ while ((size_t) BLOCK ((char *) result + size) > newsize);
+
+ /* We must not reuse existing core for the new info table when called
+ from realloc in the case of growing a large block, because the
+ block being grown is momentarily marked as free. In this case
+ _heaplimit is zero so we know not to reuse space for internal
+ allocation. */
+ if (_heaplimit != 0)
+ {
+ /* First try to allocate the new info table in core we already
+ have, in the usual way using realloc. If realloc cannot
+ extend it in place or relocate it to existing sufficient core,
+ we will get called again, and the code above will notice the
+ `morecore_recursing' flag and return null. */
+ int save = errno; /* Don't want to clobber errno with ENOMEM. */
+ morecore_recursing = 1;
+ newinfo = _realloc_internal_nolock (_heapinfo,
+ newsize * sizeof (malloc_info));
+ morecore_recursing = 0;
+ if (newinfo == NULL)
+ errno = save;
+ else
+ {
+ /* We found some space in core, and realloc has put the old
+ table's blocks on the free list. Now zero the new part
+ of the table and install the new table location. */
+ memset (&newinfo[heapsize], 0,
+ (newsize - heapsize) * sizeof (malloc_info));
+ _heapinfo = newinfo;
+ heapsize = newsize;
+ goto got_heap;
+ }
+ }
+
+ /* Allocate new space for the malloc info table. */
+ while (1)
+ {
+ newinfo = align (newsize * sizeof (malloc_info));
+
+ /* Did it fail? */
+ if (newinfo == NULL)
+ {
+ (*__morecore) (-size);
+ return NULL;
+ }
+
+ /* Is it big enough to record status for its own space?
+ If so, we win. */
+ if ((size_t) BLOCK ((char *) newinfo
+ + newsize * sizeof (malloc_info))
+ < newsize)
+ break;
+
+ /* Must try again. First give back most of what we just got. */
+ (*__morecore) (- newsize * sizeof (malloc_info));
+ newsize *= 2;
+ }
+
+ /* Copy the old table to the beginning of the new,
+ and zero the rest of the new table. */
+ memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
+ memset (&newinfo[heapsize], 0,
+ (newsize - heapsize) * sizeof (malloc_info));
+ oldinfo = _heapinfo;
+ _heapinfo = newinfo;
+ heapsize = newsize;
+
+ register_heapinfo ();
+
+ /* Reset _heaplimit so _free_internal never decides
+ it can relocate or resize the info table. */
+ _heaplimit = 0;
+ _free_internal_nolock (oldinfo);
+ PROTECT_MALLOC_STATE (0);
+
+ /* The new heap limit includes the new table just allocated. */
+ _heaplimit = BLOCK ((char *) newinfo + heapsize * sizeof (malloc_info));
+ return result;
+ }
+
+ got_heap:
+ _heaplimit = BLOCK ((char *) result + size);
+ return result;
+}
+
+/* Allocate memory from the heap. */
+void *
+_malloc_internal_nolock (size_t size)
+{
+ void *result;
+ size_t block, blocks, lastblocks, start;
+ register size_t i;
+ struct list *next;
+
+ /* ANSI C allows `malloc (0)' to either return NULL, or to return a
+ valid address you can realloc and free (though not dereference).
+
+ It turns out that some extant code (sunrpc, at least Ultrix's version)
+ expects `malloc (0)' to return non-NULL and breaks otherwise.
+ Be compatible. */
+
+#if 0
+ if (size == 0)
+ return NULL;
+#endif
+
+ PROTECT_MALLOC_STATE (0);
+
+ if (size < sizeof (struct list))
+ size = sizeof (struct list);
+
+ /* Determine the allocation policy based on the request size. */
+ if (size <= BLOCKSIZE / 2)
+ {
+ /* Small allocation to receive a fragment of a block.
+ Determine the logarithm to base two of the fragment size. */
+ register size_t log = 1;
+ --size;
+ while ((size /= 2) != 0)
+ ++log;
+
+ /* Look in the fragment lists for a
+ free fragment of the desired size. */
+ next = _fraghead[log].next;
+ if (next != NULL)
+ {
+ /* There are free fragments of this size.
+ Pop a fragment out of the fragment list and return it.
+ Update the block's nfree and first counters. */
+ result = next;
+ next->prev->next = next->next;
+ if (next->next != NULL)
+ next->next->prev = next->prev;
+ block = BLOCK (result);
+ if (--_heapinfo[block].busy.info.frag.nfree != 0)
+ _heapinfo[block].busy.info.frag.first =
+ (uintptr_t) next->next % BLOCKSIZE >> log;
+
+ /* Update the statistics. */
+ ++_chunks_used;
+ _bytes_used += 1 << log;
+ --_chunks_free;
+ _bytes_free -= 1 << log;
+ }
+ else
+ {
+ /* No free fragments of the desired size, so get a new block
+ and break it into fragments, returning the first. */
+#ifdef GC_MALLOC_CHECK
+ result = _malloc_internal_nolock (BLOCKSIZE);
+ PROTECT_MALLOC_STATE (0);
+#elif defined (USE_PTHREAD)
+ result = _malloc_internal_nolock (BLOCKSIZE);
+#else
+ result = malloc (BLOCKSIZE);
+#endif
+ if (result == NULL)
+ {
+ PROTECT_MALLOC_STATE (1);
+ goto out;
+ }
+
+ /* Link all fragments but the first into the free list. */
+ next = (struct list *) ((char *) result + (1 << log));
+ next->next = NULL;
+ next->prev = &_fraghead[log];
+ _fraghead[log].next = next;
+
+ for (i = 2; i < (size_t) (BLOCKSIZE >> log); ++i)
+ {
+ next = (struct list *) ((char *) result + (i << log));
+ next->next = _fraghead[log].next;
+ next->prev = &_fraghead[log];
+ next->prev->next = next;
+ next->next->prev = next;
+ }
+
+ /* Initialize the nfree and first counters for this block. */
+ block = BLOCK (result);
+ _heapinfo[block].busy.type = log;
+ _heapinfo[block].busy.info.frag.nfree = i - 1;
+ _heapinfo[block].busy.info.frag.first = i - 1;
+
+ _chunks_free += (BLOCKSIZE >> log) - 1;
+ _bytes_free += BLOCKSIZE - (1 << log);
+ _bytes_used -= BLOCKSIZE - (1 << log);
+ }
+ }
+ else
+ {
+ /* Large allocation to receive one or more blocks.
+ Search the free list in a circle starting at the last place visited.
+ If we loop completely around without finding a large enough
+ space we will have to get more memory from the system. */
+ blocks = BLOCKIFY (size);
+ start = block = _heapindex;
+ while (_heapinfo[block].free.size < blocks)
+ {
+ block = _heapinfo[block].free.next;
+ if (block == start)
+ {
+ /* Need to get more from the system. Get a little extra. */
+ size_t wantblocks = blocks + __malloc_extra_blocks;
+ block = _heapinfo[0].free.prev;
+ lastblocks = _heapinfo[block].free.size;
+ /* Check to see if the new core will be contiguous with the
+ final free block; if so we don't need to get as much. */
+ if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
+ /* We can't do this if we will have to make the heap info
+ table bigger to accommodate the new space. */
+ block + wantblocks <= heapsize &&
+ get_contiguous_space ((wantblocks - lastblocks) * BLOCKSIZE,
+ ADDRESS (block + lastblocks)))
+ {
+ /* We got it contiguously. Which block we are extending
+ (the `final free block' referred to above) might have
+ changed, if it got combined with a freed info table. */
+ block = _heapinfo[0].free.prev;
+ _heapinfo[block].free.size += (wantblocks - lastblocks);
+ _bytes_free += (wantblocks - lastblocks) * BLOCKSIZE;
+ _heaplimit += wantblocks - lastblocks;
+ continue;
+ }
+ result = morecore_nolock (wantblocks * BLOCKSIZE);
+ if (result == NULL)
+ goto out;
+ block = BLOCK (result);
+ /* Put the new block at the end of the free list. */
+ _heapinfo[block].free.size = wantblocks;
+ _heapinfo[block].free.prev = _heapinfo[0].free.prev;
+ _heapinfo[block].free.next = 0;
+ _heapinfo[0].free.prev = block;
+ _heapinfo[_heapinfo[block].free.prev].free.next = block;
+ ++_chunks_free;
+ /* Now loop to use some of that block for this allocation. */
+ }
+ }
+
+ /* At this point we have found a suitable free list entry.
+ Figure out how to remove what we need from the list. */
+ result = ADDRESS (block);
+ if (_heapinfo[block].free.size > blocks)
+ {
+ /* The block we found has a bit left over,
+ so relink the tail end back into the free list. */
+ _heapinfo[block + blocks].free.size
+ = _heapinfo[block].free.size - blocks;
+ _heapinfo[block + blocks].free.next
+ = _heapinfo[block].free.next;
+ _heapinfo[block + blocks].free.prev
+ = _heapinfo[block].free.prev;
+ _heapinfo[_heapinfo[block].free.prev].free.next
+ = _heapinfo[_heapinfo[block].free.next].free.prev
+ = _heapindex = block + blocks;
+ }
+ else
+ {
+ /* The block exactly matches our requirements,
+ so just remove it from the list. */
+ _heapinfo[_heapinfo[block].free.next].free.prev
+ = _heapinfo[block].free.prev;
+ _heapinfo[_heapinfo[block].free.prev].free.next
+ = _heapindex = _heapinfo[block].free.next;
+ --_chunks_free;
+ }
+
+ _heapinfo[block].busy.type = 0;
+ _heapinfo[block].busy.info.size = blocks;
+ ++_chunks_used;
+ _bytes_used += blocks * BLOCKSIZE;
+ _bytes_free -= blocks * BLOCKSIZE;
+
+ /* Mark all the blocks of the object just allocated except for the
+ first with a negative number so you can find the first block by
+ adding that adjustment. */
+ while (--blocks > 0)
+ _heapinfo[block + blocks].busy.info.size = -blocks;
+ }
+
+ PROTECT_MALLOC_STATE (1);
+ out:
+ return result;
+}
+
+void *
+_malloc_internal (size_t size)
+{
+ void *result;
+
+ LOCK ();
+ result = _malloc_internal_nolock (size);
+ UNLOCK ();
+
+ return result;
+}
+
+void *
+malloc (size_t size)
+{
+ void *(*hook) (size_t);
+
+ if (!__malloc_initialized && !__malloc_initialize ())
+ return NULL;
+
+ /* Copy the value of __malloc_hook to an automatic variable in case
+ __malloc_hook is modified in another thread between its
+ NULL-check and the use.
+
+ Note: Strictly speaking, this is not a right solution. We should
+ use mutexes to access non-read-only variables that are shared
+ among multiple threads. We just leave it for compatibility with
+ glibc malloc (i.e., assignments to __malloc_hook) for now. */
+ hook = __malloc_hook;
+ return (hook != NULL ? *hook : _malloc_internal) (size);
+}
+
+#ifndef _LIBC
+
+/* On some ANSI C systems, some libc functions call _malloc, _free
+ and _realloc. Make them use the GNU functions. */
+
+extern void *_malloc (size_t);
+extern void _free (void *);
+extern void *_realloc (void *, size_t);
+
+void *
+_malloc (size_t size)
+{
+ return malloc (size);
+}
+
+void
+_free (void *ptr)
+{
+ free (ptr);
+}
+
+void *
+_realloc (void *ptr, size_t size)
+{
+ return realloc (ptr, size);
+}
+
+#endif
+/* Free a block of memory allocated by `malloc'.
+ Copyright 1990, 1991, 1992, 1994, 1995 Free Software Foundation, Inc.
+ Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+
+/* Debugging hook for free. */
+void (*__free_hook) (void *__ptr);
+
+/* List of blocks allocated by aligned_alloc. */
+struct alignlist *_aligned_blocks = NULL;
+
+/* Return memory to the heap.
+ Like `_free_internal' but don't lock mutex. */
+void
+_free_internal_nolock (void *ptr)
+{
+ int type;
+ size_t block, blocks;
+ register size_t i;
+ struct list *prev, *next;
+ void *curbrk;
+ const size_t lesscore_threshold
+ /* Threshold of free space at which we will return some to the system. */
+ = FINAL_FREE_BLOCKS + 2 * __malloc_extra_blocks;
+
+ register struct alignlist *l;
+
+ if (ptr == NULL)
+ return;
+
+ PROTECT_MALLOC_STATE (0);
+
+ LOCK_ALIGNED_BLOCKS ();
+ for (l = _aligned_blocks; l != NULL; l = l->next)
+ if (l->aligned == ptr)
+ {
+ l->aligned = NULL; /* Mark the slot in the list as free. */
+ ptr = l->exact;
+ break;
+ }
+ UNLOCK_ALIGNED_BLOCKS ();
+
+ block = BLOCK (ptr);
+
+ type = _heapinfo[block].busy.type;
+ switch (type)
+ {
+ case 0:
+ /* Get as many statistics as early as we can. */
+ --_chunks_used;
+ _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
+ _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
+
+ /* Find the free cluster previous to this one in the free list.
+ Start searching at the last block referenced; this may benefit
+ programs with locality of allocation. */
+ i = _heapindex;
+ if (i > block)
+ while (i > block)
+ i = _heapinfo[i].free.prev;
+ else
+ {
+ do
+ i = _heapinfo[i].free.next;
+ while (i > 0 && i < block);
+ i = _heapinfo[i].free.prev;
+ }
+
+ /* Determine how to link this block into the free list. */
+ if (block == i + _heapinfo[i].free.size)
+ {
+ /* Coalesce this block with its predecessor. */
+ _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
+ block = i;
+ }
+ else
+ {
+ /* Really link this block back into the free list. */
+ _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
+ _heapinfo[block].free.next = _heapinfo[i].free.next;
+ _heapinfo[block].free.prev = i;
+ _heapinfo[i].free.next = block;
+ _heapinfo[_heapinfo[block].free.next].free.prev = block;
+ ++_chunks_free;
+ }
+
+ /* Now that the block is linked in, see if we can coalesce it
+ with its successor (by deleting its successor from the list
+ and adding in its size). */
+ if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
+ {
+ _heapinfo[block].free.size
+ += _heapinfo[_heapinfo[block].free.next].free.size;
+ _heapinfo[block].free.next
+ = _heapinfo[_heapinfo[block].free.next].free.next;
+ _heapinfo[_heapinfo[block].free.next].free.prev = block;
+ --_chunks_free;
+ }
+
+ /* How many trailing free blocks are there now? */
+ blocks = _heapinfo[block].free.size;
+
+ /* Where is the current end of accessible core? */
+ curbrk = (*__morecore) (0);
+
+ if (_heaplimit != 0 && curbrk == ADDRESS (_heaplimit))
+ {
+ /* The end of the malloc heap is at the end of accessible core.
+ It's possible that moving _heapinfo will allow us to
+ return some space to the system. */
+
+ size_t info_block = BLOCK (_heapinfo);
+ size_t info_blocks = _heapinfo[info_block].busy.info.size;
+ size_t prev_block = _heapinfo[block].free.prev;
+ size_t prev_blocks = _heapinfo[prev_block].free.size;
+ size_t next_block = _heapinfo[block].free.next;
+ size_t next_blocks = _heapinfo[next_block].free.size;
+
+ if (/* Win if this block being freed is last in core, the info table
+ is just before it, the previous free block is just before the
+ info table, and the two free blocks together form a useful
+ amount to return to the system. */
+ (block + blocks == _heaplimit &&
+ info_block + info_blocks == block &&
+ prev_block != 0 && prev_block + prev_blocks == info_block &&
+ blocks + prev_blocks >= lesscore_threshold) ||
+ /* Nope, not the case. We can also win if this block being
+ freed is just before the info table, and the table extends
+ to the end of core or is followed only by a free block,
+ and the total free space is worth returning to the system. */
+ (block + blocks == info_block &&
+ ((info_block + info_blocks == _heaplimit &&
+ blocks >= lesscore_threshold) ||
+ (info_block + info_blocks == next_block &&
+ next_block + next_blocks == _heaplimit &&
+ blocks + next_blocks >= lesscore_threshold)))
+ )
+ {
+ malloc_info *newinfo;
+ size_t oldlimit = _heaplimit;
+
+ /* Free the old info table, clearing _heaplimit to avoid
+ recursion into this code. We don't want to return the
+ table's blocks to the system before we have copied them to
+ the new location. */
+ _heaplimit = 0;
+ _free_internal_nolock (_heapinfo);
+ _heaplimit = oldlimit;
+
+ /* Tell malloc to search from the beginning of the heap for
+ free blocks, so it doesn't reuse the ones just freed. */
+ _heapindex = 0;
+
+ /* Allocate new space for the info table and move its data. */
+ newinfo = _malloc_internal_nolock (info_blocks * BLOCKSIZE);
+ PROTECT_MALLOC_STATE (0);
+ memmove (newinfo, _heapinfo, info_blocks * BLOCKSIZE);
+ _heapinfo = newinfo;
+
+ /* We should now have coalesced the free block with the
+ blocks freed from the old info table. Examine the entire
+ trailing free block to decide below whether to return some
+ to the system. */
+ block = _heapinfo[0].free.prev;
+ blocks = _heapinfo[block].free.size;
+ }
+
+ /* Now see if we can return stuff to the system. */
+ if (block + blocks == _heaplimit && blocks >= lesscore_threshold)
+ {
+ register size_t bytes = blocks * BLOCKSIZE;
+ _heaplimit -= blocks;
+ (*__morecore) (-bytes);
+ _heapinfo[_heapinfo[block].free.prev].free.next
+ = _heapinfo[block].free.next;
+ _heapinfo[_heapinfo[block].free.next].free.prev
+ = _heapinfo[block].free.prev;
+ block = _heapinfo[block].free.prev;
+ --_chunks_free;
+ _bytes_free -= bytes;
+ }
+ }
+
+ /* Set the next search to begin at this block. */
+ _heapindex = block;
+ break;
+
+ default:
+ /* Do some of the statistics. */
+ --_chunks_used;
+ _bytes_used -= 1 << type;
+ ++_chunks_free;
+ _bytes_free += 1 << type;
+
+ /* Get the address of the first free fragment in this block. */
+ prev = (struct list *) ((char *) ADDRESS (block) +
+ (_heapinfo[block].busy.info.frag.first << type));
+
+ if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
+ {
+ /* If all fragments of this block are free, remove them
+ from the fragment list and free the whole block. */
+ next = prev;
+ for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i)
+ next = next->next;
+ prev->prev->next = next;
+ if (next != NULL)
+ next->prev = prev->prev;
+ _heapinfo[block].busy.type = 0;
+ _heapinfo[block].busy.info.size = 1;
+
+ /* Keep the statistics accurate. */
+ ++_chunks_used;
+ _bytes_used += BLOCKSIZE;
+ _chunks_free -= BLOCKSIZE >> type;
+ _bytes_free -= BLOCKSIZE;
+
+#if defined (GC_MALLOC_CHECK) || defined (USE_PTHREAD)
+ _free_internal_nolock (ADDRESS (block));
+#else
+ free (ADDRESS (block));
+#endif
+ }
+ else if (_heapinfo[block].busy.info.frag.nfree != 0)
+ {
+ /* If some fragments of this block are free, link this
+ fragment into the fragment list after the first free
+ fragment of this block. */
+ next = ptr;
+ next->next = prev->next;
+ next->prev = prev;
+ prev->next = next;
+ if (next->next != NULL)
+ next->next->prev = next;
+ ++_heapinfo[block].busy.info.frag.nfree;
+ }
+ else
+ {
+ /* No fragments of this block are free, so link this
+ fragment into the fragment list and announce that
+ it is the first free fragment of this block. */
+ prev = ptr;
+ _heapinfo[block].busy.info.frag.nfree = 1;
+ _heapinfo[block].busy.info.frag.first =
+ (uintptr_t) ptr % BLOCKSIZE >> type;
+ prev->next = _fraghead[type].next;
+ prev->prev = &_fraghead[type];
+ prev->prev->next = prev;
+ if (prev->next != NULL)
+ prev->next->prev = prev;
+ }
+ break;
+ }
+
+ PROTECT_MALLOC_STATE (1);
+}
+
+/* Return memory to the heap.
+ Like `free' but don't call a __free_hook if there is one. */
+void
+_free_internal (void *ptr)
+{
+ LOCK ();
+ _free_internal_nolock (ptr);
+ UNLOCK ();
+}
+
+/* Return memory to the heap. */
+
+void
+free (void *ptr)
+{
+ void (*hook) (void *) = __free_hook;
+
+ if (hook != NULL)
+ (*hook) (ptr);
+ else
+ _free_internal (ptr);
+}
+
+/* Define the `cfree' alias for `free'. */
+#ifdef weak_alias
+weak_alias (free, cfree)
+#else
+void
+cfree (void *ptr)
+{
+ free (ptr);
+}
+#endif
+/* Change the size of a block allocated by `malloc'.
+ Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+ Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/* Debugging hook for realloc. */
+void *(*__realloc_hook) (void *ptr, size_t size);
+
+/* Resize the given region to the new size, returning a pointer
+ to the (possibly moved) region. This is optimized for speed;
+ some benchmarks seem to indicate that greater compactness is
+ achieved by unconditionally allocating and copying to a
+ new region. This module has incestuous knowledge of the
+ internals of both free and malloc. */
+void *
+_realloc_internal_nolock (void *ptr, size_t size)
+{
+ void *result;
+ int type;
+ size_t block, blocks, oldlimit;
+
+ if (size == 0)
+ {
+ _free_internal_nolock (ptr);
+ return _malloc_internal_nolock (0);
+ }
+ else if (ptr == NULL)
+ return _malloc_internal_nolock (size);
+
+ block = BLOCK (ptr);
+
+ PROTECT_MALLOC_STATE (0);
+
+ type = _heapinfo[block].busy.type;
+ switch (type)
+ {
+ case 0:
+ /* Maybe reallocate a large block to a small fragment. */
+ if (size <= BLOCKSIZE / 2)
+ {
+ result = _malloc_internal_nolock (size);
+ if (result != NULL)
+ {
+ memcpy (result, ptr, size);
+ _free_internal_nolock (ptr);
+ goto out;
+ }
+ }
+
+ /* The new size is a large allocation as well;
+ see if we can hold it in place. */
+ blocks = BLOCKIFY (size);
+ if (blocks < _heapinfo[block].busy.info.size)
+ {
+ /* The new size is smaller; return
+ excess memory to the free list. */
+ _heapinfo[block + blocks].busy.type = 0;
+ _heapinfo[block + blocks].busy.info.size
+ = _heapinfo[block].busy.info.size - blocks;
+ _heapinfo[block].busy.info.size = blocks;
+ /* We have just created a new chunk by splitting a chunk in two.
+ Now we will free this chunk; increment the statistics counter
+ so it doesn't become wrong when _free_internal decrements it. */
+ ++_chunks_used;
+ _free_internal_nolock (ADDRESS (block + blocks));
+ result = ptr;
+ }
+ else if (blocks == _heapinfo[block].busy.info.size)
+ /* No size change necessary. */
+ result = ptr;
+ else
+ {
+ /* Won't fit, so allocate a new region that will.
+ Free the old region first in case there is sufficient
+ adjacent free space to grow without moving. */
+ blocks = _heapinfo[block].busy.info.size;
+ /* Prevent free from actually returning memory to the system. */
+ oldlimit = _heaplimit;
+ _heaplimit = 0;
+ _free_internal_nolock (ptr);
+ result = _malloc_internal_nolock (size);
+ PROTECT_MALLOC_STATE (0);
+ if (_heaplimit == 0)
+ _heaplimit = oldlimit;
+ if (result == NULL)
+ {
+ /* Now we're really in trouble. We have to unfree
+ the thing we just freed. Unfortunately it might
+ have been coalesced with its neighbors. */
+ if (_heapindex == block)
+ (void) _malloc_internal_nolock (blocks * BLOCKSIZE);
+ else
+ {
+ void *previous
+ = _malloc_internal_nolock ((block - _heapindex) * BLOCKSIZE);
+ (void) _malloc_internal_nolock (blocks * BLOCKSIZE);
+ _free_internal_nolock (previous);
+ }
+ goto out;
+ }
+ if (ptr != result)
+ memmove (result, ptr, blocks * BLOCKSIZE);
+ }
+ break;
+
+ default:
+ /* Old size is a fragment; type is logarithm
+ to base two of the fragment size. */
+ if (size > (size_t) (1 << (type - 1)) &&
+ size <= (size_t) (1 << type))
+ /* The new size is the same kind of fragment. */
+ result = ptr;
+ else
+ {
+ /* The new size is different; allocate a new space,
+ and copy the lesser of the new size and the old. */
+ result = _malloc_internal_nolock (size);
+ if (result == NULL)
+ goto out;
+ memcpy (result, ptr, min (size, (size_t) 1 << type));
+ _free_internal_nolock (ptr);
+ }
+ break;
+ }
+
+ PROTECT_MALLOC_STATE (1);
+ out:
+ return result;
+}
+
+void *
+_realloc_internal (void *ptr, size_t size)
+{
+ void *result;
+
+ LOCK ();
+ result = _realloc_internal_nolock (ptr, size);
+ UNLOCK ();
+
+ return result;
+}
+
+void *
+realloc (void *ptr, size_t size)
+{
+ void *(*hook) (void *, size_t);
+
+ if (!__malloc_initialized && !__malloc_initialize ())
+ return NULL;
+
+ hook = __realloc_hook;
+ return (hook != NULL ? *hook : _realloc_internal) (ptr, size);
+}
+/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+ The entire array is initialized to zeros. */
+void *
+calloc (size_t nmemb, size_t size)
+{
+ void *result;
+ size_t bytes = nmemb * size;
+
+ if (size != 0 && bytes / size != nmemb)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ result = malloc (bytes);
+ if (result)
+ return memset (result, 0, bytes);
+ return result;
+}
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the GNU C Library. If not, see <http://www.gnu.org/licenses/>. */
+
+/* uClibc defines __GNU_LIBRARY__, but it is not completely
+ compatible. */
+#if !defined (__GNU_LIBRARY__) || defined (__UCLIBC__)
+#define __sbrk sbrk
+#else /* __GNU_LIBRARY__ && ! defined (__UCLIBC__) */
+/* It is best not to declare this and cast its result on foreign operating
+ systems with potentially hostile include files. */
+
+extern void *__sbrk (ptrdiff_t increment);
+#endif /* __GNU_LIBRARY__ && ! defined (__UCLIBC__) */
+
+/* Allocate INCREMENT more bytes of data space,
+ and return the start of data space, or NULL on errors.
+ If INCREMENT is negative, shrink data space. */
+void *
+__default_morecore (ptrdiff_t increment)
+{
+ void *result;
+#if defined (CYGWIN)
+ if (!DUMPED)
+ {
+ return bss_sbrk (increment);
+ }
+#endif
+ result = (void *) __sbrk (increment);
+ if (result == (void *) -1)
+ return NULL;
+ return result;
+}
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>. */
+
+void *(*__memalign_hook) (size_t size, size_t alignment);
+
+void *
+aligned_alloc (size_t alignment, size_t size)
+{
+ void *result;
+ size_t adj, lastadj;
+ void *(*hook) (size_t, size_t) = __memalign_hook;
+
+ if (hook)
+ return (*hook) (alignment, size);
+
+ /* Allocate a block with enough extra space to pad the block with up to
+ (ALIGNMENT - 1) bytes if necessary. */
+ if (- size < alignment)
+ {
+ errno = ENOMEM;
+ return NULL;
+ }
+ result = malloc (size + alignment - 1);
+ if (result == NULL)
+ return NULL;
+
+ /* Figure out how much we will need to pad this particular block
+ to achieve the required alignment. */
+ adj = alignment - (uintptr_t) result % alignment;
+ if (adj == alignment)
+ adj = 0;
+
+ if (adj != alignment - 1)
+ {
+ do
+ {
+ /* Reallocate the block with only as much excess as it
+ needs. */
+ free (result);
+ result = malloc (size + adj);
+ if (result == NULL) /* Impossible unless interrupted. */
+ return NULL;
+
+ lastadj = adj;
+ adj = alignment - (uintptr_t) result % alignment;
+ if (adj == alignment)
+ adj = 0;
+ /* It's conceivable we might have been so unlucky as to get
+ a different block with weaker alignment. If so, this
+ block is too short to contain SIZE after alignment
+ correction. So we must try again and get another block,
+ slightly larger. */
+ } while (adj > lastadj);
+ }
+
+ if (adj != 0)
+ {
+ /* Record this block in the list of aligned blocks, so that `free'
+ can identify the pointer it is passed, which will be in the middle
+ of an allocated block. */
+
+ struct alignlist *l;
+ LOCK_ALIGNED_BLOCKS ();
+ for (l = _aligned_blocks; l != NULL; l = l->next)
+ if (l->aligned == NULL)
+ /* This slot is free. Use it. */
+ break;
+ if (l == NULL)
+ {
+ l = malloc (sizeof *l);
+ if (l != NULL)
+ {
+ l->next = _aligned_blocks;
+ _aligned_blocks = l;
+ }
+ }
+ if (l != NULL)
+ {
+ l->exact = result;
+ result = l->aligned = (char *) result + adj;
+ }
+ UNLOCK_ALIGNED_BLOCKS ();
+ if (l == NULL)
+ {
+ free (result);
+ result = NULL;
+ }
+ }
+
+ return result;
+}
+
+/* An obsolete alias for aligned_alloc, for any old libraries that use
+ this alias. */
+
+void *
+memalign (size_t alignment, size_t size)
+{
+ return aligned_alloc (alignment, size);
+}
+
+/* If HYBRID_MALLOC is defined, we may want to use the system
+ posix_memalign below. */
+#ifndef HYBRID_MALLOC
+int
+posix_memalign (void **memptr, size_t alignment, size_t size)
+{
+ void *mem;
+
+ if (alignment == 0
+ || alignment % sizeof (void *) != 0
+ || (alignment & (alignment - 1)) != 0)
+ return EINVAL;
+
+ mem = aligned_alloc (alignment, size);
+ if (mem == NULL)
+ return ENOMEM;
+
+ *memptr = mem;
+
+ return 0;
+}
+#endif
+
+/* Allocate memory on a page boundary.
+ Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+/* Allocate SIZE bytes on a page boundary. */
+extern void *valloc (size_t);
+
+#if defined _SC_PAGESIZE || !defined HAVE_GETPAGESIZE
+# include "getpagesize.h"
+#elif !defined getpagesize
+extern int getpagesize (void);
+#endif
+
+static size_t pagesize;
+
+void *
+valloc (size_t size)
+{
+ if (pagesize == 0)
+ pagesize = getpagesize ();
+
+ return aligned_alloc (pagesize, size);
+}
+
+#ifdef HYBRID_MALLOC
+#undef malloc
+#undef realloc
+#undef calloc
+#undef aligned_alloc
+#undef free
+
+/* Declare system malloc and friends. */
+extern void *malloc (size_t size);
+extern void *realloc (void *ptr, size_t size);
+extern void *calloc (size_t nmemb, size_t size);
+extern void free (void *ptr);
+#ifdef HAVE_ALIGNED_ALLOC
+extern void *aligned_alloc (size_t alignment, size_t size);
+#elif defined HAVE_POSIX_MEMALIGN
+extern int posix_memalign (void **memptr, size_t alignment, size_t size);
+#endif
+
+/* See the comments near the beginning of this file for explanations
+ of the following functions. */
+
+void *
+hybrid_malloc (size_t size)
+{
+ if (DUMPED)
+ return malloc (size);
+ return gmalloc (size);
+}
+
+void *
+hybrid_calloc (size_t nmemb, size_t size)
+{
+ if (DUMPED)
+ return calloc (nmemb, size);
+ return gcalloc (nmemb, size);
+}
+
+void
+hybrid_free (void *ptr)
+{
+ if (!DUMPED)
+ gfree (ptr);
+ else if (!ALLOCATED_BEFORE_DUMPING (ptr))
+ free (ptr);
+ /* Otherwise the dumped emacs is trying to free something allocated
+ before dumping; do nothing. */
+ return;
+}
+
+#if defined HAVE_ALIGNED_ALLOC || defined HAVE_POSIX_MEMALIGN
+void *
+hybrid_aligned_alloc (size_t alignment, size_t size)
+{
+ if (!DUMPED)
+ return galigned_alloc (alignment, size);
+ /* The following is copied from alloc.c */
+#ifdef HAVE_ALIGNED_ALLOC
+ return aligned_alloc (alignment, size);
+#else /* HAVE_POSIX_MEMALIGN */
+ void *p;
+ return posix_memalign (&p, alignment, size) == 0 ? p : 0;
+#endif
+}
+#endif
+
+void *
+hybrid_realloc (void *ptr, size_t size)
+{
+ void *result;
+ int type;
+ size_t block, oldsize;
+
+ if (!DUMPED)
+ return grealloc (ptr, size);
+ if (!ALLOCATED_BEFORE_DUMPING (ptr))
+ return realloc (ptr, size);
+
+ /* The dumped emacs is trying to realloc storage allocated before
+ dumping. We just malloc new space and copy the data. */
+ if (size == 0 || ptr == NULL)
+ return malloc (size);
+ block = ((char *) ptr - _heapbase) / BLOCKSIZE + 1;
+ type = _heapinfo[block].busy.type;
+ oldsize =
+ type == 0 ? _heapinfo[block].busy.info.size * BLOCKSIZE
+ : (size_t) 1 << type;
+ result = malloc (size);
+ if (result)
+ return memcpy (result, ptr, min (oldsize, size));
+ return result;
+}
+
+#ifdef HYBRID_GET_CURRENT_DIR_NAME
+/* Defined in sysdep.c. */
+char *gget_current_dir_name (void);
+
+char *
+hybrid_get_current_dir_name (void)
+{
+ if (DUMPED)
+ return get_current_dir_name ();
+ return gget_current_dir_name ();
+}
+#endif
+
+#endif /* HYBRID_MALLOC */
+
+#ifdef GC_MCHECK
+
+/* Standard debugging hooks for `malloc'.
+ Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+ Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+ The author may be reached (Email) at the address mike@ai.mit.edu,
+ or (US mail) as Mike Haertel c/o Free Software Foundation. */
+
+#include <stdio.h>
+
+/* Old hook values. */
+static void (*old_free_hook) (void *ptr);
+static void *(*old_malloc_hook) (size_t size);
+static void *(*old_realloc_hook) (void *ptr, size_t size);
+
+/* Function to call when something awful happens. */
+static void (*abortfunc) (enum mcheck_status);
+
+/* Arbitrary magical numbers. */
+#define MAGICWORD (SIZE_MAX / 11 ^ SIZE_MAX / 13 << 3)
+#define MAGICFREE (SIZE_MAX / 17 ^ SIZE_MAX / 19 << 4)
+#define MAGICBYTE ((char) 0xd7)
+#define MALLOCFLOOD ((char) 0x93)
+#define FREEFLOOD ((char) 0x95)
+
+struct hdr
+ {
+ size_t size; /* Exact size requested by user. */
+ size_t magic; /* Magic number to check header integrity. */
+ };
+
+static enum mcheck_status
+checkhdr (const struct hdr *hdr)
+{
+ enum mcheck_status status;
+ switch (hdr->magic)
+ {
+ default:
+ status = MCHECK_HEAD;
+ break;
+ case MAGICFREE:
+ status = MCHECK_FREE;
+ break;
+ case MAGICWORD:
+ if (((char *) &hdr[1])[hdr->size] != MAGICBYTE)
+ status = MCHECK_TAIL;
+ else
+ status = MCHECK_OK;
+ break;
+ }
+ if (status != MCHECK_OK)
+ (*abortfunc) (status);
+ return status;
+}
+
+static void
+freehook (void *ptr)
+{
+ struct hdr *hdr;
+
+ if (ptr)
+ {
+ struct alignlist *l;
+
+ /* If the block was allocated by aligned_alloc, its real pointer
+ to free is recorded in _aligned_blocks; find that. */
+ PROTECT_MALLOC_STATE (0);
+ LOCK_ALIGNED_BLOCKS ();
+ for (l = _aligned_blocks; l != NULL; l = l->next)
+ if (l->aligned == ptr)
+ {
+ l->aligned = NULL; /* Mark the slot in the list as free. */
+ ptr = l->exact;
+ break;
+ }
+ UNLOCK_ALIGNED_BLOCKS ();
+ PROTECT_MALLOC_STATE (1);
+
+ hdr = ((struct hdr *) ptr) - 1;
+ checkhdr (hdr);
+ hdr->magic = MAGICFREE;
+ memset (ptr, FREEFLOOD, hdr->size);
+ }
+ else
+ hdr = NULL;
+
+ __free_hook = old_free_hook;
+ free (hdr);
+ __free_hook = freehook;
+}
+
+static void *
+mallochook (size_t size)
+{
+ struct hdr *hdr;
+
+ __malloc_hook = old_malloc_hook;
+ hdr = malloc (sizeof *hdr + size + 1);
+ __malloc_hook = mallochook;
+ if (hdr == NULL)
+ return NULL;
+
+ hdr->size = size;
+ hdr->magic = MAGICWORD;
+ ((char *) &hdr[1])[size] = MAGICBYTE;
+ return memset (hdr + 1, MALLOCFLOOD, size);
+}
+
+static void *
+reallochook (void *ptr, size_t size)
+{
+ struct hdr *hdr = NULL;
+ size_t osize = 0;
+
+ if (ptr)
+ {
+ hdr = ((struct hdr *) ptr) - 1;
+ osize = hdr->size;
+
+ checkhdr (hdr);
+ if (size < osize)
+ memset ((char *) ptr + size, FREEFLOOD, osize - size);
+ }
+
+ __free_hook = old_free_hook;
+ __malloc_hook = old_malloc_hook;
+ __realloc_hook = old_realloc_hook;
+ hdr = realloc (hdr, sizeof *hdr + size + 1);
+ __free_hook = freehook;
+ __malloc_hook = mallochook;
+ __realloc_hook = reallochook;
+ if (hdr == NULL)
+ return NULL;
+
+ hdr->size = size;
+ hdr->magic = MAGICWORD;
+ ((char *) &hdr[1])[size] = MAGICBYTE;
+ if (size > osize)
+ memset ((char *) (hdr + 1) + osize, MALLOCFLOOD, size - osize);
+ return hdr + 1;
+}
+
+static void
+mabort (enum mcheck_status status)
+{
+ const char *msg;
+ switch (status)
+ {
+ case MCHECK_OK:
+ msg = "memory is consistent, library is buggy";
+ break;
+ case MCHECK_HEAD:
+ msg = "memory clobbered before allocated block";
+ break;
+ case MCHECK_TAIL:
+ msg = "memory clobbered past end of allocated block";
+ break;
+ case MCHECK_FREE:
+ msg = "block freed twice";
+ break;
+ default:
+ msg = "bogus mcheck_status, library is buggy";
+ break;
+ }
+#ifdef __GNU_LIBRARY__
+ __libc_fatal (msg);
+#else
+ fprintf (stderr, "mcheck: %s\n", msg);
+ fflush (stderr);
+# ifdef emacs
+ emacs_abort ();
+# else
+ abort ();
+# endif
+#endif
+}
+
+static int mcheck_used = 0;
+
+int
+mcheck (void (*func) (enum mcheck_status))
+{
+ abortfunc = (func != NULL) ? func : &mabort;
+
+ /* These hooks may not be safely inserted if malloc is already in use. */
+ if (!__malloc_initialized && !mcheck_used)
+ {
+ old_free_hook = __free_hook;
+ __free_hook = freehook;
+ old_malloc_hook = __malloc_hook;
+ __malloc_hook = mallochook;
+ old_realloc_hook = __realloc_hook;
+ __realloc_hook = reallochook;
+ mcheck_used = 1;
+ }
+
+ return mcheck_used ? 0 : -1;
+}
+
+enum mcheck_status
+mprobe (void *ptr)
+{
+ return mcheck_used ? checkhdr (ptr) : MCHECK_DISABLED;
+}
+
+#endif /* GC_MCHECK */
diff --git a/test/etags/c-src/emacs/src/keyboard.c b/test/etags/c-src/emacs/src/keyboard.c
new file mode 100644
index 00000000000..77f7fb97898
--- /dev/null
+++ b/test/etags/c-src/emacs/src/keyboard.c
@@ -0,0 +1,11960 @@
+/* Keyboard and mouse input; editor command loop.
+
+Copyright (C) 1985-1989, 1993-1997, 1999-2015 Free Software Foundation,
+Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <config.h>
+
+#include "sysstdio.h"
+#include <sys/stat.h>
+
+#include "lisp.h"
+#include "termchar.h"
+#include "termopts.h"
+#include "frame.h"
+#include "termhooks.h"
+#include "macros.h"
+#include "keyboard.h"
+#include "window.h"
+#include "commands.h"
+#include "character.h"
+#include "buffer.h"
+#include "disptab.h"
+#include "dispextern.h"
+#include "syntax.h"
+#include "intervals.h"
+#include "keymap.h"
+#include "blockinput.h"
+#include "puresize.h"
+#include "systime.h"
+#include "atimer.h"
+#include "process.h"
+#include <errno.h>
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#endif
+#ifdef MSDOS
+#include "msdos.h"
+#include <time.h>
+#else /* not MSDOS */
+#include <sys/ioctl.h>
+#endif /* not MSDOS */
+
+#if defined USABLE_FIONREAD && defined USG5_4
+# include <sys/filio.h>
+#endif
+
+#include "syssignal.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
+
+/* Variables for blockinput.h: */
+
+/* Positive if interrupt input is blocked right now. */
+volatile int interrupt_input_blocked;
+
+/* True means an input interrupt or alarm signal has arrived.
+ The QUIT macro checks this. */
+volatile bool pending_signals;
+
+#define KBD_BUFFER_SIZE 4096
+
+KBOARD *initial_kboard;
+KBOARD *current_kboard;
+static KBOARD *all_kboards;
+
+/* True in the single-kboard state, false in the any-kboard state. */
+static bool single_kboard;
+
+#define NUM_RECENT_KEYS (300)
+
+/* Index for storing next element into recent_keys. */
+static int recent_keys_index;
+
+/* Total number of elements stored into recent_keys. */
+static int total_keys;
+
+/* This vector holds the last NUM_RECENT_KEYS keystrokes. */
+static Lisp_Object recent_keys;
+
+/* Vector holding the key sequence that invoked the current command.
+ It is reused for each command, and it may be longer than the current
+ sequence; this_command_key_count indicates how many elements
+ actually mean something.
+ It's easier to staticpro a single Lisp_Object than an array. */
+Lisp_Object this_command_keys;
+ptrdiff_t this_command_key_count;
+
+/* True after calling Freset_this_command_lengths.
+ Usually it is false. */
+static bool this_command_key_count_reset;
+
+/* This vector is used as a buffer to record the events that were actually read
+ by read_key_sequence. */
+static Lisp_Object raw_keybuf;
+static int raw_keybuf_count;
+
+#define GROW_RAW_KEYBUF \
+ if (raw_keybuf_count == ASIZE (raw_keybuf)) \
+ raw_keybuf = larger_vector (raw_keybuf, 1, -1)
+
+/* Number of elements of this_command_keys
+ that precede this key sequence. */
+static ptrdiff_t this_single_command_key_start;
+
+/* Record values of this_command_key_count and echo_length ()
+ before this command was read. */
+static ptrdiff_t before_command_key_count;
+static ptrdiff_t before_command_echo_length;
+
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+
+/* For longjmp to recover from C stack overflow. */
+sigjmp_buf return_to_command_loop;
+
+/* Message displayed by Vtop_level when recovering from C stack overflow. */
+static Lisp_Object recover_top_level_message;
+
+#endif /* HAVE_STACK_OVERFLOW_HANDLING */
+
+/* Message normally displayed by Vtop_level. */
+static Lisp_Object regular_top_level_message;
+
+/* For longjmp to where kbd input is being done. */
+
+static sys_jmp_buf getcjmp;
+
+/* True while doing kbd input. */
+bool waiting_for_input;
+
+/* True while displaying for echoing. Delays C-g throwing. */
+
+static bool echoing;
+
+/* Non-null means we can start echoing at the next input pause even
+ though there is something in the echo area. */
+
+static struct kboard *ok_to_echo_at_next_pause;
+
+/* The kboard last echoing, or null for none. Reset to 0 in
+ cancel_echoing. If non-null, and a current echo area message
+ exists, and echo_message_buffer is eq to the current message
+ buffer, we know that the message comes from echo_kboard. */
+
+struct kboard *echo_kboard;
+
+/* The buffer used for echoing. Set in echo_now, reset in
+ cancel_echoing. */
+
+Lisp_Object echo_message_buffer;
+
+/* True means C-g should cause immediate error-signal. */
+bool immediate_quit;
+
+/* Character that causes a quit. Normally C-g.
+
+ If we are running on an ordinary terminal, this must be an ordinary
+ ASCII char, since we want to make it our interrupt character.
+
+ If we are not running on an ordinary terminal, it still needs to be
+ an ordinary ASCII char. This character needs to be recognized in
+ the input interrupt handler. At this point, the keystroke is
+ represented as a struct input_event, while the desired quit
+ character is specified as a lispy event. The mapping from struct
+ input_events to lispy events cannot run in an interrupt handler,
+ and the reverse mapping is difficult for anything but ASCII
+ keystrokes.
+
+ FOR THESE ELABORATE AND UNSATISFYING REASONS, quit_char must be an
+ ASCII character. */
+int quit_char;
+
+/* Current depth in recursive edits. */
+EMACS_INT command_loop_level;
+
+/* If not Qnil, this is a switch-frame event which we decided to put
+ off until the end of a key sequence. This should be read as the
+ next command input, after any unread_command_events.
+
+ read_key_sequence uses this to delay switch-frame events until the
+ end of the key sequence; Fread_char uses it to put off switch-frame
+ events until a non-ASCII event is acceptable as input. */
+Lisp_Object unread_switch_frame;
+
+/* Last size recorded for a current buffer which is not a minibuffer. */
+static ptrdiff_t last_non_minibuf_size;
+
+/* Total number of times read_char has returned, modulo UINTMAX_MAX + 1. */
+uintmax_t num_input_events;
+
+/* Value of num_nonmacro_input_events as of last auto save. */
+
+static EMACS_INT last_auto_save;
+
+/* The value of point when the last command was started. */
+static ptrdiff_t last_point_position;
+
+/* The frame in which the last input event occurred, or Qmacro if the
+ last event came from a macro. We use this to determine when to
+ generate switch-frame events. This may be cleared by functions
+ like Fselect_frame, to make sure that a switch-frame event is
+ generated by the next character.
+
+ FIXME: This is modified by a signal handler so it should be volatile.
+ It's exported to Lisp, though, so it can't simply be marked
+ 'volatile' here. */
+Lisp_Object internal_last_event_frame;
+
+/* `read_key_sequence' stores here the command definition of the
+ key sequence that it reads. */
+static Lisp_Object read_key_sequence_cmd;
+static Lisp_Object read_key_sequence_remapped;
+
+/* File in which we write all commands we read. */
+static FILE *dribble;
+
+/* True if input is available. */
+bool input_pending;
+
+/* True if more input was available last time we read an event.
+
+ Since redisplay can take a significant amount of time and is not
+ indispensable to perform the user's commands, when input arrives
+ "too fast", Emacs skips redisplay. More specifically, if the next
+ command has already been input when we finish the previous command,
+ we skip the intermediate redisplay.
+
+ This is useful to try and make sure Emacs keeps up with fast input
+ rates, such as auto-repeating keys. But in some cases, this proves
+ too conservative: we may end up disabling redisplay for the whole
+ duration of a key repetition, even though we could afford to
+ redisplay every once in a while.
+
+ So we "sample" the input_pending flag before running a command and
+ use *that* value after running the command to decide whether to
+ skip redisplay or not. This way, we only skip redisplay if we
+ really can't keep up with the repeat rate.
+
+ This only makes a difference if the next input arrives while running the
+ command, which is very unlikely if the command is executed quickly.
+ IOW this tends to avoid skipping redisplay after a long running command
+ (which is a case where skipping redisplay is not very useful since the
+ redisplay time is small compared to the time it took to run the command).
+
+ A typical use case is when scrolling. Scrolling time can be split into:
+ - Time to do jit-lock on the newly displayed portion of buffer.
+ - Time to run the actual scroll command.
+ - Time to perform the redisplay.
+ Jit-lock can happen either during the command or during the redisplay.
+ In the most painful cases, the jit-lock time is the one that dominates.
+ Also jit-lock can be tweaked (via jit-lock-defer) to delay its job, at the
+ cost of temporary inaccuracy in display and scrolling.
+ So without input_was_pending, what typically happens is the following:
+ - when the command starts, there's no pending input (yet).
+ - the scroll command triggers jit-lock.
+ - during the long jit-lock time the next input arrives.
+ - at the end of the command, we check input_pending and hence decide to
+ skip redisplay.
+ - we read the next input and start over.
+ End result: all the hard work of jit-locking is "wasted" since redisplay
+ doesn't actually happens (at least not before the input rate slows down).
+ With input_was_pending redisplay is still skipped if Emacs can't keep up
+ with the input rate, but if it can keep up just enough that there's no
+ input_pending when we begin the command, then redisplay is not skipped
+ which results in better feedback to the user. */
+static bool input_was_pending;
+
+/* Circular buffer for pre-read keyboard input. */
+
+static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
+
+/* Pointer to next available character in kbd_buffer.
+ If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
+ This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
+ next available char is in kbd_buffer[0]. */
+static struct input_event *kbd_fetch_ptr;
+
+/* Pointer to next place to store character in kbd_buffer. This
+ may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next
+ character should go in kbd_buffer[0]. */
+static struct input_event * volatile kbd_store_ptr;
+
+/* The above pair of variables forms a "queue empty" flag. When we
+ enqueue a non-hook event, we increment kbd_store_ptr. When we
+ dequeue a non-hook event, we increment kbd_fetch_ptr. We say that
+ there is input available if the two pointers are not equal.
+
+ Why not just have a flag set and cleared by the enqueuing and
+ dequeuing functions? Such a flag could be screwed up by interrupts
+ at inopportune times. */
+
+static void recursive_edit_unwind (Lisp_Object buffer);
+static Lisp_Object command_loop (void);
+
+static void echo_now (void);
+static ptrdiff_t echo_length (void);
+
+/* Incremented whenever a timer is run. */
+unsigned timers_run;
+
+/* Address (if not 0) of struct timespec to zero out if a SIGIO interrupt
+ happens. */
+struct timespec *input_available_clear_time;
+
+/* True means use SIGIO interrupts; false means use CBREAK mode.
+ Default is true if INTERRUPT_INPUT is defined. */
+bool interrupt_input;
+
+/* Nonzero while interrupts are temporarily deferred during redisplay. */
+bool interrupts_deferred;
+
+/* The time when Emacs started being idle. */
+
+static struct timespec timer_idleness_start_time;
+
+/* After Emacs stops being idle, this saves the last value
+ of timer_idleness_start_time from when it was idle. */
+
+static struct timespec timer_last_idleness_start_time;
+
+
+/* Global variable declarations. */
+
+/* Flags for readable_events. */
+#define READABLE_EVENTS_DO_TIMERS_NOW (1 << 0)
+#define READABLE_EVENTS_FILTER_EVENTS (1 << 1)
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES (1 << 2)
+
+/* Function for init_keyboard to call with no args (if nonzero). */
+static void (*keyboard_init_hook) (void);
+
+static bool get_input_pending (int);
+static bool readable_events (int);
+static Lisp_Object read_char_x_menu_prompt (Lisp_Object,
+ Lisp_Object, bool *);
+static Lisp_Object read_char_minibuf_menu_prompt (int, Lisp_Object);
+static Lisp_Object make_lispy_event (struct input_event *);
+static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object,
+ enum scroll_bar_part,
+ Lisp_Object, Lisp_Object,
+ Time);
+static Lisp_Object modify_event_symbol (ptrdiff_t, int, Lisp_Object,
+ Lisp_Object, const char *const *,
+ Lisp_Object *, ptrdiff_t);
+static Lisp_Object make_lispy_switch_frame (Lisp_Object);
+static Lisp_Object make_lispy_focus_in (Lisp_Object);
+#ifdef HAVE_WINDOW_SYSTEM
+static Lisp_Object make_lispy_focus_out (Lisp_Object);
+#endif /* HAVE_WINDOW_SYSTEM */
+static bool help_char_p (Lisp_Object);
+static void save_getcjmp (sys_jmp_buf);
+static void restore_getcjmp (sys_jmp_buf);
+static Lisp_Object apply_modifiers (int, Lisp_Object);
+static void clear_event (struct input_event *);
+static void restore_kboard_configuration (int);
+#ifdef USABLE_SIGIO
+static void deliver_input_available_signal (int signo);
+#endif
+static void handle_interrupt (bool);
+static _Noreturn void quit_throw_to_read_char (bool);
+static void process_special_events (void);
+static void timer_start_idle (void);
+static void timer_stop_idle (void);
+static void timer_resume_idle (void);
+static void deliver_user_signal (int);
+static char *find_user_signal_name (int);
+static void store_user_signal_events (void);
+
+/* These setters are used only in this file, so they can be private. */
+static void
+kset_echo_string (struct kboard *kb, Lisp_Object val)
+{
+ kb->echo_string_ = val;
+}
+static void
+kset_kbd_queue (struct kboard *kb, Lisp_Object val)
+{
+ kb->kbd_queue_ = val;
+}
+static void
+kset_keyboard_translate_table (struct kboard *kb, Lisp_Object val)
+{
+ kb->Vkeyboard_translate_table_ = val;
+}
+static void
+kset_last_prefix_arg (struct kboard *kb, Lisp_Object val)
+{
+ kb->Vlast_prefix_arg_ = val;
+}
+static void
+kset_last_repeatable_command (struct kboard *kb, Lisp_Object val)
+{
+ kb->Vlast_repeatable_command_ = val;
+}
+static void
+kset_local_function_key_map (struct kboard *kb, Lisp_Object val)
+{
+ kb->Vlocal_function_key_map_ = val;
+}
+static void
+kset_overriding_terminal_local_map (struct kboard *kb, Lisp_Object val)
+{
+ kb->Voverriding_terminal_local_map_ = val;
+}
+static void
+kset_real_last_command (struct kboard *kb, Lisp_Object val)
+{
+ kb->Vreal_last_command_ = val;
+}
+static void
+kset_system_key_syms (struct kboard *kb, Lisp_Object val)
+{
+ kb->system_key_syms_ = val;
+}
+
+
+/* Add C to the echo string, without echoing it immediately. C can be
+ a character, which is pretty-printed, or a symbol, whose name is
+ printed. */
+
+static void
+echo_add_key (Lisp_Object c)
+{
+ char initbuf[KEY_DESCRIPTION_SIZE + 100];
+ ptrdiff_t size = sizeof initbuf;
+ char *buffer = initbuf;
+ char *ptr = buffer;
+ Lisp_Object echo_string;
+ USE_SAFE_ALLOCA;
+
+ echo_string = KVAR (current_kboard, echo_string);
+
+ /* If someone has passed us a composite event, use its head symbol. */
+ c = EVENT_HEAD (c);
+
+ if (INTEGERP (c))
+ ptr = push_key_description (XINT (c), ptr);
+ else if (SYMBOLP (c))
+ {
+ Lisp_Object name = SYMBOL_NAME (c);
+ ptrdiff_t nbytes = SBYTES (name);
+
+ if (size - (ptr - buffer) < nbytes)
+ {
+ ptrdiff_t offset = ptr - buffer;
+ size = max (2 * size, size + nbytes);
+ buffer = SAFE_ALLOCA (size);
+ ptr = buffer + offset;
+ }
+
+ ptr += copy_text (SDATA (name), (unsigned char *) ptr, nbytes,
+ STRING_MULTIBYTE (name), 1);
+ }
+
+ if ((NILP (echo_string) || SCHARS (echo_string) == 0)
+ && help_char_p (c))
+ {
+ static const char text[] = " (Type ? for further options)";
+ int len = sizeof text - 1;
+
+ if (size - (ptr - buffer) < len)
+ {
+ ptrdiff_t offset = ptr - buffer;
+ size += len;
+ buffer = SAFE_ALLOCA (size);
+ ptr = buffer + offset;
+ }
+
+ memcpy (ptr, text, len);
+ ptr += len;
+ }
+
+ /* Replace a dash from echo_dash with a space, otherwise add a space
+ at the end as a separator between keys. */
+ AUTO_STRING (space, " ");
+ if (STRINGP (echo_string) && SCHARS (echo_string) > 1)
+ {
+ Lisp_Object last_char, prev_char, idx;
+
+ idx = make_number (SCHARS (echo_string) - 2);
+ prev_char = Faref (echo_string, idx);
+
+ idx = make_number (SCHARS (echo_string) - 1);
+ last_char = Faref (echo_string, idx);
+
+ /* We test PREV_CHAR to make sure this isn't the echoing of a
+ minus-sign. */
+ if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
+ Faset (echo_string, idx, make_number (' '));
+ else
+ echo_string = concat2 (echo_string, space);
+ }
+ else if (STRINGP (echo_string) && SCHARS (echo_string) > 0)
+ echo_string = concat2 (echo_string, space);
+
+ kset_echo_string
+ (current_kboard,
+ concat2 (echo_string, make_string (buffer, ptr - buffer)));
+ SAFE_FREE ();
+}
+
+/* Add C to the echo string, if echoing is going on. C can be a
+ character or a symbol. */
+
+static void
+echo_char (Lisp_Object c)
+{
+ if (current_kboard->immediate_echo)
+ {
+ echo_add_key (c);
+ echo_now ();
+ }
+}
+
+/* Temporarily add a dash to the end of the echo string if it's not
+ empty, so that it serves as a mini-prompt for the very next
+ character. */
+
+static void
+echo_dash (void)
+{
+ /* Do nothing if not echoing at all. */
+ if (NILP (KVAR (current_kboard, echo_string)))
+ return;
+
+ if (this_command_key_count == 0)
+ return;
+
+ if (!current_kboard->immediate_echo
+ && SCHARS (KVAR (current_kboard, echo_string)) == 0)
+ return;
+
+ /* Do nothing if we just printed a prompt. */
+ if (current_kboard->echo_after_prompt
+ == SCHARS (KVAR (current_kboard, echo_string)))
+ return;
+
+ /* Do nothing if we have already put a dash at the end. */
+ if (SCHARS (KVAR (current_kboard, echo_string)) > 1)
+ {
+ Lisp_Object last_char, prev_char, idx;
+
+ idx = make_number (SCHARS (KVAR (current_kboard, echo_string)) - 2);
+ prev_char = Faref (KVAR (current_kboard, echo_string), idx);
+
+ idx = make_number (SCHARS (KVAR (current_kboard, echo_string)) - 1);
+ last_char = Faref (KVAR (current_kboard, echo_string), idx);
+
+ if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
+ return;
+ }
+
+ /* Put a dash at the end of the buffer temporarily,
+ but make it go away when the next character is added. */
+ AUTO_STRING (dash, "-");
+ kset_echo_string (current_kboard,
+ concat2 (KVAR (current_kboard, echo_string), dash));
+ echo_now ();
+}
+
+/* Display the current echo string, and begin echoing if not already
+ doing so. */
+
+static void
+echo_now (void)
+{
+ if (!current_kboard->immediate_echo)
+ {
+ ptrdiff_t i;
+ current_kboard->immediate_echo = 1;
+
+ for (i = 0; i < this_command_key_count; i++)
+ {
+ Lisp_Object c;
+
+ /* Set before_command_echo_length to the value that would
+ have been saved before the start of this subcommand in
+ command_loop_1, if we had already been echoing then. */
+ if (i == this_single_command_key_start)
+ before_command_echo_length = echo_length ();
+
+ c = AREF (this_command_keys, i);
+ if (! (EVENT_HAS_PARAMETERS (c)
+ && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
+ echo_char (c);
+ }
+
+ /* Set before_command_echo_length to the value that would
+ have been saved before the start of this subcommand in
+ command_loop_1, if we had already been echoing then. */
+ if (this_command_key_count == this_single_command_key_start)
+ before_command_echo_length = echo_length ();
+
+ /* Put a dash at the end to invite the user to type more. */
+ echo_dash ();
+ }
+
+ echoing = 1;
+ /* FIXME: Use call (Qmessage) so it can be advised (e.g. emacspeak). */
+ message3_nolog (KVAR (current_kboard, echo_string));
+ echoing = 0;
+
+ /* Record in what buffer we echoed, and from which kboard. */
+ echo_message_buffer = echo_area_buffer[0];
+ echo_kboard = current_kboard;
+
+ if (waiting_for_input && !NILP (Vquit_flag))
+ quit_throw_to_read_char (0);
+}
+
+/* Turn off echoing, for the start of a new command. */
+
+void
+cancel_echoing (void)
+{
+ current_kboard->immediate_echo = 0;
+ current_kboard->echo_after_prompt = -1;
+ kset_echo_string (current_kboard, Qnil);
+ ok_to_echo_at_next_pause = NULL;
+ echo_kboard = NULL;
+ echo_message_buffer = Qnil;
+}
+
+/* Return the length of the current echo string. */
+
+static ptrdiff_t
+echo_length (void)
+{
+ return (STRINGP (KVAR (current_kboard, echo_string))
+ ? SCHARS (KVAR (current_kboard, echo_string))
+ : 0);
+}
+
+/* Truncate the current echo message to its first LEN chars.
+ This and echo_char get used by read_key_sequence when the user
+ switches frames while entering a key sequence. */
+
+static void
+echo_truncate (ptrdiff_t nchars)
+{
+ if (STRINGP (KVAR (current_kboard, echo_string)))
+ kset_echo_string (current_kboard,
+ Fsubstring (KVAR (current_kboard, echo_string),
+ make_number (0), make_number (nchars)));
+ truncate_echo_area (nchars);
+}
+
+
+/* Functions for manipulating this_command_keys. */
+static void
+add_command_key (Lisp_Object key)
+{
+#if 0 /* Not needed after we made Freset_this_command_lengths
+ do the job immediately. */
+ /* If reset-this-command-length was called recently, obey it now.
+ See the doc string of that function for an explanation of why. */
+ if (before_command_restore_flag)
+ {
+ this_command_key_count = before_command_key_count_1;
+ if (this_command_key_count < this_single_command_key_start)
+ this_single_command_key_start = this_command_key_count;
+ echo_truncate (before_command_echo_length_1);
+ before_command_restore_flag = 0;
+ }
+#endif
+
+ if (this_command_key_count >= ASIZE (this_command_keys))
+ this_command_keys = larger_vector (this_command_keys, 1, -1);
+
+ ASET (this_command_keys, this_command_key_count, key);
+ ++this_command_key_count;
+}
+
+
+Lisp_Object
+recursive_edit_1 (void)
+{
+ ptrdiff_t count = SPECPDL_INDEX ();
+ Lisp_Object val;
+
+ if (command_loop_level > 0)
+ {
+ specbind (Qstandard_output, Qt);
+ specbind (Qstandard_input, Qt);
+ }
+
+#ifdef HAVE_WINDOW_SYSTEM
+ /* The command loop has started an hourglass timer, so we have to
+ cancel it here, otherwise it will fire because the recursive edit
+ can take some time. Do not check for display_hourglass_p here,
+ because it could already be nil. */
+ cancel_hourglass ();
+#endif
+
+ /* This function may have been called from a debugger called from
+ within redisplay, for instance by Edebugging a function called
+ from fontification-functions. We want to allow redisplay in
+ the debugging session.
+
+ The recursive edit is left with a `(throw exit ...)'. The `exit'
+ tag is not caught anywhere in redisplay, i.e. when we leave the
+ recursive edit, the original redisplay leading to the recursive
+ edit will be unwound. The outcome should therefore be safe. */
+ specbind (Qinhibit_redisplay, Qnil);
+ redisplaying_p = 0;
+
+ val = command_loop ();
+ if (EQ (val, Qt))
+ Fsignal (Qquit, Qnil);
+ /* Handle throw from read_minibuf when using minibuffer
+ while it's active but we're in another window. */
+ if (STRINGP (val))
+ xsignal1 (Qerror, val);
+
+ return unbind_to (count, Qnil);
+}
+
+/* When an auto-save happens, record the "time", and don't do again soon. */
+
+void
+record_auto_save (void)
+{
+ last_auto_save = num_nonmacro_input_events;
+}
+
+/* Make an auto save happen as soon as possible at command level. */
+
+#ifdef SIGDANGER
+void
+force_auto_save_soon (void)
+{
+ last_auto_save = - auto_save_interval - 1;
+
+ record_asynch_buffer_change ();
+}
+#endif
+
+DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
+ doc: /* Invoke the editor command loop recursively.
+To get out of the recursive edit, a command can throw to `exit' -- for
+instance `(throw 'exit nil)'.
+If you throw a value other than t, `recursive-edit' returns normally
+to the function that called it. Throwing a t value causes
+`recursive-edit' to quit, so that control returns to the command loop
+one level up.
+
+This function is called by the editor initialization to begin editing. */)
+ (void)
+{
+ ptrdiff_t count = SPECPDL_INDEX ();
+ Lisp_Object buffer;
+
+ /* If we enter while input is blocked, don't lock up here.
+ This may happen through the debugger during redisplay. */
+ if (input_blocked_p ())
+ return Qnil;
+
+ if (command_loop_level >= 0
+ && current_buffer != XBUFFER (XWINDOW (selected_window)->contents))
+ buffer = Fcurrent_buffer ();
+ else
+ buffer = Qnil;
+
+ /* Don't do anything interesting between the increment and the
+ record_unwind_protect! Otherwise, we could get distracted and
+ never decrement the counter again. */
+ command_loop_level++;
+ update_mode_lines = 17;
+ record_unwind_protect (recursive_edit_unwind, buffer);
+
+ /* If we leave recursive_edit_1 below with a `throw' for instance,
+ like it is done in the splash screen display, we have to
+ make sure that we restore single_kboard as command_loop_1
+ would have done if it were left normally. */
+ if (command_loop_level > 0)
+ temporarily_switch_to_single_kboard (SELECTED_FRAME ());
+
+ recursive_edit_1 ();
+ return unbind_to (count, Qnil);
+}
+
+void
+recursive_edit_unwind (Lisp_Object buffer)
+{
+ if (BUFFERP (buffer))
+ Fset_buffer (buffer);
+
+ command_loop_level--;
+ update_mode_lines = 18;
+}
+
+
+#if 0 /* These two functions are now replaced with
+ temporarily_switch_to_single_kboard. */
+static void
+any_kboard_state ()
+{
+#if 0 /* Theory: if there's anything in Vunread_command_events,
+ it will right away be read by read_key_sequence,
+ and then if we do switch KBOARDS, it will go into the side
+ queue then. So we don't need to do anything special here -- rms. */
+ if (CONSP (Vunread_command_events))
+ {
+ current_kboard->kbd_queue
+ = nconc2 (Vunread_command_events, current_kboard->kbd_queue);
+ current_kboard->kbd_queue_has_data = 1;
+ }
+ Vunread_command_events = Qnil;
+#endif
+ single_kboard = 0;
+}
+
+/* Switch to the single-kboard state, making current_kboard
+ the only KBOARD from which further input is accepted. */
+
+void
+single_kboard_state ()
+{
+ single_kboard = 1;
+}
+#endif
+
+/* If we're in single_kboard state for kboard KBOARD,
+ get out of it. */
+
+void
+not_single_kboard_state (KBOARD *kboard)
+{
+ if (kboard == current_kboard)
+ single_kboard = 0;
+}
+
+/* Maintain a stack of kboards, so other parts of Emacs
+ can switch temporarily to the kboard of a given frame
+ and then revert to the previous status. */
+
+struct kboard_stack
+{
+ KBOARD *kboard;
+ struct kboard_stack *next;
+};
+
+static struct kboard_stack *kboard_stack;
+
+void
+push_kboard (struct kboard *k)
+{
+ struct kboard_stack *p = xmalloc (sizeof *p);
+
+ p->next = kboard_stack;
+ p->kboard = current_kboard;
+ kboard_stack = p;
+
+ current_kboard = k;
+}
+
+void
+pop_kboard (void)
+{
+ struct terminal *t;
+ struct kboard_stack *p = kboard_stack;
+ bool found = 0;
+ for (t = terminal_list; t; t = t->next_terminal)
+ {
+ if (t->kboard == p->kboard)
+ {
+ current_kboard = p->kboard;
+ found = 1;
+ break;
+ }
+ }
+ if (!found)
+ {
+ /* The terminal we remembered has been deleted. */
+ current_kboard = FRAME_KBOARD (SELECTED_FRAME ());
+ single_kboard = 0;
+ }
+ kboard_stack = p->next;
+ xfree (p);
+}
+
+/* Switch to single_kboard mode, making current_kboard the only KBOARD
+ from which further input is accepted. If F is non-nil, set its
+ KBOARD as the current keyboard.
+
+ This function uses record_unwind_protect_int to return to the previous
+ state later.
+
+ If Emacs is already in single_kboard mode, and F's keyboard is
+ locked, then this function will throw an error. */
+
+void
+temporarily_switch_to_single_kboard (struct frame *f)
+{
+ bool was_locked = single_kboard;
+ if (was_locked)
+ {
+ if (f != NULL && FRAME_KBOARD (f) != current_kboard)
+ /* We can not switch keyboards while in single_kboard mode.
+ In rare cases, Lisp code may call `recursive-edit' (or
+ `read-minibuffer' or `y-or-n-p') after it switched to a
+ locked frame. For example, this is likely to happen
+ when server.el connects to a new terminal while Emacs is in
+ single_kboard mode. It is best to throw an error instead
+ of presenting the user with a frozen screen. */
+ error ("Terminal %d is locked, cannot read from it",
+ FRAME_TERMINAL (f)->id);
+ else
+ /* This call is unnecessary, but helps
+ `restore_kboard_configuration' discover if somebody changed
+ `current_kboard' behind our back. */
+ push_kboard (current_kboard);
+ }
+ else if (f != NULL)
+ current_kboard = FRAME_KBOARD (f);
+ single_kboard = 1;
+ record_unwind_protect_int (restore_kboard_configuration, was_locked);
+}
+
+#if 0 /* This function is not needed anymore. */
+void
+record_single_kboard_state ()
+{
+ if (single_kboard)
+ push_kboard (current_kboard);
+ record_unwind_protect_int (restore_kboard_configuration, single_kboard);
+}
+#endif
+
+static void
+restore_kboard_configuration (int was_locked)
+{
+ single_kboard = was_locked;
+ if (was_locked)
+ {
+ struct kboard *prev = current_kboard;
+ pop_kboard ();
+ /* The pop should not change the kboard. */
+ if (single_kboard && current_kboard != prev)
+ emacs_abort ();
+ }
+}
+
+
+/* Handle errors that are not handled at inner levels
+ by printing an error message and returning to the editor command loop. */
+
+static Lisp_Object
+cmd_error (Lisp_Object data)
+{
+ Lisp_Object old_level, old_length;
+ char macroerror[sizeof "After..kbd macro iterations: "
+ + INT_STRLEN_BOUND (EMACS_INT)];
+
+#ifdef HAVE_WINDOW_SYSTEM
+ if (display_hourglass_p)
+ cancel_hourglass ();
+#endif
+
+ if (!NILP (executing_kbd_macro))
+ {
+ if (executing_kbd_macro_iterations == 1)
+ sprintf (macroerror, "After 1 kbd macro iteration: ");
+ else
+ sprintf (macroerror, "After %"pI"d kbd macro iterations: ",
+ executing_kbd_macro_iterations);
+ }
+ else
+ *macroerror = 0;
+
+ Vstandard_output = Qt;
+ Vstandard_input = Qt;
+ Vexecuting_kbd_macro = Qnil;
+ executing_kbd_macro = Qnil;
+ kset_prefix_arg (current_kboard, Qnil);
+ kset_last_prefix_arg (current_kboard, Qnil);
+ cancel_echoing ();
+
+ /* Avoid unquittable loop if data contains a circular list. */
+ old_level = Vprint_level;
+ old_length = Vprint_length;
+ XSETFASTINT (Vprint_level, 10);
+ XSETFASTINT (Vprint_length, 10);
+ cmd_error_internal (data, macroerror);
+ Vprint_level = old_level;
+ Vprint_length = old_length;
+
+ Vquit_flag = Qnil;
+ Vinhibit_quit = Qnil;
+
+ return make_number (0);
+}
+
+/* Take actions on handling an error. DATA is the data that describes
+ the error.
+
+ CONTEXT is a C-string containing ASCII characters only which
+ describes the context in which the error happened. If we need to
+ generalize CONTEXT to allow multibyte characters, make it a Lisp
+ string. */
+
+void
+cmd_error_internal (Lisp_Object data, const char *context)
+{
+ /* The immediate context is not interesting for Quits,
+ since they are asynchronous. */
+ if (EQ (XCAR (data), Qquit))
+ Vsignaling_function = Qnil;
+
+ Vquit_flag = Qnil;
+ Vinhibit_quit = Qt;
+
+ /* Use user's specified output function if any. */
+ if (!NILP (Vcommand_error_function))
+ call3 (Vcommand_error_function, data,
+ context ? build_string (context) : empty_unibyte_string,
+ Vsignaling_function);
+
+ Vsignaling_function = Qnil;
+}
+
+DEFUN ("command-error-default-function", Fcommand_error_default_function,
+ Scommand_error_default_function, 3, 3, 0,
+ doc: /* Produce default output for unhandled error message.
+Default value of `command-error-function'. */)
+ (Lisp_Object data, Lisp_Object context, Lisp_Object signal)
+{
+ struct frame *sf = SELECTED_FRAME ();
+
+ CHECK_STRING (context);
+
+ /* If the window system or terminal frame hasn't been initialized
+ yet, or we're not interactive, write the message to stderr and exit. */
+ if (!sf->glyphs_initialized_p
+ /* The initial frame is a special non-displaying frame. It
+ will be current in daemon mode when there are no frames
+ to display, and in non-daemon mode before the real frame
+ has finished initializing. If an error is thrown in the
+ latter case while creating the frame, then the frame
+ will never be displayed, so the safest thing to do is
+ write to stderr and quit. In daemon mode, there are
+ many other potential errors that do not prevent frames
+ from being created, so continuing as normal is better in
+ that case. */
+ || (!IS_DAEMON && FRAME_INITIAL_P (sf))
+ || noninteractive)
+ {
+ print_error_message (data, Qexternal_debugging_output,
+ SSDATA (context), signal);
+ Fterpri (Qexternal_debugging_output, Qnil);
+ Fkill_emacs (make_number (-1));
+ }
+ else
+ {
+ clear_message (1, 0);
+ Fdiscard_input ();
+ message_log_maybe_newline ();
+ bitch_at_user ();
+
+ print_error_message (data, Qt, SSDATA (context), signal);
+ }
+ return Qnil;
+}
+
+static Lisp_Object command_loop_2 (Lisp_Object);
+static Lisp_Object top_level_1 (Lisp_Object);
+
+/* Entry to editor-command-loop.
+ This level has the catches for exiting/returning to editor command loop.
+ It returns nil to exit recursive edit, t to abort it. */
+
+Lisp_Object
+command_loop (void)
+{
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+ /* At least on GNU/Linux, saving signal mask is important here. */
+ if (sigsetjmp (return_to_command_loop, 1) != 0)
+ {
+ /* Comes here from handle_sigsegv, see sysdep.c. */
+ init_eval ();
+ Vinternal__top_level_message = recover_top_level_message;
+ }
+ else
+ Vinternal__top_level_message = regular_top_level_message;
+#endif /* HAVE_STACK_OVERFLOW_HANDLING */
+ if (command_loop_level > 0 || minibuf_level > 0)
+ {
+ Lisp_Object val;
+ val = internal_catch (Qexit, command_loop_2, Qnil);
+ executing_kbd_macro = Qnil;
+ return val;
+ }
+ else
+ while (1)
+ {
+ internal_catch (Qtop_level, top_level_1, Qnil);
+ internal_catch (Qtop_level, command_loop_2, Qnil);
+ executing_kbd_macro = Qnil;
+
+ /* End of file in -batch run causes exit here. */
+ if (noninteractive)
+ Fkill_emacs (Qt);
+ }
+}
+
+/* Here we catch errors in execution of commands within the
+ editing loop, and reenter the editing loop.
+ When there is an error, cmd_error runs and returns a non-nil
+ value to us. A value of nil means that command_loop_1 itself
+ returned due to end of file (or end of kbd macro). */
+
+static Lisp_Object
+command_loop_2 (Lisp_Object ignore)
+{
+ register Lisp_Object val;
+
+ do
+ val = internal_condition_case (command_loop_1, Qerror, cmd_error);
+ while (!NILP (val));
+
+ return Qnil;
+}
+
+static Lisp_Object
+top_level_2 (void)
+{
+ return Feval (Vtop_level, Qnil);
+}
+
+static Lisp_Object
+top_level_1 (Lisp_Object ignore)
+{
+ /* On entry to the outer level, run the startup file. */
+ if (!NILP (Vtop_level))
+ internal_condition_case (top_level_2, Qerror, cmd_error);
+ else if (!NILP (Vpurify_flag))
+ message1 ("Bare impure Emacs (standard Lisp code not loaded)");
+ else
+ message1 ("Bare Emacs (standard Lisp code not loaded)");
+ return Qnil;
+}
+
+DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
+ doc: /* Exit all recursive editing levels.
+This also exits all active minibuffers. */
+ attributes: noreturn)
+ (void)
+{
+#ifdef HAVE_WINDOW_SYSTEM
+ if (display_hourglass_p)
+ cancel_hourglass ();
+#endif
+
+ /* Unblock input if we enter with input blocked. This may happen if
+ redisplay traps e.g. during tool-bar update with input blocked. */
+ totally_unblock_input ();
+
+ Fthrow (Qtop_level, Qnil);
+}
+
+static _Noreturn void
+user_error (const char *msg)
+{
+ xsignal1 (Quser_error, build_string (msg));
+}
+
+/* _Noreturn will be added to prototype by make-docfile. */
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 0, "",
+ doc: /* Exit from the innermost recursive edit or minibuffer. */
+ attributes: noreturn)
+ (void)
+{
+ if (command_loop_level > 0 || minibuf_level > 0)
+ Fthrow (Qexit, Qnil);
+
+ user_error ("No recursive edit is in progress");
+}
+
+/* _Noreturn will be added to prototype by make-docfile. */
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 0, 0, "",
+ doc: /* Abort the command that requested this recursive edit or minibuffer input. */
+ attributes: noreturn)
+ (void)
+{
+ if (command_loop_level > 0 || minibuf_level > 0)
+ Fthrow (Qexit, Qt);
+
+ user_error ("No recursive edit is in progress");
+}
+
+/* Restore mouse tracking enablement. See Ftrack_mouse for the only use
+ of this function. */
+
+static void
+tracking_off (Lisp_Object old_value)
+{
+ do_mouse_tracking = old_value;
+ if (NILP (old_value))
+ {
+ /* Redisplay may have been preempted because there was input
+ available, and it assumes it will be called again after the
+ input has been processed. If the only input available was
+ the sort that we have just disabled, then we need to call
+ redisplay. */
+ if (!readable_events (READABLE_EVENTS_DO_TIMERS_NOW))
+ {
+ redisplay_preserve_echo_area (6);
+ get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW);
+ }
+ }
+}
+
+DEFUN ("internal--track-mouse", Ftrack_mouse, Strack_mouse, 1, 1, 0,
+ doc: /* Call BODYFUN with mouse movement events enabled. */)
+ (Lisp_Object bodyfun)
+{
+ ptrdiff_t count = SPECPDL_INDEX ();
+ Lisp_Object val;
+
+ record_unwind_protect (tracking_off, do_mouse_tracking);
+
+ do_mouse_tracking = Qt;
+
+ val = call0 (bodyfun);
+ return unbind_to (count, val);
+}
+
+/* If mouse has moved on some frame, return one of those frames.
+
+ Return 0 otherwise.
+
+ If ignore_mouse_drag_p is non-zero, ignore (implicit) mouse movement
+ after resizing the tool-bar window. */
+
+bool ignore_mouse_drag_p;
+
+static struct frame *
+some_mouse_moved (void)
+{
+ Lisp_Object tail, frame;
+
+ if (ignore_mouse_drag_p)
+ {
+ /* ignore_mouse_drag_p = 0; */
+ return 0;
+ }
+
+ FOR_EACH_FRAME (tail, frame)
+ {
+ if (XFRAME (frame)->mouse_moved)
+ return XFRAME (frame);
+ }
+
+ return 0;
+}
+
+
+/* This is the actual command reading loop,
+ sans error-handling encapsulation. */
+
+static int read_key_sequence (Lisp_Object *, int, Lisp_Object,
+ bool, bool, bool, bool);
+static void adjust_point_for_property (ptrdiff_t, bool);
+
+/* The last boundary auto-added to buffer-undo-list. */
+Lisp_Object last_undo_boundary;
+
+/* FIXME: This is wrong rather than test window-system, we should call
+ a new set-selection, which will then dispatch to x-set-selection, or
+ tty-set-selection, or w32-set-selection, ... */
+
+Lisp_Object
+command_loop_1 (void)
+{
+ Lisp_Object cmd;
+ Lisp_Object keybuf[30];
+ int i;
+ EMACS_INT prev_modiff = 0;
+ struct buffer *prev_buffer = NULL;
+ bool already_adjusted = 0;
+
+ kset_prefix_arg (current_kboard, Qnil);
+ kset_last_prefix_arg (current_kboard, Qnil);
+ Vdeactivate_mark = Qnil;
+ waiting_for_input = 0;
+ cancel_echoing ();
+
+ this_command_key_count = 0;
+ this_command_key_count_reset = 0;
+ this_single_command_key_start = 0;
+
+ if (NILP (Vmemory_full))
+ {
+ /* Make sure this hook runs after commands that get errors and
+ throw to top level. */
+ /* Note that the value cell will never directly contain nil
+ if the symbol is a local variable. */
+ if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
+ safe_run_hooks (Qpost_command_hook);
+
+ /* If displaying a message, resize the echo area window to fit
+ that message's size exactly. */
+ if (!NILP (echo_area_buffer[0]))
+ resize_echo_area_exactly ();
+
+ /* If there are warnings waiting, process them. */
+ if (!NILP (Vdelayed_warnings_list))
+ safe_run_hooks (Qdelayed_warnings_hook);
+
+ if (!NILP (Vdeferred_action_list))
+ safe_run_hooks (Qdeferred_action_function);
+ }
+
+ /* Do this after running Vpost_command_hook, for consistency. */
+ kset_last_command (current_kboard, Vthis_command);
+ kset_real_last_command (current_kboard, Vreal_this_command);
+ if (!CONSP (last_command_event))
+ kset_last_repeatable_command (current_kboard, Vreal_this_command);
+
+ while (1)
+ {
+ if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+ Fkill_emacs (Qnil);
+
+ /* Make sure the current window's buffer is selected. */
+ set_buffer_internal (XBUFFER (XWINDOW (selected_window)->contents));
+
+ /* Display any malloc warning that just came out. Use while because
+ displaying one warning can cause another. */
+
+ while (pending_malloc_warning)
+ display_malloc_warning ();
+
+ Vdeactivate_mark = Qnil;
+
+ /* Don't ignore mouse movements for more than a single command
+ loop. (This flag is set in xdisp.c whenever the tool bar is
+ resized, because the resize moves text up or down, and would
+ generate false mouse drag events if we don't ignore them.) */
+ ignore_mouse_drag_p = 0;
+
+ /* If minibuffer on and echo area in use,
+ wait a short time and redraw minibuffer. */
+
+ if (minibuf_level
+ && !NILP (echo_area_buffer[0])
+ && EQ (minibuf_window, echo_area_window)
+ && NUMBERP (Vminibuffer_message_timeout))
+ {
+ /* Bind inhibit-quit to t so that C-g gets read in
+ rather than quitting back to the minibuffer. */
+ ptrdiff_t count = SPECPDL_INDEX ();
+ specbind (Qinhibit_quit, Qt);
+
+ sit_for (Vminibuffer_message_timeout, 0, 2);
+
+ /* Clear the echo area. */
+ message1 (0);
+ safe_run_hooks (Qecho_area_clear_hook);
+
+ unbind_to (count, Qnil);
+
+ /* If a C-g came in before, treat it as input now. */
+ if (!NILP (Vquit_flag))
+ {
+ Vquit_flag = Qnil;
+ Vunread_command_events = list1 (make_number (quit_char));
+ }
+ }
+
+ /* If it has changed current-menubar from previous value,
+ really recompute the menubar from the value. */
+ if (! NILP (Vlucid_menu_bar_dirty_flag)
+ && !NILP (Ffboundp (Qrecompute_lucid_menubar)))
+ call0 (Qrecompute_lucid_menubar);
+
+ before_command_key_count = this_command_key_count;
+ before_command_echo_length = echo_length ();
+
+ Vthis_command = Qnil;
+ Vreal_this_command = Qnil;
+ Vthis_original_command = Qnil;
+ Vthis_command_keys_shift_translated = Qnil;
+
+ /* Read next key sequence; i gets its length. */
+ i = read_key_sequence (keybuf, ARRAYELTS (keybuf),
+ Qnil, 0, 1, 1, 0);
+
+ /* A filter may have run while we were reading the input. */
+ if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+ Fkill_emacs (Qnil);
+ set_buffer_internal (XBUFFER (XWINDOW (selected_window)->contents));
+
+ ++num_input_keys;
+
+ /* Now we have read a key sequence of length I,
+ or else I is 0 and we found end of file. */
+
+ if (i == 0) /* End of file -- happens only in */
+ return Qnil; /* a kbd macro, at the end. */
+ /* -1 means read_key_sequence got a menu that was rejected.
+ Just loop around and read another command. */
+ if (i == -1)
+ {
+ cancel_echoing ();
+ this_command_key_count = 0;
+ this_command_key_count_reset = 0;
+ this_single_command_key_start = 0;
+ goto finalize;
+ }
+
+ last_command_event = keybuf[i - 1];
+
+ /* If the previous command tried to force a specific window-start,
+ forget about that, in case this command moves point far away
+ from that position. But also throw away beg_unchanged and
+ end_unchanged information in that case, so that redisplay will
+ update the whole window properly. */
+ if (XWINDOW (selected_window)->force_start)
+ {
+ struct buffer *b;
+ XWINDOW (selected_window)->force_start = 0;
+ b = XBUFFER (XWINDOW (selected_window)->contents);
+ BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0;
+ }
+
+ cmd = read_key_sequence_cmd;
+ if (!NILP (Vexecuting_kbd_macro))
+ {
+ if (!NILP (Vquit_flag))
+ {
+ Vexecuting_kbd_macro = Qt;
+ QUIT; /* Make some noise. */
+ /* Will return since macro now empty. */
+ }
+ }
+
+ /* Do redisplay processing after this command except in special
+ cases identified below. */
+ prev_buffer = current_buffer;
+ prev_modiff = MODIFF;
+ last_point_position = PT;
+
+ /* By default, we adjust point to a boundary of a region that
+ has such a property that should be treated intangible
+ (e.g. composition, display). But, some commands will set
+ this variable differently. */
+ Vdisable_point_adjustment = Qnil;
+
+ /* Process filters and timers may have messed with deactivate-mark.
+ reset it before we execute the command. */
+ Vdeactivate_mark = Qnil;
+
+ /* Remap command through active keymaps. */
+ Vthis_original_command = cmd;
+ if (!NILP (read_key_sequence_remapped))
+ cmd = read_key_sequence_remapped;
+
+ /* Execute the command. */
+
+ {
+ total_keys += total_keys < NUM_RECENT_KEYS;
+ ASET (recent_keys, recent_keys_index,
+ Fcons (Qnil, cmd));
+ if (++recent_keys_index >= NUM_RECENT_KEYS)
+ recent_keys_index = 0;
+ }
+ Vthis_command = cmd;
+ Vreal_this_command = cmd;
+ safe_run_hooks (Qpre_command_hook);
+
+ already_adjusted = 0;
+
+ if (NILP (Vthis_command))
+ /* nil means key is undefined. */
+ call0 (Qundefined);
+ else
+ {
+ /* Here for a command that isn't executed directly. */
+
+#ifdef HAVE_WINDOW_SYSTEM
+ ptrdiff_t scount = SPECPDL_INDEX ();
+
+ if (display_hourglass_p
+ && NILP (Vexecuting_kbd_macro))
+ {
+ record_unwind_protect_void (cancel_hourglass);
+ start_hourglass ();
+ }
+#endif
+
+ if (NILP (KVAR (current_kboard, Vprefix_arg))) /* FIXME: Why? --Stef */
+ {
+ Lisp_Object undo = BVAR (current_buffer, undo_list);
+ Fundo_boundary ();
+ last_undo_boundary
+ = (EQ (undo, BVAR (current_buffer, undo_list))
+ ? Qnil : BVAR (current_buffer, undo_list));
+ }
+ call1 (Qcommand_execute, Vthis_command);
+
+#ifdef HAVE_WINDOW_SYSTEM
+ /* Do not check display_hourglass_p here, because
+ `command-execute' could change it, but we should cancel
+ hourglass cursor anyway.
+ But don't cancel the hourglass within a macro
+ just because a command in the macro finishes. */
+ if (NILP (Vexecuting_kbd_macro))
+ unbind_to (scount, Qnil);
+#endif
+ }
+ kset_last_prefix_arg (current_kboard, Vcurrent_prefix_arg);
+
+ safe_run_hooks (Qpost_command_hook);
+
+ /* If displaying a message, resize the echo area window to fit
+ that message's size exactly. */
+ if (!NILP (echo_area_buffer[0]))
+ resize_echo_area_exactly ();
+
+ /* If there are warnings waiting, process them. */
+ if (!NILP (Vdelayed_warnings_list))
+ safe_run_hooks (Qdelayed_warnings_hook);
+
+ safe_run_hooks (Qdeferred_action_function);
+
+ /* If there is a prefix argument,
+ 1) We don't want Vlast_command to be ``universal-argument''
+ (that would be dumb), so don't set Vlast_command,
+ 2) we want to leave echoing on so that the prefix will be
+ echoed as part of this key sequence, so don't call
+ cancel_echoing, and
+ 3) we want to leave this_command_key_count non-zero, so that
+ read_char will realize that it is re-reading a character, and
+ not echo it a second time.
+
+ If the command didn't actually create a prefix arg,
+ but is merely a frame event that is transparent to prefix args,
+ then the above doesn't apply. */
+ if (NILP (KVAR (current_kboard, Vprefix_arg))
+ || CONSP (last_command_event))
+ {
+ kset_last_command (current_kboard, Vthis_command);
+ kset_real_last_command (current_kboard, Vreal_this_command);
+ if (!CONSP (last_command_event))
+ kset_last_repeatable_command (current_kboard, Vreal_this_command);
+ cancel_echoing ();
+ this_command_key_count = 0;
+ this_command_key_count_reset = 0;
+ this_single_command_key_start = 0;
+ }
+
+ if (!NILP (BVAR (current_buffer, mark_active))
+ && !NILP (Vrun_hooks))
+ {
+ /* In Emacs 22, setting transient-mark-mode to `only' was a
+ way of turning it on for just one command. This usage is
+ obsolete, but support it anyway. */
+ if (EQ (Vtransient_mark_mode, Qidentity))
+ Vtransient_mark_mode = Qnil;
+ else if (EQ (Vtransient_mark_mode, Qonly))
+ Vtransient_mark_mode = Qidentity;
+
+ if (!NILP (Vdeactivate_mark))
+ /* If `select-active-regions' is non-nil, this call to
+ `deactivate-mark' also sets the PRIMARY selection. */
+ call0 (Qdeactivate_mark);
+ else
+ {
+ /* Even if not deactivating the mark, set PRIMARY if
+ `select-active-regions' is non-nil. */
+ if (!NILP (Fwindow_system (Qnil))
+ /* Even if mark_active is non-nil, the actual buffer
+ marker may not have been set yet (Bug#7044). */
+ && XMARKER (BVAR (current_buffer, mark))->buffer
+ && (EQ (Vselect_active_regions, Qonly)
+ ? EQ (CAR_SAFE (Vtransient_mark_mode), Qonly)
+ : (!NILP (Vselect_active_regions)
+ && !NILP (Vtransient_mark_mode)))
+ && NILP (Fmemq (Vthis_command,
+ Vselection_inhibit_update_commands)))
+ {
+ Lisp_Object txt
+ = call1 (Fsymbol_value (Qregion_extract_function), Qnil);
+ if (XINT (Flength (txt)) > 0)
+ /* Don't set empty selections. */
+ call2 (Qgui_set_selection, QPRIMARY, txt);
+ }
+
+ if (current_buffer != prev_buffer || MODIFF != prev_modiff)
+ run_hook (intern ("activate-mark-hook"));
+ }
+
+ Vsaved_region_selection = Qnil;
+ }
+
+ finalize:
+
+ if (current_buffer == prev_buffer
+ && last_point_position != PT
+ && NILP (Vdisable_point_adjustment)
+ && NILP (Vglobal_disable_point_adjustment))
+ {
+ if (last_point_position > BEGV
+ && last_point_position < ZV
+ && (composition_adjust_point (last_point_position,
+ last_point_position)
+ != last_point_position))
+ /* The last point was temporarily set within a grapheme
+ cluster to prevent automatic composition. To recover
+ the automatic composition, we must update the
+ display. */
+ windows_or_buffers_changed = 21;
+ if (!already_adjusted)
+ adjust_point_for_property (last_point_position,
+ MODIFF != prev_modiff);
+ }
+
+ /* Install chars successfully executed in kbd macro. */
+
+ if (!NILP (KVAR (current_kboard, defining_kbd_macro))
+ && NILP (KVAR (current_kboard, Vprefix_arg)))
+ finalize_kbd_macro_chars ();
+ }
+}
+
+Lisp_Object
+read_menu_command (void)
+{
+ Lisp_Object keybuf[30];
+ ptrdiff_t count = SPECPDL_INDEX ();
+ int i;
+
+ /* We don't want to echo the keystrokes while navigating the
+ menus. */
+ specbind (Qecho_keystrokes, make_number (0));
+
+ i = read_key_sequence (keybuf, ARRAYELTS (keybuf),
+ Qnil, 0, 1, 1, 1);
+
+ unbind_to (count, Qnil);
+
+ if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+ Fkill_emacs (Qnil);
+ if (i == 0 || i == -1)
+ return Qt;
+
+ return read_key_sequence_cmd;
+}
+
+/* Adjust point to a boundary of a region that has such a property
+ that should be treated intangible. For the moment, we check
+ `composition', `display' and `invisible' properties.
+ LAST_PT is the last position of point. */
+
+static void
+adjust_point_for_property (ptrdiff_t last_pt, bool modified)
+{
+ ptrdiff_t beg, end;
+ Lisp_Object val, overlay, tmp;
+ /* When called after buffer modification, we should temporarily
+ suppress the point adjustment for automatic composition so that a
+ user can keep inserting another character at point or keep
+ deleting characters around point. */
+ bool check_composition = ! modified, check_display = 1, check_invisible = 1;
+ ptrdiff_t orig_pt = PT;
+
+ /* FIXME: cycling is probably not necessary because these properties
+ can't be usefully combined anyway. */
+ while (check_composition || check_display || check_invisible)
+ {
+ /* FIXME: check `intangible'. */
+ if (check_composition
+ && PT > BEGV && PT < ZV
+ && (beg = composition_adjust_point (last_pt, PT)) != PT)
+ {
+ SET_PT (beg);
+ check_display = check_invisible = 1;
+ }
+ check_composition = 0;
+ if (check_display
+ && PT > BEGV && PT < ZV
+ && !NILP (val = get_char_property_and_overlay
+ (make_number (PT), Qdisplay, Qnil, &overlay))
+ && display_prop_intangible_p (val, overlay, PT, PT_BYTE)
+ && (!OVERLAYP (overlay)
+ ? get_property_and_range (PT, Qdisplay, &val, &beg, &end, Qnil)
+ : (beg = OVERLAY_POSITION (OVERLAY_START (overlay)),
+ end = OVERLAY_POSITION (OVERLAY_END (overlay))))
+ && (beg < PT /* && end > PT <- It's always the case. */
+ || (beg <= PT && STRINGP (val) && SCHARS (val) == 0)))
+ {
+ eassert (end > PT);
+ SET_PT (PT < last_pt
+ ? (STRINGP (val) && SCHARS (val) == 0
+ ? max (beg - 1, BEGV)
+ : beg)
+ : end);
+ check_composition = check_invisible = 1;
+ }
+ check_display = 0;
+ if (check_invisible && PT > BEGV && PT < ZV)
+ {
+ int inv;
+ bool ellipsis = 0;
+ beg = end = PT;
+
+ /* Find boundaries `beg' and `end' of the invisible area, if any. */
+ while (end < ZV
+#if 0
+ /* FIXME: We should stop if we find a spot between
+ two runs of `invisible' where inserted text would
+ be visible. This is important when we have two
+ invisible boundaries that enclose an area: if the
+ area is empty, we need this test in order to make
+ it possible to place point in the middle rather
+ than skip both boundaries. However, this code
+ also stops anywhere in a non-sticky text-property,
+ which breaks (e.g.) Org mode. */
+ && (val = Fget_pos_property (make_number (end),
+ Qinvisible, Qnil),
+ TEXT_PROP_MEANS_INVISIBLE (val))
+#endif
+ && !NILP (val = get_char_property_and_overlay
+ (make_number (end), Qinvisible, Qnil, &overlay))
+ && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
+ {
+ ellipsis = ellipsis || inv > 1
+ || (OVERLAYP (overlay)
+ && (!NILP (Foverlay_get (overlay, Qafter_string))
+ || !NILP (Foverlay_get (overlay, Qbefore_string))));
+ tmp = Fnext_single_char_property_change
+ (make_number (end), Qinvisible, Qnil, Qnil);
+ end = NATNUMP (tmp) ? XFASTINT (tmp) : ZV;
+ }
+ while (beg > BEGV
+#if 0
+ && (val = Fget_pos_property (make_number (beg),
+ Qinvisible, Qnil),
+ TEXT_PROP_MEANS_INVISIBLE (val))
+#endif
+ && !NILP (val = get_char_property_and_overlay
+ (make_number (beg - 1), Qinvisible, Qnil, &overlay))
+ && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
+ {
+ ellipsis = ellipsis || inv > 1
+ || (OVERLAYP (overlay)
+ && (!NILP (Foverlay_get (overlay, Qafter_string))
+ || !NILP (Foverlay_get (overlay, Qbefore_string))));
+ tmp = Fprevious_single_char_property_change
+ (make_number (beg), Qinvisible, Qnil, Qnil);
+ beg = NATNUMP (tmp) ? XFASTINT (tmp) : BEGV;
+ }
+
+ /* Move away from the inside area. */
+ if (beg < PT && end > PT)
+ {
+ SET_PT ((orig_pt == PT && (last_pt < beg || last_pt > end))
+ /* We haven't moved yet (so we don't need to fear
+ infinite-looping) and we were outside the range
+ before (so either end of the range still corresponds
+ to a move in the right direction): pretend we moved
+ less than we actually did, so that we still have
+ more freedom below in choosing which end of the range
+ to go to. */
+ ? (orig_pt = -1, PT < last_pt ? end : beg)
+ /* We either have moved already or the last point
+ was already in the range: we don't get to choose
+ which end of the range we have to go to. */
+ : (PT < last_pt ? beg : end));
+ check_composition = check_display = 1;
+ }
+#if 0 /* This assertion isn't correct, because SET_PT may end up setting
+ the point to something other than its argument, due to
+ point-motion hooks, intangibility, etc. */
+ eassert (PT == beg || PT == end);
+#endif
+
+ /* Pretend the area doesn't exist if the buffer is not
+ modified. */
+ if (!modified && !ellipsis && beg < end)
+ {
+ if (last_pt == beg && PT == end && end < ZV)
+ (check_composition = check_display = 1, SET_PT (end + 1));
+ else if (last_pt == end && PT == beg && beg > BEGV)
+ (check_composition = check_display = 1, SET_PT (beg - 1));
+ else if (PT == ((PT < last_pt) ? beg : end))
+ /* We've already moved as far as we can. Trying to go
+ to the other end would mean moving backwards and thus
+ could lead to an infinite loop. */
+ ;
+ else if (val = Fget_pos_property (make_number (PT),
+ Qinvisible, Qnil),
+ TEXT_PROP_MEANS_INVISIBLE (val)
+ && (val = (Fget_pos_property
+ (make_number (PT == beg ? end : beg),
+ Qinvisible, Qnil)),
+ !TEXT_PROP_MEANS_INVISIBLE (val)))
+ (check_composition = check_display = 1,
+ SET_PT (PT == beg ? end : beg));
+ }
+ }
+ check_invisible = 0;
+ }
+}
+
+/* Subroutine for safe_run_hooks: run the hook, which is ARGS[1]. */
+
+static Lisp_Object
+safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
+{
+ eassert (nargs == 2);
+ return call0 (args[1]);
+}
+
+/* Subroutine for safe_run_hooks: handle an error by clearing out the function
+ from the hook. */
+
+static Lisp_Object
+safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
+{
+ eassert (nargs == 2);
+ AUTO_STRING (format, "Error in %s (%S): %S");
+ Lisp_Object hook = args[0];
+ Lisp_Object fun = args[1];
+ CALLN (Fmessage, format, hook, fun, error);
+
+ if (SYMBOLP (hook))
+ {
+ Lisp_Object val;
+ bool found = 0;
+ Lisp_Object newval = Qnil;
+ for (val = find_symbol_value (hook); CONSP (val); val = XCDR (val))
+ if (EQ (fun, XCAR (val)))
+ found = 1;
+ else
+ newval = Fcons (XCAR (val), newval);
+ if (found)
+ return Fset (hook, Fnreverse (newval));
+ /* Not found in the local part of the hook. Let's look at the global
+ part. */
+ newval = Qnil;
+ for (val = (NILP (Fdefault_boundp (hook)) ? Qnil
+ : Fdefault_value (hook));
+ CONSP (val); val = XCDR (val))
+ if (EQ (fun, XCAR (val)))
+ found = 1;
+ else
+ newval = Fcons (XCAR (val), newval);
+ if (found)
+ return Fset_default (hook, Fnreverse (newval));
+ }
+ return Qnil;
+}
+
+static Lisp_Object
+safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args)
+{
+ eassert (nargs == 2);
+ /* Yes, run_hook_with_args works with args in the other order. */
+ internal_condition_case_n (safe_run_hooks_1,
+ 2, ((Lisp_Object []) {args[1], args[0]}),
+ Qt, safe_run_hooks_error);
+ return Qnil;
+}
+
+/* If we get an error while running the hook, cause the hook variable
+ to be nil. Also inhibit quits, so that C-g won't cause the hook
+ to mysteriously evaporate. */
+
+void
+safe_run_hooks (Lisp_Object hook)
+{
+ struct gcpro gcpro1;
+ ptrdiff_t count = SPECPDL_INDEX ();
+
+ GCPRO1 (hook);
+ specbind (Qinhibit_quit, Qt);
+ run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), safe_run_hook_funcall);
+ unbind_to (count, Qnil);
+ UNGCPRO;
+}
+
+
+/* Nonzero means polling for input is temporarily suppressed. */
+
+int poll_suppress_count;
+
+
+#ifdef POLL_FOR_INPUT
+
+/* Asynchronous timer for polling. */
+
+static struct atimer *poll_timer;
+
+/* Poll for input, so that we catch a C-g if it comes in. */
+void
+poll_for_input_1 (void)
+{
+ if (! input_blocked_p ()
+ && !waiting_for_input)
+ gobble_input ();
+}
+
+/* Timer callback function for poll_timer. TIMER is equal to
+ poll_timer. */
+
+static void
+poll_for_input (struct atimer *timer)
+{
+ if (poll_suppress_count == 0)
+ pending_signals = 1;
+}
+
+#endif /* POLL_FOR_INPUT */
+
+/* Begin signals to poll for input, if they are appropriate.
+ This function is called unconditionally from various places. */
+
+void
+start_polling (void)
+{
+#ifdef POLL_FOR_INPUT
+ /* XXX This condition was (read_socket_hook && !interrupt_input),
+ but read_socket_hook is not global anymore. Let's pretend that
+ it's always set. */
+ if (!interrupt_input)
+ {
+ /* Turn alarm handling on unconditionally. It might have
+ been turned off in process.c. */
+ turn_on_atimers (1);
+
+ /* If poll timer doesn't exist, or we need one with
+ a different interval, start a new one. */
+ if (poll_timer == NULL
+ || poll_timer->interval.tv_sec != polling_period)
+ {
+ time_t period = max (1, min (polling_period, TYPE_MAXIMUM (time_t)));
+ struct timespec interval = make_timespec (period, 0);
+
+ if (poll_timer)
+ cancel_atimer (poll_timer);
+
+ poll_timer = start_atimer (ATIMER_CONTINUOUS, interval,
+ poll_for_input, NULL);
+ }
+
+ /* Let the timer's callback function poll for input
+ if this becomes zero. */
+ --poll_suppress_count;
+ }
+#endif
+}
+
+/* True if we are using polling to handle input asynchronously. */
+
+bool
+input_polling_used (void)
+{
+#ifdef POLL_FOR_INPUT
+ /* XXX This condition was (read_socket_hook && !interrupt_input),
+ but read_socket_hook is not global anymore. Let's pretend that
+ it's always set. */
+ return !interrupt_input;
+#else
+ return 0;
+#endif
+}
+
+/* Turn off polling. */
+
+void
+stop_polling (void)
+{
+#ifdef POLL_FOR_INPUT
+ /* XXX This condition was (read_socket_hook && !interrupt_input),
+ but read_socket_hook is not global anymore. Let's pretend that
+ it's always set. */
+ if (!interrupt_input)
+ ++poll_suppress_count;
+#endif
+}
+
+/* Set the value of poll_suppress_count to COUNT
+ and start or stop polling accordingly. */
+
+void
+set_poll_suppress_count (int count)
+{
+#ifdef POLL_FOR_INPUT
+ if (count == 0 && poll_suppress_count != 0)
+ {
+ poll_suppress_count = 1;
+ start_polling ();
+ }
+ else if (count != 0 && poll_suppress_count == 0)
+ {
+ stop_polling ();
+ }
+ poll_suppress_count = count;
+#endif
+}
+
+/* Bind polling_period to a value at least N.
+ But don't decrease it. */
+
+void
+bind_polling_period (int n)
+{
+#ifdef POLL_FOR_INPUT
+ EMACS_INT new = polling_period;
+
+ if (n > new)
+ new = n;
+
+ stop_other_atimers (poll_timer);
+ stop_polling ();
+ specbind (Qpolling_period, make_number (new));
+ /* Start a new alarm with the new period. */
+ start_polling ();
+#endif
+}
+
+/* Apply the control modifier to CHARACTER. */
+
+int
+make_ctrl_char (int c)
+{
+ /* Save the upper bits here. */
+ int upper = c & ~0177;
+
+ if (! ASCII_CHAR_P (c))
+ return c |= ctrl_modifier;
+
+ c &= 0177;
+
+ /* Everything in the columns containing the upper-case letters
+ denotes a control character. */
+ if (c >= 0100 && c < 0140)
+ {
+ int oc = c;
+ c &= ~0140;
+ /* Set the shift modifier for a control char
+ made from a shifted letter. But only for letters! */
+ if (oc >= 'A' && oc <= 'Z')
+ c |= shift_modifier;
+ }
+
+ /* The lower-case letters denote control characters too. */
+ else if (c >= 'a' && c <= 'z')
+ c &= ~0140;
+
+ /* Include the bits for control and shift
+ only if the basic ASCII code can't indicate them. */
+ else if (c >= ' ')
+ c |= ctrl_modifier;
+
+ /* Replace the high bits. */
+ c |= (upper & ~ctrl_modifier);
+
+ return c;
+}
+
+/* Display the help-echo property of the character after the mouse pointer.
+ Either show it in the echo area, or call show-help-function to display
+ it by other means (maybe in a tooltip).
+
+ If HELP is nil, that means clear the previous help echo.
+
+ If HELP is a string, display that string. If HELP is a function,
+ call it with OBJECT and POS as arguments; the function should
+ return a help string or nil for none. For all other types of HELP,
+ evaluate it to obtain a string.
+
+ WINDOW is the window in which the help was generated, if any.
+ It is nil if not in a window.
+
+ If OBJECT is a buffer, POS is the position in the buffer where the
+ `help-echo' text property was found.
+
+ If OBJECT is an overlay, that overlay has a `help-echo' property,
+ and POS is the position in the overlay's buffer under the mouse.
+
+ If OBJECT is a string (an overlay string or a string displayed with
+ the `display' property). POS is the position in that string under
+ the mouse.
+
+ Note: this function may only be called with HELP nil or a string
+ from X code running asynchronously. */
+
+void
+show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object,
+ Lisp_Object pos)
+{
+ if (!NILP (help) && !STRINGP (help))
+ {
+ if (FUNCTIONP (help))
+ help = safe_call (4, help, window, object, pos);
+ else
+ help = safe_eval (help);
+
+ if (!STRINGP (help))
+ return;
+ }
+
+ if (!noninteractive && STRINGP (help))
+ {
+ /* The mouse-fixup-help-message Lisp function can call
+ mouse_position_hook, which resets the mouse_moved flags.
+ This causes trouble if we are trying to read a mouse motion
+ event (i.e., if we are inside a `track-mouse' form), so we
+ restore the mouse_moved flag. */
+ struct frame *f = NILP (do_mouse_tracking) ? NULL : some_mouse_moved ();
+ help = call1 (Qmouse_fixup_help_message, help);
+ if (f)
+ f->mouse_moved = 1;
+ }
+
+ if (STRINGP (help) || NILP (help))
+ {
+ if (!NILP (Vshow_help_function))
+ call1 (Vshow_help_function, help);
+ help_echo_showing_p = STRINGP (help);
+ }
+}
+
+
+
+/* Input of single characters from keyboard. */
+
+static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, bool *used_mouse_menu,
+ struct timespec *end_time);
+static void record_char (Lisp_Object c);
+
+static Lisp_Object help_form_saved_window_configs;
+static void
+read_char_help_form_unwind (void)
+{
+ Lisp_Object window_config = XCAR (help_form_saved_window_configs);
+ help_form_saved_window_configs = XCDR (help_form_saved_window_configs);
+ if (!NILP (window_config))
+ Fset_window_configuration (window_config);
+}
+
+#define STOP_POLLING \
+do { if (! polling_stopped_here) stop_polling (); \
+ polling_stopped_here = 1; } while (0)
+
+#define RESUME_POLLING \
+do { if (polling_stopped_here) start_polling (); \
+ polling_stopped_here = 0; } while (0)
+
+static Lisp_Object
+read_event_from_main_queue (struct timespec *end_time,
+ sys_jmp_buf local_getcjmp,
+ bool *used_mouse_menu)
+{
+ Lisp_Object c = Qnil;
+ sys_jmp_buf save_jump;
+ KBOARD *kb IF_LINT (= NULL);
+
+ start:
+
+ /* Read from the main queue, and if that gives us something we can't use yet,
+ we put it on the appropriate side queue and try again. */
+
+ if (end_time && timespec_cmp (*end_time, current_timespec ()) <= 0)
+ return c;
+
+ /* Actually read a character, waiting if necessary. */
+ save_getcjmp (save_jump);
+ restore_getcjmp (local_getcjmp);
+ if (!end_time)
+ timer_start_idle ();
+ c = kbd_buffer_get_event (&kb, used_mouse_menu, end_time);
+ restore_getcjmp (save_jump);
+
+ if (! NILP (c) && (kb != current_kboard))
+ {
+ Lisp_Object last = KVAR (kb, kbd_queue);
+ if (CONSP (last))
+ {
+ while (CONSP (XCDR (last)))
+ last = XCDR (last);
+ if (!NILP (XCDR (last)))
+ emacs_abort ();
+ }
+ if (!CONSP (last))
+ kset_kbd_queue (kb, list1 (c));
+ else
+ XSETCDR (last, list1 (c));
+ kb->kbd_queue_has_data = 1;
+ c = Qnil;
+ if (single_kboard)
+ goto start;
+ current_kboard = kb;
+ /* This is going to exit from read_char
+ so we had better get rid of this frame's stuff. */
+ return make_number (-2);
+ }
+
+ /* Terminate Emacs in batch mode if at eof. */
+ if (noninteractive && INTEGERP (c) && XINT (c) < 0)
+ Fkill_emacs (make_number (1));
+
+ if (INTEGERP (c))
+ {
+ /* Add in any extra modifiers, where appropriate. */
+ if ((extra_keyboard_modifiers & CHAR_CTL)
+ || ((extra_keyboard_modifiers & 0177) < ' '
+ && (extra_keyboard_modifiers & 0177) != 0))
+ XSETINT (c, make_ctrl_char (XINT (c)));
+
+ /* Transfer any other modifier bits directly from
+ extra_keyboard_modifiers to c. Ignore the actual character code
+ in the low 16 bits of extra_keyboard_modifiers. */
+ XSETINT (c, XINT (c) | (extra_keyboard_modifiers & ~0xff7f & ~CHAR_CTL));
+ }
+
+ return c;
+}
+
+
+
+/* Like `read_event_from_main_queue' but applies keyboard-coding-system
+ to tty input. */
+static Lisp_Object
+read_decoded_event_from_main_queue (struct timespec *end_time,
+ sys_jmp_buf local_getcjmp,
+ Lisp_Object prev_event,
+ bool *used_mouse_menu)
+{
+#define MAX_ENCODED_BYTES 16
+#ifndef WINDOWSNT
+ Lisp_Object events[MAX_ENCODED_BYTES];
+ int n = 0;
+#endif
+ while (true)
+ {
+ Lisp_Object nextevt
+ = read_event_from_main_queue (end_time, local_getcjmp,
+ used_mouse_menu);
+#ifdef WINDOWSNT
+ /* w32_console already returns decoded events. It either reads
+ Unicode characters from the Windows keyboard input, or
+ converts characters encoded in the current codepage into
+ Unicode. See w32inevt.c:key_event, near its end. */
+ return nextevt;
+#else
+ struct frame *frame = XFRAME (selected_frame);
+ struct terminal *terminal = frame->terminal;
+ if (!((FRAME_TERMCAP_P (frame) || FRAME_MSDOS_P (frame))
+ /* Don't apply decoding if we're just reading a raw event
+ (e.g. reading bytes sent by the xterm to specify the position
+ of a mouse click). */
+ && (!EQ (prev_event, Qt))
+ && (TERMINAL_KEYBOARD_CODING (terminal)->common_flags
+ & CODING_REQUIRE_DECODING_MASK)))
+ return nextevt; /* No decoding needed. */
+ else
+ {
+ int meta_key = terminal->display_info.tty->meta_key;
+ eassert (n < MAX_ENCODED_BYTES);
+ events[n++] = nextevt;
+ if (NATNUMP (nextevt)
+ && XINT (nextevt) < (meta_key == 1 ? 0x80 : 0x100))
+ { /* An encoded byte sequence, let's try to decode it. */
+ struct coding_system *coding
+ = TERMINAL_KEYBOARD_CODING (terminal);
+
+ if (raw_text_coding_system_p (coding))
+ {
+ int i;
+ if (meta_key != 2)
+ for (i = 0; i < n; i++)
+ events[i] = make_number (XINT (events[i]) & ~0x80);
+ }
+ else
+ {
+ unsigned char src[MAX_ENCODED_BYTES];
+ unsigned char dest[MAX_ENCODED_BYTES * MAX_MULTIBYTE_LENGTH];
+ int i;
+ for (i = 0; i < n; i++)
+ src[i] = XINT (events[i]);
+ if (meta_key != 2)
+ for (i = 0; i < n; i++)
+ src[i] &= ~0x80;
+ coding->destination = dest;
+ coding->dst_bytes = sizeof dest;
+ decode_coding_c_string (coding, src, n, Qnil);
+ eassert (coding->produced_char <= n);
+ if (coding->produced_char == 0)
+ { /* The encoded sequence is incomplete. */
+ if (n < MAX_ENCODED_BYTES) /* Avoid buffer overflow. */
+ continue; /* Read on! */
+ }
+ else
+ {
+ const unsigned char *p = coding->destination;
+ eassert (coding->carryover_bytes == 0);
+ n = 0;
+ while (n < coding->produced_char)
+ events[n++] = make_number (STRING_CHAR_ADVANCE (p));
+ }
+ }
+ }
+ /* Now `events' should hold decoded events.
+ Normally, n should be equal to 1, but better not rely on it.
+ We can only return one event here, so return the first we
+ had and keep the others (if any) for later. */
+ while (n > 1)
+ Vunread_command_events
+ = Fcons (events[--n], Vunread_command_events);
+ return events[0];
+ }
+#endif
+ }
+}
+
+static bool
+echo_keystrokes_p (void)
+{
+ return (FLOATP (Vecho_keystrokes) ? XFLOAT_DATA (Vecho_keystrokes) > 0.0
+ : INTEGERP (Vecho_keystrokes) ? XINT (Vecho_keystrokes) > 0 : false);
+}
+
+/* Read a character from the keyboard; call the redisplay if needed. */
+/* commandflag 0 means do not autosave, but do redisplay.
+ -1 means do not redisplay, but do autosave.
+ -2 means do neither.
+ 1 means do both.
+
+ The argument MAP is a keymap for menu prompting.
+
+ PREV_EVENT is the previous input event, or nil if we are reading
+ the first event of a key sequence (or not reading a key sequence).
+ If PREV_EVENT is t, that is a "magic" value that says
+ not to run input methods, but in other respects to act as if
+ not reading a key sequence.
+
+ If USED_MOUSE_MENU is non-null, then set *USED_MOUSE_MENU to true
+ if we used a mouse menu to read the input, or false otherwise. If
+ USED_MOUSE_MENU is null, don't dereference it.
+
+ Value is -2 when we find input on another keyboard. A second call
+ to read_char will read it.
+
+ If END_TIME is non-null, it is a pointer to a struct timespec
+ specifying the maximum time to wait until. If no input arrives by
+ that time, stop waiting and return nil.
+
+ Value is t if we showed a menu and the user rejected it. */
+
+Lisp_Object
+read_char (int commandflag, Lisp_Object map,
+ Lisp_Object prev_event,
+ bool *used_mouse_menu, struct timespec *end_time)
+{
+ Lisp_Object c;
+ ptrdiff_t jmpcount;
+ sys_jmp_buf local_getcjmp;
+ sys_jmp_buf save_jump;
+ Lisp_Object tem, save;
+ volatile Lisp_Object previous_echo_area_message;
+ volatile Lisp_Object also_record;
+ volatile bool reread;
+ struct gcpro gcpro1, gcpro2;
+ bool volatile polling_stopped_here = 0;
+ struct kboard *orig_kboard = current_kboard;
+
+ also_record = Qnil;
+
+#if 0 /* This was commented out as part of fixing echo for C-u left. */
+ before_command_key_count = this_command_key_count;
+ before_command_echo_length = echo_length ();
+#endif
+ c = Qnil;
+ previous_echo_area_message = Qnil;
+
+ GCPRO2 (c, previous_echo_area_message);
+
+ retry:
+
+ if (CONSP (Vunread_post_input_method_events))
+ {
+ c = XCAR (Vunread_post_input_method_events);
+ Vunread_post_input_method_events
+ = XCDR (Vunread_post_input_method_events);
+
+ /* Undo what read_char_x_menu_prompt did when it unread
+ additional keys returned by Fx_popup_menu. */
+ if (CONSP (c)
+ && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
+ && NILP (XCDR (c)))
+ c = XCAR (c);
+
+ reread = true;
+ goto reread_first;
+ }
+ else
+ reread = false;
+
+
+ if (CONSP (Vunread_command_events))
+ {
+ bool was_disabled = 0;
+
+ c = XCAR (Vunread_command_events);
+ Vunread_command_events = XCDR (Vunread_command_events);
+
+ /* Undo what sit-for did when it unread additional keys
+ inside universal-argument. */
+
+ if (CONSP (c) && EQ (XCAR (c), Qt))
+ c = XCDR (c);
+ else
+ reread = true;
+
+ /* Undo what read_char_x_menu_prompt did when it unread
+ additional keys returned by Fx_popup_menu. */
+ if (CONSP (c)
+ && EQ (XCDR (c), Qdisabled)
+ && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c))))
+ {
+ was_disabled = 1;
+ c = XCAR (c);
+ }
+
+ /* If the queued event is something that used the mouse,
+ set used_mouse_menu accordingly. */
+ if (used_mouse_menu
+ /* Also check was_disabled so last-nonmenu-event won't return
+ a bad value when submenus are involved. (Bug#447) */
+ && (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar) || was_disabled))
+ *used_mouse_menu = 1;
+
+ goto reread_for_input_method;
+ }
+
+ if (CONSP (Vunread_input_method_events))
+ {
+ c = XCAR (Vunread_input_method_events);
+ Vunread_input_method_events = XCDR (Vunread_input_method_events);
+
+ /* Undo what read_char_x_menu_prompt did when it unread
+ additional keys returned by Fx_popup_menu. */
+ if (CONSP (c)
+ && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
+ && NILP (XCDR (c)))
+ c = XCAR (c);
+ reread = true;
+ goto reread_for_input_method;
+ }
+
+ this_command_key_count_reset = 0;
+
+ if (!NILP (Vexecuting_kbd_macro))
+ {
+ /* We set this to Qmacro; since that's not a frame, nobody will
+ try to switch frames on us, and the selected window will
+ remain unchanged.
+
+ Since this event came from a macro, it would be misleading to
+ leave internal_last_event_frame set to wherever the last
+ real event came from. Normally, a switch-frame event selects
+ internal_last_event_frame after each command is read, but
+ events read from a macro should never cause a new frame to be
+ selected. */
+ Vlast_event_frame = internal_last_event_frame = Qmacro;
+
+ /* Exit the macro if we are at the end.
+ Also, some things replace the macro with t
+ to force an early exit. */
+ if (EQ (Vexecuting_kbd_macro, Qt)
+ || executing_kbd_macro_index >= XFASTINT (Flength (Vexecuting_kbd_macro)))
+ {
+ XSETINT (c, -1);
+ goto exit;
+ }
+
+ c = Faref (Vexecuting_kbd_macro, make_number (executing_kbd_macro_index));
+ if (STRINGP (Vexecuting_kbd_macro)
+ && (XFASTINT (c) & 0x80) && (XFASTINT (c) <= 0xff))
+ XSETFASTINT (c, CHAR_META | (XFASTINT (c) & ~0x80));
+
+ executing_kbd_macro_index++;
+
+ goto from_macro;
+ }
+
+ if (!NILP (unread_switch_frame))
+ {
+ c = unread_switch_frame;
+ unread_switch_frame = Qnil;
+
+ /* This event should make it into this_command_keys, and get echoed
+ again, so we do not set `reread'. */
+ goto reread_first;
+ }
+
+ /* If redisplay was requested. */
+ if (commandflag >= 0)
+ {
+ bool echo_current = EQ (echo_message_buffer, echo_area_buffer[0]);
+
+ /* If there is pending input, process any events which are not
+ user-visible, such as X selection_request events. */
+ if (input_pending
+ || detect_input_pending_run_timers (0))
+ swallow_events (false); /* May clear input_pending. */
+
+ /* Redisplay if no pending input. */
+ while (!(input_pending
+ && (input_was_pending || !redisplay_dont_pause)))
+ {
+ input_was_pending = input_pending;
+ if (help_echo_showing_p && !EQ (selected_window, minibuf_window))
+ redisplay_preserve_echo_area (5);
+ else
+ redisplay ();
+
+ if (!input_pending)
+ /* Normal case: no input arrived during redisplay. */
+ break;
+
+ /* Input arrived and pre-empted redisplay.
+ Process any events which are not user-visible. */
+ swallow_events (false);
+ /* If that cleared input_pending, try again to redisplay. */
+ }
+
+ /* Prevent the redisplay we just did
+ from messing up echoing of the input after the prompt. */
+ if (commandflag == 0 && echo_current)
+ echo_message_buffer = echo_area_buffer[0];
+
+ }
+
+ /* Message turns off echoing unless more keystrokes turn it on again.
+
+ The code in 20.x for the condition was
+
+ 1. echo_area_glyphs && *echo_area_glyphs
+ 2. && echo_area_glyphs != current_kboard->echobuf
+ 3. && ok_to_echo_at_next_pause != echo_area_glyphs
+
+ (1) means there's a current message displayed
+
+ (2) means it's not the message from echoing from the current
+ kboard.
+
+ (3) There's only one place in 20.x where ok_to_echo_at_next_pause
+ is set to a non-null value. This is done in read_char and it is
+ set to echo_area_glyphs after a call to echo_char. That means
+ ok_to_echo_at_next_pause is either null or
+ current_kboard->echobuf with the appropriate current_kboard at
+ that time.
+
+ So, condition (3) means in clear text ok_to_echo_at_next_pause
+ must be either null, or the current message isn't from echoing at
+ all, or it's from echoing from a different kboard than the
+ current one. */
+
+ if (/* There currently is something in the echo area. */
+ !NILP (echo_area_buffer[0])
+ && (/* It's an echo from a different kboard. */
+ echo_kboard != current_kboard
+ /* Or we explicitly allow overwriting whatever there is. */
+ || ok_to_echo_at_next_pause == NULL))
+ cancel_echoing ();
+ else
+ echo_dash ();
+
+ /* Try reading a character via menu prompting in the minibuf.
+ Try this before the sit-for, because the sit-for
+ would do the wrong thing if we are supposed to do
+ menu prompting. If EVENT_HAS_PARAMETERS then we are reading
+ after a mouse event so don't try a minibuf menu. */
+ c = Qnil;
+ if (KEYMAPP (map) && INTERACTIVE
+ && !NILP (prev_event) && ! EVENT_HAS_PARAMETERS (prev_event)
+ /* Don't bring up a menu if we already have another event. */
+ && NILP (Vunread_command_events)
+ && !detect_input_pending_run_timers (0))
+ {
+ c = read_char_minibuf_menu_prompt (commandflag, map);
+
+ if (INTEGERP (c) && XINT (c) == -2)
+ return c; /* wrong_kboard_jmpbuf */
+
+ if (! NILP (c))
+ goto exit;
+ }
+
+ /* Make a longjmp point for quits to use, but don't alter getcjmp just yet.
+ We will do that below, temporarily for short sections of code,
+ when appropriate. local_getcjmp must be in effect
+ around any call to sit_for or kbd_buffer_get_event;
+ it *must not* be in effect when we call redisplay. */
+
+ jmpcount = SPECPDL_INDEX ();
+ if (sys_setjmp (local_getcjmp))
+ {
+ /* Handle quits while reading the keyboard. */
+ /* We must have saved the outer value of getcjmp here,
+ so restore it now. */
+ restore_getcjmp (save_jump);
+ pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+ unbind_to (jmpcount, Qnil);
+ XSETINT (c, quit_char);
+ internal_last_event_frame = selected_frame;
+ Vlast_event_frame = internal_last_event_frame;
+ /* If we report the quit char as an event,
+ don't do so more than once. */
+ if (!NILP (Vinhibit_quit))
+ Vquit_flag = Qnil;
+
+ {
+ KBOARD *kb = FRAME_KBOARD (XFRAME (selected_frame));
+ if (kb != current_kboard)
+ {
+ Lisp_Object last = KVAR (kb, kbd_queue);
+ /* We shouldn't get here if we were in single-kboard mode! */
+ if (single_kboard)
+ emacs_abort ();
+ if (CONSP (last))
+ {
+ while (CONSP (XCDR (last)))
+ last = XCDR (last);
+ if (!NILP (XCDR (last)))
+ emacs_abort ();
+ }
+ if (!CONSP (last))
+ kset_kbd_queue (kb, list1 (c));
+ else
+ XSETCDR (last, list1 (c));
+ kb->kbd_queue_has_data = 1;
+ current_kboard = kb;
+ /* This is going to exit from read_char
+ so we had better get rid of this frame's stuff. */
+ UNGCPRO;
+ return make_number (-2); /* wrong_kboard_jmpbuf */
+ }
+ }
+ goto non_reread;
+ }
+
+ /* Start idle timers if no time limit is supplied. We don't do it
+ if a time limit is supplied to avoid an infinite recursion in the
+ situation where an idle timer calls `sit-for'. */
+
+ if (!end_time)
+ timer_start_idle ();
+
+ /* If in middle of key sequence and minibuffer not active,
+ start echoing if enough time elapses. */
+
+ if (minibuf_level == 0
+ && !end_time
+ && !current_kboard->immediate_echo
+ && this_command_key_count > 0
+ && ! noninteractive
+ && echo_keystrokes_p ()
+ && (/* No message. */
+ NILP (echo_area_buffer[0])
+ /* Or empty message. */
+ || (BUF_BEG (XBUFFER (echo_area_buffer[0]))
+ == BUF_Z (XBUFFER (echo_area_buffer[0])))
+ /* Or already echoing from same kboard. */
+ || (echo_kboard && ok_to_echo_at_next_pause == echo_kboard)
+ /* Or not echoing before and echoing allowed. */
+ || (!echo_kboard && ok_to_echo_at_next_pause)))
+ {
+ /* After a mouse event, start echoing right away.
+ This is because we are probably about to display a menu,
+ and we don't want to delay before doing so. */
+ if (EVENT_HAS_PARAMETERS (prev_event))
+ echo_now ();
+ else
+ {
+ Lisp_Object tem0;
+
+ save_getcjmp (save_jump);
+ restore_getcjmp (local_getcjmp);
+ tem0 = sit_for (Vecho_keystrokes, 1, 1);
+ restore_getcjmp (save_jump);
+ if (EQ (tem0, Qt)
+ && ! CONSP (Vunread_command_events))
+ echo_now ();
+ }
+ }
+
+ /* Maybe auto save due to number of keystrokes. */
+
+ if (commandflag != 0 && commandflag != -2
+ && auto_save_interval > 0
+ && num_nonmacro_input_events - last_auto_save > max (auto_save_interval, 20)
+ && !detect_input_pending_run_timers (0))
+ {
+ Fdo_auto_save (Qnil, Qnil);
+ /* Hooks can actually change some buffers in auto save. */
+ redisplay ();
+ }
+
+ /* Try reading using an X menu.
+ This is never confused with reading using the minibuf
+ because the recursive call of read_char in read_char_minibuf_menu_prompt
+ does not pass on any keymaps. */
+
+ if (KEYMAPP (map) && INTERACTIVE
+ && !NILP (prev_event)
+ && EVENT_HAS_PARAMETERS (prev_event)
+ && !EQ (XCAR (prev_event), Qmenu_bar)
+ && !EQ (XCAR (prev_event), Qtool_bar)
+ /* Don't bring up a menu if we already have another event. */
+ && NILP (Vunread_command_events))
+ {
+ c = read_char_x_menu_prompt (map, prev_event, used_mouse_menu);
+
+ /* Now that we have read an event, Emacs is not idle. */
+ if (!end_time)
+ timer_stop_idle ();
+
+ goto exit;
+ }
+
+ /* Maybe autosave and/or garbage collect due to idleness. */
+
+ if (INTERACTIVE && NILP (c))
+ {
+ int delay_level;
+ ptrdiff_t buffer_size;
+
+ /* Slow down auto saves logarithmically in size of current buffer,
+ and garbage collect while we're at it. */
+ if (! MINI_WINDOW_P (XWINDOW (selected_window)))
+ last_non_minibuf_size = Z - BEG;
+ buffer_size = (last_non_minibuf_size >> 8) + 1;
+ delay_level = 0;
+ while (buffer_size > 64)
+ delay_level++, buffer_size -= buffer_size >> 2;
+ if (delay_level < 4) delay_level = 4;
+ /* delay_level is 4 for files under around 50k, 7 at 100k,
+ 9 at 200k, 11 at 300k, and 12 at 500k. It is 15 at 1 meg. */
+
+ /* Auto save if enough time goes by without input. */
+ if (commandflag != 0 && commandflag != -2
+ && num_nonmacro_input_events > last_auto_save
+ && INTEGERP (Vauto_save_timeout)
+ && XINT (Vauto_save_timeout) > 0)
+ {
+ Lisp_Object tem0;
+ EMACS_INT timeout = XFASTINT (Vauto_save_timeout);
+
+ timeout = min (timeout, MOST_POSITIVE_FIXNUM / delay_level * 4);
+ timeout = delay_level * timeout / 4;
+ save_getcjmp (save_jump);
+ restore_getcjmp (local_getcjmp);
+ tem0 = sit_for (make_number (timeout), 1, 1);
+ restore_getcjmp (save_jump);
+
+ if (EQ (tem0, Qt)
+ && ! CONSP (Vunread_command_events))
+ {
+ Fdo_auto_save (Qnil, Qnil);
+ redisplay ();
+ }
+ }
+
+ /* If there is still no input available, ask for GC. */
+ if (!detect_input_pending_run_timers (0))
+ maybe_gc ();
+ }
+
+ /* Notify the caller if an autosave hook, or a timer, sentinel or
+ filter in the sit_for calls above have changed the current
+ kboard. This could happen if they use the minibuffer or start a
+ recursive edit, like the fancy splash screen in server.el's
+ filter. If this longjmp wasn't here, read_key_sequence would
+ interpret the next key sequence using the wrong translation
+ tables and function keymaps. */
+ if (NILP (c) && current_kboard != orig_kboard)
+ {
+ UNGCPRO;
+ return make_number (-2); /* wrong_kboard_jmpbuf */
+ }
+
+ /* If this has become non-nil here, it has been set by a timer
+ or sentinel or filter. */
+ if (CONSP (Vunread_command_events))
+ {
+ c = XCAR (Vunread_command_events);
+ Vunread_command_events = XCDR (Vunread_command_events);
+
+ if (CONSP (c) && EQ (XCAR (c), Qt))
+ c = XCDR (c);
+ else
+ reread = true;
+ }
+
+ /* Read something from current KBOARD's side queue, if possible. */
+
+ if (NILP (c))
+ {
+ if (current_kboard->kbd_queue_has_data)
+ {
+ if (!CONSP (KVAR (current_kboard, kbd_queue)))
+ emacs_abort ();
+ c = XCAR (KVAR (current_kboard, kbd_queue));
+ kset_kbd_queue (current_kboard,
+ XCDR (KVAR (current_kboard, kbd_queue)));
+ if (NILP (KVAR (current_kboard, kbd_queue)))
+ current_kboard->kbd_queue_has_data = 0;
+ input_pending = readable_events (0);
+ if (EVENT_HAS_PARAMETERS (c)
+ && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qswitch_frame))
+ internal_last_event_frame = XCAR (XCDR (c));
+ Vlast_event_frame = internal_last_event_frame;
+ }
+ }
+
+ /* If current_kboard's side queue is empty check the other kboards.
+ If one of them has data that we have not yet seen here,
+ switch to it and process the data waiting for it.
+
+ Note: if the events queued up for another kboard
+ have already been seen here, and therefore are not a complete command,
+ the kbd_queue_has_data field is 0, so we skip that kboard here.
+ That's to avoid an infinite loop switching between kboards here. */
+ if (NILP (c) && !single_kboard)
+ {
+ KBOARD *kb;
+ for (kb = all_kboards; kb; kb = kb->next_kboard)
+ if (kb->kbd_queue_has_data)
+ {
+ current_kboard = kb;
+ /* This is going to exit from read_char
+ so we had better get rid of this frame's stuff. */
+ UNGCPRO;
+ return make_number (-2); /* wrong_kboard_jmpbuf */
+ }
+ }
+
+ wrong_kboard:
+
+ STOP_POLLING;
+
+ if (NILP (c))
+ {
+ c = read_decoded_event_from_main_queue (end_time, local_getcjmp,
+ prev_event, used_mouse_menu);
+ if (NILP (c) && end_time
+ && timespec_cmp (*end_time, current_timespec ()) <= 0)
+ {
+ goto exit;
+ }
+
+ if (EQ (c, make_number (-2)))
+ {
+ /* This is going to exit from read_char
+ so we had better get rid of this frame's stuff. */
+ UNGCPRO;
+ return c;
+ }
+ }
+
+ non_reread:
+
+ if (!end_time)
+ timer_stop_idle ();
+ RESUME_POLLING;
+
+ if (NILP (c))
+ {
+ if (commandflag >= 0
+ && !input_pending && !detect_input_pending_run_timers (0))
+ redisplay ();
+
+ goto wrong_kboard;
+ }
+
+ /* Buffer switch events are only for internal wakeups
+ so don't show them to the user.
+ Also, don't record a key if we already did. */
+ if (BUFFERP (c))
+ goto exit;
+
+ /* Process special events within read_char
+ and loop around to read another event. */
+ save = Vquit_flag;
+ Vquit_flag = Qnil;
+ tem = access_keymap (get_keymap (Vspecial_event_map, 0, 1), c, 0, 0, 1);
+ Vquit_flag = save;
+
+ if (!NILP (tem))
+ {
+ struct buffer *prev_buffer = current_buffer;
+ last_input_event = c;
+ call4 (Qcommand_execute, tem, Qnil, Fvector (1, &last_input_event), Qt);
+
+ if (CONSP (c) && EQ (XCAR (c), Qselect_window) && !end_time)
+ /* We stopped being idle for this event; undo that. This
+ prevents automatic window selection (under
+ mouse_autoselect_window from acting as a real input event, for
+ example banishing the mouse under mouse-avoidance-mode. */
+ timer_resume_idle ();
+
+ if (current_buffer != prev_buffer)
+ {
+ /* The command may have changed the keymaps. Pretend there
+ is input in another keyboard and return. This will
+ recalculate keymaps. */
+ c = make_number (-2);
+ goto exit;
+ }
+ else
+ goto retry;
+ }
+
+ /* Handle things that only apply to characters. */
+ if (INTEGERP (c))
+ {
+ /* If kbd_buffer_get_event gave us an EOF, return that. */
+ if (XINT (c) == -1)
+ goto exit;
+
+ if ((STRINGP (KVAR (current_kboard, Vkeyboard_translate_table))
+ && UNSIGNED_CMP (XFASTINT (c), <,
+ SCHARS (KVAR (current_kboard,
+ Vkeyboard_translate_table))))
+ || (VECTORP (KVAR (current_kboard, Vkeyboard_translate_table))
+ && UNSIGNED_CMP (XFASTINT (c), <,
+ ASIZE (KVAR (current_kboard,
+ Vkeyboard_translate_table))))
+ || (CHAR_TABLE_P (KVAR (current_kboard, Vkeyboard_translate_table))
+ && CHARACTERP (c)))
+ {
+ Lisp_Object d;
+ d = Faref (KVAR (current_kboard, Vkeyboard_translate_table), c);
+ /* nil in keyboard-translate-table means no translation. */
+ if (!NILP (d))
+ c = d;
+ }
+ }
+
+ /* If this event is a mouse click in the menu bar,
+ return just menu-bar for now. Modify the mouse click event
+ so we won't do this twice, then queue it up. */
+ if (EVENT_HAS_PARAMETERS (c)
+ && CONSP (XCDR (c))
+ && CONSP (EVENT_START (c))
+ && CONSP (XCDR (EVENT_START (c))))
+ {
+ Lisp_Object posn;
+
+ posn = POSN_POSN (EVENT_START (c));
+ /* Handle menu-bar events:
+ insert the dummy prefix event `menu-bar'. */
+ if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
+ {
+ /* Change menu-bar to (menu-bar) as the event "position". */
+ POSN_SET_POSN (EVENT_START (c), list1 (posn));
+
+ also_record = c;
+ Vunread_command_events = Fcons (c, Vunread_command_events);
+ c = posn;
+ }
+ }
+
+ /* Store these characters into recent_keys, the dribble file if any,
+ and the keyboard macro being defined, if any. */
+ record_char (c);
+ if (! NILP (also_record))
+ record_char (also_record);
+
+ /* Wipe the echo area.
+ But first, if we are about to use an input method,
+ save the echo area contents for it to refer to. */
+ if (INTEGERP (c)
+ && ! NILP (Vinput_method_function)
+ && ' ' <= XINT (c) && XINT (c) < 256 && XINT (c) != 127)
+ {
+ previous_echo_area_message = Fcurrent_message ();
+ Vinput_method_previous_message = previous_echo_area_message;
+ }
+
+ /* Now wipe the echo area, except for help events which do their
+ own stuff with the echo area. */
+ if (!CONSP (c)
+ || (!(EQ (Qhelp_echo, XCAR (c)))
+ && !(EQ (Qswitch_frame, XCAR (c)))
+ /* Don't wipe echo area for select window events: These might
+ get delayed via `mouse-autoselect-window' (Bug#11304). */
+ && !(EQ (Qselect_window, XCAR (c)))))
+ {
+ if (!NILP (echo_area_buffer[0]))
+ {
+ safe_run_hooks (Qecho_area_clear_hook);
+ clear_message (1, 0);
+ }
+ }
+
+ reread_for_input_method:
+ from_macro:
+ /* Pass this to the input method, if appropriate. */
+ if (INTEGERP (c)
+ && ! NILP (Vinput_method_function)
+ /* Don't run the input method within a key sequence,
+ after the first event of the key sequence. */
+ && NILP (prev_event)
+ && ' ' <= XINT (c) && XINT (c) < 256 && XINT (c) != 127)
+ {
+ Lisp_Object keys;
+ ptrdiff_t key_count;
+ bool key_count_reset;
+ ptrdiff_t command_key_start;
+ struct gcpro gcpro1;
+ ptrdiff_t count = SPECPDL_INDEX ();
+
+ /* Save the echo status. */
+ bool saved_immediate_echo = current_kboard->immediate_echo;
+ struct kboard *saved_ok_to_echo = ok_to_echo_at_next_pause;
+ Lisp_Object saved_echo_string = KVAR (current_kboard, echo_string);
+ ptrdiff_t saved_echo_after_prompt = current_kboard->echo_after_prompt;
+
+#if 0
+ if (before_command_restore_flag)
+ {
+ this_command_key_count = before_command_key_count_1;
+ if (this_command_key_count < this_single_command_key_start)
+ this_single_command_key_start = this_command_key_count;
+ echo_truncate (before_command_echo_length_1);
+ before_command_restore_flag = 0;
+ }
+#endif
+
+ /* Save the this_command_keys status. */
+ key_count = this_command_key_count;
+ key_count_reset = this_command_key_count_reset;
+ command_key_start = this_single_command_key_start;
+
+ if (key_count > 0)
+ keys = Fcopy_sequence (this_command_keys);
+ else
+ keys = Qnil;
+ GCPRO1 (keys);
+
+ /* Clear out this_command_keys. */
+ this_command_key_count = 0;
+ this_command_key_count_reset = 0;
+ this_single_command_key_start = 0;
+
+ /* Now wipe the echo area. */
+ if (!NILP (echo_area_buffer[0]))
+ safe_run_hooks (Qecho_area_clear_hook);
+ clear_message (1, 0);
+ echo_truncate (0);
+
+ /* If we are not reading a key sequence,
+ never use the echo area. */
+ if (!KEYMAPP (map))
+ {
+ specbind (Qinput_method_use_echo_area, Qt);
+ }
+
+ /* Call the input method. */
+ tem = call1 (Vinput_method_function, c);
+
+ tem = unbind_to (count, tem);
+
+ /* Restore the saved echoing state
+ and this_command_keys state. */
+ this_command_key_count = key_count;
+ this_command_key_count_reset = key_count_reset;
+ this_single_command_key_start = command_key_start;
+ if (key_count > 0)
+ this_command_keys = keys;
+
+ cancel_echoing ();
+ ok_to_echo_at_next_pause = saved_ok_to_echo;
+ /* Do not restore the echo area string when the user is
+ introducing a prefix argument. Otherwise we end with
+ repetitions of the partially introduced prefix
+ argument. (bug#19875) */
+ if (NILP (intern ("prefix-arg")))
+ {
+ kset_echo_string (current_kboard, saved_echo_string);
+ }
+ current_kboard->echo_after_prompt = saved_echo_after_prompt;
+ if (saved_immediate_echo)
+ echo_now ();
+
+ UNGCPRO;
+
+ /* The input method can return no events. */
+ if (! CONSP (tem))
+ {
+ /* Bring back the previous message, if any. */
+ if (! NILP (previous_echo_area_message))
+ message_with_string ("%s", previous_echo_area_message, 0);
+ goto retry;
+ }
+ /* It returned one event or more. */
+ c = XCAR (tem);
+ Vunread_post_input_method_events
+ = nconc2 (XCDR (tem), Vunread_post_input_method_events);
+ }
+
+ reread_first:
+
+ /* Display help if not echoing. */
+ if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
+ {
+ /* (help-echo FRAME HELP WINDOW OBJECT POS). */
+ Lisp_Object help, object, position, window, htem;
+
+ htem = Fcdr (XCDR (c));
+ help = Fcar (htem);
+ htem = Fcdr (htem);
+ window = Fcar (htem);
+ htem = Fcdr (htem);
+ object = Fcar (htem);
+ htem = Fcdr (htem);
+ position = Fcar (htem);
+
+ show_help_echo (help, window, object, position);
+
+ /* We stopped being idle for this event; undo that. */
+ if (!end_time)
+ timer_resume_idle ();
+ goto retry;
+ }
+
+ if ((! reread || this_command_key_count == 0
+ || this_command_key_count_reset)
+ && !end_time)
+ {
+
+ /* Don't echo mouse motion events. */
+ if (echo_keystrokes_p ()
+ && ! (EVENT_HAS_PARAMETERS (c)
+ && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
+ {
+ echo_char (c);
+ if (! NILP (also_record))
+ echo_char (also_record);
+ /* Once we reread a character, echoing can happen
+ the next time we pause to read a new one. */
+ ok_to_echo_at_next_pause = current_kboard;
+ }
+
+ /* Record this character as part of the current key. */
+ add_command_key (c);
+ if (! NILP (also_record))
+ add_command_key (also_record);
+ }
+
+ last_input_event = c;
+ num_input_events++;
+
+ /* Process the help character specially if enabled. */
+ if (!NILP (Vhelp_form) && help_char_p (c))
+ {
+ ptrdiff_t count = SPECPDL_INDEX ();
+
+ help_form_saved_window_configs
+ = Fcons (Fcurrent_window_configuration (Qnil),
+ help_form_saved_window_configs);
+ record_unwind_protect_void (read_char_help_form_unwind);
+ call0 (Qhelp_form_show);
+
+ cancel_echoing ();
+ do
+ {
+ c = read_char (0, Qnil, Qnil, 0, NULL);
+ if (EVENT_HAS_PARAMETERS (c)
+ && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_click))
+ XSETCAR (help_form_saved_window_configs, Qnil);
+ }
+ while (BUFFERP (c));
+ /* Remove the help from the frame. */
+ unbind_to (count, Qnil);
+
+ redisplay ();
+ if (EQ (c, make_number (040)))
+ {
+ cancel_echoing ();
+ do
+ c = read_char (0, Qnil, Qnil, 0, NULL);
+ while (BUFFERP (c));
+ }
+ }
+
+ exit:
+ RESUME_POLLING;
+ input_was_pending = input_pending;
+ RETURN_UNGCPRO (c);
+}
+
+/* Record a key that came from a mouse menu.
+ Record it for echoing, for this-command-keys, and so on. */
+
+static void
+record_menu_key (Lisp_Object c)
+{
+ /* Wipe the echo area. */
+ clear_message (1, 0);
+
+ record_char (c);
+
+#if 0
+ before_command_key_count = this_command_key_count;
+ before_command_echo_length = echo_length ();
+#endif
+
+ /* Don't echo mouse motion events. */
+ if (echo_keystrokes_p ())
+ {
+ echo_char (c);
+
+ /* Once we reread a character, echoing can happen
+ the next time we pause to read a new one. */
+ ok_to_echo_at_next_pause = 0;
+ }
+
+ /* Record this character as part of the current key. */
+ add_command_key (c);
+
+ /* Re-reading in the middle of a command. */
+ last_input_event = c;
+ num_input_events++;
+}
+
+/* Return true if should recognize C as "the help character". */
+
+static bool
+help_char_p (Lisp_Object c)
+{
+ Lisp_Object tail;
+
+ if (EQ (c, Vhelp_char))
+ return 1;
+ for (tail = Vhelp_event_list; CONSP (tail); tail = XCDR (tail))
+ if (EQ (c, XCAR (tail)))
+ return 1;
+ return 0;
+}
+
+/* Record the input event C in various ways. */
+
+static void
+record_char (Lisp_Object c)
+{
+ int recorded = 0;
+
+ if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), Qmouse_movement)))
+ {
+ /* To avoid filling recent_keys with help-echo and mouse-movement
+ events, we filter out repeated help-echo events, only store the
+ first and last in a series of mouse-movement events, and don't
+ store repeated help-echo events which are only separated by
+ mouse-movement events. */
+
+ Lisp_Object ev1, ev2, ev3;
+ int ix1, ix2, ix3;
+
+ if ((ix1 = recent_keys_index - 1) < 0)
+ ix1 = NUM_RECENT_KEYS - 1;
+ ev1 = AREF (recent_keys, ix1);
+
+ if ((ix2 = ix1 - 1) < 0)
+ ix2 = NUM_RECENT_KEYS - 1;
+ ev2 = AREF (recent_keys, ix2);
+
+ if ((ix3 = ix2 - 1) < 0)
+ ix3 = NUM_RECENT_KEYS - 1;
+ ev3 = AREF (recent_keys, ix3);
+
+ if (EQ (XCAR (c), Qhelp_echo))
+ {
+ /* Don't record `help-echo' in recent_keys unless it shows some help
+ message, and a different help than the previously recorded
+ event. */
+ Lisp_Object help, last_help;
+
+ help = Fcar_safe (Fcdr_safe (XCDR (c)));
+ if (!STRINGP (help))
+ recorded = 1;
+ else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
+ && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ (last_help, help)))
+ recorded = 1;
+ else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
+ && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
+ && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ (last_help, help)))
+ recorded = -1;
+ else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
+ && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
+ && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
+ && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ (last_help, help)))
+ recorded = -2;
+ }
+ else if (EQ (XCAR (c), Qmouse_movement))
+ {
+ /* Only record one pair of `mouse-movement' on a window in recent_keys.
+ So additional mouse movement events replace the last element. */
+ Lisp_Object last_window, window;
+
+ window = Fcar_safe (Fcar_safe (XCDR (c)));
+ if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
+ && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ (last_window, window))
+ && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
+ && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ (last_window, window)))
+ {
+ ASET (recent_keys, ix1, c);
+ recorded = 1;
+ }
+ }
+ }
+ else
+ store_kbd_macro_char (c);
+
+ if (!recorded)
+ {
+ total_keys += total_keys < NUM_RECENT_KEYS;
+ ASET (recent_keys, recent_keys_index, c);
+ if (++recent_keys_index >= NUM_RECENT_KEYS)
+ recent_keys_index = 0;
+ }
+ else if (recorded < 0)
+ {
+ /* We need to remove one or two events from recent_keys.
+ To do this, we simply put nil at those events and move the
+ recent_keys_index backwards over those events. Usually,
+ users will never see those nil events, as they will be
+ overwritten by the command keys entered to see recent_keys
+ (e.g. C-h l). */
+
+ while (recorded++ < 0 && total_keys > 0)
+ {
+ if (total_keys < NUM_RECENT_KEYS)
+ total_keys--;
+ if (--recent_keys_index < 0)
+ recent_keys_index = NUM_RECENT_KEYS - 1;
+ ASET (recent_keys, recent_keys_index, Qnil);
+ }
+ }
+
+ num_nonmacro_input_events++;
+
+ /* Write c to the dribble file. If c is a lispy event, write
+ the event's symbol to the dribble file, in <brackets>. Bleaugh.
+ If you, dear reader, have a better idea, you've got the source. :-) */
+ if (dribble)
+ {
+ block_input ();
+ if (INTEGERP (c))
+ {
+ if (XUINT (c) < 0x100)
+ putc (XUINT (c), dribble);
+ else
+ fprintf (dribble, " 0x%"pI"x", XUINT (c));
+ }
+ else
+ {
+ Lisp_Object dribblee;
+
+ /* If it's a structured event, take the event header. */
+ dribblee = EVENT_HEAD (c);
+
+ if (SYMBOLP (dribblee))
+ {
+ putc ('<', dribble);
+ fwrite (SDATA (SYMBOL_NAME (dribblee)), sizeof (char),
+ SBYTES (SYMBOL_NAME (dribblee)),
+ dribble);
+ putc ('>', dribble);
+ }
+ }
+
+ fflush (dribble);
+ unblock_input ();
+ }
+}
+
+/* Copy out or in the info on where C-g should throw to.
+ This is used when running Lisp code from within get_char,
+ in case get_char is called recursively.
+ See read_process_output. */
+
+static void
+save_getcjmp (sys_jmp_buf temp)
+{
+ memcpy (temp, getcjmp, sizeof getcjmp);
+}
+
+static void
+restore_getcjmp (sys_jmp_buf temp)
+{
+ memcpy (getcjmp, temp, sizeof getcjmp);
+}
+
+/* Low level keyboard/mouse input.
+ kbd_buffer_store_event places events in kbd_buffer, and
+ kbd_buffer_get_event retrieves them. */
+
+/* Return true if there are any events in the queue that read-char
+ would return. If this returns false, a read-char would block. */
+static bool
+readable_events (int flags)
+{
+ if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
+ timer_check ();
+
+ /* If the buffer contains only FOCUS_IN_EVENT events, and
+ READABLE_EVENTS_FILTER_EVENTS is set, report it as empty. */
+ if (kbd_fetch_ptr != kbd_store_ptr)
+ {
+ if (flags & (READABLE_EVENTS_FILTER_EVENTS
+#ifdef USE_TOOLKIT_SCROLL_BARS
+ | READABLE_EVENTS_IGNORE_SQUEEZABLES
+#endif
+ ))
+ {
+ struct input_event *event;
+
+ event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
+ ? kbd_fetch_ptr
+ : kbd_buffer);
+
+ do
+ {
+ if (!(
+#ifdef USE_TOOLKIT_SCROLL_BARS
+ (flags & READABLE_EVENTS_FILTER_EVENTS) &&
+#endif
+ event->kind == FOCUS_IN_EVENT)
+#ifdef USE_TOOLKIT_SCROLL_BARS
+ && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
+ && (event->kind == SCROLL_BAR_CLICK_EVENT
+ || event->kind == HORIZONTAL_SCROLL_BAR_CLICK_EVENT)
+ && event->part == scroll_bar_handle
+ && event->modifiers == 0)
+#endif
+ && !((flags & READABLE_EVENTS_FILTER_EVENTS)
+ && event->kind == BUFFER_SWITCH_EVENT))
+ return 1;
+ event++;
+ if (event == kbd_buffer + KBD_BUFFER_SIZE)
+ event = kbd_buffer;
+ }
+ while (event != kbd_store_ptr);
+ }
+ else
+ return 1;
+ }
+
+ if (!(flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
+ && !NILP (do_mouse_tracking) && some_mouse_moved ())
+ return 1;
+ if (single_kboard)
+ {
+ if (current_kboard->kbd_queue_has_data)
+ return 1;
+ }
+ else
+ {
+ KBOARD *kb;
+ for (kb = all_kboards; kb; kb = kb->next_kboard)
+ if (kb->kbd_queue_has_data)
+ return 1;
+ }
+ return 0;
+}
+
+/* Set this for debugging, to have a way to get out */
+int stop_character EXTERNALLY_VISIBLE;
+
+static KBOARD *
+event_to_kboard (struct input_event *event)
+{
+ /* Not applicable for these special events. */
+ if (event->kind == SELECTION_REQUEST_EVENT
+ || event->kind == SELECTION_CLEAR_EVENT)
+ return NULL;
+ else
+ {
+ Lisp_Object obj = event->frame_or_window;
+ /* There are some events that set this field to nil or string. */
+ if (WINDOWP (obj))
+ obj = WINDOW_FRAME (XWINDOW (obj));
+ /* Also ignore dead frames here. */
+ return ((FRAMEP (obj) && FRAME_LIVE_P (XFRAME (obj)))
+ ? FRAME_KBOARD (XFRAME (obj)) : NULL);
+ }
+}
+
+#ifdef subprocesses
+/* Return the number of slots occupied in kbd_buffer. */
+
+static int
+kbd_buffer_nr_stored (void)
+{
+ return kbd_fetch_ptr == kbd_store_ptr
+ ? 0
+ : (kbd_fetch_ptr < kbd_store_ptr
+ ? kbd_store_ptr - kbd_fetch_ptr
+ : ((kbd_buffer + KBD_BUFFER_SIZE) - kbd_fetch_ptr
+ + (kbd_store_ptr - kbd_buffer)));
+}
+#endif /* Store an event obtained at interrupt level into kbd_buffer, fifo */
+
+void
+kbd_buffer_store_event (register struct input_event *event)
+{
+ kbd_buffer_store_event_hold (event, 0);
+}
+
+/* Store EVENT obtained at interrupt level into kbd_buffer, fifo.
+
+ If HOLD_QUIT is 0, just stuff EVENT into the fifo.
+ Else, if HOLD_QUIT.kind != NO_EVENT, discard EVENT.
+ Else, if EVENT is a quit event, store the quit event
+ in HOLD_QUIT, and return (thus ignoring further events).
+
+ This is used to postpone the processing of the quit event until all
+ subsequent input events have been parsed (and discarded). */
+
+void
+kbd_buffer_store_event_hold (register struct input_event *event,
+ struct input_event *hold_quit)
+{
+ if (event->kind == NO_EVENT)
+ emacs_abort ();
+
+ if (hold_quit && hold_quit->kind != NO_EVENT)
+ return;
+
+ if (event->kind == ASCII_KEYSTROKE_EVENT)
+ {
+ register int c = event->code & 0377;
+
+ if (event->modifiers & ctrl_modifier)
+ c = make_ctrl_char (c);
+
+ c |= (event->modifiers
+ & (meta_modifier | alt_modifier
+ | hyper_modifier | super_modifier));
+
+ if (c == quit_char)
+ {
+ KBOARD *kb = FRAME_KBOARD (XFRAME (event->frame_or_window));
+ struct input_event *sp;
+
+ if (single_kboard && kb != current_kboard)
+ {
+ kset_kbd_queue
+ (kb, list2 (make_lispy_switch_frame (event->frame_or_window),
+ make_number (c)));
+ kb->kbd_queue_has_data = 1;
+ for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
+ {
+ if (sp == kbd_buffer + KBD_BUFFER_SIZE)
+ sp = kbd_buffer;
+
+ if (event_to_kboard (sp) == kb)
+ {
+ sp->kind = NO_EVENT;
+ sp->frame_or_window = Qnil;
+ sp->arg = Qnil;
+ }
+ }
+ return;
+ }
+
+ if (hold_quit)
+ {
+ *hold_quit = *event;
+ return;
+ }
+
+ /* If this results in a quit_char being returned to Emacs as
+ input, set Vlast_event_frame properly. If this doesn't
+ get returned to Emacs as an event, the next event read
+ will set Vlast_event_frame again, so this is safe to do. */
+ {
+ Lisp_Object focus;
+
+ focus = FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window));
+ if (NILP (focus))
+ focus = event->frame_or_window;
+ internal_last_event_frame = focus;
+ Vlast_event_frame = focus;
+ }
+
+ handle_interrupt (0);
+ return;
+ }
+
+ if (c && c == stop_character)
+ {
+ sys_suspend ();
+ return;
+ }
+ }
+ /* Don't insert two BUFFER_SWITCH_EVENT's in a row.
+ Just ignore the second one. */
+ else if (event->kind == BUFFER_SWITCH_EVENT
+ && kbd_fetch_ptr != kbd_store_ptr
+ && ((kbd_store_ptr == kbd_buffer
+ ? kbd_buffer + KBD_BUFFER_SIZE - 1
+ : kbd_store_ptr - 1)->kind) == BUFFER_SWITCH_EVENT)
+ return;
+
+ if (kbd_store_ptr - kbd_buffer == KBD_BUFFER_SIZE)
+ kbd_store_ptr = kbd_buffer;
+
+ /* Don't let the very last slot in the buffer become full,
+ since that would make the two pointers equal,
+ and that is indistinguishable from an empty buffer.
+ Discard the event if it would fill the last slot. */
+ if (kbd_fetch_ptr - 1 != kbd_store_ptr)
+ {
+ *kbd_store_ptr = *event;
+ ++kbd_store_ptr;
+#ifdef subprocesses
+ if (kbd_buffer_nr_stored () > KBD_BUFFER_SIZE / 2
+ && ! kbd_on_hold_p ())
+ {
+ /* Don't read keyboard input until we have processed kbd_buffer.
+ This happens when pasting text longer than KBD_BUFFER_SIZE/2. */
+ hold_keyboard_input ();
+ if (!noninteractive)
+ ignore_sigio ();
+ stop_polling ();
+ }
+#endif /* subprocesses */
+ }
+
+ /* If we're inside while-no-input, and this event qualifies
+ as input, set quit-flag to cause an interrupt. */
+ if (!NILP (Vthrow_on_input)
+ && event->kind != FOCUS_IN_EVENT
+ && event->kind != FOCUS_OUT_EVENT
+ && event->kind != HELP_EVENT
+ && event->kind != ICONIFY_EVENT
+ && event->kind != DEICONIFY_EVENT)
+ {
+ Vquit_flag = Vthrow_on_input;
+ /* If we're inside a function that wants immediate quits,
+ do it now. */
+ if (immediate_quit && NILP (Vinhibit_quit))
+ {
+ immediate_quit = 0;
+ QUIT;
+ }
+ }
+}
+
+
+/* Put an input event back in the head of the event queue. */
+
+void
+kbd_buffer_unget_event (register struct input_event *event)
+{
+ if (kbd_fetch_ptr == kbd_buffer)
+ kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE;
+
+ /* Don't let the very last slot in the buffer become full, */
+ if (kbd_fetch_ptr - 1 != kbd_store_ptr)
+ {
+ --kbd_fetch_ptr;
+ *kbd_fetch_ptr = *event;
+ }
+}
+
+/* Limit help event positions to this range, to avoid overflow problems. */
+#define INPUT_EVENT_POS_MAX \
+ ((ptrdiff_t) min (PTRDIFF_MAX, min (TYPE_MAXIMUM (Time) / 2, \
+ MOST_POSITIVE_FIXNUM)))
+#define INPUT_EVENT_POS_MIN (-1 - INPUT_EVENT_POS_MAX)
+
+/* Return a Time that encodes position POS. POS must be in range. */
+
+static Time
+position_to_Time (ptrdiff_t pos)
+{
+ eassert (INPUT_EVENT_POS_MIN <= pos && pos <= INPUT_EVENT_POS_MAX);
+ return pos;
+}
+
+/* Return the position that ENCODED_POS encodes.
+ Avoid signed integer overflow. */
+
+static ptrdiff_t
+Time_to_position (Time encoded_pos)
+{
+ if (encoded_pos <= INPUT_EVENT_POS_MAX)
+ return encoded_pos;
+ Time encoded_pos_min = INPUT_EVENT_POS_MIN;
+ eassert (encoded_pos_min <= encoded_pos);
+ ptrdiff_t notpos = -1 - encoded_pos;
+ return -1 - notpos;
+}
+
+/* Generate a HELP_EVENT input_event and store it in the keyboard
+ buffer.
+
+ HELP is the help form.
+
+ FRAME and WINDOW are the frame and window where the help is
+ generated. OBJECT is the Lisp object where the help was found (a
+ buffer, a string, an overlay, or nil if neither from a string nor
+ from a buffer). POS is the position within OBJECT where the help
+ was found. */
+
+void
+gen_help_event (Lisp_Object help, Lisp_Object frame, Lisp_Object window,
+ Lisp_Object object, ptrdiff_t pos)
+{
+ struct input_event event;
+
+ event.kind = HELP_EVENT;
+ event.frame_or_window = frame;
+ event.arg = object;
+ event.x = WINDOWP (window) ? window : frame;
+ event.y = help;
+ event.timestamp = position_to_Time (pos);
+ kbd_buffer_store_event (&event);
+}
+
+
+/* Store HELP_EVENTs for HELP on FRAME in the input queue. */
+
+void
+kbd_buffer_store_help_event (Lisp_Object frame, Lisp_Object help)
+{
+ struct input_event event;
+
+ event.kind = HELP_EVENT;
+ event.frame_or_window = frame;
+ event.arg = Qnil;
+ event.x = Qnil;
+ event.y = help;
+ event.timestamp = 0;
+ kbd_buffer_store_event (&event);
+}
+
+
+/* Discard any mouse events in the event buffer by setting them to
+ NO_EVENT. */
+void
+discard_mouse_events (void)
+{
+ struct input_event *sp;
+ for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
+ {
+ if (sp == kbd_buffer + KBD_BUFFER_SIZE)
+ sp = kbd_buffer;
+
+ if (sp->kind == MOUSE_CLICK_EVENT
+ || sp->kind == WHEEL_EVENT
+ || sp->kind == HORIZ_WHEEL_EVENT
+#ifdef HAVE_GPM
+ || sp->kind == GPM_CLICK_EVENT
+#endif
+ || sp->kind == SCROLL_BAR_CLICK_EVENT
+ || sp->kind == HORIZONTAL_SCROLL_BAR_CLICK_EVENT)
+ {
+ sp->kind = NO_EVENT;
+ }
+ }
+}
+
+
+/* Return true if there are any real events waiting in the event
+ buffer, not counting `NO_EVENT's.
+
+ Discard NO_EVENT events at the front of the input queue, possibly
+ leaving the input queue empty if there are no real input events. */
+
+bool
+kbd_buffer_events_waiting (void)
+{
+ struct input_event *sp;
+
+ for (sp = kbd_fetch_ptr;
+ sp != kbd_store_ptr && sp->kind == NO_EVENT;
+ ++sp)
+ {
+ if (sp == kbd_buffer + KBD_BUFFER_SIZE)
+ sp = kbd_buffer;
+ }
+
+ kbd_fetch_ptr = sp;
+ return sp != kbd_store_ptr && sp->kind != NO_EVENT;
+}
+
+
+/* Clear input event EVENT. */
+
+static void
+clear_event (struct input_event *event)
+{
+ event->kind = NO_EVENT;
+}
+
+
+/* Read one event from the event buffer, waiting if necessary.
+ The value is a Lisp object representing the event.
+ The value is nil for an event that should be ignored,
+ or that was handled here.
+ We always read and discard one event. */
+
+static Lisp_Object
+kbd_buffer_get_event (KBOARD **kbp,
+ bool *used_mouse_menu,
+ struct timespec *end_time)
+{
+ Lisp_Object obj;
+
+#ifdef subprocesses
+ if (kbd_on_hold_p () && kbd_buffer_nr_stored () < KBD_BUFFER_SIZE / 4)
+ {
+ /* Start reading input again because we have processed enough to
+ be able to accept new events again. */
+ unhold_keyboard_input ();
+ start_polling ();
+ }
+#endif /* subprocesses */
+
+#if !defined HAVE_DBUS && !defined USE_FILE_NOTIFY
+ if (noninteractive
+ /* In case we are running as a daemon, only do this before
+ detaching from the terminal. */
+ || (IS_DAEMON && DAEMON_RUNNING))
+ {
+ int c = getchar ();
+ XSETINT (obj, c);
+ *kbp = current_kboard;
+ return obj;
+ }
+#endif /* !defined HAVE_DBUS && !defined USE_FILE_NOTIFY */
+
+ /* Wait until there is input available. */
+ for (;;)
+ {
+ /* Break loop if there's an unread command event. Needed in
+ moused window autoselection which uses a timer to insert such
+ events. */
+ if (CONSP (Vunread_command_events))
+ break;
+
+ if (kbd_fetch_ptr != kbd_store_ptr)
+ break;
+ if (!NILP (do_mouse_tracking) && some_mouse_moved ())
+ break;
+
+ /* If the quit flag is set, then read_char will return
+ quit_char, so that counts as "available input." */
+ if (!NILP (Vquit_flag))
+ quit_throw_to_read_char (0);
+
+ /* One way or another, wait until input is available; then, if
+ interrupt handlers have not read it, read it now. */
+
+#ifdef USABLE_SIGIO
+ gobble_input ();
+#endif
+ if (kbd_fetch_ptr != kbd_store_ptr)
+ break;
+ if (!NILP (do_mouse_tracking) && some_mouse_moved ())
+ break;
+ if (end_time)
+ {
+ struct timespec now = current_timespec ();
+ if (timespec_cmp (*end_time, now) <= 0)
+ return Qnil; /* Finished waiting. */
+ else
+ {
+ struct timespec duration = timespec_sub (*end_time, now);
+ wait_reading_process_output (min (duration.tv_sec,
+ WAIT_READING_MAX),
+ duration.tv_nsec,
+ -1, 1, Qnil, NULL, 0);
+ }
+ }
+ else
+ {
+ bool do_display = true;
+
+ if (FRAME_TERMCAP_P (SELECTED_FRAME ()))
+ {
+ struct tty_display_info *tty = CURTTY ();
+
+ /* When this TTY is displaying a menu, we must prevent
+ any redisplay, because we modify the frame's glyph
+ matrix behind the back of the display engine. */
+ if (tty->showing_menu)
+ do_display = false;
+ }
+
+ wait_reading_process_output (0, 0, -1, do_display, Qnil, NULL, 0);
+ }
+
+ if (!interrupt_input && kbd_fetch_ptr == kbd_store_ptr)
+ gobble_input ();
+ }
+
+ if (CONSP (Vunread_command_events))
+ {
+ Lisp_Object first;
+ first = XCAR (Vunread_command_events);
+ Vunread_command_events = XCDR (Vunread_command_events);
+ *kbp = current_kboard;
+ return first;
+ }
+
+ /* At this point, we know that there is a readable event available
+ somewhere. If the event queue is empty, then there must be a
+ mouse movement enabled and available. */
+ if (kbd_fetch_ptr != kbd_store_ptr)
+ {
+ struct input_event *event;
+
+ event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
+ ? kbd_fetch_ptr
+ : kbd_buffer);
+
+ *kbp = event_to_kboard (event);
+ if (*kbp == 0)
+ *kbp = current_kboard; /* Better than returning null ptr? */
+
+ obj = Qnil;
+
+ /* These two kinds of events get special handling
+ and don't actually appear to the command loop.
+ We return nil for them. */
+ if (event->kind == SELECTION_REQUEST_EVENT
+ || event->kind == SELECTION_CLEAR_EVENT)
+ {
+#ifdef HAVE_X11
+ struct input_event copy;
+
+ /* Remove it from the buffer before processing it,
+ since otherwise swallow_events will see it
+ and process it again. */
+ copy = *event;
+ kbd_fetch_ptr = event + 1;
+ input_pending = readable_events (0);
+ x_handle_selection_event (&copy);
+#else
+ /* We're getting selection request events, but we don't have
+ a window system. */
+ emacs_abort ();
+#endif
+ }
+
+#if defined (HAVE_NS)
+ else if (event->kind == NS_TEXT_EVENT)
+ {
+ if (event->code == KEY_NS_PUT_WORKING_TEXT)
+ obj = list1 (intern ("ns-put-working-text"));
+ else
+ obj = list1 (intern ("ns-unput-working-text"));
+ kbd_fetch_ptr = event + 1;
+ if (used_mouse_menu)
+ *used_mouse_menu = 1;
+ }
+#endif
+
+#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
+ || defined (HAVE_NS)
+ else if (event->kind == DELETE_WINDOW_EVENT)
+ {
+ /* Make an event (delete-frame (FRAME)). */
+ obj = list2 (Qdelete_frame, list1 (event->frame_or_window));
+ kbd_fetch_ptr = event + 1;
+ }
+#endif
+#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
+ || defined (HAVE_NS)
+ else if (event->kind == ICONIFY_EVENT)
+ {
+ /* Make an event (iconify-frame (FRAME)). */
+ obj = list2 (Qiconify_frame, list1 (event->frame_or_window));
+ kbd_fetch_ptr = event + 1;
+ }
+ else if (event->kind == DEICONIFY_EVENT)
+ {
+ /* Make an event (make-frame-visible (FRAME)). */
+ obj = list2 (Qmake_frame_visible, list1 (event->frame_or_window));
+ kbd_fetch_ptr = event + 1;
+ }
+#endif
+ else if (event->kind == BUFFER_SWITCH_EVENT)
+ {
+ /* The value doesn't matter here; only the type is tested. */
+ XSETBUFFER (obj, current_buffer);
+ kbd_fetch_ptr = event + 1;
+ }
+#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
+ || defined (HAVE_NS) || defined (USE_GTK)
+ else if (event->kind == MENU_BAR_ACTIVATE_EVENT)
+ {
+ kbd_fetch_ptr = event + 1;
+ input_pending = readable_events (0);
+ if (FRAME_LIVE_P (XFRAME (event->frame_or_window)))
+ x_activate_menubar (XFRAME (event->frame_or_window));
+ }
+#endif
+#ifdef HAVE_NTGUI
+ else if (event->kind == LANGUAGE_CHANGE_EVENT)
+ {
+ /* Make an event (language-change FRAME CODEPAGE LANGUAGE-ID). */
+ obj = list4 (Qlanguage_change,
+ event->frame_or_window,
+ make_number (event->code),
+ make_number (event->modifiers));
+ kbd_fetch_ptr = event + 1;
+ }
+#endif
+#ifdef USE_FILE_NOTIFY
+ else if (event->kind == FILE_NOTIFY_EVENT)
+ {
+#ifdef HAVE_W32NOTIFY
+ /* Make an event (file-notify (DESCRIPTOR ACTION FILE) CALLBACK). */
+ obj = list3 (Qfile_notify, event->arg, event->frame_or_window);
+#else
+ obj = make_lispy_event (event);
+#endif
+ kbd_fetch_ptr = event + 1;
+ }
+#endif /* USE_FILE_NOTIFY */
+ else if (event->kind == SAVE_SESSION_EVENT)
+ {
+ obj = list2 (Qsave_session, event->arg);
+ kbd_fetch_ptr = event + 1;
+ }
+ /* Just discard these, by returning nil.
+ With MULTI_KBOARD, these events are used as placeholders
+ when we need to randomly delete events from the queue.
+ (They shouldn't otherwise be found in the buffer,
+ but on some machines it appears they do show up
+ even without MULTI_KBOARD.) */
+ /* On Windows NT/9X, NO_EVENT is used to delete extraneous
+ mouse events during a popup-menu call. */
+ else if (event->kind == NO_EVENT)
+ kbd_fetch_ptr = event + 1;
+ else if (event->kind == HELP_EVENT)
+ {
+ Lisp_Object object, position, help, frame, window;
+
+ frame = event->frame_or_window;
+ object = event->arg;
+ position = make_number (Time_to_position (event->timestamp));
+ window = event->x;
+ help = event->y;
+ clear_event (event);
+
+ kbd_fetch_ptr = event + 1;
+ if (!WINDOWP (window))
+ window = Qnil;
+ obj = Fcons (Qhelp_echo,
+ list5 (frame, help, window, object, position));
+ }
+ else if (event->kind == FOCUS_IN_EVENT)
+ {
+ /* Notification of a FocusIn event. The frame receiving the
+ focus is in event->frame_or_window. Generate a
+ switch-frame event if necessary. */
+ Lisp_Object frame, focus;
+
+ frame = event->frame_or_window;
+ focus = FRAME_FOCUS_FRAME (XFRAME (frame));
+ if (FRAMEP (focus))
+ frame = focus;
+
+ if (
+#ifdef HAVE_X11
+ ! NILP (event->arg)
+ &&
+#endif
+ !EQ (frame, internal_last_event_frame)
+ && !EQ (frame, selected_frame))
+ obj = make_lispy_switch_frame (frame);
+ else
+ obj = make_lispy_focus_in (frame);
+
+ internal_last_event_frame = frame;
+ kbd_fetch_ptr = event + 1;
+ }
+ else if (event->kind == FOCUS_OUT_EVENT)
+ {
+#ifdef HAVE_WINDOW_SYSTEM
+
+ Display_Info *di;
+ Lisp_Object frame = event->frame_or_window;
+ bool focused = false;
+
+ for (di = x_display_list; di && ! focused; di = di->next)
+ focused = di->x_highlight_frame != 0;
+
+ if (!focused)
+ obj = make_lispy_focus_out (frame);
+
+#endif /* HAVE_WINDOW_SYSTEM */
+
+ kbd_fetch_ptr = event + 1;
+ }
+#ifdef HAVE_DBUS
+ else if (event->kind == DBUS_EVENT)
+ {
+ obj = make_lispy_event (event);
+ kbd_fetch_ptr = event + 1;
+ }
+#endif
+ else if (event->kind == CONFIG_CHANGED_EVENT)
+ {
+ obj = make_lispy_event (event);
+ kbd_fetch_ptr = event + 1;
+ }
+ else
+ {
+ /* If this event is on a different frame, return a switch-frame this
+ time, and leave the event in the queue for next time. */
+ Lisp_Object frame;
+ Lisp_Object focus;
+
+ frame = event->frame_or_window;
+ if (CONSP (frame))
+ frame = XCAR (frame);
+ else if (WINDOWP (frame))
+ frame = WINDOW_FRAME (XWINDOW (frame));
+
+ focus = FRAME_FOCUS_FRAME (XFRAME (frame));
+ if (! NILP (focus))
+ frame = focus;
+
+ if (! EQ (frame, internal_last_event_frame)
+ && !EQ (frame, selected_frame))
+ obj = make_lispy_switch_frame (frame);
+ internal_last_event_frame = frame;
+
+ /* If we didn't decide to make a switch-frame event, go ahead
+ and build a real event from the queue entry. */
+
+ if (NILP (obj))
+ {
+ obj = make_lispy_event (event);
+
+#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
+ || defined (HAVE_NS) || defined (USE_GTK)
+ /* If this was a menu selection, then set the flag to inhibit
+ writing to last_nonmenu_event. Don't do this if the event
+ we're returning is (menu-bar), though; that indicates the
+ beginning of the menu sequence, and we might as well leave
+ that as the `event with parameters' for this selection. */
+ if (used_mouse_menu
+ && !EQ (event->frame_or_window, event->arg)
+ && (event->kind == MENU_BAR_EVENT
+ || event->kind == TOOL_BAR_EVENT))
+ *used_mouse_menu = 1;
+#endif
+#ifdef HAVE_NS
+ /* Certain system events are non-key events. */
+ if (used_mouse_menu
+ && event->kind == NS_NONKEY_EVENT)
+ *used_mouse_menu = 1;
+#endif
+
+ /* Wipe out this event, to catch bugs. */
+ clear_event (event);
+ kbd_fetch_ptr = event + 1;
+ }
+ }
+ }
+ /* Try generating a mouse motion event. */
+ else if (!NILP (do_mouse_tracking) && some_mouse_moved ())
+ {
+ struct frame *f = some_mouse_moved ();
+ Lisp_Object bar_window;
+ enum scroll_bar_part part;
+ Lisp_Object x, y;
+ Time t;
+
+ *kbp = current_kboard;
+ /* Note that this uses F to determine which terminal to look at.
+ If there is no valid info, it does not store anything
+ so x remains nil. */
+ x = Qnil;
+
+ /* XXX Can f or mouse_position_hook be NULL here? */
+ if (f && FRAME_TERMINAL (f)->mouse_position_hook)
+ (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, 0, &bar_window,
+ &part, &x, &y, &t);
+
+ obj = Qnil;
+
+ /* Decide if we should generate a switch-frame event. Don't
+ generate switch-frame events for motion outside of all Emacs
+ frames. */
+ if (!NILP (x) && f)
+ {
+ Lisp_Object frame;
+
+ frame = FRAME_FOCUS_FRAME (f);
+ if (NILP (frame))
+ XSETFRAME (frame, f);
+
+ if (! EQ (frame, internal_last_event_frame)
+ && !EQ (frame, selected_frame))
+ obj = make_lispy_switch_frame (frame);
+ internal_last_event_frame = frame;
+ }
+
+ /* If we didn't decide to make a switch-frame event, go ahead and
+ return a mouse-motion event. */
+ if (!NILP (x) && NILP (obj))
+ obj = make_lispy_movement (f, bar_window, part, x, y, t);
+ }
+ else
+ /* We were promised by the above while loop that there was
+ something for us to read! */
+ emacs_abort ();
+
+ input_pending = readable_events (0);
+
+ Vlast_event_frame = internal_last_event_frame;
+
+ return (obj);
+}
+
+/* Process any non-user-visible events (currently X selection events),
+ without reading any user-visible events. */
+
+static void
+process_special_events (void)
+{
+ struct input_event *event;
+
+ for (event = kbd_fetch_ptr; event != kbd_store_ptr; ++event)
+ {
+ if (event == kbd_buffer + KBD_BUFFER_SIZE)
+ {
+ event = kbd_buffer;
+ if (event == kbd_store_ptr)
+ break;
+ }
+
+ /* If we find a stored X selection request, handle it now. */
+ if (event->kind == SELECTION_REQUEST_EVENT
+ || event->kind == SELECTION_CLEAR_EVENT)
+ {
+#ifdef HAVE_X11
+
+ /* Remove the event from the fifo buffer before processing;
+ otherwise swallow_events called recursively could see it
+ and process it again. To do this, we move the events
+ between kbd_fetch_ptr and EVENT one slot to the right,
+ cyclically. */
+
+ struct input_event copy = *event;
+ struct input_event *beg
+ = (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
+ ? kbd_buffer : kbd_fetch_ptr;
+
+ if (event > beg)
+ memmove (beg + 1, beg, (event - beg) * sizeof (struct input_event));
+ else if (event < beg)
+ {
+ if (event > kbd_buffer)
+ memmove (kbd_buffer + 1, kbd_buffer,
+ (event - kbd_buffer) * sizeof (struct input_event));
+ *kbd_buffer = *(kbd_buffer + KBD_BUFFER_SIZE - 1);
+ if (beg < kbd_buffer + KBD_BUFFER_SIZE - 1)
+ memmove (beg + 1, beg,
+ (kbd_buffer + KBD_BUFFER_SIZE - 1 - beg)
+ * sizeof (struct input_event));
+ }
+
+ if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
+ kbd_fetch_ptr = kbd_buffer + 1;
+ else
+ kbd_fetch_ptr++;
+
+ input_pending = readable_events (0);
+ x_handle_selection_event (&copy);
+#else
+ /* We're getting selection request events, but we don't have
+ a window system. */
+ emacs_abort ();
+#endif
+ }
+ }
+}
+
+/* Process any events that are not user-visible, run timer events that
+ are ripe, and return, without reading any user-visible events. */
+
+void
+swallow_events (bool do_display)
+{
+ unsigned old_timers_run;
+
+ process_special_events ();
+
+ old_timers_run = timers_run;
+ get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW);
+
+ if (!input_pending && timers_run != old_timers_run && do_display)
+ redisplay_preserve_echo_area (7);
+}
+
+/* Record the start of when Emacs is idle,
+ for the sake of running idle-time timers. */
+
+static void
+timer_start_idle (void)
+{
+ /* If we are already in the idle state, do nothing. */
+ if (timespec_valid_p (timer_idleness_start_time))
+ return;
+
+ timer_idleness_start_time = current_timespec ();
+ timer_last_idleness_start_time = timer_idleness_start_time;
+
+ /* Mark all idle-time timers as once again candidates for running. */
+ call0 (intern ("internal-timer-start-idle"));
+}
+
+/* Record that Emacs is no longer idle, so stop running idle-time timers. */
+
+static void
+timer_stop_idle (void)
+{
+ timer_idleness_start_time = invalid_timespec ();
+}
+
+/* Resume idle timer from last idle start time. */
+
+static void
+timer_resume_idle (void)
+{
+ if (timespec_valid_p (timer_idleness_start_time))
+ return;
+
+ timer_idleness_start_time = timer_last_idleness_start_time;
+}
+
+/* This is only for debugging. */
+struct input_event last_timer_event EXTERNALLY_VISIBLE;
+
+/* List of elisp functions to call, delayed because they were generated in
+ a context where Elisp could not be safely run (e.g. redisplay, signal,
+ ...). Each element has the form (FUN . ARGS). */
+Lisp_Object pending_funcalls;
+
+/* Return true if TIMER is a valid timer, placing its value into *RESULT. */
+static bool
+decode_timer (Lisp_Object timer, struct timespec *result)
+{
+ Lisp_Object *vec;
+
+ if (! (VECTORP (timer) && ASIZE (timer) == 9))
+ return 0;
+ vec = XVECTOR (timer)->contents;
+ if (! NILP (vec[0]))
+ return 0;
+ if (! INTEGERP (vec[2]))
+ return false;
+
+ struct lisp_time t;
+ if (decode_time_components (vec[1], vec[2], vec[3], vec[8], &t, 0) <= 0)
+ return false;
+ *result = lisp_to_timespec (t);
+ return timespec_valid_p (*result);
+}
+
+
+/* Check whether a timer has fired. To prevent larger problems we simply
+ disregard elements that are not proper timers. Do not make a circular
+ timer list for the time being.
+
+ Returns the time to wait until the next timer fires. If a
+ timer is triggering now, return zero.
+ If no timer is active, return -1.
+
+ If a timer is ripe, we run it, with quitting turned off.
+ In that case we return 0 to indicate that a new timer_check_2 call
+ should be done. */
+
+static struct timespec
+timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers)
+{
+ struct timespec nexttime;
+ struct timespec now;
+ struct timespec idleness_now;
+ Lisp_Object chosen_timer;
+ struct gcpro gcpro1;
+
+ nexttime = invalid_timespec ();
+
+ chosen_timer = Qnil;
+ GCPRO1 (chosen_timer);
+
+ /* First run the code that was delayed. */
+ while (CONSP (pending_funcalls))
+ {
+ Lisp_Object funcall = XCAR (pending_funcalls);
+ pending_funcalls = XCDR (pending_funcalls);
+ safe_call2 (Qapply, XCAR (funcall), XCDR (funcall));
+ }
+
+ if (CONSP (timers) || CONSP (idle_timers))
+ {
+ now = current_timespec ();
+ idleness_now = (timespec_valid_p (timer_idleness_start_time)
+ ? timespec_sub (now, timer_idleness_start_time)
+ : make_timespec (0, 0));
+ }
+
+ while (CONSP (timers) || CONSP (idle_timers))
+ {
+ Lisp_Object timer = Qnil, idle_timer = Qnil;
+ struct timespec timer_time, idle_timer_time;
+ struct timespec difference;
+ struct timespec timer_difference = invalid_timespec ();
+ struct timespec idle_timer_difference = invalid_timespec ();
+ bool ripe, timer_ripe = 0, idle_timer_ripe = 0;
+
+ /* Set TIMER and TIMER_DIFFERENCE
+ based on the next ordinary timer.
+ TIMER_DIFFERENCE is the distance in time from NOW to when
+ this timer becomes ripe.
+ Skip past invalid timers and timers already handled. */
+ if (CONSP (timers))
+ {
+ timer = XCAR (timers);
+ if (! decode_timer (timer, &timer_time))
+ {
+ timers = XCDR (timers);
+ continue;
+ }
+
+ timer_ripe = timespec_cmp (timer_time, now) <= 0;
+ timer_difference = (timer_ripe
+ ? timespec_sub (now, timer_time)
+ : timespec_sub (timer_time, now));
+ }
+
+ /* Likewise for IDLE_TIMER and IDLE_TIMER_DIFFERENCE
+ based on the next idle timer. */
+ if (CONSP (idle_timers))
+ {
+ idle_timer = XCAR (idle_timers);
+ if (! decode_timer (idle_timer, &idle_timer_time))
+ {
+ idle_timers = XCDR (idle_timers);
+ continue;
+ }
+
+ idle_timer_ripe = timespec_cmp (idle_timer_time, idleness_now) <= 0;
+ idle_timer_difference
+ = (idle_timer_ripe
+ ? timespec_sub (idleness_now, idle_timer_time)
+ : timespec_sub (idle_timer_time, idleness_now));
+ }
+
+ /* Decide which timer is the next timer,
+ and set CHOSEN_TIMER, DIFFERENCE, and RIPE accordingly.
+ Also step down the list where we found that timer. */
+
+ if (timespec_valid_p (timer_difference)
+ && (! timespec_valid_p (idle_timer_difference)
+ || idle_timer_ripe < timer_ripe
+ || (idle_timer_ripe == timer_ripe
+ && ((timer_ripe
+ ? timespec_cmp (idle_timer_difference,
+ timer_difference)
+ : timespec_cmp (timer_difference,
+ idle_timer_difference))
+ < 0))))
+ {
+ chosen_timer = timer;
+ timers = XCDR (timers);
+ difference = timer_difference;
+ ripe = timer_ripe;
+ }
+ else
+ {
+ chosen_timer = idle_timer;
+ idle_timers = XCDR (idle_timers);
+ difference = idle_timer_difference;
+ ripe = idle_timer_ripe;
+ }
+
+ /* If timer is ripe, run it if it hasn't been run. */
+ if (ripe)
+ {
+ if (NILP (AREF (chosen_timer, 0)))
+ {
+ ptrdiff_t count = SPECPDL_INDEX ();
+ Lisp_Object old_deactivate_mark = Vdeactivate_mark;
+
+ /* Mark the timer as triggered to prevent problems if the lisp
+ code fails to reschedule it right. */
+ ASET (chosen_timer, 0, Qt);
+
+ specbind (Qinhibit_quit, Qt);
+
+ call1 (Qtimer_event_handler, chosen_timer);
+ Vdeactivate_mark = old_deactivate_mark;
+ timers_run++;
+ unbind_to (count, Qnil);
+
+ /* Since we have handled the event,
+ we don't need to tell the caller to wake up and do it. */
+ /* But the caller must still wait for the next timer, so
+ return 0 to indicate that. */
+ }
+
+ nexttime = make_timespec (0, 0);
+ break;
+ }
+ else
+ /* When we encounter a timer that is still waiting,
+ return the amount of time to wait before it is ripe. */
+ {
+ UNGCPRO;
+ return difference;
+ }
+ }
+
+ /* No timers are pending in the future. */
+ /* Return 0 if we generated an event, and -1 if not. */
+ UNGCPRO;
+ return nexttime;
+}
+
+
+/* Check whether a timer has fired. To prevent larger problems we simply
+ disregard elements that are not proper timers. Do not make a circular
+ timer list for the time being.
+
+ Returns the time to wait until the next timer fires.
+ If no timer is active, return an invalid value.
+
+ As long as any timer is ripe, we run it. */
+
+struct timespec
+timer_check (void)
+{
+ struct timespec nexttime;
+ Lisp_Object timers, idle_timers;
+ struct gcpro gcpro1, gcpro2;
+
+ Lisp_Object tem = Vinhibit_quit;
+ Vinhibit_quit = Qt;
+
+ /* We use copies of the timers' lists to allow a timer to add itself
+ again, without locking up Emacs if the newly added timer is
+ already ripe when added. */
+
+ /* Always consider the ordinary timers. */
+ timers = Fcopy_sequence (Vtimer_list);
+ /* Consider the idle timers only if Emacs is idle. */
+ if (timespec_valid_p (timer_idleness_start_time))
+ idle_timers = Fcopy_sequence (Vtimer_idle_list);
+ else
+ idle_timers = Qnil;
+
+ Vinhibit_quit = tem;
+
+ GCPRO2 (timers, idle_timers);
+
+ do
+ {
+ nexttime = timer_check_2 (timers, idle_timers);
+ }
+ while (nexttime.tv_sec == 0 && nexttime.tv_nsec == 0);
+
+ UNGCPRO;
+ return nexttime;
+}
+
+DEFUN ("current-idle-time", Fcurrent_idle_time, Scurrent_idle_time, 0, 0, 0,
+ doc: /* Return the current length of Emacs idleness, or nil.
+The value when Emacs is idle is a list of four integers (HIGH LOW USEC PSEC)
+in the same style as (current-time).
+
+The value when Emacs is not idle is nil.
+
+PSEC is a multiple of the system clock resolution. */)
+ (void)
+{
+ if (timespec_valid_p (timer_idleness_start_time))
+ return make_lisp_time (timespec_sub (current_timespec (),
+ timer_idleness_start_time));
+
+ return Qnil;
+}
+
+/* Caches for modify_event_symbol. */
+static Lisp_Object accent_key_syms;
+static Lisp_Object func_key_syms;
+static Lisp_Object mouse_syms;
+static Lisp_Object wheel_syms;
+static Lisp_Object drag_n_drop_syms;
+
+/* This is a list of keysym codes for special "accent" characters.
+ It parallels lispy_accent_keys. */
+
+static const int lispy_accent_codes[] =
+{
+#ifdef XK_dead_circumflex
+ XK_dead_circumflex,
+#else
+ 0,
+#endif
+#ifdef XK_dead_grave
+ XK_dead_grave,
+#else
+ 0,
+#endif
+#ifdef XK_dead_tilde
+ XK_dead_tilde,
+#else
+ 0,
+#endif
+#ifdef XK_dead_diaeresis
+ XK_dead_diaeresis,
+#else
+ 0,
+#endif
+#ifdef XK_dead_macron
+ XK_dead_macron,
+#else
+ 0,
+#endif
+#ifdef XK_dead_degree
+ XK_dead_degree,
+#else
+ 0,
+#endif
+#ifdef XK_dead_acute
+ XK_dead_acute,
+#else
+ 0,
+#endif
+#ifdef XK_dead_cedilla
+ XK_dead_cedilla,
+#else
+ 0,
+#endif
+#ifdef XK_dead_breve
+ XK_dead_breve,
+#else
+ 0,
+#endif
+#ifdef XK_dead_ogonek
+ XK_dead_ogonek,
+#else
+ 0,
+#endif
+#ifdef XK_dead_caron
+ XK_dead_caron,
+#else
+ 0,
+#endif
+#ifdef XK_dead_doubleacute
+ XK_dead_doubleacute,
+#else
+ 0,
+#endif
+#ifdef XK_dead_abovedot
+ XK_dead_abovedot,
+#else
+ 0,
+#endif
+#ifdef XK_dead_abovering
+ XK_dead_abovering,
+#else
+ 0,
+#endif
+#ifdef XK_dead_iota
+ XK_dead_iota,
+#else
+ 0,
+#endif
+#ifdef XK_dead_belowdot
+ XK_dead_belowdot,
+#else
+ 0,
+#endif
+#ifdef XK_dead_voiced_sound
+ XK_dead_voiced_sound,
+#else
+ 0,
+#endif
+#ifdef XK_dead_semivoiced_sound
+ XK_dead_semivoiced_sound,
+#else
+ 0,
+#endif
+#ifdef XK_dead_hook
+ XK_dead_hook,
+#else
+ 0,
+#endif
+#ifdef XK_dead_horn
+ XK_dead_horn,
+#else
+ 0,
+#endif
+};
+
+/* This is a list of Lisp names for special "accent" characters.
+ It parallels lispy_accent_codes. */
+
+static const char *const lispy_accent_keys[] =
+{
+ "dead-circumflex",
+ "dead-grave",
+ "dead-tilde",
+ "dead-diaeresis",
+ "dead-macron",
+ "dead-degree",
+ "dead-acute",
+ "dead-cedilla",
+ "dead-breve",
+ "dead-ogonek",
+ "dead-caron",
+ "dead-doubleacute",
+ "dead-abovedot",
+ "dead-abovering",
+ "dead-iota",
+ "dead-belowdot",
+ "dead-voiced-sound",
+ "dead-semivoiced-sound",
+ "dead-hook",
+ "dead-horn",
+};
+
+#ifdef HAVE_NTGUI
+#define FUNCTION_KEY_OFFSET 0x0
+
+const char *const lispy_function_keys[] =
+ {
+ 0, /* 0 */
+
+ 0, /* VK_LBUTTON 0x01 */
+ 0, /* VK_RBUTTON 0x02 */
+ "cancel", /* VK_CANCEL 0x03 */
+ 0, /* VK_MBUTTON 0x04 */
+
+ 0, 0, 0, /* 0x05 .. 0x07 */
+
+ "backspace", /* VK_BACK 0x08 */
+ "tab", /* VK_TAB 0x09 */
+
+ 0, 0, /* 0x0A .. 0x0B */
+
+ "clear", /* VK_CLEAR 0x0C */
+ "return", /* VK_RETURN 0x0D */
+
+ 0, 0, /* 0x0E .. 0x0F */
+
+ 0, /* VK_SHIFT 0x10 */
+ 0, /* VK_CONTROL 0x11 */
+ 0, /* VK_MENU 0x12 */
+ "pause", /* VK_PAUSE 0x13 */
+ "capslock", /* VK_CAPITAL 0x14 */
+ "kana", /* VK_KANA/VK_HANGUL 0x15 */
+ 0, /* 0x16 */
+ "junja", /* VK_JUNJA 0x17 */
+ "final", /* VK_FINAL 0x18 */
+ "kanji", /* VK_KANJI/VK_HANJA 0x19 */
+ 0, /* 0x1A */
+ "escape", /* VK_ESCAPE 0x1B */
+ "convert", /* VK_CONVERT 0x1C */
+ "non-convert", /* VK_NONCONVERT 0x1D */
+ "accept", /* VK_ACCEPT 0x1E */
+ "mode-change", /* VK_MODECHANGE 0x1F */
+ 0, /* VK_SPACE 0x20 */
+ "prior", /* VK_PRIOR 0x21 */
+ "next", /* VK_NEXT 0x22 */
+ "end", /* VK_END 0x23 */
+ "home", /* VK_HOME 0x24 */
+ "left", /* VK_LEFT 0x25 */
+ "up", /* VK_UP 0x26 */
+ "right", /* VK_RIGHT 0x27 */
+ "down", /* VK_DOWN 0x28 */
+ "select", /* VK_SELECT 0x29 */
+ "print", /* VK_PRINT 0x2A */
+ "execute", /* VK_EXECUTE 0x2B */
+ "snapshot", /* VK_SNAPSHOT 0x2C */
+ "insert", /* VK_INSERT 0x2D */
+ "delete", /* VK_DELETE 0x2E */
+ "help", /* VK_HELP 0x2F */
+
+ /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, 0, 0, 0, 0, 0, 0, /* 0x3A .. 0x40 */
+
+ /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+
+ "lwindow", /* VK_LWIN 0x5B */
+ "rwindow", /* VK_RWIN 0x5C */
+ "apps", /* VK_APPS 0x5D */
+ 0, /* 0x5E */
+ "sleep",
+ "kp-0", /* VK_NUMPAD0 0x60 */
+ "kp-1", /* VK_NUMPAD1 0x61 */
+ "kp-2", /* VK_NUMPAD2 0x62 */
+ "kp-3", /* VK_NUMPAD3 0x63 */
+ "kp-4", /* VK_NUMPAD4 0x64 */
+ "kp-5", /* VK_NUMPAD5 0x65 */
+ "kp-6", /* VK_NUMPAD6 0x66 */
+ "kp-7", /* VK_NUMPAD7 0x67 */
+ "kp-8", /* VK_NUMPAD8 0x68 */
+ "kp-9", /* VK_NUMPAD9 0x69 */
+ "kp-multiply", /* VK_MULTIPLY 0x6A */
+ "kp-add", /* VK_ADD 0x6B */
+ "kp-separator", /* VK_SEPARATOR 0x6C */
+ "kp-subtract", /* VK_SUBTRACT 0x6D */
+ "kp-decimal", /* VK_DECIMAL 0x6E */
+ "kp-divide", /* VK_DIVIDE 0x6F */
+ "f1", /* VK_F1 0x70 */
+ "f2", /* VK_F2 0x71 */
+ "f3", /* VK_F3 0x72 */
+ "f4", /* VK_F4 0x73 */
+ "f5", /* VK_F5 0x74 */
+ "f6", /* VK_F6 0x75 */
+ "f7", /* VK_F7 0x76 */
+ "f8", /* VK_F8 0x77 */
+ "f9", /* VK_F9 0x78 */
+ "f10", /* VK_F10 0x79 */
+ "f11", /* VK_F11 0x7A */
+ "f12", /* VK_F12 0x7B */
+ "f13", /* VK_F13 0x7C */
+ "f14", /* VK_F14 0x7D */
+ "f15", /* VK_F15 0x7E */
+ "f16", /* VK_F16 0x7F */
+ "f17", /* VK_F17 0x80 */
+ "f18", /* VK_F18 0x81 */
+ "f19", /* VK_F19 0x82 */
+ "f20", /* VK_F20 0x83 */
+ "f21", /* VK_F21 0x84 */
+ "f22", /* VK_F22 0x85 */
+ "f23", /* VK_F23 0x86 */
+ "f24", /* VK_F24 0x87 */
+
+ 0, 0, 0, 0, /* 0x88 .. 0x8B */
+ 0, 0, 0, 0, /* 0x8C .. 0x8F */
+
+ "kp-numlock", /* VK_NUMLOCK 0x90 */
+ "scroll", /* VK_SCROLL 0x91 */
+ /* Not sure where the following block comes from.
+ Windows headers have NEC and Fujitsu specific keys in
+ this block, but nothing generic. */
+ "kp-space", /* VK_NUMPAD_CLEAR 0x92 */
+ "kp-enter", /* VK_NUMPAD_ENTER 0x93 */
+ "kp-prior", /* VK_NUMPAD_PRIOR 0x94 */
+ "kp-next", /* VK_NUMPAD_NEXT 0x95 */
+ "kp-end", /* VK_NUMPAD_END 0x96 */
+ "kp-home", /* VK_NUMPAD_HOME 0x97 */
+ "kp-left", /* VK_NUMPAD_LEFT 0x98 */
+ "kp-up", /* VK_NUMPAD_UP 0x99 */
+ "kp-right", /* VK_NUMPAD_RIGHT 0x9A */
+ "kp-down", /* VK_NUMPAD_DOWN 0x9B */
+ "kp-insert", /* VK_NUMPAD_INSERT 0x9C */
+ "kp-delete", /* VK_NUMPAD_DELETE 0x9D */
+
+ 0, 0, /* 0x9E .. 0x9F */
+
+ /*
+ * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
+ * Used only as parameters to GetAsyncKeyState and GetKeyState.
+ * No other API or message will distinguish left and right keys this way.
+ * 0xA0 .. 0xA5
+ */
+ 0, 0, 0, 0, 0, 0,
+
+ /* Multimedia keys. These are handled as WM_APPCOMMAND, which allows us
+ to enable them selectively, and gives access to a few more functions.
+ See lispy_multimedia_keys below. */
+ 0, 0, 0, 0, 0, 0, 0, /* 0xA6 .. 0xAC Browser */
+ 0, 0, 0, /* 0xAD .. 0xAF Volume */
+ 0, 0, 0, 0, /* 0xB0 .. 0xB3 Media */
+ 0, 0, 0, 0, /* 0xB4 .. 0xB7 Apps */
+
+ /* 0xB8 .. 0xC0 "OEM" keys - all seem to be punctuation. */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ /* 0xC1 - 0xDA unallocated, 0xDB-0xDF more OEM keys */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+ 0, /* 0xE0 */
+ "ax", /* VK_OEM_AX 0xE1 */
+ 0, /* VK_OEM_102 0xE2 */
+ "ico-help", /* VK_ICO_HELP 0xE3 */
+ "ico-00", /* VK_ICO_00 0xE4 */
+ 0, /* VK_PROCESSKEY 0xE5 - used by IME */
+ "ico-clear", /* VK_ICO_CLEAR 0xE6 */
+ 0, /* VK_PACKET 0xE7 - used to pass Unicode chars */
+ 0, /* 0xE8 */
+ "reset", /* VK_OEM_RESET 0xE9 */
+ "jump", /* VK_OEM_JUMP 0xEA */
+ "oem-pa1", /* VK_OEM_PA1 0xEB */
+ "oem-pa2", /* VK_OEM_PA2 0xEC */
+ "oem-pa3", /* VK_OEM_PA3 0xED */
+ "wsctrl", /* VK_OEM_WSCTRL 0xEE */
+ "cusel", /* VK_OEM_CUSEL 0xEF */
+ "oem-attn", /* VK_OEM_ATTN 0xF0 */
+ "finish", /* VK_OEM_FINISH 0xF1 */
+ "copy", /* VK_OEM_COPY 0xF2 */
+ "auto", /* VK_OEM_AUTO 0xF3 */
+ "enlw", /* VK_OEM_ENLW 0xF4 */
+ "backtab", /* VK_OEM_BACKTAB 0xF5 */
+ "attn", /* VK_ATTN 0xF6 */
+ "crsel", /* VK_CRSEL 0xF7 */
+ "exsel", /* VK_EXSEL 0xF8 */
+ "ereof", /* VK_EREOF 0xF9 */
+ "play", /* VK_PLAY 0xFA */
+ "zoom", /* VK_ZOOM 0xFB */
+ "noname", /* VK_NONAME 0xFC */
+ "pa1", /* VK_PA1 0xFD */
+ "oem_clear", /* VK_OEM_CLEAR 0xFE */
+ 0 /* 0xFF */
+ };
+
+/* Some of these duplicate the "Media keys" on newer keyboards,
+ but they are delivered to the application in a different way. */
+static const char *const lispy_multimedia_keys[] =
+ {
+ 0,
+ "browser-back",
+ "browser-forward",
+ "browser-refresh",
+ "browser-stop",
+ "browser-search",
+ "browser-favorites",
+ "browser-home",
+ "volume-mute",
+ "volume-down",
+ "volume-up",
+ "media-next",
+ "media-previous",
+ "media-stop",
+ "media-play-pause",
+ "mail",
+ "media-select",
+ "app-1",
+ "app-2",
+ "bass-down",
+ "bass-boost",
+ "bass-up",
+ "treble-down",
+ "treble-up",
+ "mic-volume-mute",
+ "mic-volume-down",
+ "mic-volume-up",
+ "help",
+ "find",
+ "new",
+ "open",
+ "close",
+ "save",
+ "print",
+ "undo",
+ "redo",
+ "copy",
+ "cut",
+ "paste",
+ "mail-reply",
+ "mail-forward",
+ "mail-send",
+ "spell-check",
+ "toggle-dictate-command",
+ "mic-toggle",
+ "correction-list",
+ "media-play",
+ "media-pause",
+ "media-record",
+ "media-fast-forward",
+ "media-rewind",
+ "media-channel-up",
+ "media-channel-down"
+ };
+
+#else /* not HAVE_NTGUI */
+
+/* This should be dealt with in XTread_socket now, and that doesn't
+ depend on the client system having the Kana syms defined. See also
+ the XK_kana_A case below. */
+#if 0
+#ifdef XK_kana_A
+static const char *const lispy_kana_keys[] =
+ {
+ /* X Keysym value */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x400 .. 0x40f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x410 .. 0x41f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x420 .. 0x42f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x430 .. 0x43f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x440 .. 0x44f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x450 .. 0x45f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x460 .. 0x46f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,"overline",0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x480 .. 0x48f */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x490 .. 0x49f */
+ 0, "kana-fullstop", "kana-openingbracket", "kana-closingbracket",
+ "kana-comma", "kana-conjunctive", "kana-WO", "kana-a",
+ "kana-i", "kana-u", "kana-e", "kana-o",
+ "kana-ya", "kana-yu", "kana-yo", "kana-tsu",
+ "prolongedsound", "kana-A", "kana-I", "kana-U",
+ "kana-E", "kana-O", "kana-KA", "kana-KI",
+ "kana-KU", "kana-KE", "kana-KO", "kana-SA",
+ "kana-SHI", "kana-SU", "kana-SE", "kana-SO",
+ "kana-TA", "kana-CHI", "kana-TSU", "kana-TE",
+ "kana-TO", "kana-NA", "kana-NI", "kana-NU",
+ "kana-NE", "kana-NO", "kana-HA", "kana-HI",
+ "kana-FU", "kana-HE", "kana-HO", "kana-MA",
+ "kana-MI", "kana-MU", "kana-ME", "kana-MO",
+ "kana-YA", "kana-YU", "kana-YO", "kana-RA",
+ "kana-RI", "kana-RU", "kana-RE", "kana-RO",
+ "kana-WA", "kana-N", "voicedsound", "semivoicedsound",
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4e0 .. 0x4ef */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x4f0 .. 0x4ff */
+ };
+#endif /* XK_kana_A */
+#endif /* 0 */
+
+#define FUNCTION_KEY_OFFSET 0xff00
+
+/* You'll notice that this table is arranged to be conveniently
+ indexed by X Windows keysym values. */
+static const char *const lispy_function_keys[] =
+ {
+ /* X Keysym value */
+
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff00...0f */
+ "backspace", "tab", "linefeed", "clear",
+ 0, "return", 0, 0,
+ 0, 0, 0, "pause", /* 0xff10...1f */
+ 0, 0, 0, 0, 0, 0, 0, "escape",
+ 0, 0, 0, 0,
+ 0, "kanji", "muhenkan", "henkan", /* 0xff20...2f */
+ "romaji", "hiragana", "katakana", "hiragana-katakana",
+ "zenkaku", "hankaku", "zenkaku-hankaku", "touroku",
+ "massyo", "kana-lock", "kana-shift", "eisu-shift",
+ "eisu-toggle", /* 0xff30...3f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xff40...4f */
+
+ "home", "left", "up", "right", /* 0xff50 */ /* IsCursorKey */
+ "down", "prior", "next", "end",
+ "begin", 0, 0, 0, 0, 0, 0, 0,
+ "select", /* 0xff60 */ /* IsMiscFunctionKey */
+ "print",
+ "execute",
+ "insert",
+ 0, /* 0xff64 */
+ "undo",
+ "redo",
+ "menu",
+ "find",
+ "cancel",
+ "help",
+ "break", /* 0xff6b */
+
+ 0, 0, 0, 0,
+ 0, 0, 0, 0, "backtab", 0, 0, 0, /* 0xff70... */
+ 0, 0, 0, 0, 0, 0, 0, "kp-numlock", /* 0xff78... */
+ "kp-space", /* 0xff80 */ /* IsKeypadKey */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ "kp-tab", /* 0xff89 */
+ 0, 0, 0,
+ "kp-enter", /* 0xff8d */
+ 0, 0, 0,
+ "kp-f1", /* 0xff91 */
+ "kp-f2",
+ "kp-f3",
+ "kp-f4",
+ "kp-home", /* 0xff95 */
+ "kp-left",
+ "kp-up",
+ "kp-right",
+ "kp-down",
+ "kp-prior", /* kp-page-up */
+ "kp-next", /* kp-page-down */
+ "kp-end",
+ "kp-begin",
+ "kp-insert",
+ "kp-delete",
+ 0, /* 0xffa0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ "kp-multiply", /* 0xffaa */
+ "kp-add",
+ "kp-separator",
+ "kp-subtract",
+ "kp-decimal",
+ "kp-divide", /* 0xffaf */
+ "kp-0", /* 0xffb0 */
+ "kp-1", "kp-2", "kp-3", "kp-4", "kp-5", "kp-6", "kp-7", "kp-8", "kp-9",
+ 0, /* 0xffba */
+ 0, 0,
+ "kp-equal", /* 0xffbd */
+ "f1", /* 0xffbe */ /* IsFunctionKey */
+ "f2",
+ "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", /* 0xffc0 */
+ "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18",
+ "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", /* 0xffd0 */
+ "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34",
+ "f35", 0, 0, 0, 0, 0, 0, 0, /* 0xffe0 */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfff0 */
+ 0, 0, 0, 0, 0, 0, 0, "delete"
+ };
+
+/* ISO 9995 Function and Modifier Keys; the first byte is 0xFE. */
+#define ISO_FUNCTION_KEY_OFFSET 0xfe00
+
+static const char *const iso_lispy_function_keys[] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe08 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe10 */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0xfe18 */
+ "iso-lefttab", /* 0xfe20 */
+ "iso-move-line-up", "iso-move-line-down",
+ "iso-partial-line-up", "iso-partial-line-down",
+ "iso-partial-space-left", "iso-partial-space-right",
+ "iso-set-margin-left", "iso-set-margin-right", /* 0xffe27, 28 */
+ "iso-release-margin-left", "iso-release-margin-right",
+ "iso-release-both-margins",
+ "iso-fast-cursor-left", "iso-fast-cursor-right",
+ "iso-fast-cursor-up", "iso-fast-cursor-down",
+ "iso-continuous-underline", "iso-discontinuous-underline", /* 0xfe30, 31 */
+ "iso-emphasize", "iso-center-object", "iso-enter", /* ... 0xfe34 */
+ };
+
+#endif /* not HAVE_NTGUI */
+
+static Lisp_Object Vlispy_mouse_stem;
+
+static const char *const lispy_wheel_names[] =
+{
+ "wheel-up", "wheel-down", "wheel-left", "wheel-right"
+};
+
+/* drag-n-drop events are generated when a set of selected files are
+ dragged from another application and dropped onto an Emacs window. */
+static const char *const lispy_drag_n_drop_names[] =
+{
+ "drag-n-drop"
+};
+
+/* An array of symbol indexes of scroll bar parts, indexed by an enum
+ scroll_bar_part value. Note that Qnil corresponds to
+ scroll_bar_nowhere and should not appear in Lisp events. */
+static short const scroll_bar_parts[] = {
+ SYMBOL_INDEX (Qnil), SYMBOL_INDEX (Qabove_handle), SYMBOL_INDEX (Qhandle),
+ SYMBOL_INDEX (Qbelow_handle), SYMBOL_INDEX (Qup), SYMBOL_INDEX (Qdown),
+ SYMBOL_INDEX (Qtop), SYMBOL_INDEX (Qbottom), SYMBOL_INDEX (Qend_scroll),
+ SYMBOL_INDEX (Qratio), SYMBOL_INDEX (Qbefore_handle),
+ SYMBOL_INDEX (Qhorizontal_handle), SYMBOL_INDEX (Qafter_handle),
+ SYMBOL_INDEX (Qleft), SYMBOL_INDEX (Qright), SYMBOL_INDEX (Qleftmost),
+ SYMBOL_INDEX (Qrightmost), SYMBOL_INDEX (Qend_scroll), SYMBOL_INDEX (Qratio)
+};
+
+/* A vector, indexed by button number, giving the down-going location
+ of currently depressed buttons, both scroll bar and non-scroll bar.
+
+ The elements have the form
+ (BUTTON-NUMBER MODIFIER-MASK . REST)
+ where REST is the cdr of a position as it would be reported in the event.
+
+ The make_lispy_event function stores positions here to tell the
+ difference between click and drag events, and to store the starting
+ location to be included in drag events. */
+
+static Lisp_Object button_down_location;
+
+/* Information about the most recent up-going button event: Which
+ button, what location, and what time. */
+
+static int last_mouse_button;
+static int last_mouse_x;
+static int last_mouse_y;
+static Time button_down_time;
+
+/* The number of clicks in this multiple-click. */
+
+static int double_click_count;
+
+/* X and Y are frame-relative coordinates for a click or wheel event.
+ Return a Lisp-style event list. */
+
+static Lisp_Object
+make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
+ Time t)
+{
+ enum window_part part;
+ Lisp_Object posn = Qnil;
+ Lisp_Object extra_info = Qnil;
+ /* Coordinate pixel positions to return. */
+ int xret = 0, yret = 0;
+ /* The window under frame pixel coordinates (x,y) */
+ Lisp_Object window = f
+ ? window_from_coordinates (f, XINT (x), XINT (y), &part, 0)
+ : Qnil;
+
+ if (WINDOWP (window))
+ {
+ /* It's a click in window WINDOW at frame coordinates (X,Y) */
+ struct window *w = XWINDOW (window);
+ Lisp_Object string_info = Qnil;
+ ptrdiff_t textpos = 0;
+ int col = -1, row = -1;
+ int dx = -1, dy = -1;
+ int width = -1, height = -1;
+ Lisp_Object object = Qnil;
+
+ /* Pixel coordinates relative to the window corner. */
+ int wx = XINT (x) - WINDOW_LEFT_EDGE_X (w);
+ int wy = XINT (y) - WINDOW_TOP_EDGE_Y (w);
+
+ /* For text area clicks, return X, Y relative to the corner of
+ this text area. Note that dX, dY etc are set below, by
+ buffer_posn_from_coords. */
+ if (part == ON_TEXT)
+ {
+ xret = XINT (x) - window_box_left (w, TEXT_AREA);
+ yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+ }
+ /* For mode line and header line clicks, return X, Y relative to
+ the left window edge. Use mode_line_string to look for a
+ string on the click position. */
+ else if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
+ {
+ Lisp_Object string;
+ ptrdiff_t charpos;
+
+ posn = (part == ON_MODE_LINE) ? Qmode_line : Qheader_line;
+ /* Note that mode_line_string takes COL, ROW as pixels and
+ converts them to characters. */
+ col = wx;
+ row = wy;
+ string = mode_line_string (w, part, &col, &row, &charpos,
+ &object, &dx, &dy, &width, &height);
+ if (STRINGP (string))
+ string_info = Fcons (string, make_number (charpos));
+ textpos = -1;
+
+ xret = wx;
+ yret = wy;
+ }
+ /* For fringes and margins, Y is relative to the area's (and the
+ window's) top edge, while X is meaningless. */
+ else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
+ {
+ Lisp_Object string;
+ ptrdiff_t charpos;
+
+ posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
+ col = wx;
+ row = wy;
+ string = marginal_area_string (w, part, &col, &row, &charpos,
+ &object, &dx, &dy, &width, &height);
+ if (STRINGP (string))
+ string_info = Fcons (string, make_number (charpos));
+ xret = wx;
+ yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+ }
+ else if (part == ON_LEFT_FRINGE)
+ {
+ posn = Qleft_fringe;
+ col = 0;
+ xret = wx;
+ dx = wx
+ - (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
+ ? 0 : window_box_width (w, LEFT_MARGIN_AREA));
+ dy = yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+ }
+ else if (part == ON_RIGHT_FRINGE)
+ {
+ posn = Qright_fringe;
+ col = 0;
+ xret = wx;
+ dx = wx
+ - window_box_width (w, LEFT_MARGIN_AREA)
+ - window_box_width (w, TEXT_AREA)
+ - (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
+ ? window_box_width (w, RIGHT_MARGIN_AREA)
+ : 0);
+ dy = yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+ }
+ else if (part == ON_VERTICAL_BORDER)
+ {
+ posn = Qvertical_line;
+ width = 1;
+ dx = 0;
+ xret = wx;
+ dy = yret = wy;
+ }
+ else if (part == ON_VERTICAL_SCROLL_BAR)
+ {
+ posn = Qvertical_scroll_bar;
+ width = WINDOW_SCROLL_BAR_AREA_WIDTH (w);
+ dx = xret = wx;
+ dy = yret = wy;
+ }
+ else if (part == ON_HORIZONTAL_SCROLL_BAR)
+ {
+ posn = Qhorizontal_scroll_bar;
+ width = WINDOW_SCROLL_BAR_AREA_HEIGHT (w);
+ dx = xret = wx;
+ dy = yret = wy;
+ }
+ else if (part == ON_RIGHT_DIVIDER)
+ {
+ posn = Qright_divider;
+ width = WINDOW_RIGHT_DIVIDER_WIDTH (w);
+ dx = xret = wx;
+ dy = yret = wy;
+ }
+ else if (part == ON_BOTTOM_DIVIDER)
+ {
+ posn = Qbottom_divider;
+ width = WINDOW_BOTTOM_DIVIDER_WIDTH (w);
+ dx = xret = wx;
+ dy = yret = wy;
+ }
+
+ /* For clicks in the text area, fringes, margins, or vertical
+ scroll bar, call buffer_posn_from_coords to extract TEXTPOS,
+ the buffer position nearest to the click. */
+ if (!textpos)
+ {
+ Lisp_Object string2, object2 = Qnil;
+ struct display_pos p;
+ int dx2, dy2;
+ int width2, height2;
+ /* The pixel X coordinate passed to buffer_posn_from_coords
+ is the X coordinate relative to the text area for clicks
+ in text-area, right-margin/fringe and right-side vertical
+ scroll bar, zero otherwise. */
+ int x2
+ = (part == ON_TEXT) ? xret
+ : (part == ON_RIGHT_FRINGE || part == ON_RIGHT_MARGIN
+ || (part == ON_VERTICAL_SCROLL_BAR
+ && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)))
+ ? (XINT (x) - window_box_left (w, TEXT_AREA))
+ : 0;
+ int y2 = wy;
+
+ string2 = buffer_posn_from_coords (w, &x2, &y2, &p,
+ &object2, &dx2, &dy2,
+ &width2, &height2);
+ textpos = CHARPOS (p.pos);
+ if (col < 0) col = x2;
+ if (row < 0) row = y2;
+ if (dx < 0) dx = dx2;
+ if (dy < 0) dy = dy2;
+ if (width < 0) width = width2;
+ if (height < 0) height = height2;
+
+ if (NILP (posn))
+ {
+ posn = make_number (textpos);
+ if (STRINGP (string2))
+ string_info = Fcons (string2,
+ make_number (CHARPOS (p.string_pos)));
+ }
+ if (NILP (object))
+ object = object2;
+ }
+
+#ifdef HAVE_WINDOW_SYSTEM
+ if (IMAGEP (object))
+ {
+ Lisp_Object image_map, hotspot;
+ if ((image_map = Fplist_get (XCDR (object), QCmap),
+ !NILP (image_map))
+ && (hotspot = find_hot_spot (image_map, dx, dy),
+ CONSP (hotspot))
+ && (hotspot = XCDR (hotspot), CONSP (hotspot)))
+ posn = XCAR (hotspot);
+ }
+#endif
+
+ /* Object info. */
+ extra_info
+ = list3 (object,
+ Fcons (make_number (dx), make_number (dy)),
+ Fcons (make_number (width), make_number (height)));
+
+ /* String info. */
+ extra_info = Fcons (string_info,
+ Fcons (textpos < 0 ? Qnil : make_number (textpos),
+ Fcons (Fcons (make_number (col),
+ make_number (row)),
+ extra_info)));
+ }
+ else if (f != 0)
+ {
+ /* Return mouse pixel coordinates here. */
+ XSETFRAME (window, f);
+ xret = XINT (x);
+ yret = XINT (y);
+ }
+ else
+ window = Qnil;
+
+ return Fcons (window,
+ Fcons (posn,
+ Fcons (Fcons (make_number (xret),
+ make_number (yret)),
+ Fcons (make_number (t),
+ extra_info))));
+}
+
+/* Return non-zero if F is a GUI frame that uses some toolkit-managed
+ menu bar. This really means that Emacs draws and manages the menu
+ bar as part of its normal display, and therefore can compute its
+ geometry. */
+static bool
+toolkit_menubar_in_use (struct frame *f)
+{
+#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) || defined (HAVE_NTGUI)
+ return !(!FRAME_WINDOW_P (f));
+#else
+ return false;
+#endif
+}
+
+/* Build the part of Lisp event which represents scroll bar state from
+ EV. TYPE is one of Qvertical_scroll_bar or Qhorizontal_scroll_bar. */
+
+static Lisp_Object
+make_scroll_bar_position (struct input_event *ev, Lisp_Object type)
+{
+ return list5 (ev->frame_or_window, type, Fcons (ev->x, ev->y),
+ make_number (ev->timestamp),
+ builtin_lisp_symbol (scroll_bar_parts[ev->part]));
+}
+
+/* Given a struct input_event, build the lisp event which represents
+ it. If EVENT is 0, build a mouse movement event from the mouse
+ movement buffer, which should have a movement event in it.
+
+ Note that events must be passed to this function in the order they
+ are received; this function stores the location of button presses
+ in order to build drag events when the button is released. */
+
+static Lisp_Object
+make_lispy_event (struct input_event *event)
+{
+ int i;
+
+ switch (event->kind)
+ {
+ /* A simple keystroke. */
+ case ASCII_KEYSTROKE_EVENT:
+ case MULTIBYTE_CHAR_KEYSTROKE_EVENT:
+ {
+ Lisp_Object lispy_c;
+ EMACS_INT c = event->code;
+ if (event->kind == ASCII_KEYSTROKE_EVENT)
+ {
+ c &= 0377;
+ eassert (c == event->code);
+ /* Turn ASCII characters into control characters
+ when proper. */
+ if (event->modifiers & ctrl_modifier)
+ {
+ c = make_ctrl_char (c);
+ event->modifiers &= ~ctrl_modifier;
+ }
+ }
+
+ /* Add in the other modifier bits. The shift key was taken care
+ of by the X code. */
+ c |= (event->modifiers
+ & (meta_modifier | alt_modifier
+ | hyper_modifier | super_modifier | ctrl_modifier));
+ /* Distinguish Shift-SPC from SPC. */
+ if ((event->code) == 040
+ && event->modifiers & shift_modifier)
+ c |= shift_modifier;
+ button_down_time = 0;
+ XSETFASTINT (lispy_c, c);
+ return lispy_c;
+ }
+
+#ifdef HAVE_NS
+ /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs,
+ except that they are non-key events (last-nonmenu-event is nil). */
+ case NS_NONKEY_EVENT:
+#endif
+
+ /* A function key. The symbol may need to have modifier prefixes
+ tacked onto it. */
+ case NON_ASCII_KEYSTROKE_EVENT:
+ button_down_time = 0;
+
+ for (i = 0; i < ARRAYELTS (lispy_accent_codes); i++)
+ if (event->code == lispy_accent_codes[i])
+ return modify_event_symbol (i,
+ event->modifiers,
+ Qfunction_key, Qnil,
+ lispy_accent_keys, &accent_key_syms,
+ ARRAYELTS (lispy_accent_keys));
+
+#if 0
+#ifdef XK_kana_A
+ if (event->code >= 0x400 && event->code < 0x500)
+ return modify_event_symbol (event->code - 0x400,
+ event->modifiers & ~shift_modifier,
+ Qfunction_key, Qnil,
+ lispy_kana_keys, &func_key_syms,
+ ARRAYELTS (lispy_kana_keys));
+#endif /* XK_kana_A */
+#endif /* 0 */
+
+#ifdef ISO_FUNCTION_KEY_OFFSET
+ if (event->code < FUNCTION_KEY_OFFSET
+ && event->code >= ISO_FUNCTION_KEY_OFFSET)
+ return modify_event_symbol (event->code - ISO_FUNCTION_KEY_OFFSET,
+ event->modifiers,
+ Qfunction_key, Qnil,
+ iso_lispy_function_keys, &func_key_syms,
+ ARRAYELTS (iso_lispy_function_keys));
+#endif
+
+ if ((FUNCTION_KEY_OFFSET <= event->code
+ && (event->code
+ < FUNCTION_KEY_OFFSET + ARRAYELTS (lispy_function_keys)))
+ && lispy_function_keys[event->code - FUNCTION_KEY_OFFSET])
+ return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
+ event->modifiers,
+ Qfunction_key, Qnil,
+ lispy_function_keys, &func_key_syms,
+ ARRAYELTS (lispy_function_keys));
+
+ /* Handle system-specific or unknown keysyms.
+ We need to use an alist rather than a vector as the cache
+ since we can't make a vector long enough. */
+ if (NILP (KVAR (current_kboard, system_key_syms)))
+ kset_system_key_syms (current_kboard, Fcons (Qnil, Qnil));
+ return modify_event_symbol (event->code,
+ event->modifiers,
+ Qfunction_key,
+ KVAR (current_kboard, Vsystem_key_alist),
+ 0, &KVAR (current_kboard, system_key_syms),
+ PTRDIFF_MAX);
+
+#ifdef HAVE_NTGUI
+ case MULTIMEDIA_KEY_EVENT:
+ if (event->code < ARRAYELTS (lispy_multimedia_keys)
+ && event->code > 0 && lispy_multimedia_keys[event->code])
+ {
+ return modify_event_symbol (event->code, event->modifiers,
+ Qfunction_key, Qnil,
+ lispy_multimedia_keys, &func_key_syms,
+ ARRAYELTS (lispy_multimedia_keys));
+ }
+ return Qnil;
+#endif
+
+ /* A mouse click. Figure out where it is, decide whether it's
+ a press, click or drag, and build the appropriate structure. */
+ case MOUSE_CLICK_EVENT:
+#ifdef HAVE_GPM
+ case GPM_CLICK_EVENT:
+#endif
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ case SCROLL_BAR_CLICK_EVENT:
+ case HORIZONTAL_SCROLL_BAR_CLICK_EVENT:
+#endif
+ {
+ int button = event->code;
+ bool is_double;
+ Lisp_Object position;
+ Lisp_Object *start_pos_ptr;
+ Lisp_Object start_pos;
+
+ position = Qnil;
+
+ /* Build the position as appropriate for this mouse click. */
+ if (event->kind == MOUSE_CLICK_EVENT
+#ifdef HAVE_GPM
+ || event->kind == GPM_CLICK_EVENT
+#endif
+ )
+ {
+ struct frame *f = XFRAME (event->frame_or_window);
+ int row, column;
+
+ /* Ignore mouse events that were made on frame that
+ have been deleted. */
+ if (! FRAME_LIVE_P (f))
+ return Qnil;
+
+ /* EVENT->x and EVENT->y are frame-relative pixel
+ coordinates at this place. Under old redisplay, COLUMN
+ and ROW are set to frame relative glyph coordinates
+ which are then used to determine whether this click is
+ in a menu (non-toolkit version). */
+ if (!toolkit_menubar_in_use (f))
+ {
+ pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
+ &column, &row, NULL, 1);
+
+ /* In the non-toolkit version, clicks on the menu bar
+ are ordinary button events in the event buffer.
+ Distinguish them, and invoke the menu.
+
+ (In the toolkit version, the toolkit handles the
+ menu bar and Emacs doesn't know about it until
+ after the user makes a selection.) */
+ if (row >= 0 && row < FRAME_MENU_BAR_LINES (f)
+ && (event->modifiers & down_modifier))
+ {
+ Lisp_Object items, item;
+
+ /* Find the menu bar item under `column'. */
+ item = Qnil;
+ items = FRAME_MENU_BAR_ITEMS (f);
+ for (i = 0; i < ASIZE (items); i += 4)
+ {
+ Lisp_Object pos, string;
+ string = AREF (items, i + 1);
+ pos = AREF (items, i + 3);
+ if (NILP (string))
+ break;
+ if (column >= XINT (pos)
+ && column < XINT (pos) + SCHARS (string))
+ {
+ item = AREF (items, i);
+ break;
+ }
+ }
+
+ /* ELisp manual 2.4b says (x y) are window
+ relative but code says they are
+ frame-relative. */
+ position = list4 (event->frame_or_window,
+ Qmenu_bar,
+ Fcons (event->x, event->y),
+ make_number (event->timestamp));
+
+ return list2 (item, position);
+ }
+ }
+
+ position = make_lispy_position (f, event->x, event->y,
+ event->timestamp);
+ }
+#ifndef USE_TOOLKIT_SCROLL_BARS
+ else
+ /* It's a scrollbar click. */
+ position = make_scroll_bar_position (event, Qvertical_scroll_bar);
+#endif /* not USE_TOOLKIT_SCROLL_BARS */
+
+ if (button >= ASIZE (button_down_location))
+ {
+ ptrdiff_t incr = button - ASIZE (button_down_location) + 1;
+ button_down_location = larger_vector (button_down_location,
+ incr, -1);
+ mouse_syms = larger_vector (mouse_syms, incr, -1);
+ }
+
+ start_pos_ptr = aref_addr (button_down_location, button);
+ start_pos = *start_pos_ptr;
+ *start_pos_ptr = Qnil;
+
+ {
+ /* On window-system frames, use the value of
+ double-click-fuzz as is. On other frames, interpret it
+ as a multiple of 1/8 characters. */
+ struct frame *f;
+ int fuzz;
+
+ if (WINDOWP (event->frame_or_window))
+ f = XFRAME (XWINDOW (event->frame_or_window)->frame);
+ else if (FRAMEP (event->frame_or_window))
+ f = XFRAME (event->frame_or_window);
+ else
+ emacs_abort ();
+
+ if (FRAME_WINDOW_P (f))
+ fuzz = double_click_fuzz;
+ else
+ fuzz = double_click_fuzz / 8;
+
+ is_double = (button == last_mouse_button
+ && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
+ && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
+ && button_down_time != 0
+ && (EQ (Vdouble_click_time, Qt)
+ || (NATNUMP (Vdouble_click_time)
+ && (event->timestamp - button_down_time
+ < XFASTINT (Vdouble_click_time)))));
+ }
+
+ last_mouse_button = button;
+ last_mouse_x = XINT (event->x);
+ last_mouse_y = XINT (event->y);
+
+ /* If this is a button press, squirrel away the location, so
+ we can decide later whether it was a click or a drag. */
+ if (event->modifiers & down_modifier)
+ {
+ if (is_double)
+ {
+ double_click_count++;
+ event->modifiers |= ((double_click_count > 2)
+ ? triple_modifier
+ : double_modifier);
+ }
+ else
+ double_click_count = 1;
+ button_down_time = event->timestamp;
+ *start_pos_ptr = Fcopy_alist (position);
+ ignore_mouse_drag_p = 0;
+ }
+
+ /* Now we're releasing a button - check the co-ordinates to
+ see if this was a click or a drag. */
+ else if (event->modifiers & up_modifier)
+ {
+ /* If we did not see a down before this up, ignore the up.
+ Probably this happened because the down event chose a
+ menu item. It would be an annoyance to treat the
+ release of the button that chose the menu item as a
+ separate event. */
+
+ if (!CONSP (start_pos))
+ return Qnil;
+
+ event->modifiers &= ~up_modifier;
+
+ {
+ Lisp_Object new_down, down;
+ EMACS_INT xdiff = double_click_fuzz, ydiff = double_click_fuzz;
+
+ /* The third element of every position
+ should be the (x,y) pair. */
+ down = Fcar (Fcdr (Fcdr (start_pos)));
+ new_down = Fcar (Fcdr (Fcdr (position)));
+
+ if (CONSP (down)
+ && INTEGERP (XCAR (down)) && INTEGERP (XCDR (down)))
+ {
+ xdiff = XINT (XCAR (new_down)) - XINT (XCAR (down));
+ ydiff = XINT (XCDR (new_down)) - XINT (XCDR (down));
+ }
+
+ if (ignore_mouse_drag_p)
+ {
+ event->modifiers |= click_modifier;
+ ignore_mouse_drag_p = 0;
+ }
+ else if (xdiff < double_click_fuzz && xdiff > - double_click_fuzz
+ && ydiff < double_click_fuzz && ydiff > - double_click_fuzz
+ /* Maybe the mouse has moved a lot, caused scrolling, and
+ eventually ended up at the same screen position (but
+ not buffer position) in which case it is a drag, not
+ a click. */
+ /* FIXME: OTOH if the buffer position has changed
+ because of a timer or process filter rather than
+ because of mouse movement, it should be considered as
+ a click. But mouse-drag-region completely ignores
+ this case and it hasn't caused any real problem, so
+ it's probably OK to ignore it as well. */
+ && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position))))
+ /* Mouse hasn't moved (much). */
+ event->modifiers |= click_modifier;
+ else
+ {
+ button_down_time = 0;
+ event->modifiers |= drag_modifier;
+ }
+
+ /* Don't check is_double; treat this as multiple
+ if the down-event was multiple. */
+ if (double_click_count > 1)
+ event->modifiers |= ((double_click_count > 2)
+ ? triple_modifier
+ : double_modifier);
+ }
+ }
+ else
+ /* Every mouse event should either have the down_modifier or
+ the up_modifier set. */
+ emacs_abort ();
+
+ {
+ /* Get the symbol we should use for the mouse click. */
+ Lisp_Object head;
+
+ head = modify_event_symbol (button,
+ event->modifiers,
+ Qmouse_click, Vlispy_mouse_stem,
+ NULL,
+ &mouse_syms,
+ ASIZE (mouse_syms));
+ if (event->modifiers & drag_modifier)
+ return list3 (head, start_pos, position);
+ else if (event->modifiers & (double_modifier | triple_modifier))
+ return list3 (head, position, make_number (double_click_count));
+ else
+ return list2 (head, position);
+ }
+ }
+
+ case WHEEL_EVENT:
+ case HORIZ_WHEEL_EVENT:
+ {
+ Lisp_Object position;
+ Lisp_Object head;
+
+ /* Build the position as appropriate for this mouse click. */
+ struct frame *f = XFRAME (event->frame_or_window);
+
+ /* Ignore wheel events that were made on frame that have been
+ deleted. */
+ if (! FRAME_LIVE_P (f))
+ return Qnil;
+
+ position = make_lispy_position (f, event->x, event->y,
+ event->timestamp);
+
+ /* Set double or triple modifiers to indicate the wheel speed. */
+ {
+ /* On window-system frames, use the value of
+ double-click-fuzz as is. On other frames, interpret it
+ as a multiple of 1/8 characters. */
+ struct frame *fr;
+ int fuzz;
+ int symbol_num;
+ bool is_double;
+
+ if (WINDOWP (event->frame_or_window))
+ fr = XFRAME (XWINDOW (event->frame_or_window)->frame);
+ else if (FRAMEP (event->frame_or_window))
+ fr = XFRAME (event->frame_or_window);
+ else
+ emacs_abort ();
+
+ fuzz = FRAME_WINDOW_P (fr)
+ ? double_click_fuzz : double_click_fuzz / 8;
+
+ if (event->modifiers & up_modifier)
+ {
+ /* Emit a wheel-up event. */
+ event->modifiers &= ~up_modifier;
+ symbol_num = 0;
+ }
+ else if (event->modifiers & down_modifier)
+ {
+ /* Emit a wheel-down event. */
+ event->modifiers &= ~down_modifier;
+ symbol_num = 1;
+ }
+ else
+ /* Every wheel event should either have the down_modifier or
+ the up_modifier set. */
+ emacs_abort ();
+
+ if (event->kind == HORIZ_WHEEL_EVENT)
+ symbol_num += 2;
+
+ is_double = (last_mouse_button == - (1 + symbol_num)
+ && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
+ && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
+ && button_down_time != 0
+ && (EQ (Vdouble_click_time, Qt)
+ || (NATNUMP (Vdouble_click_time)
+ && (event->timestamp - button_down_time
+ < XFASTINT (Vdouble_click_time)))));
+ if (is_double)
+ {
+ double_click_count++;
+ event->modifiers |= ((double_click_count > 2)
+ ? triple_modifier
+ : double_modifier);
+ }
+ else
+ {
+ double_click_count = 1;
+ event->modifiers |= click_modifier;
+ }
+
+ button_down_time = event->timestamp;
+ /* Use a negative value to distinguish wheel from mouse button. */
+ last_mouse_button = - (1 + symbol_num);
+ last_mouse_x = XINT (event->x);
+ last_mouse_y = XINT (event->y);
+
+ /* Get the symbol we should use for the wheel event. */
+ head = modify_event_symbol (symbol_num,
+ event->modifiers,
+ Qmouse_click,
+ Qnil,
+ lispy_wheel_names,
+ &wheel_syms,
+ ASIZE (wheel_syms));
+ }
+
+ if (event->modifiers & (double_modifier | triple_modifier))
+ return list3 (head, position, make_number (double_click_count));
+ else
+ return list2 (head, position);
+ }
+
+
+#ifdef USE_TOOLKIT_SCROLL_BARS
+
+ /* We don't have down and up events if using toolkit scroll bars,
+ so make this always a click event. Store in the `part' of
+ the Lisp event a symbol which maps to the following actions:
+
+ `above_handle' page up
+ `below_handle' page down
+ `up' line up
+ `down' line down
+ `top' top of buffer
+ `bottom' bottom of buffer
+ `handle' thumb has been dragged.
+ `end-scroll' end of interaction with scroll bar
+
+ The incoming input_event contains in its `part' member an
+ index of type `enum scroll_bar_part' which we can use as an
+ index in scroll_bar_parts to get the appropriate symbol. */
+
+ case SCROLL_BAR_CLICK_EVENT:
+ {
+ Lisp_Object position, head;
+
+ position = make_scroll_bar_position (event, Qvertical_scroll_bar);
+
+ /* Always treat scroll bar events as clicks. */
+ event->modifiers |= click_modifier;
+ event->modifiers &= ~up_modifier;
+
+ if (event->code >= ASIZE (mouse_syms))
+ mouse_syms = larger_vector (mouse_syms,
+ event->code - ASIZE (mouse_syms) + 1,
+ -1);
+
+ /* Get the symbol we should use for the mouse click. */
+ head = modify_event_symbol (event->code,
+ event->modifiers,
+ Qmouse_click,
+ Vlispy_mouse_stem,
+ NULL, &mouse_syms,
+ ASIZE (mouse_syms));
+ return list2 (head, position);
+ }
+
+ case HORIZONTAL_SCROLL_BAR_CLICK_EVENT:
+ {
+ Lisp_Object position, head;
+
+ position = make_scroll_bar_position (event, Qhorizontal_scroll_bar);
+
+ /* Always treat scroll bar events as clicks. */
+ event->modifiers |= click_modifier;
+ event->modifiers &= ~up_modifier;
+
+ if (event->code >= ASIZE (mouse_syms))
+ mouse_syms = larger_vector (mouse_syms,
+ event->code - ASIZE (mouse_syms) + 1,
+ -1);
+
+ /* Get the symbol we should use for the mouse click. */
+ head = modify_event_symbol (event->code,
+ event->modifiers,
+ Qmouse_click,
+ Vlispy_mouse_stem,
+ NULL, &mouse_syms,
+ ASIZE (mouse_syms));
+ return list2 (head, position);
+ }
+
+#endif /* USE_TOOLKIT_SCROLL_BARS */
+
+ case DRAG_N_DROP_EVENT:
+ {
+ struct frame *f;
+ Lisp_Object head, position;
+ Lisp_Object files;
+
+ f = XFRAME (event->frame_or_window);
+ files = event->arg;
+
+ /* Ignore mouse events that were made on frames that
+ have been deleted. */
+ if (! FRAME_LIVE_P (f))
+ return Qnil;
+
+ position = make_lispy_position (f, event->x, event->y,
+ event->timestamp);
+
+ head = modify_event_symbol (0, event->modifiers,
+ Qdrag_n_drop, Qnil,
+ lispy_drag_n_drop_names,
+ &drag_n_drop_syms, 1);
+ return list3 (head, position, files);
+ }
+
+#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
+ || defined (HAVE_NS) || defined (USE_GTK)
+ case MENU_BAR_EVENT:
+ if (EQ (event->arg, event->frame_or_window))
+ /* This is the prefix key. We translate this to
+ `(menu_bar)' because the code in keyboard.c for menu
+ events, which we use, relies on this. */
+ return list1 (Qmenu_bar);
+ return event->arg;
+#endif
+
+ case SELECT_WINDOW_EVENT:
+ /* Make an event (select-window (WINDOW)). */
+ return list2 (Qselect_window, list1 (event->frame_or_window));
+
+ case TOOL_BAR_EVENT:
+ if (EQ (event->arg, event->frame_or_window))
+ /* This is the prefix key. We translate this to
+ `(tool_bar)' because the code in keyboard.c for tool bar
+ events, which we use, relies on this. */
+ return list1 (Qtool_bar);
+ else if (SYMBOLP (event->arg))
+ return apply_modifiers (event->modifiers, event->arg);
+ return event->arg;
+
+ case USER_SIGNAL_EVENT:
+ /* A user signal. */
+ {
+ char *name = find_user_signal_name (event->code);
+ if (!name)
+ emacs_abort ();
+ return intern (name);
+ }
+
+ case SAVE_SESSION_EVENT:
+ return Qsave_session;
+
+#ifdef HAVE_DBUS
+ case DBUS_EVENT:
+ {
+ return Fcons (Qdbus_event, event->arg);
+ }
+#endif /* HAVE_DBUS */
+
+#if defined HAVE_GFILENOTIFY || defined HAVE_INOTIFY
+ case FILE_NOTIFY_EVENT:
+ {
+ return Fcons (Qfile_notify, event->arg);
+ }
+#endif /* defined HAVE_GFILENOTIFY || defined HAVE_INOTIFY */
+
+ case CONFIG_CHANGED_EVENT:
+ return list3 (Qconfig_changed_event,
+ event->arg, event->frame_or_window);
+
+ /* The 'kind' field of the event is something we don't recognize. */
+ default:
+ emacs_abort ();
+ }
+}
+
+static Lisp_Object
+make_lispy_movement (struct frame *frame, Lisp_Object bar_window, enum scroll_bar_part part,
+ Lisp_Object x, Lisp_Object y, Time t)
+{
+ /* Is it a scroll bar movement? */
+ if (frame && ! NILP (bar_window))
+ {
+ Lisp_Object part_sym;
+
+ part_sym = builtin_lisp_symbol (scroll_bar_parts[part]);
+ return list2 (Qscroll_bar_movement,
+ list5 (bar_window,
+ Qvertical_scroll_bar,
+ Fcons (x, y),
+ make_number (t),
+ part_sym));
+ }
+ /* Or is it an ordinary mouse movement? */
+ else
+ {
+ Lisp_Object position;
+ position = make_lispy_position (frame, x, y, t);
+ return list2 (Qmouse_movement, position);
+ }
+}
+
+/* Construct a switch frame event. */
+static Lisp_Object
+make_lispy_switch_frame (Lisp_Object frame)
+{
+ return list2 (Qswitch_frame, frame);
+}
+
+static Lisp_Object
+make_lispy_focus_in (Lisp_Object frame)
+{
+ return list2 (Qfocus_in, frame);
+}
+
+#ifdef HAVE_WINDOW_SYSTEM
+
+static Lisp_Object
+make_lispy_focus_out (Lisp_Object frame)
+{
+ return list2 (Qfocus_out, frame);
+}
+
+#endif /* HAVE_WINDOW_SYSTEM */
+
+/* Manipulating modifiers. */
+
+/* Parse the name of SYMBOL, and return the set of modifiers it contains.
+
+ If MODIFIER_END is non-zero, set *MODIFIER_END to the position in
+ SYMBOL's name of the end of the modifiers; the string from this
+ position is the unmodified symbol name.
+
+ This doesn't use any caches. */
+
+static int
+parse_modifiers_uncached (Lisp_Object symbol, ptrdiff_t *modifier_end)
+{
+ Lisp_Object name;
+ ptrdiff_t i;
+ int modifiers;
+
+ CHECK_SYMBOL (symbol);
+
+ modifiers = 0;
+ name = SYMBOL_NAME (symbol);
+
+ for (i = 0; i < SBYTES (name) - 1; )
+ {
+ ptrdiff_t this_mod_end = 0;
+ int this_mod = 0;
+
+ /* See if the name continues with a modifier word.
+ Check that the word appears, but don't check what follows it.
+ Set this_mod and this_mod_end to record what we find. */
+
+ switch (SREF (name, i))
+ {
+#define SINGLE_LETTER_MOD(BIT) \
+ (this_mod_end = i + 1, this_mod = BIT)
+
+ case 'A':
+ SINGLE_LETTER_MOD (alt_modifier);
+ break;
+
+ case 'C':
+ SINGLE_LETTER_MOD (ctrl_modifier);
+ break;
+
+ case 'H':
+ SINGLE_LETTER_MOD (hyper_modifier);
+ break;
+
+ case 'M':
+ SINGLE_LETTER_MOD (meta_modifier);
+ break;
+
+ case 'S':
+ SINGLE_LETTER_MOD (shift_modifier);
+ break;
+
+ case 's':
+ SINGLE_LETTER_MOD (super_modifier);
+ break;
+
+#undef SINGLE_LETTER_MOD
+
+#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
+ if (i + LEN + 1 <= SBYTES (name) \
+ && ! memcmp (SDATA (name) + i, NAME, LEN)) \
+ { \
+ this_mod_end = i + LEN; \
+ this_mod = BIT; \
+ }
+
+ case 'd':
+ MULTI_LETTER_MOD (drag_modifier, "drag", 4);
+ MULTI_LETTER_MOD (down_modifier, "down", 4);
+ MULTI_LETTER_MOD (double_modifier, "double", 6);
+ break;
+
+ case 't':
+ MULTI_LETTER_MOD (triple_modifier, "triple", 6);
+ break;
+#undef MULTI_LETTER_MOD
+
+ }
+
+ /* If we found no modifier, stop looking for them. */
+ if (this_mod_end == 0)
+ break;
+
+ /* Check there is a dash after the modifier, so that it
+ really is a modifier. */
+ if (this_mod_end >= SBYTES (name)
+ || SREF (name, this_mod_end) != '-')
+ break;
+
+ /* This modifier is real; look for another. */
+ modifiers |= this_mod;
+ i = this_mod_end + 1;
+ }
+
+ /* Should we include the `click' modifier? */
+ if (! (modifiers & (down_modifier | drag_modifier
+ | double_modifier | triple_modifier))
+ && i + 7 == SBYTES (name)
+ && memcmp (SDATA (name) + i, "mouse-", 6) == 0
+ && ('0' <= SREF (name, i + 6) && SREF (name, i + 6) <= '9'))
+ modifiers |= click_modifier;
+
+ if (! (modifiers & (double_modifier | triple_modifier))
+ && i + 6 < SBYTES (name)
+ && memcmp (SDATA (name) + i, "wheel-", 6) == 0)
+ modifiers |= click_modifier;
+
+ if (modifier_end)
+ *modifier_end = i;
+
+ return modifiers;
+}
+
+/* Return a symbol whose name is the modifier prefixes for MODIFIERS
+ prepended to the string BASE[0..BASE_LEN-1].
+ This doesn't use any caches. */
+static Lisp_Object
+apply_modifiers_uncached (int modifiers, char *base, int base_len, int base_len_byte)
+{
+ /* Since BASE could contain nulls, we can't use intern here; we have
+ to use Fintern, which expects a genuine Lisp_String, and keeps a
+ reference to it. */
+ char new_mods[sizeof "A-C-H-M-S-s-down-drag-double-triple-"];
+ int mod_len;
+
+ {
+ char *p = new_mods;
+
+ /* Only the event queue may use the `up' modifier; it should always
+ be turned into a click or drag event before presented to lisp code. */
+ if (modifiers & up_modifier)
+ emacs_abort ();
+
+ if (modifiers & alt_modifier) { *p++ = 'A'; *p++ = '-'; }
+ if (modifiers & ctrl_modifier) { *p++ = 'C'; *p++ = '-'; }
+ if (modifiers & hyper_modifier) { *p++ = 'H'; *p++ = '-'; }
+ if (modifiers & meta_modifier) { *p++ = 'M'; *p++ = '-'; }
+ if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; }
+ if (modifiers & super_modifier) { *p++ = 's'; *p++ = '-'; }
+ if (modifiers & double_modifier) p = stpcpy (p, "double-");
+ if (modifiers & triple_modifier) p = stpcpy (p, "triple-");
+ if (modifiers & down_modifier) p = stpcpy (p, "down-");
+ if (modifiers & drag_modifier) p = stpcpy (p, "drag-");
+ /* The click modifier is denoted by the absence of other modifiers. */
+
+ *p = '\0';
+
+ mod_len = p - new_mods;
+ }
+
+ {
+ Lisp_Object new_name;
+
+ new_name = make_uninit_multibyte_string (mod_len + base_len,
+ mod_len + base_len_byte);
+ memcpy (SDATA (new_name), new_mods, mod_len);
+ memcpy (SDATA (new_name) + mod_len, base, base_len_byte);
+
+ return Fintern (new_name, Qnil);
+ }
+}
+
+
+static const char *const modifier_names[] =
+{
+ "up", "down", "drag", "click", "double", "triple", 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, "alt", "super", "hyper", "shift", "control", "meta"
+};
+#define NUM_MOD_NAMES ARRAYELTS (modifier_names)
+
+static Lisp_Object modifier_symbols;
+
+/* Return the list of modifier symbols corresponding to the mask MODIFIERS. */
+static Lisp_Object
+lispy_modifier_list (int modifiers)
+{
+ Lisp_Object modifier_list;
+ int i;
+
+ modifier_list = Qnil;
+ for (i = 0; (1<<i) <= modifiers && i < NUM_MOD_NAMES; i++)
+ if (modifiers & (1<<i))
+ modifier_list = Fcons (AREF (modifier_symbols, i),
+ modifier_list);
+
+ return modifier_list;
+}
+
+
+/* Parse the modifiers on SYMBOL, and return a list like (UNMODIFIED MASK),
+ where UNMODIFIED is the unmodified form of SYMBOL,
+ MASK is the set of modifiers present in SYMBOL's name.
+ This is similar to parse_modifiers_uncached, but uses the cache in
+ SYMBOL's Qevent_symbol_element_mask property, and maintains the
+ Qevent_symbol_elements property. */
+
+#define KEY_TO_CHAR(k) (XINT (k) & ((1 << CHARACTERBITS) - 1))
+
+Lisp_Object
+parse_modifiers (Lisp_Object symbol)
+{
+ Lisp_Object elements;
+
+ if (INTEGERP (symbol))
+ return list2i (KEY_TO_CHAR (symbol), XINT (symbol) & CHAR_MODIFIER_MASK);
+ else if (!SYMBOLP (symbol))
+ return Qnil;
+
+ elements = Fget (symbol, Qevent_symbol_element_mask);
+ if (CONSP (elements))
+ return elements;
+ else
+ {
+ ptrdiff_t end;
+ int modifiers = parse_modifiers_uncached (symbol, &end);
+ Lisp_Object unmodified;
+ Lisp_Object mask;
+
+ unmodified = Fintern (make_string (SSDATA (SYMBOL_NAME (symbol)) + end,
+ SBYTES (SYMBOL_NAME (symbol)) - end),
+ Qnil);
+
+ if (modifiers & ~INTMASK)
+ emacs_abort ();
+ XSETFASTINT (mask, modifiers);
+ elements = list2 (unmodified, mask);
+
+ /* Cache the parsing results on SYMBOL. */
+ Fput (symbol, Qevent_symbol_element_mask,
+ elements);
+ Fput (symbol, Qevent_symbol_elements,
+ Fcons (unmodified, lispy_modifier_list (modifiers)));
+
+ /* Since we know that SYMBOL is modifiers applied to unmodified,
+ it would be nice to put that in unmodified's cache.
+ But we can't, since we're not sure that parse_modifiers is
+ canonical. */
+
+ return elements;
+ }
+}
+
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,
+ Sevent_symbol_parse_modifiers, 1, 1, 0,
+ doc: /* Parse the event symbol. For internal use. */)
+ (Lisp_Object symbol)
+{
+ /* Fill the cache if needed. */
+ parse_modifiers (symbol);
+ /* Ignore the result (which is stored on Qevent_symbol_element_mask)
+ and use the Lispier representation stored on Qevent_symbol_elements
+ instead. */
+ return Fget (symbol, Qevent_symbol_elements);
+}
+
+/* Apply the modifiers MODIFIERS to the symbol BASE.
+ BASE must be unmodified.
+
+ This is like apply_modifiers_uncached, but uses BASE's
+ Qmodifier_cache property, if present. It also builds
+ Qevent_symbol_elements properties, since it has that info anyway.
+
+ apply_modifiers copies the value of BASE's Qevent_kind property to
+ the modified symbol. */
+static Lisp_Object
+apply_modifiers (int modifiers, Lisp_Object base)
+{
+ Lisp_Object cache, idx, entry, new_symbol;
+
+ /* Mask out upper bits. We don't know where this value's been. */
+ modifiers &= INTMASK;
+
+ if (INTEGERP (base))
+ return make_number (XINT (base) | modifiers);
+
+ /* The click modifier never figures into cache indices. */
+ cache = Fget (base, Qmodifier_cache);
+ XSETFASTINT (idx, (modifiers & ~click_modifier));
+ entry = assq_no_quit (idx, cache);
+
+ if (CONSP (entry))
+ new_symbol = XCDR (entry);
+ else
+ {
+ /* We have to create the symbol ourselves. */
+ new_symbol = apply_modifiers_uncached (modifiers,
+ SSDATA (SYMBOL_NAME (base)),
+ SCHARS (SYMBOL_NAME (base)),
+ SBYTES (SYMBOL_NAME (base)));
+
+ /* Add the new symbol to the base's cache. */
+ entry = Fcons (idx, new_symbol);
+ Fput (base, Qmodifier_cache, Fcons (entry, cache));
+
+ /* We have the parsing info now for free, so we could add it to
+ the caches:
+ XSETFASTINT (idx, modifiers);
+ Fput (new_symbol, Qevent_symbol_element_mask,
+ list2 (base, idx));
+ Fput (new_symbol, Qevent_symbol_elements,
+ Fcons (base, lispy_modifier_list (modifiers)));
+ Sadly, this is only correct if `base' is indeed a base event,
+ which is not necessarily the case. -stef */
+ }
+
+ /* Make sure this symbol is of the same kind as BASE.
+
+ You'd think we could just set this once and for all when we
+ intern the symbol above, but reorder_modifiers may call us when
+ BASE's property isn't set right; we can't assume that just
+ because it has a Qmodifier_cache property it must have its
+ Qevent_kind set right as well. */
+ if (NILP (Fget (new_symbol, Qevent_kind)))
+ {
+ Lisp_Object kind;
+
+ kind = Fget (base, Qevent_kind);
+ if (! NILP (kind))
+ Fput (new_symbol, Qevent_kind, kind);
+ }
+
+ return new_symbol;
+}
+
+
+/* Given a symbol whose name begins with modifiers ("C-", "M-", etc),
+ return a symbol with the modifiers placed in the canonical order.
+ Canonical order is alphabetical, except for down and drag, which
+ always come last. The 'click' modifier is never written out.
+
+ Fdefine_key calls this to make sure that (for example) C-M-foo
+ and M-C-foo end up being equivalent in the keymap. */
+
+Lisp_Object
+reorder_modifiers (Lisp_Object symbol)
+{
+ /* It's hopefully okay to write the code this way, since everything
+ will soon be in caches, and no consing will be done at all. */
+ Lisp_Object parsed;
+
+ parsed = parse_modifiers (symbol);
+ return apply_modifiers (XFASTINT (XCAR (XCDR (parsed))),
+ XCAR (parsed));
+}
+
+
+/* For handling events, we often want to produce a symbol whose name
+ is a series of modifier key prefixes ("M-", "C-", etcetera) attached
+ to some base, like the name of a function key or mouse button.
+ modify_event_symbol produces symbols of this sort.
+
+ NAME_TABLE should point to an array of strings, such that NAME_TABLE[i]
+ is the name of the i'th symbol. TABLE_SIZE is the number of elements
+ in the table.
+
+ Alternatively, NAME_ALIST_OR_STEM is either an alist mapping codes
+ into symbol names, or a string specifying a name stem used to
+ construct a symbol name or the form `STEM-N', where N is the decimal
+ representation of SYMBOL_NUM. NAME_ALIST_OR_STEM is used if it is
+ non-nil; otherwise NAME_TABLE is used.
+
+ SYMBOL_TABLE should be a pointer to a Lisp_Object whose value will
+ persist between calls to modify_event_symbol that it can use to
+ store a cache of the symbols it's generated for this NAME_TABLE
+ before. The object stored there may be a vector or an alist.
+
+ SYMBOL_NUM is the number of the base name we want from NAME_TABLE.
+
+ MODIFIERS is a set of modifier bits (as given in struct input_events)
+ whose prefixes should be applied to the symbol name.
+
+ SYMBOL_KIND is the value to be placed in the event_kind property of
+ the returned symbol.
+
+ The symbols we create are supposed to have an
+ `event-symbol-elements' property, which lists the modifiers present
+ in the symbol's name. */
+
+static Lisp_Object
+modify_event_symbol (ptrdiff_t symbol_num, int modifiers, Lisp_Object symbol_kind,
+ Lisp_Object name_alist_or_stem, const char *const *name_table,
+ Lisp_Object *symbol_table, ptrdiff_t table_size)
+{
+ Lisp_Object value;
+ Lisp_Object symbol_int;
+
+ /* Get rid of the "vendor-specific" bit here. */
+ XSETINT (symbol_int, symbol_num & 0xffffff);
+
+ /* Is this a request for a valid symbol? */
+ if (symbol_num < 0 || symbol_num >= table_size)
+ return Qnil;
+
+ if (CONSP (*symbol_table))
+ value = Fcdr (assq_no_quit (symbol_int, *symbol_table));
+
+ /* If *symbol_table doesn't seem to be initialized properly, fix that.
+ *symbol_table should be a lisp vector TABLE_SIZE elements long,
+ where the Nth element is the symbol for NAME_TABLE[N], or nil if
+ we've never used that symbol before. */
+ else
+ {
+ if (! VECTORP (*symbol_table)
+ || ASIZE (*symbol_table) != table_size)
+ {
+ Lisp_Object size;
+
+ XSETFASTINT (size, table_size);
+ *symbol_table = Fmake_vector (size, Qnil);
+ }
+
+ value = AREF (*symbol_table, symbol_num);
+ }
+
+ /* Have we already used this symbol before? */
+ if (NILP (value))
+ {
+ /* No; let's create it. */
+ if (CONSP (name_alist_or_stem))
+ value = Fcdr_safe (Fassq (symbol_int, name_alist_or_stem));
+ else if (STRINGP (name_alist_or_stem))
+ {
+ char *buf;
+ ptrdiff_t len = (SBYTES (name_alist_or_stem)
+ + sizeof "-" + INT_STRLEN_BOUND (EMACS_INT));
+ USE_SAFE_ALLOCA;
+ buf = SAFE_ALLOCA (len);
+ esprintf (buf, "%s-%"pI"d", SDATA (name_alist_or_stem),
+ XINT (symbol_int) + 1);
+ value = intern (buf);
+ SAFE_FREE ();
+ }
+ else if (name_table != 0 && name_table[symbol_num])
+ value = intern (name_table[symbol_num]);
+
+#ifdef HAVE_WINDOW_SYSTEM
+ if (NILP (value))
+ {
+ char *name = x_get_keysym_name (symbol_num);
+ if (name)
+ value = intern (name);
+ }
+#endif
+
+ if (NILP (value))
+ {
+ char buf[sizeof "key-" + INT_STRLEN_BOUND (EMACS_INT)];
+ sprintf (buf, "key-%"pD"d", symbol_num);
+ value = intern (buf);
+ }
+
+ if (CONSP (*symbol_table))
+ *symbol_table = Fcons (Fcons (symbol_int, value), *symbol_table);
+ else
+ ASET (*symbol_table, symbol_num, value);
+
+ /* Fill in the cache entries for this symbol; this also
+ builds the Qevent_symbol_elements property, which the user
+ cares about. */
+ apply_modifiers (modifiers & click_modifier, value);
+ Fput (value, Qevent_kind, symbol_kind);
+ }
+
+ /* Apply modifiers to that symbol. */
+ return apply_modifiers (modifiers, value);
+}
+
+/* Convert a list that represents an event type,
+ such as (ctrl meta backspace), into the usual representation of that
+ event type as a number or a symbol. */
+
+DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
+ doc: /* Convert the event description list EVENT-DESC to an event type.
+EVENT-DESC should contain one base event type (a character or symbol)
+and zero or more modifier names (control, meta, hyper, super, shift, alt,
+drag, down, double or triple). The base must be last.
+The return value is an event type (a character or symbol) which
+has the same base event type and all the specified modifiers. */)
+ (Lisp_Object event_desc)
+{
+ Lisp_Object base;
+ int modifiers = 0;
+ Lisp_Object rest;
+
+ base = Qnil;
+ rest = event_desc;
+ while (CONSP (rest))
+ {
+ Lisp_Object elt;
+ int this = 0;
+
+ elt = XCAR (rest);
+ rest = XCDR (rest);
+
+ /* Given a symbol, see if it is a modifier name. */
+ if (SYMBOLP (elt) && CONSP (rest))
+ this = parse_solitary_modifier (elt);
+
+ if (this != 0)
+ modifiers |= this;
+ else if (!NILP (base))
+ error ("Two bases given in one event");
+ else
+ base = elt;
+
+ }
+
+ /* Let the symbol A refer to the character A. */
+ if (SYMBOLP (base) && SCHARS (SYMBOL_NAME (base)) == 1)
+ XSETINT (base, SREF (SYMBOL_NAME (base), 0));
+
+ if (INTEGERP (base))
+ {
+ /* Turn (shift a) into A. */
+ if ((modifiers & shift_modifier) != 0
+ && (XINT (base) >= 'a' && XINT (base) <= 'z'))
+ {
+ XSETINT (base, XINT (base) - ('a' - 'A'));
+ modifiers &= ~shift_modifier;
+ }
+
+ /* Turn (control a) into C-a. */
+ if (modifiers & ctrl_modifier)
+ return make_number ((modifiers & ~ctrl_modifier)
+ | make_ctrl_char (XINT (base)));
+ else
+ return make_number (modifiers | XINT (base));
+ }
+ else if (SYMBOLP (base))
+ return apply_modifiers (modifiers, base);
+ else
+ error ("Invalid base event");
+}
+
+/* Try to recognize SYMBOL as a modifier name.
+ Return the modifier flag bit, or 0 if not recognized. */
+
+int
+parse_solitary_modifier (Lisp_Object symbol)
+{
+ Lisp_Object name = SYMBOL_NAME (symbol);
+
+ switch (SREF (name, 0))
+ {
+#define SINGLE_LETTER_MOD(BIT) \
+ if (SBYTES (name) == 1) \
+ return BIT;
+
+#define MULTI_LETTER_MOD(BIT, NAME, LEN) \
+ if (LEN == SBYTES (name) \
+ && ! memcmp (SDATA (name), NAME, LEN)) \
+ return BIT;
+
+ case 'A':
+ SINGLE_LETTER_MOD (alt_modifier);
+ break;
+
+ case 'a':
+ MULTI_LETTER_MOD (alt_modifier, "alt", 3);
+ break;
+
+ case 'C':
+ SINGLE_LETTER_MOD (ctrl_modifier);
+ break;
+
+ case 'c':
+ MULTI_LETTER_MOD (ctrl_modifier, "ctrl", 4);
+ MULTI_LETTER_MOD (ctrl_modifier, "control", 7);
+ break;
+
+ case 'H':
+ SINGLE_LETTER_MOD (hyper_modifier);
+ break;
+
+ case 'h':
+ MULTI_LETTER_MOD (hyper_modifier, "hyper", 5);
+ break;
+
+ case 'M':
+ SINGLE_LETTER_MOD (meta_modifier);
+ break;
+
+ case 'm':
+ MULTI_LETTER_MOD (meta_modifier, "meta", 4);
+ break;
+
+ case 'S':
+ SINGLE_LETTER_MOD (shift_modifier);
+ break;
+
+ case 's':
+ MULTI_LETTER_MOD (shift_modifier, "shift", 5);
+ MULTI_LETTER_MOD (super_modifier, "super", 5);
+ SINGLE_LETTER_MOD (super_modifier);
+ break;
+
+ case 'd':
+ MULTI_LETTER_MOD (drag_modifier, "drag", 4);
+ MULTI_LETTER_MOD (down_modifier, "down", 4);
+ MULTI_LETTER_MOD (double_modifier, "double", 6);
+ break;
+
+ case 't':
+ MULTI_LETTER_MOD (triple_modifier, "triple", 6);
+ break;
+
+#undef SINGLE_LETTER_MOD
+#undef MULTI_LETTER_MOD
+ }
+
+ return 0;
+}
+
+/* Return true if EVENT is a list whose elements are all integers or symbols.
+ Such a list is not valid as an event,
+ but it can be a Lucid-style event type list. */
+
+bool
+lucid_event_type_list_p (Lisp_Object object)
+{
+ Lisp_Object tail;
+
+ if (! CONSP (object))
+ return 0;
+
+ if (EQ (XCAR (object), Qhelp_echo)
+ || EQ (XCAR (object), Qvertical_line)
+ || EQ (XCAR (object), Qmode_line)
+ || EQ (XCAR (object), Qheader_line))
+ return 0;
+
+ for (tail = object; CONSP (tail); tail = XCDR (tail))
+ {
+ Lisp_Object elt;
+ elt = XCAR (tail);
+ if (! (INTEGERP (elt) || SYMBOLP (elt)))
+ return 0;
+ }
+
+ return NILP (tail);
+}
+
+/* Return true if terminal input chars are available.
+ Also, store the return value into INPUT_PENDING.
+
+ Serves the purpose of ioctl (0, FIONREAD, ...)
+ but works even if FIONREAD does not exist.
+ (In fact, this may actually read some input.)
+
+ If READABLE_EVENTS_DO_TIMERS_NOW is set in FLAGS, actually run
+ timer events that are ripe.
+ If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal
+ events (FOCUS_IN_EVENT).
+ If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse
+ movements and toolkit scroll bar thumb drags. */
+
+static bool
+get_input_pending (int flags)
+{
+ /* First of all, have we already counted some input? */
+ input_pending = (!NILP (Vquit_flag) || readable_events (flags));
+
+ /* If input is being read as it arrives, and we have none, there is none. */
+ if (!input_pending && (!interrupt_input || interrupts_deferred))
+ {
+ /* Try to read some input and see how much we get. */
+ gobble_input ();
+ input_pending = (!NILP (Vquit_flag) || readable_events (flags));
+ }
+
+ return input_pending;
+}
+
+/* Put a BUFFER_SWITCH_EVENT in the buffer
+ so that read_key_sequence will notice the new current buffer. */
+
+void
+record_asynch_buffer_change (void)
+{
+ /* We don't need a buffer-switch event unless Emacs is waiting for input.
+ The purpose of the event is to make read_key_sequence look up the
+ keymaps again. If we aren't in read_key_sequence, we don't need one,
+ and the event could cause trouble by messing up (input-pending-p).
+ Note: Fwaiting_for_user_input_p always returns nil when async
+ subprocesses aren't supported. */
+ if (!NILP (Fwaiting_for_user_input_p ()))
+ {
+ struct input_event event;
+
+ EVENT_INIT (event);
+ event.kind = BUFFER_SWITCH_EVENT;
+ event.frame_or_window = Qnil;
+ event.arg = Qnil;
+
+ /* Make sure no interrupt happens while storing the event. */
+#ifdef USABLE_SIGIO
+ if (interrupt_input)
+ kbd_buffer_store_event (&event);
+ else
+#endif
+ {
+ stop_polling ();
+ kbd_buffer_store_event (&event);
+ start_polling ();
+ }
+ }
+}
+
+/* Read any terminal input already buffered up by the system
+ into the kbd_buffer, but do not wait.
+
+ Return the number of keyboard chars read, or -1 meaning
+ this is a bad time to try to read input. */
+
+int
+gobble_input (void)
+{
+ int nread = 0;
+ bool err = 0;
+ struct terminal *t;
+
+ /* Store pending user signal events, if any. */
+ store_user_signal_events ();
+
+ /* Loop through the available terminals, and call their input hooks. */
+ t = terminal_list;
+ while (t)
+ {
+ struct terminal *next = t->next_terminal;
+
+ if (t->read_socket_hook)
+ {
+ int nr;
+ struct input_event hold_quit;
+
+ if (input_blocked_p ())
+ {
+ pending_signals = 1;
+ break;
+ }
+
+ EVENT_INIT (hold_quit);
+ hold_quit.kind = NO_EVENT;
+
+ /* No need for FIONREAD or fcntl; just say don't wait. */
+ while ((nr = (*t->read_socket_hook) (t, &hold_quit)) > 0)
+ nread += nr;
+
+ if (nr == -1) /* Not OK to read input now. */
+ {
+ err = 1;
+ }
+ else if (nr == -2) /* Non-transient error. */
+ {
+ /* The terminal device terminated; it should be closed. */
+
+ /* Kill Emacs if this was our last terminal. */
+ if (!terminal_list->next_terminal)
+ /* Formerly simply reported no input, but that
+ sometimes led to a failure of Emacs to terminate.
+ SIGHUP seems appropriate if we can't reach the
+ terminal. */
+ /* ??? Is it really right to send the signal just to
+ this process rather than to the whole process
+ group? Perhaps on systems with FIONREAD Emacs is
+ alone in its group. */
+ terminate_due_to_signal (SIGHUP, 10);
+
+ /* XXX Is calling delete_terminal safe here? It calls delete_frame. */
+ {
+ Lisp_Object tmp;
+ XSETTERMINAL (tmp, t);
+ Fdelete_terminal (tmp, Qnoelisp);
+ }
+ }
+
+ /* If there was no error, make sure the pointer
+ is visible for all frames on this terminal. */
+ if (nr >= 0)
+ {
+ Lisp_Object tail, frame;
+
+ FOR_EACH_FRAME (tail, frame)
+ {
+ struct frame *f = XFRAME (frame);
+ if (FRAME_TERMINAL (f) == t)
+ frame_make_pointer_visible (f);
+ }
+ }
+
+ if (hold_quit.kind != NO_EVENT)
+ kbd_buffer_store_event (&hold_quit);
+ }
+
+ t = next;
+ }
+
+ if (err && !nread)
+ nread = -1;
+
+ return nread;
+}
+
+/* This is the tty way of reading available input.
+
+ Note that each terminal device has its own `struct terminal' object,
+ and so this function is called once for each individual termcap
+ terminal. The first parameter indicates which terminal to read from. */
+
+int
+tty_read_avail_input (struct terminal *terminal,
+ struct input_event *hold_quit)
+{
+ /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than
+ the kbd_buffer can really hold. That may prevent loss
+ of characters on some systems when input is stuffed at us. */
+ unsigned char cbuf[KBD_BUFFER_SIZE - 1];
+ int n_to_read, i;
+ struct tty_display_info *tty = terminal->display_info.tty;
+ int nread = 0;
+#ifdef subprocesses
+ int buffer_free = KBD_BUFFER_SIZE - kbd_buffer_nr_stored () - 1;
+
+ if (kbd_on_hold_p () || buffer_free <= 0)
+ return 0;
+#endif /* subprocesses */
+
+ if (!terminal->name) /* Don't read from a dead terminal. */
+ return 0;
+
+ if (terminal->type != output_termcap
+ && terminal->type != output_msdos_raw)
+ emacs_abort ();
+
+ /* XXX I think the following code should be moved to separate hook
+ functions in system-dependent files. */
+#ifdef WINDOWSNT
+ /* FIXME: AFAIK, tty_read_avail_input is not used under w32 since the non-GUI
+ code sets read_socket_hook to w32_console_read_socket instead! */
+ return 0;
+#else /* not WINDOWSNT */
+ if (! tty->term_initted) /* In case we get called during bootstrap. */
+ return 0;
+
+ if (! tty->input)
+ return 0; /* The terminal is suspended. */
+
+#ifdef MSDOS
+ n_to_read = dos_keysns ();
+ if (n_to_read == 0)
+ return 0;
+
+ cbuf[0] = dos_keyread ();
+ nread = 1;
+
+#else /* not MSDOS */
+#ifdef HAVE_GPM
+ if (gpm_tty == tty)
+ {
+ Gpm_Event event;
+ struct input_event gpm_hold_quit;
+ int gpm, fd = gpm_fd;
+
+ EVENT_INIT (gpm_hold_quit);
+ gpm_hold_quit.kind = NO_EVENT;
+
+ /* gpm==1 if event received.
+ gpm==0 if the GPM daemon has closed the connection, in which case
+ Gpm_GetEvent closes gpm_fd and clears it to -1, which is why
+ we save it in `fd' so close_gpm can remove it from the
+ select masks.
+ gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal. */
+ while (gpm = Gpm_GetEvent (&event), gpm == 1) {
+ nread += handle_one_term_event (tty, &event, &gpm_hold_quit);
+ }
+ if (gpm == 0)
+ /* Presumably the GPM daemon has closed the connection. */
+ close_gpm (fd);
+ if (gpm_hold_quit.kind != NO_EVENT)
+ kbd_buffer_store_event (&gpm_hold_quit);
+ if (nread)
+ return nread;
+ }
+#endif /* HAVE_GPM */
+
+/* Determine how many characters we should *try* to read. */
+#ifdef USABLE_FIONREAD
+ /* Find out how much input is available. */
+ if (ioctl (fileno (tty->input), FIONREAD, &n_to_read) < 0)
+ {
+ if (! noninteractive)
+ return -2; /* Close this terminal. */
+ else
+ n_to_read = 0;
+ }
+ if (n_to_read == 0)
+ return 0;
+ if (n_to_read > sizeof cbuf)
+ n_to_read = sizeof cbuf;
+#elif defined USG || defined CYGWIN
+ /* Read some input if available, but don't wait. */
+ n_to_read = sizeof cbuf;
+ fcntl (fileno (tty->input), F_SETFL, O_NONBLOCK);
+#else
+# error "Cannot read without possibly delaying"
+#endif
+
+#ifdef subprocesses
+ /* Don't read more than we can store. */
+ if (n_to_read > buffer_free)
+ n_to_read = buffer_free;
+#endif /* subprocesses */
+
+ /* Now read; for one reason or another, this will not block.
+ NREAD is set to the number of chars read. */
+ do
+ {
+ nread = emacs_read (fileno (tty->input), (char *) cbuf, n_to_read);
+ /* POSIX infers that processes which are not in the session leader's
+ process group won't get SIGHUPs at logout time. BSDI adheres to
+ this part standard and returns -1 from read (0) with errno==EIO
+ when the control tty is taken away.
+ Jeffrey Honig <jch@bsdi.com> says this is generally safe. */
+ if (nread == -1 && errno == EIO)
+ return -2; /* Close this terminal. */
+#if defined (AIX) && defined (_BSD)
+ /* The kernel sometimes fails to deliver SIGHUP for ptys.
+ This looks incorrect, but it isn't, because _BSD causes
+ O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
+ and that causes a value other than 0 when there is no input. */
+ if (nread == 0)
+ return -2; /* Close this terminal. */
+#endif
+ }
+ while (
+ /* We used to retry the read if it was interrupted.
+ But this does the wrong thing when O_NONBLOCK causes
+ an EAGAIN error. Does anybody know of a situation
+ where a retry is actually needed? */
+#if 0
+ nread < 0 && (errno == EAGAIN || errno == EFAULT
+#ifdef EBADSLT
+ || errno == EBADSLT
+#endif
+ )
+#else
+ 0
+#endif
+ );
+
+#ifndef USABLE_FIONREAD
+#if defined (USG) || defined (CYGWIN)
+ fcntl (fileno (tty->input), F_SETFL, 0);
+#endif /* USG or CYGWIN */
+#endif /* no FIONREAD */
+
+ if (nread <= 0)
+ return nread;
+
+#endif /* not MSDOS */
+#endif /* not WINDOWSNT */
+
+ for (i = 0; i < nread; i++)
+ {
+ struct input_event buf;
+ EVENT_INIT (buf);
+ buf.kind = ASCII_KEYSTROKE_EVENT;
+ buf.modifiers = 0;
+ if (tty->meta_key == 1 && (cbuf[i] & 0x80))
+ buf.modifiers = meta_modifier;
+ if (tty->meta_key != 2)
+ cbuf[i] &= ~0x80;
+
+ buf.code = cbuf[i];
+ /* Set the frame corresponding to the active tty. Note that the
+ value of selected_frame is not reliable here, redisplay tends
+ to temporarily change it. */
+ buf.frame_or_window = tty->top_frame;
+ buf.arg = Qnil;
+
+ kbd_buffer_store_event (&buf);
+ /* Don't look at input that follows a C-g too closely.
+ This reduces lossage due to autorepeat on C-g. */
+ if (buf.kind == ASCII_KEYSTROKE_EVENT
+ && buf.code == quit_char)
+ break;
+ }
+
+ return nread;
+}
+
+static void
+handle_async_input (void)
+{
+#ifdef USABLE_SIGIO
+ while (1)
+ {
+ int nread = gobble_input ();
+ /* -1 means it's not ok to read the input now.
+ UNBLOCK_INPUT will read it later; now, avoid infinite loop.
+ 0 means there was no keyboard input available. */
+ if (nread <= 0)
+ break;
+ }
+#endif
+}
+
+void
+process_pending_signals (void)
+{
+ pending_signals = 0;
+ handle_async_input ();
+ do_pending_atimers ();
+}
+
+/* Undo any number of BLOCK_INPUT calls down to level LEVEL,
+ and reinvoke any pending signal if the level is now 0 and
+ a fatal error is not already in progress. */
+
+void
+unblock_input_to (int level)
+{
+ interrupt_input_blocked = level;
+ if (level == 0)
+ {
+ if (pending_signals && !fatal_error_in_progress)
+ process_pending_signals ();
+ }
+ else if (level < 0)
+ emacs_abort ();
+}
+
+/* End critical section.
+
+ If doing signal-driven input, and a signal came in when input was
+ blocked, reinvoke the signal handler now to deal with it.
+
+ It will also process queued input, if it was not read before.
+ When a longer code sequence does not use block/unblock input
+ at all, the whole input gathered up to the next call to
+ unblock_input will be processed inside that call. */
+
+void
+unblock_input (void)
+{
+ unblock_input_to (interrupt_input_blocked - 1);
+}
+
+/* Undo any number of BLOCK_INPUT calls,
+ and also reinvoke any pending signal. */
+
+void
+totally_unblock_input (void)
+{
+ unblock_input_to (0);
+}
+
+#ifdef USABLE_SIGIO
+
+void
+handle_input_available_signal (int sig)
+{
+ pending_signals = 1;
+
+ if (input_available_clear_time)
+ *input_available_clear_time = make_timespec (0, 0);
+}
+
+static void
+deliver_input_available_signal (int sig)
+{
+ deliver_process_signal (sig, handle_input_available_signal);
+}
+#endif /* USABLE_SIGIO */
+
+
+/* User signal events. */
+
+struct user_signal_info
+{
+ /* Signal number. */
+ int sig;
+
+ /* Name of the signal. */
+ char *name;
+
+ /* Number of pending signals. */
+ int npending;
+
+ struct user_signal_info *next;
+};
+
+/* List of user signals. */
+static struct user_signal_info *user_signals = NULL;
+
+void
+add_user_signal (int sig, const char *name)
+{
+ struct sigaction action;
+ struct user_signal_info *p;
+
+ for (p = user_signals; p; p = p->next)
+ if (p->sig == sig)
+ /* Already added. */
+ return;
+
+ p = xmalloc (sizeof *p);
+ p->sig = sig;
+ p->name = xstrdup (name);
+ p->npending = 0;
+ p->next = user_signals;
+ user_signals = p;
+
+ emacs_sigaction_init (&action, deliver_user_signal);
+ sigaction (sig, &action, 0);
+}
+
+static void
+handle_user_signal (int sig)
+{
+ struct user_signal_info *p;
+ const char *special_event_name = NULL;
+
+ if (SYMBOLP (Vdebug_on_event))
+ special_event_name = SSDATA (SYMBOL_NAME (Vdebug_on_event));
+
+ for (p = user_signals; p; p = p->next)
+ if (p->sig == sig)
+ {
+ if (special_event_name
+ && strcmp (special_event_name, p->name) == 0)
+ {
+ /* Enter the debugger in many ways. */
+ debug_on_next_call = 1;
+ debug_on_quit = 1;
+ Vquit_flag = Qt;
+ Vinhibit_quit = Qnil;
+
+ /* Eat the event. */
+ break;
+ }
+
+ p->npending++;
+#ifdef USABLE_SIGIO
+ if (interrupt_input)
+ handle_input_available_signal (sig);
+ else
+#endif
+ {
+ /* Tell wait_reading_process_output that it needs to wake
+ up and look around. */
+ if (input_available_clear_time)
+ *input_available_clear_time = make_timespec (0, 0);
+ }
+ break;
+ }
+}
+
+static void
+deliver_user_signal (int sig)
+{
+ deliver_process_signal (sig, handle_user_signal);
+}
+
+static char *
+find_user_signal_name (int sig)
+{
+ struct user_signal_info *p;
+
+ for (p = user_signals; p; p = p->next)
+ if (p->sig == sig)
+ return p->name;
+
+ return NULL;
+}
+
+static void
+store_user_signal_events (void)
+{
+ struct user_signal_info *p;
+ struct input_event buf;
+ bool buf_initialized = 0;
+
+ for (p = user_signals; p; p = p->next)
+ if (p->npending > 0)
+ {
+ if (! buf_initialized)
+ {
+ memset (&buf, 0, sizeof buf);
+ buf.kind = USER_SIGNAL_EVENT;
+ buf.frame_or_window = selected_frame;
+ buf_initialized = 1;
+ }
+
+ do
+ {
+ buf.code = p->sig;
+ kbd_buffer_store_event (&buf);
+ p->npending--;
+ }
+ while (p->npending > 0);
+ }
+}
+
+
+static void menu_bar_item (Lisp_Object, Lisp_Object, Lisp_Object, void *);
+static Lisp_Object menu_bar_one_keymap_changed_items;
+
+/* These variables hold the vector under construction within
+ menu_bar_items and its subroutines, and the current index
+ for storing into that vector. */
+static Lisp_Object menu_bar_items_vector;
+static int menu_bar_items_index;
+
+
+static const char *separator_names[] = {
+ "space",
+ "no-line",
+ "single-line",
+ "double-line",
+ "single-dashed-line",
+ "double-dashed-line",
+ "shadow-etched-in",
+ "shadow-etched-out",
+ "shadow-etched-in-dash",
+ "shadow-etched-out-dash",
+ "shadow-double-etched-in",
+ "shadow-double-etched-out",
+ "shadow-double-etched-in-dash",
+ "shadow-double-etched-out-dash",
+ 0,
+};
+
+/* Return true if LABEL specifies a separator. */
+
+bool
+menu_separator_name_p (const char *label)
+{
+ if (!label)
+ return 0;
+ else if (strlen (label) > 3
+ && memcmp (label, "--", 2) == 0
+ && label[2] != '-')
+ {
+ int i;
+ label += 2;
+ for (i = 0; separator_names[i]; ++i)
+ if (strcmp (label, separator_names[i]) == 0)
+ return 1;
+ }
+ else
+ {
+ /* It's a separator if it contains only dashes. */
+ while (*label == '-')
+ ++label;
+ return (*label == 0);
+ }
+
+ return 0;
+}
+
+
+/* Return a vector of menu items for a menu bar, appropriate
+ to the current buffer. Each item has three elements in the vector:
+ KEY STRING MAPLIST.
+
+ OLD is an old vector we can optionally reuse, or nil. */
+
+Lisp_Object
+menu_bar_items (Lisp_Object old)
+{
+ /* The number of keymaps we're scanning right now, and the number of
+ keymaps we have allocated space for. */
+ ptrdiff_t nmaps;
+
+ /* maps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
+ in the current keymaps, or nil where it is not a prefix. */
+ Lisp_Object *maps;
+
+ Lisp_Object mapsbuf[3];
+ Lisp_Object def, tail;
+
+ ptrdiff_t mapno;
+ Lisp_Object oquit;
+
+ USE_SAFE_ALLOCA;
+
+ /* In order to build the menus, we need to call the keymap
+ accessors. They all call QUIT. But this function is called
+ during redisplay, during which a quit is fatal. So inhibit
+ quitting while building the menus.
+ We do this instead of specbind because (1) errors will clear it anyway
+ and (2) this avoids risk of specpdl overflow. */
+ oquit = Vinhibit_quit;
+ Vinhibit_quit = Qt;
+
+ if (!NILP (old))
+ menu_bar_items_vector = old;
+ else
+ menu_bar_items_vector = Fmake_vector (make_number (24), Qnil);
+ menu_bar_items_index = 0;
+
+ /* Build our list of keymaps.
+ If we recognize a function key and replace its escape sequence in
+ keybuf with its symbol, or if the sequence starts with a mouse
+ click and we need to switch buffers, we jump back here to rebuild
+ the initial keymaps from the current buffer. */
+ {
+ Lisp_Object *tmaps;
+
+ /* Should overriding-terminal-local-map and overriding-local-map apply? */
+ if (!NILP (Voverriding_local_map_menu_flag)
+ && !NILP (Voverriding_local_map))
+ {
+ /* Yes, use them (if non-nil) as well as the global map. */
+ maps = mapsbuf;
+ nmaps = 0;
+ if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map)))
+ maps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map);
+ if (!NILP (Voverriding_local_map))
+ maps[nmaps++] = Voverriding_local_map;
+ }
+ else
+ {
+ /* No, so use major and minor mode keymaps and keymap property.
+ Note that menu-bar bindings in the local-map and keymap
+ properties may not work reliable, as they are only
+ recognized when the menu-bar (or mode-line) is updated,
+ which does not normally happen after every command. */
+ Lisp_Object tem;
+ ptrdiff_t nminor;
+ nminor = current_minor_maps (NULL, &tmaps);
+ SAFE_NALLOCA (maps, 1, nminor + 4);
+ nmaps = 0;
+ tem = KVAR (current_kboard, Voverriding_terminal_local_map);
+ if (!NILP (tem) && !NILP (Voverriding_local_map_menu_flag))
+ maps[nmaps++] = tem;
+ if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
+ maps[nmaps++] = tem;
+ memcpy (maps + nmaps, tmaps, nminor * sizeof (maps[0]));
+ nmaps += nminor;
+ maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
+ }
+ maps[nmaps++] = current_global_map;
+ }
+
+ /* Look up in each map the dummy prefix key `menu-bar'. */
+
+ for (mapno = nmaps - 1; mapno >= 0; mapno--)
+ if (!NILP (maps[mapno]))
+ {
+ def = get_keymap (access_keymap (maps[mapno], Qmenu_bar, 1, 0, 1),
+ 0, 1);
+ if (CONSP (def))
+ {
+ menu_bar_one_keymap_changed_items = Qnil;
+ map_keymap_canonical (def, menu_bar_item, Qnil, NULL);
+ }
+ }
+
+ /* Move to the end those items that should be at the end. */
+
+ for (tail = Vmenu_bar_final_items; CONSP (tail); tail = XCDR (tail))
+ {
+ int i;
+ int end = menu_bar_items_index;
+
+ for (i = 0; i < end; i += 4)
+ if (EQ (XCAR (tail), AREF (menu_bar_items_vector, i)))
+ {
+ Lisp_Object tem0, tem1, tem2, tem3;
+ /* Move the item at index I to the end,
+ shifting all the others forward. */
+ tem0 = AREF (menu_bar_items_vector, i + 0);
+ tem1 = AREF (menu_bar_items_vector, i + 1);
+ tem2 = AREF (menu_bar_items_vector, i + 2);
+ tem3 = AREF (menu_bar_items_vector, i + 3);
+ if (end > i + 4)
+ memmove (aref_addr (menu_bar_items_vector, i),
+ aref_addr (menu_bar_items_vector, i + 4),
+ (end - i - 4) * word_size);
+ ASET (menu_bar_items_vector, end - 4, tem0);
+ ASET (menu_bar_items_vector, end - 3, tem1);
+ ASET (menu_bar_items_vector, end - 2, tem2);
+ ASET (menu_bar_items_vector, end - 1, tem3);
+ break;
+ }
+ }
+
+ /* Add nil, nil, nil, nil at the end. */
+ {
+ int i = menu_bar_items_index;
+ if (i + 4 > ASIZE (menu_bar_items_vector))
+ menu_bar_items_vector
+ = larger_vector (menu_bar_items_vector, 4, -1);
+ /* Add this item. */
+ ASET (menu_bar_items_vector, i, Qnil); i++;
+ ASET (menu_bar_items_vector, i, Qnil); i++;
+ ASET (menu_bar_items_vector, i, Qnil); i++;
+ ASET (menu_bar_items_vector, i, Qnil); i++;
+ menu_bar_items_index = i;
+ }
+
+ Vinhibit_quit = oquit;
+ SAFE_FREE ();
+ return menu_bar_items_vector;
+}
+
+/* Add one item to menu_bar_items_vector, for KEY, ITEM_STRING and DEF.
+ If there's already an item for KEY, add this DEF to it. */
+
+Lisp_Object item_properties;
+
+static void
+menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void *dummy2)
+{
+ struct gcpro gcpro1;
+ int i;
+ bool parsed;
+ Lisp_Object tem;
+
+ if (EQ (item, Qundefined))
+ {
+ /* If a map has an explicit `undefined' as definition,
+ discard any previously made menu bar item. */
+
+ for (i = 0; i < menu_bar_items_index; i += 4)
+ if (EQ (key, AREF (menu_bar_items_vector, i)))
+ {
+ if (menu_bar_items_index > i + 4)
+ memmove (aref_addr (menu_bar_items_vector, i),
+ aref_addr (menu_bar_items_vector, i + 4),
+ (menu_bar_items_index - i - 4) * word_size);
+ menu_bar_items_index -= 4;
+ }
+ }
+
+ /* If this keymap has already contributed to this KEY,
+ don't contribute to it a second time. */
+ tem = Fmemq (key, menu_bar_one_keymap_changed_items);
+ if (!NILP (tem) || NILP (item))
+ return;
+
+ menu_bar_one_keymap_changed_items
+ = Fcons (key, menu_bar_one_keymap_changed_items);
+
+ /* We add to menu_bar_one_keymap_changed_items before doing the
+ parse_menu_item, so that if it turns out it wasn't a menu item,
+ it still correctly hides any further menu item. */
+ GCPRO1 (key);
+ parsed = parse_menu_item (item, 1);
+ UNGCPRO;
+ if (!parsed)
+ return;
+
+ item = AREF (item_properties, ITEM_PROPERTY_DEF);
+
+ /* Find any existing item for this KEY. */
+ for (i = 0; i < menu_bar_items_index; i += 4)
+ if (EQ (key, AREF (menu_bar_items_vector, i)))
+ break;
+
+ /* If we did not find this KEY, add it at the end. */
+ if (i == menu_bar_items_index)
+ {
+ /* If vector is too small, get a bigger one. */
+ if (i + 4 > ASIZE (menu_bar_items_vector))
+ menu_bar_items_vector = larger_vector (menu_bar_items_vector, 4, -1);
+ /* Add this item. */
+ ASET (menu_bar_items_vector, i, key); i++;
+ ASET (menu_bar_items_vector, i,
+ AREF (item_properties, ITEM_PROPERTY_NAME)); i++;
+ ASET (menu_bar_items_vector, i, list1 (item)); i++;
+ ASET (menu_bar_items_vector, i, make_number (0)); i++;
+ menu_bar_items_index = i;
+ }
+ /* We did find an item for this KEY. Add ITEM to its list of maps. */
+ else
+ {
+ Lisp_Object old;
+ old = AREF (menu_bar_items_vector, i + 2);
+ /* If the new and the old items are not both keymaps,
+ the lookup will only find `item'. */
+ item = Fcons (item, KEYMAPP (item) && KEYMAPP (XCAR (old)) ? old : Qnil);
+ ASET (menu_bar_items_vector, i + 2, item);
+ }
+}
+
+ /* This is used as the handler when calling menu_item_eval_property. */
+static Lisp_Object
+menu_item_eval_property_1 (Lisp_Object arg)
+{
+ /* If we got a quit from within the menu computation,
+ quit all the way out of it. This takes care of C-] in the debugger. */
+ if (CONSP (arg) && EQ (XCAR (arg), Qquit))
+ Fsignal (Qquit, Qnil);
+
+ return Qnil;
+}
+
+static Lisp_Object
+eval_dyn (Lisp_Object form)
+{
+ return Feval (form, Qnil);
+}
+
+/* Evaluate an expression and return the result (or nil if something
+ went wrong). Used to evaluate dynamic parts of menu items. */
+Lisp_Object
+menu_item_eval_property (Lisp_Object sexpr)
+{
+ ptrdiff_t count = SPECPDL_INDEX ();
+ Lisp_Object val;
+ specbind (Qinhibit_redisplay, Qt);
+ val = internal_condition_case_1 (eval_dyn, sexpr, Qerror,
+ menu_item_eval_property_1);
+ return unbind_to (count, val);
+}
+
+/* This function parses a menu item and leaves the result in the
+ vector item_properties.
+ ITEM is a key binding, a possible menu item.
+ INMENUBAR is > 0 when this is considered for an entry in a menu bar
+ top level.
+ INMENUBAR is < 0 when this is considered for an entry in a keyboard menu.
+ parse_menu_item returns true if the item is a menu item and false
+ otherwise. */
+
+bool
+parse_menu_item (Lisp_Object item, int inmenubar)
+{
+ Lisp_Object def, tem, item_string, start;
+ Lisp_Object filter;
+ Lisp_Object keyhint;
+ int i;
+
+ filter = Qnil;
+ keyhint = Qnil;
+
+ if (!CONSP (item))
+ return 0;
+
+ /* Create item_properties vector if necessary. */
+ if (NILP (item_properties))
+ item_properties
+ = Fmake_vector (make_number (ITEM_PROPERTY_ENABLE + 1), Qnil);
+
+ /* Initialize optional entries. */
+ for (i = ITEM_PROPERTY_DEF; i < ITEM_PROPERTY_ENABLE; i++)
+ ASET (item_properties, i, Qnil);
+ ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
+
+ /* Save the item here to protect it from GC. */
+ ASET (item_properties, ITEM_PROPERTY_ITEM, item);
+
+ item_string = XCAR (item);
+
+ start = item;
+ item = XCDR (item);
+ if (STRINGP (item_string))
+ {
+ /* Old format menu item. */
+ ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
+
+ /* Maybe help string. */
+ if (CONSP (item) && STRINGP (XCAR (item)))
+ {
+ ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
+ start = item;
+ item = XCDR (item);
+ }
+
+ /* Maybe an obsolete key binding cache. */
+ if (CONSP (item) && CONSP (XCAR (item))
+ && (NILP (XCAR (XCAR (item)))
+ || VECTORP (XCAR (XCAR (item)))))
+ item = XCDR (item);
+
+ /* This is the real definition--the function to run. */
+ ASET (item_properties, ITEM_PROPERTY_DEF, item);
+
+ /* Get enable property, if any. */
+ if (SYMBOLP (item))
+ {
+ tem = Fget (item, Qmenu_enable);
+ if (!NILP (Venable_disabled_menus_and_buttons))
+ ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
+ else if (!NILP (tem))
+ ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
+ }
+ }
+ else if (EQ (item_string, Qmenu_item) && CONSP (item))
+ {
+ /* New format menu item. */
+ ASET (item_properties, ITEM_PROPERTY_NAME, XCAR (item));
+ start = XCDR (item);
+ if (CONSP (start))
+ {
+ /* We have a real binding. */
+ ASET (item_properties, ITEM_PROPERTY_DEF, XCAR (start));
+
+ item = XCDR (start);
+ /* Is there an obsolete cache list with key equivalences. */
+ if (CONSP (item) && CONSP (XCAR (item)))
+ item = XCDR (item);
+
+ /* Parse properties. */
+ while (CONSP (item) && CONSP (XCDR (item)))
+ {
+ tem = XCAR (item);
+ item = XCDR (item);
+
+ if (EQ (tem, QCenable))
+ {
+ if (!NILP (Venable_disabled_menus_and_buttons))
+ ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
+ else
+ ASET (item_properties, ITEM_PROPERTY_ENABLE, XCAR (item));
+ }
+ else if (EQ (tem, QCvisible))
+ {
+ /* If got a visible property and that evaluates to nil
+ then ignore this item. */
+ tem = menu_item_eval_property (XCAR (item));
+ if (NILP (tem))
+ return 0;
+ }
+ else if (EQ (tem, QChelp))
+ ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
+ else if (EQ (tem, QCfilter))
+ filter = item;
+ else if (EQ (tem, QCkey_sequence))
+ {
+ tem = XCAR (item);
+ if (SYMBOLP (tem) || STRINGP (tem) || VECTORP (tem))
+ /* Be GC protected. Set keyhint to item instead of tem. */
+ keyhint = item;
+ }
+ else if (EQ (tem, QCkeys))
+ {
+ tem = XCAR (item);
+ if (CONSP (tem) || STRINGP (tem))
+ ASET (item_properties, ITEM_PROPERTY_KEYEQ, tem);
+ }
+ else if (EQ (tem, QCbutton) && CONSP (XCAR (item)))
+ {
+ Lisp_Object type;
+ tem = XCAR (item);
+ type = XCAR (tem);
+ if (EQ (type, QCtoggle) || EQ (type, QCradio))
+ {
+ ASET (item_properties, ITEM_PROPERTY_SELECTED,
+ XCDR (tem));
+ ASET (item_properties, ITEM_PROPERTY_TYPE, type);
+ }
+ }
+ item = XCDR (item);
+ }
+ }
+ else if (inmenubar || !NILP (start))
+ return 0;
+ }
+ else
+ return 0; /* not a menu item */
+
+ /* If item string is not a string, evaluate it to get string.
+ If we don't get a string, skip this item. */
+ item_string = AREF (item_properties, ITEM_PROPERTY_NAME);
+ if (!(STRINGP (item_string)))
+ {
+ item_string = menu_item_eval_property (item_string);
+ if (!STRINGP (item_string))
+ return 0;
+ ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
+ }
+
+ /* If got a filter apply it on definition. */
+ def = AREF (item_properties, ITEM_PROPERTY_DEF);
+ if (!NILP (filter))
+ {
+ def = menu_item_eval_property (list2 (XCAR (filter),
+ list2 (Qquote, def)));
+
+ ASET (item_properties, ITEM_PROPERTY_DEF, def);
+ }
+
+ /* Enable or disable selection of item. */
+ tem = AREF (item_properties, ITEM_PROPERTY_ENABLE);
+ if (!EQ (tem, Qt))
+ {
+ tem = menu_item_eval_property (tem);
+ if (inmenubar && NILP (tem))
+ return 0; /* Ignore disabled items in menu bar. */
+ ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
+ }
+
+ /* If we got no definition, this item is just unselectable text which
+ is OK in a submenu but not in the menubar. */
+ if (NILP (def))
+ return (!inmenubar);
+
+ /* See if this is a separate pane or a submenu. */
+ def = AREF (item_properties, ITEM_PROPERTY_DEF);
+ tem = get_keymap (def, 0, 1);
+ /* For a subkeymap, just record its details and exit. */
+ if (CONSP (tem))
+ {
+ ASET (item_properties, ITEM_PROPERTY_MAP, tem);
+ ASET (item_properties, ITEM_PROPERTY_DEF, tem);
+ return 1;
+ }
+
+ /* At the top level in the menu bar, do likewise for commands also.
+ The menu bar does not display equivalent key bindings anyway.
+ ITEM_PROPERTY_DEF is already set up properly. */
+ if (inmenubar > 0)
+ return 1;
+
+ { /* This is a command. See if there is an equivalent key binding. */
+ Lisp_Object keyeq = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
+ AUTO_STRING (space_space, " ");
+
+ /* The previous code preferred :key-sequence to :keys, so we
+ preserve this behavior. */
+ if (STRINGP (keyeq) && !CONSP (keyhint))
+ keyeq = concat2 (space_space, Fsubstitute_command_keys (keyeq));
+ else
+ {
+ Lisp_Object prefix = keyeq;
+ Lisp_Object keys = Qnil;
+
+ if (CONSP (prefix))
+ {
+ def = XCAR (prefix);
+ prefix = XCDR (prefix);
+ }
+ else
+ def = AREF (item_properties, ITEM_PROPERTY_DEF);
+
+ if (CONSP (keyhint) && !NILP (XCAR (keyhint)))
+ {
+ keys = XCAR (keyhint);
+ tem = Fkey_binding (keys, Qnil, Qnil, Qnil);
+
+ /* We have a suggested key. Is it bound to the command? */
+ if (NILP (tem)
+ || (!EQ (tem, def)
+ /* If the command is an alias for another
+ (such as lmenu.el set it up), check if the
+ original command matches the cached command. */
+ && !(SYMBOLP (def)
+ && EQ (tem, XSYMBOL (def)->function))))
+ keys = Qnil;
+ }
+
+ if (NILP (keys))
+ keys = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qnil);
+
+ if (!NILP (keys))
+ {
+ tem = Fkey_description (keys, Qnil);
+ if (CONSP (prefix))
+ {
+ if (STRINGP (XCAR (prefix)))
+ tem = concat2 (XCAR (prefix), tem);
+ if (STRINGP (XCDR (prefix)))
+ tem = concat2 (tem, XCDR (prefix));
+ }
+ keyeq = concat2 (space_space, tem);
+ }
+ else
+ keyeq = Qnil;
+ }
+
+ /* If we have an equivalent key binding, use that. */
+ ASET (item_properties, ITEM_PROPERTY_KEYEQ, keyeq);
+ }
+
+ /* Include this when menu help is implemented.
+ tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP];
+ if (!(NILP (tem) || STRINGP (tem)))
+ {
+ tem = menu_item_eval_property (tem);
+ if (!STRINGP (tem))
+ tem = Qnil;
+ XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP] = tem;
+ }
+ */
+
+ /* Handle radio buttons or toggle boxes. */
+ tem = AREF (item_properties, ITEM_PROPERTY_SELECTED);
+ if (!NILP (tem))
+ ASET (item_properties, ITEM_PROPERTY_SELECTED,
+ menu_item_eval_property (tem));
+
+ return 1;
+}
+
+
+
+/***********************************************************************
+ Tool-bars
+ ***********************************************************************/
+
+/* A vector holding tool bar items while they are parsed in function
+ tool_bar_items. Each item occupies TOOL_BAR_ITEM_NSCLOTS elements
+ in the vector. */
+
+static Lisp_Object tool_bar_items_vector;
+
+/* A vector holding the result of parse_tool_bar_item. Layout is like
+ the one for a single item in tool_bar_items_vector. */
+
+static Lisp_Object tool_bar_item_properties;
+
+/* Next free index in tool_bar_items_vector. */
+
+static int ntool_bar_items;
+
+/* Function prototypes. */
+
+static void init_tool_bar_items (Lisp_Object);
+static void process_tool_bar_item (Lisp_Object, Lisp_Object, Lisp_Object,
+ void *);
+static bool parse_tool_bar_item (Lisp_Object, Lisp_Object);
+static void append_tool_bar_item (void);
+
+
+/* Return a vector of tool bar items for keymaps currently in effect.
+ Reuse vector REUSE if non-nil. Return in *NITEMS the number of
+ tool bar items found. */
+
+Lisp_Object
+tool_bar_items (Lisp_Object reuse, int *nitems)
+{
+ Lisp_Object *maps;
+ Lisp_Object mapsbuf[3];
+ ptrdiff_t nmaps, i;
+ Lisp_Object oquit;
+ Lisp_Object *tmaps;
+ USE_SAFE_ALLOCA;
+
+ *nitems = 0;
+
+ /* In order to build the menus, we need to call the keymap
+ accessors. They all call QUIT. But this function is called
+ during redisplay, during which a quit is fatal. So inhibit
+ quitting while building the menus. We do this instead of
+ specbind because (1) errors will clear it anyway and (2) this
+ avoids risk of specpdl overflow. */
+ oquit = Vinhibit_quit;
+ Vinhibit_quit = Qt;
+
+ /* Initialize tool_bar_items_vector and protect it from GC. */
+ init_tool_bar_items (reuse);
+
+ /* Build list of keymaps in maps. Set nmaps to the number of maps
+ to process. */
+
+ /* Should overriding-terminal-local-map and overriding-local-map apply? */
+ if (!NILP (Voverriding_local_map_menu_flag)
+ && !NILP (Voverriding_local_map))
+ {
+ /* Yes, use them (if non-nil) as well as the global map. */
+ maps = mapsbuf;
+ nmaps = 0;
+ if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map)))
+ maps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map);
+ if (!NILP (Voverriding_local_map))
+ maps[nmaps++] = Voverriding_local_map;
+ }
+ else
+ {
+ /* No, so use major and minor mode keymaps and keymap property.
+ Note that tool-bar bindings in the local-map and keymap
+ properties may not work reliable, as they are only
+ recognized when the tool-bar (or mode-line) is updated,
+ which does not normally happen after every command. */
+ Lisp_Object tem;
+ ptrdiff_t nminor;
+ nminor = current_minor_maps (NULL, &tmaps);
+ SAFE_NALLOCA (maps, 1, nminor + 4);
+ nmaps = 0;
+ tem = KVAR (current_kboard, Voverriding_terminal_local_map);
+ if (!NILP (tem) && !NILP (Voverriding_local_map_menu_flag))
+ maps[nmaps++] = tem;
+ if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
+ maps[nmaps++] = tem;
+ memcpy (maps + nmaps, tmaps, nminor * sizeof (maps[0]));
+ nmaps += nminor;
+ maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
+ }
+
+ /* Add global keymap at the end. */
+ maps[nmaps++] = current_global_map;
+
+ /* Process maps in reverse order and look up in each map the prefix
+ key `tool-bar'. */
+ for (i = nmaps - 1; i >= 0; --i)
+ if (!NILP (maps[i]))
+ {
+ Lisp_Object keymap;
+
+ keymap = get_keymap (access_keymap (maps[i], Qtool_bar, 1, 0, 1), 0, 1);
+ if (CONSP (keymap))
+ map_keymap (keymap, process_tool_bar_item, Qnil, NULL, 1);
+ }
+
+ Vinhibit_quit = oquit;
+ *nitems = ntool_bar_items / TOOL_BAR_ITEM_NSLOTS;
+ SAFE_FREE ();
+ return tool_bar_items_vector;
+}
+
+
+/* Process the definition of KEY which is DEF. */
+
+static void
+process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, void *args)
+{
+ int i;
+ struct gcpro gcpro1, gcpro2;
+
+ /* Protect KEY and DEF from GC because parse_tool_bar_item may call
+ eval. */
+ GCPRO2 (key, def);
+
+ if (EQ (def, Qundefined))
+ {
+ /* If a map has an explicit `undefined' as definition,
+ discard any previously made item. */
+ for (i = 0; i < ntool_bar_items; i += TOOL_BAR_ITEM_NSLOTS)
+ {
+ Lisp_Object *v = XVECTOR (tool_bar_items_vector)->contents + i;
+
+ if (EQ (key, v[TOOL_BAR_ITEM_KEY]))
+ {
+ if (ntool_bar_items > i + TOOL_BAR_ITEM_NSLOTS)
+ memmove (v, v + TOOL_BAR_ITEM_NSLOTS,
+ ((ntool_bar_items - i - TOOL_BAR_ITEM_NSLOTS)
+ * word_size));
+ ntool_bar_items -= TOOL_BAR_ITEM_NSLOTS;
+ break;
+ }
+ }
+ }
+ else if (parse_tool_bar_item (key, def))
+ /* Append a new tool bar item to tool_bar_items_vector. Accept
+ more than one definition for the same key. */
+ append_tool_bar_item ();
+
+ UNGCPRO;
+}
+
+/* Access slot with index IDX of vector tool_bar_item_properties. */
+#define PROP(IDX) AREF (tool_bar_item_properties, (IDX))
+static void
+set_prop (ptrdiff_t idx, Lisp_Object val)
+{
+ ASET (tool_bar_item_properties, idx, val);
+}
+
+
+/* Parse a tool bar item specification ITEM for key KEY and return the
+ result in tool_bar_item_properties. Value is false if ITEM is
+ invalid.
+
+ ITEM is a list `(menu-item CAPTION BINDING PROPS...)'.
+
+ CAPTION is the caption of the item, If it's not a string, it is
+ evaluated to get a string.
+
+ BINDING is the tool bar item's binding. Tool-bar items with keymaps
+ as binding are currently ignored.
+
+ The following properties are recognized:
+
+ - `:enable FORM'.
+
+ FORM is evaluated and specifies whether the tool bar item is
+ enabled or disabled.
+
+ - `:visible FORM'
+
+ FORM is evaluated and specifies whether the tool bar item is visible.
+
+ - `:filter FUNCTION'
+
+ FUNCTION is invoked with one parameter `(quote BINDING)'. Its
+ result is stored as the new binding.
+
+ - `:button (TYPE SELECTED)'
+
+ TYPE must be one of `:radio' or `:toggle'. SELECTED is evaluated
+ and specifies whether the button is selected (pressed) or not.
+
+ - `:image IMAGES'
+
+ IMAGES is either a single image specification or a vector of four
+ image specifications. See enum tool_bar_item_images.
+
+ - `:help HELP-STRING'.
+
+ Gives a help string to display for the tool bar item.
+
+ - `:label LABEL-STRING'.
+
+ A text label to show with the tool bar button if labels are enabled. */
+
+static bool
+parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
+{
+ Lisp_Object filter = Qnil;
+ Lisp_Object caption;
+ int i;
+ bool have_label = 0;
+
+ /* Definition looks like `(menu-item CAPTION BINDING PROPS...)'.
+ Rule out items that aren't lists, don't start with
+ `menu-item' or whose rest following `tool-bar-item' is not a
+ list. */
+ if (!CONSP (item))
+ return 0;
+
+ /* As an exception, allow old-style menu separators. */
+ if (STRINGP (XCAR (item)))
+ item = list1 (XCAR (item));
+ else if (!EQ (XCAR (item), Qmenu_item)
+ || (item = XCDR (item), !CONSP (item)))
+ return 0;
+
+ /* Create tool_bar_item_properties vector if necessary. Reset it to
+ defaults. */
+ if (VECTORP (tool_bar_item_properties))
+ {
+ for (i = 0; i < TOOL_BAR_ITEM_NSLOTS; ++i)
+ set_prop (i, Qnil);
+ }
+ else
+ tool_bar_item_properties
+ = Fmake_vector (make_number (TOOL_BAR_ITEM_NSLOTS), Qnil);
+
+ /* Set defaults. */
+ set_prop (TOOL_BAR_ITEM_KEY, key);
+ set_prop (TOOL_BAR_ITEM_ENABLED_P, Qt);
+
+ /* Get the caption of the item. If the caption is not a string,
+ evaluate it to get a string. If we don't get a string, skip this
+ item. */
+ caption = XCAR (item);
+ if (!STRINGP (caption))
+ {
+ caption = menu_item_eval_property (caption);
+ if (!STRINGP (caption))
+ return 0;
+ }
+ set_prop (TOOL_BAR_ITEM_CAPTION, caption);
+
+ /* If the rest following the caption is not a list, the menu item is
+ either a separator, or invalid. */
+ item = XCDR (item);
+ if (!CONSP (item))
+ {
+ if (menu_separator_name_p (SSDATA (caption)))
+ {
+ set_prop (TOOL_BAR_ITEM_TYPE, Qt);
+#if !defined (USE_GTK) && !defined (HAVE_NS)
+ /* If we use build_desired_tool_bar_string to render the
+ tool bar, the separator is rendered as an image. */
+ set_prop (TOOL_BAR_ITEM_IMAGES,
+ (menu_item_eval_property
+ (Vtool_bar_separator_image_expression)));
+ set_prop (TOOL_BAR_ITEM_ENABLED_P, Qnil);
+ set_prop (TOOL_BAR_ITEM_SELECTED_P, Qnil);
+ set_prop (TOOL_BAR_ITEM_CAPTION, Qnil);
+#endif
+ return 1;
+ }
+ return 0;
+ }
+
+ /* Store the binding. */
+ set_prop (TOOL_BAR_ITEM_BINDING, XCAR (item));
+ item = XCDR (item);
+
+ /* Ignore cached key binding, if any. */
+ if (CONSP (item) && CONSP (XCAR (item)))
+ item = XCDR (item);
+
+ /* Process the rest of the properties. */
+ for (; CONSP (item) && CONSP (XCDR (item)); item = XCDR (XCDR (item)))
+ {
+ Lisp_Object ikey, value;
+
+ ikey = XCAR (item);
+ value = XCAR (XCDR (item));
+
+ if (EQ (ikey, QCenable))
+ {
+ /* `:enable FORM'. */
+ if (!NILP (Venable_disabled_menus_and_buttons))
+ set_prop (TOOL_BAR_ITEM_ENABLED_P, Qt);
+ else
+ set_prop (TOOL_BAR_ITEM_ENABLED_P, value);
+ }
+ else if (EQ (ikey, QCvisible))
+ {
+ /* `:visible FORM'. If got a visible property and that
+ evaluates to nil then ignore this item. */
+ if (NILP (menu_item_eval_property (value)))
+ return 0;
+ }
+ else if (EQ (ikey, QChelp))
+ /* `:help HELP-STRING'. */
+ set_prop (TOOL_BAR_ITEM_HELP, value);
+ else if (EQ (ikey, QCvert_only))
+ /* `:vert-only t/nil'. */
+ set_prop (TOOL_BAR_ITEM_VERT_ONLY, value);
+ else if (EQ (ikey, QClabel))
+ {
+ const char *bad_label = "!!?GARBLED ITEM?!!";
+ /* `:label LABEL-STRING'. */
+ set_prop (TOOL_BAR_ITEM_LABEL,
+ STRINGP (value) ? value : build_string (bad_label));
+ have_label = 1;
+ }
+ else if (EQ (ikey, QCfilter))
+ /* ':filter FORM'. */
+ filter = value;
+ else if (EQ (ikey, QCbutton) && CONSP (value))
+ {
+ /* `:button (TYPE . SELECTED)'. */
+ Lisp_Object type, selected;
+
+ type = XCAR (value);
+ selected = XCDR (value);
+ if (EQ (type, QCtoggle) || EQ (type, QCradio))
+ {
+ set_prop (TOOL_BAR_ITEM_SELECTED_P, selected);
+ set_prop (TOOL_BAR_ITEM_TYPE, type);
+ }
+ }
+ else if (EQ (ikey, QCimage)
+ && (CONSP (value)
+ || (VECTORP (value) && ASIZE (value) == 4)))
+ /* Value is either a single image specification or a vector
+ of 4 such specifications for the different button states. */
+ set_prop (TOOL_BAR_ITEM_IMAGES, value);
+ else if (EQ (ikey, QCrtl))
+ /* ':rtl STRING' */
+ set_prop (TOOL_BAR_ITEM_RTL_IMAGE, value);
+ }
+
+
+ if (!have_label)
+ {
+ /* Try to make one from caption and key. */
+ Lisp_Object tkey = PROP (TOOL_BAR_ITEM_KEY);
+ Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION);
+ const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : "";
+ const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : "";
+ ptrdiff_t max_lbl =
+ 2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2));
+ char *buf = xmalloc (max_lbl + 1);
+ Lisp_Object new_lbl;
+ ptrdiff_t caption_len = strlen (capt);
+
+ if (caption_len <= max_lbl && capt[0] != '\0')
+ {
+ strcpy (buf, capt);
+ while (caption_len > 0 && buf[caption_len - 1] == '.')
+ caption_len--;
+ buf[caption_len] = '\0';
+ label = capt = buf;
+ }
+
+ if (strlen (label) <= max_lbl && label[0] != '\0')
+ {
+ ptrdiff_t j;
+ if (label != buf)
+ strcpy (buf, label);
+
+ for (j = 0; buf[j] != '\0'; ++j)
+ if (buf[j] == '-')
+ buf[j] = ' ';
+ label = buf;
+ }
+ else
+ label = "";
+
+ new_lbl = Fupcase_initials (build_string (label));
+ if (SCHARS (new_lbl) <= tool_bar_max_label_size)
+ set_prop (TOOL_BAR_ITEM_LABEL, new_lbl);
+ else
+ set_prop (TOOL_BAR_ITEM_LABEL, empty_unibyte_string);
+ xfree (buf);
+ }
+
+ /* If got a filter apply it on binding. */
+ if (!NILP (filter))
+ set_prop (TOOL_BAR_ITEM_BINDING,
+ (menu_item_eval_property
+ (list2 (filter,
+ list2 (Qquote,
+ PROP (TOOL_BAR_ITEM_BINDING))))));
+
+ /* See if the binding is a keymap. Give up if it is. */
+ if (CONSP (get_keymap (PROP (TOOL_BAR_ITEM_BINDING), 0, 1)))
+ return 0;
+
+ /* Enable or disable selection of item. */
+ if (!EQ (PROP (TOOL_BAR_ITEM_ENABLED_P), Qt))
+ set_prop (TOOL_BAR_ITEM_ENABLED_P,
+ menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P)));
+
+ /* Handle radio buttons or toggle boxes. */
+ if (!NILP (PROP (TOOL_BAR_ITEM_SELECTED_P)))
+ set_prop (TOOL_BAR_ITEM_SELECTED_P,
+ menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P)));
+
+ return 1;
+
+#undef PROP
+}
+
+
+/* Initialize tool_bar_items_vector. REUSE, if non-nil, is a vector
+ that can be reused. */
+
+static void
+init_tool_bar_items (Lisp_Object reuse)
+{
+ if (VECTORP (reuse))
+ tool_bar_items_vector = reuse;
+ else
+ tool_bar_items_vector = Fmake_vector (make_number (64), Qnil);
+ ntool_bar_items = 0;
+}
+
+
+/* Append parsed tool bar item properties from
+ tool_bar_item_properties */
+
+static void
+append_tool_bar_item (void)
+{
+ ptrdiff_t incr
+ = (ntool_bar_items
+ - (ASIZE (tool_bar_items_vector) - TOOL_BAR_ITEM_NSLOTS));
+
+ /* Enlarge tool_bar_items_vector if necessary. */
+ if (incr > 0)
+ tool_bar_items_vector = larger_vector (tool_bar_items_vector, incr, -1);
+
+ /* Append entries from tool_bar_item_properties to the end of
+ tool_bar_items_vector. */
+ vcopy (tool_bar_items_vector, ntool_bar_items,
+ XVECTOR (tool_bar_item_properties)->contents, TOOL_BAR_ITEM_NSLOTS);
+ ntool_bar_items += TOOL_BAR_ITEM_NSLOTS;
+}
+
+
+
+
+
+/* Read a character using menus based on the keymap MAP.
+ Return nil if there are no menus in the maps.
+ Return t if we displayed a menu but the user rejected it.
+
+ PREV_EVENT is the previous input event, or nil if we are reading
+ the first event of a key sequence.
+
+ If USED_MOUSE_MENU is non-null, set *USED_MOUSE_MENU to true
+ if we used a mouse menu to read the input, or false otherwise. If
+ USED_MOUSE_MENU is null, don't dereference it.
+
+ The prompting is done based on the prompt-string of the map
+ and the strings associated with various map elements.
+
+ This can be done with X menus or with menus put in the minibuf.
+ These are done in different ways, depending on how the input will be read.
+ Menus using X are done after auto-saving in read-char, getting the input
+ event from Fx_popup_menu; menus using the minibuf use read_char recursively
+ and do auto-saving in the inner call of read_char. */
+
+static Lisp_Object
+read_char_x_menu_prompt (Lisp_Object map,
+ Lisp_Object prev_event, bool *used_mouse_menu)
+{
+ if (used_mouse_menu)
+ *used_mouse_menu = 0;
+
+ /* Use local over global Menu maps. */
+
+ if (! menu_prompting)
+ return Qnil;
+
+ /* If we got to this point via a mouse click,
+ use a real menu for mouse selection. */
+ if (EVENT_HAS_PARAMETERS (prev_event)
+ && !EQ (XCAR (prev_event), Qmenu_bar)
+ && !EQ (XCAR (prev_event), Qtool_bar))
+ {
+ /* Display the menu and get the selection. */
+ Lisp_Object value;
+
+ value = Fx_popup_menu (prev_event, get_keymap (map, 0, 1));
+ if (CONSP (value))
+ {
+ Lisp_Object tem;
+
+ record_menu_key (XCAR (value));
+
+ /* If we got multiple events, unread all but
+ the first.
+ There is no way to prevent those unread events
+ from showing up later in last_nonmenu_event.
+ So turn symbol and integer events into lists,
+ to indicate that they came from a mouse menu,
+ so that when present in last_nonmenu_event
+ they won't confuse things. */
+ for (tem = XCDR (value); CONSP (tem); tem = XCDR (tem))
+ {
+ record_menu_key (XCAR (tem));
+ if (SYMBOLP (XCAR (tem))
+ || INTEGERP (XCAR (tem)))
+ XSETCAR (tem, Fcons (XCAR (tem), Qdisabled));
+ }
+
+ /* If we got more than one event, put all but the first
+ onto this list to be read later.
+ Return just the first event now. */
+ Vunread_command_events
+ = nconc2 (XCDR (value), Vunread_command_events);
+ value = XCAR (value);
+ }
+ else if (NILP (value))
+ value = Qt;
+ if (used_mouse_menu)
+ *used_mouse_menu = 1;
+ return value;
+ }
+ return Qnil ;
+}
+
+static Lisp_Object
+read_char_minibuf_menu_prompt (int commandflag,
+ Lisp_Object map)
+{
+ Lisp_Object name;
+ ptrdiff_t nlength;
+ /* FIXME: Use the minibuffer's frame width. */
+ ptrdiff_t width = FRAME_COLS (SELECTED_FRAME ()) - 4;
+ ptrdiff_t idx = -1;
+ bool nobindings = 1;
+ Lisp_Object rest, vector;
+ Lisp_Object prompt_strings = Qnil;
+
+ vector = Qnil;
+
+ if (! menu_prompting)
+ return Qnil;
+
+ map = get_keymap (map, 0, 1);
+ name = Fkeymap_prompt (map);
+
+ /* If we don't have any menus, just read a character normally. */
+ if (!STRINGP (name))
+ return Qnil;
+
+#define PUSH_C_STR(str, listvar) \
+ listvar = Fcons (build_unibyte_string (str), listvar)
+
+ /* Prompt string always starts with map's prompt, and a space. */
+ prompt_strings = Fcons (name, prompt_strings);
+ PUSH_C_STR (": ", prompt_strings);
+ nlength = SCHARS (name) + 2;
+
+ rest = map;
+
+ /* Present the documented bindings, a line at a time. */
+ while (1)
+ {
+ bool notfirst = 0;
+ Lisp_Object menu_strings = prompt_strings;
+ ptrdiff_t i = nlength;
+ Lisp_Object obj;
+ Lisp_Object orig_defn_macro;
+
+ /* Loop over elements of map. */
+ while (i < width)
+ {
+ Lisp_Object elt;
+
+ /* FIXME: Use map_keymap to handle new keymap formats. */
+
+ /* At end of map, wrap around if just starting,
+ or end this line if already have something on it. */
+ if (NILP (rest))
+ {
+ if (notfirst || nobindings)
+ break;
+ else
+ rest = map;
+ }
+
+ /* Look at the next element of the map. */
+ if (idx >= 0)
+ elt = AREF (vector, idx);
+ else
+ elt = Fcar_safe (rest);
+
+ if (idx < 0 && VECTORP (elt))
+ {
+ /* If we found a dense table in the keymap,
+ advanced past it, but start scanning its contents. */
+ rest = Fcdr_safe (rest);
+ vector = elt;
+ idx = 0;
+ }
+ else
+ {
+ /* An ordinary element. */
+ Lisp_Object event, tem;
+
+ if (idx < 0)
+ {
+ event = Fcar_safe (elt); /* alist */
+ elt = Fcdr_safe (elt);
+ }
+ else
+ {
+ XSETINT (event, idx); /* vector */
+ }
+
+ /* Ignore the element if it has no prompt string. */
+ if (INTEGERP (event) && parse_menu_item (elt, -1))
+ {
+ /* True if the char to type matches the string. */
+ bool char_matches;
+ Lisp_Object upcased_event, downcased_event;
+ Lisp_Object desc = Qnil;
+ Lisp_Object s
+ = AREF (item_properties, ITEM_PROPERTY_NAME);
+
+ upcased_event = Fupcase (event);
+ downcased_event = Fdowncase (event);
+ char_matches = (XINT (upcased_event) == SREF (s, 0)
+ || XINT (downcased_event) == SREF (s, 0));
+ if (! char_matches)
+ desc = Fsingle_key_description (event, Qnil);
+
+#if 0 /* It is redundant to list the equivalent key bindings because
+ the prefix is what the user has already typed. */
+ tem
+ = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ];
+ if (!NILP (tem))
+ /* Insert equivalent keybinding. */
+ s = concat2 (s, tem);
+#endif
+ tem
+ = AREF (item_properties, ITEM_PROPERTY_TYPE);
+ if (EQ (tem, QCradio) || EQ (tem, QCtoggle))
+ {
+ /* Insert button prefix. */
+ Lisp_Object selected
+ = AREF (item_properties, ITEM_PROPERTY_SELECTED);
+ AUTO_STRING (radio_yes, "(*) ");
+ AUTO_STRING (radio_no , "( ) ");
+ AUTO_STRING (check_yes, "[X] ");
+ AUTO_STRING (check_no , "[ ] ");
+ if (EQ (tem, QCradio))
+ tem = NILP (selected) ? radio_yes : radio_no;
+ else
+ tem = NILP (selected) ? check_yes : check_no;
+ s = concat2 (tem, s);
+ }
+
+
+ /* If we have room for the prompt string, add it to this line.
+ If this is the first on the line, always add it. */
+ if ((SCHARS (s) + i + 2
+ + (char_matches ? 0 : SCHARS (desc) + 3))
+ < width
+ || !notfirst)
+ {
+ ptrdiff_t thiswidth;
+
+ /* Punctuate between strings. */
+ if (notfirst)
+ {
+ PUSH_C_STR (", ", menu_strings);
+ i += 2;
+ }
+ notfirst = 1;
+ nobindings = 0;
+
+ /* If the char to type doesn't match the string's
+ first char, explicitly show what char to type. */
+ if (! char_matches)
+ {
+ /* Add as much of string as fits. */
+ thiswidth = min (SCHARS (desc), width - i);
+ menu_strings
+ = Fcons (Fsubstring (desc, make_number (0),
+ make_number (thiswidth)),
+ menu_strings);
+ i += thiswidth;
+ PUSH_C_STR (" = ", menu_strings);
+ i += 3;
+ }
+
+ /* Add as much of string as fits. */
+ thiswidth = min (SCHARS (s), width - i);
+ menu_strings
+ = Fcons (Fsubstring (s, make_number (0),
+ make_number (thiswidth)),
+ menu_strings);
+ i += thiswidth;
+ }
+ else
+ {
+ /* If this element does not fit, end the line now,
+ and save the element for the next line. */
+ PUSH_C_STR ("...", menu_strings);
+ break;
+ }
+ }
+
+ /* Move past this element. */
+ if (idx >= 0 && idx + 1 >= ASIZE (vector))
+ /* Handle reaching end of dense table. */
+ idx = -1;
+ if (idx >= 0)
+ idx++;
+ else
+ rest = Fcdr_safe (rest);
+ }
+ }
+
+ /* Prompt with that and read response. */
+ message3_nolog (apply1 (intern ("concat"), Fnreverse (menu_strings)));
+
+ /* Make believe it's not a keyboard macro in case the help char
+ is pressed. Help characters are not recorded because menu prompting
+ is not used on replay. */
+ orig_defn_macro = KVAR (current_kboard, defining_kbd_macro);
+ kset_defining_kbd_macro (current_kboard, Qnil);
+ do
+ obj = read_char (commandflag, Qnil, Qt, 0, NULL);
+ while (BUFFERP (obj));
+ kset_defining_kbd_macro (current_kboard, orig_defn_macro);
+
+ if (!INTEGERP (obj) || XINT (obj) == -2
+ || (! EQ (obj, menu_prompt_more_char)
+ && (!INTEGERP (menu_prompt_more_char)
+ || ! EQ (obj, make_number (Ctl (XINT (menu_prompt_more_char)))))))
+ {
+ if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
+ store_kbd_macro_char (obj);
+ return obj;
+ }
+ /* Help char - go round again. */
+ }
+}
+
+/* Reading key sequences. */
+
+static Lisp_Object
+follow_key (Lisp_Object keymap, Lisp_Object key)
+{
+ return access_keymap (get_keymap (keymap, 0, 1),
+ key, 1, 0, 1);
+}
+
+static Lisp_Object
+active_maps (Lisp_Object first_event)
+{
+ Lisp_Object position
+ = CONSP (first_event) ? CAR_SAFE (XCDR (first_event)) : Qnil;
+ return Fcons (Qkeymap, Fcurrent_active_maps (Qt, position));
+}
+
+/* Structure used to keep track of partial application of key remapping
+ such as Vfunction_key_map and Vkey_translation_map. */
+typedef struct keyremap
+{
+ /* This is the map originally specified for this use. */
+ Lisp_Object parent;
+ /* This is a submap reached by looking up, in PARENT,
+ the events from START to END. */
+ Lisp_Object map;
+ /* Positions [START, END) in the key sequence buffer
+ are the key that we have scanned so far.
+ Those events are the ones that we will replace
+ if PARENT maps them into a key sequence. */
+ int start, end;
+} keyremap;
+
+/* Lookup KEY in MAP.
+ MAP is a keymap mapping keys to key vectors or functions.
+ If the mapping is a function and DO_FUNCALL is true,
+ the function is called with PROMPT as parameter and its return
+ value is used as the return value of this function (after checking
+ that it is indeed a vector). */
+
+static Lisp_Object
+access_keymap_keyremap (Lisp_Object map, Lisp_Object key, Lisp_Object prompt,
+ bool do_funcall)
+{
+ Lisp_Object next;
+
+ next = access_keymap (map, key, 1, 0, 1);
+
+ /* Handle a symbol whose function definition is a keymap
+ or an array. */
+ if (SYMBOLP (next) && !NILP (Ffboundp (next))
+ && (ARRAYP (XSYMBOL (next)->function)
+ || KEYMAPP (XSYMBOL (next)->function)))
+ next = Fautoload_do_load (XSYMBOL (next)->function, next, Qnil);
+
+ /* If the keymap gives a function, not an
+ array, then call the function with one arg and use
+ its value instead. */
+ if (do_funcall && FUNCTIONP (next))
+ {
+ Lisp_Object tem;
+ tem = next;
+
+ next = call1 (next, prompt);
+ /* If the function returned something invalid,
+ barf--don't ignore it.
+ (To ignore it safely, we would need to gcpro a bunch of
+ other variables.) */
+ if (! (NILP (next) || VECTORP (next) || STRINGP (next)))
+ error ("Function %s returns invalid key sequence",
+ SSDATA (SYMBOL_NAME (tem)));
+ }
+ return next;
+}
+
+/* Do one step of the key remapping used for function-key-map and
+ key-translation-map:
+ KEYBUF is the buffer holding the input events.
+ BUFSIZE is its maximum size.
+ FKEY is a pointer to the keyremap structure to use.
+ INPUT is the index of the last element in KEYBUF.
+ DOIT if true says that the remapping can actually take place.
+ DIFF is used to return the number of keys added/removed by the remapping.
+ PARENT is the root of the keymap.
+ PROMPT is the prompt to use if the remapping happens through a function.
+ Return true if the remapping actually took place. */
+
+static bool
+keyremap_step (Lisp_Object *keybuf, int bufsize, volatile keyremap *fkey,
+ int input, bool doit, int *diff, Lisp_Object prompt)
+{
+ Lisp_Object next, key;
+
+ key = keybuf[fkey->end++];
+
+ if (KEYMAPP (fkey->parent))
+ next = access_keymap_keyremap (fkey->map, key, prompt, doit);
+ else
+ next = Qnil;
+
+ /* If keybuf[fkey->start..fkey->end] is bound in the
+ map and we're in a position to do the key remapping, replace it with
+ the binding and restart with fkey->start at the end. */
+ if ((VECTORP (next) || STRINGP (next)) && doit)
+ {
+ int len = XFASTINT (Flength (next));
+ int i;
+
+ *diff = len - (fkey->end - fkey->start);
+
+ if (bufsize - input <= *diff)
+ error ("Key sequence too long");
+
+ /* Shift the keys that follow fkey->end. */
+ if (*diff < 0)
+ for (i = fkey->end; i < input; i++)
+ keybuf[i + *diff] = keybuf[i];
+ else if (*diff > 0)
+ for (i = input - 1; i >= fkey->end; i--)
+ keybuf[i + *diff] = keybuf[i];
+ /* Overwrite the old keys with the new ones. */
+ for (i = 0; i < len; i++)
+ keybuf[fkey->start + i]
+ = Faref (next, make_number (i));
+
+ fkey->start = fkey->end += *diff;
+ fkey->map = fkey->parent;
+
+ return 1;
+ }
+
+ fkey->map = get_keymap (next, 0, 1);
+
+ /* If we no longer have a bound suffix, try a new position for
+ fkey->start. */
+ if (!CONSP (fkey->map))
+ {
+ fkey->end = ++fkey->start;
+ fkey->map = fkey->parent;
+ }
+ return 0;
+}
+
+static bool
+test_undefined (Lisp_Object binding)
+{
+ return (NILP (binding)
+ || EQ (binding, Qundefined)
+ || (SYMBOLP (binding)
+ && EQ (Fcommand_remapping (binding, Qnil, Qnil), Qundefined)));
+}
+
+/* Read a sequence of keys that ends with a non prefix character,
+ storing it in KEYBUF, a buffer of size BUFSIZE.
+ Prompt with PROMPT.
+ Return the length of the key sequence stored.
+ Return -1 if the user rejected a command menu.
+
+ Echo starting immediately unless `prompt' is 0.
+
+ If PREVENT_REDISPLAY is non-zero, avoid redisplay by calling
+ read_char with a suitable COMMANDFLAG argument.
+
+ Where a key sequence ends depends on the currently active keymaps.
+ These include any minor mode keymaps active in the current buffer,
+ the current buffer's local map, and the global map.
+
+ If a key sequence has no other bindings, we check Vfunction_key_map
+ to see if some trailing subsequence might be the beginning of a
+ function key's sequence. If so, we try to read the whole function
+ key, and substitute its symbolic name into the key sequence.
+
+ We ignore unbound `down-' mouse clicks. We turn unbound `drag-' and
+ `double-' events into similar click events, if that would make them
+ bound. We try to turn `triple-' events first into `double-' events,
+ then into clicks.
+
+ If we get a mouse click in a mode line, vertical divider, or other
+ non-text area, we treat the click as if it were prefixed by the
+ symbol denoting that area - `mode-line', `vertical-line', or
+ whatever.
+
+ If the sequence starts with a mouse click, we read the key sequence
+ with respect to the buffer clicked on, not the current buffer.
+
+ If the user switches frames in the midst of a key sequence, we put
+ off the switch-frame event until later; the next call to
+ read_char will return it.
+
+ If FIX_CURRENT_BUFFER, we restore current_buffer
+ from the selected window's buffer. */
+
+static int
+read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
+ bool dont_downcase_last, bool can_return_switch_frame,
+ bool fix_current_buffer, bool prevent_redisplay)
+{
+ ptrdiff_t count = SPECPDL_INDEX ();
+
+ /* How many keys there are in the current key sequence. */
+ int t;
+
+ /* The length of the echo buffer when we started reading, and
+ the length of this_command_keys when we started reading. */
+ ptrdiff_t echo_start IF_LINT (= 0);
+ ptrdiff_t keys_start;
+
+ Lisp_Object current_binding = Qnil;
+ Lisp_Object first_event = Qnil;
+
+ /* Index of the first key that has no binding.
+ It is useless to try fkey.start larger than that. */
+ int first_unbound;
+
+ /* If t < mock_input, then KEYBUF[t] should be read as the next
+ input key.
+
+ We use this to recover after recognizing a function key. Once we
+ realize that a suffix of the current key sequence is actually a
+ function key's escape sequence, we replace the suffix with the
+ function key's binding from Vfunction_key_map. Now keybuf
+ contains a new and different key sequence, so the echo area,
+ this_command_keys, and the submaps and defs arrays are wrong. In
+ this situation, we set mock_input to t, set t to 0, and jump to
+ restart_sequence; the loop will read keys from keybuf up until
+ mock_input, thus rebuilding the state; and then it will resume
+ reading characters from the keyboard. */
+ int mock_input = 0;
+
+ /* If the sequence is unbound in submaps[], then
+ keybuf[fkey.start..fkey.end-1] is a prefix in Vfunction_key_map,
+ and fkey.map is its binding.
+
+ These might be > t, indicating that all function key scanning
+ should hold off until t reaches them. We do this when we've just
+ recognized a function key, to avoid searching for the function
+ key's again in Vfunction_key_map. */
+ keyremap fkey;
+
+ /* Likewise, for key_translation_map and input-decode-map. */
+ keyremap keytran, indec;
+
+ /* True if we are trying to map a key by changing an upper-case
+ letter to lower case, or a shifted function key to an unshifted
+ one. */
+ bool shift_translated = 0;
+
+ /* If we receive a `switch-frame' or `select-window' event in the middle of
+ a key sequence, we put it off for later.
+ While we're reading, we keep the event here. */
+ Lisp_Object delayed_switch_frame;
+
+ Lisp_Object original_uppercase IF_LINT (= Qnil);
+ int original_uppercase_position = -1;
+
+ /* Gets around Microsoft compiler limitations. */
+ bool dummyflag = 0;
+
+ struct buffer *starting_buffer;
+
+ /* List of events for which a fake prefix key has been generated. */
+ Lisp_Object fake_prefixed_keys = Qnil;
+
+ struct gcpro gcpro1;
+
+ GCPRO1 (fake_prefixed_keys);
+ raw_keybuf_count = 0;
+
+ last_nonmenu_event = Qnil;
+
+ delayed_switch_frame = Qnil;
+
+ if (INTERACTIVE)
+ {
+ if (!NILP (prompt))
+ {
+ /* Install the string PROMPT as the beginning of the string
+ of echoing, so that it serves as a prompt for the next
+ character. */
+ kset_echo_string (current_kboard, prompt);
+ current_kboard->echo_after_prompt = SCHARS (prompt);
+ echo_now ();
+ }
+ else if (cursor_in_echo_area
+ && echo_keystrokes_p ())
+ /* This doesn't put in a dash if the echo buffer is empty, so
+ you don't always see a dash hanging out in the minibuffer. */
+ echo_dash ();
+ }
+
+ /* Record the initial state of the echo area and this_command_keys;
+ we will need to restore them if we replay a key sequence. */
+ if (INTERACTIVE)
+ echo_start = echo_length ();
+ keys_start = this_command_key_count;
+ this_single_command_key_start = keys_start;
+
+ /* We jump here when we need to reinitialize fkey and keytran; this
+ happens if we switch keyboards between rescans. */
+ replay_entire_sequence:
+
+ indec.map = indec.parent = KVAR (current_kboard, Vinput_decode_map);
+ fkey.map = fkey.parent = KVAR (current_kboard, Vlocal_function_key_map);
+ keytran.map = keytran.parent = Vkey_translation_map;
+ indec.start = indec.end = 0;
+ fkey.start = fkey.end = 0;
+ keytran.start = keytran.end = 0;
+
+ /* We jump here when the key sequence has been thoroughly changed, and
+ we need to rescan it starting from the beginning. When we jump here,
+ keybuf[0..mock_input] holds the sequence we should reread. */
+ replay_sequence:
+
+ starting_buffer = current_buffer;
+ first_unbound = bufsize + 1;
+
+ /* Build our list of keymaps.
+ If we recognize a function key and replace its escape sequence in
+ keybuf with its symbol, or if the sequence starts with a mouse
+ click and we need to switch buffers, we jump back here to rebuild
+ the initial keymaps from the current buffer. */
+ current_binding = active_maps (first_event);
+
+ /* Start from the beginning in keybuf. */
+ t = 0;
+
+ /* These are no-ops the first time through, but if we restart, they
+ revert the echo area and this_command_keys to their original state. */
+ this_command_key_count = keys_start;
+ if (INTERACTIVE && t < mock_input)
+ echo_truncate (echo_start);
+
+ /* If the best binding for the current key sequence is a keymap, or
+ we may be looking at a function key's escape sequence, keep on
+ reading. */
+ while (!NILP (current_binding)
+ /* Keep reading as long as there's a prefix binding. */
+ ? KEYMAPP (current_binding)
+ /* Don't return in the middle of a possible function key sequence,
+ if the only bindings we found were via case conversion.
+ Thus, if ESC O a has a function-key-map translation
+ and ESC o has a binding, don't return after ESC O,
+ so that we can translate ESC O plus the next character. */
+ : (/* indec.start < t || fkey.start < t || */ keytran.start < t))
+ {
+ Lisp_Object key;
+ bool used_mouse_menu = 0;
+
+ /* Where the last real key started. If we need to throw away a
+ key that has expanded into more than one element of keybuf
+ (say, a mouse click on the mode line which is being treated
+ as [mode-line (mouse-...)], then we backtrack to this point
+ of keybuf. */
+ int last_real_key_start;
+
+ /* These variables are analogous to echo_start and keys_start;
+ while those allow us to restart the entire key sequence,
+ echo_local_start and keys_local_start allow us to throw away
+ just one key. */
+ ptrdiff_t echo_local_start IF_LINT (= 0);
+ int keys_local_start;
+ Lisp_Object new_binding;
+
+ eassert (indec.end == t || (indec.end > t && indec.end <= mock_input));
+ eassert (indec.start <= indec.end);
+ eassert (fkey.start <= fkey.end);
+ eassert (keytran.start <= keytran.end);
+ /* key-translation-map is applied *after* function-key-map
+ which is itself applied *after* input-decode-map. */
+ eassert (fkey.end <= indec.start);
+ eassert (keytran.end <= fkey.start);
+
+ if (/* first_unbound < indec.start && first_unbound < fkey.start && */
+ first_unbound < keytran.start)
+ { /* The prefix upto first_unbound has no binding and has
+ no translation left to do either, so we know it's unbound.
+ If we don't stop now, we risk staying here indefinitely
+ (if the user keeps entering fkey or keytran prefixes
+ like C-c ESC ESC ESC ESC ...) */
+ int i;
+ for (i = first_unbound + 1; i < t; i++)
+ keybuf[i - first_unbound - 1] = keybuf[i];
+ mock_input = t - first_unbound - 1;
+ indec.end = indec.start -= first_unbound + 1;
+ indec.map = indec.parent;
+ fkey.end = fkey.start -= first_unbound + 1;
+ fkey.map = fkey.parent;
+ keytran.end = keytran.start -= first_unbound + 1;
+ keytran.map = keytran.parent;
+ goto replay_sequence;
+ }
+
+ if (t >= bufsize)
+ error ("Key sequence too long");
+
+ if (INTERACTIVE)
+ echo_local_start = echo_length ();
+ keys_local_start = this_command_key_count;
+
+ replay_key:
+ /* These are no-ops, unless we throw away a keystroke below and
+ jumped back up to replay_key; in that case, these restore the
+ variables to their original state, allowing us to replay the
+ loop. */
+ if (INTERACTIVE && t < mock_input)
+ echo_truncate (echo_local_start);
+ this_command_key_count = keys_local_start;
+
+ /* By default, assume each event is "real". */
+ last_real_key_start = t;
+
+ /* Does mock_input indicate that we are re-reading a key sequence? */
+ if (t < mock_input)
+ {
+ key = keybuf[t];
+ add_command_key (key);
+ if (echo_keystrokes_p ()
+ && current_kboard->immediate_echo)
+ {
+ echo_add_key (key);
+ echo_dash ();
+ }
+ }
+
+ /* If not, we should actually read a character. */
+ else
+ {
+ {
+ KBOARD *interrupted_kboard = current_kboard;
+ struct frame *interrupted_frame = SELECTED_FRAME ();
+ /* Calling read_char with COMMANDFLAG = -2 avoids
+ redisplay in read_char and its subroutines. */
+ key = read_char (prevent_redisplay ? -2 : NILP (prompt),
+ current_binding, last_nonmenu_event,
+ &used_mouse_menu, NULL);
+ if ((INTEGERP (key) && XINT (key) == -2) /* wrong_kboard_jmpbuf */
+ /* When switching to a new tty (with a new keyboard),
+ read_char returns the new buffer, rather than -2
+ (Bug#5095). This is because `terminal-init-xterm'
+ calls read-char, which eats the wrong_kboard_jmpbuf
+ return. Any better way to fix this? -- cyd */
+ || (interrupted_kboard != current_kboard))
+ {
+ bool found = 0;
+ struct kboard *k;
+
+ for (k = all_kboards; k; k = k->next_kboard)
+ if (k == interrupted_kboard)
+ found = 1;
+
+ if (!found)
+ {
+ /* Don't touch interrupted_kboard when it's been
+ deleted. */
+ delayed_switch_frame = Qnil;
+ goto replay_entire_sequence;
+ }
+
+ if (!NILP (delayed_switch_frame))
+ {
+ kset_kbd_queue
+ (interrupted_kboard,
+ Fcons (delayed_switch_frame,
+ KVAR (interrupted_kboard, kbd_queue)));
+ delayed_switch_frame = Qnil;
+ }
+
+ while (t > 0)
+ kset_kbd_queue
+ (interrupted_kboard,
+ Fcons (keybuf[--t], KVAR (interrupted_kboard, kbd_queue)));
+
+ /* If the side queue is non-empty, ensure it begins with a
+ switch-frame, so we'll replay it in the right context. */
+ if (CONSP (KVAR (interrupted_kboard, kbd_queue))
+ && (key = XCAR (KVAR (interrupted_kboard, kbd_queue)),
+ !(EVENT_HAS_PARAMETERS (key)
+ && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)),
+ Qswitch_frame))))
+ {
+ Lisp_Object frame;
+ XSETFRAME (frame, interrupted_frame);
+ kset_kbd_queue
+ (interrupted_kboard,
+ Fcons (make_lispy_switch_frame (frame),
+ KVAR (interrupted_kboard, kbd_queue)));
+ }
+ mock_input = 0;
+ goto replay_entire_sequence;
+ }
+ }
+
+ /* read_char returns t when it shows a menu and the user rejects it.
+ Just return -1. */
+ if (EQ (key, Qt))
+ {
+ unbind_to (count, Qnil);
+ UNGCPRO;
+ return -1;
+ }
+
+ /* read_char returns -1 at the end of a macro.
+ Emacs 18 handles this by returning immediately with a
+ zero, so that's what we'll do. */
+ if (INTEGERP (key) && XINT (key) == -1)
+ {
+ t = 0;
+ /* The Microsoft C compiler can't handle the goto that
+ would go here. */
+ dummyflag = 1;
+ break;
+ }
+
+ /* If the current buffer has been changed from under us, the
+ keymap may have changed, so replay the sequence. */
+ if (BUFFERP (key))
+ {
+ timer_resume_idle ();
+
+ mock_input = t;
+ /* Reset the current buffer from the selected window
+ in case something changed the former and not the latter.
+ This is to be more consistent with the behavior
+ of the command_loop_1. */
+ if (fix_current_buffer)
+ {
+ if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+ Fkill_emacs (Qnil);
+ if (XBUFFER (XWINDOW (selected_window)->contents)
+ != current_buffer)
+ Fset_buffer (XWINDOW (selected_window)->contents);
+ }
+
+ goto replay_sequence;
+ }
+
+ /* If we have a quit that was typed in another frame, and
+ quit_throw_to_read_char switched buffers,
+ replay to get the right keymap. */
+ if (INTEGERP (key)
+ && XINT (key) == quit_char
+ && current_buffer != starting_buffer)
+ {
+ GROW_RAW_KEYBUF;
+ ASET (raw_keybuf, raw_keybuf_count, key);
+ raw_keybuf_count++;
+ keybuf[t++] = key;
+ mock_input = t;
+ Vquit_flag = Qnil;
+ goto replay_sequence;
+ }
+
+ Vquit_flag = Qnil;
+
+ if (EVENT_HAS_PARAMETERS (key)
+ /* Either a `switch-frame' or a `select-window' event. */
+ && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)), Qswitch_frame))
+ {
+ /* If we're at the beginning of a key sequence, and the caller
+ says it's okay, go ahead and return this event. If we're
+ in the midst of a key sequence, delay it until the end. */
+ if (t > 0 || !can_return_switch_frame)
+ {
+ delayed_switch_frame = key;
+ goto replay_key;
+ }
+ }
+
+ if (NILP (first_event))
+ {
+ first_event = key;
+ /* Even if first_event does not specify a particular
+ window/position, it's important to recompute the maps here
+ since a long time might have passed since we entered
+ read_key_sequence, and a timer (or process-filter or
+ special-event-map, ...) might have switched the current buffer
+ or the selected window from under us in the mean time. */
+ if (fix_current_buffer
+ && (XBUFFER (XWINDOW (selected_window)->contents)
+ != current_buffer))
+ Fset_buffer (XWINDOW (selected_window)->contents);
+ current_binding = active_maps (first_event);
+ }
+
+ GROW_RAW_KEYBUF;
+ ASET (raw_keybuf, raw_keybuf_count, key);
+ raw_keybuf_count++;
+ }
+
+ /* Clicks in non-text areas get prefixed by the symbol
+ in their CHAR-ADDRESS field. For example, a click on
+ the mode line is prefixed by the symbol `mode-line'.
+
+ Furthermore, key sequences beginning with mouse clicks
+ are read using the keymaps of the buffer clicked on, not
+ the current buffer. So we may have to switch the buffer
+ here.
+
+ When we turn one event into two events, we must make sure
+ that neither of the two looks like the original--so that,
+ if we replay the events, they won't be expanded again.
+ If not for this, such reexpansion could happen either here
+ or when user programs play with this-command-keys. */
+ if (EVENT_HAS_PARAMETERS (key))
+ {
+ Lisp_Object kind = EVENT_HEAD_KIND (EVENT_HEAD (key));
+ if (EQ (kind, Qmouse_click))
+ {
+ Lisp_Object window = POSN_WINDOW (EVENT_START (key));
+ Lisp_Object posn = POSN_POSN (EVENT_START (key));
+
+ if (CONSP (posn)
+ || (!NILP (fake_prefixed_keys)
+ && !NILP (Fmemq (key, fake_prefixed_keys))))
+ {
+ /* We're looking a second time at an event for which
+ we generated a fake prefix key. Set
+ last_real_key_start appropriately. */
+ if (t > 0)
+ last_real_key_start = t - 1;
+ }
+
+ if (last_real_key_start == 0)
+ {
+ /* Key sequences beginning with mouse clicks are
+ read using the keymaps in the buffer clicked on,
+ not the current buffer. If we're at the
+ beginning of a key sequence, switch buffers. */
+ if (WINDOWP (window)
+ && BUFFERP (XWINDOW (window)->contents)
+ && XBUFFER (XWINDOW (window)->contents) != current_buffer)
+ {
+ ASET (raw_keybuf, raw_keybuf_count, key);
+ raw_keybuf_count++;
+ keybuf[t] = key;
+ mock_input = t + 1;
+
+ /* Arrange to go back to the original buffer once we're
+ done reading the key sequence. Note that we can't
+ use save_excursion_{save,restore} here, because they
+ save point as well as the current buffer; we don't
+ want to save point, because redisplay may change it,
+ to accommodate a Fset_window_start or something. We
+ don't want to do this at the top of the function,
+ because we may get input from a subprocess which
+ wants to change the selected window and stuff (say,
+ emacsclient). */
+ record_unwind_current_buffer ();
+
+ if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+ Fkill_emacs (Qnil);
+ set_buffer_internal (XBUFFER (XWINDOW (window)->contents));
+ goto replay_sequence;
+ }
+ }
+
+ /* Expand mode-line and scroll-bar events into two events:
+ use posn as a fake prefix key. */
+ if (SYMBOLP (posn)
+ && (NILP (fake_prefixed_keys)
+ || NILP (Fmemq (key, fake_prefixed_keys))))
+ {
+ if (bufsize - t <= 1)
+ error ("Key sequence too long");
+
+ keybuf[t] = posn;
+ keybuf[t + 1] = key;
+ mock_input = t + 2;
+
+ /* Record that a fake prefix key has been generated
+ for KEY. Don't modify the event; this would
+ prevent proper action when the event is pushed
+ back into unread-command-events. */
+ fake_prefixed_keys = Fcons (key, fake_prefixed_keys);
+ goto replay_key;
+ }
+ }
+ else if (CONSP (XCDR (key))
+ && CONSP (EVENT_START (key))
+ && CONSP (XCDR (EVENT_START (key))))
+ {
+ Lisp_Object posn;
+
+ posn = POSN_POSN (EVENT_START (key));
+ /* Handle menu-bar events:
+ insert the dummy prefix event `menu-bar'. */
+ if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
+ {
+ if (bufsize - t <= 1)
+ error ("Key sequence too long");
+ keybuf[t] = posn;
+ keybuf[t + 1] = key;
+
+ /* Zap the position in key, so we know that we've
+ expanded it, and don't try to do so again. */
+ POSN_SET_POSN (EVENT_START (key), list1 (posn));
+
+ mock_input = t + 2;
+ goto replay_sequence;
+ }
+ else if (CONSP (posn))
+ {
+ /* We're looking at the second event of a
+ sequence which we expanded before. Set
+ last_real_key_start appropriately. */
+ if (last_real_key_start == t && t > 0)
+ last_real_key_start = t - 1;
+ }
+ }
+ }
+
+ /* We have finally decided that KEY is something we might want
+ to look up. */
+ new_binding = follow_key (current_binding, key);
+
+ /* If KEY wasn't bound, we'll try some fallbacks. */
+ if (!NILP (new_binding))
+ /* This is needed for the following scenario:
+ event 0: a down-event that gets dropped by calling replay_key.
+ event 1: some normal prefix like C-h.
+ After event 0, first_unbound is 0, after event 1 indec.start,
+ fkey.start, and keytran.start are all 1, so when we see that
+ C-h is bound, we need to update first_unbound. */
+ first_unbound = max (t + 1, first_unbound);
+ else
+ {
+ Lisp_Object head;
+
+ /* Remember the position to put an upper bound on indec.start. */
+ first_unbound = min (t, first_unbound);
+
+ head = EVENT_HEAD (key);
+
+ if (SYMBOLP (head))
+ {
+ Lisp_Object breakdown;
+ int modifiers;
+
+ breakdown = parse_modifiers (head);
+ modifiers = XINT (XCAR (XCDR (breakdown)));
+ /* Attempt to reduce an unbound mouse event to a simpler
+ event that is bound:
+ Drags reduce to clicks.
+ Double-clicks reduce to clicks.
+ Triple-clicks reduce to double-clicks, then to clicks.
+ Down-clicks are eliminated.
+ Double-downs reduce to downs, then are eliminated.
+ Triple-downs reduce to double-downs, then to downs,
+ then are eliminated. */
+ if (modifiers & (down_modifier | drag_modifier
+ | double_modifier | triple_modifier))
+ {
+ while (modifiers & (down_modifier | drag_modifier
+ | double_modifier | triple_modifier))
+ {
+ Lisp_Object new_head, new_click;
+ if (modifiers & triple_modifier)
+ modifiers ^= (double_modifier | triple_modifier);
+ else if (modifiers & double_modifier)
+ modifiers &= ~double_modifier;
+ else if (modifiers & drag_modifier)
+ modifiers &= ~drag_modifier;
+ else
+ {
+ /* Dispose of this `down' event by simply jumping
+ back to replay_key, to get another event.
+
+ Note that if this event came from mock input,
+ then just jumping back to replay_key will just
+ hand it to us again. So we have to wipe out any
+ mock input.
+
+ We could delete keybuf[t] and shift everything
+ after that to the left by one spot, but we'd also
+ have to fix up any variable that points into
+ keybuf, and shifting isn't really necessary
+ anyway.
+
+ Adding prefixes for non-textual mouse clicks
+ creates two characters of mock input, and both
+ must be thrown away. If we're only looking at
+ the prefix now, we can just jump back to
+ replay_key. On the other hand, if we've already
+ processed the prefix, and now the actual click
+ itself is giving us trouble, then we've lost the
+ state of the keymaps we want to backtrack to, and
+ we need to replay the whole sequence to rebuild
+ it.
+
+ Beyond that, only function key expansion could
+ create more than two keys, but that should never
+ generate mouse events, so it's okay to zero
+ mock_input in that case too.
+
+ FIXME: The above paragraph seems just plain
+ wrong, if you consider things like
+ xterm-mouse-mode. -stef
+
+ Isn't this just the most wonderful code ever? */
+
+ /* If mock_input > t + 1, the above simplification
+ will actually end up dropping keys on the floor.
+ This is probably OK for now, but even
+ if mock_input <= t + 1, we need to adjust indec,
+ fkey, and keytran.
+ Typical case [header-line down-mouse-N]:
+ mock_input = 2, t = 1, fkey.end = 1,
+ last_real_key_start = 0. */
+ if (indec.end > last_real_key_start)
+ {
+ indec.end = indec.start
+ = min (last_real_key_start, indec.start);
+ indec.map = indec.parent;
+ if (fkey.end > last_real_key_start)
+ {
+ fkey.end = fkey.start
+ = min (last_real_key_start, fkey.start);
+ fkey.map = fkey.parent;
+ if (keytran.end > last_real_key_start)
+ {
+ keytran.end = keytran.start
+ = min (last_real_key_start, keytran.start);
+ keytran.map = keytran.parent;
+ }
+ }
+ }
+ if (t == last_real_key_start)
+ {
+ mock_input = 0;
+ goto replay_key;
+ }
+ else
+ {
+ mock_input = last_real_key_start;
+ goto replay_sequence;
+ }
+ }
+
+ new_head
+ = apply_modifiers (modifiers, XCAR (breakdown));
+ new_click = list2 (new_head, EVENT_START (key));
+
+ /* Look for a binding for this new key. */
+ new_binding = follow_key (current_binding, new_click);
+
+ /* If that click is bound, go for it. */
+ if (!NILP (new_binding))
+ {
+ current_binding = new_binding;
+ key = new_click;
+ break;
+ }
+ /* Otherwise, we'll leave key set to the drag event. */
+ }
+ }
+ }
+ }
+ current_binding = new_binding;
+
+ keybuf[t++] = key;
+ /* Normally, last_nonmenu_event gets the previous key we read.
+ But when a mouse popup menu is being used,
+ we don't update last_nonmenu_event; it continues to hold the mouse
+ event that preceded the first level of menu. */
+ if (!used_mouse_menu)
+ last_nonmenu_event = key;
+
+ /* Record what part of this_command_keys is the current key sequence. */
+ this_single_command_key_start = this_command_key_count - t;
+ /* When 'input-method-function' called above causes events to be
+ put on 'unread-post-input-method-events', and as result
+ 'reread' is set to 'true', the value of 't' can become larger
+ than 'this_command_key_count', because 'add_command_key' is
+ not called to update 'this_command_key_count'. If this
+ happens, 'this_single_command_key_start' will become negative
+ above, and any call to 'this-single-command-keys' will return
+ a garbled vector. See bug #20223 for one such situation.
+ Here we force 'this_single_command_key_start' to never become
+ negative, to avoid that. */
+ if (this_single_command_key_start < 0)
+ this_single_command_key_start = 0;
+
+ /* Look for this sequence in input-decode-map.
+ Scan from indec.end until we find a bound suffix. */
+ while (indec.end < t)
+ {
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+ bool done;
+ int diff;
+
+ GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+ done = keyremap_step (keybuf, bufsize, &indec, max (t, mock_input),
+ 1, &diff, prompt);
+ UNGCPRO;
+ if (done)
+ {
+ mock_input = diff + max (t, mock_input);
+ goto replay_sequence;
+ }
+ }
+
+ if (!KEYMAPP (current_binding)
+ && !test_undefined (current_binding)
+ && indec.start >= t)
+ /* There is a binding and it's not a prefix.
+ (and it doesn't have any input-decode-map translation pending).
+ There is thus no function-key in this sequence.
+ Moving fkey.start is important in this case to allow keytran.start
+ to go over the sequence before we return (since we keep the
+ invariant that keytran.end <= fkey.start). */
+ {
+ if (fkey.start < t)
+ (fkey.start = fkey.end = t, fkey.map = fkey.parent);
+ }
+ else
+ /* If the sequence is unbound, see if we can hang a function key
+ off the end of it. */
+ /* Continue scan from fkey.end until we find a bound suffix. */
+ while (fkey.end < indec.start)
+ {
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+ bool done;
+ int diff;
+
+ GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+ done = keyremap_step (keybuf, bufsize, &fkey,
+ max (t, mock_input),
+ /* If there's a binding (i.e.
+ first_binding >= nmaps) we don't want
+ to apply this function-key-mapping. */
+ fkey.end + 1 == t
+ && (test_undefined (current_binding)),
+ &diff, prompt);
+ UNGCPRO;
+ if (done)
+ {
+ mock_input = diff + max (t, mock_input);
+ /* Adjust the input-decode-map counters. */
+ indec.end += diff;
+ indec.start += diff;
+
+ goto replay_sequence;
+ }
+ }
+
+ /* Look for this sequence in key-translation-map.
+ Scan from keytran.end until we find a bound suffix. */
+ while (keytran.end < fkey.start)
+ {
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+ bool done;
+ int diff;
+
+ GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+ done = keyremap_step (keybuf, bufsize, &keytran, max (t, mock_input),
+ 1, &diff, prompt);
+ UNGCPRO;
+ if (done)
+ {
+ mock_input = diff + max (t, mock_input);
+ /* Adjust the function-key-map and input-decode-map counters. */
+ indec.end += diff;
+ indec.start += diff;
+ fkey.end += diff;
+ fkey.start += diff;
+
+ goto replay_sequence;
+ }
+ }
+
+ /* If KEY is not defined in any of the keymaps,
+ and cannot be part of a function key or translation,
+ and is an upper case letter
+ use the corresponding lower-case letter instead. */
+ if (NILP (current_binding)
+ && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
+ && INTEGERP (key)
+ && ((CHARACTERP (make_number (XINT (key) & ~CHAR_MODIFIER_MASK))
+ && uppercasep (XINT (key) & ~CHAR_MODIFIER_MASK))
+ || (XINT (key) & shift_modifier)))
+ {
+ Lisp_Object new_key;
+
+ original_uppercase = key;
+ original_uppercase_position = t - 1;
+
+ if (XINT (key) & shift_modifier)
+ XSETINT (new_key, XINT (key) & ~shift_modifier);
+ else
+ XSETINT (new_key, (downcase (XINT (key) & ~CHAR_MODIFIER_MASK)
+ | (XINT (key) & CHAR_MODIFIER_MASK)));
+
+ /* We have to do this unconditionally, regardless of whether
+ the lower-case char is defined in the keymaps, because they
+ might get translated through function-key-map. */
+ keybuf[t - 1] = new_key;
+ mock_input = max (t, mock_input);
+ shift_translated = 1;
+
+ goto replay_sequence;
+ }
+
+ if (NILP (current_binding)
+ && help_char_p (EVENT_HEAD (key)) && t > 1)
+ {
+ read_key_sequence_cmd = Vprefix_help_command;
+ /* The Microsoft C compiler can't handle the goto that
+ would go here. */
+ dummyflag = 1;
+ break;
+ }
+
+ /* If KEY is not defined in any of the keymaps,
+ and cannot be part of a function key or translation,
+ and is a shifted function key,
+ use the corresponding unshifted function key instead. */
+ if (NILP (current_binding)
+ && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t)
+ {
+ Lisp_Object breakdown = parse_modifiers (key);
+ int modifiers
+ = CONSP (breakdown) ? (XINT (XCAR (XCDR (breakdown)))) : 0;
+
+ if (modifiers & shift_modifier
+ /* Treat uppercase keys as shifted. */
+ || (INTEGERP (key)
+ && (KEY_TO_CHAR (key)
+ < XCHAR_TABLE (BVAR (current_buffer, downcase_table))->header.size)
+ && uppercasep (KEY_TO_CHAR (key))))
+ {
+ Lisp_Object new_key
+ = (modifiers & shift_modifier
+ ? apply_modifiers (modifiers & ~shift_modifier,
+ XCAR (breakdown))
+ : make_number (downcase (KEY_TO_CHAR (key)) | modifiers));
+
+ original_uppercase = key;
+ original_uppercase_position = t - 1;
+
+ /* We have to do this unconditionally, regardless of whether
+ the lower-case char is defined in the keymaps, because they
+ might get translated through function-key-map. */
+ keybuf[t - 1] = new_key;
+ mock_input = max (t, mock_input);
+ /* Reset fkey (and consequently keytran) to apply
+ function-key-map on the result, so that S-backspace is
+ correctly mapped to DEL (via backspace). OTOH,
+ input-decode-map doesn't need to go through it again. */
+ fkey.start = fkey.end = 0;
+ keytran.start = keytran.end = 0;
+ shift_translated = 1;
+
+ goto replay_sequence;
+ }
+ }
+ }
+ if (!dummyflag)
+ read_key_sequence_cmd = current_binding;
+ read_key_sequence_remapped
+ /* Remap command through active keymaps.
+ Do the remapping here, before the unbind_to so it uses the keymaps
+ of the appropriate buffer. */
+ = SYMBOLP (read_key_sequence_cmd)
+ ? Fcommand_remapping (read_key_sequence_cmd, Qnil, Qnil)
+ : Qnil;
+
+ unread_switch_frame = delayed_switch_frame;
+ unbind_to (count, Qnil);
+
+ /* Don't downcase the last character if the caller says don't.
+ Don't downcase it if the result is undefined, either. */
+ if ((dont_downcase_last || NILP (current_binding))
+ && t > 0
+ && t - 1 == original_uppercase_position)
+ {
+ keybuf[t - 1] = original_uppercase;
+ shift_translated = 0;
+ }
+
+ if (shift_translated)
+ Vthis_command_keys_shift_translated = Qt;
+
+ /* Occasionally we fabricate events, perhaps by expanding something
+ according to function-key-map, or by adding a prefix symbol to a
+ mouse click in the scroll bar or modeline. In this cases, return
+ the entire generated key sequence, even if we hit an unbound
+ prefix or a definition before the end. This means that you will
+ be able to push back the event properly, and also means that
+ read-key-sequence will always return a logical unit.
+
+ Better ideas? */
+ for (; t < mock_input; t++)
+ {
+ if (echo_keystrokes_p ())
+ echo_char (keybuf[t]);
+ add_command_key (keybuf[t]);
+ }
+
+ UNGCPRO;
+ return t;
+}
+
+static Lisp_Object
+read_key_sequence_vs (Lisp_Object prompt, Lisp_Object continue_echo,
+ Lisp_Object dont_downcase_last,
+ Lisp_Object can_return_switch_frame,
+ Lisp_Object cmd_loop, bool allow_string)
+{
+ Lisp_Object keybuf[30];
+ register int i;
+ struct gcpro gcpro1;
+ ptrdiff_t count = SPECPDL_INDEX ();
+
+ if (!NILP (prompt))
+ CHECK_STRING (prompt);
+ QUIT;
+
+ specbind (Qinput_method_exit_on_first_char,
+ (NILP (cmd_loop) ? Qt : Qnil));
+ specbind (Qinput_method_use_echo_area,
+ (NILP (cmd_loop) ? Qt : Qnil));
+
+ memset (keybuf, 0, sizeof keybuf);
+ GCPRO1 (keybuf[0]);
+ gcpro1.nvars = ARRAYELTS (keybuf);
+
+ if (NILP (continue_echo))
+ {
+ this_command_key_count = 0;
+ this_command_key_count_reset = 0;
+ this_single_command_key_start = 0;
+ }
+
+#ifdef HAVE_WINDOW_SYSTEM
+ if (display_hourglass_p)
+ cancel_hourglass ();
+#endif
+
+ i = read_key_sequence (keybuf, ARRAYELTS (keybuf),
+ prompt, ! NILP (dont_downcase_last),
+ ! NILP (can_return_switch_frame), 0, 0);
+
+#if 0 /* The following is fine for code reading a key sequence and
+ then proceeding with a lengthy computation, but it's not good
+ for code reading keys in a loop, like an input method. */
+#ifdef HAVE_WINDOW_SYSTEM
+ if (display_hourglass_p)
+ start_hourglass ();
+#endif
+#endif
+
+ if (i == -1)
+ {
+ Vquit_flag = Qt;
+ QUIT;
+ }
+ UNGCPRO;
+ return unbind_to (count,
+ ((allow_string ? make_event_array : Fvector)
+ (i, keybuf)));
+}
+
+DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
+ doc: /* Read a sequence of keystrokes and return as a string or vector.
+The sequence is sufficient to specify a non-prefix command in the
+current local and global maps.
+
+First arg PROMPT is a prompt string. If nil, do not prompt specially.
+Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
+as a continuation of the previous key.
+
+The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
+convert the last event to lower case. (Normally any upper case event
+is converted to lower case if the original event is undefined and the lower
+case equivalent is defined.) A non-nil value is appropriate for reading
+a key sequence to be defined.
+
+A C-g typed while in this function is treated like any other character,
+and `quit-flag' is not set.
+
+If the key sequence starts with a mouse click, then the sequence is read
+using the keymaps of the buffer of the window clicked in, not the buffer
+of the selected window as normal.
+
+`read-key-sequence' drops unbound button-down events, since you normally
+only care about the click or drag events which follow them. If a drag
+or multi-click event is unbound, but the corresponding click event would
+be bound, `read-key-sequence' turns the event into a click event at the
+drag's starting position. This means that you don't have to distinguish
+between click and drag, double, or triple events unless you want to.
+
+`read-key-sequence' prefixes mouse events on mode lines, the vertical
+lines separating windows, and scroll bars with imaginary keys
+`mode-line', `vertical-line', and `vertical-scroll-bar'.
+
+Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
+function will process a switch-frame event if the user switches frames
+before typing anything. If the user switches frames in the middle of a
+key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
+is nil, then the event will be put off until after the current key sequence.
+
+`read-key-sequence' checks `function-key-map' for function key
+sequences, where they wouldn't conflict with ordinary bindings. See
+`function-key-map' for more details.
+
+The optional fifth argument CMD-LOOP, if non-nil, means
+that this key sequence is being read by something that will
+read commands one after another. It should be nil if the caller
+will read just one key sequence. */)
+ (Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
+{
+ return read_key_sequence_vs (prompt, continue_echo, dont_downcase_last,
+ can_return_switch_frame, cmd_loop, true);
+}
+
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
+ Sread_key_sequence_vector, 1, 5, 0,
+ doc: /* Like `read-key-sequence' but always return a vector. */)
+ (Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
+{
+ return read_key_sequence_vs (prompt, continue_echo, dont_downcase_last,
+ can_return_switch_frame, cmd_loop, false);
+}
+
+/* Return true if input events are pending. */
+
+bool
+detect_input_pending (void)
+{
+ return input_pending || get_input_pending (0);
+}
+
+/* Return true if input events other than mouse movements are
+ pending. */
+
+bool
+detect_input_pending_ignore_squeezables (void)
+{
+ return input_pending || get_input_pending (READABLE_EVENTS_IGNORE_SQUEEZABLES);
+}
+
+/* Return true if input events are pending, and run any pending timers. */
+
+bool
+detect_input_pending_run_timers (bool do_display)
+{
+ unsigned old_timers_run = timers_run;
+
+ if (!input_pending)
+ get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW);
+
+ if (old_timers_run != timers_run && do_display)
+ redisplay_preserve_echo_area (8);
+
+ return input_pending;
+}
+
+/* This is called in some cases before a possible quit.
+ It cases the next call to detect_input_pending to recompute input_pending.
+ So calling this function unnecessarily can't do any harm. */
+
+void
+clear_input_pending (void)
+{
+ input_pending = 0;
+}
+
+/* Return true if there are pending requeued events.
+ This isn't used yet. The hope is to make wait_reading_process_output
+ call it, and return if it runs Lisp code that unreads something.
+ The problem is, kbd_buffer_get_event needs to be fixed to know what
+ to do in that case. It isn't trivial. */
+
+bool
+requeued_events_pending_p (void)
+{
+ return (!NILP (Vunread_command_events));
+}
+
+DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 1, 0,
+ doc: /* Return t if command input is currently available with no wait.
+Actually, the value is nil only if we can be sure that no input is available;
+if there is a doubt, the value is t.
+
+If CHECK-TIMERS is non-nil, timers that are ready to run will do so. */)
+ (Lisp_Object check_timers)
+{
+ if (!NILP (Vunread_command_events)
+ || !NILP (Vunread_post_input_method_events)
+ || !NILP (Vunread_input_method_events))
+ return (Qt);
+
+ /* Process non-user-visible events (Bug#10195). */
+ process_special_events ();
+
+ return (get_input_pending ((NILP (check_timers)
+ ? 0 : READABLE_EVENTS_DO_TIMERS_NOW)
+ | READABLE_EVENTS_FILTER_EVENTS)
+ ? Qt : Qnil);
+}
+
+DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 1, 0,
+ doc: /* Return vector of last few events, not counting those from keyboard macros.
+If INCLUDE-CMDS is non-nil, include the commands that were run,
+represented as events of the form (nil . COMMAND). */)
+ (Lisp_Object include_cmds)
+{
+ bool cmds = !NILP (include_cmds);
+
+ if (!total_keys
+ || (cmds && total_keys < NUM_RECENT_KEYS))
+ return Fvector (total_keys,
+ XVECTOR (recent_keys)->contents);
+ else
+ {
+ Lisp_Object es = Qnil;
+ int i = (total_keys < NUM_RECENT_KEYS
+ ? 0 : recent_keys_index);
+ eassert (recent_keys_index < NUM_RECENT_KEYS);
+ do
+ {
+ Lisp_Object e = AREF (recent_keys, i);
+ if (cmds || !CONSP (e) || !NILP (XCAR (e)))
+ es = Fcons (e, es);
+ if (++i >= NUM_RECENT_KEYS)
+ i = 0;
+ } while (i != recent_keys_index);
+ es = Fnreverse (es);
+ return Fvconcat (1, &es);
+ }
+}
+
+DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
+ doc: /* Return the key sequence that invoked this command.
+However, if the command has called `read-key-sequence', it returns
+the last key sequence that has been read.
+The value is a string or a vector.
+
+See also `this-command-keys-vector'. */)
+ (void)
+{
+ return make_event_array (this_command_key_count,
+ XVECTOR (this_command_keys)->contents);
+}
+
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector, Sthis_command_keys_vector, 0, 0, 0,
+ doc: /* Return the key sequence that invoked this command, as a vector.
+However, if the command has called `read-key-sequence', it returns
+the last key sequence that has been read.
+
+See also `this-command-keys'. */)
+ (void)
+{
+ return Fvector (this_command_key_count,
+ XVECTOR (this_command_keys)->contents);
+}
+
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,
+ Sthis_single_command_keys, 0, 0, 0,
+ doc: /* Return the key sequence that invoked this command.
+More generally, it returns the last key sequence read, either by
+the command loop or by `read-key-sequence'.
+Unlike `this-command-keys', this function's value
+does not include prefix arguments.
+The value is always a vector. */)
+ (void)
+{
+ return Fvector (this_command_key_count
+ - this_single_command_key_start,
+ (XVECTOR (this_command_keys)->contents
+ + this_single_command_key_start));
+}
+
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,
+ Sthis_single_command_raw_keys, 0, 0, 0,
+ doc: /* Return the raw events that were read for this command.
+More generally, it returns the last key sequence read, either by
+the command loop or by `read-key-sequence'.
+Unlike `this-single-command-keys', this function's value
+shows the events before all translations (except for input methods).
+The value is always a vector. */)
+ (void)
+{
+ return Fvector (raw_keybuf_count, XVECTOR (raw_keybuf)->contents);
+}
+
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,
+ Sreset_this_command_lengths, 0, 0, 0,
+ doc: /* Make the unread events replace the last command and echo.
+Used in `universal-argument-other-key'.
+
+`universal-argument-other-key' rereads the event just typed.
+It then gets translated through `function-key-map'.
+The translated event has to replace the real events,
+both in the value of (this-command-keys) and in echoing.
+To achieve this, `universal-argument-other-key' calls
+`reset-this-command-lengths', which discards the record of reading
+these events the first time. */)
+ (void)
+{
+ this_command_key_count = before_command_key_count;
+ if (this_command_key_count < this_single_command_key_start)
+ this_single_command_key_start = this_command_key_count;
+
+ echo_truncate (before_command_echo_length);
+
+ /* Cause whatever we put into unread-command-events
+ to echo as if it were being freshly read from the keyboard. */
+ this_command_key_count_reset = 1;
+
+ return Qnil;
+}
+
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,
+ Sclear_this_command_keys, 0, 1, 0,
+ doc: /* Clear out the vector that `this-command-keys' returns.
+Also clear the record of the last 100 events, unless optional arg
+KEEP-RECORD is non-nil. */)
+ (Lisp_Object keep_record)
+{
+ int i;
+
+ this_command_key_count = 0;
+ this_command_key_count_reset = 0;
+
+ if (NILP (keep_record))
+ {
+ for (i = 0; i < ASIZE (recent_keys); ++i)
+ ASET (recent_keys, i, Qnil);
+ total_keys = 0;
+ recent_keys_index = 0;
+ }
+ return Qnil;
+}
+
+DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
+ doc: /* Return the current depth in recursive edits. */)
+ (void)
+{
+ Lisp_Object temp;
+ /* Wrap around reliably on integer overflow. */
+ EMACS_INT sum = (command_loop_level & INTMASK) + (minibuf_level & INTMASK);
+ XSETINT (temp, sum);
+ return temp;
+}
+
+DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
+ "FOpen dribble file: ",
+ doc: /* Start writing all keyboard characters to a dribble file called FILE.
+If FILE is nil, close any open dribble file.
+The file will be closed when Emacs exits.
+
+Be aware that this records ALL characters you type!
+This may include sensitive information such as passwords. */)
+ (Lisp_Object file)
+{
+ if (dribble)
+ {
+ block_input ();
+ fclose (dribble);
+ unblock_input ();
+ dribble = 0;
+ }
+ if (!NILP (file))
+ {
+ int fd;
+ Lisp_Object encfile;
+
+ file = Fexpand_file_name (file, Qnil);
+ encfile = ENCODE_FILE (file);
+ fd = emacs_open (SSDATA (encfile), O_WRONLY | O_CREAT | O_EXCL, 0600);
+ if (fd < 0 && errno == EEXIST && unlink (SSDATA (encfile)) == 0)
+ fd = emacs_open (SSDATA (encfile), O_WRONLY | O_CREAT | O_EXCL, 0600);
+ dribble = fd < 0 ? 0 : fdopen (fd, "w");
+ if (dribble == 0)
+ report_file_error ("Opening dribble", file);
+ }
+ return Qnil;
+}
+
+DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
+ doc: /* Discard the contents of the terminal input buffer.
+Also end any kbd macro being defined. */)
+ (void)
+{
+ if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
+ {
+ /* Discard the last command from the macro. */
+ Fcancel_kbd_macro_events ();
+ end_kbd_macro ();
+ }
+
+ Vunread_command_events = Qnil;
+
+ discard_tty_input ();
+
+ kbd_fetch_ptr = kbd_store_ptr;
+ input_pending = 0;
+
+ return Qnil;
+}
+
+DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
+ doc: /* Stop Emacs and return to superior process. You can resume later.
+If `cannot-suspend' is non-nil, or if the system doesn't support job
+control, run a subshell instead.
+
+If optional arg STUFFSTRING is non-nil, its characters are stuffed
+to be read as terminal input by Emacs's parent, after suspension.
+
+Before suspending, run the normal hook `suspend-hook'.
+After resumption run the normal hook `suspend-resume-hook'.
+
+Some operating systems cannot stop the Emacs process and resume it later.
+On such systems, Emacs starts a subshell instead of suspending. */)
+ (Lisp_Object stuffstring)
+{
+ ptrdiff_t count = SPECPDL_INDEX ();
+ int old_height, old_width;
+ int width, height;
+ struct gcpro gcpro1;
+
+ if (tty_list && tty_list->next)
+ error ("There are other tty frames open; close them before suspending Emacs");
+
+ if (!NILP (stuffstring))
+ CHECK_STRING (stuffstring);
+
+ run_hook (intern ("suspend-hook"));
+
+ GCPRO1 (stuffstring);
+ get_tty_size (fileno (CURTTY ()->input), &old_width, &old_height);
+ reset_all_sys_modes ();
+ /* sys_suspend can get an error if it tries to fork a subshell
+ and the system resources aren't available for that. */
+ record_unwind_protect_void (init_all_sys_modes);
+ stuff_buffered_input (stuffstring);
+ if (cannot_suspend)
+ sys_subshell ();
+ else
+ sys_suspend ();
+ unbind_to (count, Qnil);
+
+ /* Check if terminal/window size has changed.
+ Note that this is not useful when we are running directly
+ with a window system; but suspend should be disabled in that case. */
+ get_tty_size (fileno (CURTTY ()->input), &width, &height);
+ if (width != old_width || height != old_height)
+ change_frame_size (SELECTED_FRAME (), width,
+ height - FRAME_MENU_BAR_LINES (SELECTED_FRAME ()),
+ 0, 0, 0, 0);
+
+ run_hook (intern ("suspend-resume-hook"));
+
+ UNGCPRO;
+ return Qnil;
+}
+
+/* If STUFFSTRING is a string, stuff its contents as pending terminal input.
+ Then in any case stuff anything Emacs has read ahead and not used. */
+
+void
+stuff_buffered_input (Lisp_Object stuffstring)
+{
+#ifdef SIGTSTP /* stuff_char is defined if SIGTSTP. */
+ register unsigned char *p;
+
+ if (STRINGP (stuffstring))
+ {
+ register ptrdiff_t count;
+
+ p = SDATA (stuffstring);
+ count = SBYTES (stuffstring);
+ while (count-- > 0)
+ stuff_char (*p++);
+ stuff_char ('\n');
+ }
+
+ /* Anything we have read ahead, put back for the shell to read. */
+ /* ?? What should this do when we have multiple keyboards??
+ Should we ignore anything that was typed in at the "wrong" kboard?
+
+ rms: we should stuff everything back into the kboard
+ it came from. */
+ for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
+ {
+
+ if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
+ kbd_fetch_ptr = kbd_buffer;
+ if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
+ stuff_char (kbd_fetch_ptr->code);
+
+ clear_event (kbd_fetch_ptr);
+ }
+
+ input_pending = 0;
+#endif /* SIGTSTP */
+}
+
+void
+set_waiting_for_input (struct timespec *time_to_clear)
+{
+ input_available_clear_time = time_to_clear;
+
+ /* Tell handle_interrupt to throw back to read_char, */
+ waiting_for_input = 1;
+
+ /* If handle_interrupt was called before and buffered a C-g,
+ make it run again now, to avoid timing error. */
+ if (!NILP (Vquit_flag))
+ quit_throw_to_read_char (0);
+}
+
+void
+clear_waiting_for_input (void)
+{
+ /* Tell handle_interrupt not to throw back to read_char, */
+ waiting_for_input = 0;
+ input_available_clear_time = 0;
+}
+
+/* The SIGINT handler.
+
+ If we have a frame on the controlling tty, we assume that the
+ SIGINT was generated by C-g, so we call handle_interrupt.
+ Otherwise, tell QUIT to kill Emacs. */
+
+static void
+handle_interrupt_signal (int sig)
+{
+ /* See if we have an active terminal on our controlling tty. */
+ struct terminal *terminal = get_named_terminal ("/dev/tty");
+ if (!terminal)
+ {
+ /* If there are no frames there, let's pretend that we are a
+ well-behaving UN*X program and quit. We must not call Lisp
+ in a signal handler, so tell QUIT to exit when it is
+ safe. */
+ Vquit_flag = Qkill_emacs;
+ }
+ else
+ {
+ /* Otherwise, the SIGINT was probably generated by C-g. */
+
+ /* Set internal_last_event_frame to the top frame of the
+ controlling tty, if we have a frame there. We disable the
+ interrupt key on secondary ttys, so the SIGINT must have come
+ from the controlling tty. */
+ internal_last_event_frame = terminal->display_info.tty->top_frame;
+
+ handle_interrupt (1);
+ }
+}
+
+static void
+deliver_interrupt_signal (int sig)
+{
+ deliver_process_signal (sig, handle_interrupt_signal);
+}
+
+
+/* If Emacs is stuck because `inhibit-quit' is true, then keep track
+ of the number of times C-g has been requested. If C-g is pressed
+ enough times, then quit anyway. See bug#6585. */
+static int volatile force_quit_count;
+
+/* This routine is called at interrupt level in response to C-g.
+
+ It is called from the SIGINT handler or kbd_buffer_store_event.
+
+ If `waiting_for_input' is non zero, then unless `echoing' is
+ nonzero, immediately throw back to read_char.
+
+ Otherwise it sets the Lisp variable quit-flag not-nil. This causes
+ eval to throw, when it gets a chance. If quit-flag is already
+ non-nil, it stops the job right away. */
+
+static void
+handle_interrupt (bool in_signal_handler)
+{
+ char c;
+
+ cancel_echoing ();
+
+ /* XXX This code needs to be revised for multi-tty support. */
+ if (!NILP (Vquit_flag) && get_named_terminal ("/dev/tty"))
+ {
+ if (! in_signal_handler)
+ {
+ /* If SIGINT isn't blocked, don't let us be interrupted by
+ a SIGINT. It might be harmful due to non-reentrancy
+ in I/O functions. */
+ sigset_t blocked;
+ sigemptyset (&blocked);
+ sigaddset (&blocked, SIGINT);
+ pthread_sigmask (SIG_BLOCK, &blocked, 0);
+ }
+
+ fflush (stdout);
+ reset_all_sys_modes ();
+
+#ifdef SIGTSTP
+/*
+ * On systems which can suspend the current process and return to the original
+ * shell, this command causes the user to end up back at the shell.
+ * The "Auto-save" and "Abort" questions are not asked until
+ * the user elects to return to emacs, at which point he can save the current
+ * job and either dump core or continue.
+ */
+ sys_suspend ();
+#else
+ /* Perhaps should really fork an inferior shell?
+ But that would not provide any way to get back
+ to the original shell, ever. */
+ printf ("No support for stopping a process on this operating system;\n");
+ printf ("you can continue or abort.\n");
+#endif /* not SIGTSTP */
+#ifdef MSDOS
+ /* We must remain inside the screen area when the internal terminal
+ is used. Note that [Enter] is not echoed by dos. */
+ cursor_to (SELECTED_FRAME (), 0, 0);
+#endif
+ /* It doesn't work to autosave while GC is in progress;
+ the code used for auto-saving doesn't cope with the mark bit. */
+ if (!gc_in_progress)
+ {
+ printf ("Auto-save? (y or n) ");
+ fflush (stdout);
+ if (((c = getchar ()) & ~040) == 'Y')
+ {
+ Fdo_auto_save (Qt, Qnil);
+#ifdef MSDOS
+ printf ("\r\nAuto-save done");
+#else /* not MSDOS */
+ printf ("Auto-save done\n");
+#endif /* not MSDOS */
+ }
+ while (c != '\n') c = getchar ();
+ }
+ else
+ {
+ /* During GC, it must be safe to reenable quitting again. */
+ Vinhibit_quit = Qnil;
+#ifdef MSDOS
+ printf ("\r\n");
+#endif /* not MSDOS */
+ printf ("Garbage collection in progress; cannot auto-save now\r\n");
+ printf ("but will instead do a real quit after garbage collection ends\r\n");
+ fflush (stdout);
+ }
+
+#ifdef MSDOS
+ printf ("\r\nAbort? (y or n) ");
+#else /* not MSDOS */
+ printf ("Abort (and dump core)? (y or n) ");
+#endif /* not MSDOS */
+ fflush (stdout);
+ if (((c = getchar ()) & ~040) == 'Y')
+ emacs_abort ();
+ while (c != '\n') c = getchar ();
+#ifdef MSDOS
+ printf ("\r\nContinuing...\r\n");
+#else /* not MSDOS */
+ printf ("Continuing...\n");
+#endif /* not MSDOS */
+ fflush (stdout);
+ init_all_sys_modes ();
+ }
+ else
+ {
+ /* If executing a function that wants to be interrupted out of
+ and the user has not deferred quitting by binding `inhibit-quit'
+ then quit right away. */
+ if (immediate_quit && NILP (Vinhibit_quit))
+ {
+ struct gl_state_s saved;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+ immediate_quit = 0;
+ pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+ saved = gl_state;
+ GCPRO4 (saved.object, saved.global_code,
+ saved.current_syntax_table, saved.old_prop);
+ Fsignal (Qquit, Qnil);
+ gl_state = saved;
+ UNGCPRO;
+ }
+ else
+ { /* Else request quit when it's safe. */
+ int count = NILP (Vquit_flag) ? 1 : force_quit_count + 1;
+ force_quit_count = count;
+ if (count == 3)
+ {
+ immediate_quit = 1;
+ Vinhibit_quit = Qnil;
+ }
+ Vquit_flag = Qt;
+ }
+ }
+
+ pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+
+/* TODO: The longjmp in this call throws the NS event loop integration off,
+ and it seems to do fine without this. Probably some attention
+ needs to be paid to the setting of waiting_for_input in
+ wait_reading_process_output() under HAVE_NS because of the call
+ to ns_select there (needed because otherwise events aren't picked up
+ outside of polling since we don't get SIGIO like X and we don't have a
+ separate event loop thread like W32. */
+#ifndef HAVE_NS
+ if (waiting_for_input && !echoing)
+ quit_throw_to_read_char (in_signal_handler);
+#endif
+}
+
+/* Handle a C-g by making read_char return C-g. */
+
+static void
+quit_throw_to_read_char (bool from_signal)
+{
+ /* When not called from a signal handler it is safe to call
+ Lisp. */
+ if (!from_signal && EQ (Vquit_flag, Qkill_emacs))
+ Fkill_emacs (Qnil);
+
+ /* Prevent another signal from doing this before we finish. */
+ clear_waiting_for_input ();
+ input_pending = 0;
+
+ Vunread_command_events = Qnil;
+
+ if (FRAMEP (internal_last_event_frame)
+ && !EQ (internal_last_event_frame, selected_frame))
+ do_switch_frame (make_lispy_switch_frame (internal_last_event_frame),
+ 0, 0, Qnil);
+
+ sys_longjmp (getcjmp, 1);
+}
+
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,
+ Sset_input_interrupt_mode, 1, 1, 0,
+ doc: /* Set interrupt mode of reading keyboard input.
+If INTERRUPT is non-nil, Emacs will use input interrupts;
+otherwise Emacs uses CBREAK mode.
+
+See also `current-input-mode'. */)
+ (Lisp_Object interrupt)
+{
+ bool new_interrupt_input;
+#ifdef USABLE_SIGIO
+#ifdef HAVE_X_WINDOWS
+ if (x_display_list != NULL)
+ {
+ /* When using X, don't give the user a real choice,
+ because we haven't implemented the mechanisms to support it. */
+ new_interrupt_input = 1;
+ }
+ else
+#endif /* HAVE_X_WINDOWS */
+ new_interrupt_input = !NILP (interrupt);
+#else /* not USABLE_SIGIO */
+ new_interrupt_input = 0;
+#endif /* not USABLE_SIGIO */
+
+ if (new_interrupt_input != interrupt_input)
+ {
+#ifdef POLL_FOR_INPUT
+ stop_polling ();
+#endif
+#ifndef DOS_NT
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_all_sys_modes ();
+ interrupt_input = new_interrupt_input;
+ init_all_sys_modes ();
+#else
+ interrupt_input = new_interrupt_input;
+#endif
+
+#ifdef POLL_FOR_INPUT
+ poll_suppress_count = 1;
+ start_polling ();
+#endif
+ }
+ return Qnil;
+}
+
+DEFUN ("set-output-flow-control", Fset_output_flow_control, Sset_output_flow_control, 1, 2, 0,
+ doc: /* Enable or disable ^S/^Q flow control for output to TERMINAL.
+If FLOW is non-nil, flow control is enabled and you cannot use C-s or
+C-q in key sequences.
+
+This setting only has an effect on tty terminals and only when
+Emacs reads input in CBREAK mode; see `set-input-interrupt-mode'.
+
+See also `current-input-mode'. */)
+ (Lisp_Object flow, Lisp_Object terminal)
+{
+ struct terminal *t = decode_tty_terminal (terminal);
+ struct tty_display_info *tty;
+
+ if (!t)
+ return Qnil;
+ tty = t->display_info.tty;
+
+ if (tty->flow_control != !NILP (flow))
+ {
+#ifndef DOS_NT
+ /* This causes startup screen to be restored and messes with the mouse. */
+ reset_sys_modes (tty);
+#endif
+
+ tty->flow_control = !NILP (flow);
+
+#ifndef DOS_NT
+ init_sys_modes (tty);
+#endif
+ }
+ return Qnil;
+}
+
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode, Sset_input_meta_mode, 1, 2, 0,
+ doc: /* Enable or disable 8-bit input on TERMINAL.
+If META is t, Emacs will accept 8-bit input, and interpret the 8th
+bit as the Meta modifier.
+
+If META is nil, Emacs will ignore the top bit, on the assumption it is
+parity.
+
+Otherwise, Emacs will accept and pass through 8-bit input without
+specially interpreting the top bit.
+
+This setting only has an effect on tty terminal devices.
+
+Optional parameter TERMINAL specifies the tty terminal device to use.
+It may be a terminal object, a frame, or nil for the terminal used by
+the currently selected frame.
+
+See also `current-input-mode'. */)
+ (Lisp_Object meta, Lisp_Object terminal)
+{
+ struct terminal *t = decode_tty_terminal (terminal);
+ struct tty_display_info *tty;
+ int new_meta;
+
+ if (!t)
+ return Qnil;
+ tty = t->display_info.tty;
+
+ if (NILP (meta))
+ new_meta = 0;
+ else if (EQ (meta, Qt))
+ new_meta = 1;
+ else
+ new_meta = 2;
+
+ if (tty->meta_key != new_meta)
+ {
+#ifndef DOS_NT
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_sys_modes (tty);
+#endif
+
+ tty->meta_key = new_meta;
+
+#ifndef DOS_NT
+ init_sys_modes (tty);
+#endif
+ }
+ return Qnil;
+}
+
+DEFUN ("set-quit-char", Fset_quit_char, Sset_quit_char, 1, 1, 0,
+ doc: /* Specify character used for quitting.
+QUIT must be an ASCII character.
+
+This function only has an effect on the controlling tty of the Emacs
+process.
+
+See also `current-input-mode'. */)
+ (Lisp_Object quit)
+{
+ struct terminal *t = get_named_terminal ("/dev/tty");
+ struct tty_display_info *tty;
+
+ if (!t)
+ return Qnil;
+ tty = t->display_info.tty;
+
+ if (NILP (quit) || !INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400)
+ error ("QUIT must be an ASCII character");
+
+#ifndef DOS_NT
+ /* this causes startup screen to be restored and messes with the mouse */
+ reset_sys_modes (tty);
+#endif
+
+ /* Don't let this value be out of range. */
+ quit_char = XINT (quit) & (tty->meta_key == 0 ? 0177 : 0377);
+
+#ifndef DOS_NT
+ init_sys_modes (tty);
+#endif
+
+ return Qnil;
+}
+
+DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
+ doc: /* Set mode of reading keyboard input.
+First arg INTERRUPT non-nil means use input interrupts;
+ nil means use CBREAK mode.
+Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
+ (no effect except in CBREAK mode).
+Third arg META t means accept 8-bit input (for a Meta key).
+ META nil means ignore the top bit, on the assumption it is parity.
+ Otherwise, accept 8-bit input and don't use the top bit for Meta.
+Optional fourth arg QUIT if non-nil specifies character to use for quitting.
+See also `current-input-mode'. */)
+ (Lisp_Object interrupt, Lisp_Object flow, Lisp_Object meta, Lisp_Object quit)
+{
+ Fset_input_interrupt_mode (interrupt);
+ Fset_output_flow_control (flow, Qnil);
+ Fset_input_meta_mode (meta, Qnil);
+ if (!NILP (quit))
+ Fset_quit_char (quit);
+ return Qnil;
+}
+
+DEFUN ("current-input-mode", Fcurrent_input_mode, Scurrent_input_mode, 0, 0, 0,
+ doc: /* Return information about the way Emacs currently reads keyboard input.
+The value is a list of the form (INTERRUPT FLOW META QUIT), where
+ INTERRUPT is non-nil if Emacs is using interrupt-driven input; if
+ nil, Emacs is using CBREAK mode.
+ FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
+ terminal; this does not apply if Emacs uses interrupt-driven input.
+ META is t if accepting 8-bit input with 8th bit as Meta flag.
+ META nil means ignoring the top bit, on the assumption it is parity.
+ META is neither t nor nil if accepting 8-bit input and using
+ all 8 bits as the character code.
+ QUIT is the character Emacs currently uses to quit.
+The elements of this list correspond to the arguments of
+`set-input-mode'. */)
+ (void)
+{
+ struct frame *sf = XFRAME (selected_frame);
+
+ Lisp_Object interrupt = interrupt_input ? Qt : Qnil;
+ Lisp_Object flow, meta;
+ if (FRAME_TERMCAP_P (sf) || FRAME_MSDOS_P (sf))
+ {
+ flow = FRAME_TTY (sf)->flow_control ? Qt : Qnil;
+ meta = (FRAME_TTY (sf)->meta_key == 2
+ ? make_number (0)
+ : (CURTTY ()->meta_key == 1 ? Qt : Qnil));
+ }
+ else
+ {
+ flow = Qnil;
+ meta = Qt;
+ }
+ Lisp_Object quit = make_number (quit_char);
+
+ return list4 (interrupt, flow, meta, quit);
+}
+
+DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, 2, 4, 0,
+ doc: /* Return position information for pixel coordinates X and Y.
+By default, X and Y are relative to text area of the selected window.
+Optional third arg FRAME-OR-WINDOW non-nil specifies frame or window.
+If optional fourth arg WHOLE is non-nil, X is relative to the left
+edge of the window.
+
+The return value is similar to a mouse click position:
+ (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
+ IMAGE (DX . DY) (WIDTH . HEIGHT))
+The `posn-' functions access elements of such lists. */)
+ (Lisp_Object x, Lisp_Object y, Lisp_Object frame_or_window, Lisp_Object whole)
+{
+ CHECK_NATNUM (x);
+ CHECK_NATNUM (y);
+
+ if (NILP (frame_or_window))
+ frame_or_window = selected_window;
+
+ if (WINDOWP (frame_or_window))
+ {
+ struct window *w = decode_live_window (frame_or_window);
+
+ XSETINT (x, (XINT (x)
+ + WINDOW_LEFT_EDGE_X (w)
+ + (NILP (whole)
+ ? window_box_left_offset (w, TEXT_AREA)
+ : 0)));
+ XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
+ frame_or_window = w->frame;
+ }
+
+ CHECK_LIVE_FRAME (frame_or_window);
+
+ return make_lispy_position (XFRAME (frame_or_window), x, y, 0);
+}
+
+DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0,
+ doc: /* Return position information for buffer POS in WINDOW.
+POS defaults to point in WINDOW; WINDOW defaults to the selected window.
+
+Return nil if position is not visible in window. Otherwise,
+the return value is similar to that returned by `event-start' for
+a mouse click at the upper left corner of the glyph corresponding
+to the given buffer position:
+ (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
+ IMAGE (DX . DY) (WIDTH . HEIGHT))
+The `posn-' functions access elements of such lists. */)
+ (Lisp_Object pos, Lisp_Object window)
+{
+ Lisp_Object tem;
+
+ if (NILP (window))
+ window = selected_window;
+
+ tem = Fpos_visible_in_window_p (pos, window, Qt);
+ if (!NILP (tem))
+ {
+ Lisp_Object x = XCAR (tem);
+ Lisp_Object y = XCAR (XCDR (tem));
+
+ /* Point invisible due to hscrolling? */
+ if (XINT (x) < 0)
+ return Qnil;
+ tem = Fposn_at_x_y (x, y, window, Qnil);
+ }
+
+ return tem;
+}
+
+/* Set up a new kboard object with reasonable initial values.
+ TYPE is a window system for which this keyboard is used. */
+
+static void
+init_kboard (KBOARD *kb, Lisp_Object type)
+{
+ kset_overriding_terminal_local_map (kb, Qnil);
+ kset_last_command (kb, Qnil);
+ kset_real_last_command (kb, Qnil);
+ kset_keyboard_translate_table (kb, Qnil);
+ kset_last_repeatable_command (kb, Qnil);
+ kset_prefix_arg (kb, Qnil);
+ kset_last_prefix_arg (kb, Qnil);
+ kset_kbd_queue (kb, Qnil);
+ kb->kbd_queue_has_data = 0;
+ kb->immediate_echo = 0;
+ kset_echo_string (kb, Qnil);
+ kb->echo_after_prompt = -1;
+ kb->kbd_macro_buffer = 0;
+ kb->kbd_macro_bufsize = 0;
+ kset_defining_kbd_macro (kb, Qnil);
+ kset_last_kbd_macro (kb, Qnil);
+ kb->reference_count = 0;
+ kset_system_key_alist (kb, Qnil);
+ kset_system_key_syms (kb, Qnil);
+ kset_window_system (kb, type);
+ kset_input_decode_map (kb, Fmake_sparse_keymap (Qnil));
+ kset_local_function_key_map (kb, Fmake_sparse_keymap (Qnil));
+ Fset_keymap_parent (KVAR (kb, Vlocal_function_key_map), Vfunction_key_map);
+ kset_default_minibuffer_frame (kb, Qnil);
+}
+
+/* Allocate and basically initialize keyboard
+ object to use with window system TYPE. */
+
+KBOARD *
+allocate_kboard (Lisp_Object type)
+{
+ KBOARD *kb = xmalloc (sizeof *kb);
+
+ init_kboard (kb, type);
+ kb->next_kboard = all_kboards;
+ all_kboards = kb;
+ return kb;
+}
+
+/*
+ * Destroy the contents of a kboard object, but not the object itself.
+ * We use this just before deleting it, or if we're going to initialize
+ * it a second time.
+ */
+static void
+wipe_kboard (KBOARD *kb)
+{
+ xfree (kb->kbd_macro_buffer);
+}
+
+/* Free KB and memory referenced from it. */
+
+void
+delete_kboard (KBOARD *kb)
+{
+ KBOARD **kbp;
+
+ for (kbp = &all_kboards; *kbp != kb; kbp = &(*kbp)->next_kboard)
+ if (*kbp == NULL)
+ emacs_abort ();
+ *kbp = kb->next_kboard;
+
+ /* Prevent a dangling reference to KB. */
+ if (kb == current_kboard
+ && FRAMEP (selected_frame)
+ && FRAME_LIVE_P (XFRAME (selected_frame)))
+ {
+ current_kboard = FRAME_KBOARD (XFRAME (selected_frame));
+ single_kboard = 0;
+ if (current_kboard == kb)
+ emacs_abort ();
+ }
+
+ wipe_kboard (kb);
+ xfree (kb);
+}
+
+void
+init_keyboard (void)
+{
+ /* This is correct before outermost invocation of the editor loop. */
+ command_loop_level = -1;
+ immediate_quit = 0;
+ quit_char = Ctl ('g');
+ Vunread_command_events = Qnil;
+ timer_idleness_start_time = invalid_timespec ();
+ total_keys = 0;
+ recent_keys_index = 0;
+ kbd_fetch_ptr = kbd_buffer;
+ kbd_store_ptr = kbd_buffer;
+ do_mouse_tracking = Qnil;
+ input_pending = 0;
+ interrupt_input_blocked = 0;
+ pending_signals = 0;
+
+ /* This means that command_loop_1 won't try to select anything the first
+ time through. */
+ internal_last_event_frame = Qnil;
+ Vlast_event_frame = internal_last_event_frame;
+
+ current_kboard = initial_kboard;
+ /* Re-initialize the keyboard again. */
+ wipe_kboard (current_kboard);
+ /* A value of nil for Vwindow_system normally means a tty, but we also use
+ it for the initial terminal since there is no window system there. */
+ init_kboard (current_kboard, Qnil);
+
+ if (!noninteractive)
+ {
+ /* Before multi-tty support, these handlers used to be installed
+ only if the current session was a tty session. Now an Emacs
+ session may have multiple display types, so we always handle
+ SIGINT. There is special code in handle_interrupt_signal to exit
+ Emacs on SIGINT when there are no termcap frames on the
+ controlling terminal. */
+ struct sigaction action;
+ emacs_sigaction_init (&action, deliver_interrupt_signal);
+ sigaction (SIGINT, &action, 0);
+#ifndef DOS_NT
+ /* For systems with SysV TERMIO, C-g is set up for both SIGINT and
+ SIGQUIT and we can't tell which one it will give us. */
+ sigaction (SIGQUIT, &action, 0);
+#endif /* not DOS_NT */
+ }
+#ifdef USABLE_SIGIO
+ if (!noninteractive)
+ {
+ struct sigaction action;
+ emacs_sigaction_init (&action, deliver_input_available_signal);
+ sigaction (SIGIO, &action, 0);
+ }
+#endif
+
+/* Use interrupt input by default, if it works and noninterrupt input
+ has deficiencies. */
+
+#ifdef INTERRUPT_INPUT
+ interrupt_input = 1;
+#else
+ interrupt_input = 0;
+#endif
+
+ pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+ dribble = 0;
+
+ if (keyboard_init_hook)
+ (*keyboard_init_hook) ();
+
+#ifdef POLL_FOR_INPUT
+ poll_timer = NULL;
+ poll_suppress_count = 1;
+ start_polling ();
+#endif
+}
+
+/* This type's only use is in syms_of_keyboard, to put properties on the
+ event header symbols. */
+struct event_head
+{
+ short var;
+ short kind;
+};
+
+static const struct event_head head_table[] = {
+ {SYMBOL_INDEX (Qmouse_movement), SYMBOL_INDEX (Qmouse_movement)},
+ {SYMBOL_INDEX (Qscroll_bar_movement), SYMBOL_INDEX (Qmouse_movement)},
+
+ /* Some of the event heads. */
+ {SYMBOL_INDEX (Qswitch_frame), SYMBOL_INDEX (Qswitch_frame)},
+
+ {SYMBOL_INDEX (Qfocus_in), SYMBOL_INDEX (Qfocus_in)},
+ {SYMBOL_INDEX (Qfocus_out), SYMBOL_INDEX (Qfocus_out)},
+ {SYMBOL_INDEX (Qdelete_frame), SYMBOL_INDEX (Qdelete_frame)},
+ {SYMBOL_INDEX (Qiconify_frame), SYMBOL_INDEX (Qiconify_frame)},
+ {SYMBOL_INDEX (Qmake_frame_visible), SYMBOL_INDEX (Qmake_frame_visible)},
+ /* `select-window' should be handled just like `switch-frame'
+ in read_key_sequence. */
+ {SYMBOL_INDEX (Qselect_window), SYMBOL_INDEX (Qswitch_frame)}
+};
+
+void
+syms_of_keyboard (void)
+{
+ pending_funcalls = Qnil;
+ staticpro (&pending_funcalls);
+
+ Vlispy_mouse_stem = build_pure_c_string ("mouse");
+ staticpro (&Vlispy_mouse_stem);
+
+ regular_top_level_message = build_pure_c_string ("Back to top level");
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+ recover_top_level_message
+ = build_pure_c_string ("Re-entering top level after C stack overflow");
+#endif
+ DEFVAR_LISP ("internal--top-level-message", Vinternal__top_level_message,
+ doc: /* Message displayed by `normal-top-level'. */);
+ Vinternal__top_level_message = regular_top_level_message;
+
+ /* Tool-bars. */
+ DEFSYM (QCimage, ":image");
+ DEFSYM (Qhelp_echo, "help-echo");
+ DEFSYM (QCrtl, ":rtl");
+
+ staticpro (&item_properties);
+ item_properties = Qnil;
+
+ staticpro (&tool_bar_item_properties);
+ tool_bar_item_properties = Qnil;
+ staticpro (&tool_bar_items_vector);
+ tool_bar_items_vector = Qnil;
+
+ DEFSYM (Qtimer_event_handler, "timer-event-handler");
+ DEFSYM (Qdisabled_command_function, "disabled-command-function");
+ DEFSYM (Qself_insert_command, "self-insert-command");
+ DEFSYM (Qforward_char, "forward-char");
+ DEFSYM (Qbackward_char, "backward-char");
+
+ /* Non-nil disable property on a command means do not execute it;
+ call disabled-command-function's value instead. */
+ DEFSYM (Qdisabled, "disabled");
+
+ DEFSYM (Qundefined, "undefined");
+
+ /* Hooks to run before and after each command. */
+ DEFSYM (Qpre_command_hook, "pre-command-hook");
+ DEFSYM (Qpost_command_hook, "post-command-hook");
+
+ DEFSYM (Qdeferred_action_function, "deferred-action-function");
+ DEFSYM (Qdelayed_warnings_hook, "delayed-warnings-hook");
+ DEFSYM (Qfunction_key, "function-key");
+
+ /* The values of Qevent_kind properties. */
+ DEFSYM (Qmouse_click, "mouse-click");
+
+ DEFSYM (Qdrag_n_drop, "drag-n-drop");
+ DEFSYM (Qsave_session, "save-session");
+ DEFSYM (Qconfig_changed_event, "config-changed-event");
+
+ /* Menu and tool bar item parts. */
+ DEFSYM (Qmenu_enable, "menu-enable");
+
+#ifdef HAVE_NTGUI
+ DEFSYM (Qlanguage_change, "language-change");
+#endif
+
+#ifdef HAVE_DBUS
+ DEFSYM (Qdbus_event, "dbus-event");
+#endif
+
+#ifdef USE_FILE_NOTIFY
+ DEFSYM (Qfile_notify, "file-notify");
+#endif /* USE_FILE_NOTIFY */
+
+ /* Menu and tool bar item parts. */
+ DEFSYM (QCenable, ":enable");
+ DEFSYM (QCvisible, ":visible");
+ DEFSYM (QChelp, ":help");
+ DEFSYM (QCfilter, ":filter");
+ DEFSYM (QCbutton, ":button");
+ DEFSYM (QCkeys, ":keys");
+ DEFSYM (QCkey_sequence, ":key-sequence");
+
+ /* Non-nil disable property on a command means
+ do not execute it; call disabled-command-function's value instead. */
+ DEFSYM (QCtoggle, ":toggle");
+ DEFSYM (QCradio, ":radio");
+ DEFSYM (QClabel, ":label");
+ DEFSYM (QCvert_only, ":vert-only");
+
+ /* Symbols to use for parts of windows. */
+ DEFSYM (Qvertical_line, "vertical-line");
+ DEFSYM (Qright_divider, "right-divider");
+ DEFSYM (Qbottom_divider, "bottom-divider");
+
+ DEFSYM (Qmouse_fixup_help_message, "mouse-fixup-help-message");
+
+ DEFSYM (Qabove_handle, "above-handle");
+ DEFSYM (Qhandle, "handle");
+ DEFSYM (Qbelow_handle, "below-handle");
+ DEFSYM (Qup, "up");
+ DEFSYM (Qdown, "down");
+ DEFSYM (Qtop, "top");
+ DEFSYM (Qbottom, "bottom");
+ DEFSYM (Qend_scroll, "end-scroll");
+ DEFSYM (Qratio, "ratio");
+ DEFSYM (Qbefore_handle, "before-handle");
+ DEFSYM (Qhorizontal_handle, "horizontal-handle");
+ DEFSYM (Qafter_handle, "after-handle");
+ DEFSYM (Qleft, "left");
+ DEFSYM (Qright, "right");
+ DEFSYM (Qleftmost, "leftmost");
+ DEFSYM (Qrightmost, "rightmost");
+
+ /* Properties of event headers. */
+ DEFSYM (Qevent_kind, "event-kind");
+ DEFSYM (Qevent_symbol_elements, "event-symbol-elements");
+
+ /* An event header symbol HEAD may have a property named
+ Qevent_symbol_element_mask, which is of the form (BASE MODIFIERS);
+ BASE is the base, unmodified version of HEAD, and MODIFIERS is the
+ mask of modifiers applied to it. If present, this is used to help
+ speed up parse_modifiers. */
+ DEFSYM (Qevent_symbol_element_mask, "event-symbol-element-mask");
+
+ /* An unmodified event header BASE may have a property named
+ Qmodifier_cache, which is an alist mapping modifier masks onto
+ modified versions of BASE. If present, this helps speed up
+ apply_modifiers. */
+ DEFSYM (Qmodifier_cache, "modifier-cache");
+
+ DEFSYM (Qrecompute_lucid_menubar, "recompute-lucid-menubar");
+ DEFSYM (Qactivate_menubar_hook, "activate-menubar-hook");
+
+ DEFSYM (Qpolling_period, "polling-period");
+
+ DEFSYM (Qgui_set_selection, "gui-set-selection");
+
+ /* The primary selection. */
+ DEFSYM (QPRIMARY, "PRIMARY");
+
+ DEFSYM (Qhandle_switch_frame, "handle-switch-frame");
+ DEFSYM (Qhandle_select_window, "handle-select-window");
+
+ DEFSYM (Qinput_method_function, "input-method-function");
+ DEFSYM (Qinput_method_exit_on_first_char, "input-method-exit-on-first-char");
+ DEFSYM (Qinput_method_use_echo_area, "input-method-use-echo-area");
+
+ DEFSYM (Qhelp_form_show, "help-form-show");
+
+ DEFSYM (Qecho_keystrokes, "echo-keystrokes");
+
+ Fset (Qinput_method_exit_on_first_char, Qnil);
+ Fset (Qinput_method_use_echo_area, Qnil);
+
+ /* Symbols to head events. */
+ DEFSYM (Qmouse_movement, "mouse-movement");
+ DEFSYM (Qscroll_bar_movement, "scroll-bar-movement");
+ DEFSYM (Qswitch_frame, "switch-frame");
+ DEFSYM (Qfocus_in, "focus-in");
+ DEFSYM (Qfocus_out, "focus-out");
+ DEFSYM (Qdelete_frame, "delete-frame");
+ DEFSYM (Qiconify_frame, "iconify-frame");
+ DEFSYM (Qmake_frame_visible, "make-frame-visible");
+ DEFSYM (Qselect_window, "select-window");
+ {
+ int i;
+
+ for (i = 0; i < ARRAYELTS (head_table); i++)
+ {
+ const struct event_head *p = &head_table[i];
+ Lisp_Object var = builtin_lisp_symbol (p->var);
+ Lisp_Object kind = builtin_lisp_symbol (p->kind);
+ Fput (var, Qevent_kind, kind);
+ Fput (var, Qevent_symbol_elements, list1 (var));
+ }
+ }
+
+ button_down_location = Fmake_vector (make_number (5), Qnil);
+ staticpro (&button_down_location);
+ mouse_syms = Fmake_vector (make_number (5), Qnil);
+ staticpro (&mouse_syms);
+ wheel_syms = Fmake_vector (make_number (ARRAYELTS (lispy_wheel_names)),
+ Qnil);
+ staticpro (&wheel_syms);
+
+ {
+ int i;
+ int len = ARRAYELTS (modifier_names);
+
+ modifier_symbols = Fmake_vector (make_number (len), Qnil);
+ for (i = 0; i < len; i++)
+ if (modifier_names[i])
+ ASET (modifier_symbols, i, intern_c_string (modifier_names[i]));
+ staticpro (&modifier_symbols);
+ }
+
+ recent_keys = Fmake_vector (make_number (NUM_RECENT_KEYS), Qnil);
+ staticpro (&recent_keys);
+
+ this_command_keys = Fmake_vector (make_number (40), Qnil);
+ staticpro (&this_command_keys);
+
+ raw_keybuf = Fmake_vector (make_number (30), Qnil);
+ staticpro (&raw_keybuf);
+
+ DEFSYM (Qcommand_execute, "command-execute");
+
+ accent_key_syms = Qnil;
+ staticpro (&accent_key_syms);
+
+ func_key_syms = Qnil;
+ staticpro (&func_key_syms);
+
+ drag_n_drop_syms = Qnil;
+ staticpro (&drag_n_drop_syms);
+
+ unread_switch_frame = Qnil;
+ staticpro (&unread_switch_frame);
+
+ internal_last_event_frame = Qnil;
+ staticpro (&internal_last_event_frame);
+
+ read_key_sequence_cmd = Qnil;
+ staticpro (&read_key_sequence_cmd);
+ read_key_sequence_remapped = Qnil;
+ staticpro (&read_key_sequence_remapped);
+
+ menu_bar_one_keymap_changed_items = Qnil;
+ staticpro (&menu_bar_one_keymap_changed_items);
+
+ menu_bar_items_vector = Qnil;
+ staticpro (&menu_bar_items_vector);
+
+ help_form_saved_window_configs = Qnil;
+ staticpro (&help_form_saved_window_configs);
+
+ defsubr (&Scurrent_idle_time);
+ defsubr (&Sevent_symbol_parse_modifiers);
+ defsubr (&Sevent_convert_list);
+ defsubr (&Sread_key_sequence);
+ defsubr (&Sread_key_sequence_vector);
+ defsubr (&Srecursive_edit);
+ defsubr (&Strack_mouse);
+ defsubr (&Sinput_pending_p);
+ defsubr (&Srecent_keys);
+ defsubr (&Sthis_command_keys);
+ defsubr (&Sthis_command_keys_vector);
+ defsubr (&Sthis_single_command_keys);
+ defsubr (&Sthis_single_command_raw_keys);
+ defsubr (&Sreset_this_command_lengths);
+ defsubr (&Sclear_this_command_keys);
+ defsubr (&Ssuspend_emacs);
+ defsubr (&Sabort_recursive_edit);
+ defsubr (&Sexit_recursive_edit);
+ defsubr (&Srecursion_depth);
+ defsubr (&Scommand_error_default_function);
+ defsubr (&Stop_level);
+ defsubr (&Sdiscard_input);
+ defsubr (&Sopen_dribble_file);
+ defsubr (&Sset_input_interrupt_mode);
+ defsubr (&Sset_output_flow_control);
+ defsubr (&Sset_input_meta_mode);
+ defsubr (&Sset_quit_char);
+ defsubr (&Sset_input_mode);
+ defsubr (&Scurrent_input_mode);
+ defsubr (&Sposn_at_point);
+ defsubr (&Sposn_at_x_y);
+
+ DEFVAR_LISP ("last-command-event", last_command_event,
+ doc: /* Last input event that was part of a command. */);
+
+ DEFVAR_LISP ("last-nonmenu-event", last_nonmenu_event,
+ doc: /* Last input event in a command, except for mouse menu events.
+Mouse menus give back keys that don't look like mouse events;
+this variable holds the actual mouse event that led to the menu,
+so that you can determine whether the command was run by mouse or not. */);
+
+ DEFVAR_LISP ("last-input-event", last_input_event,
+ doc: /* Last input event. */);
+
+ DEFVAR_LISP ("unread-command-events", Vunread_command_events,
+ doc: /* List of events to be read as the command input.
+These events are processed first, before actual keyboard input.
+Events read from this list are not normally added to `this-command-keys',
+as they will already have been added once as they were read for the first time.
+An element of the form (t . EVENT) forces EVENT to be added to that list. */);
+ Vunread_command_events = Qnil;
+
+ DEFVAR_LISP ("unread-post-input-method-events", Vunread_post_input_method_events,
+ doc: /* List of events to be processed as input by input methods.
+These events are processed before `unread-command-events'
+and actual keyboard input, but are not given to `input-method-function'. */);
+ Vunread_post_input_method_events = Qnil;
+
+ DEFVAR_LISP ("unread-input-method-events", Vunread_input_method_events,
+ doc: /* List of events to be processed as input by input methods.
+These events are processed after `unread-command-events', but
+before actual keyboard input.
+If there's an active input method, the events are given to
+`input-method-function'. */);
+ Vunread_input_method_events = Qnil;
+
+ DEFVAR_LISP ("meta-prefix-char", meta_prefix_char,
+ doc: /* Meta-prefix character code.
+Meta-foo as command input turns into this character followed by foo. */);
+ XSETINT (meta_prefix_char, 033);
+
+ DEFVAR_KBOARD ("last-command", Vlast_command,
+ doc: /* The last command executed.
+Normally a symbol with a function definition, but can be whatever was found
+in the keymap, or whatever the variable `this-command' was set to by that
+command.
+
+The value `mode-exit' is special; it means that the previous command
+read an event that told it to exit, and it did so and unread that event.
+In other words, the present command is the event that made the previous
+command exit.
+
+The value `kill-region' is special; it means that the previous command
+was a kill command.
+
+`last-command' has a separate binding for each terminal device.
+See Info node `(elisp)Multiple Terminals'. */);
+
+ DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
+ doc: /* Same as `last-command', but never altered by Lisp code.
+Taken from the previous value of `real-this-command'. */);
+
+ DEFVAR_KBOARD ("last-repeatable-command", Vlast_repeatable_command,
+ doc: /* Last command that may be repeated.
+The last command executed that was not bound to an input event.
+This is the command `repeat' will try to repeat.
+Taken from a previous value of `real-this-command'. */);
+
+ DEFVAR_LISP ("this-command", Vthis_command,
+ doc: /* The command now being executed.
+The command can set this variable; whatever is put here
+will be in `last-command' during the following command. */);
+ Vthis_command = Qnil;
+
+ DEFVAR_LISP ("real-this-command", Vreal_this_command,
+ doc: /* This is like `this-command', except that commands should never modify it. */);
+ Vreal_this_command = Qnil;
+
+ DEFVAR_LISP ("this-command-keys-shift-translated",
+ Vthis_command_keys_shift_translated,
+ doc: /* Non-nil if the key sequence activating this command was shift-translated.
+Shift-translation occurs when there is no binding for the key sequence
+as entered, but a binding was found by changing an upper-case letter
+to lower-case, or a shifted function key to an unshifted one. */);
+ Vthis_command_keys_shift_translated = Qnil;
+
+ DEFVAR_LISP ("this-original-command", Vthis_original_command,
+ doc: /* The command bound to the current key sequence before remapping.
+It equals `this-command' if the original command was not remapped through
+any of the active keymaps. Otherwise, the value of `this-command' is the
+result of looking up the original command in the active keymaps. */);
+ Vthis_original_command = Qnil;
+
+ DEFVAR_INT ("auto-save-interval", auto_save_interval,
+ doc: /* Number of input events between auto-saves.
+Zero means disable autosaving due to number of characters typed. */);
+ auto_save_interval = 300;
+
+ DEFVAR_LISP ("auto-save-timeout", Vauto_save_timeout,
+ doc: /* Number of seconds idle time before auto-save.
+Zero or nil means disable auto-saving due to idleness.
+After auto-saving due to this many seconds of idle time,
+Emacs also does a garbage collection if that seems to be warranted. */);
+ XSETFASTINT (Vauto_save_timeout, 30);
+
+ DEFVAR_LISP ("echo-keystrokes", Vecho_keystrokes,
+ doc: /* Nonzero means echo unfinished commands after this many seconds of pause.
+The value may be integer or floating point.
+If the value is zero, don't echo at all. */);
+ Vecho_keystrokes = make_number (1);
+
+ DEFVAR_INT ("polling-period", polling_period,
+ doc: /* Interval between polling for input during Lisp execution.
+The reason for polling is to make C-g work to stop a running program.
+Polling is needed only when using X windows and SIGIO does not work.
+Polling is automatically disabled in all other cases. */);
+ polling_period = 2;
+
+ DEFVAR_LISP ("double-click-time", Vdouble_click_time,
+ doc: /* Maximum time between mouse clicks to make a double-click.
+Measured in milliseconds. The value nil means disable double-click
+recognition; t means double-clicks have no time limit and are detected
+by position only. */);
+ Vdouble_click_time = make_number (500);
+
+ DEFVAR_INT ("double-click-fuzz", double_click_fuzz,
+ doc: /* Maximum mouse movement between clicks to make a double-click.
+On window-system frames, value is the number of pixels the mouse may have
+moved horizontally or vertically between two clicks to make a double-click.
+On non window-system frames, value is interpreted in units of 1/8 characters
+instead of pixels.
+
+This variable is also the threshold for motion of the mouse
+to count as a drag. */);
+ double_click_fuzz = 3;
+
+ DEFVAR_INT ("num-input-keys", num_input_keys,
+ doc: /* Number of complete key sequences read as input so far.
+This includes key sequences read from keyboard macros.
+The number is effectively the number of interactive command invocations. */);
+ num_input_keys = 0;
+
+ DEFVAR_INT ("num-nonmacro-input-events", num_nonmacro_input_events,
+ doc: /* Number of input events read from the keyboard so far.
+This does not include events generated by keyboard macros. */);
+ num_nonmacro_input_events = 0;
+
+ DEFVAR_LISP ("last-event-frame", Vlast_event_frame,
+ doc: /* The frame in which the most recently read event occurred.
+If the last event came from a keyboard macro, this is set to `macro'. */);
+ Vlast_event_frame = Qnil;
+
+ /* This variable is set up in sysdep.c. */
+ DEFVAR_LISP ("tty-erase-char", Vtty_erase_char,
+ doc: /* The ERASE character as set by the user with stty. */);
+
+ DEFVAR_LISP ("help-char", Vhelp_char,
+ doc: /* Character to recognize as meaning Help.
+When it is read, do `(eval help-form)', and display result if it's a string.
+If the value of `help-form' is nil, this char can be read normally. */);
+ XSETINT (Vhelp_char, Ctl ('H'));
+
+ DEFVAR_LISP ("help-event-list", Vhelp_event_list,
+ doc: /* List of input events to recognize as meaning Help.
+These work just like the value of `help-char' (see that). */);
+ Vhelp_event_list = Qnil;
+
+ DEFVAR_LISP ("help-form", Vhelp_form,
+ doc: /* Form to execute when character `help-char' is read.
+If the form returns a string, that string is displayed.
+If `help-form' is nil, the help char is not recognized. */);
+ Vhelp_form = Qnil;
+
+ DEFVAR_LISP ("prefix-help-command", Vprefix_help_command,
+ doc: /* Command to run when `help-char' character follows a prefix key.
+This command is used only when there is no actual binding
+for that character after that prefix key. */);
+ Vprefix_help_command = Qnil;
+
+ DEFVAR_LISP ("top-level", Vtop_level,
+ doc: /* Form to evaluate when Emacs starts up.
+Useful to set before you dump a modified Emacs. */);
+ Vtop_level = Qnil;
+ XSYMBOL (Qtop_level)->declared_special = false;
+
+ DEFVAR_KBOARD ("keyboard-translate-table", Vkeyboard_translate_table,
+ doc: /* Translate table for local keyboard input, or nil.
+If non-nil, the value should be a char-table. Each character read
+from the keyboard is looked up in this char-table. If the value found
+there is non-nil, then it is used instead of the actual input character.
+
+The value can also be a string or vector, but this is considered obsolete.
+If it is a string or vector of length N, character codes N and up are left
+untranslated. In a vector, an element which is nil means "no translation".
+
+This is applied to the characters supplied to input methods, not their
+output. See also `translation-table-for-input'.
+
+This variable has a separate binding for each terminal.
+See Info node `(elisp)Multiple Terminals'. */);
+
+ DEFVAR_BOOL ("cannot-suspend", cannot_suspend,
+ doc: /* Non-nil means to always spawn a subshell instead of suspending.
+\(Even if the operating system has support for stopping a process.\) */);
+ cannot_suspend = 0;
+
+ DEFVAR_BOOL ("menu-prompting", menu_prompting,
+ doc: /* Non-nil means prompt with menus when appropriate.
+This is done when reading from a keymap that has a prompt string,
+for elements that have prompt strings.
+The menu is displayed on the screen
+if X menus were enabled at configuration
+time and the previous event was a mouse click prefix key.
+Otherwise, menu prompting uses the echo area. */);
+ menu_prompting = 1;
+
+ DEFVAR_LISP ("menu-prompt-more-char", menu_prompt_more_char,
+ doc: /* Character to see next line of menu prompt.
+Type this character while in a menu prompt to rotate around the lines of it. */);
+ XSETINT (menu_prompt_more_char, ' ');
+
+ DEFVAR_INT ("extra-keyboard-modifiers", extra_keyboard_modifiers,
+ doc: /* A mask of additional modifier keys to use with every keyboard character.
+Emacs applies the modifiers of the character stored here to each keyboard
+character it reads. For example, after evaluating the expression
+ (setq extra-keyboard-modifiers ?\\C-x)
+all input characters will have the control modifier applied to them.
+
+Note that the character ?\\C-@, equivalent to the integer zero, does
+not count as a control character; rather, it counts as a character
+with no modifiers; thus, setting `extra-keyboard-modifiers' to zero
+cancels any modification. */);
+ extra_keyboard_modifiers = 0;
+
+ DEFSYM (Qdeactivate_mark, "deactivate-mark");
+ DEFVAR_LISP ("deactivate-mark", Vdeactivate_mark,
+ doc: /* If an editing command sets this to t, deactivate the mark afterward.
+The command loop sets this to nil before each command,
+and tests the value when the command returns.
+Buffer modification stores t in this variable. */);
+ Vdeactivate_mark = Qnil;
+ Fmake_variable_buffer_local (Qdeactivate_mark);
+
+ DEFVAR_LISP ("pre-command-hook", Vpre_command_hook,
+ doc: /* Normal hook run before each command is executed.
+If an unhandled error happens in running this hook,
+the function in which the error occurred is unconditionally removed, since
+otherwise the error might happen repeatedly and make Emacs nonfunctional. */);
+ Vpre_command_hook = Qnil;
+
+ DEFVAR_LISP ("post-command-hook", Vpost_command_hook,
+ doc: /* Normal hook run after each command is executed.
+If an unhandled error happens in running this hook,
+the function in which the error occurred is unconditionally removed, since
+otherwise the error might happen repeatedly and make Emacs nonfunctional. */);
+ Vpost_command_hook = Qnil;
+
+#if 0
+ DEFVAR_LISP ("echo-area-clear-hook", ...,
+ doc: /* Normal hook run when clearing the echo area. */);
+#endif
+ DEFSYM (Qecho_area_clear_hook, "echo-area-clear-hook");
+ Fset (Qecho_area_clear_hook, Qnil);
+
+ DEFVAR_LISP ("lucid-menu-bar-dirty-flag", Vlucid_menu_bar_dirty_flag,
+ doc: /* Non-nil means menu bar, specified Lucid style, needs to be recomputed. */);
+ Vlucid_menu_bar_dirty_flag = Qnil;
+
+ DEFVAR_LISP ("menu-bar-final-items", Vmenu_bar_final_items,
+ doc: /* List of menu bar items to move to the end of the menu bar.
+The elements of the list are event types that may have menu bar bindings. */);
+ Vmenu_bar_final_items = Qnil;
+
+ DEFVAR_LISP ("tool-bar-separator-image-expression", Vtool_bar_separator_image_expression,
+ doc: /* Expression evaluating to the image spec for a tool-bar separator.
+This is used internally by graphical displays that do not render
+tool-bar separators natively. Otherwise it is unused (e.g. on GTK). */);
+ Vtool_bar_separator_image_expression = Qnil;
+
+ DEFVAR_KBOARD ("overriding-terminal-local-map",
+ Voverriding_terminal_local_map,
+ doc: /* Per-terminal keymap that takes precedence over all other keymaps.
+This variable is intended to let commands such as `universal-argument'
+set up a different keymap for reading the next command.
+
+`overriding-terminal-local-map' has a separate binding for each
+terminal device. See Info node `(elisp)Multiple Terminals'. */);
+
+ DEFVAR_LISP ("overriding-local-map", Voverriding_local_map,
+ doc: /* Keymap that replaces (overrides) local keymaps.
+If this variable is non-nil, Emacs looks up key bindings in this
+keymap INSTEAD OF the keymap char property, minor mode maps, and the
+buffer's local map. Hence, the only active keymaps would be
+`overriding-terminal-local-map', this keymap, and `global-keymap', in
+order of precedence. */);
+ Voverriding_local_map = Qnil;
+
+ DEFVAR_LISP ("overriding-local-map-menu-flag", Voverriding_local_map_menu_flag,
+ doc: /* Non-nil means `overriding-local-map' applies to the menu bar.
+Otherwise, the menu bar continues to reflect the buffer's local map
+and the minor mode maps regardless of `overriding-local-map'. */);
+ Voverriding_local_map_menu_flag = Qnil;
+
+ DEFVAR_LISP ("special-event-map", Vspecial_event_map,
+ doc: /* Keymap defining bindings for special events to execute at low level. */);
+ Vspecial_event_map = list1 (Qkeymap);
+
+ DEFVAR_LISP ("track-mouse", do_mouse_tracking,
+ doc: /* Non-nil means generate motion events for mouse motion. */);
+
+ DEFVAR_KBOARD ("system-key-alist", Vsystem_key_alist,
+ doc: /* Alist of system-specific X windows key symbols.
+Each element should have the form (N . SYMBOL) where N is the
+numeric keysym code (sans the \"system-specific\" bit 1<<28)
+and SYMBOL is its name.
+
+`system-key-alist' has a separate binding for each terminal device.
+See Info node `(elisp)Multiple Terminals'. */);
+
+ DEFVAR_KBOARD ("local-function-key-map", Vlocal_function_key_map,
+ doc: /* Keymap that translates key sequences to key sequences during input.
+This is used mainly for mapping key sequences into some preferred
+key events (symbols).
+
+The `read-key-sequence' function replaces any subsequence bound by
+`local-function-key-map' with its binding. More precisely, when the
+active keymaps have no binding for the current key sequence but
+`local-function-key-map' binds a suffix of the sequence to a vector or
+string, `read-key-sequence' replaces the matching suffix with its
+binding, and continues with the new sequence.
+
+If the binding is a function, it is called with one argument (the prompt)
+and its return value (a key sequence) is used.
+
+The events that come from bindings in `local-function-key-map' are not
+themselves looked up in `local-function-key-map'.
+
+For example, suppose `local-function-key-map' binds `ESC O P' to [f1].
+Typing `ESC O P' to `read-key-sequence' would return [f1]. Typing
+`C-x ESC O P' would return [?\\C-x f1]. If [f1] were a prefix key,
+typing `ESC O P x' would return [f1 x].
+
+`local-function-key-map' has a separate binding for each terminal
+device. See Info node `(elisp)Multiple Terminals'. If you need to
+define a binding on all terminals, change `function-key-map'
+instead. Initially, `local-function-key-map' is an empty keymap that
+has `function-key-map' as its parent on all terminal devices. */);
+
+ DEFVAR_KBOARD ("input-decode-map", Vinput_decode_map,
+ doc: /* Keymap that decodes input escape sequences.
+This is used mainly for mapping ASCII function key sequences into
+real Emacs function key events (symbols).
+
+The `read-key-sequence' function replaces any subsequence bound by
+`input-decode-map' with its binding. Contrary to `function-key-map',
+this map applies its rebinding regardless of the presence of an ordinary
+binding. So it is more like `key-translation-map' except that it applies
+before `function-key-map' rather than after.
+
+If the binding is a function, it is called with one argument (the prompt)
+and its return value (a key sequence) is used.
+
+The events that come from bindings in `input-decode-map' are not
+themselves looked up in `input-decode-map'. */);
+
+ DEFVAR_LISP ("function-key-map", Vfunction_key_map,
+ doc: /* The parent keymap of all `local-function-key-map' instances.
+Function key definitions that apply to all terminal devices should go
+here. If a mapping is defined in both the current
+`local-function-key-map' binding and this variable, then the local
+definition will take precedence. */);
+ Vfunction_key_map = Fmake_sparse_keymap (Qnil);
+
+ DEFVAR_LISP ("key-translation-map", Vkey_translation_map,
+ doc: /* Keymap of key translations that can override keymaps.
+This keymap works like `input-decode-map', but comes after `function-key-map'.
+Another difference is that it is global rather than terminal-local. */);
+ Vkey_translation_map = Fmake_sparse_keymap (Qnil);
+
+ DEFVAR_LISP ("deferred-action-list", Vdeferred_action_list,
+ doc: /* List of deferred actions to be performed at a later time.
+The precise format isn't relevant here; we just check whether it is nil. */);
+ Vdeferred_action_list = Qnil;
+
+ DEFVAR_LISP ("deferred-action-function", Vdeferred_action_function,
+ doc: /* Function to call to handle deferred actions, after each command.
+This function is called with no arguments after each command
+whenever `deferred-action-list' is non-nil. */);
+ Vdeferred_action_function = Qnil;
+
+ DEFVAR_LISP ("delayed-warnings-list", Vdelayed_warnings_list,
+ doc: /* List of warnings to be displayed after this command.
+Each element must be a list (TYPE MESSAGE [LEVEL [BUFFER-NAME]]),
+as per the args of `display-warning' (which see).
+If this variable is non-nil, `delayed-warnings-hook' will be run
+immediately after running `post-command-hook'. */);
+ Vdelayed_warnings_list = Qnil;
+
+ DEFVAR_LISP ("timer-list", Vtimer_list,
+ doc: /* List of active absolute time timers in order of increasing time. */);
+ Vtimer_list = Qnil;
+
+ DEFVAR_LISP ("timer-idle-list", Vtimer_idle_list,
+ doc: /* List of active idle-time timers in order of increasing time. */);
+ Vtimer_idle_list = Qnil;
+
+ DEFVAR_LISP ("input-method-function", Vinput_method_function,
+ doc: /* If non-nil, the function that implements the current input method.
+It's called with one argument, a printing character that was just read.
+\(That means a character with code 040...0176.)
+Typically this function uses `read-event' to read additional events.
+When it does so, it should first bind `input-method-function' to nil
+so it will not be called recursively.
+
+The function should return a list of zero or more events
+to be used as input. If it wants to put back some events
+to be reconsidered, separately, by the input method,
+it can add them to the beginning of `unread-command-events'.
+
+The input method function can find in `input-method-previous-message'
+the previous echo area message.
+
+The input method function should refer to the variables
+`input-method-use-echo-area' and `input-method-exit-on-first-char'
+for guidance on what to do. */);
+ Vinput_method_function = Qlist;
+
+ DEFVAR_LISP ("input-method-previous-message",
+ Vinput_method_previous_message,
+ doc: /* When `input-method-function' is called, hold the previous echo area message.
+This variable exists because `read-event' clears the echo area
+before running the input method. It is nil if there was no message. */);
+ Vinput_method_previous_message = Qnil;
+
+ DEFVAR_LISP ("show-help-function", Vshow_help_function,
+ doc: /* If non-nil, the function that implements the display of help.
+It's called with one argument, the help string to display. */);
+ Vshow_help_function = Qnil;
+
+ DEFVAR_LISP ("disable-point-adjustment", Vdisable_point_adjustment,
+ doc: /* If non-nil, suppress point adjustment after executing a command.
+
+After a command is executed, if point is moved into a region that has
+special properties (e.g. composition, display), we adjust point to
+the boundary of the region. But, when a command sets this variable to
+non-nil, we suppress the point adjustment.
+
+This variable is set to nil before reading a command, and is checked
+just after executing the command. */);
+ Vdisable_point_adjustment = Qnil;
+
+ DEFVAR_LISP ("global-disable-point-adjustment",
+ Vglobal_disable_point_adjustment,
+ doc: /* If non-nil, always suppress point adjustment.
+
+The default value is nil, in which case, point adjustment are
+suppressed only after special commands that set
+`disable-point-adjustment' (which see) to non-nil. */);
+ Vglobal_disable_point_adjustment = Qnil;
+
+ DEFVAR_LISP ("minibuffer-message-timeout", Vminibuffer_message_timeout,
+ doc: /* How long to display an echo-area message when the minibuffer is active.
+If the value is not a number, such messages don't time out. */);
+ Vminibuffer_message_timeout = make_number (2);
+
+ DEFVAR_LISP ("throw-on-input", Vthrow_on_input,
+ doc: /* If non-nil, any keyboard input throws to this symbol.
+The value of that variable is passed to `quit-flag' and later causes a
+peculiar kind of quitting. */);
+ Vthrow_on_input = Qnil;
+
+ DEFVAR_LISP ("command-error-function", Vcommand_error_function,
+ doc: /* Function to output error messages.
+Called with three arguments:
+- the error data, a list of the form (SIGNALED-CONDITION . SIGNAL-DATA)
+ such as what `condition-case' would bind its variable to,
+- the context (a string which normally goes at the start of the message),
+- the Lisp function within which the error was signaled. */);
+ Vcommand_error_function = intern ("command-error-default-function");
+
+ DEFVAR_LISP ("enable-disabled-menus-and-buttons",
+ Venable_disabled_menus_and_buttons,
+ doc: /* If non-nil, don't ignore events produced by disabled menu items and tool-bar.
+
+Help functions bind this to allow help on disabled menu items
+and tool-bar buttons. */);
+ Venable_disabled_menus_and_buttons = Qnil;
+
+ DEFVAR_LISP ("select-active-regions",
+ Vselect_active_regions,
+ doc: /* If non-nil, an active region automatically sets the primary selection.
+If the value is `only', only temporarily active regions (usually made
+by mouse-dragging or shift-selection) set the window selection.
+
+This takes effect only when Transient Mark mode is enabled. */);
+ Vselect_active_regions = Qt;
+
+ DEFVAR_LISP ("saved-region-selection",
+ Vsaved_region_selection,
+ doc: /* Contents of active region prior to buffer modification.
+If `select-active-regions' is non-nil, Emacs sets this to the
+text in the region before modifying the buffer. The next call to
+the function `deactivate-mark' uses this to set the window selection. */);
+ Vsaved_region_selection = Qnil;
+
+ DEFVAR_LISP ("selection-inhibit-update-commands",
+ Vselection_inhibit_update_commands,
+ doc: /* List of commands which should not update the selection.
+Normally, if `select-active-regions' is non-nil and the mark remains
+active after a command (i.e. the mark was not deactivated), the Emacs
+command loop sets the selection to the text in the region. However,
+if the command is in this list, the selection is not updated. */);
+ Vselection_inhibit_update_commands
+ = list2 (Qhandle_switch_frame, Qhandle_select_window);
+
+ DEFVAR_LISP ("debug-on-event",
+ Vdebug_on_event,
+ doc: /* Enter debugger on this event. When Emacs
+receives the special event specified by this variable, it will try to
+break into the debugger as soon as possible instead of processing the
+event normally through `special-event-map'.
+
+Currently, the only supported values for this
+variable are `sigusr1' and `sigusr2'. */);
+ Vdebug_on_event = intern_c_string ("sigusr2");
+
+ /* Create the initial keyboard. Qt means 'unset'. */
+ initial_kboard = allocate_kboard (Qt);
+}
+
+void
+keys_of_keyboard (void)
+{
+ initial_define_key (global_map, Ctl ('Z'), "suspend-emacs");
+ initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs");
+ initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit");
+ initial_define_key (global_map, Ctl (']'), "abort-recursive-edit");
+ initial_define_key (meta_map, 'x', "execute-extended-command");
+
+ initial_define_lispy_key (Vspecial_event_map, "delete-frame",
+ "handle-delete-frame");
+ initial_define_lispy_key (Vspecial_event_map, "ns-put-working-text",
+ "ns-put-working-text");
+ initial_define_lispy_key (Vspecial_event_map, "ns-unput-working-text",
+ "ns-unput-working-text");
+ /* Here we used to use `ignore-event' which would simple set prefix-arg to
+ current-prefix-arg, as is done in `handle-switch-frame'.
+ But `handle-switch-frame is not run from the special-map.
+ Commands from that map are run in a special way that automatically
+ preserves the prefix-arg. Restoring the prefix arg here is not just
+ redundant but harmful:
+ - C-u C-x v =
+ - current-prefix-arg is set to non-nil, prefix-arg is set to nil.
+ - after the first prompt, the exit-minibuffer-hook is run which may
+ iconify a frame and thus push a `iconify-frame' event.
+ - after running exit-minibuffer-hook, current-prefix-arg is
+ restored to the non-nil value it had before the prompt.
+ - we enter the second prompt.
+ current-prefix-arg is non-nil, prefix-arg is nil.
+ - before running the first real event, we run the special iconify-frame
+ event, but we pass the `special' arg to command-execute so
+ current-prefix-arg and prefix-arg are left untouched.
+ - here we foolishly copy the non-nil current-prefix-arg to prefix-arg.
+ - the next key event will have a spuriously non-nil current-prefix-arg. */
+ initial_define_lispy_key (Vspecial_event_map, "iconify-frame",
+ "ignore");
+ initial_define_lispy_key (Vspecial_event_map, "make-frame-visible",
+ "ignore");
+ /* Handling it at such a low-level causes read_key_sequence to get
+ * confused because it doesn't realize that the current_buffer was
+ * changed by read_char.
+ *
+ * initial_define_lispy_key (Vspecial_event_map, "select-window",
+ * "handle-select-window"); */
+ initial_define_lispy_key (Vspecial_event_map, "save-session",
+ "handle-save-session");
+
+#ifdef HAVE_DBUS
+ /* Define a special event which is raised for dbus callback
+ functions. */
+ initial_define_lispy_key (Vspecial_event_map, "dbus-event",
+ "dbus-handle-event");
+#endif
+
+#ifdef USE_FILE_NOTIFY
+ /* Define a special event which is raised for notification callback
+ functions. */
+ initial_define_lispy_key (Vspecial_event_map, "file-notify",
+ "file-notify-handle-event");
+#endif /* USE_FILE_NOTIFY */
+
+ initial_define_lispy_key (Vspecial_event_map, "config-changed-event",
+ "ignore");
+#if defined (WINDOWSNT)
+ initial_define_lispy_key (Vspecial_event_map, "language-change",
+ "ignore");
+#endif
+ initial_define_lispy_key (Vspecial_event_map, "focus-in",
+ "handle-focus-in");
+ initial_define_lispy_key (Vspecial_event_map, "focus-out",
+ "handle-focus-out");
+}
+
+/* Mark the pointers in the kboard objects.
+ Called by Fgarbage_collect. */
+void
+mark_kboards (void)
+{
+ KBOARD *kb;
+ Lisp_Object *p;
+ for (kb = all_kboards; kb; kb = kb->next_kboard)
+ {
+ if (kb->kbd_macro_buffer)
+ for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
+ mark_object (*p);
+ mark_object (KVAR (kb, Voverriding_terminal_local_map));
+ mark_object (KVAR (kb, Vlast_command));
+ mark_object (KVAR (kb, Vreal_last_command));
+ mark_object (KVAR (kb, Vkeyboard_translate_table));
+ mark_object (KVAR (kb, Vlast_repeatable_command));
+ mark_object (KVAR (kb, Vprefix_arg));
+ mark_object (KVAR (kb, Vlast_prefix_arg));
+ mark_object (KVAR (kb, kbd_queue));
+ mark_object (KVAR (kb, defining_kbd_macro));
+ mark_object (KVAR (kb, Vlast_kbd_macro));
+ mark_object (KVAR (kb, Vsystem_key_alist));
+ mark_object (KVAR (kb, system_key_syms));
+ mark_object (KVAR (kb, Vwindow_system));
+ mark_object (KVAR (kb, Vinput_decode_map));
+ mark_object (KVAR (kb, Vlocal_function_key_map));
+ mark_object (KVAR (kb, Vdefault_minibuffer_frame));
+ mark_object (KVAR (kb, echo_string));
+ }
+ {
+ struct input_event *event;
+ for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++)
+ {
+ if (event == kbd_buffer + KBD_BUFFER_SIZE)
+ event = kbd_buffer;
+ /* These two special event types has no Lisp_Objects to mark. */
+ if (event->kind != SELECTION_REQUEST_EVENT
+ && event->kind != SELECTION_CLEAR_EVENT)
+ {
+ mark_object (event->x);
+ mark_object (event->y);
+ mark_object (event->frame_or_window);
+ mark_object (event->arg);
+ }
+ }
+ }
+}
diff --git a/test/etags/c-src/emacs/src/lisp.h b/test/etags/c-src/emacs/src/lisp.h
new file mode 100644
index 00000000000..6d34ce3b052
--- /dev/null
+++ b/test/etags/c-src/emacs/src/lisp.h
@@ -0,0 +1,4817 @@
+/* Fundamental definitions for GNU Emacs Lisp interpreter.
+
+Copyright (C) 1985-1987, 1993-1995, 1997-2015 Free Software Foundation,
+Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef EMACS_LISP_H
+#define EMACS_LISP_H
+
+#include <setjmp.h>
+#include <stdalign.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <float.h>
+#include <inttypes.h>
+#include <limits.h>
+
+#include <intprops.h>
+#include <verify.h>
+
+INLINE_HEADER_BEGIN
+
+/* Define a TYPE constant ID as an externally visible name. Use like this:
+
+ DEFINE_GDB_SYMBOL_BEGIN (TYPE, ID)
+ # define ID (some integer preprocessor expression of type TYPE)
+ DEFINE_GDB_SYMBOL_END (ID)
+
+ This hack is for the benefit of compilers that do not make macro
+ definitions or enums visible to the debugger. It's used for symbols
+ that .gdbinit needs. */
+
+#define DECLARE_GDB_SYM(type, id) type const id EXTERNALLY_VISIBLE
+#ifdef MAIN_PROGRAM
+# define DEFINE_GDB_SYMBOL_BEGIN(type, id) DECLARE_GDB_SYM (type, id)
+# define DEFINE_GDB_SYMBOL_END(id) = id;
+#else
+# define DEFINE_GDB_SYMBOL_BEGIN(type, id) extern DECLARE_GDB_SYM (type, id)
+# define DEFINE_GDB_SYMBOL_END(val) ;
+#endif
+
+/* The ubiquitous max and min macros. */
+#undef min
+#undef max
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
+/* Number of elements in an array. */
+#define ARRAYELTS(arr) (sizeof (arr) / sizeof (arr)[0])
+
+/* Number of bits in a Lisp_Object tag. */
+DEFINE_GDB_SYMBOL_BEGIN (int, GCTYPEBITS)
+#define GCTYPEBITS 3
+DEFINE_GDB_SYMBOL_END (GCTYPEBITS)
+
+/* The number of bits needed in an EMACS_INT over and above the number
+ of bits in a pointer. This is 0 on systems where:
+ 1. We can specify multiple-of-8 alignment on static variables.
+ 2. We know malloc returns a multiple of 8. */
+#if (defined alignas \
+ && (defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ \
+ || defined DARWIN_OS || defined __sun || defined __MINGW32__ \
+ || defined CYGWIN))
+# define NONPOINTER_BITS 0
+#else
+# define NONPOINTER_BITS GCTYPEBITS
+#endif
+
+/* EMACS_INT - signed integer wide enough to hold an Emacs value
+ EMACS_INT_MAX - maximum value of EMACS_INT; can be used in #if
+ pI - printf length modifier for EMACS_INT
+ EMACS_UINT - unsigned variant of EMACS_INT */
+#ifndef EMACS_INT_MAX
+# if INTPTR_MAX <= 0
+# error "INTPTR_MAX misconfigured"
+# elif INTPTR_MAX <= INT_MAX >> NONPOINTER_BITS && !defined WIDE_EMACS_INT
+typedef int EMACS_INT;
+typedef unsigned int EMACS_UINT;
+# define EMACS_INT_MAX INT_MAX
+# define pI ""
+# elif INTPTR_MAX <= LONG_MAX >> NONPOINTER_BITS && !defined WIDE_EMACS_INT
+typedef long int EMACS_INT;
+typedef unsigned long EMACS_UINT;
+# define EMACS_INT_MAX LONG_MAX
+# define pI "l"
+/* Check versus LLONG_MAX, not LLONG_MAX >> NONPOINTER_BITS.
+ In theory this is not safe, but in practice it seems to be OK. */
+# elif INTPTR_MAX <= LLONG_MAX
+typedef long long int EMACS_INT;
+typedef unsigned long long int EMACS_UINT;
+# define EMACS_INT_MAX LLONG_MAX
+# define pI "ll"
+# else
+# error "INTPTR_MAX too large"
+# endif
+#endif
+
+/* Number of bits to put in each character in the internal representation
+ of bool vectors. This should not vary across implementations. */
+enum { BOOL_VECTOR_BITS_PER_CHAR =
+#define BOOL_VECTOR_BITS_PER_CHAR 8
+ BOOL_VECTOR_BITS_PER_CHAR
+};
+
+/* An unsigned integer type representing a fixed-length bit sequence,
+ suitable for bool vector words, GC mark bits, etc. Normally it is size_t
+ for speed, but it is unsigned char on weird platforms. */
+#if BOOL_VECTOR_BITS_PER_CHAR == CHAR_BIT
+typedef size_t bits_word;
+# define BITS_WORD_MAX SIZE_MAX
+enum { BITS_PER_BITS_WORD = CHAR_BIT * sizeof (bits_word) };
+#else
+typedef unsigned char bits_word;
+# define BITS_WORD_MAX ((1u << BOOL_VECTOR_BITS_PER_CHAR) - 1)
+enum { BITS_PER_BITS_WORD = BOOL_VECTOR_BITS_PER_CHAR };
+#endif
+verify (BITS_WORD_MAX >> (BITS_PER_BITS_WORD - 1) == 1);
+
+/* Number of bits in some machine integer types. */
+enum
+ {
+ BITS_PER_CHAR = CHAR_BIT,
+ BITS_PER_SHORT = CHAR_BIT * sizeof (short),
+ BITS_PER_LONG = CHAR_BIT * sizeof (long int),
+ BITS_PER_EMACS_INT = CHAR_BIT * sizeof (EMACS_INT)
+ };
+
+/* printmax_t and uprintmax_t are types for printing large integers.
+ These are the widest integers that are supported for printing.
+ pMd etc. are conversions for printing them.
+ On C99 hosts, there's no problem, as even the widest integers work.
+ Fall back on EMACS_INT on pre-C99 hosts. */
+#ifdef PRIdMAX
+typedef intmax_t printmax_t;
+typedef uintmax_t uprintmax_t;
+# define pMd PRIdMAX
+# define pMu PRIuMAX
+#else
+typedef EMACS_INT printmax_t;
+typedef EMACS_UINT uprintmax_t;
+# define pMd pI"d"
+# define pMu pI"u"
+#endif
+
+/* Use pD to format ptrdiff_t values, which suffice for indexes into
+ buffers and strings. Emacs never allocates objects larger than
+ PTRDIFF_MAX bytes, as they cause problems with pointer subtraction.
+ In C99, pD can always be "t"; configure it here for the sake of
+ pre-C99 libraries such as glibc 2.0 and Solaris 8. */
+#if PTRDIFF_MAX == INT_MAX
+# define pD ""
+#elif PTRDIFF_MAX == LONG_MAX
+# define pD "l"
+#elif PTRDIFF_MAX == LLONG_MAX
+# define pD "ll"
+#else
+# define pD "t"
+#endif
+
+/* Extra internal type checking? */
+
+/* Define Emacs versions of <assert.h>'s 'assert (COND)' and <verify.h>'s
+ 'assume (COND)'. COND should be free of side effects, as it may or
+ may not be evaluated.
+
+ 'eassert (COND)' checks COND at runtime if ENABLE_CHECKING is
+ defined and suppress_checking is false, and does nothing otherwise.
+ Emacs dies if COND is checked and is false. The suppress_checking
+ variable is initialized to 0 in alloc.c. Set it to 1 using a
+ debugger to temporarily disable aborting on detected internal
+ inconsistencies or error conditions.
+
+ In some cases, a good compiler may be able to optimize away the
+ eassert macro even if ENABLE_CHECKING is true, e.g., if XSTRING (x)
+ uses eassert to test STRINGP (x), but a particular use of XSTRING
+ is invoked only after testing that STRINGP (x) is true, making the
+ test redundant.
+
+ eassume is like eassert except that it also causes the compiler to
+ assume that COND is true afterwards, regardless of whether runtime
+ checking is enabled. This can improve performance in some cases,
+ though it can degrade performance in others. It's often suboptimal
+ for COND to call external functions or access volatile storage. */
+
+#ifndef ENABLE_CHECKING
+# define eassert(cond) ((void) (false && (cond))) /* Check COND compiles. */
+# define eassume(cond) assume (cond)
+#else /* ENABLE_CHECKING */
+
+extern _Noreturn void die (const char *, const char *, int);
+
+extern bool suppress_checking EXTERNALLY_VISIBLE;
+
+# define eassert(cond) \
+ (suppress_checking || (cond) \
+ ? (void) 0 \
+ : die (# cond, __FILE__, __LINE__))
+# define eassume(cond) \
+ (suppress_checking \
+ ? assume (cond) \
+ : (cond) \
+ ? (void) 0 \
+ : die (# cond, __FILE__, __LINE__))
+#endif /* ENABLE_CHECKING */
+
+
+/* Use the configure flag --enable-check-lisp-object-type to make
+ Lisp_Object use a struct type instead of the default int. The flag
+ causes CHECK_LISP_OBJECT_TYPE to be defined. */
+
+/***** Select the tagging scheme. *****/
+/* The following option controls the tagging scheme:
+ - USE_LSB_TAG means that we can assume the least 3 bits of pointers are
+ always 0, and we can thus use them to hold tag bits, without
+ restricting our addressing space.
+
+ If ! USE_LSB_TAG, then use the top 3 bits for tagging, thus
+ restricting our possible address range.
+
+ USE_LSB_TAG not only requires the least 3 bits of pointers returned by
+ malloc to be 0 but also needs to be able to impose a mult-of-8 alignment
+ on the few static Lisp_Objects used: lispsym, all the defsubr, and
+ the two special buffers buffer_defaults and buffer_local_symbols. */
+
+enum Lisp_Bits
+ {
+ /* 2**GCTYPEBITS. This must be a macro that expands to a literal
+ integer constant, for MSVC. */
+#define GCALIGNMENT 8
+
+ /* Number of bits in a Lisp_Object value, not counting the tag. */
+ VALBITS = BITS_PER_EMACS_INT - GCTYPEBITS,
+
+ /* Number of bits in a Lisp fixnum tag. */
+ INTTYPEBITS = GCTYPEBITS - 1,
+
+ /* Number of bits in a Lisp fixnum value, not counting the tag. */
+ FIXNUM_BITS = VALBITS + 1
+ };
+
+#if GCALIGNMENT != 1 << GCTYPEBITS
+# error "GCALIGNMENT and GCTYPEBITS are inconsistent"
+#endif
+
+/* The maximum value that can be stored in a EMACS_INT, assuming all
+ bits other than the type bits contribute to a nonnegative signed value.
+ This can be used in #if, e.g., '#if USB_TAG' below expands to an
+ expression involving VAL_MAX. */
+#define VAL_MAX (EMACS_INT_MAX >> (GCTYPEBITS - 1))
+
+/* Whether the least-significant bits of an EMACS_INT contain the tag.
+ On hosts where pointers-as-ints do not exceed VAL_MAX / 2, USE_LSB_TAG is:
+ a. unnecessary, because the top bits of an EMACS_INT are unused, and
+ b. slower, because it typically requires extra masking.
+ So, USE_LSB_TAG is true only on hosts where it might be useful. */
+DEFINE_GDB_SYMBOL_BEGIN (bool, USE_LSB_TAG)
+#define USE_LSB_TAG (VAL_MAX / 2 < INTPTR_MAX)
+DEFINE_GDB_SYMBOL_END (USE_LSB_TAG)
+
+#if !USE_LSB_TAG && !defined WIDE_EMACS_INT
+# error "USE_LSB_TAG not supported on this platform; please report this." \
+ "Try 'configure --with-wide-int' to work around the problem."
+error !;
+#endif
+
+#ifndef alignas
+# define alignas(alignment) /* empty */
+# if USE_LSB_TAG
+# error "USE_LSB_TAG requires alignas"
+# endif
+#endif
+
+#ifdef HAVE_STRUCT_ATTRIBUTE_ALIGNED
+# define GCALIGNED __attribute__ ((aligned (GCALIGNMENT)))
+#else
+# define GCALIGNED /* empty */
+#endif
+
+/* Some operations are so commonly executed that they are implemented
+ as macros, not functions, because otherwise runtime performance would
+ suffer too much when compiling with GCC without optimization.
+ There's no need to inline everything, just the operations that
+ would otherwise cause a serious performance problem.
+
+ For each such operation OP, define a macro lisp_h_OP that contains
+ the operation's implementation. That way, OP can be implemented
+ via a macro definition like this:
+
+ #define OP(x) lisp_h_OP (x)
+
+ and/or via a function definition like this:
+
+ LISP_MACRO_DEFUN (OP, Lisp_Object, (Lisp_Object x), (x))
+
+ which macro-expands to this:
+
+ Lisp_Object (OP) (Lisp_Object x) { return lisp_h_OP (x); }
+
+ without worrying about the implementations diverging, since
+ lisp_h_OP defines the actual implementation. The lisp_h_OP macros
+ are intended to be private to this include file, and should not be
+ used elsewhere.
+
+ FIXME: Remove the lisp_h_OP macros, and define just the inline OP
+ functions, once most developers have access to GCC 4.8 or later and
+ can use "gcc -Og" to debug. Maybe in the year 2016. See
+ Bug#11935.
+
+ Commentary for these macros can be found near their corresponding
+ functions, below. */
+
+#if CHECK_LISP_OBJECT_TYPE
+# define lisp_h_XLI(o) ((o).i)
+# define lisp_h_XIL(i) ((Lisp_Object) { i })
+#else
+# define lisp_h_XLI(o) (o)
+# define lisp_h_XIL(i) (i)
+#endif
+#define lisp_h_CHECK_LIST_CONS(x, y) CHECK_TYPE (CONSP (x), Qlistp, y)
+#define lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGERP (x), Qintegerp, x)
+#define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP (x), Qsymbolp, x)
+#define lisp_h_CHECK_TYPE(ok, predicate, x) \
+ ((ok) ? (void) 0 : (void) wrong_type_argument (predicate, x))
+#define lisp_h_CONSP(x) (XTYPE (x) == Lisp_Cons)
+#define lisp_h_EQ(x, y) (XLI (x) == XLI (y))
+#define lisp_h_FLOATP(x) (XTYPE (x) == Lisp_Float)
+#define lisp_h_INTEGERP(x) ((XTYPE (x) & (Lisp_Int0 | ~Lisp_Int1)) == Lisp_Int0)
+#define lisp_h_MARKERP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker)
+#define lisp_h_MISCP(x) (XTYPE (x) == Lisp_Misc)
+#define lisp_h_NILP(x) EQ (x, Qnil)
+#define lisp_h_SET_SYMBOL_VAL(sym, v) \
+ (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value = (v))
+#define lisp_h_SYMBOL_CONSTANT_P(sym) (XSYMBOL (sym)->constant)
+#define lisp_h_SYMBOL_VAL(sym) \
+ (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value)
+#define lisp_h_SYMBOLP(x) (XTYPE (x) == Lisp_Symbol)
+#define lisp_h_VECTORLIKEP(x) (XTYPE (x) == Lisp_Vectorlike)
+#define lisp_h_XCAR(c) XCONS (c)->car
+#define lisp_h_XCDR(c) XCONS (c)->u.cdr
+#define lisp_h_XCONS(a) \
+ (eassert (CONSP (a)), (struct Lisp_Cons *) XUNTAG (a, Lisp_Cons))
+#define lisp_h_XHASH(a) XUINT (a)
+#define lisp_h_XPNTR(a) \
+ (SYMBOLP (a) ? XSYMBOL (a) : (void *) ((intptr_t) (XLI (a) & VALMASK)))
+#ifndef GC_CHECK_CONS_LIST
+# define lisp_h_check_cons_list() ((void) 0)
+#endif
+#if USE_LSB_TAG
+# define lisp_h_make_number(n) \
+ XIL ((EMACS_INT) (((EMACS_UINT) (n) << INTTYPEBITS) + Lisp_Int0))
+# define lisp_h_XFASTINT(a) XINT (a)
+# define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)
+# define lisp_h_XSYMBOL(a) \
+ (eassert (SYMBOLP (a)), \
+ (struct Lisp_Symbol *) ((uintptr_t) XLI (a) - Lisp_Symbol \
+ + (char *) lispsym))
+# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
+# define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
+#endif
+
+/* When compiling via gcc -O0, define the key operations as macros, as
+ Emacs is too slow otherwise. To disable this optimization, compile
+ with -DINLINING=false. */
+#if (defined __NO_INLINE__ \
+ && ! defined __OPTIMIZE__ && ! defined __OPTIMIZE_SIZE__ \
+ && ! (defined INLINING && ! INLINING))
+# define XLI(o) lisp_h_XLI (o)
+# define XIL(i) lisp_h_XIL (i)
+# define CHECK_LIST_CONS(x, y) lisp_h_CHECK_LIST_CONS (x, y)
+# define CHECK_NUMBER(x) lisp_h_CHECK_NUMBER (x)
+# define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x)
+# define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x)
+# define CONSP(x) lisp_h_CONSP (x)
+# define EQ(x, y) lisp_h_EQ (x, y)
+# define FLOATP(x) lisp_h_FLOATP (x)
+# define INTEGERP(x) lisp_h_INTEGERP (x)
+# define MARKERP(x) lisp_h_MARKERP (x)
+# define MISCP(x) lisp_h_MISCP (x)
+# define NILP(x) lisp_h_NILP (x)
+# define SET_SYMBOL_VAL(sym, v) lisp_h_SET_SYMBOL_VAL (sym, v)
+# define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONSTANT_P (sym)
+# define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym)
+# define SYMBOLP(x) lisp_h_SYMBOLP (x)
+# define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x)
+# define XCAR(c) lisp_h_XCAR (c)
+# define XCDR(c) lisp_h_XCDR (c)
+# define XCONS(a) lisp_h_XCONS (a)
+# define XHASH(a) lisp_h_XHASH (a)
+# define XPNTR(a) lisp_h_XPNTR (a)
+# ifndef GC_CHECK_CONS_LIST
+# define check_cons_list() lisp_h_check_cons_list ()
+# endif
+# if USE_LSB_TAG
+# define make_number(n) lisp_h_make_number (n)
+# define XFASTINT(a) lisp_h_XFASTINT (a)
+# define XINT(a) lisp_h_XINT (a)
+# define XSYMBOL(a) lisp_h_XSYMBOL (a)
+# define XTYPE(a) lisp_h_XTYPE (a)
+# define XUNTAG(a, type) lisp_h_XUNTAG (a, type)
+# endif
+#endif
+
+/* Define NAME as a lisp.h inline function that returns TYPE and has
+ arguments declared as ARGDECLS and passed as ARGS. ARGDECLS and
+ ARGS should be parenthesized. Implement the function by calling
+ lisp_h_NAME ARGS. */
+#define LISP_MACRO_DEFUN(name, type, argdecls, args) \
+ INLINE type (name) argdecls { return lisp_h_##name args; }
+
+/* like LISP_MACRO_DEFUN, except NAME returns void. */
+#define LISP_MACRO_DEFUN_VOID(name, argdecls, args) \
+ INLINE void (name) argdecls { lisp_h_##name args; }
+
+
+/* Define the fundamental Lisp data structures. */
+
+/* This is the set of Lisp data types. If you want to define a new
+ data type, read the comments after Lisp_Fwd_Type definition
+ below. */
+
+/* Lisp integers use 2 tags, to give them one extra bit, thus
+ extending their range from, e.g., -2^28..2^28-1 to -2^29..2^29-1. */
+#define INTMASK (EMACS_INT_MAX >> (INTTYPEBITS - 1))
+#define case_Lisp_Int case Lisp_Int0: case Lisp_Int1
+
+/* Idea stolen from GDB. Pedantic GCC complains about enum bitfields,
+ MSVC doesn't support them, and xlc and Oracle Studio c99 complain
+ vociferously about them. */
+#if (defined __STRICT_ANSI__ || defined _MSC_VER || defined __IBMC__ \
+ || (defined __SUNPRO_C && __STDC__))
+#define ENUM_BF(TYPE) unsigned int
+#else
+#define ENUM_BF(TYPE) enum TYPE
+#endif
+
+
+enum Lisp_Type
+ {
+ /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */
+ Lisp_Symbol = 0,
+
+ /* Miscellaneous. XMISC (object) points to a union Lisp_Misc,
+ whose first member indicates the subtype. */
+ Lisp_Misc = 1,
+
+ /* Integer. XINT (obj) is the integer value. */
+ Lisp_Int0 = 2,
+ Lisp_Int1 = USE_LSB_TAG ? 6 : 3,
+
+ /* String. XSTRING (object) points to a struct Lisp_String.
+ The length of the string, and its contents, are stored therein. */
+ Lisp_String = 4,
+
+ /* Vector of Lisp objects, or something resembling it.
+ XVECTOR (object) points to a struct Lisp_Vector, which contains
+ the size and contents. The size field also contains the type
+ information, if it's not a real vector object. */
+ Lisp_Vectorlike = 5,
+
+ /* Cons. XCONS (object) points to a struct Lisp_Cons. */
+ Lisp_Cons = USE_LSB_TAG ? 3 : 6,
+
+ Lisp_Float = 7
+ };
+
+/* This is the set of data types that share a common structure.
+ The first member of the structure is a type code from this set.
+ The enum values are arbitrary, but we'll use large numbers to make it
+ more likely that we'll spot the error if a random word in memory is
+ mistakenly interpreted as a Lisp_Misc. */
+enum Lisp_Misc_Type
+ {
+ Lisp_Misc_Free = 0x5eab,
+ Lisp_Misc_Marker,
+ Lisp_Misc_Overlay,
+ Lisp_Misc_Save_Value,
+ Lisp_Misc_Finalizer,
+ /* Currently floats are not a misc type,
+ but let's define this in case we want to change that. */
+ Lisp_Misc_Float,
+ /* This is not a type code. It is for range checking. */
+ Lisp_Misc_Limit
+ };
+
+/* These are the types of forwarding objects used in the value slot
+ of symbols for special built-in variables whose value is stored in
+ C variables. */
+enum Lisp_Fwd_Type
+ {
+ Lisp_Fwd_Int, /* Fwd to a C `int' variable. */
+ Lisp_Fwd_Bool, /* Fwd to a C boolean var. */
+ Lisp_Fwd_Obj, /* Fwd to a C Lisp_Object variable. */
+ Lisp_Fwd_Buffer_Obj, /* Fwd to a Lisp_Object field of buffers. */
+ Lisp_Fwd_Kboard_Obj /* Fwd to a Lisp_Object field of kboards. */
+ };
+
+/* If you want to define a new Lisp data type, here are some
+ instructions. See the thread at
+ http://lists.gnu.org/archive/html/emacs-devel/2012-10/msg00561.html
+ for more info.
+
+ First, there are already a couple of Lisp types that can be used if
+ your new type does not need to be exposed to Lisp programs nor
+ displayed to users. These are Lisp_Save_Value, a Lisp_Misc
+ subtype; and PVEC_OTHER, a kind of vectorlike object. The former
+ is suitable for temporarily stashing away pointers and integers in
+ a Lisp object. The latter is useful for vector-like Lisp objects
+ that need to be used as part of other objects, but which are never
+ shown to users or Lisp code (search for PVEC_OTHER in xterm.c for
+ an example).
+
+ These two types don't look pretty when printed, so they are
+ unsuitable for Lisp objects that can be exposed to users.
+
+ To define a new data type, add one more Lisp_Misc subtype or one
+ more pseudovector subtype. Pseudovectors are more suitable for
+ objects with several slots that need to support fast random access,
+ while Lisp_Misc types are for everything else. A pseudovector object
+ provides one or more slots for Lisp objects, followed by struct
+ members that are accessible only from C. A Lisp_Misc object is a
+ wrapper for a C struct that can contain anything you like.
+
+ Explicit freeing is discouraged for Lisp objects in general. But if
+ you really need to exploit this, use Lisp_Misc (check free_misc in
+ alloc.c to see why). There is no way to free a vectorlike object.
+
+ To add a new pseudovector type, extend the pvec_type enumeration;
+ to add a new Lisp_Misc, extend the Lisp_Misc_Type enumeration.
+
+ For a Lisp_Misc, you will also need to add your entry to union
+ Lisp_Misc (but make sure the first word has the same structure as
+ the others, starting with a 16-bit member of the Lisp_Misc_Type
+ enumeration and a 1-bit GC markbit) and make sure the overall size
+ of the union is not increased by your addition.
+
+ For a new pseudovector, it's highly desirable to limit the size
+ of your data type by VBLOCK_BYTES_MAX bytes (defined in alloc.c).
+ Otherwise you will need to change sweep_vectors (also in alloc.c).
+
+ Then you will need to add switch branches in print.c (in
+ print_object, to print your object, and possibly also in
+ print_preprocess) and to alloc.c, to mark your object (in
+ mark_object) and to free it (in gc_sweep). The latter is also the
+ right place to call any code specific to your data type that needs
+ to run when the object is recycled -- e.g., free any additional
+ resources allocated for it that are not Lisp objects. You can even
+ make a pointer to the function that frees the resources a slot in
+ your object -- this way, the same object could be used to represent
+ several disparate C structures. */
+
+#ifdef CHECK_LISP_OBJECT_TYPE
+
+typedef struct { EMACS_INT i; } Lisp_Object;
+
+#define LISP_INITIALLY(i) {i}
+
+#undef CHECK_LISP_OBJECT_TYPE
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = true };
+#else /* CHECK_LISP_OBJECT_TYPE */
+
+/* If a struct type is not wanted, define Lisp_Object as just a number. */
+
+typedef EMACS_INT Lisp_Object;
+#define LISP_INITIALLY(i) (i)
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = false };
+#endif /* CHECK_LISP_OBJECT_TYPE */
+
+#define LISP_INITIALLY_ZERO LISP_INITIALLY (0)
+
+/* Forward declarations. */
+
+/* Defined in this file. */
+union Lisp_Fwd;
+INLINE bool BOOL_VECTOR_P (Lisp_Object);
+INLINE bool BUFFER_OBJFWDP (union Lisp_Fwd *);
+INLINE bool BUFFERP (Lisp_Object);
+INLINE bool CHAR_TABLE_P (Lisp_Object);
+INLINE Lisp_Object CHAR_TABLE_REF_ASCII (Lisp_Object, ptrdiff_t);
+INLINE bool (CONSP) (Lisp_Object);
+INLINE bool (FLOATP) (Lisp_Object);
+INLINE bool functionp (Lisp_Object);
+INLINE bool (INTEGERP) (Lisp_Object);
+INLINE bool (MARKERP) (Lisp_Object);
+INLINE bool (MISCP) (Lisp_Object);
+INLINE bool (NILP) (Lisp_Object);
+INLINE bool OVERLAYP (Lisp_Object);
+INLINE bool PROCESSP (Lisp_Object);
+INLINE bool PSEUDOVECTORP (Lisp_Object, int);
+INLINE bool SAVE_VALUEP (Lisp_Object);
+INLINE bool FINALIZERP (Lisp_Object);
+INLINE void set_sub_char_table_contents (Lisp_Object, ptrdiff_t,
+ Lisp_Object);
+INLINE bool STRINGP (Lisp_Object);
+INLINE bool SUB_CHAR_TABLE_P (Lisp_Object);
+INLINE bool SUBRP (Lisp_Object);
+INLINE bool (SYMBOLP) (Lisp_Object);
+INLINE bool (VECTORLIKEP) (Lisp_Object);
+INLINE bool WINDOWP (Lisp_Object);
+INLINE bool TERMINALP (Lisp_Object);
+INLINE struct Lisp_Save_Value *XSAVE_VALUE (Lisp_Object);
+INLINE struct Lisp_Finalizer *XFINALIZER (Lisp_Object);
+INLINE struct Lisp_Symbol *(XSYMBOL) (Lisp_Object);
+INLINE void *(XUNTAG) (Lisp_Object, int);
+
+/* Defined in chartab.c. */
+extern Lisp_Object char_table_ref (Lisp_Object, int);
+extern void char_table_set (Lisp_Object, int, Lisp_Object);
+
+/* Defined in data.c. */
+extern _Noreturn Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object);
+extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object);
+
+/* Defined in emacs.c. */
+extern bool might_dump;
+/* True means Emacs has already been initialized.
+ Used during startup to detect startup of dumped Emacs. */
+extern bool initialized;
+
+/* Defined in floatfns.c. */
+extern double extract_float (Lisp_Object);
+
+
+/* Interned state of a symbol. */
+
+enum symbol_interned
+{
+ SYMBOL_UNINTERNED = 0,
+ SYMBOL_INTERNED = 1,
+ SYMBOL_INTERNED_IN_INITIAL_OBARRAY = 2
+};
+
+enum symbol_redirect
+{
+ SYMBOL_PLAINVAL = 4,
+ SYMBOL_VARALIAS = 1,
+ SYMBOL_LOCALIZED = 2,
+ SYMBOL_FORWARDED = 3
+};
+
+struct Lisp_Symbol
+{
+ bool_bf gcmarkbit : 1;
+
+ /* Indicates where the value can be found:
+ 0 : it's a plain var, the value is in the `value' field.
+ 1 : it's a varalias, the value is really in the `alias' symbol.
+ 2 : it's a localized var, the value is in the `blv' object.
+ 3 : it's a forwarding variable, the value is in `forward'. */
+ ENUM_BF (symbol_redirect) redirect : 3;
+
+ /* Non-zero means symbol is constant, i.e. changing its value
+ should signal an error. If the value is 3, then the var
+ can be changed, but only by `defconst'. */
+ unsigned constant : 2;
+
+ /* Interned state of the symbol. This is an enumerator from
+ enum symbol_interned. */
+ unsigned interned : 2;
+
+ /* True means that this variable has been explicitly declared
+ special (with `defvar' etc), and shouldn't be lexically bound. */
+ bool_bf declared_special : 1;
+
+ /* True if pointed to from purespace and hence can't be GC'd. */
+ bool_bf pinned : 1;
+
+ /* The symbol's name, as a Lisp string. */
+ Lisp_Object name;
+
+ /* Value of the symbol or Qunbound if unbound. Which alternative of the
+ union is used depends on the `redirect' field above. */
+ union {
+ Lisp_Object value;
+ struct Lisp_Symbol *alias;
+ struct Lisp_Buffer_Local_Value *blv;
+ union Lisp_Fwd *fwd;
+ } val;
+
+ /* Function value of the symbol or Qnil if not fboundp. */
+ Lisp_Object function;
+
+ /* The symbol's property list. */
+ Lisp_Object plist;
+
+ /* Next symbol in obarray bucket, if the symbol is interned. */
+ struct Lisp_Symbol *next;
+};
+
+/* Declare a Lisp-callable function. The MAXARGS parameter has the same
+ meaning as in the DEFUN macro, and is used to construct a prototype. */
+/* We can use the same trick as in the DEFUN macro to generate the
+ appropriate prototype. */
+#define EXFUN(fnname, maxargs) \
+ extern Lisp_Object fnname DEFUN_ARGS_ ## maxargs
+
+/* Note that the weird token-substitution semantics of ANSI C makes
+ this work for MANY and UNEVALLED. */
+#define DEFUN_ARGS_MANY (ptrdiff_t, Lisp_Object *)
+#define DEFUN_ARGS_UNEVALLED (Lisp_Object)
+#define DEFUN_ARGS_0 (void)
+#define DEFUN_ARGS_1 (Lisp_Object)
+#define DEFUN_ARGS_2 (Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_3 (Lisp_Object, Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+ Lisp_Object)
+#define DEFUN_ARGS_6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+ Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+ Lisp_Object, Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_8 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+ Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
+
+/* Yield an integer that contains TAG along with PTR. */
+#define TAG_PTR(tag, ptr) \
+ ((USE_LSB_TAG ? (tag) : (EMACS_UINT) (tag) << VALBITS) + (uintptr_t) (ptr))
+
+/* Yield an integer that contains a symbol tag along with OFFSET.
+ OFFSET should be the offset in bytes from 'lispsym' to the symbol. */
+#define TAG_SYMOFFSET(offset) \
+ TAG_PTR (Lisp_Symbol, \
+ ((uintptr_t) (offset) >> (USE_LSB_TAG ? 0 : GCTYPEBITS)))
+
+/* XLI_BUILTIN_LISPSYM (iQwhatever) is equivalent to
+ XLI (builtin_lisp_symbol (Qwhatever)),
+ except the former expands to an integer constant expression. */
+#define XLI_BUILTIN_LISPSYM(iname) TAG_SYMOFFSET ((iname) * sizeof *lispsym)
+
+/* Declare extern constants for Lisp symbols. These can be helpful
+ when using a debugger like GDB, on older platforms where the debug
+ format does not represent C macros. */
+#define DEFINE_LISP_SYMBOL(name) \
+ DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name) \
+ DEFINE_GDB_SYMBOL_END (LISP_INITIALLY (XLI_BUILTIN_LISPSYM (i##name)))
+
+/* By default, define macros for Qt, etc., as this leads to a bit
+ better performance in the core Emacs interpreter. A plugin can
+ define DEFINE_NON_NIL_Q_SYMBOL_MACROS to be false, to be portable to
+ other Emacs instances that assign different values to Qt, etc. */
+#ifndef DEFINE_NON_NIL_Q_SYMBOL_MACROS
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS true
+#endif
+
+#include "globals.h"
+
+/* Convert a Lisp_Object to the corresponding EMACS_INT and vice versa.
+ At the machine level, these operations are no-ops. */
+LISP_MACRO_DEFUN (XLI, EMACS_INT, (Lisp_Object o), (o))
+LISP_MACRO_DEFUN (XIL, Lisp_Object, (EMACS_INT i), (i))
+
+/* In the size word of a vector, this bit means the vector has been marked. */
+
+DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, ARRAY_MARK_FLAG)
+# define ARRAY_MARK_FLAG PTRDIFF_MIN
+DEFINE_GDB_SYMBOL_END (ARRAY_MARK_FLAG)
+
+/* In the size word of a struct Lisp_Vector, this bit means it's really
+ some other vector-like object. */
+DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, PSEUDOVECTOR_FLAG)
+# define PSEUDOVECTOR_FLAG (PTRDIFF_MAX - PTRDIFF_MAX / 2)
+DEFINE_GDB_SYMBOL_END (PSEUDOVECTOR_FLAG)
+
+/* In a pseudovector, the size field actually contains a word with one
+ PSEUDOVECTOR_FLAG bit set, and one of the following values extracted
+ with PVEC_TYPE_MASK to indicate the actual type. */
+enum pvec_type
+{
+ PVEC_NORMAL_VECTOR,
+ PVEC_FREE,
+ PVEC_PROCESS,
+ PVEC_FRAME,
+ PVEC_WINDOW,
+ PVEC_BOOL_VECTOR,
+ PVEC_BUFFER,
+ PVEC_HASH_TABLE,
+ PVEC_TERMINAL,
+ PVEC_WINDOW_CONFIGURATION,
+ PVEC_SUBR,
+ PVEC_OTHER,
+ /* These should be last, check internal_equal to see why. */
+ PVEC_COMPILED,
+ PVEC_CHAR_TABLE,
+ PVEC_SUB_CHAR_TABLE,
+ PVEC_FONT /* Should be last because it's used for range checking. */
+};
+
+enum More_Lisp_Bits
+ {
+ /* For convenience, we also store the number of elements in these bits.
+ Note that this size is not necessarily the memory-footprint size, but
+ only the number of Lisp_Object fields (that need to be traced by GC).
+ The distinction is used, e.g., by Lisp_Process, which places extra
+ non-Lisp_Object fields at the end of the structure. */
+ PSEUDOVECTOR_SIZE_BITS = 12,
+ PSEUDOVECTOR_SIZE_MASK = (1 << PSEUDOVECTOR_SIZE_BITS) - 1,
+
+ /* To calculate the memory footprint of the pseudovector, it's useful
+ to store the size of non-Lisp area in word_size units here. */
+ PSEUDOVECTOR_REST_BITS = 12,
+ PSEUDOVECTOR_REST_MASK = (((1 << PSEUDOVECTOR_REST_BITS) - 1)
+ << PSEUDOVECTOR_SIZE_BITS),
+
+ /* Used to extract pseudovector subtype information. */
+ PSEUDOVECTOR_AREA_BITS = PSEUDOVECTOR_SIZE_BITS + PSEUDOVECTOR_REST_BITS,
+ PVEC_TYPE_MASK = 0x3f << PSEUDOVECTOR_AREA_BITS
+ };
+
+/* These functions extract various sorts of values from a Lisp_Object.
+ For example, if tem is a Lisp_Object whose type is Lisp_Cons,
+ XCONS (tem) is the struct Lisp_Cons * pointing to the memory for
+ that cons. */
+
+/* Mask for the value (as opposed to the type bits) of a Lisp object. */
+DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK)
+# define VALMASK (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX)
+DEFINE_GDB_SYMBOL_END (VALMASK)
+
+/* Largest and smallest representable fixnum values. These are the C
+ values. They are macros for use in static initializers. */
+#define MOST_POSITIVE_FIXNUM (EMACS_INT_MAX >> INTTYPEBITS)
+#define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM)
+
+#if USE_LSB_TAG
+
+LISP_MACRO_DEFUN (make_number, Lisp_Object, (EMACS_INT n), (n))
+LISP_MACRO_DEFUN (XINT, EMACS_INT, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XFASTINT, EMACS_INT, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XSYMBOL, struct Lisp_Symbol *, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XTYPE, enum Lisp_Type, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XUNTAG, void *, (Lisp_Object a, int type), (a, type))
+
+#else /* ! USE_LSB_TAG */
+
+/* Although compiled only if ! USE_LSB_TAG, the following functions
+ also work when USE_LSB_TAG; this is to aid future maintenance when
+ the lisp_h_* macros are eventually removed. */
+
+/* Make a Lisp integer representing the value of the low order
+ bits of N. */
+INLINE Lisp_Object
+make_number (EMACS_INT n)
+{
+ EMACS_INT int0 = Lisp_Int0;
+ if (USE_LSB_TAG)
+ {
+ EMACS_UINT u = n;
+ n = u << INTTYPEBITS;
+ n += int0;
+ }
+ else
+ {
+ n &= INTMASK;
+ n += (int0 << VALBITS);
+ }
+ return XIL (n);
+}
+
+/* Extract A's value as a signed integer. */
+INLINE EMACS_INT
+XINT (Lisp_Object a)
+{
+ EMACS_INT i = XLI (a);
+ if (! USE_LSB_TAG)
+ {
+ EMACS_UINT u = i;
+ i = u << INTTYPEBITS;
+ }
+ return i >> INTTYPEBITS;
+}
+
+/* Like XINT (A), but may be faster. A must be nonnegative.
+ If ! USE_LSB_TAG, this takes advantage of the fact that Lisp
+ integers have zero-bits in their tags. */
+INLINE EMACS_INT
+XFASTINT (Lisp_Object a)
+{
+ EMACS_INT int0 = Lisp_Int0;
+ EMACS_INT n = USE_LSB_TAG ? XINT (a) : XLI (a) - (int0 << VALBITS);
+ eassert (0 <= n);
+ return n;
+}
+
+/* Extract A's value as a symbol. */
+INLINE struct Lisp_Symbol *
+XSYMBOL (Lisp_Object a)
+{
+ uintptr_t i = (uintptr_t) XUNTAG (a, Lisp_Symbol);
+ if (! USE_LSB_TAG)
+ i <<= GCTYPEBITS;
+ void *p = (char *) lispsym + i;
+ return p;
+}
+
+/* Extract A's type. */
+INLINE enum Lisp_Type
+XTYPE (Lisp_Object a)
+{
+ EMACS_UINT i = XLI (a);
+ return USE_LSB_TAG ? i & ~VALMASK : i >> VALBITS;
+}
+
+/* Extract A's pointer value, assuming A's type is TYPE. */
+INLINE void *
+XUNTAG (Lisp_Object a, int type)
+{
+ intptr_t i = USE_LSB_TAG ? XLI (a) - type : XLI (a) & VALMASK;
+ return (void *) i;
+}
+
+#endif /* ! USE_LSB_TAG */
+
+/* Extract the pointer hidden within A. */
+LISP_MACRO_DEFUN (XPNTR, void *, (Lisp_Object a), (a))
+
+/* Extract A's value as an unsigned integer. */
+INLINE EMACS_UINT
+XUINT (Lisp_Object a)
+{
+ EMACS_UINT i = XLI (a);
+ return USE_LSB_TAG ? i >> INTTYPEBITS : i & INTMASK;
+}
+
+/* Return A's (Lisp-integer sized) hash. Happens to be like XUINT
+ right now, but XUINT should only be applied to objects we know are
+ integers. */
+LISP_MACRO_DEFUN (XHASH, EMACS_INT, (Lisp_Object a), (a))
+
+/* Like make_number (N), but may be faster. N must be in nonnegative range. */
+INLINE Lisp_Object
+make_natnum (EMACS_INT n)
+{
+ eassert (0 <= n && n <= MOST_POSITIVE_FIXNUM);
+ EMACS_INT int0 = Lisp_Int0;
+ return USE_LSB_TAG ? make_number (n) : XIL (n + (int0 << VALBITS));
+}
+
+/* Return true if X and Y are the same object. */
+LISP_MACRO_DEFUN (EQ, bool, (Lisp_Object x, Lisp_Object y), (x, y))
+
+/* Value is true if I doesn't fit into a Lisp fixnum. It is
+ written this way so that it also works if I is of unsigned
+ type or if I is a NaN. */
+
+#define FIXNUM_OVERFLOW_P(i) \
+ (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= MOST_POSITIVE_FIXNUM))
+
+INLINE ptrdiff_t
+clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper)
+{
+ return num < lower ? lower : num <= upper ? num : upper;
+}
+
+
+/* Extract a value or address from a Lisp_Object. */
+
+LISP_MACRO_DEFUN (XCONS, struct Lisp_Cons *, (Lisp_Object a), (a))
+
+INLINE struct Lisp_Vector *
+XVECTOR (Lisp_Object a)
+{
+ eassert (VECTORLIKEP (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_String *
+XSTRING (Lisp_Object a)
+{
+ eassert (STRINGP (a));
+ return XUNTAG (a, Lisp_String);
+}
+
+/* The index of the C-defined Lisp symbol SYM.
+ This can be used in a static initializer. */
+#define SYMBOL_INDEX(sym) i##sym
+
+INLINE struct Lisp_Float *
+XFLOAT (Lisp_Object a)
+{
+ eassert (FLOATP (a));
+ return XUNTAG (a, Lisp_Float);
+}
+
+/* Pseudovector types. */
+
+INLINE struct Lisp_Process *
+XPROCESS (Lisp_Object a)
+{
+ eassert (PROCESSP (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct window *
+XWINDOW (Lisp_Object a)
+{
+ eassert (WINDOWP (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct terminal *
+XTERMINAL (Lisp_Object a)
+{
+ eassert (TERMINALP (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Subr *
+XSUBR (Lisp_Object a)
+{
+ eassert (SUBRP (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct buffer *
+XBUFFER (Lisp_Object a)
+{
+ eassert (BUFFERP (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Char_Table *
+XCHAR_TABLE (Lisp_Object a)
+{
+ eassert (CHAR_TABLE_P (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Sub_Char_Table *
+XSUB_CHAR_TABLE (Lisp_Object a)
+{
+ eassert (SUB_CHAR_TABLE_P (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Bool_Vector *
+XBOOL_VECTOR (Lisp_Object a)
+{
+ eassert (BOOL_VECTOR_P (a));
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+/* Construct a Lisp_Object from a value or address. */
+
+INLINE Lisp_Object
+make_lisp_ptr (void *ptr, enum Lisp_Type type)
+{
+ Lisp_Object a = XIL (TAG_PTR (type, ptr));
+ eassert (XTYPE (a) == type && XUNTAG (a, type) == ptr);
+ return a;
+}
+
+INLINE Lisp_Object
+make_lisp_symbol (struct Lisp_Symbol *sym)
+{
+ Lisp_Object a = XIL (TAG_SYMOFFSET ((char *) sym - (char *) lispsym));
+ eassert (XSYMBOL (a) == sym);
+ return a;
+}
+
+INLINE Lisp_Object
+builtin_lisp_symbol (int index)
+{
+ return make_lisp_symbol (lispsym + index);
+}
+
+#define XSETINT(a, b) ((a) = make_number (b))
+#define XSETFASTINT(a, b) ((a) = make_natnum (b))
+#define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Lisp_Cons))
+#define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, Lisp_Vectorlike))
+#define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, Lisp_String))
+#define XSETSYMBOL(a, b) ((a) = make_lisp_symbol (b))
+#define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, Lisp_Float))
+#define XSETMISC(a, b) ((a) = make_lisp_ptr (b, Lisp_Misc))
+
+/* Pseudovector types. */
+
+#define XSETPVECTYPE(v, code) \
+ ((v)->header.size |= PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS))
+#define XSETPVECTYPESIZE(v, code, lispsize, restsize) \
+ ((v)->header.size = (PSEUDOVECTOR_FLAG \
+ | ((code) << PSEUDOVECTOR_AREA_BITS) \
+ | ((restsize) << PSEUDOVECTOR_SIZE_BITS) \
+ | (lispsize)))
+
+/* The cast to struct vectorlike_header * avoids aliasing issues. */
+#define XSETPSEUDOVECTOR(a, b, code) \
+ XSETTYPED_PSEUDOVECTOR (a, b, \
+ (((struct vectorlike_header *) \
+ XUNTAG (a, Lisp_Vectorlike)) \
+ ->size), \
+ code)
+#define XSETTYPED_PSEUDOVECTOR(a, b, size, code) \
+ (XSETVECTOR (a, b), \
+ eassert ((size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK)) \
+ == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS))))
+
+#define XSETWINDOW_CONFIGURATION(a, b) \
+ (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW_CONFIGURATION))
+#define XSETPROCESS(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_PROCESS))
+#define XSETWINDOW(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW))
+#define XSETTERMINAL(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_TERMINAL))
+#define XSETSUBR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUBR))
+#define XSETCOMPILED(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_COMPILED))
+#define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BUFFER))
+#define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_CHAR_TABLE))
+#define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR))
+#define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUB_CHAR_TABLE))
+
+/* Efficiently convert a pointer to a Lisp object and back. The
+ pointer is represented as a Lisp integer, so the garbage collector
+ does not know about it. The pointer should not have both Lisp_Int1
+ bits set, which makes this conversion inherently unportable. */
+
+INLINE void *
+XINTPTR (Lisp_Object a)
+{
+ return XUNTAG (a, Lisp_Int0);
+}
+
+INLINE Lisp_Object
+make_pointer_integer (void *p)
+{
+ Lisp_Object a = XIL (TAG_PTR (Lisp_Int0, p));
+ eassert (INTEGERP (a) && XINTPTR (a) == p);
+ return a;
+}
+
+/* Type checking. */
+
+LISP_MACRO_DEFUN_VOID (CHECK_TYPE,
+ (int ok, Lisp_Object predicate, Lisp_Object x),
+ (ok, predicate, x))
+
+/* See the macros in intervals.h. */
+
+typedef struct interval *INTERVAL;
+
+struct GCALIGNED Lisp_Cons
+ {
+ /* Car of this cons cell. */
+ Lisp_Object car;
+
+ union
+ {
+ /* Cdr of this cons cell. */
+ Lisp_Object cdr;
+
+ /* Used to chain conses on a free list. */
+ struct Lisp_Cons *chain;
+ } u;
+ };
+
+/* Take the car or cdr of something known to be a cons cell. */
+/* The _addr functions shouldn't be used outside of the minimal set
+ of code that has to know what a cons cell looks like. Other code not
+ part of the basic lisp implementation should assume that the car and cdr
+ fields are not accessible. (What if we want to switch to
+ a copying collector someday? Cached cons cell field addresses may be
+ invalidated at arbitrary points.) */
+INLINE Lisp_Object *
+xcar_addr (Lisp_Object c)
+{
+ return &XCONS (c)->car;
+}
+INLINE Lisp_Object *
+xcdr_addr (Lisp_Object c)
+{
+ return &XCONS (c)->u.cdr;
+}
+
+/* Use these from normal code. */
+LISP_MACRO_DEFUN (XCAR, Lisp_Object, (Lisp_Object c), (c))
+LISP_MACRO_DEFUN (XCDR, Lisp_Object, (Lisp_Object c), (c))
+
+/* Use these to set the fields of a cons cell.
+
+ Note that both arguments may refer to the same object, so 'n'
+ should not be read after 'c' is first modified. */
+INLINE void
+XSETCAR (Lisp_Object c, Lisp_Object n)
+{
+ *xcar_addr (c) = n;
+}
+INLINE void
+XSETCDR (Lisp_Object c, Lisp_Object n)
+{
+ *xcdr_addr (c) = n;
+}
+
+/* Take the car or cdr of something whose type is not known. */
+INLINE Lisp_Object
+CAR (Lisp_Object c)
+{
+ return (CONSP (c) ? XCAR (c)
+ : NILP (c) ? Qnil
+ : wrong_type_argument (Qlistp, c));
+}
+INLINE Lisp_Object
+CDR (Lisp_Object c)
+{
+ return (CONSP (c) ? XCDR (c)
+ : NILP (c) ? Qnil
+ : wrong_type_argument (Qlistp, c));
+}
+
+/* Take the car or cdr of something whose type is not known. */
+INLINE Lisp_Object
+CAR_SAFE (Lisp_Object c)
+{
+ return CONSP (c) ? XCAR (c) : Qnil;
+}
+INLINE Lisp_Object
+CDR_SAFE (Lisp_Object c)
+{
+ return CONSP (c) ? XCDR (c) : Qnil;
+}
+
+/* In a string or vector, the sign bit of the `size' is the gc mark bit. */
+
+struct GCALIGNED Lisp_String
+ {
+ ptrdiff_t size;
+ ptrdiff_t size_byte;
+ INTERVAL intervals; /* Text properties in this string. */
+ unsigned char *data;
+ };
+
+/* True if STR is a multibyte string. */
+INLINE bool
+STRING_MULTIBYTE (Lisp_Object str)
+{
+ return 0 <= XSTRING (str)->size_byte;
+}
+
+/* An upper bound on the number of bytes in a Lisp string, not
+ counting the terminating null. This a tight enough bound to
+ prevent integer overflow errors that would otherwise occur during
+ string size calculations. A string cannot contain more bytes than
+ a fixnum can represent, nor can it be so long that C pointer
+ arithmetic stops working on the string plus its terminating null.
+ Although the actual size limit (see STRING_BYTES_MAX in alloc.c)
+ may be a bit smaller than STRING_BYTES_BOUND, calculating it here
+ would expose alloc.c internal details that we'd rather keep
+ private.
+
+ This is a macro for use in static initializers. The cast to
+ ptrdiff_t ensures that the macro is signed. */
+#define STRING_BYTES_BOUND \
+ ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, min (SIZE_MAX, PTRDIFF_MAX) - 1))
+
+/* Mark STR as a unibyte string. */
+#define STRING_SET_UNIBYTE(STR) \
+ do { \
+ if (EQ (STR, empty_multibyte_string)) \
+ (STR) = empty_unibyte_string; \
+ else \
+ XSTRING (STR)->size_byte = -1; \
+ } while (false)
+
+/* Mark STR as a multibyte string. Assure that STR contains only
+ ASCII characters in advance. */
+#define STRING_SET_MULTIBYTE(STR) \
+ do { \
+ if (EQ (STR, empty_unibyte_string)) \
+ (STR) = empty_multibyte_string; \
+ else \
+ XSTRING (STR)->size_byte = XSTRING (STR)->size; \
+ } while (false)
+
+/* Convenience functions for dealing with Lisp strings. */
+
+INLINE unsigned char *
+SDATA (Lisp_Object string)
+{
+ return XSTRING (string)->data;
+}
+INLINE char *
+SSDATA (Lisp_Object string)
+{
+ /* Avoid "differ in sign" warnings. */
+ return (char *) SDATA (string);
+}
+INLINE unsigned char
+SREF (Lisp_Object string, ptrdiff_t index)
+{
+ return SDATA (string)[index];
+}
+INLINE void
+SSET (Lisp_Object string, ptrdiff_t index, unsigned char new)
+{
+ SDATA (string)[index] = new;
+}
+INLINE ptrdiff_t
+SCHARS (Lisp_Object string)
+{
+ return XSTRING (string)->size;
+}
+
+#ifdef GC_CHECK_STRING_BYTES
+extern ptrdiff_t string_bytes (struct Lisp_String *);
+#endif
+INLINE ptrdiff_t
+STRING_BYTES (struct Lisp_String *s)
+{
+#ifdef GC_CHECK_STRING_BYTES
+ return string_bytes (s);
+#else
+ return s->size_byte < 0 ? s->size : s->size_byte;
+#endif
+}
+
+INLINE ptrdiff_t
+SBYTES (Lisp_Object string)
+{
+ return STRING_BYTES (XSTRING (string));
+}
+INLINE void
+STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize)
+{
+ XSTRING (string)->size = newsize;
+}
+
+/* Header of vector-like objects. This documents the layout constraints on
+ vectors and pseudovectors (objects of PVEC_xxx subtype). It also prevents
+ compilers from being fooled by Emacs's type punning: XSETPSEUDOVECTOR
+ and PSEUDOVECTORP cast their pointers to struct vectorlike_header *,
+ because when two such pointers potentially alias, a compiler won't
+ incorrectly reorder loads and stores to their size fields. See
+ Bug#8546. */
+struct vectorlike_header
+ {
+ /* The only field contains various pieces of information:
+ - The MSB (ARRAY_MARK_FLAG) holds the gcmarkbit.
+ - The next bit (PSEUDOVECTOR_FLAG) indicates whether this is a plain
+ vector (0) or a pseudovector (1).
+ - If PSEUDOVECTOR_FLAG is 0, the rest holds the size (number
+ of slots) of the vector.
+ - If PSEUDOVECTOR_FLAG is 1, the rest is subdivided into three fields:
+ - a) pseudovector subtype held in PVEC_TYPE_MASK field;
+ - b) number of Lisp_Objects slots at the beginning of the object
+ held in PSEUDOVECTOR_SIZE_MASK field. These objects are always
+ traced by the GC;
+ - c) size of the rest fields held in PSEUDOVECTOR_REST_MASK and
+ measured in word_size units. Rest fields may also include
+ Lisp_Objects, but these objects usually needs some special treatment
+ during GC.
+ There are some exceptions. For PVEC_FREE, b) is always zero. For
+ PVEC_BOOL_VECTOR and PVEC_SUBR, both b) and c) are always zero.
+ Current layout limits the pseudovectors to 63 PVEC_xxx subtypes,
+ 4095 Lisp_Objects in GC-ed area and 4095 word-sized other slots. */
+ ptrdiff_t size;
+ };
+
+/* A regular vector is just a header plus an array of Lisp_Objects. */
+
+struct Lisp_Vector
+ {
+ struct vectorlike_header header;
+ Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
+ };
+
+/* C11 prohibits alignof (struct Lisp_Vector), so compute it manually. */
+enum
+ {
+ ALIGNOF_STRUCT_LISP_VECTOR
+ = alignof (union { struct vectorlike_header a; Lisp_Object b; })
+ };
+
+/* A boolvector is a kind of vectorlike, with contents like a string. */
+
+struct Lisp_Bool_Vector
+ {
+ /* HEADER.SIZE is the vector's size field. It doesn't have the real size,
+ just the subtype information. */
+ struct vectorlike_header header;
+ /* This is the size in bits. */
+ EMACS_INT size;
+ /* The actual bits, packed into bytes.
+ Zeros fill out the last word if needed.
+ The bits are in little-endian order in the bytes, and
+ the bytes are in little-endian order in the words. */
+ bits_word data[FLEXIBLE_ARRAY_MEMBER];
+ };
+
+INLINE EMACS_INT
+bool_vector_size (Lisp_Object a)
+{
+ EMACS_INT size = XBOOL_VECTOR (a)->size;
+ eassume (0 <= size);
+ return size;
+}
+
+INLINE bits_word *
+bool_vector_data (Lisp_Object a)
+{
+ return XBOOL_VECTOR (a)->data;
+}
+
+INLINE unsigned char *
+bool_vector_uchar_data (Lisp_Object a)
+{
+ return (unsigned char *) bool_vector_data (a);
+}
+
+/* The number of data words and bytes in a bool vector with SIZE bits. */
+
+INLINE EMACS_INT
+bool_vector_words (EMACS_INT size)
+{
+ eassume (0 <= size && size <= EMACS_INT_MAX - (BITS_PER_BITS_WORD - 1));
+ return (size + BITS_PER_BITS_WORD - 1) / BITS_PER_BITS_WORD;
+}
+
+INLINE EMACS_INT
+bool_vector_bytes (EMACS_INT size)
+{
+ eassume (0 <= size && size <= EMACS_INT_MAX - (BITS_PER_BITS_WORD - 1));
+ return (size + BOOL_VECTOR_BITS_PER_CHAR - 1) / BOOL_VECTOR_BITS_PER_CHAR;
+}
+
+/* True if A's Ith bit is set. */
+
+INLINE bool
+bool_vector_bitref (Lisp_Object a, EMACS_INT i)
+{
+ eassume (0 <= i && i < bool_vector_size (a));
+ return !! (bool_vector_uchar_data (a)[i / BOOL_VECTOR_BITS_PER_CHAR]
+ & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR)));
+}
+
+INLINE Lisp_Object
+bool_vector_ref (Lisp_Object a, EMACS_INT i)
+{
+ return bool_vector_bitref (a, i) ? Qt : Qnil;
+}
+
+/* Set A's Ith bit to B. */
+
+INLINE void
+bool_vector_set (Lisp_Object a, EMACS_INT i, bool b)
+{
+ unsigned char *addr;
+
+ eassume (0 <= i && i < bool_vector_size (a));
+ addr = &bool_vector_uchar_data (a)[i / BOOL_VECTOR_BITS_PER_CHAR];
+
+ if (b)
+ *addr |= 1 << (i % BOOL_VECTOR_BITS_PER_CHAR);
+ else
+ *addr &= ~ (1 << (i % BOOL_VECTOR_BITS_PER_CHAR));
+}
+
+/* Some handy constants for calculating sizes
+ and offsets, mostly of vectorlike objects. */
+
+enum
+ {
+ header_size = offsetof (struct Lisp_Vector, contents),
+ bool_header_size = offsetof (struct Lisp_Bool_Vector, data),
+ word_size = sizeof (Lisp_Object)
+ };
+
+/* Conveniences for dealing with Lisp arrays. */
+
+INLINE Lisp_Object
+AREF (Lisp_Object array, ptrdiff_t idx)
+{
+ return XVECTOR (array)->contents[idx];
+}
+
+INLINE Lisp_Object *
+aref_addr (Lisp_Object array, ptrdiff_t idx)
+{
+ return & XVECTOR (array)->contents[idx];
+}
+
+INLINE ptrdiff_t
+ASIZE (Lisp_Object array)
+{
+ return XVECTOR (array)->header.size;
+}
+
+INLINE void
+ASET (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
+{
+ eassert (0 <= idx && idx < ASIZE (array));
+ XVECTOR (array)->contents[idx] = val;
+}
+
+INLINE void
+gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
+{
+ /* Like ASET, but also can be used in the garbage collector:
+ sweep_weak_table calls set_hash_key etc. while the table is marked. */
+ eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG));
+ XVECTOR (array)->contents[idx] = val;
+}
+
+/* True, since Qnil's representation is zero. Every place in the code
+ that assumes Qnil is zero should verify (NIL_IS_ZERO), to make it easy
+ to find such assumptions later if we change Qnil to be nonzero. */
+enum { NIL_IS_ZERO = XLI_BUILTIN_LISPSYM (iQnil) == 0 };
+
+/* Clear the object addressed by P, with size NBYTES, so that all its
+ bytes are zero and all its Lisp values are nil. */
+INLINE void
+memclear (void *p, ptrdiff_t nbytes)
+{
+ eassert (0 <= nbytes);
+ verify (NIL_IS_ZERO);
+ /* Since Qnil is zero, memset suffices. */
+ memset (p, 0, nbytes);
+}
+
+/* If a struct is made to look like a vector, this macro returns the length
+ of the shortest vector that would hold that struct. */
+
+#define VECSIZE(type) \
+ ((sizeof (type) - header_size + word_size - 1) / word_size)
+
+/* Like VECSIZE, but used when the pseudo-vector has non-Lisp_Object fields
+ at the end and we need to compute the number of Lisp_Object fields (the
+ ones that the GC needs to trace). */
+
+#define PSEUDOVECSIZE(type, nonlispfield) \
+ ((offsetof (type, nonlispfield) - header_size) / word_size)
+
+/* Compute A OP B, using the unsigned comparison operator OP. A and B
+ should be integer expressions. This is not the same as
+ mathematical comparison; for example, UNSIGNED_CMP (0, <, -1)
+ returns true. For efficiency, prefer plain unsigned comparison if A
+ and B's sizes both fit (after integer promotion). */
+#define UNSIGNED_CMP(a, op, b) \
+ (max (sizeof ((a) + 0), sizeof ((b) + 0)) <= sizeof (unsigned) \
+ ? ((a) + (unsigned) 0) op ((b) + (unsigned) 0) \
+ : ((a) + (uintmax_t) 0) op ((b) + (uintmax_t) 0))
+
+/* True iff C is an ASCII character. */
+#define ASCII_CHAR_P(c) UNSIGNED_CMP (c, <, 0x80)
+
+/* A char-table is a kind of vectorlike, with contents are like a
+ vector but with a few other slots. For some purposes, it makes
+ sense to handle a char-table with type struct Lisp_Vector. An
+ element of a char table can be any Lisp objects, but if it is a sub
+ char-table, we treat it a table that contains information of a
+ specific range of characters. A sub char-table is like a vector but
+ with two integer fields between the header and Lisp data, which means
+ that it has to be marked with some precautions (see mark_char_table
+ in alloc.c). A sub char-table appears only in an element of a char-table,
+ and there's no way to access it directly from Emacs Lisp program. */
+
+enum CHARTAB_SIZE_BITS
+ {
+ CHARTAB_SIZE_BITS_0 = 6,
+ CHARTAB_SIZE_BITS_1 = 4,
+ CHARTAB_SIZE_BITS_2 = 5,
+ CHARTAB_SIZE_BITS_3 = 7
+ };
+
+extern const int chartab_size[4];
+
+struct Lisp_Char_Table
+ {
+ /* HEADER.SIZE is the vector's size field, which also holds the
+ pseudovector type information. It holds the size, too.
+ The size counts the defalt, parent, purpose, ascii,
+ contents, and extras slots. */
+ struct vectorlike_header header;
+
+ /* This holds a default value,
+ which is used whenever the value for a specific character is nil. */
+ Lisp_Object defalt;
+
+ /* This points to another char table, which we inherit from when the
+ value for a specific character is nil. The `defalt' slot takes
+ precedence over this. */
+ Lisp_Object parent;
+
+ /* This is a symbol which says what kind of use this char-table is
+ meant for. */
+ Lisp_Object purpose;
+
+ /* The bottom sub char-table for characters of the range 0..127. It
+ is nil if none of ASCII character has a specific value. */
+ Lisp_Object ascii;
+
+ Lisp_Object contents[(1 << CHARTAB_SIZE_BITS_0)];
+
+ /* These hold additional data. It is a vector. */
+ Lisp_Object extras[FLEXIBLE_ARRAY_MEMBER];
+ };
+
+struct Lisp_Sub_Char_Table
+ {
+ /* HEADER.SIZE is the vector's size field, which also holds the
+ pseudovector type information. It holds the size, too. */
+ struct vectorlike_header header;
+
+ /* Depth of this sub char-table. It should be 1, 2, or 3. A sub
+ char-table of depth 1 contains 16 elements, and each element
+ covers 4096 (128*32) characters. A sub char-table of depth 2
+ contains 32 elements, and each element covers 128 characters. A
+ sub char-table of depth 3 contains 128 elements, and each element
+ is for one character. */
+ int depth;
+
+ /* Minimum character covered by the sub char-table. */
+ int min_char;
+
+ /* Use set_sub_char_table_contents to set this. */
+ Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
+ };
+
+INLINE Lisp_Object
+CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t idx)
+{
+ struct Lisp_Char_Table *tbl = NULL;
+ Lisp_Object val;
+ do
+ {
+ tbl = tbl ? XCHAR_TABLE (tbl->parent) : XCHAR_TABLE (ct);
+ val = (! SUB_CHAR_TABLE_P (tbl->ascii) ? tbl->ascii
+ : XSUB_CHAR_TABLE (tbl->ascii)->contents[idx]);
+ if (NILP (val))
+ val = tbl->defalt;
+ }
+ while (NILP (val) && ! NILP (tbl->parent));
+
+ return val;
+}
+
+/* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
+ characters. Do not check validity of CT. */
+INLINE Lisp_Object
+CHAR_TABLE_REF (Lisp_Object ct, int idx)
+{
+ return (ASCII_CHAR_P (idx)
+ ? CHAR_TABLE_REF_ASCII (ct, idx)
+ : char_table_ref (ct, idx));
+}
+
+/* Equivalent to Faset (CT, IDX, VAL) with optimization for ASCII and
+ 8-bit European characters. Do not check validity of CT. */
+INLINE void
+CHAR_TABLE_SET (Lisp_Object ct, int idx, Lisp_Object val)
+{
+ if (ASCII_CHAR_P (idx) && SUB_CHAR_TABLE_P (XCHAR_TABLE (ct)->ascii))
+ set_sub_char_table_contents (XCHAR_TABLE (ct)->ascii, idx, val);
+ else
+ char_table_set (ct, idx, val);
+}
+
+/* This structure describes a built-in function.
+ It is generated by the DEFUN macro only.
+ defsubr makes it into a Lisp object. */
+
+struct Lisp_Subr
+ {
+ struct vectorlike_header header;
+ union {
+ Lisp_Object (*a0) (void);
+ Lisp_Object (*a1) (Lisp_Object);
+ Lisp_Object (*a2) (Lisp_Object, Lisp_Object);
+ Lisp_Object (*a3) (Lisp_Object, Lisp_Object, Lisp_Object);
+ Lisp_Object (*a4) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+ Lisp_Object (*a5) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+ Lisp_Object (*a6) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+ Lisp_Object (*a7) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+ Lisp_Object (*a8) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+ Lisp_Object (*aUNEVALLED) (Lisp_Object args);
+ Lisp_Object (*aMANY) (ptrdiff_t, Lisp_Object *);
+ } function;
+ short min_args, max_args;
+ const char *symbol_name;
+ const char *intspec;
+ const char *doc;
+ };
+
+enum char_table_specials
+ {
+ /* This is the number of slots that every char table must have. This
+ counts the ordinary slots and the top, defalt, parent, and purpose
+ slots. */
+ CHAR_TABLE_STANDARD_SLOTS = PSEUDOVECSIZE (struct Lisp_Char_Table, extras),
+
+ /* This is an index of first Lisp_Object field in Lisp_Sub_Char_Table
+ when the latter is treated as an ordinary Lisp_Vector. */
+ SUB_CHAR_TABLE_OFFSET = PSEUDOVECSIZE (struct Lisp_Sub_Char_Table, contents)
+ };
+
+/* Return the number of "extra" slots in the char table CT. */
+
+INLINE int
+CHAR_TABLE_EXTRA_SLOTS (struct Lisp_Char_Table *ct)
+{
+ return ((ct->header.size & PSEUDOVECTOR_SIZE_MASK)
+ - CHAR_TABLE_STANDARD_SLOTS);
+}
+
+/* Make sure that sub char-table contents slot is where we think it is. */
+verify (offsetof (struct Lisp_Sub_Char_Table, contents)
+ == offsetof (struct Lisp_Vector, contents[SUB_CHAR_TABLE_OFFSET]));
+
+/***********************************************************************
+ Symbols
+ ***********************************************************************/
+
+/* Value is name of symbol. */
+
+LISP_MACRO_DEFUN (SYMBOL_VAL, Lisp_Object, (struct Lisp_Symbol *sym), (sym))
+
+INLINE struct Lisp_Symbol *
+SYMBOL_ALIAS (struct Lisp_Symbol *sym)
+{
+ eassert (sym->redirect == SYMBOL_VARALIAS);
+ return sym->val.alias;
+}
+INLINE struct Lisp_Buffer_Local_Value *
+SYMBOL_BLV (struct Lisp_Symbol *sym)
+{
+ eassert (sym->redirect == SYMBOL_LOCALIZED);
+ return sym->val.blv;
+}
+INLINE union Lisp_Fwd *
+SYMBOL_FWD (struct Lisp_Symbol *sym)
+{
+ eassert (sym->redirect == SYMBOL_FORWARDED);
+ return sym->val.fwd;
+}
+
+LISP_MACRO_DEFUN_VOID (SET_SYMBOL_VAL,
+ (struct Lisp_Symbol *sym, Lisp_Object v), (sym, v))
+
+INLINE void
+SET_SYMBOL_ALIAS (struct Lisp_Symbol *sym, struct Lisp_Symbol *v)
+{
+ eassert (sym->redirect == SYMBOL_VARALIAS);
+ sym->val.alias = v;
+}
+INLINE void
+SET_SYMBOL_BLV (struct Lisp_Symbol *sym, struct Lisp_Buffer_Local_Value *v)
+{
+ eassert (sym->redirect == SYMBOL_LOCALIZED);
+ sym->val.blv = v;
+}
+INLINE void
+SET_SYMBOL_FWD (struct Lisp_Symbol *sym, union Lisp_Fwd *v)
+{
+ eassert (sym->redirect == SYMBOL_FORWARDED);
+ sym->val.fwd = v;
+}
+
+INLINE Lisp_Object
+SYMBOL_NAME (Lisp_Object sym)
+{
+ return XSYMBOL (sym)->name;
+}
+
+/* Value is true if SYM is an interned symbol. */
+
+INLINE bool
+SYMBOL_INTERNED_P (Lisp_Object sym)
+{
+ return XSYMBOL (sym)->interned != SYMBOL_UNINTERNED;
+}
+
+/* Value is true if SYM is interned in initial_obarray. */
+
+INLINE bool
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object sym)
+{
+ return XSYMBOL (sym)->interned == SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
+}
+
+/* Value is non-zero if symbol is considered a constant, i.e. its
+ value cannot be changed (there is an exception for keyword symbols,
+ whose value can be set to the keyword symbol itself). */
+
+LISP_MACRO_DEFUN (SYMBOL_CONSTANT_P, int, (Lisp_Object sym), (sym))
+
+/* Placeholder for make-docfile to process. The actual symbol
+ definition is done by lread.c's defsym. */
+#define DEFSYM(sym, name) /* empty */
+
+
+/***********************************************************************
+ Hash Tables
+ ***********************************************************************/
+
+/* The structure of a Lisp hash table. */
+
+struct hash_table_test
+{
+ /* Name of the function used to compare keys. */
+ Lisp_Object name;
+
+ /* User-supplied hash function, or nil. */
+ Lisp_Object user_hash_function;
+
+ /* User-supplied key comparison function, or nil. */
+ Lisp_Object user_cmp_function;
+
+ /* C function to compare two keys. */
+ bool (*cmpfn) (struct hash_table_test *t, Lisp_Object, Lisp_Object);
+
+ /* C function to compute hash code. */
+ EMACS_UINT (*hashfn) (struct hash_table_test *t, Lisp_Object);
+};
+
+struct Lisp_Hash_Table
+{
+ /* This is for Lisp; the hash table code does not refer to it. */
+ struct vectorlike_header header;
+
+ /* Nil if table is non-weak. Otherwise a symbol describing the
+ weakness of the table. */
+ Lisp_Object weak;
+
+ /* When the table is resized, and this is an integer, compute the
+ new size by adding this to the old size. If a float, compute the
+ new size by multiplying the old size with this factor. */
+ Lisp_Object rehash_size;
+
+ /* Resize hash table when number of entries/ table size is >= this
+ ratio, a float. */
+ Lisp_Object rehash_threshold;
+
+ /* Vector of hash codes. If hash[I] is nil, this means that the
+ I-th entry is unused. */
+ Lisp_Object hash;
+
+ /* Vector used to chain entries. If entry I is free, next[I] is the
+ entry number of the next free item. If entry I is non-free,
+ next[I] is the index of the next entry in the collision chain. */
+ Lisp_Object next;
+
+ /* Index of first free entry in free list. */
+ Lisp_Object next_free;
+
+ /* Bucket vector. A non-nil entry is the index of the first item in
+ a collision chain. This vector's size can be larger than the
+ hash table size to reduce collisions. */
+ Lisp_Object index;
+
+ /* Only the fields above are traced normally by the GC. The ones below
+ `count' are special and are either ignored by the GC or traced in
+ a special way (e.g. because of weakness). */
+
+ /* Number of key/value entries in the table. */
+ ptrdiff_t count;
+
+ /* Vector of keys and values. The key of item I is found at index
+ 2 * I, the value is found at index 2 * I + 1.
+ This is gc_marked specially if the table is weak. */
+ Lisp_Object key_and_value;
+
+ /* The comparison and hash functions. */
+ struct hash_table_test test;
+
+ /* Next weak hash table if this is a weak hash table. The head
+ of the list is in weak_hash_tables. */
+ struct Lisp_Hash_Table *next_weak;
+};
+
+
+INLINE struct Lisp_Hash_Table *
+XHASH_TABLE (Lisp_Object a)
+{
+ return XUNTAG (a, Lisp_Vectorlike);
+}
+
+#define XSET_HASH_TABLE(VAR, PTR) \
+ (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE))
+
+INLINE bool
+HASH_TABLE_P (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_HASH_TABLE);
+}
+
+/* Value is the key part of entry IDX in hash table H. */
+INLINE Lisp_Object
+HASH_KEY (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+ return AREF (h->key_and_value, 2 * idx);
+}
+
+/* Value is the value part of entry IDX in hash table H. */
+INLINE Lisp_Object
+HASH_VALUE (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+ return AREF (h->key_and_value, 2 * idx + 1);
+}
+
+/* Value is the index of the next entry following the one at IDX
+ in hash table H. */
+INLINE Lisp_Object
+HASH_NEXT (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+ return AREF (h->next, idx);
+}
+
+/* Value is the hash code computed for entry IDX in hash table H. */
+INLINE Lisp_Object
+HASH_HASH (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+ return AREF (h->hash, idx);
+}
+
+/* Value is the index of the element in hash table H that is the
+ start of the collision list at index IDX in the index vector of H. */
+INLINE Lisp_Object
+HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+ return AREF (h->index, idx);
+}
+
+/* Value is the size of hash table H. */
+INLINE ptrdiff_t
+HASH_TABLE_SIZE (struct Lisp_Hash_Table *h)
+{
+ return ASIZE (h->next);
+}
+
+/* Default size for hash tables if not specified. */
+
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE = 65 };
+
+/* Default threshold specifying when to resize a hash table. The
+ value gives the ratio of current entries in the hash table and the
+ size of the hash table. */
+
+static double const DEFAULT_REHASH_THRESHOLD = 0.8;
+
+/* Default factor by which to increase the size of a hash table. */
+
+static double const DEFAULT_REHASH_SIZE = 1.5;
+
+/* Combine two integers X and Y for hashing. The result might not fit
+ into a Lisp integer. */
+
+INLINE EMACS_UINT
+sxhash_combine (EMACS_UINT x, EMACS_UINT y)
+{
+ return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y;
+}
+
+/* Hash X, returning a value that fits into a fixnum. */
+
+INLINE EMACS_UINT
+SXHASH_REDUCE (EMACS_UINT x)
+{
+ return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK;
+}
+
+/* These structures are used for various misc types. */
+
+struct Lisp_Misc_Any /* Supertype of all Misc types. */
+{
+ ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_??? */
+ bool_bf gcmarkbit : 1;
+ unsigned spacer : 15;
+};
+
+struct Lisp_Marker
+{
+ ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Marker */
+ bool_bf gcmarkbit : 1;
+ unsigned spacer : 13;
+ /* This flag is temporarily used in the functions
+ decode/encode_coding_object to record that the marker position
+ must be adjusted after the conversion. */
+ bool_bf need_adjustment : 1;
+ /* True means normal insertion at the marker's position
+ leaves the marker after the inserted text. */
+ bool_bf insertion_type : 1;
+ /* This is the buffer that the marker points into, or 0 if it points nowhere.
+ Note: a chain of markers can contain markers pointing into different
+ buffers (the chain is per buffer_text rather than per buffer, so it's
+ shared between indirect buffers). */
+ /* This is used for (other than NULL-checking):
+ - Fmarker_buffer
+ - Fset_marker: check eq(oldbuf, newbuf) to avoid unchain+rechain.
+ - unchain_marker: to find the list from which to unchain.
+ - Fkill_buffer: to only unchain the markers of current indirect buffer.
+ */
+ struct buffer *buffer;
+
+ /* The remaining fields are meaningless in a marker that
+ does not point anywhere. */
+
+ /* For markers that point somewhere,
+ this is used to chain of all the markers in a given buffer. */
+ /* We could remove it and use an array in buffer_text instead.
+ That would also allow to preserve it ordered. */
+ struct Lisp_Marker *next;
+ /* This is the char position where the marker points. */
+ ptrdiff_t charpos;
+ /* This is the byte position.
+ It's mostly used as a charpos<->bytepos cache (i.e. it's not directly
+ used to implement the functionality of markers, but rather to (ab)use
+ markers as a cache for char<->byte mappings). */
+ ptrdiff_t bytepos;
+};
+
+/* START and END are markers in the overlay's buffer, and
+ PLIST is the overlay's property list. */
+struct Lisp_Overlay
+/* An overlay's real data content is:
+ - plist
+ - buffer (really there are two buffer pointers, one per marker,
+ and both points to the same buffer)
+ - insertion type of both ends (per-marker fields)
+ - start & start byte (of start marker)
+ - end & end byte (of end marker)
+ - next (singly linked list of overlays)
+ - next fields of start and end markers (singly linked list of markers).
+ I.e. 9words plus 2 bits, 3words of which are for external linked lists.
+*/
+ {
+ ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Overlay */
+ bool_bf gcmarkbit : 1;
+ unsigned spacer : 15;
+ struct Lisp_Overlay *next;
+ Lisp_Object start;
+ Lisp_Object end;
+ Lisp_Object plist;
+ };
+
+/* Types of data which may be saved in a Lisp_Save_Value. */
+
+enum
+ {
+ SAVE_UNUSED,
+ SAVE_INTEGER,
+ SAVE_FUNCPOINTER,
+ SAVE_POINTER,
+ SAVE_OBJECT
+ };
+
+/* Number of bits needed to store one of the above values. */
+enum { SAVE_SLOT_BITS = 3 };
+
+/* Number of slots in a save value where save_type is nonzero. */
+enum { SAVE_VALUE_SLOTS = 4 };
+
+/* Bit-width and values for struct Lisp_Save_Value's save_type member. */
+
+enum { SAVE_TYPE_BITS = SAVE_VALUE_SLOTS * SAVE_SLOT_BITS + 1 };
+
+enum Lisp_Save_Type
+ {
+ SAVE_TYPE_INT_INT = SAVE_INTEGER + (SAVE_INTEGER << SAVE_SLOT_BITS),
+ SAVE_TYPE_INT_INT_INT
+ = (SAVE_INTEGER + (SAVE_TYPE_INT_INT << SAVE_SLOT_BITS)),
+ SAVE_TYPE_OBJ_OBJ = SAVE_OBJECT + (SAVE_OBJECT << SAVE_SLOT_BITS),
+ SAVE_TYPE_OBJ_OBJ_OBJ = SAVE_OBJECT + (SAVE_TYPE_OBJ_OBJ << SAVE_SLOT_BITS),
+ SAVE_TYPE_OBJ_OBJ_OBJ_OBJ
+ = SAVE_OBJECT + (SAVE_TYPE_OBJ_OBJ_OBJ << SAVE_SLOT_BITS),
+ SAVE_TYPE_PTR_INT = SAVE_POINTER + (SAVE_INTEGER << SAVE_SLOT_BITS),
+ SAVE_TYPE_PTR_OBJ = SAVE_POINTER + (SAVE_OBJECT << SAVE_SLOT_BITS),
+ SAVE_TYPE_PTR_PTR = SAVE_POINTER + (SAVE_POINTER << SAVE_SLOT_BITS),
+ SAVE_TYPE_FUNCPTR_PTR_OBJ
+ = SAVE_FUNCPOINTER + (SAVE_TYPE_PTR_OBJ << SAVE_SLOT_BITS),
+
+ /* This has an extra bit indicating it's raw memory. */
+ SAVE_TYPE_MEMORY = SAVE_TYPE_PTR_INT + (1 << (SAVE_TYPE_BITS - 1))
+ };
+
+/* Special object used to hold a different values for later use.
+
+ This is mostly used to package C integers and pointers to call
+ record_unwind_protect when two or more values need to be saved.
+ For example:
+
+ ...
+ struct my_data *md = get_my_data ();
+ ptrdiff_t mi = get_my_integer ();
+ record_unwind_protect (my_unwind, make_save_ptr_int (md, mi));
+ ...
+
+ Lisp_Object my_unwind (Lisp_Object arg)
+ {
+ struct my_data *md = XSAVE_POINTER (arg, 0);
+ ptrdiff_t mi = XSAVE_INTEGER (arg, 1);
+ ...
+ }
+
+ If ENABLE_CHECKING is in effect, XSAVE_xxx macros do type checking of the
+ saved objects and raise eassert if type of the saved object doesn't match
+ the type which is extracted. In the example above, XSAVE_INTEGER (arg, 2)
+ and XSAVE_OBJECT (arg, 0) are wrong because nothing was saved in slot 2 and
+ slot 0 is a pointer. */
+
+typedef void (*voidfuncptr) (void);
+
+struct Lisp_Save_Value
+ {
+ ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Save_Value */
+ bool_bf gcmarkbit : 1;
+ unsigned spacer : 32 - (16 + 1 + SAVE_TYPE_BITS);
+
+ /* V->data may hold up to SAVE_VALUE_SLOTS entries. The type of
+ V's data entries are determined by V->save_type. E.g., if
+ V->save_type == SAVE_TYPE_PTR_OBJ, V->data[0] is a pointer,
+ V->data[1] is an integer, and V's other data entries are unused.
+
+ If V->save_type == SAVE_TYPE_MEMORY, V->data[0].pointer is the address of
+ a memory area containing V->data[1].integer potential Lisp_Objects. */
+ ENUM_BF (Lisp_Save_Type) save_type : SAVE_TYPE_BITS;
+ union {
+ void *pointer;
+ voidfuncptr funcpointer;
+ ptrdiff_t integer;
+ Lisp_Object object;
+ } data[SAVE_VALUE_SLOTS];
+ };
+
+/* Return the type of V's Nth saved value. */
+INLINE int
+save_type (struct Lisp_Save_Value *v, int n)
+{
+ eassert (0 <= n && n < SAVE_VALUE_SLOTS);
+ return (v->save_type >> (SAVE_SLOT_BITS * n) & ((1 << SAVE_SLOT_BITS) - 1));
+}
+
+/* Get and set the Nth saved pointer. */
+
+INLINE void *
+XSAVE_POINTER (Lisp_Object obj, int n)
+{
+ eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER);
+ return XSAVE_VALUE (obj)->data[n].pointer;
+}
+INLINE void
+set_save_pointer (Lisp_Object obj, int n, void *val)
+{
+ eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER);
+ XSAVE_VALUE (obj)->data[n].pointer = val;
+}
+INLINE voidfuncptr
+XSAVE_FUNCPOINTER (Lisp_Object obj, int n)
+{
+ eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_FUNCPOINTER);
+ return XSAVE_VALUE (obj)->data[n].funcpointer;
+}
+
+/* Likewise for the saved integer. */
+
+INLINE ptrdiff_t
+XSAVE_INTEGER (Lisp_Object obj, int n)
+{
+ eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER);
+ return XSAVE_VALUE (obj)->data[n].integer;
+}
+INLINE void
+set_save_integer (Lisp_Object obj, int n, ptrdiff_t val)
+{
+ eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER);
+ XSAVE_VALUE (obj)->data[n].integer = val;
+}
+
+/* Extract Nth saved object. */
+
+INLINE Lisp_Object
+XSAVE_OBJECT (Lisp_Object obj, int n)
+{
+ eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_OBJECT);
+ return XSAVE_VALUE (obj)->data[n].object;
+}
+
+/* A finalizer sentinel. */
+struct Lisp_Finalizer
+ {
+ struct Lisp_Misc_Any base;
+
+ /* Circular list of all active weak references. */
+ struct Lisp_Finalizer *prev;
+ struct Lisp_Finalizer *next;
+
+ /* Call FUNCTION when the finalizer becomes unreachable, even if
+ FUNCTION contains a reference to the finalizer; i.e., call
+ FUNCTION when it is reachable _only_ through finalizers. */
+ Lisp_Object function;
+ };
+
+/* A miscellaneous object, when it's on the free list. */
+struct Lisp_Free
+ {
+ ENUM_BF (Lisp_Misc_Type) type : 16; /* = Lisp_Misc_Free */
+ bool_bf gcmarkbit : 1;
+ unsigned spacer : 15;
+ union Lisp_Misc *chain;
+ };
+
+/* To get the type field of a union Lisp_Misc, use XMISCTYPE.
+ It uses one of these struct subtypes to get the type field. */
+
+union Lisp_Misc
+ {
+ struct Lisp_Misc_Any u_any; /* Supertype of all Misc types. */
+ struct Lisp_Free u_free;
+ struct Lisp_Marker u_marker;
+ struct Lisp_Overlay u_overlay;
+ struct Lisp_Save_Value u_save_value;
+ struct Lisp_Finalizer u_finalizer;
+ };
+
+INLINE union Lisp_Misc *
+XMISC (Lisp_Object a)
+{
+ return XUNTAG (a, Lisp_Misc);
+}
+
+INLINE struct Lisp_Misc_Any *
+XMISCANY (Lisp_Object a)
+{
+ eassert (MISCP (a));
+ return & XMISC (a)->u_any;
+}
+
+INLINE enum Lisp_Misc_Type
+XMISCTYPE (Lisp_Object a)
+{
+ return XMISCANY (a)->type;
+}
+
+INLINE struct Lisp_Marker *
+XMARKER (Lisp_Object a)
+{
+ eassert (MARKERP (a));
+ return & XMISC (a)->u_marker;
+}
+
+INLINE struct Lisp_Overlay *
+XOVERLAY (Lisp_Object a)
+{
+ eassert (OVERLAYP (a));
+ return & XMISC (a)->u_overlay;
+}
+
+INLINE struct Lisp_Save_Value *
+XSAVE_VALUE (Lisp_Object a)
+{
+ eassert (SAVE_VALUEP (a));
+ return & XMISC (a)->u_save_value;
+}
+
+INLINE struct Lisp_Finalizer *
+XFINALIZER (Lisp_Object a)
+{
+ eassert (FINALIZERP (a));
+ return & XMISC (a)->u_finalizer;
+}
+
+
+/* Forwarding pointer to an int variable.
+ This is allowed only in the value cell of a symbol,
+ and it means that the symbol's value really lives in the
+ specified int variable. */
+struct Lisp_Intfwd
+ {
+ enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Int */
+ EMACS_INT *intvar;
+ };
+
+/* Boolean forwarding pointer to an int variable.
+ This is like Lisp_Intfwd except that the ostensible
+ "value" of the symbol is t if the bool variable is true,
+ nil if it is false. */
+struct Lisp_Boolfwd
+ {
+ enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Bool */
+ bool *boolvar;
+ };
+
+/* Forwarding pointer to a Lisp_Object variable.
+ This is allowed only in the value cell of a symbol,
+ and it means that the symbol's value really lives in the
+ specified variable. */
+struct Lisp_Objfwd
+ {
+ enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Obj */
+ Lisp_Object *objvar;
+ };
+
+/* Like Lisp_Objfwd except that value lives in a slot in the
+ current buffer. Value is byte index of slot within buffer. */
+struct Lisp_Buffer_Objfwd
+ {
+ enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Buffer_Obj */
+ int offset;
+ /* One of Qnil, Qintegerp, Qsymbolp, Qstringp, Qfloatp or Qnumberp. */
+ Lisp_Object predicate;
+ };
+
+/* struct Lisp_Buffer_Local_Value is used in a symbol value cell when
+ the symbol has buffer-local or frame-local bindings. (Exception:
+ some buffer-local variables are built-in, with their values stored
+ in the buffer structure itself. They are handled differently,
+ using struct Lisp_Buffer_Objfwd.)
+
+ The `realvalue' slot holds the variable's current value, or a
+ forwarding pointer to where that value is kept. This value is the
+ one that corresponds to the loaded binding. To read or set the
+ variable, you must first make sure the right binding is loaded;
+ then you can access the value in (or through) `realvalue'.
+
+ `buffer' and `frame' are the buffer and frame for which the loaded
+ binding was found. If those have changed, to make sure the right
+ binding is loaded it is necessary to find which binding goes with
+ the current buffer and selected frame, then load it. To load it,
+ first unload the previous binding, then copy the value of the new
+ binding into `realvalue' (or through it). Also update
+ LOADED-BINDING to point to the newly loaded binding.
+
+ `local_if_set' indicates that merely setting the variable creates a
+ local binding for the current buffer. Otherwise the latter, setting
+ the variable does not do that; only make-local-variable does that. */
+
+struct Lisp_Buffer_Local_Value
+ {
+ /* True means that merely setting the variable creates a local
+ binding for the current buffer. */
+ bool_bf local_if_set : 1;
+ /* True means this variable can have frame-local bindings, otherwise, it is
+ can have buffer-local bindings. The two cannot be combined. */
+ bool_bf frame_local : 1;
+ /* True means that the binding now loaded was found.
+ Presumably equivalent to (defcell!=valcell). */
+ bool_bf found : 1;
+ /* If non-NULL, a forwarding to the C var where it should also be set. */
+ union Lisp_Fwd *fwd; /* Should never be (Buffer|Kboard)_Objfwd. */
+ /* The buffer or frame for which the loaded binding was found. */
+ Lisp_Object where;
+ /* A cons cell that holds the default value. It has the form
+ (SYMBOL . DEFAULT-VALUE). */
+ Lisp_Object defcell;
+ /* The cons cell from `where's parameter alist.
+ It always has the form (SYMBOL . VALUE)
+ Note that if `forward' is non-nil, VALUE may be out of date.
+ Also if the currently loaded binding is the default binding, then
+ this is `eq'ual to defcell. */
+ Lisp_Object valcell;
+ };
+
+/* Like Lisp_Objfwd except that value lives in a slot in the
+ current kboard. */
+struct Lisp_Kboard_Objfwd
+ {
+ enum Lisp_Fwd_Type type; /* = Lisp_Fwd_Kboard_Obj */
+ int offset;
+ };
+
+union Lisp_Fwd
+ {
+ struct Lisp_Intfwd u_intfwd;
+ struct Lisp_Boolfwd u_boolfwd;
+ struct Lisp_Objfwd u_objfwd;
+ struct Lisp_Buffer_Objfwd u_buffer_objfwd;
+ struct Lisp_Kboard_Objfwd u_kboard_objfwd;
+ };
+
+INLINE enum Lisp_Fwd_Type
+XFWDTYPE (union Lisp_Fwd *a)
+{
+ return a->u_intfwd.type;
+}
+
+INLINE struct Lisp_Buffer_Objfwd *
+XBUFFER_OBJFWD (union Lisp_Fwd *a)
+{
+ eassert (BUFFER_OBJFWDP (a));
+ return &a->u_buffer_objfwd;
+}
+
+/* Lisp floating point type. */
+struct Lisp_Float
+ {
+ union
+ {
+ double data;
+ struct Lisp_Float *chain;
+ } u;
+ };
+
+INLINE double
+XFLOAT_DATA (Lisp_Object f)
+{
+ return XFLOAT (f)->u.data;
+}
+
+/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
+ representations, have infinities and NaNs, and do not trap on
+ exceptions. Define IEEE_FLOATING_POINT if this host is one of the
+ typical ones. The C11 macro __STDC_IEC_559__ is close to what is
+ wanted here, but is not quite right because Emacs does not require
+ all the features of C11 Annex F (and does not require C11 at all,
+ for that matter). */
+enum
+ {
+ IEEE_FLOATING_POINT
+ = (FLT_RADIX == 2 && FLT_MANT_DIG == 24
+ && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
+ };
+
+/* A character, declared with the following typedef, is a member
+ of some character set associated with the current buffer. */
+#ifndef _UCHAR_T /* Protect against something in ctab.h on AIX. */
+#define _UCHAR_T
+typedef unsigned char UCHAR;
+#endif
+
+/* Meanings of slots in a Lisp_Compiled: */
+
+enum Lisp_Compiled
+ {
+ COMPILED_ARGLIST = 0,
+ COMPILED_BYTECODE = 1,
+ COMPILED_CONSTANTS = 2,
+ COMPILED_STACK_DEPTH = 3,
+ COMPILED_DOC_STRING = 4,
+ COMPILED_INTERACTIVE = 5
+ };
+
+/* Flag bits in a character. These also get used in termhooks.h.
+ Richard Stallman <rms@gnu.ai.mit.edu> thinks that MULE
+ (MUlti-Lingual Emacs) might need 22 bits for the character value
+ itself, so we probably shouldn't use any bits lower than 0x0400000. */
+enum char_bits
+ {
+ CHAR_ALT = 0x0400000,
+ CHAR_SUPER = 0x0800000,
+ CHAR_HYPER = 0x1000000,
+ CHAR_SHIFT = 0x2000000,
+ CHAR_CTL = 0x4000000,
+ CHAR_META = 0x8000000,
+
+ CHAR_MODIFIER_MASK =
+ CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META,
+
+ /* Actually, the current Emacs uses 22 bits for the character value
+ itself. */
+ CHARACTERBITS = 22
+ };
+
+/* Data type checking. */
+
+LISP_MACRO_DEFUN (NILP, bool, (Lisp_Object x), (x))
+
+INLINE bool
+NUMBERP (Lisp_Object x)
+{
+ return INTEGERP (x) || FLOATP (x);
+}
+INLINE bool
+NATNUMP (Lisp_Object x)
+{
+ return INTEGERP (x) && 0 <= XINT (x);
+}
+
+INLINE bool
+RANGED_INTEGERP (intmax_t lo, Lisp_Object x, intmax_t hi)
+{
+ return INTEGERP (x) && lo <= XINT (x) && XINT (x) <= hi;
+}
+
+#define TYPE_RANGED_INTEGERP(type, x) \
+ (INTEGERP (x) \
+ && (TYPE_SIGNED (type) ? TYPE_MINIMUM (type) <= XINT (x) : 0 <= XINT (x)) \
+ && XINT (x) <= TYPE_MAXIMUM (type))
+
+LISP_MACRO_DEFUN (CONSP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (FLOATP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (MISCP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (SYMBOLP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (INTEGERP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (VECTORLIKEP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (MARKERP, bool, (Lisp_Object x), (x))
+
+INLINE bool
+STRINGP (Lisp_Object x)
+{
+ return XTYPE (x) == Lisp_String;
+}
+INLINE bool
+VECTORP (Lisp_Object x)
+{
+ return VECTORLIKEP (x) && ! (ASIZE (x) & PSEUDOVECTOR_FLAG);
+}
+INLINE bool
+OVERLAYP (Lisp_Object x)
+{
+ return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay;
+}
+INLINE bool
+SAVE_VALUEP (Lisp_Object x)
+{
+ return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Save_Value;
+}
+
+INLINE bool
+FINALIZERP (Lisp_Object x)
+{
+ return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Finalizer;
+}
+
+INLINE bool
+AUTOLOADP (Lisp_Object x)
+{
+ return CONSP (x) && EQ (Qautoload, XCAR (x));
+}
+
+INLINE bool
+BUFFER_OBJFWDP (union Lisp_Fwd *a)
+{
+ return XFWDTYPE (a) == Lisp_Fwd_Buffer_Obj;
+}
+
+INLINE bool
+PSEUDOVECTOR_TYPEP (struct vectorlike_header *a, int code)
+{
+ return ((a->size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK))
+ == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS)));
+}
+
+/* True if A is a pseudovector whose code is CODE. */
+INLINE bool
+PSEUDOVECTORP (Lisp_Object a, int code)
+{
+ if (! VECTORLIKEP (a))
+ return false;
+ else
+ {
+ /* Converting to struct vectorlike_header * avoids aliasing issues. */
+ struct vectorlike_header *h = XUNTAG (a, Lisp_Vectorlike);
+ return PSEUDOVECTOR_TYPEP (h, code);
+ }
+}
+
+
+/* Test for specific pseudovector types. */
+
+INLINE bool
+WINDOW_CONFIGURATIONP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_WINDOW_CONFIGURATION);
+}
+
+INLINE bool
+PROCESSP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_PROCESS);
+}
+
+INLINE bool
+WINDOWP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_WINDOW);
+}
+
+INLINE bool
+TERMINALP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_TERMINAL);
+}
+
+INLINE bool
+SUBRP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_SUBR);
+}
+
+INLINE bool
+COMPILEDP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_COMPILED);
+}
+
+INLINE bool
+BUFFERP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_BUFFER);
+}
+
+INLINE bool
+CHAR_TABLE_P (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_CHAR_TABLE);
+}
+
+INLINE bool
+SUB_CHAR_TABLE_P (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_SUB_CHAR_TABLE);
+}
+
+INLINE bool
+BOOL_VECTOR_P (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_BOOL_VECTOR);
+}
+
+INLINE bool
+FRAMEP (Lisp_Object a)
+{
+ return PSEUDOVECTORP (a, PVEC_FRAME);
+}
+
+/* Test for image (image . spec) */
+INLINE bool
+IMAGEP (Lisp_Object x)
+{
+ return CONSP (x) && EQ (XCAR (x), Qimage);
+}
+
+/* Array types. */
+INLINE bool
+ARRAYP (Lisp_Object x)
+{
+ return VECTORP (x) || STRINGP (x) || CHAR_TABLE_P (x) || BOOL_VECTOR_P (x);
+}
+
+INLINE void
+CHECK_LIST (Lisp_Object x)
+{
+ CHECK_TYPE (CONSP (x) || NILP (x), Qlistp, x);
+}
+
+LISP_MACRO_DEFUN_VOID (CHECK_LIST_CONS, (Lisp_Object x, Lisp_Object y), (x, y))
+LISP_MACRO_DEFUN_VOID (CHECK_SYMBOL, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN_VOID (CHECK_NUMBER, (Lisp_Object x), (x))
+
+INLINE void
+CHECK_STRING (Lisp_Object x)
+{
+ CHECK_TYPE (STRINGP (x), Qstringp, x);
+}
+INLINE void
+CHECK_STRING_CAR (Lisp_Object x)
+{
+ CHECK_TYPE (STRINGP (XCAR (x)), Qstringp, XCAR (x));
+}
+INLINE void
+CHECK_CONS (Lisp_Object x)
+{
+ CHECK_TYPE (CONSP (x), Qconsp, x);
+}
+INLINE void
+CHECK_VECTOR (Lisp_Object x)
+{
+ CHECK_TYPE (VECTORP (x), Qvectorp, x);
+}
+INLINE void
+CHECK_BOOL_VECTOR (Lisp_Object x)
+{
+ CHECK_TYPE (BOOL_VECTOR_P (x), Qbool_vector_p, x);
+}
+/* This is a bit special because we always need size afterwards. */
+INLINE ptrdiff_t
+CHECK_VECTOR_OR_STRING (Lisp_Object x)
+{
+ if (VECTORP (x))
+ return ASIZE (x);
+ if (STRINGP (x))
+ return SCHARS (x);
+ wrong_type_argument (Qarrayp, x);
+}
+INLINE void
+CHECK_ARRAY (Lisp_Object x, Lisp_Object predicate)
+{
+ CHECK_TYPE (ARRAYP (x), predicate, x);
+}
+INLINE void
+CHECK_BUFFER (Lisp_Object x)
+{
+ CHECK_TYPE (BUFFERP (x), Qbufferp, x);
+}
+INLINE void
+CHECK_WINDOW (Lisp_Object x)
+{
+ CHECK_TYPE (WINDOWP (x), Qwindowp, x);
+}
+#ifdef subprocesses
+INLINE void
+CHECK_PROCESS (Lisp_Object x)
+{
+ CHECK_TYPE (PROCESSP (x), Qprocessp, x);
+}
+#endif
+INLINE void
+CHECK_NATNUM (Lisp_Object x)
+{
+ CHECK_TYPE (NATNUMP (x), Qwholenump, x);
+}
+
+#define CHECK_RANGED_INTEGER(x, lo, hi) \
+ do { \
+ CHECK_NUMBER (x); \
+ if (! ((lo) <= XINT (x) && XINT (x) <= (hi))) \
+ args_out_of_range_3 \
+ (x, \
+ make_number ((lo) < 0 && (lo) < MOST_NEGATIVE_FIXNUM \
+ ? MOST_NEGATIVE_FIXNUM \
+ : (lo)), \
+ make_number (min (hi, MOST_POSITIVE_FIXNUM))); \
+ } while (false)
+#define CHECK_TYPE_RANGED_INTEGER(type, x) \
+ do { \
+ if (TYPE_SIGNED (type)) \
+ CHECK_RANGED_INTEGER (x, TYPE_MINIMUM (type), TYPE_MAXIMUM (type)); \
+ else \
+ CHECK_RANGED_INTEGER (x, 0, TYPE_MAXIMUM (type)); \
+ } while (false)
+
+#define CHECK_NUMBER_COERCE_MARKER(x) \
+ do { \
+ if (MARKERP ((x))) \
+ XSETFASTINT (x, marker_position (x)); \
+ else \
+ CHECK_TYPE (INTEGERP (x), Qinteger_or_marker_p, x); \
+ } while (false)
+
+INLINE double
+XFLOATINT (Lisp_Object n)
+{
+ return extract_float (n);
+}
+
+INLINE void
+CHECK_NUMBER_OR_FLOAT (Lisp_Object x)
+{
+ CHECK_TYPE (FLOATP (x) || INTEGERP (x), Qnumberp, x);
+}
+
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x) \
+ do { \
+ if (MARKERP (x)) \
+ XSETFASTINT (x, marker_position (x)); \
+ else \
+ CHECK_TYPE (INTEGERP (x) || FLOATP (x), Qnumber_or_marker_p, x); \
+ } while (false)
+
+/* Since we can't assign directly to the CAR or CDR fields of a cons
+ cell, use these when checking that those fields contain numbers. */
+INLINE void
+CHECK_NUMBER_CAR (Lisp_Object x)
+{
+ Lisp_Object tmp = XCAR (x);
+ CHECK_NUMBER (tmp);
+ XSETCAR (x, tmp);
+}
+
+INLINE void
+CHECK_NUMBER_CDR (Lisp_Object x)
+{
+ Lisp_Object tmp = XCDR (x);
+ CHECK_NUMBER (tmp);
+ XSETCDR (x, tmp);
+}
+
+/* Define a built-in function for calling from Lisp.
+ `lname' should be the name to give the function in Lisp,
+ as a null-terminated C string.
+ `fnname' should be the name of the function in C.
+ By convention, it starts with F.
+ `sname' should be the name for the C constant structure
+ that records information on this function for internal use.
+ By convention, it should be the same as `fnname' but with S instead of F.
+ It's too bad that C macros can't compute this from `fnname'.
+ `minargs' should be a number, the minimum number of arguments allowed.
+ `maxargs' should be a number, the maximum number of arguments allowed,
+ or else MANY or UNEVALLED.
+ MANY means pass a vector of evaluated arguments,
+ in the form of an integer number-of-arguments
+ followed by the address of a vector of Lisp_Objects
+ which contains the argument values.
+ UNEVALLED means pass the list of unevaluated arguments
+ `intspec' says how interactive arguments are to be fetched.
+ If the string starts with a `(', `intspec' is evaluated and the resulting
+ list is the list of arguments.
+ If it's a string that doesn't start with `(', the value should follow
+ the one of the doc string for `interactive'.
+ A null string means call interactively with no arguments.
+ `doc' is documentation for the user. */
+
+/* This version of DEFUN declares a function prototype with the right
+ arguments, so we can catch errors with maxargs at compile-time. */
+#ifdef _MSC_VER
+#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \
+ Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
+ static struct Lisp_Subr alignas (GCALIGNMENT) sname = \
+ { { (PVEC_SUBR << PSEUDOVECTOR_AREA_BITS) \
+ | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)) }, \
+ { (Lisp_Object (__cdecl *)(void))fnname }, \
+ minargs, maxargs, lname, intspec, 0}; \
+ Lisp_Object fnname
+#else /* not _MSC_VER */
+#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc) \
+ static struct Lisp_Subr alignas (GCALIGNMENT) sname = \
+ { { PVEC_SUBR << PSEUDOVECTOR_AREA_BITS }, \
+ { .a ## maxargs = fnname }, \
+ minargs, maxargs, lname, intspec, 0}; \
+ Lisp_Object fnname
+#endif
+
+/* True if OBJ is a Lisp function. */
+INLINE bool
+FUNCTIONP (Lisp_Object obj)
+{
+ return functionp (obj);
+}
+
+/* defsubr (Sname);
+ is how we define the symbol for function `name' at start-up time. */
+extern void defsubr (struct Lisp_Subr *);
+
+enum maxargs
+ {
+ MANY = -2,
+ UNEVALLED = -1
+ };
+
+/* Call a function F that accepts many args, passing it ARRAY's elements. */
+#define CALLMANY(f, array) (f) (ARRAYELTS (array), array)
+
+/* Call a function F that accepts many args, passing it the remaining args,
+ E.g., 'return CALLN (Fformat, fmt, text);' is less error-prone than
+ '{ Lisp_Object a[2]; a[0] = fmt; a[1] = text; return Fformat (2, a); }'.
+ CALLN is overkill for simple usages like 'Finsert (1, &text);'. */
+#define CALLN(f, ...) CALLMANY (f, ((Lisp_Object []) {__VA_ARGS__}))
+
+extern void defvar_lisp (struct Lisp_Objfwd *, const char *, Lisp_Object *);
+extern void defvar_lisp_nopro (struct Lisp_Objfwd *, const char *, Lisp_Object *);
+extern void defvar_bool (struct Lisp_Boolfwd *, const char *, bool *);
+extern void defvar_int (struct Lisp_Intfwd *, const char *, EMACS_INT *);
+extern void defvar_kboard (struct Lisp_Kboard_Objfwd *, const char *, int);
+
+/* Macros we use to define forwarded Lisp variables.
+ These are used in the syms_of_FILENAME functions.
+
+ An ordinary (not in buffer_defaults, per-buffer, or per-keyboard)
+ lisp variable is actually a field in `struct emacs_globals'. The
+ field's name begins with "f_", which is a convention enforced by
+ these macros. Each such global has a corresponding #define in
+ globals.h; the plain name should be used in the code.
+
+ E.g., the global "cons_cells_consed" is declared as "int
+ f_cons_cells_consed" in globals.h, but there is a define:
+
+ #define cons_cells_consed globals.f_cons_cells_consed
+
+ All C code uses the `cons_cells_consed' name. This is all done
+ this way to support indirection for multi-threaded Emacs. */
+
+#define DEFVAR_LISP(lname, vname, doc) \
+ do { \
+ static struct Lisp_Objfwd o_fwd; \
+ defvar_lisp (&o_fwd, lname, &globals.f_ ## vname); \
+ } while (false)
+#define DEFVAR_LISP_NOPRO(lname, vname, doc) \
+ do { \
+ static struct Lisp_Objfwd o_fwd; \
+ defvar_lisp_nopro (&o_fwd, lname, &globals.f_ ## vname); \
+ } while (false)
+#define DEFVAR_BOOL(lname, vname, doc) \
+ do { \
+ static struct Lisp_Boolfwd b_fwd; \
+ defvar_bool (&b_fwd, lname, &globals.f_ ## vname); \
+ } while (false)
+#define DEFVAR_INT(lname, vname, doc) \
+ do { \
+ static struct Lisp_Intfwd i_fwd; \
+ defvar_int (&i_fwd, lname, &globals.f_ ## vname); \
+ } while (false)
+
+#define DEFVAR_BUFFER_DEFAULTS(lname, vname, doc) \
+ do { \
+ static struct Lisp_Objfwd o_fwd; \
+ defvar_lisp_nopro (&o_fwd, lname, &BVAR (&buffer_defaults, vname)); \
+ } while (false)
+
+#define DEFVAR_KBOARD(lname, vname, doc) \
+ do { \
+ static struct Lisp_Kboard_Objfwd ko_fwd; \
+ defvar_kboard (&ko_fwd, lname, offsetof (KBOARD, vname ## _)); \
+ } while (false)
+
+/* Save and restore the instruction and environment pointers,
+ without affecting the signal mask. */
+
+#ifdef HAVE__SETJMP
+typedef jmp_buf sys_jmp_buf;
+# define sys_setjmp(j) _setjmp (j)
+# define sys_longjmp(j, v) _longjmp (j, v)
+#elif defined HAVE_SIGSETJMP
+typedef sigjmp_buf sys_jmp_buf;
+# define sys_setjmp(j) sigsetjmp (j, 0)
+# define sys_longjmp(j, v) siglongjmp (j, v)
+#else
+/* A platform that uses neither _longjmp nor siglongjmp; assume
+ longjmp does not affect the sigmask. */
+typedef jmp_buf sys_jmp_buf;
+# define sys_setjmp(j) setjmp (j)
+# define sys_longjmp(j, v) longjmp (j, v)
+#endif
+
+
+/* Elisp uses several stacks:
+ - the C stack.
+ - the bytecode stack: used internally by the bytecode interpreter.
+ Allocated from the C stack.
+ - The specpdl stack: keeps track of active unwind-protect and
+ dynamic-let-bindings. Allocated from the `specpdl' array, a manually
+ managed stack.
+ - The handler stack: keeps track of active catch tags and condition-case
+ handlers. Allocated in a manually managed stack implemented by a
+ doubly-linked list allocated via xmalloc and never freed. */
+
+/* Structure for recording Lisp call stack for backtrace purposes. */
+
+/* The special binding stack holds the outer values of variables while
+ they are bound by a function application or a let form, stores the
+ code to be executed for unwind-protect forms.
+
+ NOTE: The specbinding union is defined here, because SPECPDL_INDEX is
+ used all over the place, needs to be fast, and needs to know the size of
+ union specbinding. But only eval.c should access it. */
+
+enum specbind_tag {
+ SPECPDL_UNWIND, /* An unwind_protect function on Lisp_Object. */
+ SPECPDL_UNWIND_PTR, /* Likewise, on void *. */
+ SPECPDL_UNWIND_INT, /* Likewise, on int. */
+ SPECPDL_UNWIND_VOID, /* Likewise, with no arg. */
+ SPECPDL_BACKTRACE, /* An element of the backtrace. */
+ SPECPDL_LET, /* A plain and simple dynamic let-binding. */
+ /* Tags greater than SPECPDL_LET must be "subkinds" of LET. */
+ SPECPDL_LET_LOCAL, /* A buffer-local let-binding. */
+ SPECPDL_LET_DEFAULT /* A global binding for a localized var. */
+};
+
+union specbinding
+ {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ struct {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ void (*func) (Lisp_Object);
+ Lisp_Object arg;
+ } unwind;
+ struct {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ void (*func) (void *);
+ void *arg;
+ } unwind_ptr;
+ struct {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ void (*func) (int);
+ int arg;
+ } unwind_int;
+ struct {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ void (*func) (void);
+ } unwind_void;
+ struct {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ /* `where' is not used in the case of SPECPDL_LET. */
+ Lisp_Object symbol, old_value, where;
+ } let;
+ struct {
+ ENUM_BF (specbind_tag) kind : CHAR_BIT;
+ bool_bf debug_on_exit : 1;
+ Lisp_Object function;
+ Lisp_Object *args;
+ ptrdiff_t nargs;
+ } bt;
+ };
+
+extern union specbinding *specpdl;
+extern union specbinding *specpdl_ptr;
+extern ptrdiff_t specpdl_size;
+
+INLINE ptrdiff_t
+SPECPDL_INDEX (void)
+{
+ return specpdl_ptr - specpdl;
+}
+
+/* This structure helps implement the `catch/throw' and `condition-case/signal'
+ control structures. A struct handler contains all the information needed to
+ restore the state of the interpreter after a non-local jump.
+
+ handler structures are chained together in a doubly linked list; the `next'
+ member points to the next outer catchtag and the `nextfree' member points in
+ the other direction to the next inner element (which is typically the next
+ free element since we mostly use it on the deepest handler).
+
+ A call like (throw TAG VAL) searches for a catchtag whose `tag_or_ch'
+ member is TAG, and then unbinds to it. The `val' member is used to
+ hold VAL while the stack is unwound; `val' is returned as the value
+ of the catch form.
+
+ All the other members are concerned with restoring the interpreter
+ state.
+
+ Members are volatile if their values need to survive _longjmp when
+ a 'struct handler' is a local variable. */
+
+enum handlertype { CATCHER, CONDITION_CASE };
+
+struct handler
+{
+ enum handlertype type;
+ Lisp_Object tag_or_ch;
+ Lisp_Object val;
+ struct handler *next;
+ struct handler *nextfree;
+
+ /* The bytecode interpreter can have several handlers active at the same
+ time, so when we longjmp to one of them, it needs to know which handler
+ this was and what was the corresponding internal state. This is stored
+ here, and when we longjmp we make sure that handlerlist points to the
+ proper handler. */
+ Lisp_Object *bytecode_top;
+ int bytecode_dest;
+
+ /* Most global vars are reset to their value via the specpdl mechanism,
+ but a few others are handled by storing their value here. */
+#if true /* GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS, but defined later. */
+ struct gcpro *gcpro;
+#endif
+ sys_jmp_buf jmp;
+ EMACS_INT lisp_eval_depth;
+ ptrdiff_t pdlcount;
+ int poll_suppress_count;
+ int interrupt_input_blocked;
+ struct byte_stack *byte_stack;
+};
+
+/* Fill in the components of c, and put it on the list. */
+#define PUSH_HANDLER(c, tag_ch_val, handlertype) \
+ if (handlerlist->nextfree) \
+ (c) = handlerlist->nextfree; \
+ else \
+ { \
+ (c) = xmalloc (sizeof (struct handler)); \
+ (c)->nextfree = NULL; \
+ handlerlist->nextfree = (c); \
+ } \
+ (c)->type = (handlertype); \
+ (c)->tag_or_ch = (tag_ch_val); \
+ (c)->val = Qnil; \
+ (c)->next = handlerlist; \
+ (c)->lisp_eval_depth = lisp_eval_depth; \
+ (c)->pdlcount = SPECPDL_INDEX (); \
+ (c)->poll_suppress_count = poll_suppress_count; \
+ (c)->interrupt_input_blocked = interrupt_input_blocked;\
+ (c)->gcpro = gcprolist; \
+ (c)->byte_stack = byte_stack_list; \
+ handlerlist = (c);
+
+
+extern Lisp_Object memory_signal_data;
+
+/* An address near the bottom of the stack.
+ Tells GC how to save a copy of the stack. */
+extern char *stack_bottom;
+
+/* Check quit-flag and quit if it is non-nil.
+ Typing C-g does not directly cause a quit; it only sets Vquit_flag.
+ So the program needs to do QUIT at times when it is safe to quit.
+ Every loop that might run for a long time or might not exit
+ ought to do QUIT at least once, at a safe place.
+ Unless that is impossible, of course.
+ But it is very desirable to avoid creating loops where QUIT is impossible.
+
+ Exception: if you set immediate_quit to true,
+ then the handler that responds to the C-g does the quit itself.
+ This is a good thing to do around a loop that has no side effects
+ and (in particular) cannot call arbitrary Lisp code.
+
+ If quit-flag is set to `kill-emacs' the SIGINT handler has received
+ a request to exit Emacs when it is safe to do. */
+
+extern void process_pending_signals (void);
+extern bool volatile pending_signals;
+
+extern void process_quit_flag (void);
+#define QUIT \
+ do { \
+ if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
+ process_quit_flag (); \
+ else if (pending_signals) \
+ process_pending_signals (); \
+ } while (false)
+
+
+/* True if ought to quit now. */
+
+#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
+
+extern Lisp_Object Vascii_downcase_table;
+extern Lisp_Object Vascii_canon_table;
+
+/* Structure for recording stack slots that need marking. */
+
+/* This is a chain of structures, each of which points at a Lisp_Object
+ variable whose value should be marked in garbage collection.
+ Normally every link of the chain is an automatic variable of a function,
+ and its `val' points to some argument or local variable of the function.
+ On exit to the function, the chain is set back to the value it had on entry.
+ This way, no link remains in the chain when the stack frame containing the
+ link disappears.
+
+ Every function that can call Feval must protect in this fashion all
+ Lisp_Object variables whose contents will be used again. */
+
+extern struct gcpro *gcprolist;
+
+struct gcpro
+{
+ struct gcpro *next;
+
+ /* Address of first protected variable. */
+ volatile Lisp_Object *var;
+
+ /* Number of consecutive protected variables. */
+ ptrdiff_t nvars;
+
+#ifdef DEBUG_GCPRO
+ /* File name where this record is used. */
+ const char *name;
+
+ /* Line number in this file. */
+ int lineno;
+
+ /* Index in the local chain of records. */
+ int idx;
+
+ /* Nesting level. */
+ int level;
+#endif
+};
+
+/* Values of GC_MARK_STACK during compilation:
+
+ 0 Use GCPRO as before
+ 1 Do the real thing, make GCPROs and UNGCPRO no-ops.
+ 2 Mark the stack, and check that everything GCPRO'd is
+ marked.
+ 3 Mark using GCPRO's, mark stack last, and count how many
+ dead objects are kept alive.
+
+ Formerly, method 0 was used. Currently, method 1 is used unless
+ otherwise specified by hand when building, e.g.,
+ "make CPPFLAGS='-DGC_MARK_STACK=GC_USE_GCPROS_AS_BEFORE'".
+ Methods 2 and 3 are present mainly to debug the transition from 0 to 1. */
+
+#define GC_USE_GCPROS_AS_BEFORE 0
+#define GC_MAKE_GCPROS_NOOPS 1
+#define GC_MARK_STACK_CHECK_GCPROS 2
+#define GC_USE_GCPROS_CHECK_ZOMBIES 3
+
+#ifndef GC_MARK_STACK
+#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
+#endif
+
+/* Whether we do the stack marking manually. */
+#define BYTE_MARK_STACK !(GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS \
+ || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
+
+
+#if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
+
+/* Do something silly with gcproN vars just so gcc shuts up. */
+/* You get warnings from MIPSPro... */
+
+#define GCPRO1(varname) ((void) gcpro1)
+#define GCPRO2(varname1, varname2) ((void) gcpro2, (void) gcpro1)
+#define GCPRO3(varname1, varname2, varname3) \
+ ((void) gcpro3, (void) gcpro2, (void) gcpro1)
+#define GCPRO4(varname1, varname2, varname3, varname4) \
+ ((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
+#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
+ ((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
+#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
+ ((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, \
+ (void) gcpro1)
+#define GCPRO7(a, b, c, d, e, f, g) (GCPRO6 (a, b, c, d, e, f), (void) gcpro7)
+#define UNGCPRO ((void) 0)
+
+#else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
+
+#ifndef DEBUG_GCPRO
+
+#define GCPRO1(a) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcprolist = &gcpro1; }
+
+#define GCPRO2(a, b) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcprolist = &gcpro2; }
+
+#define GCPRO3(a, b, c) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcprolist = &gcpro3; }
+
+#define GCPRO4(a, b, c, d) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcprolist = &gcpro4; }
+
+#define GCPRO5(a, b, c, d, e) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
+ gcprolist = &gcpro5; }
+
+#define GCPRO6(a, b, c, d, e, f) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
+ gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
+ gcprolist = &gcpro6; }
+
+#define GCPRO7(a, b, c, d, e, f, g) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
+ gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
+ gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
+ gcprolist = &gcpro7; }
+
+#define UNGCPRO (gcprolist = gcpro1.next)
+
+#else /* !DEBUG_GCPRO */
+
+extern int gcpro_level;
+
+#define GCPRO1(a) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level++; \
+ gcprolist = &gcpro1; }
+
+#define GCPRO2(a, b) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
+ gcpro2.level = gcpro_level++; \
+ gcprolist = &gcpro2; }
+
+#define GCPRO3(a, b, c) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
+ gcpro3.level = gcpro_level++; \
+ gcprolist = &gcpro3; }
+
+#define GCPRO4(a, b, c, d) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
+ gcpro4.level = gcpro_level++; \
+ gcprolist = &gcpro4; }
+
+#define GCPRO5(a, b, c, d, e) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
+ gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
+ gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
+ gcpro5.level = gcpro_level++; \
+ gcprolist = &gcpro5; }
+
+#define GCPRO6(a, b, c, d, e, f) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
+ gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
+ gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
+ gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
+ gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6; \
+ gcpro6.level = gcpro_level++; \
+ gcprolist = &gcpro6; }
+
+#define GCPRO7(a, b, c, d, e, f, g) \
+ { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1; \
+ gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1; \
+ gcpro1.level = gcpro_level; \
+ gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1; \
+ gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2; \
+ gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1; \
+ gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3; \
+ gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1; \
+ gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4; \
+ gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1; \
+ gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5; \
+ gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1; \
+ gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6; \
+ gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1; \
+ gcpro7.name = __FILE__; gcpro7.lineno = __LINE__; gcpro7.idx = 7; \
+ gcpro7.level = gcpro_level++; \
+ gcprolist = &gcpro7; }
+
+#define UNGCPRO \
+ (--gcpro_level != gcpro1.level \
+ ? emacs_abort () \
+ : (void) (gcprolist = gcpro1.next))
+
+#endif /* DEBUG_GCPRO */
+#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
+
+
+/* Evaluate expr, UNGCPRO, and then return the value of expr. */
+#define RETURN_UNGCPRO(expr) \
+ do \
+ { \
+ Lisp_Object ret_ungc_val; \
+ ret_ungc_val = (expr); \
+ UNGCPRO; \
+ return ret_ungc_val; \
+ } \
+ while (false)
+
+/* Call staticpro (&var) to protect static variable `var'. */
+
+void staticpro (Lisp_Object *);
+
+/* Forward declarations for prototypes. */
+struct window;
+struct frame;
+
+/* Copy COUNT Lisp_Objects from ARGS to contents of V starting from OFFSET. */
+
+INLINE void
+vcopy (Lisp_Object v, ptrdiff_t offset, Lisp_Object *args, ptrdiff_t count)
+{
+ eassert (0 <= offset && 0 <= count && offset + count <= ASIZE (v));
+ memcpy (XVECTOR (v)->contents + offset, args, count * sizeof *args);
+}
+
+/* Functions to modify hash tables. */
+
+INLINE void
+set_hash_key_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
+{
+ gc_aset (h->key_and_value, 2 * idx, val);
+}
+
+INLINE void
+set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
+{
+ gc_aset (h->key_and_value, 2 * idx + 1, val);
+}
+
+/* Use these functions to set Lisp_Object
+ or pointer slots of struct Lisp_Symbol. */
+
+INLINE void
+set_symbol_function (Lisp_Object sym, Lisp_Object function)
+{
+ XSYMBOL (sym)->function = function;
+}
+
+INLINE void
+set_symbol_plist (Lisp_Object sym, Lisp_Object plist)
+{
+ XSYMBOL (sym)->plist = plist;
+}
+
+INLINE void
+set_symbol_next (Lisp_Object sym, struct Lisp_Symbol *next)
+{
+ XSYMBOL (sym)->next = next;
+}
+
+/* Buffer-local (also frame-local) variable access functions. */
+
+INLINE int
+blv_found (struct Lisp_Buffer_Local_Value *blv)
+{
+ eassert (blv->found == !EQ (blv->defcell, blv->valcell));
+ return blv->found;
+}
+
+/* Set overlay's property list. */
+
+INLINE void
+set_overlay_plist (Lisp_Object overlay, Lisp_Object plist)
+{
+ XOVERLAY (overlay)->plist = plist;
+}
+
+/* Get text properties of S. */
+
+INLINE INTERVAL
+string_intervals (Lisp_Object s)
+{
+ return XSTRING (s)->intervals;
+}
+
+/* Set text properties of S to I. */
+
+INLINE void
+set_string_intervals (Lisp_Object s, INTERVAL i)
+{
+ XSTRING (s)->intervals = i;
+}
+
+/* Set a Lisp slot in TABLE to VAL. Most code should use this instead
+ of setting slots directly. */
+
+INLINE void
+set_char_table_defalt (Lisp_Object table, Lisp_Object val)
+{
+ XCHAR_TABLE (table)->defalt = val;
+}
+INLINE void
+set_char_table_purpose (Lisp_Object table, Lisp_Object val)
+{
+ XCHAR_TABLE (table)->purpose = val;
+}
+
+/* Set different slots in (sub)character tables. */
+
+INLINE void
+set_char_table_extras (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
+{
+ eassert (0 <= idx && idx < CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (table)));
+ XCHAR_TABLE (table)->extras[idx] = val;
+}
+
+INLINE void
+set_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
+{
+ eassert (0 <= idx && idx < (1 << CHARTAB_SIZE_BITS_0));
+ XCHAR_TABLE (table)->contents[idx] = val;
+}
+
+INLINE void
+set_sub_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
+{
+ XSUB_CHAR_TABLE (table)->contents[idx] = val;
+}
+
+/* Defined in data.c. */
+extern Lisp_Object indirect_function (Lisp_Object);
+extern Lisp_Object find_symbol_value (Lisp_Object);
+enum Arith_Comparison {
+ ARITH_EQUAL,
+ ARITH_NOTEQUAL,
+ ARITH_LESS,
+ ARITH_GRTR,
+ ARITH_LESS_OR_EQUAL,
+ ARITH_GRTR_OR_EQUAL
+};
+extern Lisp_Object arithcompare (Lisp_Object num1, Lisp_Object num2,
+ enum Arith_Comparison comparison);
+
+/* Convert the integer I to an Emacs representation, either the integer
+ itself, or a cons of two or three integers, or if all else fails a float.
+ I should not have side effects. */
+#define INTEGER_TO_CONS(i) \
+ (! FIXNUM_OVERFLOW_P (i) \
+ ? make_number (i) \
+ : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16) \
+ || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16)) \
+ && FIXNUM_OVERFLOW_P ((i) >> 16)) \
+ ? Fcons (make_number ((i) >> 16), make_number ((i) & 0xffff)) \
+ : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16 >> 24) \
+ || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16 >> 24)) \
+ && FIXNUM_OVERFLOW_P ((i) >> 16 >> 24)) \
+ ? Fcons (make_number ((i) >> 16 >> 24), \
+ Fcons (make_number ((i) >> 16 & 0xffffff), \
+ make_number ((i) & 0xffff))) \
+ : make_float (i))
+
+/* Convert the Emacs representation CONS back to an integer of type
+ TYPE, storing the result the variable VAR. Signal an error if CONS
+ is not a valid representation or is out of range for TYPE. */
+#define CONS_TO_INTEGER(cons, type, var) \
+ (TYPE_SIGNED (type) \
+ ? ((var) = cons_to_signed (cons, TYPE_MINIMUM (type), TYPE_MAXIMUM (type))) \
+ : ((var) = cons_to_unsigned (cons, TYPE_MAXIMUM (type))))
+extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t);
+extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t);
+
+extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *);
+extern _Noreturn void args_out_of_range (Lisp_Object, Lisp_Object);
+extern _Noreturn void args_out_of_range_3 (Lisp_Object, Lisp_Object,
+ Lisp_Object);
+extern Lisp_Object do_symval_forwarding (union Lisp_Fwd *);
+extern void set_internal (Lisp_Object, Lisp_Object, Lisp_Object, bool);
+extern void syms_of_data (void);
+extern void swap_in_global_binding (struct Lisp_Symbol *);
+
+/* Defined in cmds.c */
+extern void syms_of_cmds (void);
+extern void keys_of_cmds (void);
+
+/* Defined in coding.c. */
+extern Lisp_Object detect_coding_system (const unsigned char *, ptrdiff_t,
+ ptrdiff_t, bool, bool, Lisp_Object);
+extern void init_coding (void);
+extern void init_coding_once (void);
+extern void syms_of_coding (void);
+
+/* Defined in character.c. */
+extern ptrdiff_t chars_in_text (const unsigned char *, ptrdiff_t);
+extern ptrdiff_t multibyte_chars_in_text (const unsigned char *, ptrdiff_t);
+extern void syms_of_character (void);
+
+/* Defined in charset.c. */
+extern void init_charset (void);
+extern void init_charset_once (void);
+extern void syms_of_charset (void);
+/* Structure forward declarations. */
+struct charset;
+
+/* Defined in syntax.c. */
+extern void init_syntax_once (void);
+extern void syms_of_syntax (void);
+
+/* Defined in fns.c. */
+enum { NEXT_ALMOST_PRIME_LIMIT = 11 };
+extern EMACS_INT next_almost_prime (EMACS_INT) ATTRIBUTE_CONST;
+extern Lisp_Object larger_vector (Lisp_Object, ptrdiff_t, ptrdiff_t);
+extern void sweep_weak_hash_tables (void);
+EMACS_UINT hash_string (char const *, ptrdiff_t);
+EMACS_UINT sxhash (Lisp_Object, int);
+Lisp_Object make_hash_table (struct hash_table_test, Lisp_Object, Lisp_Object,
+ Lisp_Object, Lisp_Object);
+ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *);
+ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
+ EMACS_UINT);
+extern struct hash_table_test hashtest_eql, hashtest_equal;
+extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object,
+ ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
+extern Lisp_Object substring_both (Lisp_Object, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t);
+extern Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object do_yes_or_no_p (Lisp_Object);
+extern Lisp_Object concat2 (Lisp_Object, Lisp_Object);
+extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
+extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
+extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
+extern void clear_string_char_byte_cache (void);
+extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t);
+extern ptrdiff_t string_byte_to_char (Lisp_Object, ptrdiff_t);
+extern Lisp_Object string_to_multibyte (Lisp_Object);
+extern Lisp_Object string_make_unibyte (Lisp_Object);
+extern void syms_of_fns (void);
+
+/* Defined in floatfns.c. */
+extern void syms_of_floatfns (void);
+extern Lisp_Object fmod_float (Lisp_Object x, Lisp_Object y);
+
+/* Defined in fringe.c. */
+extern void syms_of_fringe (void);
+extern void init_fringe (void);
+#ifdef HAVE_WINDOW_SYSTEM
+extern void mark_fringe_data (void);
+extern void init_fringe_once (void);
+#endif /* HAVE_WINDOW_SYSTEM */
+
+/* Defined in image.c. */
+extern int x_bitmap_mask (struct frame *, ptrdiff_t);
+extern void reset_image_types (void);
+extern void syms_of_image (void);
+
+/* Defined in insdel.c. */
+extern void move_gap_both (ptrdiff_t, ptrdiff_t);
+extern _Noreturn void buffer_overflow (void);
+extern void make_gap (ptrdiff_t);
+extern void make_gap_1 (struct buffer *, ptrdiff_t);
+extern ptrdiff_t copy_text (const unsigned char *, unsigned char *,
+ ptrdiff_t, bool, bool);
+extern int count_combining_before (const unsigned char *,
+ ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern int count_combining_after (const unsigned char *,
+ ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern void insert (const char *, ptrdiff_t);
+extern void insert_and_inherit (const char *, ptrdiff_t);
+extern void insert_1_both (const char *, ptrdiff_t, ptrdiff_t,
+ bool, bool, bool);
+extern void insert_from_gap (ptrdiff_t, ptrdiff_t, bool text_at_gap_tail);
+extern void insert_from_string (Lisp_Object, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t, bool);
+extern void insert_from_buffer (struct buffer *, ptrdiff_t, ptrdiff_t, bool);
+extern void insert_char (int);
+extern void insert_string (const char *);
+extern void insert_before_markers (const char *, ptrdiff_t);
+extern void insert_before_markers_and_inherit (const char *, ptrdiff_t);
+extern void insert_from_string_before_markers (Lisp_Object, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, bool);
+extern void del_range (ptrdiff_t, ptrdiff_t);
+extern Lisp_Object del_range_1 (ptrdiff_t, ptrdiff_t, bool, bool);
+extern void del_range_byte (ptrdiff_t, ptrdiff_t, bool);
+extern void del_range_both (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object del_range_2 (ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t, bool);
+extern void modify_text (ptrdiff_t, ptrdiff_t);
+extern void prepare_to_modify_buffer (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
+extern void prepare_to_modify_buffer_1 (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
+extern void invalidate_buffer_caches (struct buffer *, ptrdiff_t, ptrdiff_t);
+extern void signal_after_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern void adjust_after_insert (ptrdiff_t, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t);
+extern void adjust_markers_for_delete (ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t);
+extern void replace_range (ptrdiff_t, ptrdiff_t, Lisp_Object, bool, bool, bool);
+extern void replace_range_2 (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+ const char *, ptrdiff_t, ptrdiff_t, bool);
+extern void syms_of_insdel (void);
+
+/* Defined in dispnew.c. */
+#if (defined PROFILING \
+ && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
+_Noreturn void __executable_start (void);
+#endif
+extern Lisp_Object Vwindow_system;
+extern Lisp_Object sit_for (Lisp_Object, bool, int);
+
+/* Defined in xdisp.c. */
+extern bool noninteractive_need_newline;
+extern Lisp_Object echo_area_buffer[2];
+extern void add_to_log (const char *, Lisp_Object, Lisp_Object);
+extern void check_message_stack (void);
+extern void setup_echo_area_for_printing (bool);
+extern bool push_message (void);
+extern void pop_message_unwind (void);
+extern Lisp_Object restore_message_unwind (Lisp_Object);
+extern void restore_message (void);
+extern Lisp_Object current_message (void);
+extern void clear_message (bool, bool);
+extern void message (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
+extern void message1 (const char *);
+extern void message1_nolog (const char *);
+extern void message3 (Lisp_Object);
+extern void message3_nolog (Lisp_Object);
+extern void message_dolog (const char *, ptrdiff_t, bool, bool);
+extern void message_with_string (const char *, Lisp_Object, bool);
+extern void message_log_maybe_newline (void);
+extern void update_echo_area (void);
+extern void truncate_echo_area (ptrdiff_t);
+extern void redisplay (void);
+
+void set_frame_cursor_types (struct frame *, Lisp_Object);
+extern void syms_of_xdisp (void);
+extern void init_xdisp (void);
+extern Lisp_Object safe_eval (Lisp_Object);
+extern bool pos_visible_p (struct window *, ptrdiff_t, int *,
+ int *, int *, int *, int *, int *);
+
+/* Defined in xsettings.c. */
+extern void syms_of_xsettings (void);
+
+/* Defined in vm-limit.c. */
+extern void memory_warnings (void *, void (*warnfun) (const char *));
+
+/* Defined in character.c. */
+extern void parse_str_as_multibyte (const unsigned char *, ptrdiff_t,
+ ptrdiff_t *, ptrdiff_t *);
+
+/* Defined in alloc.c. */
+extern void check_pure_size (void);
+extern void free_misc (Lisp_Object);
+extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
+extern void malloc_warning (const char *);
+extern _Noreturn void memory_full (size_t);
+extern _Noreturn void buffer_memory_full (ptrdiff_t);
+extern bool survives_gc_p (Lisp_Object);
+extern void mark_object (Lisp_Object);
+#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
+extern void refill_memory_reserve (void);
+#endif
+extern const char *pending_malloc_warning;
+extern Lisp_Object zero_vector;
+extern Lisp_Object *stack_base;
+extern EMACS_INT consing_since_gc;
+extern EMACS_INT gc_relative_threshold;
+extern EMACS_INT memory_full_cons_threshold;
+extern Lisp_Object list1 (Lisp_Object);
+extern Lisp_Object list2 (Lisp_Object, Lisp_Object);
+extern Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object);
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE};
+extern Lisp_Object listn (enum constype, ptrdiff_t, Lisp_Object, ...);
+
+/* Build a frequently used 2/3/4-integer lists. */
+
+INLINE Lisp_Object
+list2i (EMACS_INT x, EMACS_INT y)
+{
+ return list2 (make_number (x), make_number (y));
+}
+
+INLINE Lisp_Object
+list3i (EMACS_INT x, EMACS_INT y, EMACS_INT w)
+{
+ return list3 (make_number (x), make_number (y), make_number (w));
+}
+
+INLINE Lisp_Object
+list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h)
+{
+ return list4 (make_number (x), make_number (y),
+ make_number (w), make_number (h));
+}
+
+extern Lisp_Object make_uninit_bool_vector (EMACS_INT);
+extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object);
+extern _Noreturn void string_overflow (void);
+extern Lisp_Object make_string (const char *, ptrdiff_t);
+extern Lisp_Object make_formatted_string (char *, const char *, ...)
+ ATTRIBUTE_FORMAT_PRINTF (2, 3);
+extern Lisp_Object make_unibyte_string (const char *, ptrdiff_t);
+
+/* Make unibyte string from C string when the length isn't known. */
+
+INLINE Lisp_Object
+build_unibyte_string (const char *str)
+{
+ return make_unibyte_string (str, strlen (str));
+}
+
+extern Lisp_Object make_multibyte_string (const char *, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object make_event_array (ptrdiff_t, Lisp_Object *);
+extern Lisp_Object make_uninit_string (EMACS_INT);
+extern Lisp_Object make_uninit_multibyte_string (EMACS_INT, EMACS_INT);
+extern Lisp_Object make_string_from_bytes (const char *, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object make_specified_string (const char *,
+ ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object make_pure_string (const char *, ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object make_pure_c_string (const char *, ptrdiff_t);
+
+/* Make a string allocated in pure space, use STR as string data. */
+
+INLINE Lisp_Object
+build_pure_c_string (const char *str)
+{
+ return make_pure_c_string (str, strlen (str));
+}
+
+/* Make a string from the data at STR, treating it as multibyte if the
+ data warrants. */
+
+INLINE Lisp_Object
+build_string (const char *str)
+{
+ return make_string (str, strlen (str));
+}
+
+extern Lisp_Object pure_cons (Lisp_Object, Lisp_Object);
+extern void make_byte_code (struct Lisp_Vector *);
+extern struct Lisp_Vector *allocate_vector (EMACS_INT);
+
+/* Make an uninitialized vector for SIZE objects. NOTE: you must
+ be sure that GC cannot happen until the vector is completely
+ initialized. E.g. the following code is likely to crash:
+
+ v = make_uninit_vector (3);
+ ASET (v, 0, obj0);
+ ASET (v, 1, Ffunction_can_gc ());
+ ASET (v, 2, obj1); */
+
+INLINE Lisp_Object
+make_uninit_vector (ptrdiff_t size)
+{
+ Lisp_Object v;
+ struct Lisp_Vector *p;
+
+ p = allocate_vector (size);
+ XSETVECTOR (v, p);
+ return v;
+}
+
+/* Like above, but special for sub char-tables. */
+
+INLINE Lisp_Object
+make_uninit_sub_char_table (int depth, int min_char)
+{
+ int slots = SUB_CHAR_TABLE_OFFSET + chartab_size[depth];
+ Lisp_Object v = make_uninit_vector (slots);
+
+ XSETPVECTYPE (XVECTOR (v), PVEC_SUB_CHAR_TABLE);
+ XSUB_CHAR_TABLE (v)->depth = depth;
+ XSUB_CHAR_TABLE (v)->min_char = min_char;
+ return v;
+}
+
+extern struct Lisp_Vector *allocate_pseudovector (int, int, int,
+ enum pvec_type);
+
+/* Allocate partially initialized pseudovector where all Lisp_Object
+ slots are set to Qnil but the rest (if any) is left uninitialized. */
+
+#define ALLOCATE_PSEUDOVECTOR(type, field, tag) \
+ ((type *) allocate_pseudovector (VECSIZE (type), \
+ PSEUDOVECSIZE (type, field), \
+ PSEUDOVECSIZE (type, field), tag))
+
+/* Allocate fully initialized pseudovector where all Lisp_Object
+ slots are set to Qnil and the rest (if any) is zeroed. */
+
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(type, field, tag) \
+ ((type *) allocate_pseudovector (VECSIZE (type), \
+ PSEUDOVECSIZE (type, field), \
+ VECSIZE (type), tag))
+
+extern bool gc_in_progress;
+extern bool abort_on_gc;
+extern Lisp_Object make_float (double);
+extern void display_malloc_warning (void);
+extern ptrdiff_t inhibit_garbage_collection (void);
+extern Lisp_Object make_save_int_int_int (ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object make_save_obj_obj_obj_obj (Lisp_Object, Lisp_Object,
+ Lisp_Object, Lisp_Object);
+extern Lisp_Object make_save_ptr (void *);
+extern Lisp_Object make_save_ptr_int (void *, ptrdiff_t);
+extern Lisp_Object make_save_ptr_ptr (void *, void *);
+extern Lisp_Object make_save_funcptr_ptr_obj (void (*) (void), void *,
+ Lisp_Object);
+extern Lisp_Object make_save_memory (Lisp_Object *, ptrdiff_t);
+extern void free_save_value (Lisp_Object);
+extern Lisp_Object build_overlay (Lisp_Object, Lisp_Object, Lisp_Object);
+extern void free_marker (Lisp_Object);
+extern void free_cons (struct Lisp_Cons *);
+extern void init_alloc_once (void);
+extern void init_alloc (void);
+extern void syms_of_alloc (void);
+extern struct buffer * allocate_buffer (void);
+extern int valid_lisp_object_p (Lisp_Object);
+extern int relocatable_string_data_p (const char *);
+#ifdef GC_CHECK_CONS_LIST
+extern void check_cons_list (void);
+#else
+INLINE void (check_cons_list) (void) { lisp_h_check_cons_list (); }
+#endif
+
+#ifdef REL_ALLOC
+/* Defined in ralloc.c. */
+extern void *r_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
+extern void r_alloc_free (void **);
+extern void *r_re_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
+extern void r_alloc_reset_variable (void **, void **);
+extern void r_alloc_inhibit_buffer_relocation (int);
+#endif
+
+/* Defined in chartab.c. */
+extern Lisp_Object copy_char_table (Lisp_Object);
+extern Lisp_Object char_table_ref_and_range (Lisp_Object, int,
+ int *, int *);
+extern void char_table_set_range (Lisp_Object, int, int, Lisp_Object);
+extern void map_char_table (void (*) (Lisp_Object, Lisp_Object,
+ Lisp_Object),
+ Lisp_Object, Lisp_Object, Lisp_Object);
+extern void map_char_table_for_charset (void (*c_function) (Lisp_Object, Lisp_Object),
+ Lisp_Object, Lisp_Object,
+ Lisp_Object, struct charset *,
+ unsigned, unsigned);
+extern Lisp_Object uniprop_table (Lisp_Object);
+extern void syms_of_chartab (void);
+
+/* Defined in print.c. */
+extern Lisp_Object Vprin1_to_string_buffer;
+extern void debug_print (Lisp_Object) EXTERNALLY_VISIBLE;
+extern void temp_output_buffer_setup (const char *);
+extern int print_level;
+extern void write_string (const char *);
+extern void print_error_message (Lisp_Object, Lisp_Object, const char *,
+ Lisp_Object);
+extern Lisp_Object internal_with_output_to_temp_buffer
+ (const char *, Lisp_Object (*) (Lisp_Object), Lisp_Object);
+#define FLOAT_TO_STRING_BUFSIZE 350
+extern int float_to_string (char *, double);
+extern void init_print_once (void);
+extern void syms_of_print (void);
+
+/* Defined in doprnt.c. */
+extern ptrdiff_t doprnt (char *, ptrdiff_t, const char *, const char *,
+ va_list);
+extern ptrdiff_t esprintf (char *, char const *, ...)
+ ATTRIBUTE_FORMAT_PRINTF (2, 3);
+extern ptrdiff_t exprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
+ char const *, ...)
+ ATTRIBUTE_FORMAT_PRINTF (5, 6);
+extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
+ char const *, va_list)
+ ATTRIBUTE_FORMAT_PRINTF (5, 0);
+
+/* Defined in lread.c. */
+extern Lisp_Object check_obarray (Lisp_Object);
+extern Lisp_Object intern_1 (const char *, ptrdiff_t);
+extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t);
+extern Lisp_Object intern_driver (Lisp_Object, Lisp_Object, Lisp_Object);
+extern void init_symbol (Lisp_Object, Lisp_Object);
+extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t);
+INLINE void
+LOADHIST_ATTACH (Lisp_Object x)
+{
+ if (initialized)
+ Vcurrent_load_list = Fcons (x, Vcurrent_load_list);
+}
+extern int openp (Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object *, Lisp_Object, bool);
+extern Lisp_Object string_to_number (char const *, int, bool);
+extern void map_obarray (Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
+ Lisp_Object);
+extern void dir_warning (const char *, Lisp_Object);
+extern void init_obarray (void);
+extern void init_lread (void);
+extern void syms_of_lread (void);
+
+INLINE Lisp_Object
+intern (const char *str)
+{
+ return intern_1 (str, strlen (str));
+}
+
+INLINE Lisp_Object
+intern_c_string (const char *str)
+{
+ return intern_c_string_1 (str, strlen (str));
+}
+
+/* Defined in eval.c. */
+extern EMACS_INT lisp_eval_depth;
+extern Lisp_Object Vautoload_queue;
+extern Lisp_Object Vrun_hooks;
+extern Lisp_Object Vsignaling_function;
+extern Lisp_Object inhibit_lisp_code;
+extern struct handler *handlerlist;
+
+/* To run a normal hook, use the appropriate function from the list below.
+ The calling convention:
+
+ if (!NILP (Vrun_hooks))
+ call1 (Vrun_hooks, Qmy_funny_hook);
+
+ should no longer be used. */
+extern void run_hook (Lisp_Object);
+extern void run_hook_with_args_2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
+ Lisp_Object (*funcall)
+ (ptrdiff_t nargs, Lisp_Object *args));
+extern _Noreturn void xsignal (Lisp_Object, Lisp_Object);
+extern _Noreturn void xsignal0 (Lisp_Object);
+extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object);
+extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern _Noreturn void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object);
+extern _Noreturn void signal_error (const char *, Lisp_Object);
+extern Lisp_Object eval_sub (Lisp_Object form);
+extern Lisp_Object apply1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object call0 (Lisp_Object);
+extern Lisp_Object call1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object call2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object), Lisp_Object);
+extern Lisp_Object internal_lisp_condition_case (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object internal_condition_case (Lisp_Object (*) (void), Lisp_Object, Lisp_Object (*) (Lisp_Object));
+extern Lisp_Object internal_condition_case_1 (Lisp_Object (*) (Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
+extern Lisp_Object internal_condition_case_2 (Lisp_Object (*) (Lisp_Object, Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
+extern Lisp_Object internal_condition_case_n
+ (Lisp_Object (*) (ptrdiff_t, Lisp_Object *), ptrdiff_t, Lisp_Object *,
+ Lisp_Object, Lisp_Object (*) (Lisp_Object, ptrdiff_t, Lisp_Object *));
+extern void specbind (Lisp_Object, Lisp_Object);
+extern void record_unwind_protect (void (*) (Lisp_Object), Lisp_Object);
+extern void record_unwind_protect_ptr (void (*) (void *), void *);
+extern void record_unwind_protect_int (void (*) (int), int);
+extern void record_unwind_protect_void (void (*) (void));
+extern void record_unwind_protect_nothing (void);
+extern void clear_unwind_protect (ptrdiff_t);
+extern void set_unwind_protect (ptrdiff_t, void (*) (Lisp_Object), Lisp_Object);
+extern void set_unwind_protect_ptr (ptrdiff_t, void (*) (void *), void *);
+extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object);
+extern _Noreturn void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
+extern _Noreturn void verror (const char *, va_list)
+ ATTRIBUTE_FORMAT_PRINTF (1, 0);
+extern void un_autoload (Lisp_Object);
+extern Lisp_Object call_debugger (Lisp_Object arg);
+extern void init_eval_once (void);
+extern Lisp_Object safe_call (ptrdiff_t, Lisp_Object, ...);
+extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern void init_eval (void);
+extern void syms_of_eval (void);
+extern void unwind_body (Lisp_Object);
+extern ptrdiff_t record_in_backtrace (Lisp_Object, Lisp_Object *, ptrdiff_t);
+extern void mark_specpdl (void);
+extern void get_backtrace (Lisp_Object array);
+Lisp_Object backtrace_top_function (void);
+extern bool let_shadows_buffer_binding_p (struct Lisp_Symbol *symbol);
+extern bool let_shadows_global_binding_p (Lisp_Object symbol);
+
+
+/* Defined in editfns.c. */
+extern void insert1 (Lisp_Object);
+extern Lisp_Object format2 (const char *, Lisp_Object, Lisp_Object);
+extern Lisp_Object save_excursion_save (void);
+extern Lisp_Object save_restriction_save (void);
+extern void save_excursion_restore (Lisp_Object);
+extern void save_restriction_restore (Lisp_Object);
+extern _Noreturn void time_overflow (void);
+extern Lisp_Object make_buffer_string (ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object make_buffer_string_both (ptrdiff_t, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, bool);
+extern void init_editfns (void);
+extern void syms_of_editfns (void);
+
+/* Defined in buffer.c. */
+extern bool mouse_face_overlay_overlaps (Lisp_Object);
+extern _Noreturn void nsberror (Lisp_Object);
+extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t);
+extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t);
+extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t);
+extern void report_overlay_modification (Lisp_Object, Lisp_Object, bool,
+ Lisp_Object, Lisp_Object, Lisp_Object);
+extern bool overlay_touches_p (ptrdiff_t);
+extern Lisp_Object other_buffer_safely (Lisp_Object);
+extern Lisp_Object get_truename_buffer (Lisp_Object);
+extern void init_buffer_once (void);
+extern void init_buffer (int);
+extern void syms_of_buffer (void);
+extern void keys_of_buffer (void);
+
+/* Defined in marker.c. */
+
+extern ptrdiff_t marker_position (Lisp_Object);
+extern ptrdiff_t marker_byte_position (Lisp_Object);
+extern void clear_charpos_cache (struct buffer *);
+extern ptrdiff_t buf_charpos_to_bytepos (struct buffer *, ptrdiff_t);
+extern ptrdiff_t buf_bytepos_to_charpos (struct buffer *, ptrdiff_t);
+extern void unchain_marker (struct Lisp_Marker *marker);
+extern Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object set_marker_both (Lisp_Object, Lisp_Object, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object set_marker_restricted_both (Lisp_Object, Lisp_Object,
+ ptrdiff_t, ptrdiff_t);
+extern Lisp_Object build_marker (struct buffer *, ptrdiff_t, ptrdiff_t);
+extern void syms_of_marker (void);
+
+/* Defined in fileio.c. */
+
+extern Lisp_Object expand_and_dir_to_file (Lisp_Object, Lisp_Object);
+extern Lisp_Object write_region (Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object, int);
+extern void close_file_unwind (int);
+extern void fclose_unwind (void *);
+extern void restore_point_unwind (Lisp_Object);
+extern _Noreturn void report_file_errno (const char *, Lisp_Object, int);
+extern _Noreturn void report_file_error (const char *, Lisp_Object);
+extern bool internal_delete_file (Lisp_Object);
+extern Lisp_Object emacs_readlinkat (int, const char *);
+extern bool file_directory_p (const char *);
+extern bool file_accessible_directory_p (Lisp_Object);
+extern void init_fileio (void);
+extern void syms_of_fileio (void);
+extern Lisp_Object make_temp_name (Lisp_Object, bool);
+
+/* Defined in search.c. */
+extern void shrink_regexp_cache (void);
+extern void restore_search_regs (void);
+extern void record_unwind_save_match_data (void);
+struct re_registers;
+extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
+ struct re_registers *,
+ Lisp_Object, bool, bool);
+extern ptrdiff_t fast_string_match_internal (Lisp_Object, Lisp_Object,
+ Lisp_Object);
+
+INLINE ptrdiff_t
+fast_string_match (Lisp_Object regexp, Lisp_Object string)
+{
+ return fast_string_match_internal (regexp, string, Qnil);
+}
+
+INLINE ptrdiff_t
+fast_string_match_ignore_case (Lisp_Object regexp, Lisp_Object string)
+{
+ return fast_string_match_internal (regexp, string, Vascii_canon_table);
+}
+
+extern ptrdiff_t fast_c_string_match_ignore_case (Lisp_Object, const char *,
+ ptrdiff_t);
+extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t, Lisp_Object);
+extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
+extern ptrdiff_t scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, bool);
+extern ptrdiff_t scan_newline_from_point (ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
+extern ptrdiff_t find_newline_no_quit (ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t *);
+extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t,
+ ptrdiff_t, ptrdiff_t *);
+extern void syms_of_search (void);
+extern void clear_regexp_cache (void);
+
+/* Defined in minibuf.c. */
+
+extern Lisp_Object Vminibuffer_list;
+extern Lisp_Object last_minibuf_string;
+extern Lisp_Object get_minibuffer (EMACS_INT);
+extern void init_minibuf_once (void);
+extern void syms_of_minibuf (void);
+
+/* Defined in callint.c. */
+
+extern void syms_of_callint (void);
+
+/* Defined in casefiddle.c. */
+
+extern void syms_of_casefiddle (void);
+extern void keys_of_casefiddle (void);
+
+/* Defined in casetab.c. */
+
+extern void init_casetab_once (void);
+extern void syms_of_casetab (void);
+
+/* Defined in keyboard.c. */
+
+extern Lisp_Object echo_message_buffer;
+extern struct kboard *echo_kboard;
+extern void cancel_echoing (void);
+extern Lisp_Object last_undo_boundary;
+extern bool input_pending;
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+extern sigjmp_buf return_to_command_loop;
+#endif
+extern Lisp_Object menu_bar_items (Lisp_Object);
+extern Lisp_Object tool_bar_items (Lisp_Object, int *);
+extern void discard_mouse_events (void);
+#ifdef USABLE_SIGIO
+void handle_input_available_signal (int);
+#endif
+extern Lisp_Object pending_funcalls;
+extern bool detect_input_pending (void);
+extern bool detect_input_pending_ignore_squeezables (void);
+extern bool detect_input_pending_run_timers (bool);
+extern void safe_run_hooks (Lisp_Object);
+extern void cmd_error_internal (Lisp_Object, const char *);
+extern Lisp_Object command_loop_1 (void);
+extern Lisp_Object read_menu_command (void);
+extern Lisp_Object recursive_edit_1 (void);
+extern void record_auto_save (void);
+extern void force_auto_save_soon (void);
+extern void init_keyboard (void);
+extern void syms_of_keyboard (void);
+extern void keys_of_keyboard (void);
+
+/* Defined in indent.c. */
+extern ptrdiff_t current_column (void);
+extern void invalidate_current_column (void);
+extern bool indented_beyond_p (ptrdiff_t, ptrdiff_t, EMACS_INT);
+extern void syms_of_indent (void);
+
+/* Defined in frame.c. */
+extern void store_frame_param (struct frame *, Lisp_Object, Lisp_Object);
+extern void store_in_alist (Lisp_Object *, Lisp_Object, Lisp_Object);
+extern Lisp_Object do_switch_frame (Lisp_Object, int, int, Lisp_Object);
+extern Lisp_Object get_frame_param (struct frame *, Lisp_Object);
+extern void frames_discard_buffer (Lisp_Object);
+extern void syms_of_frame (void);
+
+/* Defined in emacs.c. */
+extern char **initial_argv;
+extern int initial_argc;
+#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
+extern bool display_arg;
+#endif
+extern Lisp_Object decode_env_path (const char *, const char *, bool);
+extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
+extern _Noreturn void terminate_due_to_signal (int, int);
+#ifdef WINDOWSNT
+extern Lisp_Object Vlibrary_cache;
+#endif
+#if HAVE_SETLOCALE
+void fixup_locale (void);
+void synchronize_system_messages_locale (void);
+void synchronize_system_time_locale (void);
+#else
+INLINE void fixup_locale (void) {}
+INLINE void synchronize_system_messages_locale (void) {}
+INLINE void synchronize_system_time_locale (void) {}
+#endif
+extern void shut_down_emacs (int, Lisp_Object);
+
+/* True means don't do interactive redisplay and don't change tty modes. */
+extern bool noninteractive;
+
+/* True means remove site-lisp directories from load-path. */
+extern bool no_site_lisp;
+
+/* Pipe used to send exit notification to the daemon parent at
+ startup. On Windows, we use a kernel event instead. */
+#ifndef WINDOWSNT
+extern int daemon_pipe[2];
+#define IS_DAEMON (daemon_pipe[1] != 0)
+#define DAEMON_RUNNING (daemon_pipe[1] >= 0)
+#else /* WINDOWSNT */
+extern void *w32_daemon_event;
+#define IS_DAEMON (w32_daemon_event != NULL)
+#define DAEMON_RUNNING (w32_daemon_event != INVALID_HANDLE_VALUE)
+#endif
+
+/* True if handling a fatal error already. */
+extern bool fatal_error_in_progress;
+
+/* True means don't do use window-system-specific display code. */
+extern bool inhibit_window_system;
+/* True means that a filter or a sentinel is running. */
+extern bool running_asynch_code;
+
+/* Defined in process.c. */
+extern void kill_buffer_processes (Lisp_Object);
+extern int wait_reading_process_output (intmax_t, int, int, bool, Lisp_Object,
+ struct Lisp_Process *, int);
+/* Max value for the first argument of wait_reading_process_output. */
+#if __GNUC__ == 3 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 5)
+/* Work around a bug in GCC 3.4.2, known to be fixed in GCC 4.6.3.
+ The bug merely causes a bogus warning, but the warning is annoying. */
+# define WAIT_READING_MAX min (TYPE_MAXIMUM (time_t), INTMAX_MAX)
+#else
+# define WAIT_READING_MAX INTMAX_MAX
+#endif
+#ifdef HAVE_TIMERFD
+extern void add_timer_wait_descriptor (int);
+#endif
+extern void add_keyboard_wait_descriptor (int);
+extern void delete_keyboard_wait_descriptor (int);
+#ifdef HAVE_GPM
+extern void add_gpm_wait_descriptor (int);
+extern void delete_gpm_wait_descriptor (int);
+#endif
+extern void init_process_emacs (void);
+extern void syms_of_process (void);
+extern void setup_process_coding_systems (Lisp_Object);
+
+/* Defined in callproc.c. */
+#ifndef DOS_NT
+ _Noreturn
+#endif
+extern int child_setup (int, int, int, char **, bool, Lisp_Object);
+extern void init_callproc_1 (void);
+extern void init_callproc (void);
+extern void set_initial_environment (void);
+extern void syms_of_callproc (void);
+
+/* Defined in doc.c. */
+extern Lisp_Object read_doc_string (Lisp_Object);
+extern Lisp_Object get_doc_string (Lisp_Object, bool, bool);
+extern void syms_of_doc (void);
+extern int read_bytecode_char (bool);
+
+/* Defined in bytecode.c. */
+extern void syms_of_bytecode (void);
+extern struct byte_stack *byte_stack_list;
+#if BYTE_MARK_STACK
+extern void mark_byte_stack (void);
+#endif
+extern void unmark_byte_stack (void);
+extern Lisp_Object exec_byte_code (Lisp_Object, Lisp_Object, Lisp_Object,
+ Lisp_Object, ptrdiff_t, Lisp_Object *);
+
+/* Defined in macros.c. */
+extern void init_macros (void);
+extern void syms_of_macros (void);
+
+/* Defined in undo.c. */
+extern void truncate_undo_list (struct buffer *);
+extern void record_insert (ptrdiff_t, ptrdiff_t);
+extern void record_delete (ptrdiff_t, Lisp_Object, bool);
+extern void record_first_change (void);
+extern void record_change (ptrdiff_t, ptrdiff_t);
+extern void record_property_change (ptrdiff_t, ptrdiff_t,
+ Lisp_Object, Lisp_Object,
+ Lisp_Object);
+extern void syms_of_undo (void);
+
+/* Defined in textprop.c. */
+extern void report_interval_modification (Lisp_Object, Lisp_Object);
+
+/* Defined in menu.c. */
+extern void syms_of_menu (void);
+
+/* Defined in xmenu.c. */
+extern void syms_of_xmenu (void);
+
+/* Defined in termchar.h. */
+struct tty_display_info;
+
+/* Defined in termhooks.h. */
+struct terminal;
+
+/* Defined in sysdep.c. */
+#ifndef HAVE_GET_CURRENT_DIR_NAME
+extern char *get_current_dir_name (void);
+#endif
+extern void stuff_char (char c);
+extern void init_foreground_group (void);
+extern void sys_subshell (void);
+extern void sys_suspend (void);
+extern void discard_tty_input (void);
+extern void init_sys_modes (struct tty_display_info *);
+extern void reset_sys_modes (struct tty_display_info *);
+extern void init_all_sys_modes (void);
+extern void reset_all_sys_modes (void);
+extern void child_setup_tty (int);
+extern void setup_pty (int);
+extern int set_window_size (int, int, int);
+extern EMACS_INT get_random (void);
+extern void seed_random (void *, ptrdiff_t);
+extern void init_random (void);
+extern void emacs_backtrace (int);
+extern _Noreturn void emacs_abort (void) NO_INLINE;
+extern int emacs_open (const char *, int, int);
+extern int emacs_pipe (int[2]);
+extern int emacs_close (int);
+extern ptrdiff_t emacs_read (int, void *, ptrdiff_t);
+extern ptrdiff_t emacs_write (int, void const *, ptrdiff_t);
+extern ptrdiff_t emacs_write_sig (int, void const *, ptrdiff_t);
+extern void emacs_perror (char const *);
+
+extern void unlock_all_files (void);
+extern void lock_file (Lisp_Object);
+extern void unlock_file (Lisp_Object);
+extern void unlock_buffer (struct buffer *);
+extern void syms_of_filelock (void);
+extern int str_collate (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+
+/* Defined in sound.c. */
+extern void syms_of_sound (void);
+
+/* Defined in category.c. */
+extern void init_category_once (void);
+extern Lisp_Object char_category_set (int);
+extern void syms_of_category (void);
+
+/* Defined in ccl.c. */
+extern void syms_of_ccl (void);
+
+/* Defined in dired.c. */
+extern void syms_of_dired (void);
+extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
+ Lisp_Object, Lisp_Object,
+ bool, Lisp_Object);
+
+/* Defined in term.c. */
+extern int *char_ins_del_vector;
+extern void syms_of_term (void);
+extern _Noreturn void fatal (const char *msgid, ...)
+ ATTRIBUTE_FORMAT_PRINTF (1, 2);
+
+/* Defined in terminal.c. */
+extern void syms_of_terminal (void);
+
+/* Defined in font.c. */
+extern void syms_of_font (void);
+extern void init_font (void);
+
+#ifdef HAVE_WINDOW_SYSTEM
+/* Defined in fontset.c. */
+extern void syms_of_fontset (void);
+#endif
+
+/* Defined in gfilenotify.c */
+#ifdef HAVE_GFILENOTIFY
+extern void globals_of_gfilenotify (void);
+extern void syms_of_gfilenotify (void);
+#endif
+
+/* Defined in inotify.c */
+#ifdef HAVE_INOTIFY
+extern void syms_of_inotify (void);
+#endif
+
+#ifdef HAVE_W32NOTIFY
+/* Defined on w32notify.c. */
+extern void syms_of_w32notify (void);
+#endif
+
+/* Defined in xfaces.c. */
+extern Lisp_Object Vface_alternative_font_family_alist;
+extern Lisp_Object Vface_alternative_font_registry_alist;
+extern void syms_of_xfaces (void);
+
+#ifdef HAVE_X_WINDOWS
+/* Defined in xfns.c. */
+extern void syms_of_xfns (void);
+
+/* Defined in xsmfns.c. */
+extern void syms_of_xsmfns (void);
+
+/* Defined in xselect.c. */
+extern void syms_of_xselect (void);
+
+/* Defined in xterm.c. */
+extern void init_xterm (void);
+extern void syms_of_xterm (void);
+#endif /* HAVE_X_WINDOWS */
+
+#ifdef HAVE_WINDOW_SYSTEM
+/* Defined in xterm.c, nsterm.m, w32term.c. */
+extern char *x_get_keysym_name (int);
+#endif /* HAVE_WINDOW_SYSTEM */
+
+#ifdef HAVE_LIBXML2
+/* Defined in xml.c. */
+extern void syms_of_xml (void);
+extern void xml_cleanup_parser (void);
+#endif
+
+#ifdef HAVE_ZLIB
+/* Defined in decompress.c. */
+extern void syms_of_decompress (void);
+#endif
+
+#ifdef HAVE_DBUS
+/* Defined in dbusbind.c. */
+void init_dbusbind (void);
+void syms_of_dbusbind (void);
+#endif
+
+
+/* Defined in profiler.c. */
+extern bool profiler_memory_running;
+extern void malloc_probe (size_t);
+extern void syms_of_profiler (void);
+
+
+#ifdef DOS_NT
+/* Defined in msdos.c, w32.c. */
+extern char *emacs_root_dir (void);
+#endif /* DOS_NT */
+
+/* Defined in lastfile.c. */
+extern char my_edata[];
+extern char my_endbss[];
+extern char *my_endbss_static;
+
+/* True means ^G can quit instantly. */
+extern bool immediate_quit;
+
+extern void *xmalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
+extern void *xzalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
+extern void *xrealloc (void *, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
+extern void xfree (void *);
+extern void *xnmalloc (ptrdiff_t, ptrdiff_t) ATTRIBUTE_MALLOC_SIZE ((1,2));
+extern void *xnrealloc (void *, ptrdiff_t, ptrdiff_t)
+ ATTRIBUTE_ALLOC_SIZE ((2,3));
+extern void *xpalloc (void *, ptrdiff_t *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
+
+extern char *xstrdup (const char *) ATTRIBUTE_MALLOC;
+extern char *xlispstrdup (Lisp_Object) ATTRIBUTE_MALLOC;
+extern void dupstring (char **, char const *);
+
+/* Make DEST a copy of STRING's data. Return a pointer to DEST's terminating
+ null byte. This is like stpcpy, except the source is a Lisp string. */
+
+INLINE char *
+lispstpcpy (char *dest, Lisp_Object string)
+{
+ ptrdiff_t len = SBYTES (string);
+ memcpy (dest, SDATA (string), len + 1);
+ return dest + len;
+}
+
+extern void xputenv (const char *);
+
+extern char *egetenv_internal (const char *, ptrdiff_t);
+
+INLINE char *
+egetenv (const char *var)
+{
+ /* When VAR is a string literal, strlen can be optimized away. */
+ return egetenv_internal (var, strlen (var));
+}
+
+/* Set up the name of the machine we're running on. */
+extern void init_system_name (void);
+
+/* Return the absolute value of X. X should be a signed integer
+ expression without side effects, and X's absolute value should not
+ exceed the maximum for its promoted type. This is called 'eabs'
+ because 'abs' is reserved by the C standard. */
+#define eabs(x) ((x) < 0 ? -(x) : (x))
+
+/* Return a fixnum or float, depending on whether VAL fits in a Lisp
+ fixnum. */
+
+#define make_fixnum_or_float(val) \
+ (FIXNUM_OVERFLOW_P (val) ? make_float (val) : make_number (val))
+
+/* SAFE_ALLOCA normally allocates memory on the stack, but if size is
+ larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack. */
+
+enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
+
+extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
+
+#define USE_SAFE_ALLOCA \
+ ptrdiff_t sa_avail = MAX_ALLOCA; \
+ ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = false
+
+#define AVAIL_ALLOCA(size) (sa_avail -= (size), alloca (size))
+
+/* SAFE_ALLOCA allocates a simple buffer. */
+
+#define SAFE_ALLOCA(size) ((size) <= sa_avail \
+ ? AVAIL_ALLOCA (size) \
+ : (sa_must_free = true, record_xmalloc (size)))
+
+/* SAFE_NALLOCA sets BUF to a newly allocated array of MULTIPLIER *
+ NITEMS items, each of the same type as *BUF. MULTIPLIER must
+ positive. The code is tuned for MULTIPLIER being a constant. */
+
+#define SAFE_NALLOCA(buf, multiplier, nitems) \
+ do { \
+ if ((nitems) <= sa_avail / sizeof *(buf) / (multiplier)) \
+ (buf) = AVAIL_ALLOCA (sizeof *(buf) * (multiplier) * (nitems)); \
+ else \
+ { \
+ (buf) = xnmalloc (nitems, sizeof *(buf) * (multiplier)); \
+ sa_must_free = true; \
+ record_unwind_protect_ptr (xfree, buf); \
+ } \
+ } while (false)
+
+/* SAFE_ALLOCA_STRING allocates a C copy of a Lisp string. */
+
+#define SAFE_ALLOCA_STRING(ptr, string) \
+ do { \
+ (ptr) = SAFE_ALLOCA (SBYTES (string) + 1); \
+ memcpy (ptr, SDATA (string), SBYTES (string) + 1); \
+ } while (false)
+
+/* SAFE_FREE frees xmalloced memory and enables GC as needed. */
+
+#define SAFE_FREE() \
+ do { \
+ if (sa_must_free) { \
+ sa_must_free = false; \
+ unbind_to (sa_count, Qnil); \
+ } \
+ } while (false)
+
+
+/* Return floor (NBYTES / WORD_SIZE). */
+
+INLINE ptrdiff_t
+lisp_word_count (ptrdiff_t nbytes)
+{
+ if (-1 >> 1 == -1)
+ switch (word_size)
+ {
+ case 2: return nbytes >> 1;
+ case 4: return nbytes >> 2;
+ case 8: return nbytes >> 3;
+ case 16: return nbytes >> 4;
+ }
+ return nbytes / word_size - (nbytes % word_size < 0);
+}
+
+/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects. */
+
+#define SAFE_ALLOCA_LISP(buf, nelt) \
+ do { \
+ if ((nelt) <= lisp_word_count (sa_avail)) \
+ (buf) = AVAIL_ALLOCA ((nelt) * word_size); \
+ else if ((nelt) <= min (PTRDIFF_MAX, SIZE_MAX) / word_size) \
+ { \
+ Lisp_Object arg_; \
+ (buf) = xmalloc ((nelt) * word_size); \
+ arg_ = make_save_memory (buf, nelt); \
+ sa_must_free = true; \
+ record_unwind_protect (free_save_value, arg_); \
+ } \
+ else \
+ memory_full (SIZE_MAX); \
+ } while (false)
+
+
+/* If USE_STACK_LISP_OBJECTS, define macros that and functions that allocate
+ block-scoped conses and strings. These objects are not
+ managed by the garbage collector, so they are dangerous: passing them
+ out of their scope (e.g., to user code) results in undefined behavior.
+ Conversely, they have better performance because GC is not involved.
+
+ This feature is experimental and requires careful debugging.
+ Build with CPPFLAGS='-DUSE_STACK_LISP_OBJECTS=0' to disable it. */
+
+#ifndef USE_STACK_LISP_OBJECTS
+# define USE_STACK_LISP_OBJECTS true
+#endif
+
+/* USE_STACK_LISP_OBJECTS requires GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS. */
+
+#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
+# undef USE_STACK_LISP_OBJECTS
+# define USE_STACK_LISP_OBJECTS false
+#endif
+
+#ifdef GC_CHECK_STRING_BYTES
+enum { defined_GC_CHECK_STRING_BYTES = true };
+#else
+enum { defined_GC_CHECK_STRING_BYTES = false };
+#endif
+
+/* Struct inside unions that are typically no larger and aligned enough. */
+
+union Aligned_Cons
+{
+ struct Lisp_Cons s;
+ double d; intmax_t i; void *p;
+};
+
+union Aligned_String
+{
+ struct Lisp_String s;
+ double d; intmax_t i; void *p;
+};
+
+/* True for stack-based cons and string implementations, respectively.
+ Use stack-based strings only if stack-based cons also works.
+ Otherwise, STACK_CONS would create heap-based cons cells that
+ could point to stack-based strings, which is a no-no. */
+
+enum
+ {
+ USE_STACK_CONS = (USE_STACK_LISP_OBJECTS
+ && alignof (union Aligned_Cons) % GCALIGNMENT == 0),
+ USE_STACK_STRING = (USE_STACK_CONS
+ && !defined_GC_CHECK_STRING_BYTES
+ && alignof (union Aligned_String) % GCALIGNMENT == 0)
+ };
+
+/* Auxiliary macros used for auto allocation of Lisp objects. Please
+ use these only in macros like AUTO_CONS that declare a local
+ variable whose lifetime will be clear to the programmer. */
+#define STACK_CONS(a, b) \
+ make_lisp_ptr (&(union Aligned_Cons) { { a, { b } } }.s, Lisp_Cons)
+#define AUTO_CONS_EXPR(a, b) \
+ (USE_STACK_CONS ? STACK_CONS (a, b) : Fcons (a, b))
+
+/* Declare NAME as an auto Lisp cons or short list if possible, a
+ GC-based one otherwise. This is in the sense of the C keyword
+ 'auto'; i.e., the object has the lifetime of the containing block.
+ The resulting object should not be made visible to user Lisp code. */
+
+#define AUTO_CONS(name, a, b) Lisp_Object name = AUTO_CONS_EXPR (a, b)
+#define AUTO_LIST1(name, a) \
+ Lisp_Object name = (USE_STACK_CONS ? STACK_CONS (a, Qnil) : list1 (a))
+#define AUTO_LIST2(name, a, b) \
+ Lisp_Object name = (USE_STACK_CONS \
+ ? STACK_CONS (a, STACK_CONS (b, Qnil)) \
+ : list2 (a, b))
+#define AUTO_LIST3(name, a, b, c) \
+ Lisp_Object name = (USE_STACK_CONS \
+ ? STACK_CONS (a, STACK_CONS (b, STACK_CONS (c, Qnil))) \
+ : list3 (a, b, c))
+#define AUTO_LIST4(name, a, b, c, d) \
+ Lisp_Object name \
+ = (USE_STACK_CONS \
+ ? STACK_CONS (a, STACK_CONS (b, STACK_CONS (c, \
+ STACK_CONS (d, Qnil)))) \
+ : list4 (a, b, c, d))
+
+/* Check whether stack-allocated strings are ASCII-only. */
+
+#if defined (ENABLE_CHECKING) && USE_STACK_LISP_OBJECTS
+extern const char *verify_ascii (const char *);
+#else
+# define verify_ascii(str) (str)
+#endif
+
+/* Declare NAME as an auto Lisp string if possible, a GC-based one if not.
+ Take its value from STR. STR is not necessarily copied and should
+ contain only ASCII characters. The resulting Lisp string should
+ not be modified or made visible to user code. */
+
+#define AUTO_STRING(name, str) \
+ Lisp_Object name = \
+ (USE_STACK_STRING \
+ ? (make_lisp_ptr \
+ ((&(union Aligned_String) \
+ {{strlen (str), -1, 0, (unsigned char *) verify_ascii (str)}}.s), \
+ Lisp_String)) \
+ : build_string (verify_ascii (str)))
+
+/* Loop over all tails of a list, checking for cycles.
+ FIXME: Make tortoise and n internal declarations.
+ FIXME: Unroll the loop body so we don't need `n'. */
+#define FOR_EACH_TAIL(hare, list, tortoise, n) \
+ for ((tortoise) = (hare) = (list), (n) = true; \
+ CONSP (hare); \
+ (hare = XCDR (hare), (n) = !(n), \
+ ((n) \
+ ? (EQ (hare, tortoise) \
+ ? xsignal1 (Qcircular_list, list) \
+ : (void) 0) \
+ /* Move tortoise before the next iteration, in case */ \
+ /* the next iteration does an Fsetcdr. */ \
+ : (void) ((tortoise) = XCDR (tortoise)))))
+
+/* Do a `for' loop over alist values. */
+
+#define FOR_EACH_ALIST_VALUE(head_var, list_var, value_var) \
+ for ((list_var) = (head_var); \
+ (CONSP (list_var) && ((value_var) = XCDR (XCAR (list_var)), true)); \
+ (list_var) = XCDR (list_var))
+
+/* Check whether it's time for GC, and run it if so. */
+
+INLINE void
+maybe_gc (void)
+{
+ if ((consing_since_gc > gc_cons_threshold
+ && consing_since_gc > gc_relative_threshold)
+ || (!NILP (Vmemory_full)
+ && consing_since_gc > memory_full_cons_threshold))
+ Fgarbage_collect ();
+}
+
+INLINE bool
+functionp (Lisp_Object object)
+{
+ if (SYMBOLP (object) && !NILP (Ffboundp (object)))
+ {
+ object = Findirect_function (object, Qt);
+
+ if (CONSP (object) && EQ (XCAR (object), Qautoload))
+ {
+ /* Autoloaded symbols are functions, except if they load
+ macros or keymaps. */
+ int i;
+ for (i = 0; i < 4 && CONSP (object); i++)
+ object = XCDR (object);
+
+ return ! (CONSP (object) && !NILP (XCAR (object)));
+ }
+ }
+
+ if (SUBRP (object))
+ return XSUBR (object)->max_args != UNEVALLED;
+ else if (COMPILEDP (object))
+ return true;
+ else if (CONSP (object))
+ {
+ Lisp_Object car = XCAR (object);
+ return EQ (car, Qlambda) || EQ (car, Qclosure);
+ }
+ else
+ return false;
+}
+
+INLINE_HEADER_END
+
+#endif /* EMACS_LISP_H */
diff --git a/test/etags/c-src/emacs/src/regex.h b/test/etags/c-src/emacs/src/regex.h
new file mode 100644
index 00000000000..3dfecf0a7e5
--- /dev/null
+++ b/test/etags/c-src/emacs/src/regex.h
@@ -0,0 +1,630 @@
+/* Definitions for data structures and routines for the regular
+ expression library, version 0.12.
+
+ Copyright (C) 1985, 1989-1993, 1995, 2000-2015 Free Software
+ Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+/* Allow the use in C++ code. */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* POSIX says that <sys/types.h> must be included (by the caller) before
+ <regex.h>. */
+
+#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
+/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+ should be there. */
+# include <stddef.h>
+#endif
+
+/* The following bits are used to determine the regexp syntax we
+ recognize. The set/not-set meanings where historically chosen so
+ that Emacs syntax had the value 0.
+ The bits are given in alphabetical order, and
+ the definitions shifted by one from the previous bit; thus, when we
+ add or remove a bit, only one other definition need change. */
+typedef unsigned long reg_syntax_t;
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+ If set, then such a \ quotes the following character. */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+ literals.
+ If set, then \+ and \? are operators and + and ? are literals. */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported. They are:
+ [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
+ [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+ If not set, then character classes are not supported. */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+ expressions, of course).
+ If this bit is not set, then it depends:
+ ^ is an anchor if it is at the beginning of a regular
+ expression or after an open-group or an alternation operator;
+ $ is an anchor if it is at the end of a regular expression, or
+ before a close-group or an alternation operator.
+
+ This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+ POSIX draft 11.2 says that * etc. in leading positions is undefined.
+ We already implemented a previous draft which made those constructs
+ invalid, though, so we haven't changed the code back. */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+ regardless of where they are in the pattern.
+ If this bit is not set, then special characters are special only in
+ some contexts; otherwise they are ordinary. Specifically,
+ * + ? and intervals are only special when not after the beginning,
+ open-group, or alternation operator. */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+ immediately after an alternation or begin-group operator. */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+ If not set, then it doesn't. */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+ If not set, then it does. */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+ If not set, they do. */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+ interval, depending on RE_NO_BK_BRACES.
+ If not set, \{, \}, {, and } are literals. */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+ If not set, they are. */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+ If not set, newline is literal. */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+ are literals.
+ If not set, then `\{...\}' defines an interval. */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+ If not set, \(...\) defines a group, and ( and ) are literals. */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+ If not set, then \<digit> is a back-reference. */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+ If not set, then \| is an alternation operator, and | is literal. */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+ than the starting range point, as in [z-a], is invalid.
+ If not set, then when ending range point collates higher than the
+ starting range point, the range is ignored. */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+ If not set, then an unmatched ) is invalid. */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+ without further backtracking. */
+#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+ If not set, then the GNU regex operators are recognized. */
+#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, then *?, +? and ?? match non greedily. */
+#define RE_FRUGAL (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, then (?:...) is treated as a shy group. */
+#define RE_SHY_GROUPS (RE_FRUGAL << 1)
+
+/* If this bit is set, ^ and $ only match at beg/end of buffer. */
+#define RE_NO_NEWLINE_ANCHOR (RE_SHY_GROUPS << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+ If not set, and debugging was on, turn it off.
+ This only works if regex.c is compiled -DDEBUG.
+ We define this bit always, so that all that's needed to turn on
+ debugging is to recompile regex.c; the calling code can always have
+ this bit set, and it won't affect anything in the normal case. */
+#define RE_DEBUG (RE_NO_NEWLINE_ANCHOR << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+ some interfaces). When a regexp is compiled, the syntax used is
+ stored in the pattern buffer, so changing this does not affect
+ already-compiled regexps. */
+extern reg_syntax_t re_syntax_options;
+
+#ifdef emacs
+/* In Emacs, this is the string or buffer in which we
+ are matching. It is used for looking up syntax properties. */
+extern Lisp_Object re_match_object;
+#endif
+
+/* Roughly the maximum number of failure points on the stack. */
+extern size_t re_max_failures;
+
+
+/* Define combinations of the above bits for the standard possibilities.
+ (The [[[ comments delimit what gets put into the Texinfo file, so
+ don't delete them!) */
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS \
+ (RE_CHAR_CLASSES | RE_INTERVALS | RE_SHY_GROUPS | RE_FRUGAL)
+
+#define RE_SYNTAX_AWK \
+ (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
+ | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GNU_AWK \
+ ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
+ & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
+
+#define RE_SYNTAX_POSIX_AWK \
+ (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
+ | RE_INTERVALS | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GREP \
+ (RE_BK_PLUS_QM | RE_CHAR_CLASSES \
+ | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
+ | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP \
+ (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
+ | RE_NEWLINE_ALT | RE_NO_BK_PARENS \
+ | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP \
+ (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax. */
+#define _RE_SYNTAX_POSIX_COMMON \
+ (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
+ | RE_INTERVALS | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+ RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
+ isn't minimal, since other operators, such as \`, aren't disabled. */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC \
+ (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_VBAR \
+ | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+ removed and RE_NO_BK_REFS is added. */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
+ (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
+ | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
+ | RE_NO_BK_PARENS | RE_NO_BK_REFS \
+ | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+/* Maximum number of duplicates an interval can allow. Some systems
+ (erroneously) define this in other header files, but we want our
+ value, so remove any previous define. */
+#ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+#endif
+/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */
+#define RE_DUP_MAX (0x7fff)
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp'). */
+
+/* If this bit is set, then use extended regular expression syntax.
+ If not set, then use basic regular expression syntax. */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+ If not set, then case is significant. */
+#define REG_ICASE (REG_EXTENDED << 1)
+
+/* If this bit is set, then anchors do not match at newline
+ characters in the string.
+ If not set, then anchors do match at newlines. */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+ If not set, then returns differ between not matching and errors. */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec). */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+ the beginning of the string (presumably because it's not the
+ beginning of a line).
+ If not set, then the beginning-of-line operator does match the
+ beginning of the string. */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line. */
+#define REG_NOTEOL (1 << 1)
+
+
+/* If any error codes are removed, changed, or added, update the
+ `re_error_msg' table in regex.c. */
+typedef enum
+{
+#ifdef _XOPEN_SOURCE
+ REG_ENOSYS = -1, /* This will never happen for this implementation. */
+#endif
+
+ REG_NOERROR = 0, /* Success. */
+ REG_NOMATCH, /* Didn't find a match (for regexec). */
+
+ /* POSIX regcomp return error codes. (In the order listed in the
+ standard.) */
+ REG_BADPAT, /* Invalid pattern. */
+ REG_ECOLLATE, /* Not implemented. */
+ REG_ECTYPE, /* Invalid character class name. */
+ REG_EESCAPE, /* Trailing backslash. */
+ REG_ESUBREG, /* Invalid back reference. */
+ REG_EBRACK, /* Unmatched left bracket. */
+ REG_EPAREN, /* Parenthesis imbalance. */
+ REG_EBRACE, /* Unmatched \{. */
+ REG_BADBR, /* Invalid contents of \{\}. */
+ REG_ERANGE, /* Invalid range end. */
+ REG_ESPACE, /* Ran out of memory. */
+ REG_BADRPT, /* No preceding re for repetition op. */
+
+ /* Error codes we've added. */
+ REG_EEND, /* Premature end. */
+ REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
+ REG_ERPAREN, /* Unmatched ) or \); not returned from regcomp. */
+ REG_ERANGEX /* Range striding over charsets. */
+} reg_errcode_t;
+
+/* This data structure represents a compiled pattern. Before calling
+ the pattern compiler, the fields `buffer', `allocated', `fastmap',
+ `translate', and `no_sub' can be set. After the pattern has been
+ compiled, the `re_nsub' field is available. All other fields are
+ private to the regex routines. */
+
+#ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE char *
+#endif
+
+struct re_pattern_buffer
+{
+/* [[[begin pattern_buffer]]] */
+ /* Space that holds the compiled pattern. It is declared as
+ `unsigned char *' because its elements are
+ sometimes used as array indexes. */
+ unsigned char *buffer;
+
+ /* Number of bytes to which `buffer' points. */
+ size_t allocated;
+
+ /* Number of bytes actually used in `buffer'. */
+ size_t used;
+
+ /* Syntax setting with which the pattern was compiled. */
+ reg_syntax_t syntax;
+
+ /* Pointer to a fastmap, if any, otherwise zero. re_search uses
+ the fastmap, if there is one, to skip over impossible
+ starting points for matches. */
+ char *fastmap;
+
+ /* Either a translate table to apply to all characters before
+ comparing them, or zero for no translation. The translation
+ is applied to a pattern when it is compiled and to a string
+ when it is matched. */
+ RE_TRANSLATE_TYPE translate;
+
+ /* Number of subexpressions found by the compiler. */
+ size_t re_nsub;
+
+ /* Zero if this pattern cannot match the empty string, one else.
+ Well, in truth it's used only in `re_search_2', to see
+ whether or not we should use the fastmap, so we don't set
+ this absolutely perfectly; see `re_compile_fastmap'. */
+ unsigned can_be_null : 1;
+
+ /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+ for `max (RE_NREGS, re_nsub + 1)' groups.
+ If REGS_REALLOCATE, reallocate space if necessary.
+ If REGS_FIXED, use what's there. */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+ unsigned regs_allocated : 2;
+
+ /* Set to zero when `regex_compile' compiles a pattern; set to one
+ by `re_compile_fastmap' if it updates the fastmap. */
+ unsigned fastmap_accurate : 1;
+
+ /* If set, `re_match_2' does not return information about
+ subexpressions. */
+ unsigned no_sub : 1;
+
+ /* If set, a beginning-of-line anchor doesn't match at the
+ beginning of the string. */
+ unsigned not_bol : 1;
+
+ /* Similarly for an end-of-line anchor. */
+ unsigned not_eol : 1;
+
+ /* If true, the compilation of the pattern had to look up the syntax table,
+ so the compiled pattern is only valid for the current syntax table. */
+ unsigned used_syntax : 1;
+
+#ifdef emacs
+ /* If true, multi-byte form in the regexp pattern should be
+ recognized as a multibyte character. */
+ unsigned multibyte : 1;
+
+ /* If true, multi-byte form in the target of match should be
+ recognized as a multibyte character. */
+ unsigned target_multibyte : 1;
+
+ /* Charset of unibyte characters at compiling time. */
+ int charset_unibyte;
+#endif
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* Type for byte offsets within the string. POSIX mandates this to be an int,
+ but the Open Group has signaled its intention to change the requirement to
+ be that regoff_t be at least as wide as ptrdiff_t and ssize_t. Current
+ gnulib sources also use ssize_t, and we need this for supporting buffers and
+ strings > 2GB on 64-bit hosts. */
+typedef ssize_t regoff_t;
+
+
+/* This is the structure we store register match data in. See
+ regex.texinfo for a full description of what registers match. */
+struct re_registers
+{
+ unsigned num_regs;
+ regoff_t *start;
+ regoff_t *end;
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+ `re_match_2' returns information about at least this many registers
+ the first time a `regs' structure is passed. */
+#ifndef RE_NREGS
+# define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers. Aside from the different names than
+ `re_registers', POSIX uses an array of structures, instead of a
+ structure of arrays. */
+typedef struct
+{
+ regoff_t rm_so; /* Byte offset from string's start to substring's start. */
+ regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
+} regmatch_t;
+
+/* Declarations for routines. */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+ You can also simply assign to the `re_syntax_options' variable. */
+extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
+
+/* Compile the regular expression PATTERN, with length LENGTH
+ and syntax given by the global `re_syntax_options', into the buffer
+ BUFFER. Return NULL if successful, and an error string if not. */
+extern const char *re_compile_pattern (const char *__pattern, size_t __length,
+ struct re_pattern_buffer *__buffer);
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+ accelerate searches. Return 0 if successful and -2 if was an
+ internal error. */
+extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+ compiled into BUFFER. Start searching at position START, for RANGE
+ characters. Return the starting position of the match, -1 for no
+ match, or -2 for an internal error. Also return register
+ information in REGS (if REGS and BUFFER->no_sub are nonzero). */
+extern regoff_t re_search (struct re_pattern_buffer *__buffer,
+ const char *__string, size_t __length,
+ ssize_t __start, ssize_t __range,
+ struct re_registers *__regs);
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+ STRING2. Also, stop searching at index START + STOP. */
+extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, size_t __length1,
+ const char *__string2, size_t __length2,
+ ssize_t __start, ssize_t __range,
+ struct re_registers *__regs,
+ ssize_t __stop);
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+ in BUFFER matched, starting at position START. */
+extern regoff_t re_match (struct re_pattern_buffer *__buffer,
+ const char *__string, size_t __length,
+ ssize_t __start, struct re_registers *__regs);
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
+extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
+ const char *__string1, size_t __length1,
+ const char *__string2, size_t __length2,
+ ssize_t __start, struct re_registers *__regs,
+ ssize_t __stop);
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+ ENDS. Subsequent matches using BUFFER and REGS will use this memory
+ for recording register information. STARTS and ENDS must be
+ allocated with malloc, and must each be at least `NUM_REGS * sizeof
+ (regoff_t)' bytes long.
+
+ If NUM_REGS == 0, then subsequent matches should allocate their own
+ register data.
+
+ Unless this function is called, the first search or match using
+ PATTERN_BUFFER will allocate its own register data, without
+ freeing the old data. */
+extern void re_set_registers (struct re_pattern_buffer *__buffer,
+ struct re_registers *__regs,
+ unsigned __num_regs,
+ regoff_t *__starts, regoff_t *__ends);
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility. */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+ "restrict", and "configure" may have defined "restrict".
+ Other compilers use __restrict, __restrict__, and _Restrict, and
+ 'configure' might #define 'restrict' to those words, so pick a
+ different name. */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+# define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+# define _Restrict_ __restrict
+# else
+# define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax. Don't trust
+ sys/cdefs.h's definition of __restrict_arr, though, as it
+ mishandles gcc -ansi -pedantic. */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__ \
+ || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
+ && !defined __STRICT_ANSI__)) \
+ && !defined __GNUG__)
+# define _Restrict_arr_ _Restrict_
+# else
+# define _Restrict_arr_
+# endif
+#endif
+
+/* POSIX compatibility. */
+extern reg_errcode_t regcomp (regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __pattern,
+ int __cflags);
+
+extern reg_errcode_t regexec (const regex_t *_Restrict_ __preg,
+ const char *_Restrict_ __string, size_t __nmatch,
+ regmatch_t __pmatch[_Restrict_arr_],
+ int __eflags);
+
+extern size_t regerror (int __errcode, const regex_t * __preg,
+ char *__errbuf, size_t __errbuf_size);
+
+extern void regfree (regex_t *__preg);
+
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
+
+/* For platform which support the ISO C amendment 1 functionality we
+ support user defined character classes. */
+#if WIDE_CHAR_SUPPORT
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
+# include <wchar.h>
+# include <wctype.h>
+#endif
+
+#if WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+ and the functions from ISO C amendment 1. */
+# ifdef CHARCLASS_NAME_MAX
+# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+ problem. Use a reasonable default value. */
+# define CHAR_CLASS_MAX_LENGTH 256
+# endif
+typedef wctype_t re_wctype_t;
+typedef wchar_t re_wchar_t;
+# define re_wctype wctype
+# define re_iswctype iswctype
+# define re_wctype_to_bit(cc) 0
+#else
+# define CHAR_CLASS_MAX_LENGTH 9 /* Namely, `multibyte'. */
+# define btowc(c) c
+
+/* Character classes. */
+typedef enum { RECC_ERROR = 0,
+ RECC_ALNUM, RECC_ALPHA, RECC_WORD,
+ RECC_GRAPH, RECC_PRINT,
+ RECC_LOWER, RECC_UPPER,
+ RECC_PUNCT, RECC_CNTRL,
+ RECC_DIGIT, RECC_XDIGIT,
+ RECC_BLANK, RECC_SPACE,
+ RECC_MULTIBYTE, RECC_NONASCII,
+ RECC_ASCII, RECC_UNIBYTE
+} re_wctype_t;
+
+extern char re_iswctype (int ch, re_wctype_t cc);
+extern re_wctype_t re_wctype (const unsigned char* str);
+
+typedef int re_wchar_t;
+
+extern void re_set_whitespace_regexp (const char *regexp);
+
+#endif /* not WIDE_CHAR_SUPPORT */
+
+#endif /* regex.h */
+
diff --git a/test/etags/c-src/etags.c b/test/etags/c-src/etags.c
new file mode 100644
index 00000000000..f2438213d04
--- /dev/null
+++ b/test/etags/c-src/etags.c
@@ -0,0 +1,6563 @@
+/* Tags file maker to go with GNU Emacs -*- coding: utf-8 -*-
+
+Copyright (C) 1984 The Regents of the University of California
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+3. Neither the name of the University nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Copyright (C) 1984, 1987-1989, 1993-1995, 1998-2015 Free Software
+Foundation, Inc.
+
+This file is not considered part of GNU Emacs.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+
+/* NB To comply with the above BSD license, copyright information is
+reproduced in etc/ETAGS.README. That file should be updated when the
+above notices are.
+
+To the best of our knowledge, this code was originally based on the
+ctags.c distributed with BSD4.2, which was copyrighted by the
+University of California, as described above. */
+
+
+/*
+ * Authors:
+ * 1983 Ctags originally by Ken Arnold.
+ * 1984 Fortran added by Jim Kleckner.
+ * 1984 Ed Pelegri-Llopart added C typedefs.
+ * 1985 Emacs TAGS format by Richard Stallman.
+ * 1989 Sam Kendall added C++.
+ * 1992 Joseph B. Wells improved C and C++ parsing.
+ * 1993 Francesco Potortì reorganized C and C++.
+ * 1994 Line-by-line regexp tags by Tom Tromey.
+ * 2001 Nested classes by Francesco Potortì (concept by Mykola Dzyuba).
+ * 2002 #line directives by Francesco Potortì.
+ *
+ * Francesco Potortì <pot@gnu.org> has maintained and improved it since 1993.
+ */
+
+/*
+ * If you want to add support for a new language, start by looking at the LUA
+ * language, which is the simplest. Alternatively, consider distributing etags
+ * together with a configuration file containing regexp definitions for etags.
+ */
+
+char pot_etags_version[] = "@(#) pot revision number is 17.38.1.4";
+
+#ifdef DEBUG
+# undef DEBUG
+# define DEBUG true
+#else
+# define DEBUG false
+# define NDEBUG /* disable assert */
+#endif
+
+#include <config.h>
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1 /* enables some compiler checks on GNU */
+#endif
+
+/* WIN32_NATIVE is for XEmacs.
+ MSDOS, WINDOWSNT, DOS_NT are for Emacs. */
+#ifdef WIN32_NATIVE
+# undef MSDOS
+# undef WINDOWSNT
+# define WINDOWSNT
+#endif /* WIN32_NATIVE */
+
+#ifdef MSDOS
+# undef MSDOS
+# define MSDOS true
+# include <sys/param.h>
+#else
+# define MSDOS false
+#endif /* MSDOS */
+
+#ifdef WINDOWSNT
+# include <direct.h>
+# define MAXPATHLEN _MAX_PATH
+# undef HAVE_NTGUI
+# undef DOS_NT
+# define DOS_NT
+#endif /* WINDOWSNT */
+
+#include <unistd.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysstdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <binary-io.h>
+#include <c-strcase.h>
+
+#include <assert.h>
+#ifdef NDEBUG
+# undef assert /* some systems have a buggy assert.h */
+# define assert(x) ((void) 0)
+#endif
+
+#include <getopt.h>
+#include <regex.h>
+
+/* Define CTAGS to make the program "ctags" compatible with the usual one.
+ Leave it undefined to make the program "etags", which makes emacs-style
+ tag tables and tags typedefs, #defines and struct/union/enum by default. */
+#ifdef CTAGS
+# undef CTAGS
+# define CTAGS true
+#else
+# define CTAGS false
+#endif
+
+#define streq(s,t) (assert ((s)!=NULL || (t)!=NULL), !strcmp (s, t))
+#define strcaseeq(s,t) (assert ((s)!=NULL && (t)!=NULL), !c_strcasecmp (s, t))
+#define strneq(s,t,n) (assert ((s)!=NULL || (t)!=NULL), !strncmp (s, t, n))
+#define strncaseeq(s,t,n) (assert ((s)!=NULL && (t)!=NULL), !c_strncasecmp (s, t, n))
+
+#define CHARS 256 /* 2^sizeof(char) */
+#define CHAR(x) ((unsigned int)(x) & (CHARS - 1))
+#define iswhite(c) (_wht[CHAR (c)]) /* c is white (see white) */
+#define notinname(c) (_nin[CHAR (c)]) /* c is not in a name (see nonam) */
+#define begtoken(c) (_btk[CHAR (c)]) /* c can start token (see begtk) */
+#define intoken(c) (_itk[CHAR (c)]) /* c can be in token (see midtk) */
+#define endtoken(c) (_etk[CHAR (c)]) /* c ends tokens (see endtk) */
+
+#define ISALNUM(c) isalnum (CHAR (c))
+#define ISALPHA(c) isalpha (CHAR (c))
+#define ISDIGIT(c) isdigit (CHAR (c))
+#define ISLOWER(c) islower (CHAR (c))
+
+#define lowcase(c) tolower (CHAR (c))
+
+
+/*
+ * xnew, xrnew -- allocate, reallocate storage
+ *
+ * SYNOPSIS: Type *xnew (int n, Type);
+ * void xrnew (OldPointer, int n, Type);
+ */
+#define xnew(n, Type) ((Type *) xmalloc ((n) * sizeof (Type)))
+#define xrnew(op, n, Type) ((op) = (Type *) xrealloc (op, (n) * sizeof (Type)))
+
+typedef void Lang_function (FILE *);
+
+typedef struct
+{
+ const char *suffix; /* file name suffix for this compressor */
+ const char *command; /* takes one arg and decompresses to stdout */
+} compressor;
+
+typedef struct
+{
+ const char *name; /* language name */
+ const char *help; /* detailed help for the language */
+ Lang_function *function; /* parse function */
+ const char **suffixes; /* name suffixes of this language's files */
+ const char **filenames; /* names of this language's files */
+ const char **interpreters; /* interpreters for this language */
+ bool metasource; /* source used to generate other sources */
+} language;
+
+typedef struct fdesc
+{
+ struct fdesc *next; /* for the linked list */
+ char *infname; /* uncompressed input file name */
+ char *infabsname; /* absolute uncompressed input file name */
+ char *infabsdir; /* absolute dir of input file */
+ char *taggedfname; /* file name to write in tagfile */
+ language *lang; /* language of file */
+ char *prop; /* file properties to write in tagfile */
+ bool usecharno; /* etags tags shall contain char number */
+ bool written; /* entry written in the tags file */
+} fdesc;
+
+typedef struct node_st
+{ /* sorting structure */
+ struct node_st *left, *right; /* left and right sons */
+ fdesc *fdp; /* description of file to whom tag belongs */
+ char *name; /* tag name */
+ char *regex; /* search regexp */
+ bool valid; /* write this tag on the tag file */
+ bool is_func; /* function tag: use regexp in CTAGS mode */
+ bool been_warned; /* warning already given for duplicated tag */
+ int lno; /* line number tag is on */
+ long cno; /* character number line starts on */
+} node;
+
+/*
+ * A `linebuffer' is a structure which holds a line of text.
+ * `readline_internal' reads a line from a stream into a linebuffer
+ * and works regardless of the length of the line.
+ * SIZE is the size of BUFFER, LEN is the length of the string in
+ * BUFFER after readline reads it.
+ */
+typedef struct
+{
+ long size;
+ int len;
+ char *buffer;
+} linebuffer;
+
+/* Used to support mixing of --lang and file names. */
+typedef struct
+{
+ enum {
+ at_language, /* a language specification */
+ at_regexp, /* a regular expression */
+ at_filename, /* a file name */
+ at_stdin, /* read from stdin here */
+ at_end /* stop parsing the list */
+ } arg_type; /* argument type */
+ language *lang; /* language associated with the argument */
+ char *what; /* the argument itself */
+} argument;
+
+/* Structure defining a regular expression. */
+typedef struct regexp
+{
+ struct regexp *p_next; /* pointer to next in list */
+ language *lang; /* if set, use only for this language */
+ char *pattern; /* the regexp pattern */
+ char *name; /* tag name */
+ struct re_pattern_buffer *pat; /* the compiled pattern */
+ struct re_registers regs; /* re registers */
+ bool error_signaled; /* already signaled for this regexp */
+ bool force_explicit_name; /* do not allow implicit tag name */
+ bool ignore_case; /* ignore case when matching */
+ bool multi_line; /* do a multi-line match on the whole file */
+} regexp;
+
+
+/* Many compilers barf on this:
+ Lang_function Ada_funcs;
+ so let's write it this way */
+static void Ada_funcs (FILE *);
+static void Asm_labels (FILE *);
+static void C_entries (int c_ext, FILE *);
+static void default_C_entries (FILE *);
+static void plain_C_entries (FILE *);
+static void Cjava_entries (FILE *);
+static void Cobol_paragraphs (FILE *);
+static void Cplusplus_entries (FILE *);
+static void Cstar_entries (FILE *);
+static void Erlang_functions (FILE *);
+static void Forth_words (FILE *);
+static void Fortran_functions (FILE *);
+static void HTML_labels (FILE *);
+static void Lisp_functions (FILE *);
+static void Lua_functions (FILE *);
+static void Makefile_targets (FILE *);
+static void Pascal_functions (FILE *);
+static void Perl_functions (FILE *);
+static void PHP_functions (FILE *);
+static void PS_functions (FILE *);
+static void Prolog_functions (FILE *);
+static void Python_functions (FILE *);
+static void Scheme_functions (FILE *);
+static void TeX_commands (FILE *);
+static void Texinfo_nodes (FILE *);
+static void Yacc_entries (FILE *);
+static void just_read_file (FILE *);
+
+static language *get_language_from_langname (const char *);
+static void readline (linebuffer *, FILE *);
+static long readline_internal (linebuffer *, FILE *);
+static bool nocase_tail (const char *);
+static void get_tag (char *, char **);
+
+static void analyze_regex (char *);
+static void free_regexps (void);
+static void regex_tag_multiline (void);
+static void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
+static _Noreturn void suggest_asking_for_help (void);
+_Noreturn void fatal (const char *, const char *);
+static _Noreturn void pfatal (const char *);
+static void add_node (node *, node **);
+
+static void init (void);
+static void process_file_name (char *, language *);
+static void process_file (FILE *, char *, language *);
+static void find_entries (FILE *);
+static void free_tree (node *);
+static void free_fdesc (fdesc *);
+static void pfnote (char *, bool, char *, int, int, long);
+static void invalidate_nodes (fdesc *, node **);
+static void put_entries (node *);
+
+static char *concat (const char *, const char *, const char *);
+static char *skip_spaces (char *);
+static char *skip_non_spaces (char *);
+static char *skip_name (char *);
+static char *savenstr (const char *, int);
+static char *savestr (const char *);
+static char *etags_getcwd (void);
+static char *relative_filename (char *, char *);
+static char *absolute_filename (char *, char *);
+static char *absolute_dirname (char *, char *);
+static bool filename_is_absolute (char *f);
+static void canonicalize_filename (char *);
+static void linebuffer_init (linebuffer *);
+static void linebuffer_setlen (linebuffer *, int);
+static void *xmalloc (size_t);
+static void *xrealloc (void *, size_t);
+
+
+static char searchar = '/'; /* use /.../ searches */
+
+static char *tagfile; /* output file */
+static char *progname; /* name this program was invoked with */
+static char *cwd; /* current working directory */
+static char *tagfiledir; /* directory of tagfile */
+static FILE *tagf; /* ioptr for tags file */
+static ptrdiff_t whatlen_max; /* maximum length of any 'what' member */
+
+static fdesc *fdhead; /* head of file description list */
+static fdesc *curfdp; /* current file description */
+static int lineno; /* line number of current line */
+static long charno; /* current character number */
+static long linecharno; /* charno of start of current line */
+static char *dbp; /* pointer to start of current tag */
+
+static const int invalidcharno = -1;
+
+static node *nodehead; /* the head of the binary tree of tags */
+static node *last_node; /* the last node created */
+
+static linebuffer lb; /* the current line */
+static linebuffer filebuf; /* a buffer containing the whole file */
+static linebuffer token_name; /* a buffer containing a tag name */
+
+/* boolean "functions" (see init) */
+static bool _wht[CHARS], _nin[CHARS], _itk[CHARS], _btk[CHARS], _etk[CHARS];
+static const char
+ /* white chars */
+ *white = " \f\t\n\r\v",
+ /* not in a name */
+ *nonam = " \f\t\n\r()=,;", /* look at make_tag before modifying! */
+ /* token ending chars */
+ *endtk = " \t\n\r\"'#()[]{}=-+%*/&|^~!<>;,.:?",
+ /* token starting chars */
+ *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~@",
+ /* valid in-token chars */
+ *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
+
+static bool append_to_tagfile; /* -a: append to tags */
+/* The next five default to true in C and derived languages. */
+static bool typedefs; /* -t: create tags for C and Ada typedefs */
+static bool typedefs_or_cplusplus; /* -T: create tags for C typedefs, level */
+ /* 0 struct/enum/union decls, and C++ */
+ /* member functions. */
+static bool constantypedefs; /* -d: create tags for C #define, enum */
+ /* constants and variables. */
+ /* -D: opposite of -d. Default under ctags. */
+static int globals; /* create tags for global variables */
+static int members; /* create tags for C member variables */
+static int declarations; /* --declarations: tag them and extern in C&Co*/
+static int no_line_directive; /* ignore #line directives (undocumented) */
+static int no_duplicates; /* no duplicate tags for ctags (undocumented) */
+static bool update; /* -u: update tags */
+static bool vgrind_style; /* -v: create vgrind style index output */
+static bool no_warnings; /* -w: suppress warnings (undocumented) */
+static bool cxref_style; /* -x: create cxref style output */
+static bool cplusplus; /* .[hc] means C++, not C (undocumented) */
+static bool ignoreindent; /* -I: ignore indentation in C */
+static int packages_only; /* --packages-only: in Ada, only tag packages*/
+
+/* STDIN is defined in LynxOS system headers */
+#ifdef STDIN
+# undef STDIN
+#endif
+
+#define STDIN 0x1001 /* returned by getopt_long on --parse-stdin */
+static bool parsing_stdin; /* --parse-stdin used */
+
+static regexp *p_head; /* list of all regexps */
+static bool need_filebuf; /* some regexes are multi-line */
+
+static struct option longopts[] =
+{
+ { "append", no_argument, NULL, 'a' },
+ { "packages-only", no_argument, &packages_only, 1 },
+ { "c++", no_argument, NULL, 'C' },
+ { "declarations", no_argument, &declarations, 1 },
+ { "no-line-directive", no_argument, &no_line_directive, 1 },
+ { "no-duplicates", no_argument, &no_duplicates, 1 },
+ { "help", no_argument, NULL, 'h' },
+ { "help", no_argument, NULL, 'H' },
+ { "ignore-indentation", no_argument, NULL, 'I' },
+ { "language", required_argument, NULL, 'l' },
+ { "members", no_argument, &members, 1 },
+ { "no-members", no_argument, &members, 0 },
+ { "output", required_argument, NULL, 'o' },
+ { "regex", required_argument, NULL, 'r' },
+ { "no-regex", no_argument, NULL, 'R' },
+ { "ignore-case-regex", required_argument, NULL, 'c' },
+ { "parse-stdin", required_argument, NULL, STDIN },
+ { "version", no_argument, NULL, 'V' },
+
+#if CTAGS /* Ctags options */
+ { "backward-search", no_argument, NULL, 'B' },
+ { "cxref", no_argument, NULL, 'x' },
+ { "defines", no_argument, NULL, 'd' },
+ { "globals", no_argument, &globals, 1 },
+ { "typedefs", no_argument, NULL, 't' },
+ { "typedefs-and-c++", no_argument, NULL, 'T' },
+ { "update", no_argument, NULL, 'u' },
+ { "vgrind", no_argument, NULL, 'v' },
+ { "no-warn", no_argument, NULL, 'w' },
+
+#else /* Etags options */
+ { "no-defines", no_argument, NULL, 'D' },
+ { "no-globals", no_argument, &globals, 0 },
+ { "include", required_argument, NULL, 'i' },
+#endif
+ { NULL }
+};
+
+static compressor compressors[] =
+{
+ { "z", "gzip -d -c"},
+ { "Z", "gzip -d -c"},
+ { "gz", "gzip -d -c"},
+ { "GZ", "gzip -d -c"},
+ { "bz2", "bzip2 -d -c" },
+ { "xz", "xz -d -c" },
+ { NULL }
+};
+
+/*
+ * Language stuff.
+ */
+
+/* Ada code */
+static const char *Ada_suffixes [] =
+ { "ads", "adb", "ada", NULL };
+static const char Ada_help [] =
+"In Ada code, functions, procedures, packages, tasks and types are\n\
+tags. Use the `--packages-only' option to create tags for\n\
+packages only.\n\
+Ada tag names have suffixes indicating the type of entity:\n\
+ Entity type: Qualifier:\n\
+ ------------ ----------\n\
+ function /f\n\
+ procedure /p\n\
+ package spec /s\n\
+ package body /b\n\
+ type /t\n\
+ task /k\n\
+Thus, `M-x find-tag <RET> bidule/b <RET>' will go directly to the\n\
+body of the package `bidule', while `M-x find-tag <RET> bidule <RET>'\n\
+will just search for any tag `bidule'.";
+
+/* Assembly code */
+static const char *Asm_suffixes [] =
+ { "a", /* Unix assembler */
+ "asm", /* Microcontroller assembly */
+ "def", /* BSO/Tasking definition includes */
+ "inc", /* Microcontroller include files */
+ "ins", /* Microcontroller include files */
+ "s", "sa", /* Unix assembler */
+ "S", /* cpp-processed Unix assembler */
+ "src", /* BSO/Tasking C compiler output */
+ NULL
+ };
+static const char Asm_help [] =
+"In assembler code, labels appearing at the beginning of a line,\n\
+followed by a colon, are tags.";
+
+
+/* Note that .c and .h can be considered C++, if the --c++ flag was
+ given, or if the `class' or `template' keywords are met inside the file.
+ That is why default_C_entries is called for these. */
+static const char *default_C_suffixes [] =
+ { "c", "h", NULL };
+#if CTAGS /* C help for Ctags */
+static const char default_C_help [] =
+"In C code, any C function is a tag. Use -t to tag typedefs.\n\
+Use -T to tag definitions of `struct', `union' and `enum'.\n\
+Use -d to tag `#define' macro definitions and `enum' constants.\n\
+Use --globals to tag global variables.\n\
+You can tag function declarations and external variables by\n\
+using `--declarations', and struct members by using `--members'.";
+#else /* C help for Etags */
+static const char default_C_help [] =
+"In C code, any C function or typedef is a tag, and so are\n\
+definitions of `struct', `union' and `enum'. `#define' macro\n\
+definitions and `enum' constants are tags unless you specify\n\
+`--no-defines'. Global variables are tags unless you specify\n\
+`--no-globals' and so are struct members unless you specify\n\
+`--no-members'. Use of `--no-globals', `--no-defines' and\n\
+`--no-members' can make the tags table file much smaller.\n\
+You can tag function declarations and external variables by\n\
+using `--declarations'.";
+#endif /* C help for Ctags and Etags */
+
+static const char *Cplusplus_suffixes [] =
+ { "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
+ "M", /* Objective C++ */
+ "pdb", /* PostScript with C syntax */
+ NULL };
+static const char Cplusplus_help [] =
+"In C++ code, all the tag constructs of C code are tagged. (Use\n\
+--help --lang=c --lang=c++ for full help.)\n\
+In addition to C tags, member functions are also recognized. Member\n\
+variables are recognized unless you use the `--no-members' option.\n\
+Tags for variables and functions in classes are named `CLASS::VARIABLE'\n\
+and `CLASS::FUNCTION'. `operator' definitions have tag names like\n\
+`operator+'.";
+
+static const char *Cjava_suffixes [] =
+ { "java", NULL };
+static char Cjava_help [] =
+"In Java code, all the tags constructs of C and C++ code are\n\
+tagged. (Use --help --lang=c --lang=c++ --lang=java for full help.)";
+
+
+static const char *Cobol_suffixes [] =
+ { "COB", "cob", NULL };
+static char Cobol_help [] =
+"In Cobol code, tags are paragraph names; that is, any word\n\
+starting in column 8 and followed by a period.";
+
+static const char *Cstar_suffixes [] =
+ { "cs", "hs", NULL };
+
+static const char *Erlang_suffixes [] =
+ { "erl", "hrl", NULL };
+static const char Erlang_help [] =
+"In Erlang code, the tags are the functions, records and macros\n\
+defined in the file.";
+
+const char *Forth_suffixes [] =
+ { "fth", "tok", NULL };
+static const char Forth_help [] =
+"In Forth code, tags are words defined by `:',\n\
+constant, code, create, defer, value, variable, buffer:, field.";
+
+static const char *Fortran_suffixes [] =
+ { "F", "f", "f90", "for", NULL };
+static const char Fortran_help [] =
+"In Fortran code, functions, subroutines and block data are tags.";
+
+static const char *HTML_suffixes [] =
+ { "htm", "html", "shtml", NULL };
+static const char HTML_help [] =
+"In HTML input files, the tags are the `title' and the `h1', `h2',\n\
+`h3' headers. Also, tags are `name=' in anchors and all\n\
+occurrences of `id='.";
+
+static const char *Lisp_suffixes [] =
+ { "cl", "clisp", "el", "l", "lisp", "LSP", "lsp", "ml", NULL };
+static const char Lisp_help [] =
+"In Lisp code, any function defined with `defun', any variable\n\
+defined with `defvar' or `defconst', and in general the first\n\
+argument of any expression that starts with `(def' in column zero\n\
+is a tag.\n\
+The `--declarations' option tags \"(defvar foo)\" constructs too.";
+
+static const char *Lua_suffixes [] =
+ { "lua", "LUA", NULL };
+static const char Lua_help [] =
+"In Lua scripts, all functions are tags.";
+
+static const char *Makefile_filenames [] =
+ { "Makefile", "makefile", "GNUMakefile", "Makefile.in", "Makefile.am", NULL};
+static const char Makefile_help [] =
+"In makefiles, targets are tags; additionally, variables are tags\n\
+unless you specify `--no-globals'.";
+
+static const char *Objc_suffixes [] =
+ { "lm", /* Objective lex file */
+ "m", /* Objective C file */
+ NULL };
+static const char Objc_help [] =
+"In Objective C code, tags include Objective C definitions for classes,\n\
+class categories, methods and protocols. Tags for variables and\n\
+functions in classes are named `CLASS::VARIABLE' and `CLASS::FUNCTION'.\n\
+(Use --help --lang=c --lang=objc --lang=java for full help.)";
+
+static const char *Pascal_suffixes [] =
+ { "p", "pas", NULL };
+static const char Pascal_help [] =
+"In Pascal code, the tags are the functions and procedures defined\n\
+in the file.";
+/* " // this is for working around an Emacs highlighting bug... */
+
+static const char *Perl_suffixes [] =
+ { "pl", "pm", NULL };
+static const char *Perl_interpreters [] =
+ { "perl", "@PERL@", NULL };
+static const char Perl_help [] =
+"In Perl code, the tags are the packages, subroutines and variables\n\
+defined by the `package', `sub', `my' and `local' keywords. Use\n\
+`--globals' if you want to tag global variables. Tags for\n\
+subroutines are named `PACKAGE::SUB'. The name for subroutines\n\
+defined in the default package is `main::SUB'.";
+
+static const char *PHP_suffixes [] =
+ { "php", "php3", "php4", NULL };
+static const char PHP_help [] =
+"In PHP code, tags are functions, classes and defines. Unless you use\n\
+the `--no-members' option, vars are tags too.";
+
+static const char *plain_C_suffixes [] =
+ { "pc", /* Pro*C file */
+ NULL };
+
+static const char *PS_suffixes [] =
+ { "ps", "psw", NULL }; /* .psw is for PSWrap */
+static const char PS_help [] =
+"In PostScript code, the tags are the functions.";
+
+static const char *Prolog_suffixes [] =
+ { "prolog", NULL };
+static const char Prolog_help [] =
+"In Prolog code, tags are predicates and rules at the beginning of\n\
+line.";
+
+static const char *Python_suffixes [] =
+ { "py", NULL };
+static const char Python_help [] =
+"In Python code, `def' or `class' at the beginning of a line\n\
+generate a tag.";
+
+/* Can't do the `SCM' or `scm' prefix with a version number. */
+static const char *Scheme_suffixes [] =
+ { "oak", "sch", "scheme", "SCM", "scm", "SM", "sm", "ss", "t", NULL };
+static const char Scheme_help [] =
+"In Scheme code, tags include anything defined with `def' or with a\n\
+construct whose name starts with `def'. They also include\n\
+variables set with `set!' at top level in the file.";
+
+static const char *TeX_suffixes [] =
+ { "bib", "clo", "cls", "ltx", "sty", "TeX", "tex", NULL };
+static const char TeX_help [] =
+"In LaTeX text, the argument of any of the commands `\\chapter',\n\
+`\\section', `\\subsection', `\\subsubsection', `\\eqno', `\\label',\n\
+`\\ref', `\\cite', `\\bibitem', `\\part', `\\appendix', `\\entry',\n\
+`\\index', `\\def', `\\newcommand', `\\renewcommand',\n\
+`\\newenvironment' or `\\renewenvironment' is a tag.\n\
+\n\
+Other commands can be specified by setting the environment variable\n\
+`TEXTAGS' to a colon-separated list like, for example,\n\
+ TEXTAGS=\"mycommand:myothercommand\".";
+
+
+static const char *Texinfo_suffixes [] =
+ { "texi", "texinfo", "txi", NULL };
+static const char Texinfo_help [] =
+"for texinfo files, lines starting with @node are tagged.";
+
+static const char *Yacc_suffixes [] =
+ { "y", "y++", "ym", "yxx", "yy", NULL }; /* .ym is Objective yacc file */
+static const char Yacc_help [] =
+"In Bison or Yacc input files, each rule defines as a tag the\n\
+nonterminal it constructs. The portions of the file that contain\n\
+C code are parsed as C code (use --help --lang=c --lang=yacc\n\
+for full help).";
+
+static const char auto_help [] =
+"`auto' is not a real language, it indicates to use\n\
+a default language for files base on file name suffix and file contents.";
+
+static const char none_help [] =
+"`none' is not a real language, it indicates to only do\n\
+regexp processing on files.";
+
+static const char no_lang_help [] =
+"No detailed help available for this language.";
+
+
+/*
+ * Table of languages.
+ *
+ * It is ok for a given function to be listed under more than one
+ * name. I just didn't.
+ */
+
+static language lang_names [] =
+{
+ { "ada", Ada_help, Ada_funcs, Ada_suffixes },
+ { "asm", Asm_help, Asm_labels, Asm_suffixes },
+ { "c", default_C_help, default_C_entries, default_C_suffixes },
+ { "c++", Cplusplus_help, Cplusplus_entries, Cplusplus_suffixes },
+ { "c*", no_lang_help, Cstar_entries, Cstar_suffixes },
+ { "cobol", Cobol_help, Cobol_paragraphs, Cobol_suffixes },
+ { "erlang", Erlang_help, Erlang_functions, Erlang_suffixes },
+ { "forth", Forth_help, Forth_words, Forth_suffixes },
+ { "fortran", Fortran_help, Fortran_functions, Fortran_suffixes },
+ { "html", HTML_help, HTML_labels, HTML_suffixes },
+ { "java", Cjava_help, Cjava_entries, Cjava_suffixes },
+ { "lisp", Lisp_help, Lisp_functions, Lisp_suffixes },
+ { "lua", Lua_help, Lua_functions, Lua_suffixes },
+ { "makefile", Makefile_help,Makefile_targets,NULL,Makefile_filenames},
+ { "objc", Objc_help, plain_C_entries, Objc_suffixes },
+ { "pascal", Pascal_help, Pascal_functions, Pascal_suffixes },
+ { "perl",Perl_help,Perl_functions,Perl_suffixes,NULL,Perl_interpreters},
+ { "php", PHP_help, PHP_functions, PHP_suffixes },
+ { "postscript",PS_help, PS_functions, PS_suffixes },
+ { "proc", no_lang_help, plain_C_entries, plain_C_suffixes },
+ { "prolog", Prolog_help, Prolog_functions, Prolog_suffixes },
+ { "python", Python_help, Python_functions, Python_suffixes },
+ { "scheme", Scheme_help, Scheme_functions, Scheme_suffixes },
+ { "tex", TeX_help, TeX_commands, TeX_suffixes },
+ { "texinfo", Texinfo_help, Texinfo_nodes, Texinfo_suffixes },
+ { "yacc", Yacc_help,Yacc_entries,Yacc_suffixes,NULL,NULL,true},
+ { "auto", auto_help }, /* default guessing scheme */
+ { "none", none_help, just_read_file }, /* regexp matching only */
+ { NULL } /* end of list */
+};
+
+
+static void
+print_language_names (void)
+{
+ language *lang;
+ const char **name, **ext;
+
+ puts ("\nThese are the currently supported languages, along with the\n\
+default file names and dot suffixes:");
+ for (lang = lang_names; lang->name != NULL; lang++)
+ {
+ printf (" %-*s", 10, lang->name);
+ if (lang->filenames != NULL)
+ for (name = lang->filenames; *name != NULL; name++)
+ printf (" %s", *name);
+ if (lang->suffixes != NULL)
+ for (ext = lang->suffixes; *ext != NULL; ext++)
+ printf (" .%s", *ext);
+ puts ("");
+ }
+ puts ("where `auto' means use default language for files based on file\n\
+name suffix, and `none' means only do regexp processing on files.\n\
+If no language is specified and no matching suffix is found,\n\
+the first line of the file is read for a sharp-bang (#!) sequence\n\
+followed by the name of an interpreter. If no such sequence is found,\n\
+Fortran is tried first; if no tags are found, C is tried next.\n\
+When parsing any C file, a \"class\" or \"template\" keyword\n\
+switches to C++.");
+ puts ("Compressed files are supported using gzip, bzip2, and xz.\n\
+\n\
+For detailed help on a given language use, for example,\n\
+etags --help --lang=ada.");
+}
+
+#ifndef EMACS_NAME
+# define EMACS_NAME "standalone"
+#endif
+#ifndef VERSION
+# define VERSION "17.38.1.4"
+#endif
+static _Noreturn void
+print_version (void)
+{
+ char emacs_copyright[] = COPYRIGHT;
+
+ printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION);
+ puts (emacs_copyright);
+ puts ("This program is distributed under the terms in ETAGS.README");
+
+ exit (EXIT_SUCCESS);
+}
+
+#ifndef PRINT_UNDOCUMENTED_OPTIONS_HELP
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP false
+#endif
+
+static _Noreturn void
+print_help (argument *argbuffer)
+{
+ bool help_for_lang = false;
+
+ for (; argbuffer->arg_type != at_end; argbuffer++)
+ if (argbuffer->arg_type == at_language)
+ {
+ if (help_for_lang)
+ puts ("");
+ puts (argbuffer->lang->help);
+ help_for_lang = true;
+ }
+
+ if (help_for_lang)
+ exit (EXIT_SUCCESS);
+
+ printf ("Usage: %s [options] [[regex-option ...] file-name] ...\n\
+\n\
+These are the options accepted by %s.\n", progname, progname);
+ puts ("You may use unambiguous abbreviations for the long option names.");
+ puts (" A - as file name means read names from stdin (one per line).\n\
+Absolute names are stored in the output file as they are.\n\
+Relative ones are stored relative to the output file's directory.\n");
+
+ puts ("-a, --append\n\
+ Append tag entries to existing tags file.");
+
+ puts ("--packages-only\n\
+ For Ada files, only generate tags for packages.");
+
+ if (CTAGS)
+ puts ("-B, --backward-search\n\
+ Write the search commands for the tag entries using '?', the\n\
+ backward-search command instead of '/', the forward-search command.");
+
+ /* This option is mostly obsolete, because etags can now automatically
+ detect C++. Retained for backward compatibility and for debugging and
+ experimentation. In principle, we could want to tag as C++ even
+ before any "class" or "template" keyword.
+ puts ("-C, --c++\n\
+ Treat files whose name suffix defaults to C language as C++ files.");
+ */
+
+ puts ("--declarations\n\
+ In C and derived languages, create tags for function declarations,");
+ if (CTAGS)
+ puts ("\tand create tags for extern variables if --globals is used.");
+ else
+ puts
+ ("\tand create tags for extern variables unless --no-globals is used.");
+
+ if (CTAGS)
+ puts ("-d, --defines\n\
+ Create tag entries for C #define constants and enum constants, too.");
+ else
+ puts ("-D, --no-defines\n\
+ Don't create tag entries for C #define constants and enum constants.\n\
+ This makes the tags file smaller.");
+
+ if (!CTAGS)
+ puts ("-i FILE, --include=FILE\n\
+ Include a note in tag file indicating that, when searching for\n\
+ a tag, one should also consult the tags file FILE after\n\
+ checking the current file.");
+
+ puts ("-l LANG, --language=LANG\n\
+ Force the following files to be considered as written in the\n\
+ named language up to the next --language=LANG option.");
+
+ if (CTAGS)
+ puts ("--globals\n\
+ Create tag entries for global variables in some languages.");
+ else
+ puts ("--no-globals\n\
+ Do not create tag entries for global variables in some\n\
+ languages. This makes the tags file smaller.");
+
+ if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
+ puts ("--no-line-directive\n\
+ Ignore #line preprocessor directives in C and derived languages.");
+
+ if (CTAGS)
+ puts ("--members\n\
+ Create tag entries for members of structures in some languages.");
+ else
+ puts ("--no-members\n\
+ Do not create tag entries for members of structures\n\
+ in some languages.");
+
+ puts ("-r REGEXP, --regex=REGEXP or --regex=@regexfile\n\
+ Make a tag for each line matching a regular expression pattern\n\
+ in the following files. {LANGUAGE}REGEXP uses REGEXP for LANGUAGE\n\
+ files only. REGEXFILE is a file containing one REGEXP per line.\n\
+ REGEXP takes the form /TAGREGEXP/TAGNAME/MODS, where TAGNAME/ is\n\
+ optional. The TAGREGEXP pattern is anchored (as if preceded by ^).");
+ puts (" If TAGNAME/ is present, the tags created are named.\n\
+ For example Tcl named tags can be created with:\n\
+ --regex=\"/proc[ \\t]+\\([^ \\t]+\\)/\\1/.\".\n\
+ MODS are optional one-letter modifiers: `i' means to ignore case,\n\
+ `m' means to allow multi-line matches, `s' implies `m' and\n\
+ causes dot to match any character, including newline.");
+
+ puts ("-R, --no-regex\n\
+ Don't create tags from regexps for the following files.");
+
+ puts ("-I, --ignore-indentation\n\
+ In C and C++ do not assume that a closing brace in the first\n\
+ column is the final brace of a function or structure definition.");
+
+ puts ("-o FILE, --output=FILE\n\
+ Write the tags to FILE.");
+
+ puts ("--parse-stdin=NAME\n\
+ Read from standard input and record tags as belonging to file NAME.");
+
+ if (CTAGS)
+ {
+ puts ("-t, --typedefs\n\
+ Generate tag entries for C and Ada typedefs.");
+ puts ("-T, --typedefs-and-c++\n\
+ Generate tag entries for C typedefs, C struct/enum/union tags,\n\
+ and C++ member functions.");
+ }
+
+ if (CTAGS)
+ puts ("-u, --update\n\
+ Update the tag entries for the given files, leaving tag\n\
+ entries for other files in place. Currently, this is\n\
+ implemented by deleting the existing entries for the given\n\
+ files and then rewriting the new entries at the end of the\n\
+ tags file. It is often faster to simply rebuild the entire\n\
+ tag file than to use this.");
+
+ if (CTAGS)
+ {
+ puts ("-v, --vgrind\n\
+ Print on the standard output an index of items intended for\n\
+ human consumption, similar to the output of vgrind. The index\n\
+ is sorted, and gives the page number of each item.");
+
+ if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
+ puts ("-w, --no-duplicates\n\
+ Do not create duplicate tag entries, for compatibility with\n\
+ traditional ctags.");
+
+ if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
+ puts ("-w, --no-warn\n\
+ Suppress warning messages about duplicate tag entries.");
+
+ puts ("-x, --cxref\n\
+ Like --vgrind, but in the style of cxref, rather than vgrind.\n\
+ The output uses line numbers instead of page numbers, but\n\
+ beyond that the differences are cosmetic; try both to see\n\
+ which you like.");
+ }
+
+ puts ("-V, --version\n\
+ Print the version of the program.\n\
+-h, --help\n\
+ Print this help message.\n\
+ Followed by one or more `--language' options prints detailed\n\
+ help about tag generation for the specified languages.");
+
+ print_language_names ();
+
+ puts ("");
+ puts ("Report bugs to bug-gnu-emacs@gnu.org");
+
+ exit (EXIT_SUCCESS);
+}
+
+
+int
+main (int argc, char **argv)
+{
+ int i;
+ unsigned int nincluded_files;
+ char **included_files;
+ argument *argbuffer;
+ int current_arg, file_count;
+ linebuffer filename_lb;
+ bool help_asked = false;
+ ptrdiff_t len;
+ char *optstring;
+ int opt;
+
+ progname = argv[0];
+ nincluded_files = 0;
+ included_files = xnew (argc, char *);
+ current_arg = 0;
+ file_count = 0;
+
+ /* Allocate enough no matter what happens. Overkill, but each one
+ is small. */
+ argbuffer = xnew (argc, argument);
+
+ /*
+ * Always find typedefs and structure tags.
+ * Also default to find macro constants, enum constants, struct
+ * members and global variables. Do it for both etags and ctags.
+ */
+ typedefs = typedefs_or_cplusplus = constantypedefs = true;
+ globals = members = true;
+
+ /* When the optstring begins with a '-' getopt_long does not rearrange the
+ non-options arguments to be at the end, but leaves them alone. */
+ optstring = concat ("-ac:Cf:Il:o:r:RSVhH",
+ (CTAGS) ? "BxdtTuvw" : "Di:",
+ "");
+
+ while ((opt = getopt_long (argc, argv, optstring, longopts, NULL)) != EOF)
+ switch (opt)
+ {
+ case 0:
+ /* If getopt returns 0, then it has already processed a
+ long-named option. We should do nothing. */
+ break;
+
+ case 1:
+ /* This means that a file name has been seen. Record it. */
+ argbuffer[current_arg].arg_type = at_filename;
+ argbuffer[current_arg].what = optarg;
+ len = strlen (optarg);
+ if (whatlen_max < len)
+ whatlen_max = len;
+ ++current_arg;
+ ++file_count;
+ break;
+
+ case STDIN:
+ /* Parse standard input. Idea by Vivek <vivek@etla.org>. */
+ argbuffer[current_arg].arg_type = at_stdin;
+ argbuffer[current_arg].what = optarg;
+ len = strlen (optarg);
+ if (whatlen_max < len)
+ whatlen_max = len;
+ ++current_arg;
+ ++file_count;
+ if (parsing_stdin)
+ fatal ("cannot parse standard input more than once", (char *)NULL);
+ parsing_stdin = true;
+ break;
+
+ /* Common options. */
+ case 'a': append_to_tagfile = true; break;
+ case 'C': cplusplus = true; break;
+ case 'f': /* for compatibility with old makefiles */
+ case 'o':
+ if (tagfile)
+ {
+ error ("-o option may only be given once.");
+ suggest_asking_for_help ();
+ /* NOTREACHED */
+ }
+ tagfile = optarg;
+ break;
+ case 'I':
+ case 'S': /* for backward compatibility */
+ ignoreindent = true;
+ break;
+ case 'l':
+ {
+ language *lang = get_language_from_langname (optarg);
+ if (lang != NULL)
+ {
+ argbuffer[current_arg].lang = lang;
+ argbuffer[current_arg].arg_type = at_language;
+ ++current_arg;
+ }
+ }
+ break;
+ case 'c':
+ /* Backward compatibility: support obsolete --ignore-case-regexp. */
+ optarg = concat (optarg, "i", ""); /* memory leak here */
+ /* FALLTHRU */
+ case 'r':
+ argbuffer[current_arg].arg_type = at_regexp;
+ argbuffer[current_arg].what = optarg;
+ len = strlen (optarg);
+ if (whatlen_max < len)
+ whatlen_max = len;
+ ++current_arg;
+ break;
+ case 'R':
+ argbuffer[current_arg].arg_type = at_regexp;
+ argbuffer[current_arg].what = NULL;
+ ++current_arg;
+ break;
+ case 'V':
+ print_version ();
+ break;
+ case 'h':
+ case 'H':
+ help_asked = true;
+ break;
+
+ /* Etags options */
+ case 'D': constantypedefs = false; break;
+ case 'i': included_files[nincluded_files++] = optarg; break;
+
+ /* Ctags options. */
+ case 'B': searchar = '?'; break;
+ case 'd': constantypedefs = true; break;
+ case 't': typedefs = true; break;
+ case 'T': typedefs = typedefs_or_cplusplus = true; break;
+ case 'u': update = true; break;
+ case 'v': vgrind_style = true; /*FALLTHRU*/
+ case 'x': cxref_style = true; break;
+ case 'w': no_warnings = true; break;
+ default:
+ suggest_asking_for_help ();
+ /* NOTREACHED */
+ }
+
+ /* No more options. Store the rest of arguments. */
+ for (; optind < argc; optind++)
+ {
+ argbuffer[current_arg].arg_type = at_filename;
+ argbuffer[current_arg].what = argv[optind];
+ len = strlen (argv[optind]);
+ if (whatlen_max < len)
+ whatlen_max = len;
+ ++current_arg;
+ ++file_count;
+ }
+
+ argbuffer[current_arg].arg_type = at_end;
+
+ if (help_asked)
+ print_help (argbuffer);
+ /* NOTREACHED */
+
+ if (nincluded_files == 0 && file_count == 0)
+ {
+ error ("no input files specified.");
+ suggest_asking_for_help ();
+ /* NOTREACHED */
+ }
+
+ if (tagfile == NULL)
+ tagfile = savestr (CTAGS ? "tags" : "TAGS");
+ cwd = etags_getcwd (); /* the current working directory */
+ if (cwd[strlen (cwd) - 1] != '/')
+ {
+ char *oldcwd = cwd;
+ cwd = concat (oldcwd, "/", "");
+ free (oldcwd);
+ }
+
+ /* Compute base directory for relative file names. */
+ if (streq (tagfile, "-")
+ || strneq (tagfile, "/dev/", 5))
+ tagfiledir = cwd; /* relative file names are relative to cwd */
+ else
+ {
+ canonicalize_filename (tagfile);
+ tagfiledir = absolute_dirname (tagfile, cwd);
+ }
+
+ init (); /* set up boolean "functions" */
+
+ linebuffer_init (&lb);
+ linebuffer_init (&filename_lb);
+ linebuffer_init (&filebuf);
+ linebuffer_init (&token_name);
+
+ if (!CTAGS)
+ {
+ if (streq (tagfile, "-"))
+ {
+ tagf = stdout;
+ SET_BINARY (fileno (stdout));
+ }
+ else
+ tagf = fopen (tagfile, append_to_tagfile ? "ab" : "wb");
+ if (tagf == NULL)
+ pfatal (tagfile);
+ }
+
+ /*
+ * Loop through files finding functions.
+ */
+ for (i = 0; i < current_arg; i++)
+ {
+ static language *lang; /* non-NULL if language is forced */
+ char *this_file;
+
+ switch (argbuffer[i].arg_type)
+ {
+ case at_language:
+ lang = argbuffer[i].lang;
+ break;
+ case at_regexp:
+ analyze_regex (argbuffer[i].what);
+ break;
+ case at_filename:
+ this_file = argbuffer[i].what;
+ /* Input file named "-" means read file names from stdin
+ (one per line) and use them. */
+ if (streq (this_file, "-"))
+ {
+ if (parsing_stdin)
+ fatal ("cannot parse standard input AND read file names from it",
+ (char *)NULL);
+ while (readline_internal (&filename_lb, stdin) > 0)
+ process_file_name (filename_lb.buffer, lang);
+ }
+ else
+ process_file_name (this_file, lang);
+ break;
+ case at_stdin:
+ this_file = argbuffer[i].what;
+ process_file (stdin, this_file, lang);
+ break;
+ }
+ }
+
+ free_regexps ();
+ free (lb.buffer);
+ free (filebuf.buffer);
+ free (token_name.buffer);
+
+ if (!CTAGS || cxref_style)
+ {
+ /* Write the remaining tags to tagf (ETAGS) or stdout (CXREF). */
+ put_entries (nodehead);
+ free_tree (nodehead);
+ nodehead = NULL;
+ if (!CTAGS)
+ {
+ fdesc *fdp;
+
+ /* Output file entries that have no tags. */
+ for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+ if (!fdp->written)
+ fprintf (tagf, "\f\n%s,0\n", fdp->taggedfname);
+
+ while (nincluded_files-- > 0)
+ fprintf (tagf, "\f\n%s,include\n", *included_files++);
+
+ if (fclose (tagf) == EOF)
+ pfatal (tagfile);
+ }
+
+ exit (EXIT_SUCCESS);
+ }
+
+ /* From here on, we are in (CTAGS && !cxref_style) */
+ if (update)
+ {
+ char *cmd =
+ xmalloc (strlen (tagfile) + whatlen_max +
+ sizeof "mv..OTAGS;fgrep -v '\t\t' OTAGS >;rm OTAGS");
+ for (i = 0; i < current_arg; ++i)
+ {
+ switch (argbuffer[i].arg_type)
+ {
+ case at_filename:
+ case at_stdin:
+ break;
+ default:
+ continue; /* the for loop */
+ }
+ char *z = stpcpy (cmd, "mv ");
+ z = stpcpy (z, tagfile);
+ z = stpcpy (z, " OTAGS;fgrep -v '\t");
+ z = stpcpy (z, argbuffer[i].what);
+ z = stpcpy (z, "\t' OTAGS >");
+ z = stpcpy (z, tagfile);
+ strcpy (z, ";rm OTAGS");
+ if (system (cmd) != EXIT_SUCCESS)
+ fatal ("failed to execute shell command", (char *)NULL);
+ }
+ free (cmd);
+ append_to_tagfile = true;
+ }
+
+ tagf = fopen (tagfile, append_to_tagfile ? "ab" : "wb");
+ if (tagf == NULL)
+ pfatal (tagfile);
+ put_entries (nodehead); /* write all the tags (CTAGS) */
+ free_tree (nodehead);
+ nodehead = NULL;
+ if (fclose (tagf) == EOF)
+ pfatal (tagfile);
+
+ if (CTAGS)
+ if (append_to_tagfile || update)
+ {
+ char *cmd = xmalloc (2 * strlen (tagfile) + sizeof "sort -u -o..");
+ /* Maybe these should be used:
+ setenv ("LC_COLLATE", "C", 1);
+ setenv ("LC_ALL", "C", 1); */
+ char *z = stpcpy (cmd, "sort -u -o ");
+ z = stpcpy (z, tagfile);
+ *z++ = ' ';
+ strcpy (z, tagfile);
+ exit (system (cmd));
+ }
+ return EXIT_SUCCESS;
+}
+
+
+/*
+ * Return a compressor given the file name. If EXTPTR is non-zero,
+ * return a pointer into FILE where the compressor-specific
+ * extension begins. If no compressor is found, NULL is returned
+ * and EXTPTR is not significant.
+ * Idea by Vladimir Alexiev <vladimir@cs.ualberta.ca> (1998)
+ */
+static compressor *
+get_compressor_from_suffix (char *file, char **extptr)
+{
+ compressor *compr;
+ char *slash, *suffix;
+
+ /* File has been processed by canonicalize_filename,
+ so we don't need to consider backslashes on DOS_NT. */
+ slash = strrchr (file, '/');
+ suffix = strrchr (file, '.');
+ if (suffix == NULL || suffix < slash)
+ return NULL;
+ if (extptr != NULL)
+ *extptr = suffix;
+ suffix += 1;
+ /* Let those poor souls who live with DOS 8+3 file name limits get
+ some solace by treating foo.cgz as if it were foo.c.gz, etc.
+ Only the first do loop is run if not MSDOS */
+ do
+ {
+ for (compr = compressors; compr->suffix != NULL; compr++)
+ if (streq (compr->suffix, suffix))
+ return compr;
+ if (!MSDOS)
+ break; /* do it only once: not really a loop */
+ if (extptr != NULL)
+ *extptr = ++suffix;
+ } while (*suffix != '\0');
+ return NULL;
+}
+
+
+
+/*
+ * Return a language given the name.
+ */
+static language *
+get_language_from_langname (const char *name)
+{
+ language *lang;
+
+ if (name == NULL)
+ error ("empty language name");
+ else
+ {
+ for (lang = lang_names; lang->name != NULL; lang++)
+ if (streq (name, lang->name))
+ return lang;
+ error ("unknown language \"%s\"", name);
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Return a language given the interpreter name.
+ */
+static language *
+get_language_from_interpreter (char *interpreter)
+{
+ language *lang;
+ const char **iname;
+
+ if (interpreter == NULL)
+ return NULL;
+ for (lang = lang_names; lang->name != NULL; lang++)
+ if (lang->interpreters != NULL)
+ for (iname = lang->interpreters; *iname != NULL; iname++)
+ if (streq (*iname, interpreter))
+ return lang;
+
+ return NULL;
+}
+
+
+
+/*
+ * Return a language given the file name.
+ */
+static language *
+get_language_from_filename (char *file, int case_sensitive)
+{
+ language *lang;
+ const char **name, **ext, *suffix;
+
+ /* Try whole file name first. */
+ for (lang = lang_names; lang->name != NULL; lang++)
+ if (lang->filenames != NULL)
+ for (name = lang->filenames; *name != NULL; name++)
+ if ((case_sensitive)
+ ? streq (*name, file)
+ : strcaseeq (*name, file))
+ return lang;
+
+ /* If not found, try suffix after last dot. */
+ suffix = strrchr (file, '.');
+ if (suffix == NULL)
+ return NULL;
+ suffix += 1;
+ for (lang = lang_names; lang->name != NULL; lang++)
+ if (lang->suffixes != NULL)
+ for (ext = lang->suffixes; *ext != NULL; ext++)
+ if ((case_sensitive)
+ ? streq (*ext, suffix)
+ : strcaseeq (*ext, suffix))
+ return lang;
+ return NULL;
+}
+
+
+/*
+ * This routine is called on each file argument.
+ */
+static void
+process_file_name (char *file, language *lang)
+{
+ struct stat stat_buf;
+ FILE *inf;
+ fdesc *fdp;
+ compressor *compr;
+ char *compressed_name, *uncompressed_name;
+ char *ext, *real_name;
+ int retval;
+
+ canonicalize_filename (file);
+ if (streq (file, tagfile) && !streq (tagfile, "-"))
+ {
+ error ("skipping inclusion of %s in self.", file);
+ return;
+ }
+ if ((compr = get_compressor_from_suffix (file, &ext)) == NULL)
+ {
+ compressed_name = NULL;
+ real_name = uncompressed_name = savestr (file);
+ }
+ else
+ {
+ real_name = compressed_name = savestr (file);
+ uncompressed_name = savenstr (file, ext - file);
+ }
+
+ /* If the canonicalized uncompressed name
+ has already been dealt with, skip it silently. */
+ for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+ {
+ assert (fdp->infname != NULL);
+ if (streq (uncompressed_name, fdp->infname))
+ goto cleanup;
+ }
+
+ if (stat (real_name, &stat_buf) != 0)
+ {
+ /* Reset real_name and try with a different name. */
+ real_name = NULL;
+ if (compressed_name != NULL) /* try with the given suffix */
+ {
+ if (stat (uncompressed_name, &stat_buf) == 0)
+ real_name = uncompressed_name;
+ }
+ else /* try all possible suffixes */
+ {
+ for (compr = compressors; compr->suffix != NULL; compr++)
+ {
+ compressed_name = concat (file, ".", compr->suffix);
+ if (stat (compressed_name, &stat_buf) != 0)
+ {
+ if (MSDOS)
+ {
+ char *suf = compressed_name + strlen (file);
+ size_t suflen = strlen (compr->suffix) + 1;
+ for ( ; suf[1]; suf++, suflen--)
+ {
+ memmove (suf, suf + 1, suflen);
+ if (stat (compressed_name, &stat_buf) == 0)
+ {
+ real_name = compressed_name;
+ break;
+ }
+ }
+ if (real_name != NULL)
+ break;
+ } /* MSDOS */
+ free (compressed_name);
+ compressed_name = NULL;
+ }
+ else
+ {
+ real_name = compressed_name;
+ break;
+ }
+ }
+ }
+ if (real_name == NULL)
+ {
+ perror (file);
+ goto cleanup;
+ }
+ } /* try with a different name */
+
+ if (!S_ISREG (stat_buf.st_mode))
+ {
+ error ("skipping %s: it is not a regular file.", real_name);
+ goto cleanup;
+ }
+ if (real_name == compressed_name)
+ {
+ char *cmd = concat (compr->command, " ", real_name);
+ inf = popen (cmd, "r" FOPEN_BINARY);
+ free (cmd);
+ }
+ else
+ inf = fopen (real_name, "r" FOPEN_BINARY);
+ if (inf == NULL)
+ {
+ perror (real_name);
+ goto cleanup;
+ }
+
+ process_file (inf, uncompressed_name, lang);
+
+ if (real_name == compressed_name)
+ retval = pclose (inf);
+ else
+ retval = fclose (inf);
+ if (retval < 0)
+ pfatal (file);
+
+ cleanup:
+ free (compressed_name);
+ free (uncompressed_name);
+ last_node = NULL;
+ curfdp = NULL;
+ return;
+}
+
+static void
+process_file (FILE *fh, char *fn, language *lang)
+{
+ static const fdesc emptyfdesc;
+ fdesc *fdp;
+
+ /* Create a new input file description entry. */
+ fdp = xnew (1, fdesc);
+ *fdp = emptyfdesc;
+ fdp->next = fdhead;
+ fdp->infname = savestr (fn);
+ fdp->lang = lang;
+ fdp->infabsname = absolute_filename (fn, cwd);
+ fdp->infabsdir = absolute_dirname (fn, cwd);
+ if (filename_is_absolute (fn))
+ {
+ /* An absolute file name. Canonicalize it. */
+ fdp->taggedfname = absolute_filename (fn, NULL);
+ }
+ else
+ {
+ /* A file name relative to cwd. Make it relative
+ to the directory of the tags file. */
+ fdp->taggedfname = relative_filename (fn, tagfiledir);
+ }
+ fdp->usecharno = true; /* use char position when making tags */
+ fdp->prop = NULL;
+ fdp->written = false; /* not written on tags file yet */
+
+ fdhead = fdp;
+ curfdp = fdhead; /* the current file description */
+
+ find_entries (fh);
+
+ /* If not Ctags, and if this is not metasource and if it contained no #line
+ directives, we can write the tags and free all nodes pointing to
+ curfdp. */
+ if (!CTAGS
+ && curfdp->usecharno /* no #line directives in this file */
+ && !curfdp->lang->metasource)
+ {
+ node *np, *prev;
+
+ /* Look for the head of the sublist relative to this file. See add_node
+ for the structure of the node tree. */
+ prev = NULL;
+ for (np = nodehead; np != NULL; prev = np, np = np->left)
+ if (np->fdp == curfdp)
+ break;
+
+ /* If we generated tags for this file, write and delete them. */
+ if (np != NULL)
+ {
+ /* This is the head of the last sublist, if any. The following
+ instructions depend on this being true. */
+ assert (np->left == NULL);
+
+ assert (fdhead == curfdp);
+ assert (last_node->fdp == curfdp);
+ put_entries (np); /* write tags for file curfdp->taggedfname */
+ free_tree (np); /* remove the written nodes */
+ if (prev == NULL)
+ nodehead = NULL; /* no nodes left */
+ else
+ prev->left = NULL; /* delete the pointer to the sublist */
+ }
+ }
+}
+
+/*
+ * This routine sets up the boolean pseudo-functions which work
+ * by setting boolean flags dependent upon the corresponding character.
+ * Every char which is NOT in that string is not a white char. Therefore,
+ * all of the array "_wht" is set to false, and then the elements
+ * subscripted by the chars in "white" are set to true. Thus "_wht"
+ * of a char is true if it is the string "white", else false.
+ */
+static void
+init (void)
+{
+ const char *sp;
+ int i;
+
+ for (i = 0; i < CHARS; i++)
+ iswhite (i) = notinname (i) = begtoken (i) = intoken (i) = endtoken (i)
+ = false;
+ for (sp = white; *sp != '\0'; sp++) iswhite (*sp) = true;
+ for (sp = nonam; *sp != '\0'; sp++) notinname (*sp) = true;
+ notinname ('\0') = notinname ('\n');
+ for (sp = begtk; *sp != '\0'; sp++) begtoken (*sp) = true;
+ begtoken ('\0') = begtoken ('\n');
+ for (sp = midtk; *sp != '\0'; sp++) intoken (*sp) = true;
+ intoken ('\0') = intoken ('\n');
+ for (sp = endtk; *sp != '\0'; sp++) endtoken (*sp) = true;
+ endtoken ('\0') = endtoken ('\n');
+}
+
+/*
+ * This routine opens the specified file and calls the function
+ * which finds the function and type definitions.
+ */
+static void
+find_entries (FILE *inf)
+{
+ char *cp;
+ language *lang = curfdp->lang;
+ Lang_function *parser = NULL;
+
+ /* If user specified a language, use it. */
+ if (lang != NULL && lang->function != NULL)
+ {
+ parser = lang->function;
+ }
+
+ /* Else try to guess the language given the file name. */
+ if (parser == NULL)
+ {
+ lang = get_language_from_filename (curfdp->infname, true);
+ if (lang != NULL && lang->function != NULL)
+ {
+ curfdp->lang = lang;
+ parser = lang->function;
+ }
+ }
+
+ /* Else look for sharp-bang as the first two characters. */
+ if (parser == NULL
+ && readline_internal (&lb, inf) > 0
+ && lb.len >= 2
+ && lb.buffer[0] == '#'
+ && lb.buffer[1] == '!')
+ {
+ char *lp;
+
+ /* Set lp to point at the first char after the last slash in the
+ line or, if no slashes, at the first nonblank. Then set cp to
+ the first successive blank and terminate the string. */
+ lp = strrchr (lb.buffer+2, '/');
+ if (lp != NULL)
+ lp += 1;
+ else
+ lp = skip_spaces (lb.buffer + 2);
+ cp = skip_non_spaces (lp);
+ *cp = '\0';
+
+ if (strlen (lp) > 0)
+ {
+ lang = get_language_from_interpreter (lp);
+ if (lang != NULL && lang->function != NULL)
+ {
+ curfdp->lang = lang;
+ parser = lang->function;
+ }
+ }
+ }
+
+ /* We rewind here, even if inf may be a pipe. We fail if the
+ length of the first line is longer than the pipe block size,
+ which is unlikely. */
+ rewind (inf);
+
+ /* Else try to guess the language given the case insensitive file name. */
+ if (parser == NULL)
+ {
+ lang = get_language_from_filename (curfdp->infname, false);
+ if (lang != NULL && lang->function != NULL)
+ {
+ curfdp->lang = lang;
+ parser = lang->function;
+ }
+ }
+
+ /* Else try Fortran or C. */
+ if (parser == NULL)
+ {
+ node *old_last_node = last_node;
+
+ curfdp->lang = get_language_from_langname ("fortran");
+ find_entries (inf);
+
+ if (old_last_node == last_node)
+ /* No Fortran entries found. Try C. */
+ {
+ /* We do not tag if rewind fails.
+ Only the file name will be recorded in the tags file. */
+ rewind (inf);
+ curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
+ find_entries (inf);
+ }
+ return;
+ }
+
+ if (!no_line_directive
+ && curfdp->lang != NULL && curfdp->lang->metasource)
+ /* It may be that this is a bingo.y file, and we already parsed a bingo.c
+ file, or anyway we parsed a file that is automatically generated from
+ this one. If this is the case, the bingo.c file contained #line
+ directives that generated tags pointing to this file. Let's delete
+ them all before parsing this file, which is the real source. */
+ {
+ fdesc **fdpp = &fdhead;
+ while (*fdpp != NULL)
+ if (*fdpp != curfdp
+ && streq ((*fdpp)->taggedfname, curfdp->taggedfname))
+ /* We found one of those! We must delete both the file description
+ and all tags referring to it. */
+ {
+ fdesc *badfdp = *fdpp;
+
+ /* Delete the tags referring to badfdp->taggedfname
+ that were obtained from badfdp->infname. */
+ invalidate_nodes (badfdp, &nodehead);
+
+ *fdpp = badfdp->next; /* remove the bad description from the list */
+ free_fdesc (badfdp);
+ }
+ else
+ fdpp = &(*fdpp)->next; /* advance the list pointer */
+ }
+
+ assert (parser != NULL);
+
+ /* Generic initializations before reading from file. */
+ linebuffer_setlen (&filebuf, 0); /* reset the file buffer */
+
+ /* Generic initializations before parsing file with readline. */
+ lineno = 0; /* reset global line number */
+ charno = 0; /* reset global char number */
+ linecharno = 0; /* reset global char number of line start */
+
+ parser (inf);
+
+ regex_tag_multiline ();
+}
+
+
+/*
+ * Check whether an implicitly named tag should be created,
+ * then call `pfnote'.
+ * NAME is a string that is internally copied by this function.
+ *
+ * TAGS format specification
+ * Idea by Sam Kendall <kendall@mv.mv.com> (1997)
+ * The following is explained in some more detail in etc/ETAGS.EBNF.
+ *
+ * make_tag creates tags with "implicit tag names" (unnamed tags)
+ * if the following are all true, assuming NONAM=" \f\t\n\r()=,;":
+ * 1. NAME does not contain any of the characters in NONAM;
+ * 2. LINESTART contains name as either a rightmost, or rightmost but
+ * one character, substring;
+ * 3. the character, if any, immediately before NAME in LINESTART must
+ * be a character in NONAM;
+ * 4. the character, if any, immediately after NAME in LINESTART must
+ * also be a character in NONAM.
+ *
+ * The implementation uses the notinname() macro, which recognizes the
+ * characters stored in the string `nonam'.
+ * etags.el needs to use the same characters that are in NONAM.
+ */
+static void
+make_tag (const char *name, /* tag name, or NULL if unnamed */
+ int namelen, /* tag length */
+ bool is_func, /* tag is a function */
+ char *linestart, /* start of the line where tag is */
+ int linelen, /* length of the line where tag is */
+ int lno, /* line number */
+ long int cno) /* character number */
+{
+ bool named = (name != NULL && namelen > 0);
+ char *nname = NULL;
+
+ if (!CTAGS && named) /* maybe set named to false */
+ /* Let's try to make an implicit tag name, that is, create an unnamed tag
+ such that etags.el can guess a name from it. */
+ {
+ int i;
+ register const char *cp = name;
+
+ for (i = 0; i < namelen; i++)
+ if (notinname (*cp++))
+ break;
+ if (i == namelen) /* rule #1 */
+ {
+ cp = linestart + linelen - namelen;
+ if (notinname (linestart[linelen-1]))
+ cp -= 1; /* rule #4 */
+ if (cp >= linestart /* rule #2 */
+ && (cp == linestart
+ || notinname (cp[-1])) /* rule #3 */
+ && strneq (name, cp, namelen)) /* rule #2 */
+ named = false; /* use implicit tag name */
+ }
+ }
+
+ if (named)
+ nname = savenstr (name, namelen);
+
+ pfnote (nname, is_func, linestart, linelen, lno, cno);
+}
+
+/* Record a tag. */
+static void
+pfnote (char *name, bool is_func, char *linestart, int linelen, int lno,
+ long int cno)
+ /* tag name, or NULL if unnamed */
+ /* tag is a function */
+ /* start of the line where tag is */
+ /* length of the line where tag is */
+ /* line number */
+ /* character number */
+{
+ register node *np;
+
+ assert (name == NULL || name[0] != '\0');
+ if (CTAGS && name == NULL)
+ return;
+
+ np = xnew (1, node);
+
+ /* If ctags mode, change name "main" to M<thisfilename>. */
+ if (CTAGS && !cxref_style && streq (name, "main"))
+ {
+ char *fp = strrchr (curfdp->taggedfname, '/');
+ np->name = concat ("M", fp == NULL ? curfdp->taggedfname : fp + 1, "");
+ fp = strrchr (np->name, '.');
+ if (fp != NULL && fp[1] != '\0' && fp[2] == '\0')
+ fp[0] = '\0';
+ }
+ else
+ np->name = name;
+ np->valid = true;
+ np->been_warned = false;
+ np->fdp = curfdp;
+ np->is_func = is_func;
+ np->lno = lno;
+ if (np->fdp->usecharno)
+ /* Our char numbers are 0-base, because of C language tradition?
+ ctags compatibility? old versions compatibility? I don't know.
+ Anyway, since emacs's are 1-base we expect etags.el to take care
+ of the difference. If we wanted to have 1-based numbers, we would
+ uncomment the +1 below. */
+ np->cno = cno /* + 1 */ ;
+ else
+ np->cno = invalidcharno;
+ np->left = np->right = NULL;
+ if (CTAGS && !cxref_style)
+ {
+ if (strlen (linestart) < 50)
+ np->regex = concat (linestart, "$", "");
+ else
+ np->regex = savenstr (linestart, 50);
+ }
+ else
+ np->regex = savenstr (linestart, linelen);
+
+ add_node (np, &nodehead);
+}
+
+/*
+ * free_tree ()
+ * recurse on left children, iterate on right children.
+ */
+static void
+free_tree (register node *np)
+{
+ while (np)
+ {
+ register node *node_right = np->right;
+ free_tree (np->left);
+ free (np->name);
+ free (np->regex);
+ free (np);
+ np = node_right;
+ }
+}
+
+/*
+ * free_fdesc ()
+ * delete a file description
+ */
+static void
+free_fdesc (register fdesc *fdp)
+{
+ free (fdp->infname);
+ free (fdp->infabsname);
+ free (fdp->infabsdir);
+ free (fdp->taggedfname);
+ free (fdp->prop);
+ free (fdp);
+}
+
+/*
+ * add_node ()
+ * Adds a node to the tree of nodes. In etags mode, sort by file
+ * name. In ctags mode, sort by tag name. Make no attempt at
+ * balancing.
+ *
+ * add_node is the only function allowed to add nodes, so it can
+ * maintain state.
+ */
+static void
+add_node (node *np, node **cur_node_p)
+{
+ register int dif;
+ register node *cur_node = *cur_node_p;
+
+ if (cur_node == NULL)
+ {
+ *cur_node_p = np;
+ last_node = np;
+ return;
+ }
+
+ if (!CTAGS)
+ /* Etags Mode */
+ {
+ /* For each file name, tags are in a linked sublist on the right
+ pointer. The first tags of different files are a linked list
+ on the left pointer. last_node points to the end of the last
+ used sublist. */
+ if (last_node != NULL && last_node->fdp == np->fdp)
+ {
+ /* Let's use the same sublist as the last added node. */
+ assert (last_node->right == NULL);
+ last_node->right = np;
+ last_node = np;
+ }
+ else if (cur_node->fdp == np->fdp)
+ {
+ /* Scanning the list we found the head of a sublist which is
+ good for us. Let's scan this sublist. */
+ add_node (np, &cur_node->right);
+ }
+ else
+ /* The head of this sublist is not good for us. Let's try the
+ next one. */
+ add_node (np, &cur_node->left);
+ } /* if ETAGS mode */
+
+ else
+ {
+ /* Ctags Mode */
+ dif = strcmp (np->name, cur_node->name);
+
+ /*
+ * If this tag name matches an existing one, then
+ * do not add the node, but maybe print a warning.
+ */
+ if (no_duplicates && !dif)
+ {
+ if (np->fdp == cur_node->fdp)
+ {
+ if (!no_warnings)
+ {
+ fprintf (stderr, "Duplicate entry in file %s, line %d: %s\n",
+ np->fdp->infname, lineno, np->name);
+ fprintf (stderr, "Second entry ignored\n");
+ }
+ }
+ else if (!cur_node->been_warned && !no_warnings)
+ {
+ fprintf
+ (stderr,
+ "Duplicate entry in files %s and %s: %s (Warning only)\n",
+ np->fdp->infname, cur_node->fdp->infname, np->name);
+ cur_node->been_warned = true;
+ }
+ return;
+ }
+
+ /* Actually add the node */
+ add_node (np, dif < 0 ? &cur_node->left : &cur_node->right);
+ } /* if CTAGS mode */
+}
+
+/*
+ * invalidate_nodes ()
+ * Scan the node tree and invalidate all nodes pointing to the
+ * given file description (CTAGS case) or free them (ETAGS case).
+ */
+static void
+invalidate_nodes (fdesc *badfdp, node **npp)
+{
+ node *np = *npp;
+
+ if (np == NULL)
+ return;
+
+ if (CTAGS)
+ {
+ if (np->left != NULL)
+ invalidate_nodes (badfdp, &np->left);
+ if (np->fdp == badfdp)
+ np->valid = false;
+ if (np->right != NULL)
+ invalidate_nodes (badfdp, &np->right);
+ }
+ else
+ {
+ assert (np->fdp != NULL);
+ if (np->fdp == badfdp)
+ {
+ *npp = np->left; /* detach the sublist from the list */
+ np->left = NULL; /* isolate it */
+ free_tree (np); /* free it */
+ invalidate_nodes (badfdp, npp);
+ }
+ else
+ invalidate_nodes (badfdp, &np->left);
+ }
+}
+
+
+static int total_size_of_entries (node *);
+static int number_len (long) ATTRIBUTE_CONST;
+
+/* Length of a non-negative number's decimal representation. */
+static int
+number_len (long int num)
+{
+ int len = 1;
+ while ((num /= 10) > 0)
+ len += 1;
+ return len;
+}
+
+/*
+ * Return total number of characters that put_entries will output for
+ * the nodes in the linked list at the right of the specified node.
+ * This count is irrelevant with etags.el since emacs 19.34 at least,
+ * but is still supplied for backward compatibility.
+ */
+static int
+total_size_of_entries (register node *np)
+{
+ register int total = 0;
+
+ for (; np != NULL; np = np->right)
+ if (np->valid)
+ {
+ total += strlen (np->regex) + 1; /* pat\177 */
+ if (np->name != NULL)
+ total += strlen (np->name) + 1; /* name\001 */
+ total += number_len ((long) np->lno) + 1; /* lno, */
+ if (np->cno != invalidcharno) /* cno */
+ total += number_len (np->cno);
+ total += 1; /* newline */
+ }
+
+ return total;
+}
+
+static void
+put_entries (register node *np)
+{
+ register char *sp;
+ static fdesc *fdp = NULL;
+
+ if (np == NULL)
+ return;
+
+ /* Output subentries that precede this one */
+ if (CTAGS)
+ put_entries (np->left);
+
+ /* Output this entry */
+ if (np->valid)
+ {
+ if (!CTAGS)
+ {
+ /* Etags mode */
+ if (fdp != np->fdp)
+ {
+ fdp = np->fdp;
+ fprintf (tagf, "\f\n%s,%d\n",
+ fdp->taggedfname, total_size_of_entries (np));
+ fdp->written = true;
+ }
+ fputs (np->regex, tagf);
+ fputc ('\177', tagf);
+ if (np->name != NULL)
+ {
+ fputs (np->name, tagf);
+ fputc ('\001', tagf);
+ }
+ fprintf (tagf, "%d,", np->lno);
+ if (np->cno != invalidcharno)
+ fprintf (tagf, "%ld", np->cno);
+ fputs ("\n", tagf);
+ }
+ else
+ {
+ /* Ctags mode */
+ if (np->name == NULL)
+ error ("internal error: NULL name in ctags mode.");
+
+ if (cxref_style)
+ {
+ if (vgrind_style)
+ fprintf (stdout, "%s %s %d\n",
+ np->name, np->fdp->taggedfname, (np->lno + 63) / 64);
+ else
+ fprintf (stdout, "%-16s %3d %-16s %s\n",
+ np->name, np->lno, np->fdp->taggedfname, np->regex);
+ }
+ else
+ {
+ fprintf (tagf, "%s\t%s\t", np->name, np->fdp->taggedfname);
+
+ if (np->is_func)
+ { /* function or #define macro with args */
+ putc (searchar, tagf);
+ putc ('^', tagf);
+
+ for (sp = np->regex; *sp; sp++)
+ {
+ if (*sp == '\\' || *sp == searchar)
+ putc ('\\', tagf);
+ putc (*sp, tagf);
+ }
+ putc (searchar, tagf);
+ }
+ else
+ { /* anything else; text pattern inadequate */
+ fprintf (tagf, "%d", np->lno);
+ }
+ putc ('\n', tagf);
+ }
+ }
+ } /* if this node contains a valid tag */
+
+ /* Output subentries that follow this one */
+ put_entries (np->right);
+ if (!CTAGS)
+ put_entries (np->left);
+}
+
+
+/* C extensions. */
+#define C_EXT 0x00fff /* C extensions */
+#define C_PLAIN 0x00000 /* C */
+#define C_PLPL 0x00001 /* C++ */
+#define C_STAR 0x00003 /* C* */
+#define C_JAVA 0x00005 /* JAVA */
+#define C_AUTO 0x01000 /* C, but switch to C++ if `class' is met */
+#define YACC 0x10000 /* yacc file */
+
+/*
+ * The C symbol tables.
+ */
+enum sym_type
+{
+ st_none,
+ st_C_objprot, st_C_objimpl, st_C_objend,
+ st_C_gnumacro,
+ st_C_ignore, st_C_attribute,
+ st_C_javastruct,
+ st_C_operator,
+ st_C_class, st_C_template,
+ st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef
+};
+
+/* Feed stuff between (but not including) %[ and %] lines to:
+ gperf -m 5
+%[
+%compare-strncmp
+%enum
+%struct-type
+struct C_stab_entry { char *name; int c_ext; enum sym_type type; }
+%%
+if, 0, st_C_ignore
+for, 0, st_C_ignore
+while, 0, st_C_ignore
+switch, 0, st_C_ignore
+return, 0, st_C_ignore
+__attribute__, 0, st_C_attribute
+GTY, 0, st_C_attribute
+@interface, 0, st_C_objprot
+@protocol, 0, st_C_objprot
+@implementation,0, st_C_objimpl
+@end, 0, st_C_objend
+import, (C_JAVA & ~C_PLPL), st_C_ignore
+package, (C_JAVA & ~C_PLPL), st_C_ignore
+friend, C_PLPL, st_C_ignore
+extends, (C_JAVA & ~C_PLPL), st_C_javastruct
+implements, (C_JAVA & ~C_PLPL), st_C_javastruct
+interface, (C_JAVA & ~C_PLPL), st_C_struct
+class, 0, st_C_class
+namespace, C_PLPL, st_C_struct
+domain, C_STAR, st_C_struct
+union, 0, st_C_struct
+struct, 0, st_C_struct
+extern, 0, st_C_extern
+enum, 0, st_C_enum
+typedef, 0, st_C_typedef
+define, 0, st_C_define
+undef, 0, st_C_define
+operator, C_PLPL, st_C_operator
+template, 0, st_C_template
+# DEFUN used in emacs, the next three used in glibc (SYSCALL only for mach).
+DEFUN, 0, st_C_gnumacro
+SYSCALL, 0, st_C_gnumacro
+ENTRY, 0, st_C_gnumacro
+PSEUDO, 0, st_C_gnumacro
+# These are defined inside C functions, so currently they are not met.
+# EXFUN used in glibc, DEFVAR_* in emacs.
+#EXFUN, 0, st_C_gnumacro
+#DEFVAR_, 0, st_C_gnumacro
+%]
+and replace lines between %< and %> with its output, then:
+ - remove the #if characterset check
+ - make in_word_set static and not inline. */
+/*%<*/
+/* C code produced by gperf version 3.0.1 */
+/* Command-line: gperf -m 5 */
+/* Computed positions: -k'2-3' */
+
+struct C_stab_entry { const char *name; int c_ext; enum sym_type type; };
+/* maximum key range = 33, duplicates = 0 */
+
+static int
+hash (const char *str, int len)
+{
+ static char const asso_values[] =
+ {
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 3,
+ 26, 35, 35, 35, 35, 35, 35, 35, 27, 35,
+ 35, 35, 35, 24, 0, 35, 35, 35, 35, 0,
+ 35, 35, 35, 35, 35, 1, 35, 16, 35, 6,
+ 23, 0, 0, 35, 22, 0, 35, 35, 5, 0,
+ 0, 15, 1, 35, 6, 35, 8, 19, 35, 16,
+ 4, 5, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 35, 35, 35, 35, 35
+ };
+ int hval = len;
+
+ switch (hval)
+ {
+ default:
+ hval += asso_values[(unsigned char) str[2]];
+ /*FALLTHROUGH*/
+ case 2:
+ hval += asso_values[(unsigned char) str[1]];
+ break;
+ }
+ return hval;
+}
+
+static struct C_stab_entry *
+in_word_set (register const char *str, register unsigned int len)
+{
+ enum
+ {
+ TOTAL_KEYWORDS = 33,
+ MIN_WORD_LENGTH = 2,
+ MAX_WORD_LENGTH = 15,
+ MIN_HASH_VALUE = 2,
+ MAX_HASH_VALUE = 34
+ };
+
+ static struct C_stab_entry wordlist[] =
+ {
+ {""}, {""},
+ {"if", 0, st_C_ignore},
+ {"GTY", 0, st_C_attribute},
+ {"@end", 0, st_C_objend},
+ {"union", 0, st_C_struct},
+ {"define", 0, st_C_define},
+ {"import", (C_JAVA & ~C_PLPL), st_C_ignore},
+ {"template", 0, st_C_template},
+ {"operator", C_PLPL, st_C_operator},
+ {"@interface", 0, st_C_objprot},
+ {"implements", (C_JAVA & ~C_PLPL), st_C_javastruct},
+ {"friend", C_PLPL, st_C_ignore},
+ {"typedef", 0, st_C_typedef},
+ {"return", 0, st_C_ignore},
+ {"@implementation",0, st_C_objimpl},
+ {"@protocol", 0, st_C_objprot},
+ {"interface", (C_JAVA & ~C_PLPL), st_C_struct},
+ {"extern", 0, st_C_extern},
+ {"extends", (C_JAVA & ~C_PLPL), st_C_javastruct},
+ {"struct", 0, st_C_struct},
+ {"domain", C_STAR, st_C_struct},
+ {"switch", 0, st_C_ignore},
+ {"enum", 0, st_C_enum},
+ {"for", 0, st_C_ignore},
+ {"namespace", C_PLPL, st_C_struct},
+ {"class", 0, st_C_class},
+ {"while", 0, st_C_ignore},
+ {"undef", 0, st_C_define},
+ {"package", (C_JAVA & ~C_PLPL), st_C_ignore},
+ {"__attribute__", 0, st_C_attribute},
+ {"SYSCALL", 0, st_C_gnumacro},
+ {"ENTRY", 0, st_C_gnumacro},
+ {"PSEUDO", 0, st_C_gnumacro},
+ {"DEFUN", 0, st_C_gnumacro}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ int key = hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ const char *s = wordlist[key].name;
+
+ if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
+ return &wordlist[key];
+ }
+ }
+ return 0;
+}
+/*%>*/
+
+static enum sym_type
+C_symtype (char *str, int len, int c_ext)
+{
+ register struct C_stab_entry *se = in_word_set (str, len);
+
+ if (se == NULL || (se->c_ext && !(c_ext & se->c_ext)))
+ return st_none;
+ return se->type;
+}
+
+
+/*
+ * Ignoring __attribute__ ((list))
+ */
+static bool inattribute; /* looking at an __attribute__ construct */
+
+/*
+ * C functions and variables are recognized using a simple
+ * finite automaton. fvdef is its state variable.
+ */
+static enum
+{
+ fvnone, /* nothing seen */
+ fdefunkey, /* Emacs DEFUN keyword seen */
+ fdefunname, /* Emacs DEFUN name seen */
+ foperator, /* func: operator keyword seen (cplpl) */
+ fvnameseen, /* function or variable name seen */
+ fstartlist, /* func: just after open parenthesis */
+ finlist, /* func: in parameter list */
+ flistseen, /* func: after parameter list */
+ fignore, /* func: before open brace */
+ vignore /* var-like: ignore until ';' */
+} fvdef;
+
+static bool fvextern; /* func or var: extern keyword seen; */
+
+/*
+ * typedefs are recognized using a simple finite automaton.
+ * typdef is its state variable.
+ */
+static enum
+{
+ tnone, /* nothing seen */
+ tkeyseen, /* typedef keyword seen */
+ ttypeseen, /* defined type seen */
+ tinbody, /* inside typedef body */
+ tend, /* just before typedef tag */
+ tignore /* junk after typedef tag */
+} typdef;
+
+/*
+ * struct-like structures (enum, struct and union) are recognized
+ * using another simple finite automaton. `structdef' is its state
+ * variable.
+ */
+static enum
+{
+ snone, /* nothing seen yet,
+ or in struct body if bracelev > 0 */
+ skeyseen, /* struct-like keyword seen */
+ stagseen, /* struct-like tag seen */
+ scolonseen /* colon seen after struct-like tag */
+} structdef;
+
+/*
+ * When objdef is different from onone, objtag is the name of the class.
+ */
+static const char *objtag = "<uninited>";
+
+/*
+ * Yet another little state machine to deal with preprocessor lines.
+ */
+static enum
+{
+ dnone, /* nothing seen */
+ dsharpseen, /* '#' seen as first char on line */
+ ddefineseen, /* '#' and 'define' seen */
+ dignorerest /* ignore rest of line */
+} definedef;
+
+/*
+ * State machine for Objective C protocols and implementations.
+ * Idea by Tom R.Hageman <tom@basil.icce.rug.nl> (1995)
+ */
+static enum
+{
+ onone, /* nothing seen */
+ oprotocol, /* @interface or @protocol seen */
+ oimplementation, /* @implementations seen */
+ otagseen, /* class name seen */
+ oparenseen, /* parenthesis before category seen */
+ ocatseen, /* category name seen */
+ oinbody, /* in @implementation body */
+ omethodsign, /* in @implementation body, after +/- */
+ omethodtag, /* after method name */
+ omethodcolon, /* after method colon */
+ omethodparm, /* after method parameter */
+ oignore /* wait for @end */
+} objdef;
+
+
+/*
+ * Use this structure to keep info about the token read, and how it
+ * should be tagged. Used by the make_C_tag function to build a tag.
+ */
+static struct tok
+{
+ char *line; /* string containing the token */
+ int offset; /* where the token starts in LINE */
+ int length; /* token length */
+ /*
+ The previous members can be used to pass strings around for generic
+ purposes. The following ones specifically refer to creating tags. In this
+ case the token contained here is the pattern that will be used to create a
+ tag.
+ */
+ bool valid; /* do not create a tag; the token should be
+ invalidated whenever a state machine is
+ reset prematurely */
+ bool named; /* create a named tag */
+ int lineno; /* source line number of tag */
+ long linepos; /* source char number of tag */
+} token; /* latest token read */
+
+/*
+ * Variables and functions for dealing with nested structures.
+ * Idea by Mykola Dzyuba <mdzyuba@yahoo.com> (2001)
+ */
+static void pushclass_above (int, char *, int);
+static void popclass_above (int);
+static void write_classname (linebuffer *, const char *qualifier);
+
+static struct {
+ char **cname; /* nested class names */
+ int *bracelev; /* nested class brace level */
+ int nl; /* class nesting level (elements used) */
+ int size; /* length of the array */
+} cstack; /* stack for nested declaration tags */
+/* Current struct nesting depth (namespace, class, struct, union, enum). */
+#define nestlev (cstack.nl)
+/* After struct keyword or in struct body, not inside a nested function. */
+#define instruct (structdef == snone && nestlev > 0 \
+ && bracelev == cstack.bracelev[nestlev-1] + 1)
+
+static void
+pushclass_above (int bracelev, char *str, int len)
+{
+ int nl;
+
+ popclass_above (bracelev);
+ nl = cstack.nl;
+ if (nl >= cstack.size)
+ {
+ int size = cstack.size *= 2;
+ xrnew (cstack.cname, size, char *);
+ xrnew (cstack.bracelev, size, int);
+ }
+ assert (nl == 0 || cstack.bracelev[nl-1] < bracelev);
+ cstack.cname[nl] = (str == NULL) ? NULL : savenstr (str, len);
+ cstack.bracelev[nl] = bracelev;
+ cstack.nl = nl + 1;
+}
+
+static void
+popclass_above (int bracelev)
+{
+ int nl;
+
+ for (nl = cstack.nl - 1;
+ nl >= 0 && cstack.bracelev[nl] >= bracelev;
+ nl--)
+ {
+ free (cstack.cname[nl]);
+ cstack.nl = nl;
+ }
+}
+
+static void
+write_classname (linebuffer *cn, const char *qualifier)
+{
+ int i, len;
+ int qlen = strlen (qualifier);
+
+ if (cstack.nl == 0 || cstack.cname[0] == NULL)
+ {
+ len = 0;
+ cn->len = 0;
+ cn->buffer[0] = '\0';
+ }
+ else
+ {
+ len = strlen (cstack.cname[0]);
+ linebuffer_setlen (cn, len);
+ strcpy (cn->buffer, cstack.cname[0]);
+ }
+ for (i = 1; i < cstack.nl; i++)
+ {
+ char *s = cstack.cname[i];
+ if (s == NULL)
+ continue;
+ linebuffer_setlen (cn, len + qlen + strlen (s));
+ len += sprintf (cn->buffer + len, "%s%s", qualifier, s);
+ }
+}
+
+
+static bool consider_token (char *, int, int, int *, int, int, bool *);
+static void make_C_tag (bool);
+
+/*
+ * consider_token ()
+ * checks to see if the current token is at the start of a
+ * function or variable, or corresponds to a typedef, or
+ * is a struct/union/enum tag, or #define, or an enum constant.
+ *
+ * *IS_FUNC_OR_VAR gets true if the token is a function or #define macro
+ * with args. C_EXTP points to which language we are looking at.
+ *
+ * Globals
+ * fvdef IN OUT
+ * structdef IN OUT
+ * definedef IN OUT
+ * typdef IN OUT
+ * objdef IN OUT
+ */
+
+static bool
+consider_token (char *str, int len, int c, int *c_extp,
+ int bracelev, int parlev, bool *is_func_or_var)
+ /* IN: token pointer */
+ /* IN: token length */
+ /* IN: first char after the token */
+ /* IN, OUT: C extensions mask */
+ /* IN: brace level */
+ /* IN: parenthesis level */
+ /* OUT: function or variable found */
+{
+ /* When structdef is stagseen, scolonseen, or snone with bracelev > 0,
+ structtype is the type of the preceding struct-like keyword, and
+ structbracelev is the brace level where it has been seen. */
+ static enum sym_type structtype;
+ static int structbracelev;
+ static enum sym_type toktype;
+
+
+ toktype = C_symtype (str, len, *c_extp);
+
+ /*
+ * Skip __attribute__
+ */
+ if (toktype == st_C_attribute)
+ {
+ inattribute = true;
+ return false;
+ }
+
+ /*
+ * Advance the definedef state machine.
+ */
+ switch (definedef)
+ {
+ case dnone:
+ /* We're not on a preprocessor line. */
+ if (toktype == st_C_gnumacro)
+ {
+ fvdef = fdefunkey;
+ return false;
+ }
+ break;
+ case dsharpseen:
+ if (toktype == st_C_define)
+ {
+ definedef = ddefineseen;
+ }
+ else
+ {
+ definedef = dignorerest;
+ }
+ return false;
+ case ddefineseen:
+ /*
+ * Make a tag for any macro, unless it is a constant
+ * and constantypedefs is false.
+ */
+ definedef = dignorerest;
+ *is_func_or_var = (c == '(');
+ if (!*is_func_or_var && !constantypedefs)
+ return false;
+ else
+ return true;
+ case dignorerest:
+ return false;
+ default:
+ error ("internal error: definedef value.");
+ }
+
+ /*
+ * Now typedefs
+ */
+ switch (typdef)
+ {
+ case tnone:
+ if (toktype == st_C_typedef)
+ {
+ if (typedefs)
+ typdef = tkeyseen;
+ fvextern = false;
+ fvdef = fvnone;
+ return false;
+ }
+ break;
+ case tkeyseen:
+ switch (toktype)
+ {
+ case st_none:
+ case st_C_class:
+ case st_C_struct:
+ case st_C_enum:
+ typdef = ttypeseen;
+ }
+ break;
+ case ttypeseen:
+ if (structdef == snone && fvdef == fvnone)
+ {
+ fvdef = fvnameseen;
+ return true;
+ }
+ break;
+ case tend:
+ switch (toktype)
+ {
+ case st_C_class:
+ case st_C_struct:
+ case st_C_enum:
+ return false;
+ }
+ return true;
+ }
+
+ switch (toktype)
+ {
+ case st_C_javastruct:
+ if (structdef == stagseen)
+ structdef = scolonseen;
+ return false;
+ case st_C_template:
+ case st_C_class:
+ if ((*c_extp & C_AUTO) /* automatic detection of C++ language */
+ && bracelev == 0
+ && definedef == dnone && structdef == snone
+ && typdef == tnone && fvdef == fvnone)
+ *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
+ if (toktype == st_C_template)
+ break;
+ /* FALLTHRU */
+ case st_C_struct:
+ case st_C_enum:
+ if (parlev == 0
+ && fvdef != vignore
+ && (typdef == tkeyseen
+ || (typedefs_or_cplusplus && structdef == snone)))
+ {
+ structdef = skeyseen;
+ structtype = toktype;
+ structbracelev = bracelev;
+ if (fvdef == fvnameseen)
+ fvdef = fvnone;
+ }
+ return false;
+ }
+
+ if (structdef == skeyseen)
+ {
+ structdef = stagseen;
+ return true;
+ }
+
+ if (typdef != tnone)
+ definedef = dnone;
+
+ /* Detect Objective C constructs. */
+ switch (objdef)
+ {
+ case onone:
+ switch (toktype)
+ {
+ case st_C_objprot:
+ objdef = oprotocol;
+ return false;
+ case st_C_objimpl:
+ objdef = oimplementation;
+ return false;
+ }
+ break;
+ case oimplementation:
+ /* Save the class tag for functions or variables defined inside. */
+ objtag = savenstr (str, len);
+ objdef = oinbody;
+ return false;
+ case oprotocol:
+ /* Save the class tag for categories. */
+ objtag = savenstr (str, len);
+ objdef = otagseen;
+ *is_func_or_var = true;
+ return true;
+ case oparenseen:
+ objdef = ocatseen;
+ *is_func_or_var = true;
+ return true;
+ case oinbody:
+ break;
+ case omethodsign:
+ if (parlev == 0)
+ {
+ fvdef = fvnone;
+ objdef = omethodtag;
+ linebuffer_setlen (&token_name, len);
+ memcpy (token_name.buffer, str, len);
+ token_name.buffer[len] = '\0';
+ return true;
+ }
+ return false;
+ case omethodcolon:
+ if (parlev == 0)
+ objdef = omethodparm;
+ return false;
+ case omethodparm:
+ if (parlev == 0)
+ {
+ int oldlen = token_name.len;
+ fvdef = fvnone;
+ objdef = omethodtag;
+ linebuffer_setlen (&token_name, oldlen + len);
+ memcpy (token_name.buffer + oldlen, str, len);
+ token_name.buffer[oldlen + len] = '\0';
+ return true;
+ }
+ return false;
+ case oignore:
+ if (toktype == st_C_objend)
+ {
+ /* Memory leakage here: the string pointed by objtag is
+ never released, because many tests would be needed to
+ avoid breaking on incorrect input code. The amount of
+ memory leaked here is the sum of the lengths of the
+ class tags.
+ free (objtag); */
+ objdef = onone;
+ }
+ return false;
+ }
+
+ /* A function, variable or enum constant? */
+ switch (toktype)
+ {
+ case st_C_extern:
+ fvextern = true;
+ switch (fvdef)
+ {
+ case finlist:
+ case flistseen:
+ case fignore:
+ case vignore:
+ break;
+ default:
+ fvdef = fvnone;
+ }
+ return false;
+ case st_C_ignore:
+ fvextern = false;
+ fvdef = vignore;
+ return false;
+ case st_C_operator:
+ fvdef = foperator;
+ *is_func_or_var = true;
+ return true;
+ case st_none:
+ if (constantypedefs
+ && structdef == snone
+ && structtype == st_C_enum && bracelev > structbracelev
+ /* Don't tag tokens in expressions that assign values to enum
+ constants. */
+ && fvdef != vignore)
+ return true; /* enum constant */
+ switch (fvdef)
+ {
+ case fdefunkey:
+ if (bracelev > 0)
+ break;
+ fvdef = fdefunname; /* GNU macro */
+ *is_func_or_var = true;
+ return true;
+ case fvnone:
+ switch (typdef)
+ {
+ case ttypeseen:
+ return false;
+ case tnone:
+ if ((strneq (str, "asm", 3) && endtoken (str[3]))
+ || (strneq (str, "__asm__", 7) && endtoken (str[7])))
+ {
+ fvdef = vignore;
+ return false;
+ }
+ break;
+ }
+ /* FALLTHRU */
+ case fvnameseen:
+ if (len >= 10 && strneq (str+len-10, "::operator", 10))
+ {
+ if (*c_extp & C_AUTO) /* automatic detection of C++ */
+ *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
+ fvdef = foperator;
+ *is_func_or_var = true;
+ return true;
+ }
+ if (bracelev > 0 && !instruct)
+ break;
+ fvdef = fvnameseen; /* function or variable */
+ *is_func_or_var = true;
+ return true;
+ }
+ break;
+ }
+
+ return false;
+}
+
+
+/*
+ * C_entries often keeps pointers to tokens or lines which are older than
+ * the line currently read. By keeping two line buffers, and switching
+ * them at end of line, it is possible to use those pointers.
+ */
+static struct
+{
+ long linepos;
+ linebuffer lb;
+} lbs[2];
+
+#define current_lb_is_new (newndx == curndx)
+#define switch_line_buffers() (curndx = 1 - curndx)
+
+#define curlb (lbs[curndx].lb)
+#define newlb (lbs[newndx].lb)
+#define curlinepos (lbs[curndx].linepos)
+#define newlinepos (lbs[newndx].linepos)
+
+#define plainc ((c_ext & C_EXT) == C_PLAIN)
+#define cplpl (c_ext & C_PLPL)
+#define cjava ((c_ext & C_JAVA) == C_JAVA)
+
+#define CNL_SAVE_DEFINEDEF() \
+do { \
+ curlinepos = charno; \
+ readline (&curlb, inf); \
+ lp = curlb.buffer; \
+ quotednl = false; \
+ newndx = curndx; \
+} while (0)
+
+#define CNL() \
+do { \
+ CNL_SAVE_DEFINEDEF(); \
+ if (savetoken.valid) \
+ { \
+ token = savetoken; \
+ savetoken.valid = false; \
+ } \
+ definedef = dnone; \
+} while (0)
+
+
+static void
+make_C_tag (bool isfun)
+{
+ /* This function is never called when token.valid is false, but
+ we must protect against invalid input or internal errors. */
+ if (token.valid)
+ make_tag (token_name.buffer, token_name.len, isfun, token.line,
+ token.offset+token.length+1, token.lineno, token.linepos);
+ else if (DEBUG)
+ { /* this branch is optimized away if !DEBUG */
+ make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""),
+ token_name.len + 17, isfun, token.line,
+ token.offset+token.length+1, token.lineno, token.linepos);
+ error ("INVALID TOKEN");
+ }
+
+ token.valid = false;
+}
+
+
+/*
+ * C_entries ()
+ * This routine finds functions, variables, typedefs,
+ * #define's, enum constants and struct/union/enum definitions in
+ * C syntax and adds them to the list.
+ */
+static void
+C_entries (int c_ext, FILE *inf)
+ /* extension of C */
+ /* input file */
+{
+ register char c; /* latest char read; '\0' for end of line */
+ register char *lp; /* pointer one beyond the character `c' */
+ int curndx, newndx; /* indices for current and new lb */
+ register int tokoff; /* offset in line of start of current token */
+ register int toklen; /* length of current token */
+ const char *qualifier; /* string used to qualify names */
+ int qlen; /* length of qualifier */
+ int bracelev; /* current brace level */
+ int bracketlev; /* current bracket level */
+ int parlev; /* current parenthesis level */
+ int attrparlev; /* __attribute__ parenthesis level */
+ int templatelev; /* current template level */
+ int typdefbracelev; /* bracelev where a typedef struct body begun */
+ bool incomm, inquote, inchar, quotednl, midtoken;
+ bool yacc_rules; /* in the rules part of a yacc file */
+ struct tok savetoken = {0}; /* token saved during preprocessor handling */
+
+
+ linebuffer_init (&lbs[0].lb);
+ linebuffer_init (&lbs[1].lb);
+ if (cstack.size == 0)
+ {
+ cstack.size = (DEBUG) ? 1 : 4;
+ cstack.nl = 0;
+ cstack.cname = xnew (cstack.size, char *);
+ cstack.bracelev = xnew (cstack.size, int);
+ }
+
+ tokoff = toklen = typdefbracelev = 0; /* keep compiler quiet */
+ curndx = newndx = 0;
+ lp = curlb.buffer;
+ *lp = 0;
+
+ fvdef = fvnone; fvextern = false; typdef = tnone;
+ structdef = snone; definedef = dnone; objdef = onone;
+ yacc_rules = false;
+ midtoken = inquote = inchar = incomm = quotednl = false;
+ token.valid = savetoken.valid = false;
+ bracelev = bracketlev = parlev = attrparlev = templatelev = 0;
+ if (cjava)
+ { qualifier = "."; qlen = 1; }
+ else
+ { qualifier = "::"; qlen = 2; }
+
+
+ while (!feof (inf))
+ {
+ c = *lp++;
+ if (c == '\\')
+ {
+ /* If we are at the end of the line, the next character is a
+ '\0'; do not skip it, because it is what tells us
+ to read the next line. */
+ if (*lp == '\0')
+ {
+ quotednl = true;
+ continue;
+ }
+ lp++;
+ c = ' ';
+ }
+ else if (incomm)
+ {
+ switch (c)
+ {
+ case '*':
+ if (*lp == '/')
+ {
+ c = *lp++;
+ incomm = false;
+ }
+ break;
+ case '\0':
+ /* Newlines inside comments do not end macro definitions in
+ traditional cpp. */
+ CNL_SAVE_DEFINEDEF ();
+ break;
+ }
+ continue;
+ }
+ else if (inquote)
+ {
+ switch (c)
+ {
+ case '"':
+ inquote = false;
+ break;
+ case '\0':
+ /* Newlines inside strings do not end macro definitions
+ in traditional cpp, even though compilers don't
+ usually accept them. */
+ CNL_SAVE_DEFINEDEF ();
+ break;
+ }
+ continue;
+ }
+ else if (inchar)
+ {
+ switch (c)
+ {
+ case '\0':
+ /* Hmmm, something went wrong. */
+ CNL ();
+ /* FALLTHRU */
+ case '\'':
+ inchar = false;
+ break;
+ }
+ continue;
+ }
+ else switch (c)
+ {
+ case '"':
+ inquote = true;
+ if (bracketlev > 0)
+ continue;
+ if (inattribute)
+ break;
+ switch (fvdef)
+ {
+ case fdefunkey:
+ case fstartlist:
+ case finlist:
+ case fignore:
+ case vignore:
+ break;
+ default:
+ fvextern = false;
+ fvdef = fvnone;
+ }
+ continue;
+ case '\'':
+ inchar = true;
+ if (bracketlev > 0)
+ continue;
+ if (inattribute)
+ break;
+ if (fvdef != finlist && fvdef != fignore && fvdef != vignore)
+ {
+ fvextern = false;
+ fvdef = fvnone;
+ }
+ continue;
+ case '/':
+ if (*lp == '*')
+ {
+ incomm = true;
+ lp++;
+ c = ' ';
+ if (bracketlev > 0)
+ continue;
+ }
+ else if (/* cplpl && */ *lp == '/')
+ {
+ c = '\0';
+ }
+ break;
+ case '%':
+ if ((c_ext & YACC) && *lp == '%')
+ {
+ /* Entering or exiting rules section in yacc file. */
+ lp++;
+ definedef = dnone; fvdef = fvnone; fvextern = false;
+ typdef = tnone; structdef = snone;
+ midtoken = inquote = inchar = incomm = quotednl = false;
+ bracelev = 0;
+ yacc_rules = !yacc_rules;
+ continue;
+ }
+ else
+ break;
+ case '#':
+ if (definedef == dnone)
+ {
+ char *cp;
+ bool cpptoken = true;
+
+ /* Look back on this line. If all blanks, or nonblanks
+ followed by an end of comment, this is a preprocessor
+ token. */
+ for (cp = newlb.buffer; cp < lp-1; cp++)
+ if (!iswhite (*cp))
+ {
+ if (*cp == '*' && cp[1] == '/')
+ {
+ cp++;
+ cpptoken = true;
+ }
+ else
+ cpptoken = false;
+ }
+ if (cpptoken)
+ {
+ definedef = dsharpseen;
+ /* This is needed for tagging enum values: when there are
+ preprocessor conditionals inside the enum, we need to
+ reset the value of fvdef so that the next enum value is
+ tagged even though the one before it did not end in a
+ comma. */
+ if (fvdef == vignore && instruct && parlev == 0)
+ {
+ if (strneq (cp, "#if", 3) || strneq (cp, "#el", 3))
+ fvdef = fvnone;
+ }
+ }
+ } /* if (definedef == dnone) */
+ continue;
+ case '[':
+ bracketlev++;
+ continue;
+ default:
+ if (bracketlev > 0)
+ {
+ if (c == ']')
+ --bracketlev;
+ else if (c == '\0')
+ CNL_SAVE_DEFINEDEF ();
+ continue;
+ }
+ break;
+ } /* switch (c) */
+
+
+ /* Consider token only if some involved conditions are satisfied. */
+ if (typdef != tignore
+ && definedef != dignorerest
+ && fvdef != finlist
+ && templatelev == 0
+ && (definedef != dnone
+ || structdef != scolonseen)
+ && !inattribute)
+ {
+ if (midtoken)
+ {
+ if (endtoken (c))
+ {
+ if (c == ':' && *lp == ':' && begtoken (lp[1]))
+ /* This handles :: in the middle,
+ but not at the beginning of an identifier.
+ Also, space-separated :: is not recognized. */
+ {
+ if (c_ext & C_AUTO) /* automatic detection of C++ */
+ c_ext = (c_ext | C_PLPL) & ~C_AUTO;
+ lp += 2;
+ toklen += 2;
+ c = lp[-1];
+ goto still_in_token;
+ }
+ else
+ {
+ bool funorvar = false;
+
+ if (yacc_rules
+ || consider_token (newlb.buffer + tokoff, toklen, c,
+ &c_ext, bracelev, parlev,
+ &funorvar))
+ {
+ if (fvdef == foperator)
+ {
+ char *oldlp = lp;
+ lp = skip_spaces (lp-1);
+ if (*lp != '\0')
+ lp += 1;
+ while (*lp != '\0'
+ && !iswhite (*lp) && *lp != '(')
+ lp += 1;
+ c = *lp++;
+ toklen += lp - oldlp;
+ }
+ token.named = false;
+ if (!plainc
+ && nestlev > 0 && definedef == dnone)
+ /* in struct body */
+ {
+ int len;
+ write_classname (&token_name, qualifier);
+ len = token_name.len;
+ linebuffer_setlen (&token_name, len+qlen+toklen);
+ sprintf (token_name.buffer + len, "%s%.*s",
+ qualifier, toklen, newlb.buffer + tokoff);
+ token.named = true;
+ }
+ else if (objdef == ocatseen)
+ /* Objective C category */
+ {
+ int len = strlen (objtag) + 2 + toklen;
+ linebuffer_setlen (&token_name, len);
+ sprintf (token_name.buffer, "%s(%.*s)",
+ objtag, toklen, newlb.buffer + tokoff);
+ token.named = true;
+ }
+ else if (objdef == omethodtag
+ || objdef == omethodparm)
+ /* Objective C method */
+ {
+ token.named = true;
+ }
+ else if (fvdef == fdefunname)
+ /* GNU DEFUN and similar macros */
+ {
+ bool defun = (newlb.buffer[tokoff] == 'F');
+ int off = tokoff;
+ int len = toklen;
+
+ /* Rewrite the tag so that emacs lisp DEFUNs
+ can be found by their elisp name */
+ if (defun)
+ {
+ off += 1;
+ len -= 1;
+ }
+ linebuffer_setlen (&token_name, len);
+ memcpy (token_name.buffer,
+ newlb.buffer + off, len);
+ token_name.buffer[len] = '\0';
+ if (defun)
+ while (--len >= 0)
+ if (token_name.buffer[len] == '_')
+ token_name.buffer[len] = '-';
+ token.named = defun;
+ }
+ else
+ {
+ linebuffer_setlen (&token_name, toklen);
+ memcpy (token_name.buffer,
+ newlb.buffer + tokoff, toklen);
+ token_name.buffer[toklen] = '\0';
+ /* Name macros and members. */
+ token.named = (structdef == stagseen
+ || typdef == ttypeseen
+ || typdef == tend
+ || (funorvar
+ && definedef == dignorerest)
+ || (funorvar
+ && definedef == dnone
+ && structdef == snone
+ && bracelev > 0));
+ }
+ token.lineno = lineno;
+ token.offset = tokoff;
+ token.length = toklen;
+ token.line = newlb.buffer;
+ token.linepos = newlinepos;
+ token.valid = true;
+
+ if (definedef == dnone
+ && (fvdef == fvnameseen
+ || fvdef == foperator
+ || structdef == stagseen
+ || typdef == tend
+ || typdef == ttypeseen
+ || objdef != onone))
+ {
+ if (current_lb_is_new)
+ switch_line_buffers ();
+ }
+ else if (definedef != dnone
+ || fvdef == fdefunname
+ || instruct)
+ make_C_tag (funorvar);
+ }
+ else /* not yacc and consider_token failed */
+ {
+ if (inattribute && fvdef == fignore)
+ {
+ /* We have just met __attribute__ after a
+ function parameter list: do not tag the
+ function again. */
+ fvdef = fvnone;
+ }
+ }
+ midtoken = false;
+ }
+ } /* if (endtoken (c)) */
+ else if (intoken (c))
+ still_in_token:
+ {
+ toklen++;
+ continue;
+ }
+ } /* if (midtoken) */
+ else if (begtoken (c))
+ {
+ switch (definedef)
+ {
+ case dnone:
+ switch (fvdef)
+ {
+ case fstartlist:
+ /* This prevents tagging fb in
+ void (__attribute__((noreturn)) *fb) (void);
+ Fixing this is not easy and not very important. */
+ fvdef = finlist;
+ continue;
+ case flistseen:
+ if (plainc || declarations)
+ {
+ make_C_tag (true); /* a function */
+ fvdef = fignore;
+ }
+ break;
+ }
+ if (structdef == stagseen && !cjava)
+ {
+ popclass_above (bracelev);
+ structdef = snone;
+ }
+ break;
+ case dsharpseen:
+ savetoken = token;
+ break;
+ }
+ if (!yacc_rules || lp == newlb.buffer + 1)
+ {
+ tokoff = lp - 1 - newlb.buffer;
+ toklen = 1;
+ midtoken = true;
+ }
+ continue;
+ } /* if (begtoken) */
+ } /* if must look at token */
+
+
+ /* Detect end of line, colon, comma, semicolon and various braces
+ after having handled a token.*/
+ switch (c)
+ {
+ case ':':
+ if (inattribute)
+ break;
+ if (yacc_rules && token.offset == 0 && token.valid)
+ {
+ make_C_tag (false); /* a yacc function */
+ break;
+ }
+ if (definedef != dnone)
+ break;
+ switch (objdef)
+ {
+ case otagseen:
+ objdef = oignore;
+ make_C_tag (true); /* an Objective C class */
+ break;
+ case omethodtag:
+ case omethodparm:
+ objdef = omethodcolon;
+ int toklen = token_name.len;
+ linebuffer_setlen (&token_name, toklen + 1);
+ strcpy (token_name.buffer + toklen, ":");
+ break;
+ }
+ if (structdef == stagseen)
+ {
+ structdef = scolonseen;
+ break;
+ }
+ /* Should be useless, but may be work as a safety net. */
+ if (cplpl && fvdef == flistseen)
+ {
+ make_C_tag (true); /* a function */
+ fvdef = fignore;
+ break;
+ }
+ break;
+ case ';':
+ if (definedef != dnone || inattribute)
+ break;
+ switch (typdef)
+ {
+ case tend:
+ case ttypeseen:
+ make_C_tag (false); /* a typedef */
+ typdef = tnone;
+ fvdef = fvnone;
+ break;
+ case tnone:
+ case tinbody:
+ case tignore:
+ switch (fvdef)
+ {
+ case fignore:
+ if (typdef == tignore || cplpl)
+ fvdef = fvnone;
+ break;
+ case fvnameseen:
+ if ((globals && bracelev == 0 && (!fvextern || declarations))
+ || (members && instruct))
+ make_C_tag (false); /* a variable */
+ fvextern = false;
+ fvdef = fvnone;
+ token.valid = false;
+ break;
+ case flistseen:
+ if ((declarations
+ && (cplpl || !instruct)
+ && (typdef == tnone || (typdef != tignore && instruct)))
+ || (members
+ && plainc && instruct))
+ make_C_tag (true); /* a function */
+ /* FALLTHRU */
+ default:
+ fvextern = false;
+ fvdef = fvnone;
+ if (declarations
+ && cplpl && structdef == stagseen)
+ make_C_tag (false); /* forward declaration */
+ else
+ token.valid = false;
+ } /* switch (fvdef) */
+ /* FALLTHRU */
+ default:
+ if (!instruct)
+ typdef = tnone;
+ }
+ if (structdef == stagseen)
+ structdef = snone;
+ break;
+ case ',':
+ if (definedef != dnone || inattribute)
+ break;
+ switch (objdef)
+ {
+ case omethodtag:
+ case omethodparm:
+ make_C_tag (true); /* an Objective C method */
+ objdef = oinbody;
+ break;
+ }
+ switch (fvdef)
+ {
+ case fdefunkey:
+ case foperator:
+ case fstartlist:
+ case finlist:
+ case fignore:
+ break;
+ case vignore:
+ if (instruct && parlev == 0)
+ fvdef = fvnone;
+ break;
+ case fdefunname:
+ fvdef = fignore;
+ break;
+ case fvnameseen:
+ if (parlev == 0
+ && ((globals
+ && bracelev == 0
+ && templatelev == 0
+ && (!fvextern || declarations))
+ || (members && instruct)))
+ make_C_tag (false); /* a variable */
+ break;
+ case flistseen:
+ if ((declarations && typdef == tnone && !instruct)
+ || (members && typdef != tignore && instruct))
+ {
+ make_C_tag (true); /* a function */
+ fvdef = fvnameseen;
+ }
+ else if (!declarations)
+ fvdef = fvnone;
+ token.valid = false;
+ break;
+ default:
+ fvdef = fvnone;
+ }
+ if (structdef == stagseen)
+ structdef = snone;
+ break;
+ case ']':
+ if (definedef != dnone || inattribute)
+ break;
+ if (structdef == stagseen)
+ structdef = snone;
+ switch (typdef)
+ {
+ case ttypeseen:
+ case tend:
+ typdef = tignore;
+ make_C_tag (false); /* a typedef */
+ break;
+ case tnone:
+ case tinbody:
+ switch (fvdef)
+ {
+ case foperator:
+ case finlist:
+ case fignore:
+ case vignore:
+ break;
+ case fvnameseen:
+ if ((members && bracelev == 1)
+ || (globals && bracelev == 0
+ && (!fvextern || declarations)))
+ make_C_tag (false); /* a variable */
+ /* FALLTHRU */
+ default:
+ fvdef = fvnone;
+ }
+ break;
+ }
+ break;
+ case '(':
+ if (inattribute)
+ {
+ attrparlev++;
+ break;
+ }
+ if (definedef != dnone)
+ break;
+ if (objdef == otagseen && parlev == 0)
+ objdef = oparenseen;
+ switch (fvdef)
+ {
+ case fvnameseen:
+ if (typdef == ttypeseen
+ && *lp != '*'
+ && !instruct)
+ {
+ /* This handles constructs like:
+ typedef void OperatorFun (int fun); */
+ make_C_tag (false);
+ typdef = tignore;
+ fvdef = fignore;
+ break;
+ }
+ /* FALLTHRU */
+ case foperator:
+ fvdef = fstartlist;
+ break;
+ case flistseen:
+ fvdef = finlist;
+ break;
+ }
+ parlev++;
+ break;
+ case ')':
+ if (inattribute)
+ {
+ if (--attrparlev == 0)
+ inattribute = false;
+ break;
+ }
+ if (definedef != dnone)
+ break;
+ if (objdef == ocatseen && parlev == 1)
+ {
+ make_C_tag (true); /* an Objective C category */
+ objdef = oignore;
+ }
+ if (--parlev == 0)
+ {
+ switch (fvdef)
+ {
+ case fstartlist:
+ case finlist:
+ fvdef = flistseen;
+ break;
+ }
+ if (!instruct
+ && (typdef == tend
+ || typdef == ttypeseen))
+ {
+ typdef = tignore;
+ make_C_tag (false); /* a typedef */
+ }
+ }
+ else if (parlev < 0) /* can happen due to ill-conceived #if's. */
+ parlev = 0;
+ break;
+ case '{':
+ if (definedef != dnone)
+ break;
+ if (typdef == ttypeseen)
+ {
+ /* Whenever typdef is set to tinbody (currently only
+ here), typdefbracelev should be set to bracelev. */
+ typdef = tinbody;
+ typdefbracelev = bracelev;
+ }
+ switch (fvdef)
+ {
+ case flistseen:
+ make_C_tag (true); /* a function */
+ /* FALLTHRU */
+ case fignore:
+ fvdef = fvnone;
+ break;
+ case fvnone:
+ switch (objdef)
+ {
+ case otagseen:
+ make_C_tag (true); /* an Objective C class */
+ objdef = oignore;
+ break;
+ case omethodtag:
+ case omethodparm:
+ make_C_tag (true); /* an Objective C method */
+ objdef = oinbody;
+ break;
+ default:
+ /* Neutralize `extern "C" {' grot. */
+ if (bracelev == 0 && structdef == snone && nestlev == 0
+ && typdef == tnone)
+ bracelev = -1;
+ }
+ break;
+ }
+ switch (structdef)
+ {
+ case skeyseen: /* unnamed struct */
+ pushclass_above (bracelev, NULL, 0);
+ structdef = snone;
+ break;
+ case stagseen: /* named struct or enum */
+ case scolonseen: /* a class */
+ pushclass_above (bracelev,token.line+token.offset, token.length);
+ structdef = snone;
+ make_C_tag (false); /* a struct or enum */
+ break;
+ }
+ bracelev += 1;
+ break;
+ case '*':
+ if (definedef != dnone)
+ break;
+ if (fvdef == fstartlist)
+ {
+ fvdef = fvnone; /* avoid tagging `foo' in `foo (*bar()) ()' */
+ token.valid = false;
+ }
+ break;
+ case '}':
+ if (definedef != dnone)
+ break;
+ bracelev -= 1;
+ if (!ignoreindent && lp == newlb.buffer + 1)
+ {
+ if (bracelev != 0)
+ token.valid = false; /* unexpected value, token unreliable */
+ bracelev = 0; /* reset brace level if first column */
+ parlev = 0; /* also reset paren level, just in case... */
+ }
+ else if (bracelev < 0)
+ {
+ token.valid = false; /* something gone amiss, token unreliable */
+ bracelev = 0;
+ }
+ if (bracelev == 0 && fvdef == vignore)
+ fvdef = fvnone; /* end of function */
+ popclass_above (bracelev);
+ structdef = snone;
+ /* Only if typdef == tinbody is typdefbracelev significant. */
+ if (typdef == tinbody && bracelev <= typdefbracelev)
+ {
+ assert (bracelev == typdefbracelev);
+ typdef = tend;
+ }
+ break;
+ case '=':
+ if (definedef != dnone)
+ break;
+ switch (fvdef)
+ {
+ case foperator:
+ case finlist:
+ case fignore:
+ case vignore:
+ break;
+ case fvnameseen:
+ if ((members && bracelev == 1)
+ || (globals && bracelev == 0 && (!fvextern || declarations)))
+ make_C_tag (false); /* a variable */
+ /* FALLTHRU */
+ default:
+ fvdef = vignore;
+ }
+ break;
+ case '<':
+ if (cplpl
+ && (structdef == stagseen || fvdef == fvnameseen))
+ {
+ templatelev++;
+ break;
+ }
+ goto resetfvdef;
+ case '>':
+ if (templatelev > 0)
+ {
+ templatelev--;
+ break;
+ }
+ goto resetfvdef;
+ case '+':
+ case '-':
+ if (objdef == oinbody && bracelev == 0)
+ {
+ objdef = omethodsign;
+ break;
+ }
+ /* FALLTHRU */
+ resetfvdef:
+ case '#': case '~': case '&': case '%': case '/':
+ case '|': case '^': case '!': case '.': case '?':
+ if (definedef != dnone)
+ break;
+ /* These surely cannot follow a function tag in C. */
+ switch (fvdef)
+ {
+ case foperator:
+ case finlist:
+ case fignore:
+ case vignore:
+ break;
+ default:
+ fvdef = fvnone;
+ }
+ break;
+ case '\0':
+ if (objdef == otagseen)
+ {
+ make_C_tag (true); /* an Objective C class */
+ objdef = oignore;
+ }
+ /* If a macro spans multiple lines don't reset its state. */
+ if (quotednl)
+ CNL_SAVE_DEFINEDEF ();
+ else
+ CNL ();
+ break;
+ } /* switch (c) */
+
+ } /* while not eof */
+
+ free (lbs[0].lb.buffer);
+ free (lbs[1].lb.buffer);
+}
+
+/*
+ * Process either a C++ file or a C file depending on the setting
+ * of a global flag.
+ */
+static void
+default_C_entries (FILE *inf)
+{
+ C_entries (cplusplus ? C_PLPL : C_AUTO, inf);
+}
+
+/* Always do plain C. */
+static void
+plain_C_entries (FILE *inf)
+{
+ C_entries (0, inf);
+}
+
+/* Always do C++. */
+static void
+Cplusplus_entries (FILE *inf)
+{
+ C_entries (C_PLPL, inf);
+}
+
+/* Always do Java. */
+static void
+Cjava_entries (FILE *inf)
+{
+ C_entries (C_JAVA, inf);
+}
+
+/* Always do C*. */
+static void
+Cstar_entries (FILE *inf)
+{
+ C_entries (C_STAR, inf);
+}
+
+/* Always do Yacc. */
+static void
+Yacc_entries (FILE *inf)
+{
+ C_entries (YACC, inf);
+}
+
+
+/* Useful macros. */
+#define LOOP_ON_INPUT_LINES(file_pointer, line_buffer, char_pointer) \
+ for (; /* loop initialization */ \
+ !feof (file_pointer) /* loop test */ \
+ && /* instructions at start of loop */ \
+ (readline (&line_buffer, file_pointer), \
+ char_pointer = line_buffer.buffer, \
+ true); \
+ )
+
+#define LOOKING_AT(cp, kw) /* kw is the keyword, a literal string */ \
+ ((assert ("" kw), true) /* syntax error if not a literal string */ \
+ && strneq ((cp), kw, sizeof (kw)-1) /* cp points at kw */ \
+ && notinname ((cp)[sizeof (kw)-1]) /* end of kw */ \
+ && ((cp) = skip_spaces ((cp)+sizeof (kw)-1))) /* skip spaces */
+
+/* Similar to LOOKING_AT but does not use notinname, does not skip */
+#define LOOKING_AT_NOCASE(cp, kw) /* the keyword is a literal string */ \
+ ((assert ("" kw), true) /* syntax error if not a literal string */ \
+ && strncaseeq ((cp), kw, sizeof (kw)-1) /* cp points at kw */ \
+ && ((cp) += sizeof (kw)-1)) /* skip spaces */
+
+/*
+ * Read a file, but do no processing. This is used to do regexp
+ * matching on files that have no language defined.
+ */
+static void
+just_read_file (FILE *inf)
+{
+ while (!feof (inf))
+ readline (&lb, inf);
+}
+
+
+/* Fortran parsing */
+
+static void F_takeprec (void);
+static void F_getit (FILE *);
+
+static void
+F_takeprec (void)
+{
+ dbp = skip_spaces (dbp);
+ if (*dbp != '*')
+ return;
+ dbp++;
+ dbp = skip_spaces (dbp);
+ if (strneq (dbp, "(*)", 3))
+ {
+ dbp += 3;
+ return;
+ }
+ if (!ISDIGIT (*dbp))
+ {
+ --dbp; /* force failure */
+ return;
+ }
+ do
+ dbp++;
+ while (ISDIGIT (*dbp));
+}
+
+static void
+F_getit (FILE *inf)
+{
+ register char *cp;
+
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0')
+ {
+ readline (&lb, inf);
+ dbp = lb.buffer;
+ if (dbp[5] != '&')
+ return;
+ dbp += 6;
+ dbp = skip_spaces (dbp);
+ }
+ if (!ISALPHA (*dbp) && *dbp != '_' && *dbp != '$')
+ return;
+ for (cp = dbp + 1; *cp != '\0' && intoken (*cp); cp++)
+ continue;
+ make_tag (dbp, cp-dbp, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+}
+
+
+static void
+Fortran_functions (FILE *inf)
+{
+ LOOP_ON_INPUT_LINES (inf, lb, dbp)
+ {
+ if (*dbp == '%')
+ dbp++; /* Ratfor escape to fortran */
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0')
+ continue;
+
+ if (LOOKING_AT_NOCASE (dbp, "recursive"))
+ dbp = skip_spaces (dbp);
+
+ if (LOOKING_AT_NOCASE (dbp, "pure"))
+ dbp = skip_spaces (dbp);
+
+ if (LOOKING_AT_NOCASE (dbp, "elemental"))
+ dbp = skip_spaces (dbp);
+
+ switch (lowcase (*dbp))
+ {
+ case 'i':
+ if (nocase_tail ("integer"))
+ F_takeprec ();
+ break;
+ case 'r':
+ if (nocase_tail ("real"))
+ F_takeprec ();
+ break;
+ case 'l':
+ if (nocase_tail ("logical"))
+ F_takeprec ();
+ break;
+ case 'c':
+ if (nocase_tail ("complex") || nocase_tail ("character"))
+ F_takeprec ();
+ break;
+ case 'd':
+ if (nocase_tail ("double"))
+ {
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0')
+ continue;
+ if (nocase_tail ("precision"))
+ break;
+ continue;
+ }
+ break;
+ }
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0')
+ continue;
+ switch (lowcase (*dbp))
+ {
+ case 'f':
+ if (nocase_tail ("function"))
+ F_getit (inf);
+ continue;
+ case 's':
+ if (nocase_tail ("subroutine"))
+ F_getit (inf);
+ continue;
+ case 'e':
+ if (nocase_tail ("entry"))
+ F_getit (inf);
+ continue;
+ case 'b':
+ if (nocase_tail ("blockdata") || nocase_tail ("block data"))
+ {
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0') /* assume un-named */
+ make_tag ("blockdata", 9, true,
+ lb.buffer, dbp - lb.buffer, lineno, linecharno);
+ else
+ F_getit (inf); /* look for name */
+ }
+ continue;
+ }
+ }
+}
+
+
+/*
+ * Ada parsing
+ * Original code by
+ * Philippe Waroquiers (1998)
+ */
+
+/* Once we are positioned after an "interesting" keyword, let's get
+ the real tag value necessary. */
+static void
+Ada_getit (FILE *inf, const char *name_qualifier)
+{
+ register char *cp;
+ char *name;
+ char c;
+
+ while (!feof (inf))
+ {
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0'
+ || (dbp[0] == '-' && dbp[1] == '-'))
+ {
+ readline (&lb, inf);
+ dbp = lb.buffer;
+ }
+ switch (lowcase (*dbp))
+ {
+ case 'b':
+ if (nocase_tail ("body"))
+ {
+ /* Skipping body of procedure body or package body or ....
+ resetting qualifier to body instead of spec. */
+ name_qualifier = "/b";
+ continue;
+ }
+ break;
+ case 't':
+ /* Skipping type of task type or protected type ... */
+ if (nocase_tail ("type"))
+ continue;
+ break;
+ }
+ if (*dbp == '"')
+ {
+ dbp += 1;
+ for (cp = dbp; *cp != '\0' && *cp != '"'; cp++)
+ continue;
+ }
+ else
+ {
+ dbp = skip_spaces (dbp);
+ for (cp = dbp;
+ (*cp != '\0'
+ && (ISALPHA (*cp) || ISDIGIT (*cp) || *cp == '_' || *cp == '.'));
+ cp++)
+ continue;
+ if (cp == dbp)
+ return;
+ }
+ c = *cp;
+ *cp = '\0';
+ name = concat (dbp, name_qualifier, "");
+ *cp = c;
+ make_tag (name, strlen (name), true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ free (name);
+ if (c == '"')
+ dbp = cp + 1;
+ return;
+ }
+}
+
+static void
+Ada_funcs (FILE *inf)
+{
+ bool inquote = false;
+ bool skip_till_semicolumn = false;
+
+ LOOP_ON_INPUT_LINES (inf, lb, dbp)
+ {
+ while (*dbp != '\0')
+ {
+ /* Skip a string i.e. "abcd". */
+ if (inquote || (*dbp == '"'))
+ {
+ dbp = strchr (dbp + !inquote, '"');
+ if (dbp != NULL)
+ {
+ inquote = false;
+ dbp += 1;
+ continue; /* advance char */
+ }
+ else
+ {
+ inquote = true;
+ break; /* advance line */
+ }
+ }
+
+ /* Skip comments. */
+ if (dbp[0] == '-' && dbp[1] == '-')
+ break; /* advance line */
+
+ /* Skip character enclosed in single quote i.e. 'a'
+ and skip single quote starting an attribute i.e. 'Image. */
+ if (*dbp == '\'')
+ {
+ dbp++ ;
+ if (*dbp != '\0')
+ dbp++;
+ continue;
+ }
+
+ if (skip_till_semicolumn)
+ {
+ if (*dbp == ';')
+ skip_till_semicolumn = false;
+ dbp++;
+ continue; /* advance char */
+ }
+
+ /* Search for beginning of a token. */
+ if (!begtoken (*dbp))
+ {
+ dbp++;
+ continue; /* advance char */
+ }
+
+ /* We are at the beginning of a token. */
+ switch (lowcase (*dbp))
+ {
+ case 'f':
+ if (!packages_only && nocase_tail ("function"))
+ Ada_getit (inf, "/f");
+ else
+ break; /* from switch */
+ continue; /* advance char */
+ case 'p':
+ if (!packages_only && nocase_tail ("procedure"))
+ Ada_getit (inf, "/p");
+ else if (nocase_tail ("package"))
+ Ada_getit (inf, "/s");
+ else if (nocase_tail ("protected")) /* protected type */
+ Ada_getit (inf, "/t");
+ else
+ break; /* from switch */
+ continue; /* advance char */
+
+ case 'u':
+ if (typedefs && !packages_only && nocase_tail ("use"))
+ {
+ /* when tagging types, avoid tagging use type Pack.Typename;
+ for this, we will skip everything till a ; */
+ skip_till_semicolumn = true;
+ continue; /* advance char */
+ }
+
+ case 't':
+ if (!packages_only && nocase_tail ("task"))
+ Ada_getit (inf, "/k");
+ else if (typedefs && !packages_only && nocase_tail ("type"))
+ {
+ Ada_getit (inf, "/t");
+ while (*dbp != '\0')
+ dbp += 1;
+ }
+ else
+ break; /* from switch */
+ continue; /* advance char */
+ }
+
+ /* Look for the end of the token. */
+ while (!endtoken (*dbp))
+ dbp++;
+
+ } /* advance char */
+ } /* advance line */
+}
+
+
+/*
+ * Unix and microcontroller assembly tag handling
+ * Labels: /^[a-zA-Z_.$][a-zA_Z0-9_.$]*[: ^I^J]/
+ * Idea by Bob Weiner, Motorola Inc. (1994)
+ */
+static void
+Asm_labels (FILE *inf)
+{
+ register char *cp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ /* If first char is alphabetic or one of [_.$], test for colon
+ following identifier. */
+ if (ISALPHA (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
+ {
+ /* Read past label. */
+ cp++;
+ while (ISALNUM (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
+ cp++;
+ if (*cp == ':' || iswhite (*cp))
+ /* Found end of label, so copy it and add it to the table. */
+ make_tag (lb.buffer, cp - lb.buffer, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ }
+}
+
+
+/*
+ * Perl support
+ * Perl sub names: /^sub[ \t\n]+[^ \t\n{]+/
+ * /^use constant[ \t\n]+[^ \t\n{=,;]+/
+ * Perl variable names: /^(my|local).../
+ * Original code by Bart Robinson <lomew@cs.utah.edu> (1995)
+ * Additions by Michael Ernst <mernst@alum.mit.edu> (1997)
+ * Ideas by Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE> (2001)
+ */
+static void
+Perl_functions (FILE *inf)
+{
+ char *package = savestr ("main"); /* current package name */
+ register char *cp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ cp = skip_spaces (cp);
+
+ if (LOOKING_AT (cp, "package"))
+ {
+ free (package);
+ get_tag (cp, &package);
+ }
+ else if (LOOKING_AT (cp, "sub"))
+ {
+ char *pos, *sp;
+
+ subr:
+ sp = cp;
+ while (!notinname (*cp))
+ cp++;
+ if (cp == sp)
+ continue; /* nothing found */
+ if ((pos = strchr (sp, ':')) != NULL
+ && pos < cp && pos[1] == ':')
+ /* The name is already qualified. */
+ make_tag (sp, cp - sp, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ else
+ /* Qualify it. */
+ {
+ char savechar, *name;
+
+ savechar = *cp;
+ *cp = '\0';
+ name = concat (package, "::", sp);
+ *cp = savechar;
+ make_tag (name, strlen (name), true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ free (name);
+ }
+ }
+ else if (LOOKING_AT (cp, "use constant")
+ || LOOKING_AT (cp, "use constant::defer"))
+ {
+ /* For hash style multi-constant like
+ use constant { FOO => 123,
+ BAR => 456 };
+ only the first FOO is picked up. Parsing across the value
+ expressions would be difficult in general, due to possible nested
+ hashes, here-documents, etc. */
+ if (*cp == '{')
+ cp = skip_spaces (cp+1);
+ goto subr;
+ }
+ else if (globals) /* only if we are tagging global vars */
+ {
+ /* Skip a qualifier, if any. */
+ bool qual = LOOKING_AT (cp, "my") || LOOKING_AT (cp, "local");
+ /* After "my" or "local", but before any following paren or space. */
+ char *varstart = cp;
+
+ if (qual /* should this be removed? If yes, how? */
+ && (*cp == '$' || *cp == '@' || *cp == '%'))
+ {
+ varstart += 1;
+ do
+ cp++;
+ while (ISALNUM (*cp) || *cp == '_');
+ }
+ else if (qual)
+ {
+ /* Should be examining a variable list at this point;
+ could insist on seeing an open parenthesis. */
+ while (*cp != '\0' && *cp != ';' && *cp != '=' && *cp != ')')
+ cp++;
+ }
+ else
+ continue;
+
+ make_tag (varstart, cp - varstart, false,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ }
+ free (package);
+}
+
+
+/*
+ * Python support
+ * Look for /^[\t]*def[ \t\n]+[^ \t\n(:]+/ or /^class[ \t\n]+[^ \t\n(:]+/
+ * Idea by Eric S. Raymond <esr@thyrsus.com> (1997)
+ * More ideas by seb bacon <seb@jamkit.com> (2002)
+ */
+static void
+Python_functions (FILE *inf)
+{
+ register char *cp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ cp = skip_spaces (cp);
+ if (LOOKING_AT (cp, "def") || LOOKING_AT (cp, "class"))
+ {
+ char *name = cp;
+ while (!notinname (*cp) && *cp != ':')
+ cp++;
+ make_tag (name, cp - name, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ }
+}
+
+
+/*
+ * PHP support
+ * Look for:
+ * - /^[ \t]*function[ \t\n]+[^ \t\n(]+/
+ * - /^[ \t]*class[ \t\n]+[^ \t\n]+/
+ * - /^[ \t]*define\(\"[^\"]+/
+ * Only with --members:
+ * - /^[ \t]*var[ \t\n]+\$[^ \t\n=;]/
+ * Idea by Diez B. Roggisch (2001)
+ */
+static void
+PHP_functions (FILE *inf)
+{
+ char *cp, *name;
+ bool search_identifier = false;
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ cp = skip_spaces (cp);
+ name = cp;
+ if (search_identifier
+ && *cp != '\0')
+ {
+ while (!notinname (*cp))
+ cp++;
+ make_tag (name, cp - name, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ search_identifier = false;
+ }
+ else if (LOOKING_AT (cp, "function"))
+ {
+ if (*cp == '&')
+ cp = skip_spaces (cp+1);
+ if (*cp != '\0')
+ {
+ name = cp;
+ while (!notinname (*cp))
+ cp++;
+ make_tag (name, cp - name, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ else
+ search_identifier = true;
+ }
+ else if (LOOKING_AT (cp, "class"))
+ {
+ if (*cp != '\0')
+ {
+ name = cp;
+ while (*cp != '\0' && !iswhite (*cp))
+ cp++;
+ make_tag (name, cp - name, false,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ else
+ search_identifier = true;
+ }
+ else if (strneq (cp, "define", 6)
+ && (cp = skip_spaces (cp+6))
+ && *cp++ == '('
+ && (*cp == '"' || *cp == '\''))
+ {
+ char quote = *cp++;
+ name = cp;
+ while (*cp != quote && *cp != '\0')
+ cp++;
+ make_tag (name, cp - name, false,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ else if (members
+ && LOOKING_AT (cp, "var")
+ && *cp == '$')
+ {
+ name = cp;
+ while (!notinname (*cp))
+ cp++;
+ make_tag (name, cp - name, false,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+ }
+}
+
+
+/*
+ * Cobol tag functions
+ * We could look for anything that could be a paragraph name.
+ * i.e. anything that starts in column 8 is one word and ends in a full stop.
+ * Idea by Corny de Souza (1993)
+ */
+static void
+Cobol_paragraphs (FILE *inf)
+{
+ register char *bp, *ep;
+
+ LOOP_ON_INPUT_LINES (inf, lb, bp)
+ {
+ if (lb.len < 9)
+ continue;
+ bp += 8;
+
+ /* If eoln, compiler option or comment ignore whole line. */
+ if (bp[-1] != ' ' || !ISALNUM (bp[0]))
+ continue;
+
+ for (ep = bp; ISALNUM (*ep) || *ep == '-'; ep++)
+ continue;
+ if (*ep++ == '.')
+ make_tag (bp, ep - bp, true,
+ lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
+ }
+}
+
+
+/*
+ * Makefile support
+ * Ideas by Assar Westerlund <assar@sics.se> (2001)
+ */
+static void
+Makefile_targets (FILE *inf)
+{
+ register char *bp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, bp)
+ {
+ if (*bp == '\t' || *bp == '#')
+ continue;
+ while (*bp != '\0' && *bp != '=' && *bp != ':')
+ bp++;
+ if (*bp == ':' || (globals && *bp == '='))
+ {
+ /* We should detect if there is more than one tag, but we do not.
+ We just skip initial and final spaces. */
+ char * namestart = skip_spaces (lb.buffer);
+ while (--bp > namestart)
+ if (!notinname (*bp))
+ break;
+ make_tag (namestart, bp - namestart + 1, true,
+ lb.buffer, bp - lb.buffer + 2, lineno, linecharno);
+ }
+ }
+}
+
+
+/*
+ * Pascal parsing
+ * Original code by Mosur K. Mohan (1989)
+ *
+ * Locates tags for procedures & functions. Doesn't do any type- or
+ * var-definitions. It does look for the keyword "extern" or
+ * "forward" immediately following the procedure statement; if found,
+ * the tag is skipped.
+ */
+static void
+Pascal_functions (FILE *inf)
+{
+ linebuffer tline; /* mostly copied from C_entries */
+ long save_lcno;
+ int save_lineno, namelen, taglen;
+ char c, *name;
+
+ bool /* each of these flags is true if: */
+ incomment, /* point is inside a comment */
+ inquote, /* point is inside '..' string */
+ get_tagname, /* point is after PROCEDURE/FUNCTION
+ keyword, so next item = potential tag */
+ found_tag, /* point is after a potential tag */
+ inparms, /* point is within parameter-list */
+ verify_tag; /* point has passed the parm-list, so the
+ next token will determine whether this
+ is a FORWARD/EXTERN to be ignored, or
+ whether it is a real tag */
+
+ save_lcno = save_lineno = namelen = taglen = 0; /* keep compiler quiet */
+ name = NULL; /* keep compiler quiet */
+ dbp = lb.buffer;
+ *dbp = '\0';
+ linebuffer_init (&tline);
+
+ incomment = inquote = false;
+ found_tag = false; /* have a proc name; check if extern */
+ get_tagname = false; /* found "procedure" keyword */
+ inparms = false; /* found '(' after "proc" */
+ verify_tag = false; /* check if "extern" is ahead */
+
+
+ while (!feof (inf)) /* long main loop to get next char */
+ {
+ c = *dbp++;
+ if (c == '\0') /* if end of line */
+ {
+ readline (&lb, inf);
+ dbp = lb.buffer;
+ if (*dbp == '\0')
+ continue;
+ if (!((found_tag && verify_tag)
+ || get_tagname))
+ c = *dbp++; /* only if don't need *dbp pointing
+ to the beginning of the name of
+ the procedure or function */
+ }
+ if (incomment)
+ {
+ if (c == '}') /* within { } comments */
+ incomment = false;
+ else if (c == '*' && *dbp == ')') /* within (* *) comments */
+ {
+ dbp++;
+ incomment = false;
+ }
+ continue;
+ }
+ else if (inquote)
+ {
+ if (c == '\'')
+ inquote = false;
+ continue;
+ }
+ else
+ switch (c)
+ {
+ case '\'':
+ inquote = true; /* found first quote */
+ continue;
+ case '{': /* found open { comment */
+ incomment = true;
+ continue;
+ case '(':
+ if (*dbp == '*') /* found open (* comment */
+ {
+ incomment = true;
+ dbp++;
+ }
+ else if (found_tag) /* found '(' after tag, i.e., parm-list */
+ inparms = true;
+ continue;
+ case ')': /* end of parms list */
+ if (inparms)
+ inparms = false;
+ continue;
+ case ';':
+ if (found_tag && !inparms) /* end of proc or fn stmt */
+ {
+ verify_tag = true;
+ break;
+ }
+ continue;
+ }
+ if (found_tag && verify_tag && (*dbp != ' '))
+ {
+ /* Check if this is an "extern" declaration. */
+ if (*dbp == '\0')
+ continue;
+ if (lowcase (*dbp) == 'e')
+ {
+ if (nocase_tail ("extern")) /* superfluous, really! */
+ {
+ found_tag = false;
+ verify_tag = false;
+ }
+ }
+ else if (lowcase (*dbp) == 'f')
+ {
+ if (nocase_tail ("forward")) /* check for forward reference */
+ {
+ found_tag = false;
+ verify_tag = false;
+ }
+ }
+ if (found_tag && verify_tag) /* not external proc, so make tag */
+ {
+ found_tag = false;
+ verify_tag = false;
+ make_tag (name, namelen, true,
+ tline.buffer, taglen, save_lineno, save_lcno);
+ continue;
+ }
+ }
+ if (get_tagname) /* grab name of proc or fn */
+ {
+ char *cp;
+
+ if (*dbp == '\0')
+ continue;
+
+ /* Find block name. */
+ for (cp = dbp + 1; *cp != '\0' && !endtoken (*cp); cp++)
+ continue;
+
+ /* Save all values for later tagging. */
+ linebuffer_setlen (&tline, lb.len);
+ strcpy (tline.buffer, lb.buffer);
+ save_lineno = lineno;
+ save_lcno = linecharno;
+ name = tline.buffer + (dbp - lb.buffer);
+ namelen = cp - dbp;
+ taglen = cp - lb.buffer + 1;
+
+ dbp = cp; /* set dbp to e-o-token */
+ get_tagname = false;
+ found_tag = true;
+ continue;
+
+ /* And proceed to check for "extern". */
+ }
+ else if (!incomment && !inquote && !found_tag)
+ {
+ /* Check for proc/fn keywords. */
+ switch (lowcase (c))
+ {
+ case 'p':
+ if (nocase_tail ("rocedure")) /* c = 'p', dbp has advanced */
+ get_tagname = true;
+ continue;
+ case 'f':
+ if (nocase_tail ("unction"))
+ get_tagname = true;
+ continue;
+ }
+ }
+ } /* while not eof */
+
+ free (tline.buffer);
+}
+
+
+/*
+ * Lisp tag functions
+ * look for (def or (DEF, quote or QUOTE
+ */
+
+static void L_getit (void);
+
+static void
+L_getit (void)
+{
+ if (*dbp == '\'') /* Skip prefix quote */
+ dbp++;
+ else if (*dbp == '(')
+ {
+ dbp++;
+ /* Try to skip "(quote " */
+ if (!LOOKING_AT (dbp, "quote") && !LOOKING_AT (dbp, "QUOTE"))
+ /* Ok, then skip "(" before name in (defstruct (foo)) */
+ dbp = skip_spaces (dbp);
+ }
+ get_tag (dbp, NULL);
+}
+
+static void
+Lisp_functions (FILE *inf)
+{
+ LOOP_ON_INPUT_LINES (inf, lb, dbp)
+ {
+ if (dbp[0] != '(')
+ continue;
+
+ /* "(defvar foo)" is a declaration rather than a definition. */
+ if (! declarations)
+ {
+ char *p = dbp + 1;
+ if (LOOKING_AT (p, "defvar"))
+ {
+ p = skip_name (p); /* past var name */
+ p = skip_spaces (p);
+ if (*p == ')')
+ continue;
+ }
+ }
+
+ if (strneq (dbp + 1, "cl-", 3) || strneq (dbp + 1, "CL-", 3))
+ dbp += 3;
+
+ if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
+ {
+ dbp = skip_non_spaces (dbp);
+ dbp = skip_spaces (dbp);
+ L_getit ();
+ }
+ else
+ {
+ /* Check for (foo::defmumble name-defined ... */
+ do
+ dbp++;
+ while (!notinname (*dbp) && *dbp != ':');
+ if (*dbp == ':')
+ {
+ do
+ dbp++;
+ while (*dbp == ':');
+
+ if (strneq (dbp, "def", 3) || strneq (dbp, "DEF", 3))
+ {
+ dbp = skip_non_spaces (dbp);
+ dbp = skip_spaces (dbp);
+ L_getit ();
+ }
+ }
+ }
+ }
+}
+
+
+/*
+ * Lua script language parsing
+ * Original code by David A. Capello <dacap@users.sourceforge.net> (2004)
+ *
+ * "function" and "local function" are tags if they start at column 1.
+ */
+static void
+Lua_functions (FILE *inf)
+{
+ register char *bp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, bp)
+ {
+ if (bp[0] != 'f' && bp[0] != 'l')
+ continue;
+
+ (void)LOOKING_AT (bp, "local"); /* skip possible "local" */
+
+ if (LOOKING_AT (bp, "function"))
+ get_tag (bp, NULL);
+ }
+}
+
+
+/*
+ * PostScript tags
+ * Just look for lines where the first character is '/'
+ * Also look at "defineps" for PSWrap
+ * Ideas by:
+ * Richard Mlynarik <mly@adoc.xerox.com> (1997)
+ * Masatake Yamato <masata-y@is.aist-nara.ac.jp> (1999)
+ */
+static void
+PS_functions (FILE *inf)
+{
+ register char *bp, *ep;
+
+ LOOP_ON_INPUT_LINES (inf, lb, bp)
+ {
+ if (bp[0] == '/')
+ {
+ for (ep = bp+1;
+ *ep != '\0' && *ep != ' ' && *ep != '{';
+ ep++)
+ continue;
+ make_tag (bp, ep - bp, true,
+ lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
+ }
+ else if (LOOKING_AT (bp, "defineps"))
+ get_tag (bp, NULL);
+ }
+}
+
+
+/*
+ * Forth tags
+ * Ignore anything after \ followed by space or in ( )
+ * Look for words defined by :
+ * Look for constant, code, create, defer, value, and variable
+ * OBP extensions: Look for buffer:, field,
+ * Ideas by Eduardo Horvath <eeh@netbsd.org> (2004)
+ */
+static void
+Forth_words (FILE *inf)
+{
+ register char *bp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, bp)
+ while ((bp = skip_spaces (bp))[0] != '\0')
+ if (bp[0] == '\\' && iswhite (bp[1]))
+ break; /* read next line */
+ else if (bp[0] == '(' && iswhite (bp[1]))
+ do /* skip to ) or eol */
+ bp++;
+ while (*bp != ')' && *bp != '\0');
+ else if ((bp[0] == ':' && iswhite (bp[1]) && bp++)
+ || LOOKING_AT_NOCASE (bp, "constant")
+ || LOOKING_AT_NOCASE (bp, "code")
+ || LOOKING_AT_NOCASE (bp, "create")
+ || LOOKING_AT_NOCASE (bp, "defer")
+ || LOOKING_AT_NOCASE (bp, "value")
+ || LOOKING_AT_NOCASE (bp, "variable")
+ || LOOKING_AT_NOCASE (bp, "buffer:")
+ || LOOKING_AT_NOCASE (bp, "field"))
+ get_tag (skip_spaces (bp), NULL); /* Yay! A definition! */
+ else
+ bp = skip_non_spaces (bp);
+}
+
+
+/*
+ * Scheme tag functions
+ * look for (def... xyzzy
+ * (def... (xyzzy
+ * (def ... ((...(xyzzy ....
+ * (set! xyzzy
+ * Original code by Ken Haase (1985?)
+ */
+static void
+Scheme_functions (FILE *inf)
+{
+ register char *bp;
+
+ LOOP_ON_INPUT_LINES (inf, lb, bp)
+ {
+ if (strneq (bp, "(def", 4) || strneq (bp, "(DEF", 4))
+ {
+ bp = skip_non_spaces (bp+4);
+ /* Skip over open parens and white space. Don't continue past
+ '\0'. */
+ while (*bp && notinname (*bp))
+ bp++;
+ get_tag (bp, NULL);
+ }
+ if (LOOKING_AT (bp, "(SET!") || LOOKING_AT (bp, "(set!"))
+ get_tag (bp, NULL);
+ }
+}
+
+
+/* Find tags in TeX and LaTeX input files. */
+
+/* TEX_toktab is a table of TeX control sequences that define tags.
+ * Each entry records one such control sequence.
+ *
+ * Original code from who knows whom.
+ * Ideas by:
+ * Stefan Monnier (2002)
+ */
+
+static linebuffer *TEX_toktab = NULL; /* Table with tag tokens */
+
+/* Default set of control sequences to put into TEX_toktab.
+ The value of environment var TEXTAGS is prepended to this. */
+static const char *TEX_defenv = "\
+:chapter:section:subsection:subsubsection:eqno:label:ref:cite:bibitem\
+:part:appendix:entry:index:def\
+:newcommand:renewcommand:newenvironment:renewenvironment";
+
+static void TEX_mode (FILE *);
+static void TEX_decode_env (const char *, const char *);
+
+static char TEX_esc = '\\';
+static char TEX_opgrp = '{';
+static char TEX_clgrp = '}';
+
+/*
+ * TeX/LaTeX scanning loop.
+ */
+static void
+TeX_commands (FILE *inf)
+{
+ char *cp;
+ linebuffer *key;
+
+ /* Select either \ or ! as escape character. */
+ TEX_mode (inf);
+
+ /* Initialize token table once from environment. */
+ if (TEX_toktab == NULL)
+ TEX_decode_env ("TEXTAGS", TEX_defenv);
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ /* Look at each TEX keyword in line. */
+ for (;;)
+ {
+ /* Look for a TEX escape. */
+ while (*cp++ != TEX_esc)
+ if (cp[-1] == '\0' || cp[-1] == '%')
+ goto tex_next_line;
+
+ for (key = TEX_toktab; key->buffer != NULL; key++)
+ if (strneq (cp, key->buffer, key->len))
+ {
+ char *p;
+ int namelen, linelen;
+ bool opgrp = false;
+
+ cp = skip_spaces (cp + key->len);
+ if (*cp == TEX_opgrp)
+ {
+ opgrp = true;
+ cp++;
+ }
+ for (p = cp;
+ (!iswhite (*p) && *p != '#' &&
+ *p != TEX_opgrp && *p != TEX_clgrp);
+ p++)
+ continue;
+ namelen = p - cp;
+ linelen = lb.len;
+ if (!opgrp || *p == TEX_clgrp)
+ {
+ while (*p != '\0' && *p != TEX_opgrp && *p != TEX_clgrp)
+ p++;
+ linelen = p - lb.buffer + 1;
+ }
+ make_tag (cp, namelen, true,
+ lb.buffer, linelen, lineno, linecharno);
+ goto tex_next_line; /* We only tag a line once */
+ }
+ }
+ tex_next_line:
+ ;
+ }
+}
+
+#define TEX_LESC '\\'
+#define TEX_SESC '!'
+
+/* Figure out whether TeX's escapechar is '\\' or '!' and set grouping
+ chars accordingly. */
+static void
+TEX_mode (FILE *inf)
+{
+ int c;
+
+ while ((c = getc (inf)) != EOF)
+ {
+ /* Skip to next line if we hit the TeX comment char. */
+ if (c == '%')
+ while (c != '\n' && c != EOF)
+ c = getc (inf);
+ else if (c == TEX_LESC || c == TEX_SESC )
+ break;
+ }
+
+ if (c == TEX_LESC)
+ {
+ TEX_esc = TEX_LESC;
+ TEX_opgrp = '{';
+ TEX_clgrp = '}';
+ }
+ else
+ {
+ TEX_esc = TEX_SESC;
+ TEX_opgrp = '<';
+ TEX_clgrp = '>';
+ }
+ /* If the input file is compressed, inf is a pipe, and rewind may fail.
+ No attempt is made to correct the situation. */
+ rewind (inf);
+}
+
+/* Read environment and prepend it to the default string.
+ Build token table. */
+static void
+TEX_decode_env (const char *evarname, const char *defenv)
+{
+ register const char *env, *p;
+ int i, len;
+
+ /* Append default string to environment. */
+ env = getenv (evarname);
+ if (!env)
+ env = defenv;
+ else
+ env = concat (env, defenv, "");
+
+ /* Allocate a token table */
+ for (len = 1, p = env; p;)
+ if ((p = strchr (p, ':')) && *++p != '\0')
+ len++;
+ TEX_toktab = xnew (len, linebuffer);
+
+ /* Unpack environment string into token table. Be careful about */
+ /* zero-length strings (leading ':', "::" and trailing ':') */
+ for (i = 0; *env != '\0';)
+ {
+ p = strchr (env, ':');
+ if (!p) /* End of environment string. */
+ p = env + strlen (env);
+ if (p - env > 0)
+ { /* Only non-zero strings. */
+ TEX_toktab[i].buffer = savenstr (env, p - env);
+ TEX_toktab[i].len = p - env;
+ i++;
+ }
+ if (*p)
+ env = p + 1;
+ else
+ {
+ TEX_toktab[i].buffer = NULL; /* Mark end of table. */
+ TEX_toktab[i].len = 0;
+ break;
+ }
+ }
+}
+
+
+/* Texinfo support. Dave Love, Mar. 2000. */
+static void
+Texinfo_nodes (FILE *inf)
+{
+ char *cp, *start;
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ if (LOOKING_AT (cp, "@node"))
+ {
+ start = cp;
+ while (*cp != '\0' && *cp != ',')
+ cp++;
+ make_tag (start, cp - start, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+}
+
+
+/*
+ * HTML support.
+ * Contents of <title>, <h1>, <h2>, <h3> are tags.
+ * Contents of <a name=xxx> are tags with name xxx.
+ *
+ * Francesco Potortì, 2002.
+ */
+static void
+HTML_labels (FILE *inf)
+{
+ bool getnext = false; /* next text outside of HTML tags is a tag */
+ bool skiptag = false; /* skip to the end of the current HTML tag */
+ bool intag = false; /* inside an html tag, looking for ID= */
+ bool inanchor = false; /* when INTAG, is an anchor, look for NAME= */
+ char *end;
+
+
+ linebuffer_setlen (&token_name, 0); /* no name in buffer */
+
+ LOOP_ON_INPUT_LINES (inf, lb, dbp)
+ for (;;) /* loop on the same line */
+ {
+ if (skiptag) /* skip HTML tag */
+ {
+ while (*dbp != '\0' && *dbp != '>')
+ dbp++;
+ if (*dbp == '>')
+ {
+ dbp += 1;
+ skiptag = false;
+ continue; /* look on the same line */
+ }
+ break; /* go to next line */
+ }
+
+ else if (intag) /* look for "name=" or "id=" */
+ {
+ while (*dbp != '\0' && *dbp != '>'
+ && lowcase (*dbp) != 'n' && lowcase (*dbp) != 'i')
+ dbp++;
+ if (*dbp == '\0')
+ break; /* go to next line */
+ if (*dbp == '>')
+ {
+ dbp += 1;
+ intag = false;
+ continue; /* look on the same line */
+ }
+ if ((inanchor && LOOKING_AT_NOCASE (dbp, "name="))
+ || LOOKING_AT_NOCASE (dbp, "id="))
+ {
+ bool quoted = (dbp[0] == '"');
+
+ if (quoted)
+ for (end = ++dbp; *end != '\0' && *end != '"'; end++)
+ continue;
+ else
+ for (end = dbp; *end != '\0' && intoken (*end); end++)
+ continue;
+ linebuffer_setlen (&token_name, end - dbp);
+ memcpy (token_name.buffer, dbp, end - dbp);
+ token_name.buffer[end - dbp] = '\0';
+
+ dbp = end;
+ intag = false; /* we found what we looked for */
+ skiptag = true; /* skip to the end of the tag */
+ getnext = true; /* then grab the text */
+ continue; /* look on the same line */
+ }
+ dbp += 1;
+ }
+
+ else if (getnext) /* grab next tokens and tag them */
+ {
+ dbp = skip_spaces (dbp);
+ if (*dbp == '\0')
+ break; /* go to next line */
+ if (*dbp == '<')
+ {
+ intag = true;
+ inanchor = (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]));
+ continue; /* look on the same line */
+ }
+
+ for (end = dbp + 1; *end != '\0' && *end != '<'; end++)
+ continue;
+ make_tag (token_name.buffer, token_name.len, true,
+ dbp, end - dbp, lineno, linecharno);
+ linebuffer_setlen (&token_name, 0); /* no name in buffer */
+ getnext = false;
+ break; /* go to next line */
+ }
+
+ else /* look for an interesting HTML tag */
+ {
+ while (*dbp != '\0' && *dbp != '<')
+ dbp++;
+ if (*dbp == '\0')
+ break; /* go to next line */
+ intag = true;
+ if (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]))
+ {
+ inanchor = true;
+ continue; /* look on the same line */
+ }
+ else if (LOOKING_AT_NOCASE (dbp, "<title>")
+ || LOOKING_AT_NOCASE (dbp, "<h1>")
+ || LOOKING_AT_NOCASE (dbp, "<h2>")
+ || LOOKING_AT_NOCASE (dbp, "<h3>"))
+ {
+ intag = false;
+ getnext = true;
+ continue; /* look on the same line */
+ }
+ dbp += 1;
+ }
+ }
+}
+
+
+/*
+ * Prolog support
+ *
+ * Assumes that the predicate or rule starts at column 0.
+ * Only the first clause of a predicate or rule is added.
+ * Original code by Sunichirou Sugou (1989)
+ * Rewritten by Anders Lindgren (1996)
+ */
+static size_t prolog_pr (char *, char *);
+static void prolog_skip_comment (linebuffer *, FILE *);
+static size_t prolog_atom (char *, size_t);
+
+static void
+Prolog_functions (FILE *inf)
+{
+ char *cp, *last;
+ size_t len;
+ size_t allocated;
+
+ allocated = 0;
+ len = 0;
+ last = NULL;
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ if (cp[0] == '\0') /* Empty line */
+ continue;
+ else if (iswhite (cp[0])) /* Not a predicate */
+ continue;
+ else if (cp[0] == '/' && cp[1] == '*') /* comment. */
+ prolog_skip_comment (&lb, inf);
+ else if ((len = prolog_pr (cp, last)) > 0)
+ {
+ /* Predicate or rule. Store the function name so that we
+ only generate a tag for the first clause. */
+ if (last == NULL)
+ last = xnew (len + 1, char);
+ else if (len + 1 > allocated)
+ xrnew (last, len + 1, char);
+ allocated = len + 1;
+ memcpy (last, cp, len);
+ last[len] = '\0';
+ }
+ }
+ free (last);
+}
+
+
+static void
+prolog_skip_comment (linebuffer *plb, FILE *inf)
+{
+ char *cp;
+
+ do
+ {
+ for (cp = plb->buffer; *cp != '\0'; cp++)
+ if (cp[0] == '*' && cp[1] == '/')
+ return;
+ readline (plb, inf);
+ }
+ while (!feof (inf));
+}
+
+/*
+ * A predicate or rule definition is added if it matches:
+ * <beginning of line><Prolog Atom><whitespace>(
+ * or <beginning of line><Prolog Atom><whitespace>:-
+ *
+ * It is added to the tags database if it doesn't match the
+ * name of the previous clause header.
+ *
+ * Return the size of the name of the predicate or rule, or 0 if no
+ * header was found.
+ */
+static size_t
+prolog_pr (char *s, char *last)
+
+ /* Name of last clause. */
+{
+ size_t pos;
+ size_t len;
+
+ pos = prolog_atom (s, 0);
+ if (! pos)
+ return 0;
+
+ len = pos;
+ pos = skip_spaces (s + pos) - s;
+
+ if ((s[pos] == '.'
+ || (s[pos] == '(' && (pos += 1))
+ || (s[pos] == ':' && s[pos + 1] == '-' && (pos += 2)))
+ && (last == NULL /* save only the first clause */
+ || len != strlen (last)
+ || !strneq (s, last, len)))
+ {
+ make_tag (s, len, true, s, pos, lineno, linecharno);
+ return len;
+ }
+ else
+ return 0;
+}
+
+/*
+ * Consume a Prolog atom.
+ * Return the number of bytes consumed, or 0 if there was an error.
+ *
+ * A prolog atom, in this context, could be one of:
+ * - An alphanumeric sequence, starting with a lower case letter.
+ * - A quoted arbitrary string. Single quotes can escape themselves.
+ * Backslash quotes everything.
+ */
+static size_t
+prolog_atom (char *s, size_t pos)
+{
+ size_t origpos;
+
+ origpos = pos;
+
+ if (ISLOWER (s[pos]) || (s[pos] == '_'))
+ {
+ /* The atom is unquoted. */
+ pos++;
+ while (ISALNUM (s[pos]) || (s[pos] == '_'))
+ {
+ pos++;
+ }
+ return pos - origpos;
+ }
+ else if (s[pos] == '\'')
+ {
+ pos++;
+
+ for (;;)
+ {
+ if (s[pos] == '\'')
+ {
+ pos++;
+ if (s[pos] != '\'')
+ break;
+ pos++; /* A double quote */
+ }
+ else if (s[pos] == '\0')
+ /* Multiline quoted atoms are ignored. */
+ return 0;
+ else if (s[pos] == '\\')
+ {
+ if (s[pos+1] == '\0')
+ return 0;
+ pos += 2;
+ }
+ else
+ pos++;
+ }
+ return pos - origpos;
+ }
+ else
+ return 0;
+}
+
+
+/*
+ * Support for Erlang
+ *
+ * Generates tags for functions, defines, and records.
+ * Assumes that Erlang functions start at column 0.
+ * Original code by Anders Lindgren (1996)
+ */
+static int erlang_func (char *, char *);
+static void erlang_attribute (char *);
+static int erlang_atom (char *);
+
+static void
+Erlang_functions (FILE *inf)
+{
+ char *cp, *last;
+ int len;
+ int allocated;
+
+ allocated = 0;
+ len = 0;
+ last = NULL;
+
+ LOOP_ON_INPUT_LINES (inf, lb, cp)
+ {
+ if (cp[0] == '\0') /* Empty line */
+ continue;
+ else if (iswhite (cp[0])) /* Not function nor attribute */
+ continue;
+ else if (cp[0] == '%') /* comment */
+ continue;
+ else if (cp[0] == '"') /* Sometimes, strings start in column one */
+ continue;
+ else if (cp[0] == '-') /* attribute, e.g. "-define" */
+ {
+ erlang_attribute (cp);
+ if (last != NULL)
+ {
+ free (last);
+ last = NULL;
+ }
+ }
+ else if ((len = erlang_func (cp, last)) > 0)
+ {
+ /*
+ * Function. Store the function name so that we only
+ * generates a tag for the first clause.
+ */
+ if (last == NULL)
+ last = xnew (len + 1, char);
+ else if (len + 1 > allocated)
+ xrnew (last, len + 1, char);
+ allocated = len + 1;
+ memcpy (last, cp, len);
+ last[len] = '\0';
+ }
+ }
+ free (last);
+}
+
+
+/*
+ * A function definition is added if it matches:
+ * <beginning of line><Erlang Atom><whitespace>(
+ *
+ * It is added to the tags database if it doesn't match the
+ * name of the previous clause header.
+ *
+ * Return the size of the name of the function, or 0 if no function
+ * was found.
+ */
+static int
+erlang_func (char *s, char *last)
+
+ /* Name of last clause. */
+{
+ int pos;
+ int len;
+
+ pos = erlang_atom (s);
+ if (pos < 1)
+ return 0;
+
+ len = pos;
+ pos = skip_spaces (s + pos) - s;
+
+ /* Save only the first clause. */
+ if (s[pos++] == '('
+ && (last == NULL
+ || len != (int)strlen (last)
+ || !strneq (s, last, len)))
+ {
+ make_tag (s, len, true, s, pos, lineno, linecharno);
+ return len;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Handle attributes. Currently, tags are generated for defines
+ * and records.
+ *
+ * They are on the form:
+ * -define(foo, bar).
+ * -define(Foo(M, N), M+N).
+ * -record(graph, {vtab = notable, cyclic = true}).
+ */
+static void
+erlang_attribute (char *s)
+{
+ char *cp = s;
+
+ if ((LOOKING_AT (cp, "-define") || LOOKING_AT (cp, "-record"))
+ && *cp++ == '(')
+ {
+ int len = erlang_atom (skip_spaces (cp));
+ if (len > 0)
+ make_tag (cp, len, true, s, cp + len - s, lineno, linecharno);
+ }
+ return;
+}
+
+
+/*
+ * Consume an Erlang atom (or variable).
+ * Return the number of bytes consumed, or -1 if there was an error.
+ */
+static int
+erlang_atom (char *s)
+{
+ int pos = 0;
+
+ if (ISALPHA (s[pos]) || s[pos] == '_')
+ {
+ /* The atom is unquoted. */
+ do
+ pos++;
+ while (ISALNUM (s[pos]) || s[pos] == '_');
+ }
+ else if (s[pos] == '\'')
+ {
+ for (pos++; s[pos] != '\''; pos++)
+ if (s[pos] == '\0' /* multiline quoted atoms are ignored */
+ || (s[pos] == '\\' && s[++pos] == '\0'))
+ return 0;
+ pos++;
+ }
+
+ return pos;
+}
+
+
+static char *scan_separators (char *);
+static void add_regex (char *, language *);
+static char *substitute (char *, char *, struct re_registers *);
+
+/*
+ * Take a string like "/blah/" and turn it into "blah", verifying
+ * that the first and last characters are the same, and handling
+ * quoted separator characters. Actually, stops on the occurrence of
+ * an unquoted separator. Also process \t, \n, etc. and turn into
+ * appropriate characters. Works in place. Null terminates name string.
+ * Returns pointer to terminating separator, or NULL for
+ * unterminated regexps.
+ */
+static char *
+scan_separators (char *name)
+{
+ char sep = name[0];
+ char *copyto = name;
+ bool quoted = false;
+
+ for (++name; *name != '\0'; ++name)
+ {
+ if (quoted)
+ {
+ switch (*name)
+ {
+ case 'a': *copyto++ = '\007'; break; /* BEL (bell) */
+ case 'b': *copyto++ = '\b'; break; /* BS (back space) */
+ case 'd': *copyto++ = 0177; break; /* DEL (delete) */
+ case 'e': *copyto++ = 033; break; /* ESC (delete) */
+ case 'f': *copyto++ = '\f'; break; /* FF (form feed) */
+ case 'n': *copyto++ = '\n'; break; /* NL (new line) */
+ case 'r': *copyto++ = '\r'; break; /* CR (carriage return) */
+ case 't': *copyto++ = '\t'; break; /* TAB (horizontal tab) */
+ case 'v': *copyto++ = '\v'; break; /* VT (vertical tab) */
+ default:
+ if (*name == sep)
+ *copyto++ = sep;
+ else
+ {
+ /* Something else is quoted, so preserve the quote. */
+ *copyto++ = '\\';
+ *copyto++ = *name;
+ }
+ break;
+ }
+ quoted = false;
+ }
+ else if (*name == '\\')
+ quoted = true;
+ else if (*name == sep)
+ break;
+ else
+ *copyto++ = *name;
+ }
+ if (*name != sep)
+ name = NULL; /* signal unterminated regexp */
+
+ /* Terminate copied string. */
+ *copyto = '\0';
+ return name;
+}
+
+/* Look at the argument of --regex or --no-regex and do the right
+ thing. Same for each line of a regexp file. */
+static void
+analyze_regex (char *regex_arg)
+{
+ if (regex_arg == NULL)
+ {
+ free_regexps (); /* --no-regex: remove existing regexps */
+ return;
+ }
+
+ /* A real --regexp option or a line in a regexp file. */
+ switch (regex_arg[0])
+ {
+ /* Comments in regexp file or null arg to --regex. */
+ case '\0':
+ case ' ':
+ case '\t':
+ break;
+
+ /* Read a regex file. This is recursive and may result in a
+ loop, which will stop when the file descriptors are exhausted. */
+ case '@':
+ {
+ FILE *regexfp;
+ linebuffer regexbuf;
+ char *regexfile = regex_arg + 1;
+
+ /* regexfile is a file containing regexps, one per line. */
+ regexfp = fopen (regexfile, "r" FOPEN_BINARY);
+ if (regexfp == NULL)
+ pfatal (regexfile);
+ linebuffer_init (&regexbuf);
+ while (readline_internal (&regexbuf, regexfp) > 0)
+ analyze_regex (regexbuf.buffer);
+ free (regexbuf.buffer);
+ fclose (regexfp);
+ }
+ break;
+
+ /* Regexp to be used for a specific language only. */
+ case '{':
+ {
+ language *lang;
+ char *lang_name = regex_arg + 1;
+ char *cp;
+
+ for (cp = lang_name; *cp != '}'; cp++)
+ if (*cp == '\0')
+ {
+ error ("unterminated language name in regex: %s", regex_arg);
+ return;
+ }
+ *cp++ = '\0';
+ lang = get_language_from_langname (lang_name);
+ if (lang == NULL)
+ return;
+ add_regex (cp, lang);
+ }
+ break;
+
+ /* Regexp to be used for any language. */
+ default:
+ add_regex (regex_arg, NULL);
+ break;
+ }
+}
+
+/* Separate the regexp pattern, compile it,
+ and care for optional name and modifiers. */
+static void
+add_regex (char *regexp_pattern, language *lang)
+{
+ static struct re_pattern_buffer zeropattern;
+ char sep, *pat, *name, *modifiers;
+ char empty = '\0';
+ const char *err;
+ struct re_pattern_buffer *patbuf;
+ regexp *rp;
+ bool
+ force_explicit_name = true, /* do not use implicit tag names */
+ ignore_case = false, /* case is significant */
+ multi_line = false, /* matches are done one line at a time */
+ single_line = false; /* dot does not match newline */
+
+
+ if (strlen (regexp_pattern) < 3)
+ {
+ error ("null regexp");
+ return;
+ }
+ sep = regexp_pattern[0];
+ name = scan_separators (regexp_pattern);
+ if (name == NULL)
+ {
+ error ("%s: unterminated regexp", regexp_pattern);
+ return;
+ }
+ if (name[1] == sep)
+ {
+ error ("null name for regexp \"%s\"", regexp_pattern);
+ return;
+ }
+ modifiers = scan_separators (name);
+ if (modifiers == NULL) /* no terminating separator --> no name */
+ {
+ modifiers = name;
+ name = &empty;
+ }
+ else
+ modifiers += 1; /* skip separator */
+
+ /* Parse regex modifiers. */
+ for (; modifiers[0] != '\0'; modifiers++)
+ switch (modifiers[0])
+ {
+ case 'N':
+ if (modifiers == name)
+ error ("forcing explicit tag name but no name, ignoring");
+ force_explicit_name = true;
+ break;
+ case 'i':
+ ignore_case = true;
+ break;
+ case 's':
+ single_line = true;
+ /* FALLTHRU */
+ case 'm':
+ multi_line = true;
+ need_filebuf = true;
+ break;
+ default:
+ error ("invalid regexp modifier `%c', ignoring", modifiers[0]);
+ break;
+ }
+
+ patbuf = xnew (1, struct re_pattern_buffer);
+ *patbuf = zeropattern;
+ if (ignore_case)
+ {
+ static char lc_trans[CHARS];
+ int i;
+ for (i = 0; i < CHARS; i++)
+ lc_trans[i] = lowcase (i);
+ patbuf->translate = lc_trans; /* translation table to fold case */
+ }
+
+ if (multi_line)
+ pat = concat ("^", regexp_pattern, ""); /* anchor to beginning of line */
+ else
+ pat = regexp_pattern;
+
+ if (single_line)
+ re_set_syntax (RE_SYNTAX_EMACS | RE_DOT_NEWLINE);
+ else
+ re_set_syntax (RE_SYNTAX_EMACS);
+
+ err = re_compile_pattern (pat, strlen (pat), patbuf);
+ if (multi_line)
+ free (pat);
+ if (err != NULL)
+ {
+ error ("%s while compiling pattern", err);
+ return;
+ }
+
+ rp = p_head;
+ p_head = xnew (1, regexp);
+ p_head->pattern = savestr (regexp_pattern);
+ p_head->p_next = rp;
+ p_head->lang = lang;
+ p_head->pat = patbuf;
+ p_head->name = savestr (name);
+ p_head->error_signaled = false;
+ p_head->force_explicit_name = force_explicit_name;
+ p_head->ignore_case = ignore_case;
+ p_head->multi_line = multi_line;
+}
+
+/*
+ * Do the substitutions indicated by the regular expression and
+ * arguments.
+ */
+static char *
+substitute (char *in, char *out, struct re_registers *regs)
+{
+ char *result, *t;
+ int size, dig, diglen;
+
+ result = NULL;
+ size = strlen (out);
+
+ /* Pass 1: figure out how much to allocate by finding all \N strings. */
+ if (out[size - 1] == '\\')
+ fatal ("pattern error in \"%s\"", out);
+ for (t = strchr (out, '\\');
+ t != NULL;
+ t = strchr (t + 2, '\\'))
+ if (ISDIGIT (t[1]))
+ {
+ dig = t[1] - '0';
+ diglen = regs->end[dig] - regs->start[dig];
+ size += diglen - 2;
+ }
+ else
+ size -= 1;
+
+ /* Allocate space and do the substitutions. */
+ assert (size >= 0);
+ result = xnew (size + 1, char);
+
+ for (t = result; *out != '\0'; out++)
+ if (*out == '\\' && ISDIGIT (*++out))
+ {
+ dig = *out - '0';
+ diglen = regs->end[dig] - regs->start[dig];
+ memcpy (t, in + regs->start[dig], diglen);
+ t += diglen;
+ }
+ else
+ *t++ = *out;
+ *t = '\0';
+
+ assert (t <= result + size);
+ assert (t - result == (int)strlen (result));
+
+ return result;
+}
+
+/* Deallocate all regexps. */
+static void
+free_regexps (void)
+{
+ regexp *rp;
+ while (p_head != NULL)
+ {
+ rp = p_head->p_next;
+ free (p_head->pattern);
+ free (p_head->name);
+ free (p_head);
+ p_head = rp;
+ }
+ return;
+}
+
+/*
+ * Reads the whole file as a single string from `filebuf' and looks for
+ * multi-line regular expressions, creating tags on matches.
+ * readline already dealt with normal regexps.
+ *
+ * Idea by Ben Wing <ben@666.com> (2002).
+ */
+static void
+regex_tag_multiline (void)
+{
+ char *buffer = filebuf.buffer;
+ regexp *rp;
+ char *name;
+
+ for (rp = p_head; rp != NULL; rp = rp->p_next)
+ {
+ int match = 0;
+
+ if (!rp->multi_line)
+ continue; /* skip normal regexps */
+
+ /* Generic initializations before parsing file from memory. */
+ lineno = 1; /* reset global line number */
+ charno = 0; /* reset global char number */
+ linecharno = 0; /* reset global char number of line start */
+
+ /* Only use generic regexps or those for the current language. */
+ if (rp->lang != NULL && rp->lang != curfdp->lang)
+ continue;
+
+ while (match >= 0 && match < filebuf.len)
+ {
+ match = re_search (rp->pat, buffer, filebuf.len, charno,
+ filebuf.len - match, &rp->regs);
+ switch (match)
+ {
+ case -2:
+ /* Some error. */
+ if (!rp->error_signaled)
+ {
+ error ("regexp stack overflow while matching \"%s\"",
+ rp->pattern);
+ rp->error_signaled = true;
+ }
+ break;
+ case -1:
+ /* No match. */
+ break;
+ default:
+ if (match == rp->regs.end[0])
+ {
+ if (!rp->error_signaled)
+ {
+ error ("regexp matches the empty string: \"%s\"",
+ rp->pattern);
+ rp->error_signaled = true;
+ }
+ match = -3; /* exit from while loop */
+ break;
+ }
+
+ /* Match occurred. Construct a tag. */
+ while (charno < rp->regs.end[0])
+ if (buffer[charno++] == '\n')
+ lineno++, linecharno = charno;
+ name = rp->name;
+ if (name[0] == '\0')
+ name = NULL;
+ else /* make a named tag */
+ name = substitute (buffer, rp->name, &rp->regs);
+ if (rp->force_explicit_name)
+ /* Force explicit tag name, if a name is there. */
+ pfnote (name, true, buffer + linecharno,
+ charno - linecharno + 1, lineno, linecharno);
+ else
+ make_tag (name, strlen (name), true, buffer + linecharno,
+ charno - linecharno + 1, lineno, linecharno);
+ break;
+ }
+ }
+ }
+}
+
+
+static bool
+nocase_tail (const char *cp)
+{
+ register int len = 0;
+
+ while (*cp != '\0' && lowcase (*cp) == lowcase (dbp[len]))
+ cp++, len++;
+ if (*cp == '\0' && !intoken (dbp[len]))
+ {
+ dbp += len;
+ return true;
+ }
+ return false;
+}
+
+static void
+get_tag (register char *bp, char **namepp)
+{
+ register char *cp = bp;
+
+ if (*bp != '\0')
+ {
+ /* Go till you get to white space or a syntactic break */
+ for (cp = bp + 1; !notinname (*cp); cp++)
+ continue;
+ make_tag (bp, cp - bp, true,
+ lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+ }
+
+ if (namepp != NULL)
+ *namepp = savenstr (bp, cp - bp);
+}
+
+/*
+ * Read a line of text from `stream' into `lbp', excluding the
+ * newline or CR-NL, if any. Return the number of characters read from
+ * `stream', which is the length of the line including the newline.
+ *
+ * On DOS or Windows we do not count the CR character, if any before the
+ * NL, in the returned length; this mirrors the behavior of Emacs on those
+ * platforms (for text files, it translates CR-NL to NL as it reads in the
+ * file).
+ *
+ * If multi-line regular expressions are requested, each line read is
+ * appended to `filebuf'.
+ */
+static long
+readline_internal (linebuffer *lbp, register FILE *stream)
+{
+ char *buffer = lbp->buffer;
+ register char *p = lbp->buffer;
+ register char *pend;
+ int chars_deleted;
+
+ pend = p + lbp->size; /* Separate to avoid 386/IX compiler bug. */
+
+ for (;;)
+ {
+ register int c = getc (stream);
+ if (p == pend)
+ {
+ /* We're at the end of linebuffer: expand it. */
+ lbp->size *= 2;
+ xrnew (buffer, lbp->size, char);
+ p += buffer - lbp->buffer;
+ pend = buffer + lbp->size;
+ lbp->buffer = buffer;
+ }
+ if (c == EOF)
+ {
+ *p = '\0';
+ chars_deleted = 0;
+ break;
+ }
+ if (c == '\n')
+ {
+ if (p > buffer && p[-1] == '\r')
+ {
+ p -= 1;
+#ifdef DOS_NT
+ /* Assume CRLF->LF translation will be performed by Emacs
+ when loading this file, so CRs won't appear in the buffer.
+ It would be cleaner to compensate within Emacs;
+ however, Emacs does not know how many CRs were deleted
+ before any given point in the file. */
+ chars_deleted = 1;
+#else
+ chars_deleted = 2;
+#endif
+ }
+ else
+ {
+ chars_deleted = 1;
+ }
+ *p = '\0';
+ break;
+ }
+ *p++ = c;
+ }
+ lbp->len = p - buffer;
+
+ if (need_filebuf /* we need filebuf for multi-line regexps */
+ && chars_deleted > 0) /* not at EOF */
+ {
+ while (filebuf.size <= filebuf.len + lbp->len + 1) /* +1 for \n */
+ {
+ /* Expand filebuf. */
+ filebuf.size *= 2;
+ xrnew (filebuf.buffer, filebuf.size, char);
+ }
+ memcpy (filebuf.buffer + filebuf.len, lbp->buffer, lbp->len);
+ filebuf.len += lbp->len;
+ filebuf.buffer[filebuf.len++] = '\n';
+ filebuf.buffer[filebuf.len] = '\0';
+ }
+
+ return lbp->len + chars_deleted;
+}
+
+/*
+ * Like readline_internal, above, but in addition try to match the
+ * input line against relevant regular expressions and manage #line
+ * directives.
+ */
+static void
+readline (linebuffer *lbp, FILE *stream)
+{
+ long result;
+
+ linecharno = charno; /* update global char number of line start */
+ result = readline_internal (lbp, stream); /* read line */
+ lineno += 1; /* increment global line number */
+ charno += result; /* increment global char number */
+
+ /* Honor #line directives. */
+ if (!no_line_directive)
+ {
+ static bool discard_until_line_directive;
+
+ /* Check whether this is a #line directive. */
+ if (result > 12 && strneq (lbp->buffer, "#line ", 6))
+ {
+ unsigned int lno;
+ int start = 0;
+
+ if (sscanf (lbp->buffer, "#line %u \"%n", &lno, &start) >= 1
+ && start > 0) /* double quote character found */
+ {
+ char *endp = lbp->buffer + start;
+
+ while ((endp = strchr (endp, '"')) != NULL
+ && endp[-1] == '\\')
+ endp++;
+ if (endp != NULL)
+ /* Ok, this is a real #line directive. Let's deal with it. */
+ {
+ char *taggedabsname; /* absolute name of original file */
+ char *taggedfname; /* name of original file as given */
+ char *name; /* temp var */
+
+ discard_until_line_directive = false; /* found it */
+ name = lbp->buffer + start;
+ *endp = '\0';
+ canonicalize_filename (name);
+ taggedabsname = absolute_filename (name, tagfiledir);
+ if (filename_is_absolute (name)
+ || filename_is_absolute (curfdp->infname))
+ taggedfname = savestr (taggedabsname);
+ else
+ taggedfname = relative_filename (taggedabsname,tagfiledir);
+
+ if (streq (curfdp->taggedfname, taggedfname))
+ /* The #line directive is only a line number change. We
+ deal with this afterwards. */
+ free (taggedfname);
+ else
+ /* The tags following this #line directive should be
+ attributed to taggedfname. In order to do this, set
+ curfdp accordingly. */
+ {
+ fdesc *fdp; /* file description pointer */
+
+ /* Go look for a file description already set up for the
+ file indicated in the #line directive. If there is
+ one, use it from now until the next #line
+ directive. */
+ for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+ if (streq (fdp->infname, curfdp->infname)
+ && streq (fdp->taggedfname, taggedfname))
+ /* If we remove the second test above (after the &&)
+ then all entries pertaining to the same file are
+ coalesced in the tags file. If we use it, then
+ entries pertaining to the same file but generated
+ from different files (via #line directives) will
+ go into separate sections in the tags file. These
+ alternatives look equivalent. The first one
+ destroys some apparently useless information. */
+ {
+ curfdp = fdp;
+ free (taggedfname);
+ break;
+ }
+ /* Else, if we already tagged the real file, skip all
+ input lines until the next #line directive. */
+ if (fdp == NULL) /* not found */
+ for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+ if (streq (fdp->infabsname, taggedabsname))
+ {
+ discard_until_line_directive = true;
+ free (taggedfname);
+ break;
+ }
+ /* Else create a new file description and use that from
+ now on, until the next #line directive. */
+ if (fdp == NULL) /* not found */
+ {
+ fdp = fdhead;
+ fdhead = xnew (1, fdesc);
+ *fdhead = *curfdp; /* copy curr. file description */
+ fdhead->next = fdp;
+ fdhead->infname = savestr (curfdp->infname);
+ fdhead->infabsname = savestr (curfdp->infabsname);
+ fdhead->infabsdir = savestr (curfdp->infabsdir);
+ fdhead->taggedfname = taggedfname;
+ fdhead->usecharno = false;
+ fdhead->prop = NULL;
+ fdhead->written = false;
+ curfdp = fdhead;
+ }
+ }
+ free (taggedabsname);
+ lineno = lno - 1;
+ readline (lbp, stream);
+ return;
+ } /* if a real #line directive */
+ } /* if #line is followed by a number */
+ } /* if line begins with "#line " */
+
+ /* If we are here, no #line directive was found. */
+ if (discard_until_line_directive)
+ {
+ if (result > 0)
+ {
+ /* Do a tail recursion on ourselves, thus discarding the contents
+ of the line buffer. */
+ readline (lbp, stream);
+ return;
+ }
+ /* End of file. */
+ discard_until_line_directive = false;
+ return;
+ }
+ } /* if #line directives should be considered */
+
+ {
+ int match;
+ regexp *rp;
+ char *name;
+
+ /* Match against relevant regexps. */
+ if (lbp->len > 0)
+ for (rp = p_head; rp != NULL; rp = rp->p_next)
+ {
+ /* Only use generic regexps or those for the current language.
+ Also do not use multiline regexps, which is the job of
+ regex_tag_multiline. */
+ if ((rp->lang != NULL && rp->lang != fdhead->lang)
+ || rp->multi_line)
+ continue;
+
+ match = re_match (rp->pat, lbp->buffer, lbp->len, 0, &rp->regs);
+ switch (match)
+ {
+ case -2:
+ /* Some error. */
+ if (!rp->error_signaled)
+ {
+ error ("regexp stack overflow while matching \"%s\"",
+ rp->pattern);
+ rp->error_signaled = true;
+ }
+ break;
+ case -1:
+ /* No match. */
+ break;
+ case 0:
+ /* Empty string matched. */
+ if (!rp->error_signaled)
+ {
+ error ("regexp matches the empty string: \"%s\"", rp->pattern);
+ rp->error_signaled = true;
+ }
+ break;
+ default:
+ /* Match occurred. Construct a tag. */
+ name = rp->name;
+ if (name[0] == '\0')
+ name = NULL;
+ else /* make a named tag */
+ name = substitute (lbp->buffer, rp->name, &rp->regs);
+ if (rp->force_explicit_name)
+ /* Force explicit tag name, if a name is there. */
+ pfnote (name, true, lbp->buffer, match, lineno, linecharno);
+ else
+ make_tag (name, strlen (name), true,
+ lbp->buffer, match, lineno, linecharno);
+ break;
+ }
+ }
+ }
+}
+
+
+/*
+ * Return a pointer to a space of size strlen(cp)+1 allocated
+ * with xnew where the string CP has been copied.
+ */
+static char *
+savestr (const char *cp)
+{
+ return savenstr (cp, strlen (cp));
+}
+
+/*
+ * Return a pointer to a space of size LEN+1 allocated with xnew where
+ * the string CP has been copied for at most the first LEN characters.
+ */
+static char *
+savenstr (const char *cp, int len)
+{
+ char *dp = xnew (len + 1, char);
+ dp[len] = '\0';
+ return memcpy (dp, cp, len);
+}
+
+/* Skip spaces (end of string is not space), return new pointer. */
+static char *
+skip_spaces (char *cp)
+{
+ while (iswhite (*cp))
+ cp++;
+ return cp;
+}
+
+/* Skip non spaces, except end of string, return new pointer. */
+static char *
+skip_non_spaces (char *cp)
+{
+ while (*cp != '\0' && !iswhite (*cp))
+ cp++;
+ return cp;
+}
+
+/* Skip any chars in the "name" class.*/
+static char *
+skip_name (char *cp)
+{
+ /* '\0' is a notinname() so loop stops there too */
+ while (! notinname (*cp))
+ cp++;
+ return cp;
+}
+
+/* Print error message and exit. */
+void
+fatal (const char *s1, const char *s2)
+{
+ error (s1, s2);
+ exit (EXIT_FAILURE);
+}
+
+static void
+pfatal (const char *s1)
+{
+ perror (s1);
+ exit (EXIT_FAILURE);
+}
+
+static void
+suggest_asking_for_help (void)
+{
+ fprintf (stderr, "\tTry `%s --help' for a complete list of options.\n",
+ progname);
+ exit (EXIT_FAILURE);
+}
+
+/* Output a diagnostic with printf-style FORMAT and args. */
+static void
+error (const char *format, ...)
+{
+ va_list ap;
+ va_start (ap, format);
+ fprintf (stderr, "%s: ", progname);
+ vfprintf (stderr, format, ap);
+ fprintf (stderr, "\n");
+ va_end (ap);
+}
+
+/* Return a newly-allocated string whose contents
+ concatenate those of s1, s2, s3. */
+static char *
+concat (const char *s1, const char *s2, const char *s3)
+{
+ int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+ char *result = xnew (len1 + len2 + len3 + 1, char);
+
+ strcpy (result, s1);
+ strcpy (result + len1, s2);
+ strcpy (result + len1 + len2, s3);
+
+ return result;
+}
+
+
+/* Does the same work as the system V getcwd, but does not need to
+ guess the buffer size in advance. */
+static char *
+etags_getcwd (void)
+{
+ int bufsize = 200;
+ char *path = xnew (bufsize, char);
+
+ while (getcwd (path, bufsize) == NULL)
+ {
+ if (errno != ERANGE)
+ pfatal ("getcwd");
+ bufsize *= 2;
+ free (path);
+ path = xnew (bufsize, char);
+ }
+
+ canonicalize_filename (path);
+ return path;
+}
+
+/* Return a newly allocated string containing the file name of FILE
+ relative to the absolute directory DIR (which should end with a slash). */
+static char *
+relative_filename (char *file, char *dir)
+{
+ char *fp, *dp, *afn, *res;
+ int i;
+
+ /* Find the common root of file and dir (with a trailing slash). */
+ afn = absolute_filename (file, cwd);
+ fp = afn;
+ dp = dir;
+ while (*fp++ == *dp++)
+ continue;
+ fp--, dp--; /* back to the first differing char */
+#ifdef DOS_NT
+ if (fp == afn && afn[0] != '/') /* cannot build a relative name */
+ return afn;
+#endif
+ do /* look at the equal chars until '/' */
+ fp--, dp--;
+ while (*fp != '/');
+
+ /* Build a sequence of "../" strings for the resulting relative file name. */
+ i = 0;
+ while ((dp = strchr (dp + 1, '/')) != NULL)
+ i += 1;
+ res = xnew (3*i + strlen (fp + 1) + 1, char);
+ char *z = res;
+ while (i-- > 0)
+ z = stpcpy (z, "../");
+
+ /* Add the file name relative to the common root of file and dir. */
+ strcpy (z, fp + 1);
+ free (afn);
+
+ return res;
+}
+
+/* Return a newly allocated string containing the absolute file name
+ of FILE given DIR (which should end with a slash). */
+static char *
+absolute_filename (char *file, char *dir)
+{
+ char *slashp, *cp, *res;
+
+ if (filename_is_absolute (file))
+ res = savestr (file);
+#ifdef DOS_NT
+ /* We don't support non-absolute file names with a drive
+ letter, like `d:NAME' (it's too much hassle). */
+ else if (file[1] == ':')
+ fatal ("%s: relative file names with drive letters not supported", file);
+#endif
+ else
+ res = concat (dir, file, "");
+
+ /* Delete the "/dirname/.." and "/." substrings. */
+ slashp = strchr (res, '/');
+ while (slashp != NULL && slashp[0] != '\0')
+ {
+ if (slashp[1] == '.')
+ {
+ if (slashp[2] == '.'
+ && (slashp[3] == '/' || slashp[3] == '\0'))
+ {
+ cp = slashp;
+ do
+ cp--;
+ while (cp >= res && !filename_is_absolute (cp));
+ if (cp < res)
+ cp = slashp; /* the absolute name begins with "/.." */
+#ifdef DOS_NT
+ /* Under MSDOS and NT we get `d:/NAME' as absolute
+ file name, so the luser could say `d:/../NAME'.
+ We silently treat this as `d:/NAME'. */
+ else if (cp[0] != '/')
+ cp = slashp;
+#endif
+ memmove (cp, slashp + 3, strlen (slashp + 2));
+ slashp = cp;
+ continue;
+ }
+ else if (slashp[2] == '/' || slashp[2] == '\0')
+ {
+ memmove (slashp, slashp + 2, strlen (slashp + 1));
+ continue;
+ }
+ }
+
+ slashp = strchr (slashp + 1, '/');
+ }
+
+ if (res[0] == '\0') /* just a safety net: should never happen */
+ {
+ free (res);
+ return savestr ("/");
+ }
+ else
+ return res;
+}
+
+/* Return a newly allocated string containing the absolute
+ file name of dir where FILE resides given DIR (which should
+ end with a slash). */
+static char *
+absolute_dirname (char *file, char *dir)
+{
+ char *slashp, *res;
+ char save;
+
+ slashp = strrchr (file, '/');
+ if (slashp == NULL)
+ return savestr (dir);
+ save = slashp[1];
+ slashp[1] = '\0';
+ res = absolute_filename (file, dir);
+ slashp[1] = save;
+
+ return res;
+}
+
+/* Whether the argument string is an absolute file name. The argument
+ string must have been canonicalized with canonicalize_filename. */
+static bool
+filename_is_absolute (char *fn)
+{
+ return (fn[0] == '/'
+#ifdef DOS_NT
+ || (ISALPHA (fn[0]) && fn[1] == ':' && fn[2] == '/')
+#endif
+ );
+}
+
+/* Downcase DOS drive letter and collapse separators into single slashes.
+ Works in place. */
+static void
+canonicalize_filename (register char *fn)
+{
+ register char* cp;
+ char sep = '/';
+
+#ifdef DOS_NT
+ /* Canonicalize drive letter case. */
+# define ISUPPER(c) isupper (CHAR (c))
+ if (fn[0] != '\0' && fn[1] == ':' && ISUPPER (fn[0]))
+ fn[0] = lowcase (fn[0]);
+
+ sep = '\\';
+#endif
+
+ /* Collapse multiple separators into a single slash. */
+ for (cp = fn; *cp != '\0'; cp++, fn++)
+ if (*cp == sep)
+ {
+ *fn = '/';
+ while (cp[1] == sep)
+ cp++;
+ }
+ else
+ *fn = *cp;
+ *fn = '\0';
+}
+
+
+/* Initialize a linebuffer for use. */
+static void
+linebuffer_init (linebuffer *lbp)
+{
+ lbp->size = (DEBUG) ? 3 : 200;
+ lbp->buffer = xnew (lbp->size, char);
+ lbp->buffer[0] = '\0';
+ lbp->len = 0;
+}
+
+/* Set the minimum size of a string contained in a linebuffer. */
+static void
+linebuffer_setlen (linebuffer *lbp, int toksize)
+{
+ while (lbp->size <= toksize)
+ {
+ lbp->size *= 2;
+ xrnew (lbp->buffer, lbp->size, char);
+ }
+ lbp->len = toksize;
+}
+
+/* Like malloc but get fatal error if memory is exhausted. */
+static void *
+xmalloc (size_t size)
+{
+ void *result = malloc (size);
+ if (result == NULL)
+ fatal ("virtual memory exhausted", (char *)NULL);
+ return result;
+}
+
+static void *
+xrealloc (void *ptr, size_t size)
+{
+ void *result = realloc (ptr, size);
+ if (result == NULL)
+ fatal ("virtual memory exhausted", (char *)NULL);
+ return result;
+}
+
+/*
+ * Local Variables:
+ * indent-tabs-mode: t
+ * tab-width: 8
+ * fill-column: 79
+ * c-font-lock-extra-types: ("FILE" "bool" "language" "linebuffer" "fdesc" "node" "regexp")
+ * c-file-style: "gnu"
+ * End:
+ */
+
+/* etags.c ends here */
diff --git a/test/etags/c-src/exit.c b/test/etags/c-src/exit.c
new file mode 100644
index 00000000000..b8cd22ba3c7
--- /dev/null
+++ b/test/etags/c-src/exit.c
@@ -0,0 +1,77 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "exit.h"
+
+#ifdef HAVE_GNU_LD
+CONST struct
+ {
+ size_t n;
+ void EXFUN((*fn[1]), (NOARGS));
+ } __libc_atexit;
+#endif
+
+/* Call all functions registered with `atexit' and `on_exit',
+ in the reverse of the order in which they were registered
+ perform stdio cleanup, and terminate program execution with STATUS. */
+__NORETURN
+void
+DEFUN(exit, (status), int status)
+{
+ register CONST struct exit_function_list *l;
+
+ for (l = __exit_funcs; l != NULL; l = l->next)
+ {
+ register size_t i = l->idx;
+ while (i-- > 0)
+ {
+ CONST struct exit_function *CONST f = &l->fns[i];
+ switch (f->flavor)
+ {
+ case ef_free:
+ break;
+ case ef_on:
+ (*f->func.on.fn)(status, f->func.on.arg);
+ break;
+ case ef_at:
+ (*f->func.at)();
+ break;
+ }
+ }
+ }
+
+#ifdef HAVE_GNU_LD
+ {
+ void EXFUN((*CONST *fn), (NOARGS));
+ for (fn = __libc_atexit.fn; *fn != NULL; ++fn)
+ (**fn) ();
+ }
+#else
+ {
+ extern void EXFUN(_cleanup, (NOARGS));
+ _cleanup();
+ }
+#endif
+
+ _exit(status);
+}
+
diff --git a/test/etags/c-src/exit.strange_suffix b/test/etags/c-src/exit.strange_suffix
new file mode 100644
index 00000000000..b8cd22ba3c7
--- /dev/null
+++ b/test/etags/c-src/exit.strange_suffix
@@ -0,0 +1,77 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "exit.h"
+
+#ifdef HAVE_GNU_LD
+CONST struct
+ {
+ size_t n;
+ void EXFUN((*fn[1]), (NOARGS));
+ } __libc_atexit;
+#endif
+
+/* Call all functions registered with `atexit' and `on_exit',
+ in the reverse of the order in which they were registered
+ perform stdio cleanup, and terminate program execution with STATUS. */
+__NORETURN
+void
+DEFUN(exit, (status), int status)
+{
+ register CONST struct exit_function_list *l;
+
+ for (l = __exit_funcs; l != NULL; l = l->next)
+ {
+ register size_t i = l->idx;
+ while (i-- > 0)
+ {
+ CONST struct exit_function *CONST f = &l->fns[i];
+ switch (f->flavor)
+ {
+ case ef_free:
+ break;
+ case ef_on:
+ (*f->func.on.fn)(status, f->func.on.arg);
+ break;
+ case ef_at:
+ (*f->func.at)();
+ break;
+ }
+ }
+ }
+
+#ifdef HAVE_GNU_LD
+ {
+ void EXFUN((*CONST *fn), (NOARGS));
+ for (fn = __libc_atexit.fn; *fn != NULL; ++fn)
+ (**fn) ();
+ }
+#else
+ {
+ extern void EXFUN(_cleanup, (NOARGS));
+ _cleanup();
+ }
+#endif
+
+ _exit(status);
+}
+
diff --git a/test/etags/c-src/fail.c b/test/etags/c-src/fail.c
new file mode 100644
index 00000000000..32482781b11
--- /dev/null
+++ b/test/etags/c-src/fail.c
@@ -0,0 +1 @@
+void (*prt_call())();
diff --git a/test/etags/c-src/getopt.h b/test/etags/c-src/getopt.h
new file mode 100644
index 00000000000..93a5cf77816
--- /dev/null
+++ b/test/etags/c-src/getopt.h
@@ -0,0 +1,125 @@
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/test/etags/c-src/h.h b/test/etags/c-src/h.h
new file mode 100644
index 00000000000..f86c00d64ad
--- /dev/null
+++ b/test/etags/c-src/h.h
@@ -0,0 +1,119 @@
+typedef enum
+{
+ ELEM_I/**< Comment Element i
+ Second comment line. */
+} Fails_t;
+typedef void Lang_function ();
+void Asm_labels ();
+typedef struct tpcmd
+{
+#define ggg hhh
+ union
+ {
+ } arg;
+}
+tpcmd;
+typedef struct foobar2_ {
+ fu int (*funcptr) (void *ptr);
+ long foo;
+ char bar;
+} foobar2;
+typedef enum
+{
+ DEVICE_SWP,
+ DEVICE_LAST
+} bsp_DevId;
+typedef union {
+ struct constant_args {
+ unsigned int burst;
+ } constant;
+} args;
+typedef int *regset;
+typedef int INT;
+typedef union abc
+{
+ int def;
+} ghi1;
+typedef union abc {
+ int def;
+} ghi2;
+typedef struct a {
+} b;
+#define c() d
+typedef struct an_extern_linkage *an_extern_linkage_ptr;
+typedef struct an_extern_linkage {
+ a_name_linkage_kind
+ kind;
+ /* The kind of external linkage ("C++" or "C"). */
+ a_byte_boolean
+ is_explicit;
+ /* TRUE if the external linkage requirement is
+ explicitly specified in the source; FALSE for the
+ default set for the translation unit as a whole. */
+#ifdef CL_CHANGES
+ a_byte_boolean is_curly_brace_form;
+#endif
+} an_extern_linkage;
+typedef struct pollfd pfdset[FD_SETSIZE];
+typedef union rtunion_def
+ {
+ int rtint;
+ char *rtstr;
+ struct rtx_def *rtx;
+ } womboid ;
+typedef union rtunion_def
+
+{
+
+ int rtint;
+ char *rtstr;
+ struct rtx_def *rtxp;
+ struct rtx_def rtxnp;
+
+}
+
+womboid
+
+;
+
+
+/* Leave the next two lines in that order. They exercise an old bug. */
+enum {dog, cat} animals;
+typedef void (_CALLBACK_ *signal_handler)(int);
+typedef void (_CALLBACK_ *signal_handler1)(int);
+/* comment */ #define ANSIC
+ #define ANSIC
+ #else
+typedef void (proc) ();
+typedef void OperatorFun(int opId);
+typedef int f(int a,
+ int b);
+struct my_struct {
+};
+typedef struct my_struct my_typedef;
+typedef RETSIGTYPE (*signal_handler_t) (int);
+#if 0
+ Date 04 May 87 235311 PDT (Mon)
+ Date: 04 May 87 23:53:11 PDT (Mon)
+#endif
+typedef unsigned char unchar;
+typedef int X, Y, Z;
+typedef mio mao;
+extern void ab();
+typedef struct a { } b;
+typedef struct b
+{
+} c;
+int (*oldhup)();
+request (*oldhup) ();
+int extvar;
+#define tag1
+#define aaaaaa \
+bbbbbb
+#define bbbbbb\
+cccccc
+#define cccccccccc
+#define enter_critical_section do { int pri = spl7();
+#define exit_critical_to_previous splarg (pri); } while (0)
+#define UNDEFINED
+struct re_pattern_buffer { unsigned char *buffer; };
diff --git a/test/etags/c-src/machsyscalls.c b/test/etags/c-src/machsyscalls.c
new file mode 100644
index 00000000000..44930c33cf3
--- /dev/null
+++ b/test/etags/c-src/machsyscalls.c
@@ -0,0 +1,10 @@
+/* Aliases for basic Mach system calls:
+ mach_task_self -> __mach_task_self, etc. */
+
+#include <gnu-stabs.h>
+
+#define SYSCALL(name, number, type, args, typed_args) \
+ function_alias (name, __##name, type, args, \
+ name typed_args)
+
+#include "mach_syscalls.h"
diff --git a/test/etags/c-src/machsyscalls.h b/test/etags/c-src/machsyscalls.h
new file mode 100644
index 00000000000..8b33dc4e7e5
--- /dev/null
+++ b/test/etags/c-src/machsyscalls.h
@@ -0,0 +1,31 @@
+SYSCALL (mach_msg_trap, -25,
+ mach_msg_return_t,
+ (msg, option, send_size,
+ rcv_size, rcv_name, timeout, notify),
+ (mach_msg_header_t *msg,
+ mach_msg_option_t option,
+ mach_msg_size_t send_size,
+ mach_msg_size_t rcv_size,
+ mach_port_t rcv_name,
+ mach_msg_timeout_t timeout,
+ mach_port_t notify))
+
+SYSCALL (mach_reply_port, -26,
+ mach_port_t,
+ (),
+ (void))
+
+SYSCALL (mach_thread_self, -27,
+ mach_port_t,
+ (),
+ (void))
+
+SYSCALL (mach_task_self, -28,
+ mach_port_t,
+ (),
+ (void))
+
+SYSCALL (mach_host_self, -29,
+ mach_port_t,
+ (),
+ (void))
diff --git a/test/etags/c-src/sysdep.h b/test/etags/c-src/sysdep.h
new file mode 100644
index 00000000000..298a0e4c5b2
--- /dev/null
+++ b/test/etags/c-src/sysdep.h
@@ -0,0 +1,57 @@
+/* Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdeps/unix/sysdep.h>
+
+#define ENTRY(name) \
+ .globl _##name; \
+ .align 2; \
+ _##name##:
+
+#define PSEUDO(name, syscall_name, args) \
+ .text; \
+ .globl syscall_error; \
+ ENTRY (name) \
+ XCHG_##args
+ movl $SYS_##syscall_name, %eax; \
+ int $0x80; \
+ test %eax, %eax; \
+ jl syscall_error; \
+ XCHG_##args
+
+/* Linux takes system call arguments in registers:
+ 1: %ebx
+ 2: %ecx
+ 3: %edx
+ 4: %esi
+ 5: %edi
+ We put the arguments into registers from the stack,
+ and save the registers, by using the 386 `xchg' instruction
+ to swap the values in both directions. */
+
+#define XCHG_0 /* No arguments to frob. */
+#define XCHG_1 xchg 8(%esp), %ebx; XCHG_0
+#define XCHG_2 xchg 12(%esp), %ecx; XCHG_1
+#define XCHG_3 xchg 16(%esp), %edx; XCHG_2
+#define XCHG_4 xchg 20(%esp), %esi; XCHG_3
+#define XCHG_5 xchg 24(%esp), %edi; XCHG_3
+
+#define r0 %eax /* Normal return-value register. */
+#define r1 %edx /* Secondary return-value register. */
+#define scratch %ecx /* Call-clobbered register for random use. */
+#define MOVE(x,y) movl x, y
diff --git a/test/etags/c-src/tab.c b/test/etags/c-src/tab.c
new file mode 100644
index 00000000000..b25d55cb2e8
--- /dev/null
+++ b/test/etags/c-src/tab.c
@@ -0,0 +1,112 @@
+/*
+** tab.c for in
+**
+** Made by Pierric
+** Login <pierric@seignobosc.com>
+**
+** Started on Thu Jan 24 18:36:47 2002 Pierric
+** Last update Mon Sep 23 18:02:02 2002 Pierric
+*/
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "my_malloc.h"
+
+static int count_words(char *str, char delim)
+{
+ int count;
+
+ count = 0;
+ while (*str)
+ {
+ if (*str != delim)
+ {
+ count++;
+ if (!strchr(str + 1, delim))
+ return (count);
+ str = strchr(str + 1, delim);
+ }
+ else
+ str++;
+ }
+ return (count);
+}
+
+static char *get_word(char **str, char delim)
+{
+ char *tmp;
+ char *new;
+
+ while (**str == delim)
+ (*str)++;
+ if (**str == 0)
+ return (NULL);
+ tmp = strchr(*str, delim);
+ if (!tmp)
+ {
+ new = strdup(*str);
+ while (**str)
+ (*str)++;
+ return (new);
+ }
+ my_malloc(new, tmp - *str + 1);
+ new[tmp - *str] = '\0';
+ strncpy(new, *str, tmp - *str);
+ *str = tmp;
+ return (new);
+}
+
+void tab_free(char **tab)
+{
+ int index;
+
+ if (!tab)
+ return;
+ for (index = 0; tab[index]; index++)
+ free(tab[index]);
+ free(tab);
+}
+
+char **tab_fill(char *str, char delim)
+{
+ int count;
+ char **tab;
+ int index;
+
+ if (!str)
+ return (NULL);
+ count = count_words(str, delim);
+ if (!count)
+ return (NULL);
+ my_malloc(tab, (count + 1) * sizeof(char *));
+ for (index = 0; (tab[index] = get_word(&str, delim)); index++)
+ ;
+ return (tab);
+}
+
+/*
+** Deletes the first element of a wordtab, shifting the other
+** elements. The size of the malloced area stays the same, though
+*/
+int tab_delete_first(char **tab)
+{
+ int i;
+
+ if (!tab[0])
+ return (-1);
+ free(tab[0]);
+ for (i = 0; tab[i]; i++)
+ tab[i] = tab[i + 1];
+ return (0);
+}
+
+int tab_count_words(char **tab)
+{
+ int count;
+
+ if (!tab)
+ return (0);
+ for (count = 0; tab[count]; count++)
+ ;
+ return (count);
+}
diff --git a/test/etags/c-src/torture.c b/test/etags/c-src/torture.c
new file mode 100644
index 00000000000..77c3763564a
--- /dev/null
+++ b/test/etags/c-src/torture.c
@@ -0,0 +1,107 @@
+/* Date: Thu, 05 Aug 1993 20:28:03 +0200
+ From: "Tom R.Hageman" <tom@basil.icce.rug.nl>
+ Subject: more etags torture;-) [etags 7.3 patch#3]
+ To: pot@CNUCE.CNR.IT
+
+ Hi,
+
+ This test file illustrates some more problems with etags (7.3):
+
+
+ 1. parentheses are confusing,
+ 2. preprocessor directives can disrupt other state machines. */
+
+/* A small torture test for etags. */
+
+/* The classic parenthesis nightmare, based on signal(). */
+void
+(*tag1 (sig, handler)) ()
+ int sig;
+ void (*handler) ();
+{
+ (*handler)(sig);
+ return handler;
+}
+
+#define notag2 void
+/* The classic, with user-defined return type. */
+notag2
+(*tag2 (sig, handler)) ()
+ int sig;
+ void (*handler) ();
+{
+ (*handler)(sig);
+ return handler;
+}
+
+/* The classic, in ANSI C style. */
+void
+(*tag3 (int sig, void (*handler) (int))) (int)
+{
+ (*handler)(sig);
+ return handler;
+}
+
+#define notag4 void
+/* The classic, with user-defined return type, in ANSI C style. */
+notag4
+(*tag4 (int sig, void (*handler) (int))) (int)
+{
+ (*handler)(sig);
+ return handler;
+}
+
+
+/* A less tortuous example. */
+void
+tag5 (handler, arg)
+void (*handler)();
+void *arg;
+{
+ (*handler)(arg);
+}
+
+/* A less tortuous example, in ANSI C style. */
+void
+tag6 (void (*handler) (void *), void *arg)
+{
+ (*handler)(arg);
+}
+
+
+/* Interfering preprocessing torture */
+
+int pp1(
+#if (__STDC__)
+ int
+#endif
+ bar)
+#if (!__STDC__)
+ int bar;
+#endif
+{
+ return bar;
+}
+
+int
+pp2
+#if __STDC__
+ (int bar)
+#else
+ (bar)
+ int bar;
+#endif
+{
+ return bar;
+}
+
+int
+#if __STDC__
+pp3(int bar)
+#else
+pp3(bar)
+ int bar;
+#endif
+{
+ return bar;
+}
diff --git a/test/etags/cp-src/MDiagArray2.h b/test/etags/cp-src/MDiagArray2.h
new file mode 100644
index 00000000000..78ee5e1523c
--- /dev/null
+++ b/test/etags/cp-src/MDiagArray2.h
@@ -0,0 +1,163 @@
+// Template array classes with like-type math ops
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#if defined (__GNUG__)
+#pragma interface
+#endif
+
+#if !defined (octave_MDiagArray2_h)
+#define octave_MDiagArray2_h 1
+
+#include "DiagArray2.h"
+#include "MArray2.h"
+
+#if defined (LTGT)
+#undef LTGT
+#endif
+
+#if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
+#define LTGT
+#else
+
+#define LTGT <>
+
+template <class T>
+class MDiagArray2;
+
+template <typename T> MDiagArray2<T>&
+operator += (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>&
+operator -= (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>
+operator * (const MDiagArray2<T>& a, const T& s);
+
+template <typename T> MDiagArray2<T>
+operator / (const MDiagArray2<T>& a, const T& s);
+
+template <typename T> MDiagArray2<T>
+operator * (const T& s, const MDiagArray2<T>& a);
+
+template <typename T> MDiagArray2<T>
+operator + (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>
+operator - (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>
+product (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>
+operator - (const MDiagArray2<T>& a);
+#endif
+
+// Two dimensional diagonal array with math ops.
+
+template <class T>
+class MDiagArray2 : public DiagArray2<T>
+{
+protected:
+
+ MDiagArray2 (T *d, int r, int c) : DiagArray2<T> (d, r, c) { }
+
+public:
+
+ MDiagArray2 (void) : DiagArray2<T> () { }
+ MDiagArray2 (int r, int c) : DiagArray2<T> (r, c) { }
+ MDiagArray2 (int r, int c, const T& val) : DiagArray2<T> (r, c, val) { }
+ MDiagArray2 (const Array<T>& a) : DiagArray2<T> (a) { }
+ MDiagArray2 (const DiagArray2<T>& a) : DiagArray2<T> (a) { }
+ MDiagArray2 (const MDiagArray2<T>& a) : DiagArray2<T> (a) { }
+
+ ~MDiagArray2 (void) { }
+
+ MDiagArray2<T>& operator = (const MDiagArray2<T>& a)
+ {
+ DiagArray2<T>::operator = (a);
+ return *this;
+ }
+
+ operator MArray2<T> () const
+ {
+ MArray2<T> retval (nr, nc, T (0));
+
+ int len = nr < nc ? nr : nc;
+
+ for (int i = 0; i < len; i++)
+ retval.xelem (i, i) = xelem (i, i);
+
+ return retval;
+ }
+
+ // element by element MDiagArray2 by MDiagArray2 ops
+
+ friend MDiagArray2<T>&
+ operator += LTGT (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+ friend MDiagArray2<T>&
+ operator -= LTGT (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+ // element by element MDiagArray2 by scalar ops
+
+ friend MDiagArray2<T> operator * LTGT (const MDiagArray2<T>& a, const T& s);
+ friend MDiagArray2<T> operator / LTGT (const MDiagArray2<T>& a, const T& s);
+
+ // element by element scalar by MDiagArray2 ops
+
+ friend MDiagArray2<T> operator * LTGT (const T& s, const MDiagArray2<T>& a);
+
+ // element by element MDiagArray2 by MDiagArray2 ops
+
+ friend MDiagArray2<T>
+ operator + LTGT (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+ friend MDiagArray2<T>
+ operator - LTGT (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+ friend MDiagArray2<T>
+ product LTGT (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+ friend MDiagArray2<T> operator - LTGT (const MDiagArray2<T>& a);
+};
+
+#undef LTGT
+
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(T) \
+ template MDiagArray2<T>& operator += (MDiagArray2<T>& a, const MDiagArray2<T>& b); \
+ template MDiagArray2<T>& operator -= (MDiagArray2<T>& a, const MDiagArray2<T>& b); \
+ template MDiagArray2<T> operator * (const MDiagArray2<T>& a, const T& s); \
+ template MDiagArray2<T> operator / (const MDiagArray2<T>& a, const T& s); \
+ template MDiagArray2<T> operator * (const T& s, const MDiagArray2<T>& a); \
+ template MDiagArray2<T> operator + (const MDiagArray2<T>& a, const MDiagArray2<T>& b); \
+ template MDiagArray2<T> operator - (const MDiagArray2<T>& a, const MDiagArray2<T>& b); \
+ template MDiagArray2<T> product (const MDiagArray2<T>& a, const MDiagArray2<T>& b); \
+ template MDiagArray2<T> operator - (const MDiagArray2<T>& a);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
diff --git a/test/etags/cp-src/Range.h b/test/etags/cp-src/Range.h
new file mode 100644
index 00000000000..b8cbab47ebf
--- /dev/null
+++ b/test/etags/cp-src/Range.h
@@ -0,0 +1,96 @@
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING. If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#if !defined (octave_Range_h)
+#define octave_Range_h 1
+
+#if defined (__GNUG__)
+#pragma interface
+#endif
+
+class istream;
+class ostream;
+class Matrix;
+
+class
+Range
+{
+ public:
+
+ Range (void)
+ : rng_base (-1), rng_limit (-1), rng_inc (-1), rng_nelem (-1) { }
+
+ Range (const Range& r)
+ : rng_base (r.rng_base), rng_limit (r.rng_limit), rng_inc (r.rng_inc),
+ rng_nelem (r.rng_nelem) { }
+
+ Range (double b, double l)
+ : rng_base (b), rng_limit (l), rng_inc (1),
+ rng_nelem (nelem_internal ()) { }
+
+ Range (double b, double l, double i)
+ : rng_base (b), rng_limit (l), rng_inc (i),
+ rng_nelem (nelem_internal ()) { }
+
+ double base (void) const { return rng_base; }
+ double limit (void) const { return rng_limit; }
+ double inc (void) const { return rng_inc; }
+ int nelem (void) const { return rng_nelem; }
+
+ bool all_elements_are_ints (void) const;
+
+ Matrix matrix_value (void) const;
+
+ double min (void) const;
+ double max (void) const;
+
+ void sort (void);
+
+ void set_base (double b) { rng_base = b; }
+ void set_limit (double l) { rng_limit = l; }
+ void set_inc (double i) { rng_inc = i; }
+
+ friend ostream& operator << (ostream& os, const Range& r);
+ friend istream& operator >> (istream& is, Range& r);
+
+ void print_range (void);
+
+ private:
+
+ double rng_base;
+ double rng_limit;
+ double rng_inc;
+
+ int rng_nelem;
+
+ int nelem_internal (void) const;
+};
+
+extern Range operator - (const Range& r);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
diff --git a/test/etags/cp-src/burton.cpp b/test/etags/cp-src/burton.cpp
new file mode 100644
index 00000000000..d86ad758d81
--- /dev/null
+++ b/test/etags/cp-src/burton.cpp
@@ -0,0 +1,14 @@
+::dummy::dummy test::dummy1(void)
+{
+ return ::dummy::dummy;
+}
+
+::dummy::dummy test::dummy2(::CORBA::Long dummy)
+{
+ return ::dummy::dummy;
+}
+
+::dummy::dummy test::dummy3(char* name, ::CORBA::Long dummy)
+{
+ return ::dummy::dummy;
+}
diff --git a/test/etags/cp-src/c.C b/test/etags/cp-src/c.C
new file mode 100644
index 00000000000..2c5f7e01fac
--- /dev/null
+++ b/test/etags/cp-src/c.C
@@ -0,0 +1,156 @@
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned numOfChannels, typename ipc3dLinkControl, typename ipc3dLinkControlSetup>
+class CMultiChannelCSC19_3D
+{
+private:
+ ipc3dLinkControlSetup setup;
+ ipc3dCSC19<ipc3dIslandHierarchy,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipc3dLinkControl> mcCSC;
+ advTimer cscInitTime;
+ advTimer cscSegmentationTime;
+ advTimer outputTime;
+public:
+ void execute(CPluginCSCState& p, int w, int h, int d, const ipcMultiChannel<ipc3dChannelType,numOfChannels>* orgImage, ipcMultiChannel<ipc3dChannelType,numOfChannels>* regionImage, unsigned int* mapImage, ipc3dBlockCompressedLabelImage* compressedMapImage=NULL)
+ {
+ if (orgImage!=NULL)
+ {
+ //do something
+ }
+ }
+
+class foo {
+ int const_func() const;
+ int b;
+ int non_const_func2(void);
+};
+static void my_function1(int var1) const;
+int main (void) { my_function0(0); my_function1(1); return; }
+double base (void) const { return rng_base; }
+
+template <typename T> MDiagArray2<T>&
+operator += (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+class TestRecord;
+typedef struct s1 {
+ int counter;
+} t1;
+struct s2 {
+ int counter;
+};
+typedef struct s2 t2;
+class A {
+ enum { rosso, giallo, verde } colori;
+ const A& operator+(const A&);
+};
+const A& A::operator+(const A&) { }
+void operator+(int, int) {}
+void operator -(int, int) {}
+void operator int(int, int) {}
+
+A<int>* f() {}
+int f(A<int> x) {}
+int A<int>::f(A<int>* x) {}
+A<float,B<int> > A<B<float>,int>::f(A<int>* x) {}
+template <class C, int n> class AT { C t[n]; };
+class AU { T x; };
+class B<int> { void f() {} };
+const A::B::T& abt = abc;
+class A { class B { int f(); }; };
+class A {
+ int get_data() const;
+ A operator+(A& a) {};
+};
+is_muldiv_operation(pc)
+{
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+domain foo {
+ void f() {}
+};
+
+void A::A() {}
+struct A { A(); }
+struct B { B(); };
+void B::B() {}
+void BE_Node::BE_Node() {}
+class BE_Node {};
+
+struct foo {
+ int x;
+};
+
+#ifdef __cplusplus
+}
+#endif
+class test {
+ int f(){return 0;}; // first comment
+ // second comment
+ int ff(){return 1;};
+ int g(){return 2;};
+}
+class AST_Root : public virtual AST_Module
+{
+};
+
+class AST_Root; // The root of an AST 112,3888
+// etags finds
+
+AST_ConcreteType::AST_ConcreteType(AST_Decl::NodeType nt, UTL_ScopedName *n,
+ UTL_StrList *p)
+ : AST_Decl(nt, n, p)
+{
+}
+
+// and
+
+AST_Array::AST_Array(UTL_ScopedName *n, unsigned long nd, UTL_ExprList *ds)
+ : pd_n_dims(nd), pd_base_type(NULL),
+ AST_Decl(AST_Decl::NT_array, n, NULL)
+{
+}
+
+// as definitions of AST_Decl.
+class {
+ void f() {}
+};
+struct A {
+ ~A();
+};
+A::~A() {}
+
+struct B {
+ ~B() {};
+};
+
+enum {dog, cat} animals;
+struct {int teats;} cow;
+
+class Boo {
+ enum {dog, cat} animals;
+ struct {int treats;} cow;
+ int i,a,b;
+ foo() {
+ cout << "hi";
+ }
+
+ Boo(int _i, int _a, int _b) : i(_i), a(_a), b(_b) {}
+ Boo(Boo);
+};
+
+Boo::Boo(Boo) :
+ i(i),
+ a(a),
+ b(b)
+{}
+
+/* extern "C" grot: */
+extern "C" {
+typedef int should_see_this_one_enclosed_in_extern_C;
+}
+
+/* Typedefs: */
+typedef int (*should_see_this_function_pointer) (
+ void *but_not_this_argument);
+
+typedef int should_see_this_array_type[but_not_this_subscript];
diff --git a/test/etags/cp-src/clheir.cpp.gz b/test/etags/cp-src/clheir.cpp.gz
new file mode 100644
index 00000000000..38b08a8e7f8
--- /dev/null
+++ b/test/etags/cp-src/clheir.cpp.gz
Binary files differ
diff --git a/test/etags/cp-src/clheir.hpp b/test/etags/cp-src/clheir.hpp
new file mode 100644
index 00000000000..a9245637413
--- /dev/null
+++ b/test/etags/cp-src/clheir.hpp
@@ -0,0 +1,82 @@
+/* ======================================================================= */
+/* CLHEIR.H */
+/* ======================================================================= */
+
+// CLASS HEIRARCHY
+// Locations or Agents are both of type generic_object. Generic_objects may
+// have states, and are responsible for updating their states appropriately
+// when their step() functions are executed.
+
+extern void init_registry(void);
+extern void step_everybody(void);
+
+class generic_object
+ {
+ int where_in_registry;
+public:
+ generic_object(); // enter generic_object into ObjectRegistry
+ // We never copy generic_objects, so we don't need a copy constructor.
+ ~generic_object(void); // delete from ObjectRegistry
+ // Simulation steps, accomodate different kinds of time
+ virtual void compute_next_state(void) { }
+ virtual void step(void) { }
+ };
+
+// =======================================================================
+
+// Locations can be regular (like a field of squares or hexagons) or
+// irregular. Regular locations have 2-D or 3-D positions represented
+// by integers. Locations are never copied; no need for copy constructors.
+
+const int max_num_directions = 6; // handles both cubes and hexagons
+
+class location: public generic_object
+ {
+ // Any kind of location needs a physical position, but for a regular
+ // location, this may be implicit, and for an irregular location, it
+ // should be custom-defined.
+
+ // Any kind of location needs a private list of neighbors, but for a
+ // regular location, this may be implicit.
+
+public:
+ location() { }
+ ~location();
+ };
+
+class irregular_location: public location
+ {
+ double x, y, z;
+public:
+ irregular_location(double xi, double yi, double zi)
+ { x = xi; y = yi; z = zi; }
+ ~irregular_location();
+ };
+
+class discrete_location: public location
+ {
+ int x, y, z;
+ class location *neighbors[max_num_directions];
+ void clear_neighbors(void);
+public:
+ discrete_location(int xi, int yi, int zi):
+ x(xi), y(yi), z(zi)
+ { clear_neighbors(); }
+ ~discrete_location(void);
+ void assign_neighbor(int direction, location *x)
+ { neighbors[direction] = x; }
+ };
+
+// =======================================================================
+
+// Agents are generic_objects with locations, who can move. Examples in
+// Pacman would be the protagonist, the monsters, and the monsters' ghosts.
+
+class agent: public generic_object
+ {
+ location *where;
+public:
+ agent();
+ ~agent();
+ void move(int);
+ };
diff --git a/test/etags/cp-src/conway.cpp b/test/etags/cp-src/conway.cpp
new file mode 100644
index 00000000000..1e600147ed9
--- /dev/null
+++ b/test/etags/cp-src/conway.cpp
@@ -0,0 +1,95 @@
+/* ======================================================================= */
+/* CONWAY.CPP */
+/* ======================================================================= */
+
+#include "assert.h"
+#include "iostream.h"
+#include "conio.h"
+#include "clheir.h"
+#include "screen.h"
+#include "conway.h"
+
+#define max(x,y) ((x > y) ? x : y)
+#define min(x,y) ((x > y) ? y : x)
+
+const int num_rows = min(50, NUM_ROWS);
+const int num_columns = 40;
+
+class site *field_of_play[num_rows][num_columns];
+
+int site::total_surrounding(void)
+ {
+ int i, j, imin, imax, jmin, jmax, total;
+
+ total = 0;
+ imin = max(0, x - 1);
+ imax = min(num_rows - 1, x + 1);
+ jmin = max(0, y - 1);
+ jmax = min(num_columns - 1, y + 1);
+
+ for (i = imin; i <= imax; i++)
+ for (j = jmin; j <= jmax; j++)
+ if (field_of_play[i][j]->read()) total++;
+ if (alive) total--;
+ return total;
+ }
+
+void display(void)
+ {
+ int i, j;
+
+ for (i = 0; i < num_rows; i++)
+ for (j = 0; j < num_columns; j++)
+ {
+ if (field_of_play[i][j]->read()) write_xyc(2*j, i, 'X');
+ else write_xyc(2*j, i, '.');
+ }
+ hide_cursor();
+ }
+
+void glider(int x, int y)
+ {
+ field_of_play[x - 1][y + 0]->set();
+ field_of_play[x - 1][y + 1]->set();
+ field_of_play[x + 0][y - 1]->set();
+ field_of_play[x + 0][y + 0]->set();
+ field_of_play[x + 1][y + 1]->set();
+ }
+
+void traffic_light(int x, int y)
+ {
+ field_of_play[x - 1][y]->set();
+ field_of_play[x + 0][y]->set();
+ field_of_play[x + 1][y]->set();
+ }
+
+
+void main(void)
+ {
+ int i, j, c;
+
+ init_registry();
+
+ for (i = 0; i < num_rows; i++)
+ for (j = 0; j < num_columns; j++)
+ field_of_play[i][j] = new site(i, j);
+
+start_over:
+ traffic_light(num_rows/2 - 8, num_columns/2 - 8);
+ glider(num_rows/2 + 8, num_columns/2 + 8);
+
+ clear_screen();
+ while (1)
+ {
+ display();
+ if ((c = getch()) == 'q') { clear_screen(); return; }
+ if (c == 'i')
+ {
+ for (i = 0; i < num_rows; i++)
+ for (j = 0; j < num_columns; j++)
+ field_of_play[i][j]->clear();
+ goto start_over;
+ }
+ step_everybody();
+ }
+ }
diff --git a/test/etags/cp-src/conway.hpp b/test/etags/cp-src/conway.hpp
new file mode 100644
index 00000000000..9fbb2517526
--- /dev/null
+++ b/test/etags/cp-src/conway.hpp
@@ -0,0 +1,23 @@
+/* ======================================================================= */
+/* CONWAY.H */
+/* ======================================================================= */
+
+class site: public location
+ {
+ char x, y, alive, next_alive;
+ int total_surrounding(void);
+public:
+ site(int xi, int yi): x(xi), y(yi), alive(0) { }
+ ~site();
+ char read() { return alive; }
+ void set(void) { alive = 1; }
+ void clear(void) { alive = 0; }
+ void compute_next_state(void)
+ {
+ int n = total_surrounding();
+ next_alive = alive;
+ if (n < 2 || n > 3) next_alive = 0;
+ else if (n > 2) next_alive = 1;
+ }
+ void step(void) { alive = next_alive; }
+ };
diff --git a/test/etags/cp-src/fail.C b/test/etags/cp-src/fail.C
new file mode 100644
index 00000000000..c602ed26396
--- /dev/null
+++ b/test/etags/cp-src/fail.C
@@ -0,0 +1,52 @@
+/* Examples provided by Sam Kendall <kendall@mv.mv.com>, Jan 1997 */
+
+// check use of references with nested/local classes
+
+// This example causes etags 13 to abort when compiled with -DDEBUG.
+// Etags 13 cannot deal with nested structures after the first level.
+struct A {
+ struct B {
+ struct C {
+ int x;
+ C(int i) {x = i;}
+ operator int() const {return x;}
+ };
+ typedef C T;
+ };
+ typedef B T2;
+};
+
+
+class String;
+
+
+class A {
+ class B {
+ class C {};
+ int f() { return 5; }
+ };
+};
+
+
+int A::B::f() { return 2; }
+
+
+A::B::C abc(-37);
+
+
+main()
+{
+ if (abc != -37 || abt != -37) return 1;
+
+ class D : public A::B::C {
+ public:
+ D() : ::A::T2::T(97), x(1066) {}
+ int x;
+ } &d = D();
+
+ if (d.x != 1066 || d.A::T2::T::x != 97) return 2;
+ return 0;
+}
+
+
+template <class T>
diff --git a/test/etags/cp-src/functions.cpp b/test/etags/cp-src/functions.cpp
new file mode 100644
index 00000000000..fb546ed4de8
--- /dev/null
+++ b/test/etags/cp-src/functions.cpp
@@ -0,0 +1,239 @@
+#include "main.hpp"
+#pragma ident "@(#)functions.cpp 1.0 98/11/12 (c) Rupak Rathore"
+
+// Constructor default argument initialises to today's values
+void Date::setDate ( int d , int m , int y ){
+ time_t t;
+ struct tm * ptm;
+ t = time ( NULL ) ;
+ if ( date != NULL )
+ delete date;
+ date = NULL;
+ if ( d == 0 && m == 0 && y == 0 ) // explicity called or default constructor hence leave it.
+ return;
+ if ( d < 0 && m < 0 && d < 0 ) // Special instruction to intialise to today's value
+ d=m=y=0;
+ date = new tm;
+ ptm=localtime ( &t ) ;
+ *date=(*ptm);
+ if ( d )
+ date->tm_mday = d;
+ if ( m )
+ date->tm_mon = m - 1; // Months are counted from January
+ if ( y > 1900 ) // Complete year specified so take into account
+ y -= 1900;
+ if ( y )
+ date->tm_year = y;
+ date->tm_sec=date->tm_min=date->tm_hour=0;
+ t = mktime ( date ) ;
+}
+
+// Addition operation ::: Warning ::: A combination of addition and substraction does not give a proper result
+void Date::plus ( int days , int month , int year ){
+ if ( ! set () )
+ return;
+ date->tm_mday += days ;
+ date->tm_mon += month ;
+ date->tm_year += year ;
+ mktime ( date );
+}
+
+//Substraction operation ::: Warning ::: A combination of addition and substraction does not give a proper result
+void Date::minus ( int days , int month , int year ){
+ if ( ! set () )
+ return;
+ date->tm_mday -= days ;
+ date->tm_mon -= month ;
+ date->tm_year -= year ;
+ mktime ( date );
+}
+
+
+void Date::shift ( void ){//Shift this date to previous working days (useful for benchmarks)
+ if ( ! set() )
+ return ;
+ while(isHoliday(*this)||isweekend()){
+ date->tm_mday -= 1 ;
+ mktime ( date );
+ }
+}
+
+// Assignment
+Date & Date::operator = ( Date d ){
+ if ( d.set() )
+ setDate ( d.date->tm_mday, d.date->tm_mon + 1, d.date->tm_year );
+ return(*this);
+}
+
+// Add number of days
+Date & Date::operator += ( int days ){
+ if ( set () ){
+ date->tm_mday += days ;
+ mktime ( date );
+ }
+ return(*this);
+}
+
+// Substract number of days
+Date & Date::operator -= ( int days ){
+ if ( set () ){
+ date->tm_mday -= days ;
+ mktime ( date );
+ }
+ return(*this);
+}
+
+// Advance one day
+Date & Date::operator ++ ( void ){
+ if ( set () ){
+ date->tm_mday += 1 ;
+ mktime ( date );
+ }
+ return(*this);
+}
+
+// Backwards one day
+Date & Date::operator -- ( void ){
+ if ( set () ){
+ date->tm_mday -= 1 ;
+ mktime ( date );
+ }
+ return(*this);
+}
+
+int Date::operator - ( Date d ){
+ long l;
+ if (( ! set() ) || (! d.set()))
+ return(0);
+ l=(mktime(date)-mktime(d.date))/(3600*24);
+ return((int)l);
+}
+
+int Date::operator < ( Date d ) {
+ return ( unidate() < d.unidate() );
+}
+
+int Date::operator > ( Date d ) {
+ return ( unidate() > d.unidate() );
+}
+
+int Date::operator == ( Date d ) {
+ return ( unidate() == d.unidate() );
+}
+
+ostream& operator << ( ostream &c, Date d ) {
+ if ( ! d.set() )
+ c << "Null";
+ else
+ c << d.date->tm_mday << ":" << d.date->tm_mon + 1 << ":" << d.date->tm_year + 1900 ;
+ return ( c );
+}
+
+// Modified to read date in yyyymmdd format.
+istream& operator >> ( istream &i, Date & dd ){
+ int d,m,y,tmp;
+ i >> tmp;
+ d=tmp%100;
+ tmp/=100;
+ m=tmp%100;
+ tmp/=100;
+ y=tmp;
+ dd.setDate(d,m,y);
+ return(i);
+}
+/*
+istream& operator >> ( istream &i, Date &dd ) {
+ char input[11];
+ int d,m,y;
+ cout << "Enter the date ( dd-mm-yyyy ) : ";
+ i >> input ;
+ d = ( input[0] - '0' ) * 10 + ( input[1] - '0' );
+ m = ( input[3] - '0' ) * 10 + ( input[4] - '0' );
+ y = ( input[6] - '0' ) * 1000 + ( input[7] - '0' ) * 100 + ( input[8] - '0' ) * 10 + ( input[9] - '0' );
+ dd.setDate ( d, m, y );
+ return ( i );
+}
+*/
+
+// Check whether given year is leap or not
+bool isLeap ( int year ){
+ return ( (year%100==0) ? (year%400==0) : (year%4==0) );
+}
+
+bool isHoliday ( Date d ){
+ long int ld;
+ ld = ( d.year()*100 + d.month() )*100 + d.day();
+ for ( int i=0; i<no_of_vacations;i++)
+ if ( ld == vacation[i] )
+ return(true);
+ return(false);
+}
+
+// Sort the given array in ascending order
+void asort(int *a, int num){
+ int i,k,mini,tmp;
+ for ( k=1; k<num; k++ ){
+ mini=k-1;
+ for ( i=k; i<num; i++ )
+ if ( a[mini] > a[i] ) {
+ tmp=a[i];
+ a[i]=a[mini];
+ a[mini]=tmp;
+ }
+ }
+}
+
+void ReadVacation ( char *filename ) {
+ // cerr << filename;
+ ifstream vacfile(filename);
+ if ( ! vacfile.good() )
+ d_error("ReadVacation","Unable to find the vacation and holidays file");
+ // cerr << filename ;
+ d_silent("ReadVacation","vacation file successfully opened.");
+ no_of_vacations = 0;
+ while ( !vacfile.eof() )
+ vacfile >> vacation[no_of_vacations++];
+ --no_of_vacations;
+ d_silent("ReadVacation","Finished Reading file");
+ vacfile.close();
+}
+
+void Debug ( int lineno, int level, char* func , char* mesg ) // error_level, function, message
+{
+ if ( debug_level <= level )
+ cerr << PROGNAME << ": " << func << ": " << lineno << ": " << debug_string[level] << ": " << mesg << endl;
+ if ( level == ERROR ){
+ cerr << PROGNAME << ": Exiting because of fatal error." <<endl ;
+ exit(2);
+ }
+}
+
+int WorkingDays(Date a, Date b){
+ Date tmp;
+ int wdays=0,days=0;
+ if ( (! a.set()) || (! b.set()) )
+ return(0);
+ days=b-a+1; // Inclusive
+ tmp=a;
+ for ( int i=0;i<days;i++){
+ if((!isHoliday(tmp))&&(!tmp.isweekend()))
+ wdays++;
+ tmp++;
+ }
+ return(wdays);
+}
+
+Date StartDay(Date a,int days){//Function to calculate the apropriate start day to finish in days working days
+ Date tmp;
+ int wdays=0;
+ if ( ! a.set() )
+ return (a);
+ tmp=a;
+ while(wdays<days){
+ if((!isHoliday(tmp))&&(!tmp.isweekend()))
+ wdays++;
+ tmp--;
+ }
+ tmp++;
+ return(tmp);
+}
diff --git a/test/etags/cp-src/screen.cpp b/test/etags/cp-src/screen.cpp
new file mode 100644
index 00000000000..1958a19d628
--- /dev/null
+++ b/test/etags/cp-src/screen.cpp
@@ -0,0 +1,62 @@
+/* ======================================================================= */
+/* SCREEN.CPP */
+/* ======================================================================= */
+
+#include "stdio.h"
+#include "stdlib.h"
+#include "dos.h"
+
+#include "screen.h"
+
+/* ----------------------------------------------------------------------- */
+/* Cursor Position and Screen Buffering Functions */
+/* ----------------------------------------------------------------------- */
+
+unsigned char cursor_x, cursor_y;
+static union REGS regs;
+
+void goto_xy(unsigned char x, unsigned char y)
+ {
+ regs.h.ah = 2;
+ regs.h.bh = 0;
+ regs.h.dh = y;
+ regs.h.dl = x;
+ int86(0x10, &regs, &regs);
+ }
+
+void hide_cursor(void)
+ {
+ goto_xy(0, NUM_ROWS);
+ }
+
+void cursor_position(void)
+ {
+ regs.h.ah = 3;
+ regs.h.bh = 0;
+ int86(0x10, &regs, &regs);
+ cursor_x = regs.h.dl;
+ cursor_y = regs.h.dh;
+ }
+
+void clear_screen(void)
+ {
+ unsigned int i, j;
+ char far *p;
+
+ p = SCREEN_START;
+ for (i = 0; i < NUM_ROWS; i++)
+ for (j = 0; j < 80; j++)
+ {
+ *p++ = ' ';
+ *p++ = LIGHTGRAY;
+ }
+ }
+
+void write_xyc(int x, int y, char c)
+ {
+ char far *p;
+
+ p = SCREEN_FP(x, y);
+ *p++ = c;
+ *p = LIGHTGRAY;
+ }
diff --git a/test/etags/cp-src/screen.hpp b/test/etags/cp-src/screen.hpp
new file mode 100644
index 00000000000..a7099a3379d
--- /dev/null
+++ b/test/etags/cp-src/screen.hpp
@@ -0,0 +1,39 @@
+/* ======================================================================= */
+/* SCREEN.H */
+/* ======================================================================= */
+
+// This stuff is entirely non-portable MSDOS-ish code. Note the hardware
+// address below, for the standard location of the EGA video buffer.
+
+#if !defined(__COLORS)
+#define __COLORS
+
+enum COLORS {
+ BLACK, /* dark colors */
+ BLUE,
+ GREEN,
+ CYAN,
+ RED,
+ MAGENTA,
+ BROWN,
+ LIGHTGRAY,
+ DARKGRAY, /* light colors */
+ LIGHTBLUE,
+ LIGHTGREEN,
+ LIGHTCYAN,
+ LIGHTRED,
+ LIGHTMAGENTA,
+ YELLOW,
+ WHITE
+};
+#endif
+
+#define SCREEN_FP(x,y) \
+ ((char far *) (0xB8000000L | ((unsigned) (160 * (y) + 2 * (x)))))
+#define SCREEN_START SCREEN_FP(0, 0)
+
+void goto_xy(unsigned char x, unsigned char y);
+void hide_cursor(void);
+void cursor_position(void);
+void clear_screen(void);
+void write_xyc(int x, int y, char c);
diff --git a/test/etags/el-src/TAGTEST.EL b/test/etags/el-src/TAGTEST.EL
new file mode 100644
index 00000000000..acf0baf82f0
--- /dev/null
+++ b/test/etags/el-src/TAGTEST.EL
@@ -0,0 +1,31 @@
+(foo::defmumble bletch beuarghh)
+;;; Ctags test file for lisp mode.
+
+;; from emacs/lisp/delsel.el:76:
+(defalias 'pending-delete-mode 'delete-selection-mode)
+
+;; compare with:
+(defalias (quote explicitly-quoted-pending-delete-mode) 'delete-selection-mode)
+
+;;
+;; Output from original ctags:
+;;
+;'pending-delete-mode tagstest.el /^(defalias 'pending-delete-mode 'delete-selection-m/
+;(quote tagstest.el /^(defalias (quote explicitly-quoted-pending-delete-/
+;;
+;; Output from ctags with my patch in L-getit():
+;;
+;pending-delete-mode tagstest.el /^(defalias 'pending-delete-mode 'delete-selection-m/
+;explicitly-quoted-pending-delete-mode tagstest.el /^(defalias (quote explicitly-quoted-pending-delete-/
+;; Output from original etags:
+;;
+;tagstest.el,61
+;(defalias 'pending-delete-mode 4,68
+;(defalias (quote 7,141
+;;
+;; Output from patched etags:
+;;
+;tagstest.el,99
+;(defalias 'pending-delete-mode 4,68
+;(defalias (quote explicitly-quoted-pending-delete-mode)7,141
+;;
diff --git a/test/etags/el-src/emacs/lisp/progmodes/etags.el b/test/etags/el-src/emacs/lisp/progmodes/etags.el
new file mode 100644
index 00000000000..6acafdbaba0
--- /dev/null
+++ b/test/etags/el-src/emacs/lisp/progmodes/etags.el
@@ -0,0 +1,2153 @@
+;;; etags.el --- etags facility for Emacs -*- lexical-binding: t -*-
+
+;; Copyright (C) 1985-1986, 1988-1989, 1992-1996, 1998, 2000-2015 Free
+;; Software Foundation, Inc.
+
+;; Author: Roland McGrath <roland@gnu.org>
+;; Maintainer: emacs-devel@gnu.org
+;; Keywords: tools
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ring)
+(require 'button)
+(require 'xref)
+
+;;;###autoload
+(defvar tags-file-name nil
+ "File name of tags table.
+To switch to a new tags table, setting this variable is sufficient.
+If you set this variable, do not also set `tags-table-list'.
+Use the `etags' program to make a tags table file.")
+;; Make M-x set-variable tags-file-name like M-x visit-tags-table.
+;;;###autoload (put 'tags-file-name 'variable-interactive (purecopy "fVisit tags table: "))
+;;;###autoload (put 'tags-file-name 'safe-local-variable 'stringp)
+
+(defgroup etags nil "Tags tables."
+ :group 'tools)
+
+;;;###autoload
+(defcustom tags-case-fold-search 'default
+ "Whether tags operations should be case-sensitive.
+A value of t means case-insensitive, a value of nil means case-sensitive.
+Any other value means use the setting of `case-fold-search'."
+ :group 'etags
+ :type '(choice (const :tag "Case-sensitive" nil)
+ (const :tag "Case-insensitive" t)
+ (other :tag "Use default" default))
+ :version "21.1")
+
+;;;###autoload
+;; Use `visit-tags-table-buffer' to cycle through tags tables in this list.
+(defcustom tags-table-list nil
+ "List of file names of tags tables to search.
+An element that is a directory means the file \"TAGS\" in that directory.
+To switch to a new list of tags tables, setting this variable is sufficient.
+If you set this variable, do not also set `tags-file-name'.
+Use the `etags' program to make a tags table file."
+ :group 'etags
+ :type '(repeat file))
+
+;;;###autoload
+(defcustom tags-compression-info-list
+ (purecopy '("" ".Z" ".bz2" ".gz" ".xz" ".tgz"))
+ "List of extensions tried by etags when `auto-compression-mode' is on.
+An empty string means search the non-compressed file."
+ :version "24.1" ; added xz
+ :type '(repeat string)
+ :group 'etags)
+
+;; !!! tags-compression-info-list should probably be replaced by access
+;; to directory list and matching jka-compr-compression-info-list. Currently,
+;; this implementation forces each modification of
+;; jka-compr-compression-info-list to be reflected in this var.
+;; An alternative could be to say that introducing a special
+;; element in this list (e.g. t) means : try at this point
+;; using directory listing and regexp matching using
+;; jka-compr-compression-info-list.
+
+
+;;;###autoload
+(defcustom tags-add-tables 'ask-user
+ "Control whether to add a new tags table to the current list.
+t means do; nil means don't (always start a new list).
+Any other value means ask the user whether to add a new tags table
+to the current list (as opposed to starting a new list)."
+ :group 'etags
+ :type '(choice (const :tag "Do" t)
+ (const :tag "Don't" nil)
+ (other :tag "Ask" ask-user)))
+
+(defcustom tags-revert-without-query nil
+ "Non-nil means reread a TAGS table without querying, if it has changed."
+ :group 'etags
+ :type 'boolean)
+
+(defvar tags-table-computed-list nil
+ "List of tags tables to search, computed from `tags-table-list'.
+This includes tables implicitly included by other tables. The list is not
+always complete: the included tables of a table are not known until that
+table is read into core. An element that is t is a placeholder
+indicating that the preceding element is a table that has not been read
+into core and might contain included tables to search.
+See `tags-table-check-computed-list'.")
+
+(defvar tags-table-computed-list-for nil
+ "Value of `tags-table-list' that `tags-table-computed-list' corresponds to.
+If `tags-table-list' changes, `tags-table-computed-list' is thrown away and
+recomputed; see `tags-table-check-computed-list'.")
+
+(defvar tags-table-list-pointer nil
+ "Pointer into `tags-table-computed-list' for the current state of searching.
+Use `visit-tags-table-buffer' to cycle through tags tables in this list.")
+
+(defvar tags-table-list-started-at nil
+ "Pointer into `tags-table-computed-list', where the current search started.")
+
+(defvar tags-table-set-list nil
+ "List of sets of tags table which have been used together in the past.
+Each element is a list of strings which are file names.")
+
+;;;###autoload
+(defcustom find-tag-hook nil
+ "Hook to be run by \\[find-tag] after finding a tag. See `run-hooks'.
+The value in the buffer in which \\[find-tag] is done is used,
+not the value in the buffer \\[find-tag] goes to."
+ :group 'etags
+ :type 'hook)
+
+;;;###autoload
+(defcustom find-tag-default-function nil
+ "A function of no arguments used by \\[find-tag] to pick a default tag.
+If nil, and the symbol that is the value of `major-mode'
+has a `find-tag-default-function' property (see `put'), that is used.
+Otherwise, `find-tag-default' is used."
+ :group 'etags
+ :type '(choice (const nil) function))
+
+(define-obsolete-variable-alias 'find-tag-marker-ring-length
+ 'xref-marker-ring-length "25.1")
+
+(defcustom tags-tag-face 'default
+ "Face for tags in the output of `tags-apropos'."
+ :group 'etags
+ :type 'face
+ :version "21.1")
+
+(defcustom tags-apropos-verbose nil
+ "If non-nil, print the name of the tags file in the *Tags List* buffer."
+ :group 'etags
+ :type 'boolean
+ :version "21.1")
+
+(defcustom tags-apropos-additional-actions nil
+ "Specify additional actions for `tags-apropos'.
+
+If non-nil, value should be a list of triples (TITLE FUNCTION
+TO-SEARCH). For each triple, `tags-apropos' processes TO-SEARCH and
+lists tags from it. TO-SEARCH should be an alist, obarray, or symbol.
+If it is a symbol, the symbol's value is used.
+TITLE, a string, is a title used to label the additional list of tags.
+FUNCTION is a function to call when a symbol is selected in the
+*Tags List* buffer. It will be called with one argument SYMBOL which
+is the symbol being selected.
+
+Example value:
+
+ '((\"Emacs Lisp\" Info-goto-emacs-command-node obarray)
+ (\"Common Lisp\" common-lisp-hyperspec common-lisp-hyperspec-obarray)
+ (\"SCWM\" scwm-documentation scwm-obarray))"
+ :group 'etags
+ :type '(repeat (list (string :tag "Title")
+ function
+ (sexp :tag "Tags to search")))
+ :version "21.1")
+
+(defvaralias 'find-tag-marker-ring 'xref--marker-ring)
+(make-obsolete-variable
+ 'find-tag-marker-ring
+ "use `xref-push-marker-stack' or `xref-pop-marker-stack' instead."
+ "25.1")
+
+(defvar default-tags-table-function nil
+ "If non-nil, a function to choose a default tags file for a buffer.
+This function receives no arguments and should return the default
+tags table file to use for the current buffer.")
+
+(defvar tags-location-ring (make-ring xref-marker-ring-length)
+ "Ring of markers which are locations visited by \\[find-tag].
+Pop back to the last location with \\[negative-argument] \\[find-tag].")
+
+;; Tags table state.
+;; These variables are local in tags table buffers.
+
+(defvar tags-table-files nil
+ "List of file names covered by current tags table.
+nil means it has not yet been computed;
+use function `tags-table-files' to do so.")
+
+(defvar tags-completion-table nil
+ "Obarray of tag names defined in current tags table.")
+
+(defvar tags-included-tables nil
+ "List of tags tables included by the current tags table.")
+
+(defvar next-file-list nil
+ "List of files for \\[next-file] to process.")
+
+;; Hooks for file formats.
+
+(defvar tags-table-format-functions '(etags-recognize-tags-table
+ tags-recognize-empty-tags-table)
+ "Hook to be called in a tags table buffer to identify the type of tags table.
+The functions are called in order, with no arguments,
+until one returns non-nil. The function should make buffer-local bindings
+of the format-parsing tags function variables if successful.")
+
+(defvar file-of-tag-function nil
+ "Function to do the work of `file-of-tag' (which see).
+One optional argument, a boolean specifying to return complete path (nil) or
+relative path (non-nil).")
+(defvar tags-table-files-function nil
+ "Function to do the work of function `tags-table-files' (which see).")
+(defvar tags-completion-table-function nil
+ "Function to build the `tags-completion-table'.")
+(defvar snarf-tag-function nil
+ "Function to get info about a matched tag for `goto-tag-location-function'.
+One optional argument, specifying to use explicit tag (non-nil) or not (nil).
+The default is nil.")
+(defvar goto-tag-location-function nil
+ "Function of to go to the location in the buffer specified by a tag.
+One argument, the tag info returned by `snarf-tag-function'.")
+(defvar find-tag-regexp-search-function nil
+ "Search function passed to `find-tag-in-order' for finding a regexp tag.")
+(defvar find-tag-regexp-tag-order nil
+ "Tag order passed to `find-tag-in-order' for finding a regexp tag.")
+(defvar find-tag-regexp-next-line-after-failure-p nil
+ "Flag passed to `find-tag-in-order' for finding a regexp tag.")
+(defvar find-tag-search-function nil
+ "Search function passed to `find-tag-in-order' for finding a tag.")
+(defvar find-tag-tag-order nil
+ "Tag order passed to `find-tag-in-order' for finding a tag.")
+(defvar find-tag-next-line-after-failure-p nil
+ "Flag passed to `find-tag-in-order' for finding a tag.")
+(defvar list-tags-function nil
+ "Function to do the work of `list-tags' (which see).")
+(defvar tags-apropos-function nil
+ "Function to do the work of `tags-apropos' (which see).")
+(defvar tags-included-tables-function nil
+ "Function to do the work of function `tags-included-tables' (which see).")
+(defvar verify-tags-table-function nil
+ "Function to return t if current buffer contains valid tags file.")
+
+(defun initialize-new-tags-table ()
+ "Initialize the tags table in the current buffer.
+Return non-nil if it is a valid tags table, and
+in that case, also make the tags table state variables
+buffer-local and set them to nil."
+ (set (make-local-variable 'tags-table-files) nil)
+ (set (make-local-variable 'tags-completion-table) nil)
+ (set (make-local-variable 'tags-included-tables) nil)
+ ;; We used to initialize find-tag-marker-ring and tags-location-ring
+ ;; here, to new empty rings. But that is wrong, because those
+ ;; are global.
+
+ ;; Value is t if we have found a valid tags table buffer.
+ (run-hook-with-args-until-success 'tags-table-format-functions))
+
+;;;###autoload
+(defun tags-table-mode ()
+ "Major mode for tags table file buffers."
+ (interactive)
+ (setq major-mode 'tags-table-mode ;FIXME: Use define-derived-mode.
+ mode-name "Tags Table"
+ buffer-undo-list t)
+ (initialize-new-tags-table))
+
+;;;###autoload
+(defun visit-tags-table (file &optional local)
+ "Tell tags commands to use tags table file FILE.
+FILE should be the name of a file created with the `etags' program.
+A directory name is ok too; it means file TAGS in that directory.
+
+Normally \\[visit-tags-table] sets the global value of `tags-file-name'.
+With a prefix arg, set the buffer-local value instead.
+When you find a tag with \\[find-tag], the buffer it finds the tag
+in is given a local value of this variable which is the name of the tags
+file the tag was in."
+ (interactive (list (read-file-name "Visit tags table (default TAGS): "
+ default-directory
+ (expand-file-name "TAGS"
+ default-directory)
+ t)
+ current-prefix-arg))
+ (or (stringp file) (signal 'wrong-type-argument (list 'stringp file)))
+ ;; Bind tags-file-name so we can control below whether the local or
+ ;; global value gets set.
+ ;; Calling visit-tags-table-buffer with tags-file-name set to FILE will
+ ;; initialize a buffer for FILE and set tags-file-name to the
+ ;; fully-expanded name.
+ (let ((tags-file-name file))
+ (save-excursion
+ (or (visit-tags-table-buffer file)
+ (signal 'file-error (list "Visiting tags table"
+ "No such file or directory"
+ file)))
+ ;; Set FILE to the expanded name.
+ (setq file tags-file-name)))
+ (if local
+ ;; Set the local value of tags-file-name.
+ (set (make-local-variable 'tags-file-name) file)
+ ;; Set the global value of tags-file-name.
+ (setq-default tags-file-name file)))
+
+(defun tags-table-check-computed-list ()
+ "Compute `tags-table-computed-list' from `tags-table-list' if necessary."
+ (let ((expanded-list (mapcar 'tags-expand-table-name tags-table-list)))
+ (or (equal tags-table-computed-list-for expanded-list)
+ ;; The list (or default-directory) has changed since last computed.
+ (let* ((compute-for (mapcar 'copy-sequence expanded-list))
+ (tables (copy-sequence compute-for)) ;Mutated in the loop.
+ (computed nil)
+ table-buffer)
+
+ (while tables
+ (setq computed (cons (car tables) computed)
+ table-buffer (get-file-buffer (car tables)))
+ (if (and table-buffer
+ ;; There is a buffer visiting the file. Now make sure
+ ;; it is initialized as a tag table buffer.
+ (save-excursion
+ (tags-verify-table (buffer-file-name table-buffer))))
+ (with-current-buffer table-buffer
+ ;; Needed so long as etags-tags-included-tables
+ ;; does not save-excursion.
+ (save-excursion
+ (if (tags-included-tables)
+ ;; Insert the included tables into the list we
+ ;; are processing.
+ (setcdr tables (nconc (mapcar 'tags-expand-table-name
+ (tags-included-tables))
+ (cdr tables))))))
+ ;; This table is not in core yet. Insert a placeholder
+ ;; saying we must read it into core to check for included
+ ;; tables before searching the next table in the list.
+ (setq computed (cons t computed)))
+ (setq tables (cdr tables)))
+
+ ;; Record the tags-table-list value (and the context of the
+ ;; current directory) we computed from.
+ (setq tags-table-computed-list-for compute-for
+ tags-table-computed-list (nreverse computed))))))
+
+(defun tags-table-extend-computed-list ()
+ "Extend `tags-table-computed-list' to remove the first t placeholder.
+
+An element of the list that is t is a placeholder indicating that the
+preceding element is a table that has not been read in and might
+contain included tables to search. This function reads in the first
+such table and puts its included tables into the list."
+ (let ((list tags-table-computed-list))
+ (while (not (eq (nth 1 list) t))
+ (setq list (cdr list)))
+ (save-excursion
+ (if (tags-verify-table (car list))
+ ;; We are now in the buffer visiting (car LIST). Extract its
+ ;; list of included tables and insert it into the computed list.
+ (let ((tables (tags-included-tables))
+ (computed nil)
+ table-buffer)
+ (while tables
+ (setq computed (cons (car tables) computed)
+ table-buffer (get-file-buffer (car tables)))
+ (if table-buffer
+ (with-current-buffer table-buffer
+ (if (tags-included-tables)
+ ;; Insert the included tables into the list we
+ ;; are processing.
+ (setcdr tables (append (tags-included-tables)
+ tables))))
+ ;; This table is not in core yet. Insert a placeholder
+ ;; saying we must read it into core to check for included
+ ;; tables before searching the next table in the list.
+ (setq computed (cons t computed)))
+ (setq tables (cdr tables)))
+ (setq computed (nreverse computed))
+ ;; COMPUTED now contains the list of included tables (and
+ ;; tables included by them, etc.). Now splice this into the
+ ;; current list.
+ (setcdr list (nconc computed (cdr (cdr list)))))
+ ;; It was not a valid table, so just remove the following placeholder.
+ (setcdr list (cdr (cdr list)))))))
+
+(defun tags-expand-table-name (file)
+ "Expand tags table name FILE into a complete file name."
+ (setq file (expand-file-name file))
+ (if (file-directory-p file)
+ (expand-file-name "TAGS" file)
+ file))
+
+;; Like member, but comparison is done after tags-expand-table-name on both
+;; sides and elements of LIST that are t are skipped.
+(defun tags-table-list-member (file list)
+ "Like (member FILE LIST) after applying `tags-expand-table-name'.
+More precisely, apply `tags-expand-table-name' to FILE
+and each element of LIST, returning the link whose car is the first match.
+If an element of LIST is t, ignore it."
+ (setq file (tags-expand-table-name file))
+ (while (and list
+ (or (eq (car list) t)
+ (not (string= file (tags-expand-table-name (car list))))))
+ (setq list (cdr list)))
+ list)
+
+(defun tags-verify-table (file)
+ "Read FILE into a buffer and verify that it is a valid tags table.
+Sets the current buffer to one visiting FILE (if it exists).
+Returns non-nil if it is a valid table."
+ (if (get-file-buffer file)
+ ;; The file is already in a buffer. Check for the visited file
+ ;; having changed since we last used it.
+ (progn
+ (set-buffer (get-file-buffer file))
+ (or verify-tags-table-function (tags-table-mode))
+ (if (or (verify-visited-file-modtime (current-buffer))
+ ;; Decide whether to revert the file.
+ ;; revert-without-query can say to revert
+ ;; or the user can say to revert.
+ (not (or (let ((tail revert-without-query)
+ (found nil))
+ (while tail
+ (if (string-match (car tail) buffer-file-name)
+ (setq found t))
+ (setq tail (cdr tail)))
+ found)
+ tags-revert-without-query
+ (yes-or-no-p
+ (format "Tags file %s has changed, read new contents? "
+ file)))))
+ (and verify-tags-table-function
+ (funcall verify-tags-table-function))
+ (revert-buffer t t)
+ (tags-table-mode)))
+ (when (file-exists-p file)
+ (let* ((buf (find-file-noselect file))
+ (newfile (buffer-file-name buf)))
+ (unless (string= file newfile)
+ ;; find-file-noselect has changed the file name.
+ ;; Propagate the change to tags-file-name and tags-table-list.
+ (let ((tail (member file tags-table-list)))
+ (if tail (setcar tail newfile)))
+ (if (eq file tags-file-name) (setq tags-file-name newfile)))
+ ;; Only change buffer now that we're done using potentially
+ ;; buffer-local variables.
+ (set-buffer buf)
+ (tags-table-mode)))))
+
+;; Subroutine of visit-tags-table-buffer. Search the current tags tables
+;; for one that has tags for THIS-FILE (or that includes a table that
+;; does). Return the name of the first table listing THIS-FILE; if
+;; the table is one included by another table, it is the master table that
+;; we return. If CORE-ONLY is non-nil, check only tags tables that are
+;; already in buffers--don't visit any new files.
+(defun tags-table-including (this-file core-only)
+ "Search current tags tables for tags for THIS-FILE.
+Subroutine of `visit-tags-table-buffer'.
+Looks for a tags table that has such tags or that includes a table
+that has them. Returns the name of the first such table.
+Non-nil CORE-ONLY means check only tags tables that are already in
+buffers. If CORE-ONLY is nil, it is ignored."
+ (let ((tables tags-table-computed-list)
+ (found nil))
+ ;; Loop over the list, looking for a table containing tags for THIS-FILE.
+ (while (and (not found)
+ tables)
+
+ (if core-only
+ ;; Skip tables not in core.
+ (while (eq (nth 1 tables) t)
+ (setq tables (cdr (cdr tables))))
+ (if (eq (nth 1 tables) t)
+ ;; This table has not been read into core yet. Read it in now.
+ (tags-table-extend-computed-list)))
+
+ (if tables
+ ;; Select the tags table buffer and get the file list up to date.
+ (let ((tags-file-name (car tables)))
+ (visit-tags-table-buffer 'same)
+ (if (member this-file (mapcar 'expand-file-name
+ (tags-table-files)))
+ ;; Found it.
+ (setq found tables))))
+ (setq tables (cdr tables)))
+ (if found
+ ;; Now determine if the table we found was one included by another
+ ;; table, not explicitly listed. We do this by checking each
+ ;; element of the computed list to see if it appears in the user's
+ ;; explicit list; the last element we will check is FOUND itself.
+ ;; Then we return the last one which did in fact appear in
+ ;; tags-table-list.
+ (let ((could-be nil)
+ (elt tags-table-computed-list))
+ (while (not (eq elt (cdr found)))
+ (if (tags-table-list-member (car elt) tags-table-list)
+ ;; This table appears in the user's list, so it could be
+ ;; the one which includes the table we found.
+ (setq could-be (car elt)))
+ (setq elt (cdr elt))
+ (if (eq t (car elt))
+ (setq elt (cdr elt))))
+ ;; The last element we found in the computed list before FOUND
+ ;; that appears in the user's list will be the table that
+ ;; included the one we found.
+ could-be))))
+
+(defun tags-next-table ()
+ "Move `tags-table-list-pointer' along and set `tags-file-name'.
+Subroutine of `visit-tags-table-buffer'.\
+Returns nil when out of tables."
+ ;; If there is a placeholder element next, compute the list to replace it.
+ (while (eq (nth 1 tags-table-list-pointer) t)
+ (tags-table-extend-computed-list))
+
+ ;; Go to the next table in the list.
+ (setq tags-table-list-pointer (cdr tags-table-list-pointer))
+ (or tags-table-list-pointer
+ ;; Wrap around.
+ (setq tags-table-list-pointer tags-table-computed-list))
+
+ (if (eq tags-table-list-pointer tags-table-list-started-at)
+ ;; We have come full circle. No more tables.
+ (setq tags-table-list-pointer nil)
+ ;; Set tags-file-name to the name from the list. It is already expanded.
+ (setq tags-file-name (car tags-table-list-pointer))))
+
+;;;###autoload
+(defun visit-tags-table-buffer (&optional cont)
+ "Select the buffer containing the current tags table.
+If optional arg is a string, visit that file as a tags table.
+If optional arg is t, visit the next table in `tags-table-list'.
+If optional arg is the atom `same', don't look for a new table;
+ just select the buffer visiting `tags-file-name'.
+If arg is nil or absent, choose a first buffer from information in
+ `tags-file-name', `tags-table-list', `tags-table-list-pointer'.
+Returns t if it visits a tags table, or nil if there are no more in the list."
+
+ ;; Set tags-file-name to the tags table file we want to visit.
+ (cond ((eq cont 'same)
+ ;; Use the ambient value of tags-file-name.
+ (or tags-file-name
+ (user-error "%s"
+ (substitute-command-keys
+ (concat "No tags table in use; "
+ "use \\[visit-tags-table] to select one")))))
+ ((eq t cont)
+ ;; Find the next table.
+ (if (tags-next-table)
+ ;; Skip over nonexistent files.
+ (while (and (not (or (get-file-buffer tags-file-name)
+ (file-exists-p tags-file-name)))
+ (tags-next-table)))))
+ (t
+ ;; Pick a table out of our hat.
+ (tags-table-check-computed-list) ;Get it up to date, we might use it.
+ (setq tags-file-name
+ (or
+ ;; If passed a string, use that.
+ (if (stringp cont)
+ (prog1 cont
+ (setq cont nil)))
+ ;; First, try a local variable.
+ (cdr (assq 'tags-file-name (buffer-local-variables)))
+ ;; Second, try a user-specified function to guess.
+ (and default-tags-table-function
+ (funcall default-tags-table-function))
+ ;; Third, look for a tags table that contains tags for the
+ ;; current buffer's file. If one is found, the lists will
+ ;; be frobnicated, and CONT will be set non-nil so we don't
+ ;; do it below.
+ (and buffer-file-name
+ (or
+ ;; First check only tables already in buffers.
+ (tags-table-including buffer-file-name t)
+ ;; Since that didn't find any, now do the
+ ;; expensive version: reading new files.
+ (tags-table-including buffer-file-name nil)))
+ ;; Fourth, use the user variable tags-file-name, if it is
+ ;; not already in the current list.
+ (and tags-file-name
+ (not (tags-table-list-member tags-file-name
+ tags-table-computed-list))
+ tags-file-name)
+ ;; Fifth, use the user variable giving the table list.
+ ;; Find the first element of the list that actually exists.
+ (let ((list tags-table-list)
+ file)
+ (while (and list
+ (setq file (tags-expand-table-name (car list)))
+ (not (get-file-buffer file))
+ (not (file-exists-p file)))
+ (setq list (cdr list)))
+ (car list))
+ ;; Finally, prompt the user for a file name.
+ (expand-file-name
+ (read-file-name "Visit tags table (default TAGS): "
+ default-directory
+ "TAGS"
+ t))))))
+
+ ;; Expand the table name into a full file name.
+ (setq tags-file-name (tags-expand-table-name tags-file-name))
+
+ (unless (and (eq cont t) (null tags-table-list-pointer))
+ ;; Verify that tags-file-name names a valid tags table.
+ ;; Bind another variable with the value of tags-file-name
+ ;; before we switch buffers, in case tags-file-name is buffer-local.
+ (let ((curbuf (current-buffer))
+ (local-tags-file-name tags-file-name))
+ (if (tags-verify-table local-tags-file-name)
+
+ ;; We have a valid tags table.
+ (progn
+ ;; Bury the tags table buffer so it
+ ;; doesn't get in the user's way.
+ (bury-buffer (current-buffer))
+
+ ;; If this was a new table selection (CONT is nil), make
+ ;; sure tags-table-list includes the chosen table, and
+ ;; update the list pointer variables.
+ (or cont
+ ;; Look in the list for the table we chose.
+ (let ((found (tags-table-list-member
+ local-tags-file-name
+ tags-table-computed-list)))
+ (if found
+ ;; There it is. Just switch to it.
+ (setq tags-table-list-pointer found
+ tags-table-list-started-at found)
+
+ ;; The table is not in the current set.
+ ;; Try to find it in another previously used set.
+ (let ((sets tags-table-set-list))
+ (while (and sets
+ (not (tags-table-list-member
+ local-tags-file-name
+ (car sets))))
+ (setq sets (cdr sets)))
+ (if sets
+ ;; Found in some other set. Switch to that set.
+ (progn
+ (or (memq tags-table-list tags-table-set-list)
+ ;; Save the current list.
+ (setq tags-table-set-list
+ (cons tags-table-list
+ tags-table-set-list)))
+ (setq tags-table-list (car sets)))
+
+ ;; Not found in any existing set.
+ (if (and tags-table-list
+ (or (eq t tags-add-tables)
+ (and tags-add-tables
+ (y-or-n-p
+ (concat "Keep current list of "
+ "tags tables also? ")))))
+ ;; Add it to the current list.
+ (setq tags-table-list (cons local-tags-file-name
+ tags-table-list))
+
+ ;; Make a fresh list, and store the old one.
+ (message "Starting a new list of tags tables")
+ (or (null tags-table-list)
+ (memq tags-table-list tags-table-set-list)
+ (setq tags-table-set-list
+ (cons tags-table-list
+ tags-table-set-list)))
+ ;; Clear out buffers holding old tables.
+ (dolist (table tags-table-list)
+ ;; The list can contain items t.
+ (if (stringp table)
+ (let ((buffer (find-buffer-visiting table)))
+ (if buffer
+ (kill-buffer buffer)))))
+ (setq tags-table-list (list local-tags-file-name))))
+
+ ;; Recompute tags-table-computed-list.
+ (tags-table-check-computed-list)
+ ;; Set the tags table list state variables to start
+ ;; over from tags-table-computed-list.
+ (setq tags-table-list-started-at tags-table-computed-list
+ tags-table-list-pointer
+ tags-table-computed-list)))))
+
+ ;; Return of t says the tags table is valid.
+ t)
+
+ ;; The buffer was not valid. Don't use it again.
+ (set-buffer curbuf)
+ (kill-local-variable 'tags-file-name)
+ (if (eq local-tags-file-name tags-file-name)
+ (setq tags-file-name nil))
+ (user-error (if (file-exists-p local-tags-file-name)
+ "File %s is not a valid tags table"
+ "File %s does not exist")
+ local-tags-file-name)))))
+
+(defun tags-reset-tags-tables ()
+ "Reset tags state to cancel effect of any previous \\[visit-tags-table] or \\[find-tag]."
+ (interactive)
+ ;; Clear out the markers we are throwing away.
+ (let ((i 0))
+ (while (< i xref-marker-ring-length)
+ (if (aref (cddr tags-location-ring) i)
+ (set-marker (aref (cddr tags-location-ring) i) nil))
+ (setq i (1+ i))))
+ (xref-clear-marker-stack)
+ (setq tags-file-name nil
+ tags-location-ring (make-ring xref-marker-ring-length)
+ tags-table-list nil
+ tags-table-computed-list nil
+ tags-table-computed-list-for nil
+ tags-table-list-pointer nil
+ tags-table-list-started-at nil
+ tags-table-set-list nil))
+
+(defun file-of-tag (&optional relative)
+ "Return the file name of the file whose tags point is within.
+Assumes the tags table is the current buffer.
+If RELATIVE is non-nil, file name returned is relative to tags
+table file's directory. If RELATIVE is nil, file name returned
+is complete."
+ (funcall file-of-tag-function relative))
+
+;;;###autoload
+(defun tags-table-files ()
+ "Return a list of files in the current tags table.
+Assumes the tags table is the current buffer. The file names are returned
+as they appeared in the `etags' command that created the table, usually
+without directory names."
+ (or tags-table-files
+ (setq tags-table-files
+ (funcall tags-table-files-function))))
+
+(defun tags-included-tables ()
+ "Return a list of tags tables included by the current table.
+Assumes the tags table is the current buffer."
+ (or tags-included-tables
+ (setq tags-included-tables (funcall tags-included-tables-function))))
+
+(defun tags-completion-table ()
+ "Build `tags-completion-table' on demand.
+The tags included in the completion table are those in the current
+tags table and its (recursively) included tags tables."
+ (or tags-completion-table
+ ;; No cached value for this buffer.
+ (condition-case ()
+ (let (current-table combined-table)
+ (message "Making tags completion table for %s..." buffer-file-name)
+ (save-excursion
+ ;; Iterate over the current list of tags tables.
+ (while (visit-tags-table-buffer (and combined-table t))
+ ;; Find possible completions in this table.
+ (setq current-table (funcall tags-completion-table-function))
+ ;; Merge this buffer's completions into the combined table.
+ (if combined-table
+ (mapatoms
+ (lambda (sym) (intern (symbol-name sym) combined-table))
+ current-table)
+ (setq combined-table current-table))))
+ (message "Making tags completion table for %s...done"
+ buffer-file-name)
+ ;; Cache the result in a buffer-local variable.
+ (setq tags-completion-table combined-table))
+ (quit (message "Tags completion table construction aborted.")
+ (setq tags-completion-table nil)))))
+
+;;;###autoload
+(defun tags-lazy-completion-table ()
+ (let ((buf (current-buffer)))
+ (lambda (string pred action)
+ (with-current-buffer buf
+ (save-excursion
+ ;; If we need to ask for the tag table, allow that.
+ (let ((enable-recursive-minibuffers t))
+ (visit-tags-table-buffer))
+ (complete-with-action action (tags-completion-table) string pred))))))
+
+;;;###autoload (defun tags-completion-at-point-function ()
+;;;###autoload (if (or tags-table-list tags-file-name)
+;;;###autoload (progn
+;;;###autoload (load "etags")
+;;;###autoload (tags-completion-at-point-function))))
+
+(defun tags-completion-at-point-function ()
+ "Using tags, return a completion table for the text around point.
+If no tags table is loaded, do nothing and return nil."
+ (when (or tags-table-list tags-file-name)
+ (let ((completion-ignore-case (if (memq tags-case-fold-search '(t nil))
+ tags-case-fold-search
+ case-fold-search))
+ (pattern (funcall (or find-tag-default-function
+ (get major-mode 'find-tag-default-function)
+ 'find-tag-default)))
+ beg)
+ (when pattern
+ (save-excursion
+ (forward-char (1- (length pattern)))
+ (search-backward pattern)
+ (setq beg (point))
+ (forward-char (length pattern))
+ (list beg (point) (tags-lazy-completion-table) :exclusive 'no))))))
+
+(defun find-tag-tag (string)
+ "Read a tag name, with defaulting and completion."
+ (let* ((completion-ignore-case (if (memq tags-case-fold-search '(t nil))
+ tags-case-fold-search
+ case-fold-search))
+ (default (funcall (or find-tag-default-function
+ (get major-mode 'find-tag-default-function)
+ 'find-tag-default)))
+ (spec (completing-read (if default
+ (format "%s (default %s): "
+ (substring string 0 (string-match "[ :]+\\'" string))
+ default)
+ string)
+ (tags-lazy-completion-table)
+ nil nil nil nil default)))
+ (if (equal spec "")
+ (or default (user-error "There is no default tag"))
+ spec)))
+
+(defvar last-tag nil
+ "Last tag found by \\[find-tag].")
+
+(defun find-tag-interactive (prompt &optional no-default)
+ "Get interactive arguments for tag functions.
+The functions using this are `find-tag-noselect',
+`find-tag-other-window', and `find-tag-regexp'."
+ (if (and current-prefix-arg last-tag)
+ (list nil (if (< (prefix-numeric-value current-prefix-arg) 0)
+ '-
+ t))
+ (list (if no-default
+ (read-string prompt)
+ (find-tag-tag prompt)))))
+
+(defvar find-tag-history nil) ; Doc string?
+
+;; Dynamic bondage:
+(defvar etags-case-fold-search)
+(defvar etags-syntax-table)
+(defvar local-find-tag-hook)
+
+;;;###autoload
+(defun find-tag-noselect (tagname &optional next-p regexp-p)
+ "Find tag (in current tags table) whose name contains TAGNAME.
+Returns the buffer containing the tag's definition and moves its point there,
+but does not select the buffer.
+The default for TAGNAME is the expression in the buffer near point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used. When there are
+multiple matches for a tag, more exact matches are found first. If NEXT-P
+is the atom `-' (interactively, with prefix arg that is a negative number
+or just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+ (interactive (find-tag-interactive "Find tag: "))
+
+ (setq find-tag-history (cons tagname find-tag-history))
+ ;; Save the current buffer's value of `find-tag-hook' before
+ ;; selecting the tags table buffer. For the same reason, save value
+ ;; of `tags-file-name' in case it has a buffer-local value.
+ (let ((local-find-tag-hook find-tag-hook))
+ (if (eq '- next-p)
+ ;; Pop back to a previous location.
+ (if (ring-empty-p tags-location-ring)
+ (user-error "No previous tag locations")
+ (let ((marker (ring-remove tags-location-ring 0)))
+ (prog1
+ ;; Move to the saved location.
+ (set-buffer (or (marker-buffer marker)
+ (error "The marked buffer has been deleted")))
+ (goto-char (marker-position marker))
+ ;; Kill that marker so it doesn't slow down editing.
+ (set-marker marker nil nil)
+ ;; Run the user's hook. Do we really want to do this for pop?
+ (run-hooks 'local-find-tag-hook))))
+ ;; Record whence we came.
+ (xref-push-marker-stack)
+ (if (and next-p last-tag)
+ ;; Find the same table we last used.
+ (visit-tags-table-buffer 'same)
+ ;; Pick a table to use.
+ (visit-tags-table-buffer)
+ ;; Record TAGNAME for a future call with NEXT-P non-nil.
+ (setq last-tag tagname))
+ ;; Record the location so we can pop back to it later.
+ (let ((marker (make-marker)))
+ (with-current-buffer
+ ;; find-tag-in-order does the real work.
+ (find-tag-in-order
+ (if (and next-p last-tag) last-tag tagname)
+ (if regexp-p
+ find-tag-regexp-search-function
+ find-tag-search-function)
+ (if regexp-p
+ find-tag-regexp-tag-order
+ find-tag-tag-order)
+ (if regexp-p
+ find-tag-regexp-next-line-after-failure-p
+ find-tag-next-line-after-failure-p)
+ (if regexp-p "matching" "containing")
+ (or (not next-p) (not last-tag)))
+ (set-marker marker (point))
+ (run-hooks 'local-find-tag-hook)
+ (ring-insert tags-location-ring marker)
+ (current-buffer))))))
+
+;;;###autoload
+(defun find-tag (tagname &optional next-p regexp-p)
+ "Find tag (in current tags table) whose name contains TAGNAME.
+Select the buffer containing the tag's definition, and move point there.
+The default for TAGNAME is the expression in the buffer around or before point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used. When there are
+multiple matches for a tag, more exact matches are found first. If NEXT-P
+is the atom `-' (interactively, with prefix arg that is a negative number
+or just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+ (interactive (find-tag-interactive "Find tag: "))
+ (let* ((buf (find-tag-noselect tagname next-p regexp-p))
+ (pos (with-current-buffer buf (point))))
+ (condition-case nil
+ (switch-to-buffer buf)
+ (error (pop-to-buffer buf)))
+ (goto-char pos)))
+
+;;;###autoload
+(defun find-tag-other-window (tagname &optional next-p regexp-p)
+ "Find tag (in current tags table) whose name contains TAGNAME.
+Select the buffer containing the tag's definition in another window, and
+move point there. The default for TAGNAME is the expression in the buffer
+around or before point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used. When there are
+multiple matches for a tag, more exact matches are found first. If NEXT-P
+is negative (interactively, with prefix arg that is a negative number or
+just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+ (declare (obsolete xref-find-definitions-other-window "25.1"))
+ (interactive (find-tag-interactive "Find tag other window: "))
+
+ ;; This hair is to deal with the case where the tag is found in the
+ ;; selected window's buffer; without the hair, point is moved in both
+ ;; windows. To prevent this, we save the selected window's point before
+ ;; doing find-tag-noselect, and restore it after.
+ (let* ((window-point (window-point))
+ (tagbuf (find-tag-noselect tagname next-p regexp-p))
+ (tagpoint (progn (set-buffer tagbuf) (point))))
+ (set-window-point (prog1
+ (selected-window)
+ (switch-to-buffer-other-window tagbuf)
+ ;; We have to set this new window's point; it
+ ;; might already have been displaying a
+ ;; different portion of tagbuf, in which case
+ ;; switch-to-buffer-other-window doesn't set
+ ;; the window's point from the buffer.
+ (set-window-point (selected-window) tagpoint))
+ window-point)))
+
+;;;###autoload
+(defun find-tag-other-frame (tagname &optional next-p)
+ "Find tag (in current tags table) whose name contains TAGNAME.
+Select the buffer containing the tag's definition in another frame, and
+move point there. The default for TAGNAME is the expression in the buffer
+around or before point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used. When there are
+multiple matches for a tag, more exact matches are found first. If NEXT-P
+is negative (interactively, with prefix arg that is a negative number or
+just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+ (declare (obsolete xref-find-definitions-other-frame "25.1"))
+ (interactive (find-tag-interactive "Find tag other frame: "))
+ (let ((pop-up-frames t))
+ (find-tag-other-window tagname next-p)))
+
+;;;###autoload
+(defun find-tag-regexp (regexp &optional next-p other-window)
+ "Find tag (in current tags table) whose name matches REGEXP.
+Select the buffer containing the tag's definition and move point there.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used. When there are
+multiple matches for a tag, more exact matches are found first. If NEXT-P
+is negative (interactively, with prefix arg that is a negative number or
+just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg OTHER-WINDOW is non-nil, select the buffer in another window.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+ (declare (obsolete xref-find-apropos "25.1"))
+ (interactive (find-tag-interactive "Find tag regexp: " t))
+ ;; We go through find-tag-other-window to do all the display hair there.
+ (funcall (if other-window 'find-tag-other-window 'find-tag)
+ regexp next-p t))
+
+;;;###autoload
+(defalias 'pop-tag-mark 'xref-pop-marker-stack)
+
+
+(defvar tag-lines-already-matched nil
+ "Matches remembered between calls.") ; Doc string: calls to what?
+
+(defun find-tag-in-order (pattern
+ search-forward-func
+ order
+ next-line-after-failure-p
+ matching
+ first-search)
+ "Internal tag-finding function.
+PATTERN is a string to pass to arg SEARCH-FORWARD-FUNC, and to any
+member of the function list ORDER. If ORDER is nil, use saved state
+to continue a previous search.
+
+Arg NEXT-LINE-AFTER-FAILURE-P is non-nil if after a failed match,
+point should be moved to the next line.
+
+Arg MATCHING is a string, an English `-ing' word, to be used in an
+error message."
+;; Algorithm is as follows:
+;; For each qualifier-func in ORDER, go to beginning of tags file, and
+;; perform inner loop: for each naive match for PATTERN found using
+;; SEARCH-FORWARD-FUNC, qualify the naive match using qualifier-func. If
+;; it qualifies, go to the specified line in the specified source file
+;; and return. Qualified matches are remembered to avoid repetition.
+;; State is saved so that the loop can be continued.
+ (let (file ;name of file containing tag
+ tag-info ;where to find the tag in FILE
+ (first-table t)
+ (tag-order order)
+ (match-marker (make-marker))
+ goto-func
+ (case-fold-search (if (memq tags-case-fold-search '(nil t))
+ tags-case-fold-search
+ case-fold-search))
+ )
+ (save-excursion
+
+ (if first-search
+ ;; This is the start of a search for a fresh tag.
+ ;; Clear the list of tags matched by the previous search.
+ ;; find-tag-noselect has already put us in the first tags table
+ ;; buffer before we got called.
+ (setq tag-lines-already-matched nil)
+ ;; Continuing to search for the tag specified last time.
+ ;; tag-lines-already-matched lists locations matched in previous
+ ;; calls so we don't visit the same tag twice if it matches twice
+ ;; during two passes with different qualification predicates.
+ ;; Switch to the current tags table buffer.
+ (visit-tags-table-buffer 'same))
+
+ ;; Get a qualified match.
+ (catch 'qualified-match-found
+
+ ;; Iterate over the list of tags tables.
+ (while (or first-table
+ (visit-tags-table-buffer t))
+
+ (and first-search first-table
+ ;; Start at beginning of tags file.
+ (goto-char (point-min)))
+
+ (setq first-table nil)
+
+ ;; Iterate over the list of ordering predicates.
+ (while order
+ (while (funcall search-forward-func pattern nil t)
+ ;; Naive match found. Qualify the match.
+ (and (funcall (car order) pattern)
+ ;; Make sure it is not a previous qualified match.
+ (not (member (set-marker match-marker (point-at-bol))
+ tag-lines-already-matched))
+ (throw 'qualified-match-found nil))
+ (if next-line-after-failure-p
+ (forward-line 1)))
+ ;; Try the next flavor of match.
+ (setq order (cdr order))
+ (goto-char (point-min)))
+ (setq order tag-order))
+ ;; We throw out on match, so only get here if there were no matches.
+ ;; Clear out the markers we use to avoid duplicate matches so they
+ ;; don't slow down editing and are immediately available for GC.
+ (while tag-lines-already-matched
+ (set-marker (car tag-lines-already-matched) nil nil)
+ (setq tag-lines-already-matched (cdr tag-lines-already-matched)))
+ (set-marker match-marker nil nil)
+ (user-error "No %stags %s %s" (if first-search "" "more ")
+ matching pattern))
+
+ ;; Found a tag; extract location info.
+ (beginning-of-line)
+ (setq tag-lines-already-matched (cons match-marker
+ tag-lines-already-matched))
+ ;; Expand the filename, using the tags table buffer's default-directory.
+ ;; We should be able to search for file-name backwards in file-of-tag:
+ ;; the beginning-of-line is ok except when positioned on a "file-name" tag.
+ (setq file (expand-file-name
+ (if (memq (car order) '(tag-exact-file-name-match-p
+ tag-file-name-match-p
+ tag-partial-file-name-match-p))
+ (save-excursion (forward-line 1)
+ (file-of-tag))
+ (file-of-tag)))
+ tag-info (funcall snarf-tag-function))
+
+ ;; Get the local value in the tags table buffer before switching buffers.
+ (setq goto-func goto-tag-location-function)
+ (tag-find-file-of-tag-noselect file)
+ (widen)
+ (push-mark)
+ (funcall goto-func tag-info)
+
+ ;; Return the buffer where the tag was found.
+ (current-buffer))))
+
+(defun tag-find-file-of-tag-noselect (file)
+ "Find the right line in the specified FILE."
+ ;; If interested in compressed-files, search files with extensions.
+ ;; Otherwise, search only the real file.
+ (let* ((buffer-search-extensions (if auto-compression-mode
+ tags-compression-info-list
+ '("")))
+ the-buffer
+ (file-search-extensions buffer-search-extensions))
+ ;; search a buffer visiting the file with each possible extension
+ ;; Note: there is a small inefficiency in find-buffer-visiting :
+ ;; truename is computed even if not needed. Not too sure about this
+ ;; but I suspect truename computation accesses the disk.
+ ;; It is maybe a good idea to optimize this find-buffer-visiting.
+ ;; An alternative would be to use only get-file-buffer
+ ;; but this looks less "sure" to find the buffer for the file.
+ (while (and (not the-buffer) buffer-search-extensions)
+ (setq the-buffer (find-buffer-visiting (concat file (car buffer-search-extensions))))
+ (setq buffer-search-extensions (cdr buffer-search-extensions)))
+ ;; if found a buffer but file modified, ensure we re-read !
+ (if (and the-buffer (not (verify-visited-file-modtime the-buffer)))
+ (find-file-noselect (buffer-file-name the-buffer)))
+ ;; if no buffer found, search for files with possible extensions on disk
+ (while (and (not the-buffer) file-search-extensions)
+ (if (not (file-exists-p (concat file (car file-search-extensions))))
+ (setq file-search-extensions (cdr file-search-extensions))
+ (setq the-buffer (find-file-noselect (concat file (car file-search-extensions))))))
+ (if (not the-buffer)
+ (if auto-compression-mode
+ (error "File %s (with or without extensions %s) not found" file tags-compression-info-list)
+ (error "File %s not found" file))
+ (set-buffer the-buffer))))
+
+(defun tag-find-file-of-tag (file) ; Doc string?
+ (let ((buf (tag-find-file-of-tag-noselect file)))
+ (condition-case nil
+ (switch-to-buffer buf)
+ (error (pop-to-buffer buf)))))
+
+;; `etags' TAGS file format support.
+
+(defun etags-recognize-tags-table ()
+ "If `etags-verify-tags-table', make buffer-local format variables.
+If current buffer is a valid etags TAGS file, then give it
+buffer-local values of tags table format variables."
+ (and (etags-verify-tags-table)
+ ;; It is annoying to flash messages on the screen briefly,
+ ;; and this message is not useful. -- rms
+ ;; (message "%s is an `etags' TAGS file" buffer-file-name)
+ (mapc (lambda (elt) (set (make-local-variable (car elt)) (cdr elt)))
+ '((file-of-tag-function . etags-file-of-tag)
+ (tags-table-files-function . etags-tags-table-files)
+ (tags-completion-table-function . etags-tags-completion-table)
+ (snarf-tag-function . etags-snarf-tag)
+ (goto-tag-location-function . etags-goto-tag-location)
+ (find-tag-regexp-search-function . re-search-forward)
+ (find-tag-regexp-tag-order . (tag-re-match-p))
+ (find-tag-regexp-next-line-after-failure-p . t)
+ (find-tag-search-function . search-forward)
+ (find-tag-tag-order . (tag-exact-file-name-match-p
+ tag-file-name-match-p
+ tag-exact-match-p
+ tag-implicit-name-match-p
+ tag-symbol-match-p
+ tag-word-match-p
+ tag-partial-file-name-match-p
+ tag-any-match-p))
+ (find-tag-next-line-after-failure-p . nil)
+ (list-tags-function . etags-list-tags)
+ (tags-apropos-function . etags-tags-apropos)
+ (tags-included-tables-function . etags-tags-included-tables)
+ (verify-tags-table-function . etags-verify-tags-table)
+ ))))
+
+(defun etags-verify-tags-table ()
+ "Return non-nil if the current buffer is a valid etags TAGS file."
+ ;; Use eq instead of = in case char-after returns nil.
+ (eq (char-after (point-min)) ?\f))
+
+(defun etags-file-of-tag (&optional relative) ; Doc string?
+ (save-excursion
+ (re-search-backward "\f\n\\([^\n]+\\),[0-9]*\n")
+ (let ((str (convert-standard-filename
+ (buffer-substring (match-beginning 1) (match-end 1)))))
+ (if relative
+ str
+ (expand-file-name str (file-truename default-directory))))))
+
+
+(defun etags-tags-completion-table () ; Doc string?
+ (let ((table (make-vector 511 0))
+ (progress-reporter
+ (make-progress-reporter
+ (format "Making tags completion table for %s..." buffer-file-name)
+ (point-min) (point-max))))
+ (save-excursion
+ (goto-char (point-min))
+ ;; This monster regexp matches an etags tag line.
+ ;; \1 is the string to match;
+ ;; \2 is not interesting;
+ ;; \3 is the guessed tag name; XXX guess should be better eg DEFUN
+ ;; \4 is not interesting;
+ ;; \5 is the explicitly-specified tag name.
+ ;; \6 is the line to start searching at;
+ ;; \7 is the char to start searching at.
+ (while (re-search-forward
+ "^\\(\\([^\177]+[^-a-zA-Z0-9_+*$:\177]+\\)?\
+\\([-a-zA-Z0-9_+*$?:]+\\)[^-a-zA-Z0-9_+*$?:\177]*\\)\177\
+\\(\\([^\n\001]+\\)\001\\)?\\([0-9]+\\)?,\\([0-9]+\\)?\n"
+ nil t)
+ (intern (prog1 (if (match-beginning 5)
+ ;; There is an explicit tag name.
+ (buffer-substring (match-beginning 5) (match-end 5))
+ ;; No explicit tag name. Best guess.
+ (buffer-substring (match-beginning 3) (match-end 3)))
+ (progress-reporter-update progress-reporter (point)))
+ table)))
+ table))
+
+(defun etags-snarf-tag (&optional use-explicit) ; Doc string?
+ (let (tag-text line startpos explicit-start)
+ (if (save-excursion
+ (forward-line -1)
+ (looking-at "\f\n"))
+ ;; The match was for a source file name, not any tag within a file.
+ ;; Give text of t, meaning to go exactly to the location we specify,
+ ;; the beginning of the file.
+ (setq tag-text t
+ line nil
+ startpos (point-min))
+
+ ;; Find the end of the tag and record the whole tag text.
+ (search-forward "\177")
+ (setq tag-text (buffer-substring (1- (point)) (point-at-bol)))
+ ;; If use-explicit is non nil and explicit tag is present, use it as part of
+ ;; return value. Else just skip it.
+ (setq explicit-start (point))
+ (when (and (search-forward "\001" (point-at-bol 2) t)
+ use-explicit)
+ (setq tag-text (buffer-substring explicit-start (1- (point)))))
+
+
+ (if (looking-at "[0-9]")
+ (setq line (string-to-number (buffer-substring
+ (point)
+ (progn (skip-chars-forward "0-9")
+ (point))))))
+ (search-forward ",")
+ (if (looking-at "[0-9]")
+ (setq startpos (string-to-number (buffer-substring
+ (point)
+ (progn (skip-chars-forward "0-9")
+ (point)))))))
+ ;; Leave point on the next line of the tags file.
+ (forward-line 1)
+ (cons tag-text (cons line startpos))))
+
+(defun etags-goto-tag-location (tag-info)
+ "Go to location of tag specified by TAG-INFO.
+TAG-INFO is a cons (TEXT LINE . POSITION).
+TEXT is the initial part of a line containing the tag.
+LINE is the line number.
+POSITION is the (one-based) char position of TEXT within the file.
+
+If TEXT is t, it means the tag refers to exactly LINE or POSITION,
+whichever is present, LINE having preference, no searching.
+Either LINE or POSITION can be nil. POSITION is used if present.
+
+If the tag isn't exactly at the given position, then look near that
+position using a search window that expands progressively until it
+hits the start of file."
+ (let ((startpos (cdr (cdr tag-info)))
+ (line (car (cdr tag-info)))
+ offset found pat)
+ (if (eq (car tag-info) t)
+ ;; Direct file tag.
+ (cond (line (progn (goto-char (point-min))
+ (forward-line (1- line))))
+ (startpos (goto-char startpos))
+ (t (error "etags.el BUG: bogus direct file tag")))
+ ;; This constant is 1/2 the initial search window.
+ ;; There is no sense in making it too small,
+ ;; since just going around the loop once probably
+ ;; costs about as much as searching 2000 chars.
+ (setq offset 1000
+ found nil
+ pat (concat (if (eq selective-display t)
+ "\\(^\\|\^m\\)" "^")
+ (regexp-quote (car tag-info))))
+ ;; The character position in the tags table is 0-origin.
+ ;; Convert it to a 1-origin Emacs character position.
+ (if startpos (setq startpos (1+ startpos)))
+ ;; If no char pos was given, try the given line number.
+ (or startpos
+ (if line
+ (setq startpos (progn (goto-char (point-min))
+ (forward-line (1- line))
+ (point)))))
+ (or startpos
+ (setq startpos (point-min)))
+ ;; First see if the tag is right at the specified location.
+ (goto-char startpos)
+ (setq found (looking-at pat))
+ (while (and (not found)
+ (progn
+ (goto-char (- startpos offset))
+ (not (bobp))))
+ (setq found
+ (re-search-forward pat (+ startpos offset) t)
+ offset (* 3 offset))) ; expand search window
+ (or found
+ (re-search-forward pat nil t)
+ (user-error "Rerun etags: `%s' not found in %s"
+ pat buffer-file-name)))
+ ;; Position point at the right place
+ ;; if the search string matched an extra Ctrl-m at the beginning.
+ (and (eq selective-display t)
+ (looking-at "\^m")
+ (forward-char 1))
+ (beginning-of-line)))
+
+(defun etags-list-tags (file) ; Doc string?
+ (goto-char (point-min))
+ (when (re-search-forward (concat "\f\n" "\\(" file "\\)" ",") nil t)
+ (let ((path (save-excursion (forward-line 1) (file-of-tag)))
+ ;; Get the local value in the tags table
+ ;; buffer before switching buffers.
+ (goto-func goto-tag-location-function)
+ tag tag-info pt)
+ (forward-line 1)
+ (while (not (or (eobp) (looking-at "\f")))
+ ;; We used to use explicit tags when available, but the current goto-func
+ ;; can only handle implicit tags.
+ (setq tag-info (save-excursion (funcall snarf-tag-function nil))
+ tag (car tag-info)
+ pt (with-current-buffer standard-output (point)))
+ (princ tag)
+ (when (= (aref tag 0) ?\() (princ " ...)"))
+ (with-current-buffer standard-output
+ (make-text-button pt (point)
+ 'tag-info tag-info
+ 'file-path path
+ 'goto-func goto-func
+ 'action (lambda (button)
+ (let ((tag-info (button-get button 'tag-info))
+ (goto-func (button-get button 'goto-func)))
+ (tag-find-file-of-tag (button-get button 'file-path))
+ (widen)
+ (funcall goto-func tag-info)))
+ 'follow-link t
+ 'face tags-tag-face
+ 'type 'button))
+ (terpri)
+ (forward-line 1))
+ t)))
+
+(defmacro tags-with-face (face &rest body)
+ "Execute BODY, give output to `standard-output' face FACE."
+ (let ((pp (make-symbol "start")))
+ `(let ((,pp (with-current-buffer standard-output (point))))
+ ,@body
+ (put-text-property ,pp (with-current-buffer standard-output (point))
+ 'face ,face standard-output))))
+
+(defun etags-tags-apropos-additional (regexp)
+ "Display tags matching REGEXP from `tags-apropos-additional-actions'."
+ (with-current-buffer standard-output
+ (dolist (oba tags-apropos-additional-actions)
+ (princ "\n\n")
+ (tags-with-face 'highlight (princ (car oba)))
+ (princ":\n\n")
+ (let* ((beg (point))
+ (symbs (car (cddr oba)))
+ (ins-symb (lambda (sy)
+ (let ((sn (symbol-name sy)))
+ (when (string-match regexp sn)
+ (make-text-button (point)
+ (progn (princ sy) (point))
+ 'action-internal(cadr oba)
+ 'action (lambda (button) (funcall
+ (button-get button 'action-internal)
+ (button-get button 'item)))
+ 'item sn
+ 'face tags-tag-face
+ 'follow-link t
+ 'type 'button)
+ (terpri))))))
+ (when (symbolp symbs)
+ (if (boundp symbs)
+ (setq symbs (symbol-value symbs))
+ (insert "symbol `" (symbol-name symbs) "' has no value\n")
+ (setq symbs nil)))
+ (if (vectorp symbs)
+ (mapatoms ins-symb symbs)
+ (dolist (sy symbs)
+ (funcall ins-symb (car sy))))
+ (sort-lines nil beg (point))))))
+
+(defun etags-tags-apropos (string) ; Doc string?
+ (when tags-apropos-verbose
+ (princ "Tags in file `")
+ (tags-with-face 'highlight (princ buffer-file-name))
+ (princ "':\n\n"))
+ (goto-char (point-min))
+ (let ((progress-reporter (make-progress-reporter
+ (format "Making tags apropos buffer for `%s'..."
+ string)
+ (point-min) (point-max))))
+ (while (re-search-forward string nil t)
+ (progress-reporter-update progress-reporter (point))
+ (beginning-of-line)
+
+ (let* ( ;; Get the local value in the tags table
+ ;; buffer before switching buffers.
+ (goto-func goto-tag-location-function)
+ (tag-info (save-excursion (funcall snarf-tag-function)))
+ (tag (if (eq t (car tag-info)) nil (car tag-info)))
+ (file-path (save-excursion (if tag (file-of-tag)
+ (save-excursion (forward-line 1)
+ (file-of-tag)))))
+ (file-label (if tag (file-of-tag t)
+ (save-excursion (forward-line 1)
+ (file-of-tag t))))
+ (pt (with-current-buffer standard-output (point))))
+ (if tag
+ (progn
+ (princ (format "[%s]: " file-label))
+ (princ tag)
+ (when (= (aref tag 0) ?\() (princ " ...)"))
+ (with-current-buffer standard-output
+ (make-text-button pt (point)
+ 'tag-info tag-info
+ 'file-path file-path
+ 'goto-func goto-func
+ 'action (lambda (button)
+ (let ((tag-info (button-get button 'tag-info))
+ (goto-func (button-get button 'goto-func)))
+ (tag-find-file-of-tag (button-get button 'file-path))
+ (widen)
+ (funcall goto-func tag-info)))
+ 'follow-link t
+ 'face tags-tag-face
+ 'type 'button)))
+ (princ (format "- %s" file-label))
+ (with-current-buffer standard-output
+ (make-text-button pt (point)
+ 'file-path file-path
+ 'action (lambda (button)
+ (tag-find-file-of-tag (button-get button 'file-path))
+ ;; Get the local value in the tags table
+ ;; buffer before switching buffers.
+ (goto-char (point-min)))
+ 'follow-link t
+ 'face tags-tag-face
+ 'type 'button))))
+ (terpri)
+ (forward-line 1))
+ (message nil))
+ (when tags-apropos-verbose (princ "\n")))
+
+(defun etags-tags-table-files () ; Doc string?
+ (let ((files nil)
+ beg)
+ (goto-char (point-min))
+ (while (search-forward "\f\n" nil t)
+ (setq beg (point))
+ (end-of-line)
+ (skip-chars-backward "^," beg)
+ (or (looking-at "include$")
+ (push (convert-standard-filename
+ (buffer-substring beg (1- (point))))
+ files)))
+ (nreverse files)))
+
+;; FIXME? Should this save-excursion?
+(defun etags-tags-included-tables () ; Doc string?
+ (let ((files nil)
+ beg)
+ (goto-char (point-min))
+ (while (search-forward "\f\n" nil t)
+ (setq beg (point))
+ (end-of-line)
+ (skip-chars-backward "^," beg)
+ (when (looking-at "include$")
+ ;; Expand in the default-directory of the tags table buffer.
+ (push (expand-file-name (convert-standard-filename
+ (buffer-substring beg (1- (point)))))
+ files)))
+ (nreverse files)))
+
+;; Empty tags file support.
+
+(defun tags-recognize-empty-tags-table ()
+ "Return non-nil if current buffer is empty.
+If empty, make buffer-local values of the tags table format variables
+that do nothing."
+ (and (zerop (buffer-size))
+ (mapc (lambda (sym) (set (make-local-variable sym) 'ignore))
+ '(tags-table-files-function
+ tags-completion-table-function
+ find-tag-regexp-search-function
+ find-tag-search-function
+ tags-apropos-function
+ tags-included-tables-function))
+ (set (make-local-variable 'verify-tags-table-function)
+ (lambda () (zerop (buffer-size))))))
+
+;; Match qualifier functions for tagnames.
+;; These functions assume the etags file format defined in etc/ETAGS.EBNF.
+
+;; This might be a neat idea, but it's too hairy at the moment.
+;;(defmacro tags-with-syntax (&rest body)
+;; `(with-syntax-table
+;; (with-current-buffer (find-file-noselect (file-of-tag))
+;; (syntax-table))
+;; ,@body))
+;;(put 'tags-with-syntax 'edebug-form-spec '(&rest form))
+
+;; exact file name match, i.e. searched tag must match complete file
+;; name including directories parts if there are some.
+(defun tag-exact-file-name-match-p (tag)
+ "Return non-nil if TAG matches complete file name.
+Any directory part of the file name is also matched."
+ (and (looking-at ",[0-9\n]")
+ (save-excursion (backward-char (+ 2 (length tag)))
+ (looking-at "\f\n"))))
+
+;; file name match as above, but searched tag must match the file
+;; name not including the directories if there are some.
+(defun tag-file-name-match-p (tag)
+ "Return non-nil if TAG matches file name, excluding directory part."
+ (and (looking-at ",[0-9\n]")
+ (save-excursion (backward-char (1+ (length tag)))
+ (looking-at "/"))))
+
+;; this / to detect we are after a directory separator is ok for unix,
+;; is there a variable that contains the regexp for directory separator
+;; on whatever operating system ?
+;; Looks like ms-win will lose here :).
+
+;; t if point is at a tag line that matches TAG exactly.
+;; point should be just after a string that matches TAG.
+(defun tag-exact-match-p (tag)
+ "Return non-nil if current tag line matches TAG exactly.
+Point should be just after a string that matches TAG."
+ ;; The match is really exact if there is an explicit tag name.
+ (or (and (eq (char-after (point)) ?\001)
+ (eq (char-after (- (point) (length tag) 1)) ?\177))
+ ;; We are not on the explicit tag name, but perhaps it follows.
+ (looking-at (concat "[^\177\n]*\177" (regexp-quote tag) "\001"))))
+
+;; t if point is at a tag line that has an implicit name.
+;; point should be just after a string that matches TAG.
+(defun tag-implicit-name-match-p (tag)
+ "Return non-nil if current tag line has an implicit name.
+Point should be just after a string that matches TAG."
+ ;; Look at the comment of the make_tag function in lib-src/etags.c for
+ ;; a textual description of the four rules.
+ (and (string-match "^[^ \t()=,;]+$" tag) ;rule #1
+ (looking-at "[ \t()=,;]?\177") ;rules #2 and #4
+ (save-excursion
+ (backward-char (1+ (length tag)))
+ (looking-at "[\n \t()=,;]")))) ;rule #3
+
+;; t if point is at a tag line that matches TAG as a symbol.
+;; point should be just after a string that matches TAG.
+(defun tag-symbol-match-p (tag)
+ "Return non-nil if current tag line matches TAG as a symbol.
+Point should be just after a string that matches TAG."
+ (and (looking-at "\\Sw.*\177") (looking-at "\\S_.*\177")
+ (save-excursion
+ (backward-char (1+ (length tag)))
+ (and (looking-at "\\Sw") (looking-at "\\S_")))))
+
+;; t if point is at a tag line that matches TAG as a word.
+;; point should be just after a string that matches TAG.
+(defun tag-word-match-p (tag)
+ "Return non-nil if current tag line matches TAG as a word.
+Point should be just after a string that matches TAG."
+ (and (looking-at "\\b.*\177")
+ (save-excursion (backward-char (length tag))
+ (looking-at "\\b"))))
+
+;; partial file name match, i.e. searched tag must match a substring
+;; of the file name (potentially including a directory separator).
+(defun tag-partial-file-name-match-p (_tag)
+ "Return non-nil if current tag matches file name.
+This is a substring match, and it can include directory separators.
+Point should be just after a string that matches TAG."
+ (and (looking-at ".*,[0-9\n]")
+ (save-excursion (beginning-of-line)
+ (backward-char 2)
+ (looking-at "\f\n"))))
+
+;; t if point is in a tag line with a tag containing TAG as a substring.
+(defun tag-any-match-p (_tag)
+ "Return non-nil if current tag line contains TAG as a substring."
+ (looking-at ".*\177"))
+
+;; t if point is at a tag line that matches RE as a regexp.
+(defun tag-re-match-p (re)
+ "Return non-nil if current tag line matches regexp RE."
+ (save-excursion
+ (beginning-of-line)
+ (let ((bol (point)))
+ (and (search-forward "\177" (line-end-position) t)
+ (re-search-backward re bol t)))))
+
+(defcustom tags-loop-revert-buffers nil
+ "Non-nil means tags-scanning loops should offer to reread changed files.
+These loops normally read each file into Emacs, but when a file
+is already visited, they use the existing buffer.
+When this flag is non-nil, they offer to revert the existing buffer
+in the case where the file has changed since you visited it."
+ :type 'boolean
+ :group 'etags)
+
+;;;###autoload
+(defun next-file (&optional initialize novisit)
+ "Select next file among files in current tags table.
+
+A first argument of t (prefix arg, if interactive) initializes to the
+beginning of the list of files in the tags table. If the argument is
+neither nil nor t, it is evalled to initialize the list of files.
+
+Non-nil second argument NOVISIT means use a temporary buffer
+ to save time and avoid uninteresting warnings.
+
+Value is nil if the file was already visited;
+if the file was newly read in, the value is the filename."
+ ;; Make the interactive arg t if there was any prefix arg.
+ (interactive (list (if current-prefix-arg t)))
+ (cond ((not initialize)
+ ;; Not the first run.
+ )
+ ((eq initialize t)
+ ;; Initialize the list from the tags table.
+ (save-excursion
+ ;; Visit the tags table buffer to get its list of files.
+ (visit-tags-table-buffer)
+ ;; Copy the list so we can setcdr below, and expand the file
+ ;; names while we are at it, in this buffer's default directory.
+ (setq next-file-list (mapcar 'expand-file-name (tags-table-files)))
+ ;; Iterate over all the tags table files, collecting
+ ;; a complete list of referenced file names.
+ (while (visit-tags-table-buffer t)
+ ;; Find the tail of the working list and chain on the new
+ ;; sublist for this tags table.
+ (let ((tail next-file-list))
+ (while (cdr tail)
+ (setq tail (cdr tail)))
+ ;; Use a copy so the next loop iteration will not modify the
+ ;; list later returned by (tags-table-files).
+ (if tail
+ (setcdr tail (mapcar 'expand-file-name (tags-table-files)))
+ (setq next-file-list (mapcar 'expand-file-name
+ (tags-table-files))))))))
+ (t
+ ;; Initialize the list by evalling the argument.
+ (setq next-file-list (eval initialize))))
+ (unless next-file-list
+ (and novisit
+ (get-buffer " *next-file*")
+ (kill-buffer " *next-file*"))
+ (user-error "All files processed"))
+ (let* ((next (car next-file-list))
+ (buffer (get-file-buffer next))
+ (new (not buffer)))
+ ;; Advance the list before trying to find the file.
+ ;; If we get an error finding the file, don't get stuck on it.
+ (setq next-file-list (cdr next-file-list))
+ ;; Optionally offer to revert buffers
+ ;; if the files have changed on disk.
+ (and buffer tags-loop-revert-buffers
+ (not (verify-visited-file-modtime buffer))
+ (y-or-n-p
+ (format
+ (if (buffer-modified-p buffer)
+ "File %s changed on disk. Discard your edits? "
+ "File %s changed on disk. Reread from disk? ")
+ next))
+ (with-current-buffer buffer
+ (revert-buffer t t)))
+ (if (not (and new novisit))
+ (find-file next novisit)
+ ;; Like find-file, but avoids random warning messages.
+ (switch-to-buffer (get-buffer-create " *next-file*"))
+ (kill-all-local-variables)
+ (erase-buffer)
+ (setq new next)
+ (insert-file-contents new nil))
+ new))
+
+(defvar tags-loop-operate nil
+ "Form for `tags-loop-continue' to eval to change one file.")
+
+(defvar tags-loop-scan
+ '(user-error "%s"
+ (substitute-command-keys
+ "No \\[tags-search] or \\[tags-query-replace] in progress"))
+ "Form for `tags-loop-continue' to eval to scan one file.
+If it returns non-nil, this file needs processing by evalling
+\`tags-loop-operate'. Otherwise, move on to the next file.")
+
+(defun tags-loop-eval (form)
+ "Evaluate FORM and return its result.
+Bind `case-fold-search' during the evaluation, depending on the value of
+`tags-case-fold-search'."
+ (let ((case-fold-search (if (memq tags-case-fold-search '(t nil))
+ tags-case-fold-search
+ case-fold-search)))
+ (eval form)))
+
+
+;;;###autoload
+(defun tags-loop-continue (&optional first-time)
+ "Continue last \\[tags-search] or \\[tags-query-replace] command.
+Used noninteractively with non-nil argument to begin such a command (the
+argument is passed to `next-file', which see).
+
+Two variables control the processing we do on each file: the value of
+`tags-loop-scan' is a form to be executed on each file to see if it is
+interesting (it returns non-nil if so) and `tags-loop-operate' is a form to
+evaluate to operate on an interesting file. If the latter evaluates to
+nil, we exit; otherwise we scan the next file."
+ (declare (obsolete "use `xref-find-definitions' interface instead." "25.1"))
+ (interactive)
+ (let (new
+ ;; Non-nil means we have finished one file
+ ;; and should not scan it again.
+ file-finished
+ original-point
+ (messaged nil))
+ (while
+ (progn
+ ;; Scan files quickly for the first or next interesting one.
+ ;; This starts at point in the current buffer.
+ (while (or first-time file-finished
+ (save-restriction
+ (widen)
+ (not (tags-loop-eval tags-loop-scan))))
+ ;; If nothing was found in the previous file, and
+ ;; that file isn't in a temp buffer, restore point to
+ ;; where it was.
+ (when original-point
+ (goto-char original-point))
+
+ (setq file-finished nil)
+ (setq new (next-file first-time t))
+
+ ;; If NEW is non-nil, we got a temp buffer,
+ ;; and NEW is the file name.
+ (when (or messaged
+ (and (not first-time)
+ (> baud-rate search-slow-speed)
+ (setq messaged t)))
+ (message "Scanning file %s..." (or new buffer-file-name)))
+
+ (setq first-time nil)
+ (setq original-point (if new nil (point)))
+ (goto-char (point-min)))
+
+ ;; If we visited it in a temp buffer, visit it now for real.
+ (if new
+ (let ((pos (point)))
+ (erase-buffer)
+ (set-buffer (find-file-noselect new))
+ (setq new nil) ;No longer in a temp buffer.
+ (widen)
+ (goto-char pos))
+ (push-mark original-point t))
+
+ (switch-to-buffer (current-buffer))
+
+ ;; Now operate on the file.
+ ;; If value is non-nil, continue to scan the next file.
+ (tags-loop-eval tags-loop-operate))
+ (setq file-finished t))
+ (and messaged
+ (null tags-loop-operate)
+ (message "Scanning file %s...found" buffer-file-name))))
+
+;;;###autoload
+(defun tags-search (regexp &optional file-list-form)
+ "Search through all files listed in tags table for match for REGEXP.
+Stops when a match is found.
+To continue searching for next match, use command \\[tags-loop-continue].
+
+If FILE-LIST-FORM is non-nil, it should be a form that, when
+evaluated, will return a list of file names. The search will be
+restricted to these files.
+
+Also see the documentation of the `tags-file-name' variable."
+ (interactive "sTags search (regexp): ")
+ (if (and (equal regexp "")
+ (eq (car tags-loop-scan) 're-search-forward)
+ (null tags-loop-operate))
+ ;; Continue last tags-search as if by M-,.
+ (tags-loop-continue nil)
+ (setq tags-loop-scan `(re-search-forward ',regexp nil t)
+ tags-loop-operate nil)
+ (tags-loop-continue (or file-list-form t))))
+
+;;;###autoload
+(defun tags-query-replace (from to &optional delimited file-list-form)
+ "Do `query-replace-regexp' of FROM with TO on all files listed in tags table.
+Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
+If you exit (\\[keyboard-quit], RET or q), you can resume the query replace
+with the command \\[tags-loop-continue].
+Fourth arg FILE-LIST-FORM non-nil means initialize the replacement loop.
+Fifth and sixth arguments START and END are accepted, for compatibility
+with `query-replace-regexp', and ignored.
+
+If FILE-LIST-FORM is non-nil, it is a form to evaluate to
+produce the list of files to search.
+
+See also the documentation of the variable `tags-file-name'."
+ (interactive (query-replace-read-args "Tags query replace (regexp)" t t))
+ (setq tags-loop-scan `(let ,(unless (equal from (downcase from))
+ '((case-fold-search nil)))
+ (if (re-search-forward ',from nil t)
+ ;; When we find a match, move back
+ ;; to the beginning of it so perform-replace
+ ;; will see it.
+ (goto-char (match-beginning 0))))
+ tags-loop-operate `(perform-replace ',from ',to t t ',delimited
+ nil multi-query-replace-map))
+ (tags-loop-continue (or file-list-form t)))
+
+(defun tags-complete-tags-table-file (string predicate what) ; Doc string?
+ (save-excursion
+ ;; If we need to ask for the tag table, allow that.
+ (let ((enable-recursive-minibuffers t))
+ (visit-tags-table-buffer))
+ (if (eq what t)
+ (all-completions string (tags-table-files) predicate)
+ (try-completion string (tags-table-files) predicate))))
+
+;;;###autoload
+(defun list-tags (file &optional _next-match)
+ "Display list of tags in file FILE.
+This searches only the first table in the list, and no included tables.
+FILE should be as it appeared in the `etags' command, usually without a
+directory specification."
+ (interactive (list (completing-read "List tags in file: "
+ 'tags-complete-tags-table-file
+ nil t nil)))
+ (with-output-to-temp-buffer "*Tags List*"
+ (princ "Tags in file `")
+ (tags-with-face 'highlight (princ file))
+ (princ "':\n\n")
+ (save-excursion
+ (let ((first-time t)
+ (gotany nil))
+ (while (visit-tags-table-buffer (not first-time))
+ (setq first-time nil)
+ (if (funcall list-tags-function file)
+ (setq gotany t)))
+ (or gotany
+ (user-error "File %s not in current tags tables" file)))))
+ (with-current-buffer "*Tags List*"
+ (require 'apropos)
+ (with-no-warnings
+ (apropos-mode))
+ (setq buffer-read-only t)))
+
+;;;###autoload
+(defun tags-apropos (regexp)
+ "Display list of all tags in tags table REGEXP matches."
+ (declare (obsolete xref-find-apropos "25.1"))
+ (interactive "sTags apropos (regexp): ")
+ (with-output-to-temp-buffer "*Tags List*"
+ (princ "Click mouse-2 to follow tags.\n\nTags matching regexp `")
+ (tags-with-face 'highlight (princ regexp))
+ (princ "':\n\n")
+ (save-excursion
+ (let ((first-time t))
+ (while (visit-tags-table-buffer (not first-time))
+ (setq first-time nil)
+ (funcall tags-apropos-function regexp))))
+ (etags-tags-apropos-additional regexp))
+ (with-current-buffer "*Tags List*"
+ (eval-and-compile (require 'apropos))
+ (apropos-mode)
+ ;; apropos-mode is derived from fundamental-mode and it kills
+ ;; all local variables.
+ (setq buffer-read-only t)))
+
+;; XXX Kludge interface.
+
+(define-button-type 'tags-select-tags-table
+ 'action 'select-tags-table-select
+ 'follow-link t
+ 'help-echo "RET, t or mouse-2: select tags table")
+
+;; XXX If a file is in multiple tables, selection may get the wrong one.
+;;;###autoload
+(defun select-tags-table ()
+ "Select a tags table file from a menu of those you have already used.
+The list of tags tables to select from is stored in `tags-table-set-list';
+see the doc of that variable if you want to add names to the list."
+ (interactive)
+ (pop-to-buffer "*Tags Table List*")
+ (setq buffer-read-only nil
+ buffer-undo-list t)
+ (erase-buffer)
+ (let ((set-list tags-table-set-list)
+ (desired-point nil)
+ b)
+ (when tags-table-list
+ (setq desired-point (point-marker))
+ (setq b (point))
+ (princ (mapcar 'abbreviate-file-name tags-table-list) (current-buffer))
+ (make-text-button b (point) 'type 'tags-select-tags-table
+ 'etags-table (car tags-table-list))
+ (insert "\n"))
+ (while set-list
+ (unless (eq (car set-list) tags-table-list)
+ (setq b (point))
+ (princ (mapcar 'abbreviate-file-name (car set-list)) (current-buffer))
+ (make-text-button b (point) 'type 'tags-select-tags-table
+ 'etags-table (car (car set-list)))
+ (insert "\n"))
+ (setq set-list (cdr set-list)))
+ (when tags-file-name
+ (or desired-point
+ (setq desired-point (point-marker)))
+ (setq b (point))
+ (insert (abbreviate-file-name tags-file-name))
+ (make-text-button b (point) 'type 'tags-select-tags-table
+ 'etags-table tags-file-name)
+ (insert "\n"))
+ (setq set-list (delete tags-file-name
+ (apply 'nconc (cons (copy-sequence tags-table-list)
+ (mapcar 'copy-sequence
+ tags-table-set-list)))))
+ (while set-list
+ (setq b (point))
+ (insert (abbreviate-file-name (car set-list)))
+ (make-text-button b (point) 'type 'tags-select-tags-table
+ 'etags-table (car set-list))
+ (insert "\n")
+ (setq set-list (delete (car set-list) set-list)))
+ (goto-char (point-min))
+ (insert-before-markers
+ "Type `t' to select a tags table or set of tags tables:\n\n")
+ (if desired-point
+ (goto-char desired-point))
+ (set-window-start (selected-window) 1 t))
+ (set-buffer-modified-p nil)
+ (select-tags-table-mode))
+
+(defvar select-tags-table-mode-map ; Doc string?
+ (let ((map (make-sparse-keymap)))
+ (set-keymap-parent map button-buffer-map)
+ (define-key map "t" 'push-button)
+ (define-key map " " 'next-line)
+ (define-key map "\^?" 'previous-line)
+ (define-key map "n" 'next-line)
+ (define-key map "p" 'previous-line)
+ (define-key map "q" 'select-tags-table-quit)
+ map))
+
+(define-derived-mode select-tags-table-mode special-mode "Select Tags Table"
+ "Major mode for choosing a current tags table among those already loaded."
+ (setq buffer-read-only t))
+
+(defun select-tags-table-select (button)
+ "Select the tags table named on this line."
+ (interactive (list (or (button-at (line-beginning-position))
+ (error "No tags table on current line"))))
+ (let ((name (button-get button 'etags-table)))
+ (visit-tags-table name)
+ (select-tags-table-quit)
+ (message "Tags table now %s" name)))
+
+(defun select-tags-table-quit ()
+ "Kill the buffer and delete the selected window."
+ (interactive)
+ (quit-window t (selected-window)))
+
+;;;###autoload
+(defun complete-tag ()
+ "Perform tags completion on the text around point.
+Completes to the set of names listed in the current tags table.
+The string to complete is chosen in the same way as the default
+for \\[find-tag] (which see)."
+ (interactive)
+ (or tags-table-list
+ tags-file-name
+ (user-error "%s"
+ (substitute-command-keys
+ "No tags table loaded; try \\[visit-tags-table]")))
+ (let ((comp-data (tags-completion-at-point-function)))
+ (if (null comp-data)
+ (user-error "Nothing to complete")
+ (completion-in-region (car comp-data) (cadr comp-data)
+ (nth 2 comp-data)
+ (plist-get (nthcdr 3 comp-data) :predicate)))))
+
+
+;;; Xref backend
+
+;; Stop searching if we find more than xref-limit matches, as the xref
+;; infrastructure is not designed to handle very long lists.
+;; Switching to some kind of lazy list might be better, but hopefully
+;; we hit the limit rarely.
+(defconst etags--xref-limit 1000)
+
+(defvar etags-xref-find-definitions-tag-order '(tag-exact-match-p
+ tag-implicit-name-match-p
+ tag-symbol-match-p)
+ "Tag order used in `etags-xref-find' to look for definitions.")
+
+;;;###autoload
+(defun etags-xref-find (action id)
+ (pcase action
+ (`definitions (etags--xref-find-definitions id))
+ (`references
+ (let ((dirs (if tags-table-list
+ (mapcar #'file-name-directory tags-table-list)
+ ;; If no tags files are loaded, prompt for the dir.
+ (list (read-directory-name "In directory: " nil nil t)))))
+ (cl-mapcan
+ (lambda (dir)
+ (xref-collect-references id dir))
+ dirs)))
+ (`apropos (etags--xref-find-definitions id t))))
+
+(defun etags--xref-find-definitions (pattern &optional regexp?)
+ ;; This emulates the behaviour of `find-tag-in-order' but instead of
+ ;; returning one match at a time all matches are returned as list.
+ ;; NOTE: find-tag-tag-order is typically a buffer-local variable.
+ (let* ((xrefs '())
+ (first-time t)
+ (search-fun (if regexp? #'re-search-forward #'search-forward))
+ (marks (make-hash-table :test 'equal))
+ (case-fold-search (if (memq tags-case-fold-search '(nil t))
+ tags-case-fold-search
+ case-fold-search)))
+ (save-excursion
+ (while (visit-tags-table-buffer (not first-time))
+ (setq first-time nil)
+ (dolist (order-fun (cond (regexp? find-tag-regexp-tag-order)
+ (t etags-xref-find-definitions-tag-order)))
+ (goto-char (point-min))
+ (while (and (funcall search-fun pattern nil t)
+ (< (hash-table-count marks) etags--xref-limit))
+ (when (funcall order-fun pattern)
+ (beginning-of-line)
+ (pcase-let* ((tag-info (etags-snarf-tag))
+ (`(,hint ,line . _) tag-info))
+ (unless (eq hint t) ; hint==t if we are in a filename line
+ (let* ((file (file-of-tag))
+ (mark-key (cons file line)))
+ (unless (gethash mark-key marks)
+ (let ((loc (xref-make-etags-location
+ tag-info (expand-file-name file))))
+ (push (xref-make hint loc) xrefs)
+ (puthash mark-key t marks)))))))))))
+ (nreverse xrefs)))
+
+(defclass xref-etags-location (xref-location)
+ ((tag-info :type list :initarg :tag-info)
+ (file :type string :initarg :file
+ :reader xref-location-group))
+ :documentation "Location of an etags tag.")
+
+(defun xref-make-etags-location (tag-info file)
+ (make-instance 'xref-etags-location :tag-info tag-info
+ :file (expand-file-name file)))
+
+(cl-defmethod xref-location-marker ((l xref-etags-location))
+ (with-slots (tag-info file) l
+ (let ((buffer (find-file-noselect file)))
+ (with-current-buffer buffer
+ (etags-goto-tag-location tag-info)
+ (point-marker)))))
+
+(cl-defmethod xref-location-line ((l xref-etags-location))
+ (with-slots (tag-info) l
+ (nth 1 tag-info)))
+
+
+(provide 'etags)
+
+;;; etags.el ends here
diff --git a/test/etags/erl-src/gs_dialog.erl b/test/etags/erl-src/gs_dialog.erl
new file mode 100644
index 00000000000..c04ee8be0cd
--- /dev/null
+++ b/test/etags/erl-src/gs_dialog.erl
@@ -0,0 +1,271 @@
+-module(gs_dialog). % behaviour
+-define(VERSION, '2001.1101').
+-vsn(?VERSION).
+-author('cpressey@catseye.mb.ca').
+-copyright('Copyright (c)2001 Cat`s Eye Technologies. All rights reserved.').
+
+%%% Redistribution and use in source and binary forms, with or without
+%%% modification, are permitted provided that the following conditions
+%%% are met:
+%%%
+%%% Redistributions of source code must retain the above copyright
+%%% notice, this list of conditions and the following disclaimer.
+%%%
+%%% Redistributions in binary form must reproduce the above copyright
+%%% notice, this list of conditions and the following disclaimer in
+%%% the documentation and/or other materials provided with the
+%%% distribution.
+%%%
+%%% Neither the name of Cat's Eye Technologies nor the names of its
+%%% contributors may be used to endorse or promote products derived
+%%% from this software without specific prior written permission.
+%%%
+%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+%%% CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+%%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+%%% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+%%% DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+%%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+%%% OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+%%% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+%%% OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+%%% ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+%%% OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+%%% OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+%%% POSSIBILITY OF SUCH DAMAGE.
+
+-export([behaviour_info/1,
+ show/4,
+ test/0]).
+
+%%% BEGIN gs_dialog.erl %%%
+
+%%% This module specifies a common behaviour for "modal" dialog boxes
+%%% using GS.
+
+%%--------------------------------------------------------------------
+%% behaviour_info(callbacks) -> ListOfFunctionArityTuples
+%% Used by R8 to check the implementation modules for consistency
+%% with the behaviour specification, what callbacks this module needs.
+
+behaviour_info(callbacks) ->
+ [
+
+ %%----------------------------------------------------------------
+ %% Module:buttons() -> ListOfAtoms
+ %% Should return the labels used on the main (non-extra) buttons
+ %% of the dialog box.
+ %% e.g. ['OK', 'Cancel'].
+
+ {buttons, 0},
+
+ %%----------------------------------------------------------------
+ %% Module:icon() -> FileNameString | {Text, FgColour, BgColour}
+ %% Should return the the icon displayed in the dialog box.
+ %% This should either be the fully qualified filename of a 32x32 GIF
+ %% file (e.g. in the application's priv dir,) or a 3-tuple
+ %% describing a simple "circle" icon to be rendered by GS itself.
+ %% The latter option was added because some versions of Erlang for
+ %% Windows use a Tk emulation package which is not always on the
+ %% ball when it comes to correct image transparency and colour.
+ %% e.g. filename:join(code:priv_dir(?MODULE), "notify.gif")
+
+ {icon, 0},
+
+ %%----------------------------------------------------------------
+ %% Module:controls(Parent, ArgList) -> {GSControl | nil, NewArgList}
+ %% Used by the implementation to provide extra controls in the dialog
+ %% box, if any. If not, nil should be returned instead of the control.
+ %% If many controls are added, it is recommended they are placed in a
+ %% frame, with the frame returned as the control.
+ %% The control need not have positioning information, as it will be
+ %% assigned a pack_xy option when it is placed into the Parent frame.
+ %% The list of arguments may be modified by this callback.
+ %% e.g. {nil, Args}
+
+ {controls, 2},
+
+ %%----------------------------------------------------------------
+ %% Module:on_key(ExtraControl, KeyAtom, ArgList) ->
+ %% {button, ButtonNameAtom} | nil
+ %% Called when a key is pressed in the dialog box. The return value
+ %% specified whether it is linked to pressing a button, or whether it
+ %% it is ignored and passed on to a further handler (if any.)
+
+ {on_key, 3},
+
+ %%----------------------------------------------------------------
+ %% Module:on_button(ExtraControl, ButtonNameAtom, ArgList) -> Result
+ %% Called when one of the main (non-extra) buttons are pressed in
+ %% the dialog box. Since this closes the dialog box, the implementation
+ %% module is expected to provide a final result term with this function.
+
+ {on_button, 3},
+
+ %%----------------------------------------------------------------
+ %% Module:on_event(ExtraControl, Event, ArgList) -> Result
+ %% Allows the implementation module to handle other GS events,
+ %% e.g. those generated by the extra controls specified.
+
+ {on_event, 3}
+ ].
+
+%%% Public Interface
+
+%%--------------------------------------------------------------------
+%% show(ModuleNameAtom, TitleString, MessageString, ArgList) -> Result
+%% Display a generic modal dialog box, customized by the
+%% callback functions in Module. This should be called by
+%% the 'show' function in the Module in question.
+%% The argument list is passed back to the callback functions in the
+%% module, for retaining information pertinent to the callback module;
+%% the behaviour itself does not inspect or care about this list.
+
+show(Module, Title, Message, Args) ->
+ Screen = gs:start(),
+ Buttons = Module:buttons(),
+ NumButtons = length(Buttons),
+ application:load(?MODULE),
+ {ok, Font} = application:get_env(?MODULE, font),
+ {ok, {ScreenWidth, ScreenHeight}} =
+ application:get_env(?MODULE, screen_size),
+ {ok, {DialogWidth, DialogHeight}} =
+ application:get_env(?MODULE, dialog_size),
+ Window = gs:create(window, Screen,
+ [{width, DialogWidth}, {height, DialogHeight},
+ {x, (ScreenWidth - DialogWidth) div 2},
+ {y, (ScreenHeight - DialogHeight) div 2},
+ {title, Title},
+ {configure, true}, {keypress, true}]),
+ Frame = gs:create(frame, Window,
+ [{bw, 0},
+ {packer_x, lists:duplicate(NumButtons, {stretch, 1})},
+ {packer_y, [{stretch, 1},{stretch, 2},{stretch, 1}]}]),
+ case Module:icon() of
+ nil ->
+ Label = gs:create(label, Frame,
+ [{label, {text, Message}}, {font, Font}, {justify, center},
+ {pack_xy, {{1, NumButtons}, 1}}]);
+ {Text, Fg, Bg} ->
+ InnerFrame = gs:create(frame, Frame,
+ [{pack_xy, {{1, NumButtons}, 1}}, {bw, 0},
+ {packer_x, [{stretch, 1}, {fixed, 32}, {stretch, 8}]},
+ {packer_y, [{stretch, 1}, {fixed, 32}, {stretch, 1}]}]),
+ IconCanvas = gs:create(canvas, InnerFrame,
+ [{pack_xy, {2, 2}}]),
+ IconCircle = gs:create(oval, IconCanvas,
+ [{coords, [{0, 0}, {31, 31}]}, {fg, black}, {fill, Bg}]),
+ IconFont = {screen, bold, 24},
+ {ITW,ITH} = gs:read(IconCanvas, {font_wh, {IconFont, Text}}),
+ ITX = 16 - ITW div 2,
+ ITY = 16 - ITH div 2,
+ IconText = gs:create(text, IconCanvas,
+ [{coords, [{ITX, ITY}]}, {fg, Fg}, {text, Text}, {font, IconFont}]),
+ Label = gs:create(label, InnerFrame,
+ [{label, {text, Message}}, {font, Font}, {justify, center},
+ {pack_xy, {3, {1,3}}}]);
+ FileName when list(FileName) ->
+ InnerFrame = gs:create(frame, Frame,
+ [{pack_xy, {{1, NumButtons}, 1}}, {bw, 0},
+ {packer_x, [{stretch, 1}, {fixed, 32}, {stretch, 8}]},
+ {packer_y, [{stretch, 1}, {fixed, 32}, {stretch, 1}]}]),
+ IconCanvas = gs:create(canvas, InnerFrame,
+ [{pack_xy, {2, 2}}]),
+ Icon = gs:create(image, IconCanvas, [{coords, [{0, 0}]},
+ {load_gif, FileName}]),
+ Label = gs:create(label, InnerFrame,
+ [{label, {text, Message}}, {font, Font}, {justify, center},
+ {pack_xy, {3, {1,3}}}])
+ end,
+ {Extra, NewArgs} = Module:controls(Frame, Args),
+ case Extra of
+ nil -> gs:config(Frame, {packer_y, [{stretch, 2},{fixed, 0},{stretch, 1}]});
+ _ -> gs:config(Extra, {pack_xy, {{1, NumButtons}, 2}})
+ end,
+ lists:foldl(fun(X, A) ->
+ I = gs:create(frame, Frame, [{packer_x, [{stretch, 1}, {fixed, 80}, {stretch, 1}]},
+ {packer_y, [{stretch, 1}, {fixed, 24}, {stretch, 1}]},
+ {pack_xy, {A, 3}}]),
+ gs:create(button, I, [{label, {text, atom_to_list(X)}}, {font, Font},
+ {data, {button, X}},
+ {pack_xy, {2, 2}}]),
+ A + 1
+ end, 1, Buttons),
+ gs:config(Frame, [{width, DialogWidth}, {height, DialogHeight}]),
+ {MessageWidth, MessageHeight} = gs:read(Frame, {font_wh, {Font, Message}}),
+ case MessageWidth of
+ N1 when N1 > trunc(DialogWidth * 0.8) ->
+ NewDialogWidth = trunc(MessageWidth * 1.2),
+ gs:config(Window,
+ [{width, NewDialogWidth},
+ {x, (ScreenWidth - NewDialogWidth) div 2}]);
+ _ -> ok
+ end,
+ case MessageHeight of
+ N2 when N2 > trunc(DialogHeight * 0.666) ->
+ NewDialogHeight = trunc(MessageHeight * 1.666),
+ gs:config(Window,
+ [{height, NewDialogHeight},
+ {y, (ScreenHeight - NewDialogHeight) div 2}]);
+ _ -> ok
+ end,
+ gs:config(Window, {map, true}),
+ dialog_loop(Module, Window, Frame, Extra, NewArgs).
+
+%%--------------------------------------------------------------------
+%% dialog_loop(Module, Window, Frame, Extra, Args) -> Result
+%% Called by show/4, handles generic events in a dialog box.
+
+dialog_loop(Module, Window, Frame, Extra, Args) ->
+ receive
+ {gs, Window, destroy, Data, EventArgs} ->
+ Module:on_button(Extra, 'Cancel', Args);
+ {gs, Window, configure, Data, [W,H | Rest]} ->
+ gs:config(Frame, [{width, W}, {height, H}]),
+ dialog_loop(Module, Window, Frame, Extra, Args);
+ {gs, Window, keypress, Data, [KeyCode | Rest]} ->
+ case Module:on_key(Extra, KeyCode, Args) of
+ {button, ButtonType} ->
+ Return = Module:on_button(Extra, ButtonType, Args),
+ gs:destroy(Window),
+ Return;
+ _ -> dialog_loop(Module, Window, Frame, Extra, Args)
+ end;
+ {gs, Button, click, {button, ButtonType}, EventArgs} ->
+ Return = Module:on_button(Extra, ButtonType, Args),
+ gs:destroy(Window),
+ Return;
+ Other -> % io:fwrite("~w~n", [Other]),
+ case Module:on_event(Extra, Other, Args) of
+ {button, ButtonType} ->
+ Return = Module:on_button(Extra, ButtonType, Args),
+ gs:destroy(Window),
+ Return;
+ _ -> dialog_loop(Module, Window, Frame, Extra, Args)
+ end
+ end.
+
+%%--------------------------------------------------------------------
+%% test() -> ResultTuple.
+%% Tests some of the common dialog boxes implemented with this behaviour.
+
+test() ->
+ A = gs_dialog_notify:show("Notification", "This is a notification dialog."),
+ B = gs_dialog_confirm:show("Confirmation",
+ "Are you sure you want to\ntake some sort of drastic action?"),
+ C = gs_dialog_question:show("Question", "Save your barcodes first?"),
+ D = gs_dialog_entry:show("Text Entry",
+ "Enter the address of this order:", "555 Twenty-third St."),
+ E = gs_dialog_list:show("Select One", "Select a game to play.",
+ ["Chess", "Checkers", "Othello", "Go", "Backgammon", "Kali", "Sink"]),
+ F = gs_dialog_color:show("Choose Colour", "Pick your favourite colour.",
+ {255, 0, 128}),
+ G = gs_dialog_notify:show("Lengthy Notification",
+ "This is an extremely long message with no line breaks. "
+ "The dialog box should expand to display the entire message."),
+ H = gs_dialog_notify:show("Lengthy Notification",
+ "This is an extremely\nlong message with\nmany lines.\n\n"
+ "The dialog box\nshould\nexpand\nto\ndisplay\nthe\nentire\nmessage."),
+ {A,B,C,D,E,F,G,H}.
+
+%%% END of gs_dialog.erl %%%
diff --git a/test/etags/f-src/entry.for b/test/etags/f-src/entry.for
new file mode 100644
index 00000000000..52b8a2487c6
--- /dev/null
+++ b/test/etags/f-src/entry.for
@@ -0,0 +1,581 @@
+C$Procedure PRTPKG ( Declare Arguments for Error Message Routines )
+
+ LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL, TRACE, DFAULT, TYPE )
+
+C$ Abstract
+C
+C Declare the arguments for the error message selection entry
+C points. DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C ERROR
+C
+C$ Keywords
+C
+C ERROR
+C
+C$ Declarations
+
+ LOGICAL SHORT
+ LOGICAL EXPL
+ LOGICAL LONG
+ LOGICAL TRACE
+ LOGICAL DFAULT
+ CHARACTER*(*) TYPE
+
+ INTEGER FILEN
+ PARAMETER ( FILEN = 128 )
+
+
+C$ Brief_I/O
+C
+C VARIABLE I/O ENTRY
+C -------- --- --------------------------------------------------
+C
+C SHORT I SETPRT
+C EXPL I SETPRT
+C LONG I SETPRT
+C TRACE I SETPRT
+C DFAULT I SETPRT
+C TYPE I MSGSEL
+C FILEN P MSGSEL
+C
+C$ Detailed_Input
+C
+C See the ENTRY points for discussions of their arguments.
+C
+C$ Detailed_Output
+C
+C See the ENTRY points for discussions of their arguments.
+C
+C$ Parameters
+C
+C See the ENTRY points for discussions of their parameters.
+C
+C$ Exceptions
+C
+C This routine signals an error IF IT IS CALLED.
+C
+C$ Files
+C
+C None.
+C
+C$ Particulars
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C The entry points declared in this routine are:
+C
+C SETPRT
+C MSGSEL
+C
+C There is no reason to call this subroutine.
+C The purpose of this subroutine is to make the
+C declarations required by the various entry points.
+C This routine has no run-time function.
+C
+C$ Examples
+C
+C None. DO NOT CALL THIS ROUTINE.
+C
+C$ Restrictions
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C Comment section for permuted index source lines was added
+C following the header.
+C
+C
+C-&
+
+C$ Index_Entries
+C
+C None.
+C
+C-&
+
+
+
+C$ Revisions
+C
+C
+C- Beta Version 1.0.1, 08-FEB-1989
+C
+C PRTPKG, though it performs no run-time function, must
+C still return a value, in order to comply with the Fortran
+C standard. So, now it does.
+C
+C- Beta Version 1.0.1, 08-FEB-1989
+C
+C Warnings added to discourage use of this routine.
+C Parameter declarations moved to "Declarations" section.
+C Two local declarations moved to the correct location.
+C-&
+
+
+
+C
+C SPICELIB functions
+C
+
+ LOGICAL SETPRT
+ LOGICAL MSGSEL
+
+C
+C Local variables:
+C
+ CHARACTER*(FILEN) DEVICE
+
+ CHARACTER*(10) LTYPE
+ CHARACTER*(10) LOCTYP
+
+C
+C Saved variables:
+C
+ LOGICAL SVSHRT
+ LOGICAL SVEXPL
+ LOGICAL SVLONG
+ LOGICAL SVTRAC
+ LOGICAL SVDFLT
+
+ SAVE SVSHRT
+ SAVE SVEXPL
+ SAVE SVLONG
+ SAVE SVTRAC
+ SAVE SVDFLT
+
+C
+C Initial values:
+C
+ DATA SVSHRT / .TRUE. /
+ DATA SVEXPL / .TRUE. /
+ DATA SVLONG / .TRUE. /
+ DATA SVTRAC / .TRUE. /
+ DATA SVDFLT / .TRUE. /
+
+C
+C Executable Code:
+C
+
+ CALL GETDEV ( DEVICE )
+
+ CALL WRLINE ( DEVICE,
+ . 'PRTPKG: You have called an entry point which' //
+ . ' has no run-time function; this may indicate' //
+ . ' a program bug. Please check the PRTPKG' //
+ . ' documentation. ' )
+
+ CALL WRLINE ( DEVICE, 'SPICE(BOGUSENTRY)' )
+
+ PRTPKG = .FALSE.
+
+ RETURN
+
+
+
+
+
+
+C$Procedure SETPRT ( Store Error Message Types to be Output )
+
+C ENTRY BOGUS (X, Y, Z)
+
+ ENTRY SETPRT ( SHORT, EXPL, LONG, TRACE, DFAULT )
+
+C$ Abstract
+C
+C Store (a representation of) the selection of types of error
+C messages to be output. DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C ERROR
+C
+C$ Keywords
+C
+C ERROR
+C
+C$ Declarations
+C
+C LOGICAL SHORT
+C LOGICAL EXPL
+C LOGICAL LONG
+C LOGICAL TRACE
+C LOGICAL DFAULT
+C
+C$ Brief_I/O
+C
+C VARIABLE I/O DESCRIPTION
+C -------- --- --------------------------------------------------
+C
+C SHORT I Select output of short error message?
+C EXPL I Select output of explanation of short message?
+C LONG I Select output of long error message?
+C TRACE I Select output of traceback?
+C DFAULT I Select output of default message?
+C
+C$ Detailed_Input
+C
+C SHORT indicates whether the short error message is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C short error message IS selected.
+C
+C EXPL indicates whether the explanatory text for the short
+C error message is selected as one of the error messages
+C to be output when an error is detected. A value of
+C .TRUE. indicates that the explanatory text for the
+C short error message IS selected.
+C
+C LONG indicates whether the long error message is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C long error message IS selected.
+C
+C TRACE indicates whether the traceback is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C traceback IS selected.
+C
+C DFAULT indicates whether the default message is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C default message IS selected.
+C
+C
+C$ Detailed_Output
+C
+C None.
+C
+C$ Parameters
+C
+C None.
+C
+C$ Exceptions
+C
+C None.
+C
+C$ Files
+C
+C None.
+C
+C$ Particulars
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C The effect of this routine is an ENVIRONMENTAL one. This
+C routine performs no output; it stores the error message
+C selection provided as input.
+C
+C Note that the actual output of error messages depends not
+C only on the selection made using this routine, but also
+C on the selection of the error output device (see ERRDEV)
+C and the choice of error response action (see ERRACT). If
+C the action is not 'IGNORE' (possible choices are
+C 'IGNORE', 'ABORT', 'DEFAULT', 'REPORT', and 'RETURN'),
+C the selected error messages will be written to the chosen
+C output device when an error is detected.
+C
+C$ Examples
+C
+C 1. In this example, the short and long messages are selected.
+C
+C C
+C C Select short and long error messages for output
+C C (We don't examine the status returned because no
+C C errors are detected by SETPRT):
+C C
+C
+C STATUS = SETPRT ( .TRUE., .FALSE., .TRUE., .FALSE.,
+C . .FALSE. )
+C
+C
+C
+C$ Restrictions
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C
+C-&
+
+C$ Index_Entries
+C
+C None.
+C
+C-&
+
+
+C$ Revisions
+C
+C-
+C Warnings added to discourage use of this routine in
+C non-error-handling code. Parameters section added.
+C
+C-&
+
+
+
+C
+C Executable Code:
+C
+
+
+ IF ( SHORT ) THEN
+ SVSHRT = .TRUE.
+ ELSE
+ SVSHRT = .FALSE.
+ END IF
+
+
+
+ IF ( EXPL ) THEN
+ SVEXPL = .TRUE.
+ ELSE
+ SVEXPL = .FALSE.
+ END IF
+
+
+
+ IF ( LONG ) THEN
+ SVLONG = .TRUE.
+ ELSE
+ SVLONG = .FALSE.
+ END IF
+
+
+
+ IF ( TRACE ) THEN
+ SVTRAC = .TRUE.
+ ELSE
+ SVTRAC = .FALSE.
+ END IF
+
+ IF ( DFAULT ) THEN
+ SVDFLT = .TRUE.
+ ELSE
+ SVDFLT = .FALSE.
+ END IF
+
+
+C
+C We assign a value to SETPRT, but this value is
+C not meaningful...
+C
+ SETPRT = .TRUE.
+
+
+ RETURN
+
+
+
+
+C$Procedure MSGSEL ( Is This Message Type Selected for Output? )
+
+ ENTRY MSGSEL ( TYPE )
+
+C$ Abstract
+C
+C Indicate whether the specified message type has been selected
+C for output.
+C
+C$ Required_Reading
+C
+C ERROR
+C
+C$ Keywords
+C
+C ERROR
+C
+C$ Declarations
+C
+C TYPE
+C
+C$ Brief_I/O
+C
+C VARIABLE I/O DESCRIPTION
+C -------- --- --------------------------------------------------
+C
+C TYPE I Type of message whose selection status is queried.
+C FILEN P Maximum length of a file name.
+C
+C The function takes the value .TRUE. if the message type indicated
+C by TYPE has been selected for output to the error output device.
+C
+C
+C$ Detailed_Input
+C
+C TYPE Refers to a type of error message. Possible values
+C are 'SHORT', 'EXPLAIN', 'LONG', 'DEFAULT',
+C and 'TRACEBACK'.
+C
+C$ Detailed_Output
+C
+C The function takes the value .TRUE. if the message type indicated
+C by TYPE has been selected for output to the error output device.
+C
+C$ Parameters
+C
+C FILEN is the maximum length of a file name.
+C
+C$ Exceptions
+C
+C Additionally, invalid values of TYPE are detected.
+C
+C The short error message set in this case is:
+C 'SPICE(INVALIDMSGTYPE)'
+C
+C The handling of this error is a special case; to avoid recursion
+C problems, SIGERR is not called when the error is detected.
+C Instead, the short and long error messages are output directly.
+C
+C
+C$ Files
+C
+C None.
+C
+C$ Particulars
+C
+C This routine is part of the SPICELIB error handling mechanism.
+C
+C Note that even though a given type of message may have been
+C selected for output, the output device and error response
+C action must also have been selected appropriately.
+C Use ERRDEV to choose the output device for error messages.
+C Use ERRACT to choose the error response action. Any action
+C other than 'IGNORE' will result in error messages being
+C written to the error output device when errors are detected.
+C See ERRACT for details.
+C
+C$ Examples
+C
+C
+C 1. We want to know if the short message has been selected
+C for output:
+C
+C C
+C C Test whether the short message has been selected:
+C C
+C
+C SELECT = MSGSEL ( 'SHORT' )
+C
+C
+C$ Restrictions
+C
+C None.
+C
+C$ Literature_References
+C
+C None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C
+C-&
+
+C$ Index_Entries
+C
+C None.
+C
+C-&
+
+
+C$ Revisions
+C
+C
+C Parameters section added; parameter declaration added
+C to brief I/O section as well.
+C
+C-&
+
+
+
+C
+C Executable Code:
+C
+
+ CALL LJUST ( TYPE, LTYPE )
+ CALL UCASE ( LTYPE, LTYPE )
+
+
+ IF ( LTYPE .EQ. 'SHORT' ) THEN
+
+ MSGSEL = SVSHRT
+
+ ELSE IF ( LTYPE .EQ. 'EXPLAIN' ) THEN
+
+ MSGSEL = SVEXPL
+
+ ELSE IF ( LTYPE .EQ. 'LONG' ) THEN
+
+ MSGSEL = SVLONG
+
+ ELSE IF ( LTYPE .EQ. 'TRACEBACK' ) THEN
+
+ MSGSEL = SVTRAC
+
+ ELSE IF ( LTYPE .EQ. 'DEFAULT' ) THEN
+
+ MSGSEL = SVDFLT
+
+ ELSE
+
+C
+C Bad value of type! We have a special case here; to
+C avoid recursion, we output the messages directly,
+C rather than call SIGERR.
+C
+
+ CALL GETDEV ( DEVICE )
+
+ CALL WRLINE ( DEVICE, 'SPICE(INVALIDMSGTYPE)' )
+
+ CALL WRLINE ( DEVICE, ' ' )
+
+ LOCTYP = TYPE
+
+C
+C Note: What looks like a typo below isn't; there's
+C a line break after the substring 'specified' of
+C the "word" 'specifiedwas'.
+C
+
+ CALL WRLINE ( DEVICE,
+
+ . 'MSGSEL: An invalid error message type was supplied as' //
+ . ' input; the type specifiedwas: ' // LOCTYP
+
+ . )
+
+
+ END IF
+
+ subroutine
+ & intensity1(efv,fv,svin,svquad,sfpv,maxp,value,jndex,k,kj,jmod,isup)
+
+ character*(*) function foo()
+
+ END
diff --git a/test/etags/f-src/entry.strange.gz b/test/etags/f-src/entry.strange.gz
new file mode 100644
index 00000000000..5f22edc86bb
--- /dev/null
+++ b/test/etags/f-src/entry.strange.gz
Binary files differ
diff --git a/test/etags/f-src/entry.strange_suffix b/test/etags/f-src/entry.strange_suffix
new file mode 100644
index 00000000000..52b8a2487c6
--- /dev/null
+++ b/test/etags/f-src/entry.strange_suffix
@@ -0,0 +1,581 @@
+C$Procedure PRTPKG ( Declare Arguments for Error Message Routines )
+
+ LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL, TRACE, DFAULT, TYPE )
+
+C$ Abstract
+C
+C Declare the arguments for the error message selection entry
+C points. DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C ERROR
+C
+C$ Keywords
+C
+C ERROR
+C
+C$ Declarations
+
+ LOGICAL SHORT
+ LOGICAL EXPL
+ LOGICAL LONG
+ LOGICAL TRACE
+ LOGICAL DFAULT
+ CHARACTER*(*) TYPE
+
+ INTEGER FILEN
+ PARAMETER ( FILEN = 128 )
+
+
+C$ Brief_I/O
+C
+C VARIABLE I/O ENTRY
+C -------- --- --------------------------------------------------
+C
+C SHORT I SETPRT
+C EXPL I SETPRT
+C LONG I SETPRT
+C TRACE I SETPRT
+C DFAULT I SETPRT
+C TYPE I MSGSEL
+C FILEN P MSGSEL
+C
+C$ Detailed_Input
+C
+C See the ENTRY points for discussions of their arguments.
+C
+C$ Detailed_Output
+C
+C See the ENTRY points for discussions of their arguments.
+C
+C$ Parameters
+C
+C See the ENTRY points for discussions of their parameters.
+C
+C$ Exceptions
+C
+C This routine signals an error IF IT IS CALLED.
+C
+C$ Files
+C
+C None.
+C
+C$ Particulars
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C The entry points declared in this routine are:
+C
+C SETPRT
+C MSGSEL
+C
+C There is no reason to call this subroutine.
+C The purpose of this subroutine is to make the
+C declarations required by the various entry points.
+C This routine has no run-time function.
+C
+C$ Examples
+C
+C None. DO NOT CALL THIS ROUTINE.
+C
+C$ Restrictions
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C Comment section for permuted index source lines was added
+C following the header.
+C
+C
+C-&
+
+C$ Index_Entries
+C
+C None.
+C
+C-&
+
+
+
+C$ Revisions
+C
+C
+C- Beta Version 1.0.1, 08-FEB-1989
+C
+C PRTPKG, though it performs no run-time function, must
+C still return a value, in order to comply with the Fortran
+C standard. So, now it does.
+C
+C- Beta Version 1.0.1, 08-FEB-1989
+C
+C Warnings added to discourage use of this routine.
+C Parameter declarations moved to "Declarations" section.
+C Two local declarations moved to the correct location.
+C-&
+
+
+
+C
+C SPICELIB functions
+C
+
+ LOGICAL SETPRT
+ LOGICAL MSGSEL
+
+C
+C Local variables:
+C
+ CHARACTER*(FILEN) DEVICE
+
+ CHARACTER*(10) LTYPE
+ CHARACTER*(10) LOCTYP
+
+C
+C Saved variables:
+C
+ LOGICAL SVSHRT
+ LOGICAL SVEXPL
+ LOGICAL SVLONG
+ LOGICAL SVTRAC
+ LOGICAL SVDFLT
+
+ SAVE SVSHRT
+ SAVE SVEXPL
+ SAVE SVLONG
+ SAVE SVTRAC
+ SAVE SVDFLT
+
+C
+C Initial values:
+C
+ DATA SVSHRT / .TRUE. /
+ DATA SVEXPL / .TRUE. /
+ DATA SVLONG / .TRUE. /
+ DATA SVTRAC / .TRUE. /
+ DATA SVDFLT / .TRUE. /
+
+C
+C Executable Code:
+C
+
+ CALL GETDEV ( DEVICE )
+
+ CALL WRLINE ( DEVICE,
+ . 'PRTPKG: You have called an entry point which' //
+ . ' has no run-time function; this may indicate' //
+ . ' a program bug. Please check the PRTPKG' //
+ . ' documentation. ' )
+
+ CALL WRLINE ( DEVICE, 'SPICE(BOGUSENTRY)' )
+
+ PRTPKG = .FALSE.
+
+ RETURN
+
+
+
+
+
+
+C$Procedure SETPRT ( Store Error Message Types to be Output )
+
+C ENTRY BOGUS (X, Y, Z)
+
+ ENTRY SETPRT ( SHORT, EXPL, LONG, TRACE, DFAULT )
+
+C$ Abstract
+C
+C Store (a representation of) the selection of types of error
+C messages to be output. DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C ERROR
+C
+C$ Keywords
+C
+C ERROR
+C
+C$ Declarations
+C
+C LOGICAL SHORT
+C LOGICAL EXPL
+C LOGICAL LONG
+C LOGICAL TRACE
+C LOGICAL DFAULT
+C
+C$ Brief_I/O
+C
+C VARIABLE I/O DESCRIPTION
+C -------- --- --------------------------------------------------
+C
+C SHORT I Select output of short error message?
+C EXPL I Select output of explanation of short message?
+C LONG I Select output of long error message?
+C TRACE I Select output of traceback?
+C DFAULT I Select output of default message?
+C
+C$ Detailed_Input
+C
+C SHORT indicates whether the short error message is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C short error message IS selected.
+C
+C EXPL indicates whether the explanatory text for the short
+C error message is selected as one of the error messages
+C to be output when an error is detected. A value of
+C .TRUE. indicates that the explanatory text for the
+C short error message IS selected.
+C
+C LONG indicates whether the long error message is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C long error message IS selected.
+C
+C TRACE indicates whether the traceback is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C traceback IS selected.
+C
+C DFAULT indicates whether the default message is selected
+C as one of the error messages to be output when an error
+C is detected. A value of .TRUE. indicates that the
+C default message IS selected.
+C
+C
+C$ Detailed_Output
+C
+C None.
+C
+C$ Parameters
+C
+C None.
+C
+C$ Exceptions
+C
+C None.
+C
+C$ Files
+C
+C None.
+C
+C$ Particulars
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C The effect of this routine is an ENVIRONMENTAL one. This
+C routine performs no output; it stores the error message
+C selection provided as input.
+C
+C Note that the actual output of error messages depends not
+C only on the selection made using this routine, but also
+C on the selection of the error output device (see ERRDEV)
+C and the choice of error response action (see ERRACT). If
+C the action is not 'IGNORE' (possible choices are
+C 'IGNORE', 'ABORT', 'DEFAULT', 'REPORT', and 'RETURN'),
+C the selected error messages will be written to the chosen
+C output device when an error is detected.
+C
+C$ Examples
+C
+C 1. In this example, the short and long messages are selected.
+C
+C C
+C C Select short and long error messages for output
+C C (We don't examine the status returned because no
+C C errors are detected by SETPRT):
+C C
+C
+C STATUS = SETPRT ( .TRUE., .FALSE., .TRUE., .FALSE.,
+C . .FALSE. )
+C
+C
+C
+C$ Restrictions
+C
+C DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C
+C-&
+
+C$ Index_Entries
+C
+C None.
+C
+C-&
+
+
+C$ Revisions
+C
+C-
+C Warnings added to discourage use of this routine in
+C non-error-handling code. Parameters section added.
+C
+C-&
+
+
+
+C
+C Executable Code:
+C
+
+
+ IF ( SHORT ) THEN
+ SVSHRT = .TRUE.
+ ELSE
+ SVSHRT = .FALSE.
+ END IF
+
+
+
+ IF ( EXPL ) THEN
+ SVEXPL = .TRUE.
+ ELSE
+ SVEXPL = .FALSE.
+ END IF
+
+
+
+ IF ( LONG ) THEN
+ SVLONG = .TRUE.
+ ELSE
+ SVLONG = .FALSE.
+ END IF
+
+
+
+ IF ( TRACE ) THEN
+ SVTRAC = .TRUE.
+ ELSE
+ SVTRAC = .FALSE.
+ END IF
+
+ IF ( DFAULT ) THEN
+ SVDFLT = .TRUE.
+ ELSE
+ SVDFLT = .FALSE.
+ END IF
+
+
+C
+C We assign a value to SETPRT, but this value is
+C not meaningful...
+C
+ SETPRT = .TRUE.
+
+
+ RETURN
+
+
+
+
+C$Procedure MSGSEL ( Is This Message Type Selected for Output? )
+
+ ENTRY MSGSEL ( TYPE )
+
+C$ Abstract
+C
+C Indicate whether the specified message type has been selected
+C for output.
+C
+C$ Required_Reading
+C
+C ERROR
+C
+C$ Keywords
+C
+C ERROR
+C
+C$ Declarations
+C
+C TYPE
+C
+C$ Brief_I/O
+C
+C VARIABLE I/O DESCRIPTION
+C -------- --- --------------------------------------------------
+C
+C TYPE I Type of message whose selection status is queried.
+C FILEN P Maximum length of a file name.
+C
+C The function takes the value .TRUE. if the message type indicated
+C by TYPE has been selected for output to the error output device.
+C
+C
+C$ Detailed_Input
+C
+C TYPE Refers to a type of error message. Possible values
+C are 'SHORT', 'EXPLAIN', 'LONG', 'DEFAULT',
+C and 'TRACEBACK'.
+C
+C$ Detailed_Output
+C
+C The function takes the value .TRUE. if the message type indicated
+C by TYPE has been selected for output to the error output device.
+C
+C$ Parameters
+C
+C FILEN is the maximum length of a file name.
+C
+C$ Exceptions
+C
+C Additionally, invalid values of TYPE are detected.
+C
+C The short error message set in this case is:
+C 'SPICE(INVALIDMSGTYPE)'
+C
+C The handling of this error is a special case; to avoid recursion
+C problems, SIGERR is not called when the error is detected.
+C Instead, the short and long error messages are output directly.
+C
+C
+C$ Files
+C
+C None.
+C
+C$ Particulars
+C
+C This routine is part of the SPICELIB error handling mechanism.
+C
+C Note that even though a given type of message may have been
+C selected for output, the output device and error response
+C action must also have been selected appropriately.
+C Use ERRDEV to choose the output device for error messages.
+C Use ERRACT to choose the error response action. Any action
+C other than 'IGNORE' will result in error messages being
+C written to the error output device when errors are detected.
+C See ERRACT for details.
+C
+C$ Examples
+C
+C
+C 1. We want to know if the short message has been selected
+C for output:
+C
+C C
+C C Test whether the short message has been selected:
+C C
+C
+C SELECT = MSGSEL ( 'SHORT' )
+C
+C
+C$ Restrictions
+C
+C None.
+C
+C$ Literature_References
+C
+C None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C
+C-&
+
+C$ Index_Entries
+C
+C None.
+C
+C-&
+
+
+C$ Revisions
+C
+C
+C Parameters section added; parameter declaration added
+C to brief I/O section as well.
+C
+C-&
+
+
+
+C
+C Executable Code:
+C
+
+ CALL LJUST ( TYPE, LTYPE )
+ CALL UCASE ( LTYPE, LTYPE )
+
+
+ IF ( LTYPE .EQ. 'SHORT' ) THEN
+
+ MSGSEL = SVSHRT
+
+ ELSE IF ( LTYPE .EQ. 'EXPLAIN' ) THEN
+
+ MSGSEL = SVEXPL
+
+ ELSE IF ( LTYPE .EQ. 'LONG' ) THEN
+
+ MSGSEL = SVLONG
+
+ ELSE IF ( LTYPE .EQ. 'TRACEBACK' ) THEN
+
+ MSGSEL = SVTRAC
+
+ ELSE IF ( LTYPE .EQ. 'DEFAULT' ) THEN
+
+ MSGSEL = SVDFLT
+
+ ELSE
+
+C
+C Bad value of type! We have a special case here; to
+C avoid recursion, we output the messages directly,
+C rather than call SIGERR.
+C
+
+ CALL GETDEV ( DEVICE )
+
+ CALL WRLINE ( DEVICE, 'SPICE(INVALIDMSGTYPE)' )
+
+ CALL WRLINE ( DEVICE, ' ' )
+
+ LOCTYP = TYPE
+
+C
+C Note: What looks like a typo below isn't; there's
+C a line break after the substring 'specified' of
+C the "word" 'specifiedwas'.
+C
+
+ CALL WRLINE ( DEVICE,
+
+ . 'MSGSEL: An invalid error message type was supplied as' //
+ . ' input; the type specifiedwas: ' // LOCTYP
+
+ . )
+
+
+ END IF
+
+ subroutine
+ & intensity1(efv,fv,svin,svquad,sfpv,maxp,value,jndex,k,kj,jmod,isup)
+
+ character*(*) function foo()
+
+ END
diff --git a/test/etags/forth-src/test-forth.fth b/test/etags/forth-src/test-forth.fth
new file mode 100644
index 00000000000..ce4069dfa8f
--- /dev/null
+++ b/test/etags/forth-src/test-forth.fth
@@ -0,0 +1,53 @@
+\
+\ This is a file that tests Forth tags
+\
+\ You should get:
+\ a-forth-word (twice)
+\ a-forth-constant!
+\ a-forth-value?
+\ :a-forth-dictionary-entry
+\ #a-defer-word
+\ (another-forth-word)
+\ (a-forth-constant
+\ #some-storage
+\ assemby-code-word
+
+
+\ This is a forth comment
+
+( Another forth comment )
+
+: a-forth-word ( a b c -- a*b+c ) + * ;
+
+99 constant a-forth-constant!
+55 value a-forth-value?
+create :a-forth-dictionary-entry
+0 c, 9 c, 5 c, 7 c, 999999 ,
+
+defer #a-defer-word
+
+: (another-forth-word) ( -- )
+ ." Hello world"
+;
+
+' (another-forth-word) to #a-defer-word
+
+struct
+ 9 field >field1
+ 5 field >field2
+constant (a-forth-constant
+
+
+2000 buffer: #some-storage
+
+code assemby-code-word ( dunno what it does )
+ g1 g2 mov \ Move from here to there
+ sc2 h# 13 sc2 sllx \ shift stuff 'round
+c;
+
+\ And for the heck of it, redefine a-forth-word.
+
+: a-forth-word ( a b c -- )
+ a-forth-word dup 200 > abort" Eek. The number is too big"
+ ." Result is " . cr
+;
diff --git a/test/etags/html-src/algrthms.html b/test/etags/html-src/algrthms.html
new file mode 100644
index 00000000000..322dafa5054
--- /dev/null
+++ b/test/etags/html-src/algrthms.html
@@ -0,0 +1,519 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Chip Fleming">
+ <meta name="GENERATOR" content="Mozilla/4.7 [en] (Win95; U) [Netscape]">
+ <title>Tutorial on Convolutional Coding with Viterbi Decoding--Description of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and Quantizing Algorithms</title>
+</head>
+<body>
+<a NAME="algorithms"></a><b><font face="Arial"><font size=+1>Description
+of the Algorithms&nbsp; (Part 1)</font></font></b>
+<p>&nbsp;The steps involved in simulating a communication channel using
+convolutional encoding and Viterbi decoding are as follows:
+<ul>
+<li>
+<a href="#genalgorithm">Generate the data</a> to be transmitted through
+the channel-result is binary data bits</li>
+
+<li>
+<a href="#conalgorithm">Convolutionally encode</a> the data-result is channel
+symbols</li>
+
+<li>
+<a href="#mapping">Map the one/zero channel symbols</a> onto an antipodal
+baseband signal, producing transmitted channel symbols</li>
+
+<li>
+<a href="#addnoise">Add noise</a> to the transmitted channel symbols-result
+is received channel symbols</li>
+
+<li>
+<a href="#quantizing">Quantize</a> the received channel levels-one bit
+quantization is called hard-decision, and two to n bit quantization is
+called soft-decision (n is usually three or four)</li>
+
+<li>
+<a href="algrthms2.html">Perform Viterbi decoding</a> on the quantized
+received channel symbols-result is again binary data bits</li>
+
+<li>
+Compare the decoded data bits to the transmitted data bits and count the
+number of errors.</li>
+</ul>
+<i>Many of you will notice that I left out the steps of modulating the
+channel symbols onto a transmitted carrier, and then demodulating the received
+carrier to recover the channel symbols. You're right, but we can accurately
+model the effects of AWGN even though we bypass those steps.</i>
+<p><a NAME="genalgorithm"></a><b><i><font face="Arial">Generating the Data</font></i></b>
+<p>Generating the data to be transmitted through the channel can be accomplished
+quite simply by using a random number generator. One that produces a uniform
+distribution of numbers on the interval 0 to a maximum value is provided
+in C: <tt>rand ()</tt>. Using this function, we can say that any value
+less than half of the maximum value is a zero; any value greater than or
+equal to half of the maximum value is a one.
+<p><a NAME="conalgorithm"></a><b><i><font face="Arial">Convolutionally
+Encoding the Data</font></i></b>
+<p>Convolutionally encoding the data is accomplished using a shift register
+and associated combinatorial logic that performs modulo-two addition. (A
+shift register is merely a chain of flip-flops wherein the output of the
+nth flip-flop is tied to the input of the (n+1)th flip-flop. Every time
+the active edge of the clock occurs, the input to the flip-flop is clocked
+through to the output, and thus the data are shifted over one stage.) The
+combinatorial logic is often in the form of cascaded exclusive-or gates.
+As a reminder, exclusive-or gates are two-input, one-output gates often
+represented by the logic symbol shown below,
+<center>
+<p><img SRC="figs/xor_gate.gif" ALT="exclusive-or gate symbol" height=64 width=93></center>
+
+<p>that implement the following truth-table:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLPADDING=7 WIDTH="218" >
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><b><tt>Input A</tt></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><b><tt>Input B</tt></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><b><tt>Output</tt></b>
+<p><b><tt>(A xor B)</tt></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>0</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>1</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>1</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>0</tt></center>
+</td>
+</tr>
+</table></center>
+
+<p>The exclusive-or gate performs modulo-two addition of its inputs. When
+you cascade q two-input exclusive-or gates, with the output of the first
+one feeding one of the inputs of the second one, the output of the second
+one feeding one of the inputs of the third one, etc., the output of the
+last one in the chain is the modulo-two sum of the q + 1 inputs.
+<p>Another way to illustrate the modulo-two adder, and the way that is
+most commonly used in textbooks, is as a circle with a + symbol inside,
+thus:
+<center>
+<p><img SRC="figs/ringsum.gif" ALT="modulo-two adder symbol" height=48 width=48></center>
+
+<p>Now that we have the two basic components of the convolutional encoder
+(flip-flops comprising the shift register and exclusive-or gates comprising
+the associated modulo-two adders) defined, let's look at a picture of a
+convolutional encoder for a rate 1/2, K = 3, m = 2 code:
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<center>
+<p><img SRC="figs/ce_7_5_a.gif" ALT="rate 1/2 K = 3 (7, 5) convolutional encoder" height=232 width=600></center>
+
+<p>In this encoder, data bits are provided at a rate of k bits per second.
+Channel symbols are output at a rate of n = 2k symbols per second. The
+input bit is stable during the encoder cycle. The encoder cycle starts
+when an input clock edge occurs. When the input clock edge occurs, the
+output of the left-hand flip-flop is clocked into the right-hand flip-flop,
+the previous input bit is clocked into the left-hand flip-flop, and a new
+input bit becomes available. Then the outputs of the upper and lower modulo-two
+adders become stable. The output selector (SEL A/B block) cycles through
+two states-in the first state, it selects and outputs the output of the
+upper modulo-two adder; in the second state, it selects and outputs the
+output of the lower modulo-two adder.
+<p>The encoder shown above encodes the K = 3, (7, 5) convolutional code.
+The octal numbers 7 and 5 represent the code generator polynomials, which
+when read in binary (111<sub>2</sub> and 101<sub>2</sub>) correspond to
+the shift register connections to the upper and lower modulo-two adders,
+respectively. This code has been determined to be the "best" code for rate
+1/2, K = 3. It is the code I will use for the remaining discussion and
+examples, for reasons that will become readily apparent when we get into
+the Viterbi decoder algorithm.
+<p>Let's look at an example input data stream, and the corresponding output
+data stream:
+<p>Let the input sequence be 010111001010001<sub>2</sub>.
+<p>Assume that the outputs of both of the flip-flops in the shift register
+are initially cleared, i.e. their outputs are zeroes. The first clock cycle
+makes the first input bit, a zero, available to the encoder. The flip-flop
+outputs are both zeroes. The inputs to the modulo-two adders are all zeroes,
+so the output of the encoder is 00<sub>2</sub>.
+<p>The second clock cycle makes the second input bit available to the encoder.
+The left-hand flip-flop clocks in the previous bit, which was a zero, and
+the right-hand flip-flop clocks in the zero output by the left-hand flip-flop.
+The inputs to the top modulo-two adder are 100<sub>2</sub>, so the output
+is a one. The inputs to the bottom modulo-two adder are 10<sub>2</sub>,
+so the output is also a one. So the encoder outputs 11<sub>2</sub> for
+the channel symbols.
+<p>The third clock cycle makes the third input bit, a zero, available to
+the encoder. The left-hand flip-flop clocks in the previous bit, which
+was a one, and the right-hand flip-flop clocks in the zero from two bit-times
+ago. The inputs to the top modulo-two adder are 010<sub>2</sub>, so the
+output is a one. The inputs to the bottom modulo-two adder are 00<sub>2</sub>,
+so the output is zero. So the encoder outputs 10<sub>2</sub> for the channel
+symbols.
+<p>And so on. The timing diagram shown below illustrates the process:
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<center>
+<p><img SRC="figs/ce_td.gif" ALT="timing diagram for rate 1/2 convolutional encoder" height=322 width=600></center>
+
+<p><br>
+<br>
+<br>
+<p>After all of the inputs have been presented to the encoder, the output
+sequence will be:
+<p>00 11 10 00 01 10 01 11 11 10 00 10 11 00 11<sub>2</sub>.
+<p>Notice that I have paired the encoder outputs-the first bit in each
+pair is the output of the upper modulo-two adder; the second bit in each
+pair is the output of the lower modulo-two adder.
+<p>You can see from the structure of the rate 1/2 K = 3 convolutional encoder
+and from the example given above that each input bit has an effect on three
+successive pairs of output symbols. That is an extremely important point
+and that is what gives the convolutional code its error-correcting power.
+The reason why will become evident when we get into the Viterbi decoder
+algorithm.
+<p>Now if we are only going to send the 15 data bits given above, in order
+for the last bit to affect three pairs of output symbols, we need to output
+two more pairs of symbols. This is accomplished in our example encoder
+by clocking the convolutional encoder flip-flops two ( = m) more times,
+while holding the input at zero. This is called "flushing" the encoder,
+and results in two more pairs of output symbols. The final binary output
+of the encoder is thus 00 11 10 00 01 10 01 11 11 10 00 10 11 00 11 10
+11<sub>2</sub>. If we don't perform the flushing operation, the last m
+bits of the message have less error-correction capability than the first
+through (m - 1)th bits had. This is a pretty important thing to remember
+if you're going to use this FEC technique in a burst-mode environment.
+So's the step of clearing the shift register at the beginning of each burst.
+The encoder must start in a known state and end in a known state for the
+decoder to be able to reconstruct the input data sequence properly.
+<p>Now, let's look at the encoder from another perspective. You can think
+of the encoder as a simple state machine. The example encoder has two bits
+of memory, so there are four possible states. Let's give the left-hand
+flip-flop a binary weight of 2<sup>1</sup>, and the right-hand flip-flop
+a binary weight of 2<sup>0</sup>. Initially, the encoder is in the all-zeroes
+state. If the first input bit is a zero, the encoder stays in the all zeroes
+state at the next clock edge. But if the input bit is a one, the encoder
+transitions to the 10<sub>2</sub> state at the next clock edge. Then, if
+the next input bit is zero, the encoder transitions to the 01<sub>2</sub>
+state, otherwise, it transitions to the 11<sub>2</sub> state. The following
+table gives the next state given the current state and the input, with
+the states given in binary:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
+<tr>
+<td VALIGN=TOP WIDTH="33%"><font face="Arial"><font size=-1>&nbsp;</font></font></td>
+
+<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
+<center><a NAME="statetable"></a><b><font face="Arial"><font size=-1>Next
+State, if&nbsp;</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Current State</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 0:</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 1:</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+</table></center>
+
+<br>&nbsp;
+<p>The above table is often called a state transition table. We'll refer
+to it as the <tt>next state</tt> table.<tt> </tt>Now let us look at a table
+that lists the channel output symbols, given the current state and the
+input data, which we'll refer to as the <tt>output</tt> table:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
+<tr>
+<td VALIGN=TOP WIDTH="33%"></td>
+
+<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
+<center><a NAME="outputtable"></a><b><font face="Arial"><font size=-1>Output
+Symbols, if</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Current State</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 0:</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 1:</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+</table></center>
+
+<br>&nbsp;
+<p>You should now see that with these two tables, you can completely describe
+the behavior of the example rate 1/2, K = 3 convolutional encoder. Note
+that both of these tables have 2<sup>(K - 1)</sup> rows, and 2<sup>k</sup>
+columns, where K is the constraint length and k is the number of bits input
+to the encoder for each cycle. These two tables will come in handy when
+we start discussing the Viterbi decoder algorithm.
+<p><a NAME="mapping"></a><b><i><font face="Arial">Mapping the Channel Symbols
+to Signal Levels</font></i></b>
+<p>Mapping the one/zero output of the convolutional encoder onto an antipodal
+baseband signaling scheme is simply a matter of translating zeroes to +1s
+and ones to -1s. This can be accomplished by performing the operation y
+= 1 - 2x on each convolutional encoder output symbol.
+<p><a NAME="addnoise"></a><b><i><font face="Arial">Adding Noise to the
+Transmitted Symbols</font></i></b>
+<p>Adding noise to the transmitted channel symbols produced by the convolutional
+encoder involves generating Gaussian random numbers, scaling the numbers
+according to the desired energy per symbol to noise density ratio, E<sub>s</sub>/N<sub>0</sub>,
+and adding the scaled Gaussian random numbers to the channel symbol values.
+<p>For the uncoded channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub>,
+since there is one channel symbol per bit.&nbsp; However, for the coded
+channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> + 10log<sub>10</sub>(k/n).&nbsp;
+For example, for rate 1/2 coding, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub>
++ 10log<sub>10</sub>(1/2) = E<sub>b</sub>/N<sub>0</sub> - 3.01 dB.&nbsp;
+Similarly, for rate 2/3 coding, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub>
++ 10log<sub>10</sub>(2/3) = E<sub>b</sub>/N<sub>0</sub> - 1.76 dB.
+<p>The Gaussian random number generator is the only interesting part of
+this task. C only provides a uniform random number generator, <tt>rand()</tt>.
+In order to obtain Gaussian random numbers, we take advantage of relationships
+between uniform, Rayleigh, and Gaussian distributions:
+<p>Given a uniform random variable U, a Rayleigh random variable R can
+be obtained by:
+<p><img SRC="figs/eqn01.gif" ALT="equation for Rayleigh random deviate given uniform random deviate" height=30 width=297 align=ABSCENTER>
+<p>where&nbsp;<img SRC="figs/eqn02.gif" height=24 width=24 align=ABSCENTER>is
+the variance of the Rayleigh random variable, and given R and a second
+uniform random variable V, two Gaussian random variables G and H can be
+obtained by
+<p><i>G</i> = <i>R</i> cos <i>U</i> and <i>H</i> = <i>R</i> sin <i>V</i>.
+<p>In the AWGN channel, the signal is corrupted by additive noise, n(t),
+which has the power spectrum <i>No</i>/2 watts/Hz. The variance&nbsp;<img SRC="figs/eqn02.gif" ALT="variance" height=24 width=24 align=ABSBOTTOM>of
+this noise is equal to&nbsp;<img SRC="figs/eqn03.gif" ALT="noise density div by two" height=22 width=38 align=TEXTTOP>.
+If we set the energy per symbol <i>E<sub>s</sub></i> equal to 1, then&nbsp;<img SRC="figs/eqn04.gif" ALT="equation relating variance to SNR" height=28 width=110 align=ABSBOTTOM>.
+So&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" height=28 width=139 align=ABSCENTER>.
+<p><a NAME="quantizing"></a><b><i><font face="Arial">Quantizing the Received
+Channel Symbols</font></i></b>
+<p>An ideal Viterbi decoder would work with infinite precision, or at least
+with floating-point numbers. In practical systems, we quantize the received
+channel symbols with one or a few bits of precision in order to reduce
+the complexity of the Viterbi decoder, not to mention the circuits that
+precede it. If the received channel symbols are quantized to one-bit precision
+(&lt; 0V = 1, <u>></u> 0V = 0), the result is called hard-decision data.
+If the received channel symbols are quantized with more than one bit of
+precision, the result is called soft-decision data. A Viterbi decoder with
+soft decision data inputs quantized to three or four bits of precision
+can perform about 2 dB better than one working with hard-decision inputs.
+The usual quantization precision is three bits. More bits provide little
+additional improvement.
+<p>The selection of the quantizing levels is an important design decision
+because it can have a significant effect on the performance of the link.
+The following is a very brief explanation of one way to set those levels.
+Let's assume our received signal levels in the absence of noise are -1V
+= 1, +1V = 0. With noise, our received signal has mean +/- 1 and standard
+deviation&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" height=28 width=139 align=ABSCENTER>.
+Let's use a uniform, three-bit quantizer having the input/output relationship
+shown in the figure below, where D is a decision level that we will calculate
+shortly:
+<center>
+<p><img SRC="figs/quantize.gif" ALT="8-level quantizer function plot" height=342 width=384></center>
+
+<p>The decision level, D, can be calculated according to the formula&nbsp;<img SRC="figs/eqn06.gif" ALT="equation for quantizer decision level" height=28 width=228 align=ABSCENTER>,
+where E<sub>s</sub>/N<sub>0</sub> is the energy per symbol to noise density
+ratio<i>. (The above figure was redrawn from Figure 2 of Advanced Hardware
+Architecture's ANRS07-0795, "Soft Decision Thresholds and Effects on Viterbi
+Performance". See the </i><a href="fecbiblio.html">bibliography</a><i>&nbsp;
+for a link to their web pages.)</i>
+<p>Click <a href="algrthms2.html">here</a> to proceed to the description
+of the Viterbi decoding algorithm itself...
+<p>Or click on one of the links below to go to the beginning of that section:
+<p>&nbsp;<a href="tutorial.html">Introduction</a>
+<br>&nbsp;<a href="algrthms2.html">Description of the Algorithms&nbsp;
+(Part 2)</a>
+<br>&nbsp;<a href="examples.html">Simulation Source Code Examples</a>
+<br>&nbsp;<a href="simrslts.html">Example Simulation Results</a>
+<br>&nbsp;<a href="fecbiblio.html">Bibliography</a>
+<br>&nbsp;<a href="tutorial.html#specapps">About Spectrum Applications...</a>
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<br>
+<center>
+<p><img SRC="figs/stripe.gif" height=6 width=600></center>
+
+</body>
+</html>
diff --git a/test/etags/html-src/index.shtml b/test/etags/html-src/index.shtml
new file mode 100644
index 00000000000..24f269f035f
--- /dev/null
+++ b/test/etags/html-src/index.shtml
@@ -0,0 +1,70 @@
+<!--#set var="chiavi" value="
+ prima pagina principale, home page, assoli,
+ free software, open source, italia, italy, italiano" -->
+<!--#include virtual="/inc/h.shtml"-->
+<!--#include virtual="/inc/menu-generico.html"-->
+<!--#include virtual="/inc/content-begin.html"-->
+
+<H3>&nbsp;</H3> <!-- un po' di spazio in cima -->
+
+<!--
+ La rubrica "in evidenza" va commentata se non c'è niente di serio
+ da mettere in evidenza
+ -->
+<H2>
+ In evidenza
+</H2>
+
+<ul>
+
+ <li>Assieme alla <A HREF="http://www.linux.it/">Italian Linux
+ Society</A> sollecitiamo una <A
+ HREF="/misc/raccoltafirme.shtml">raccolta di firme</A> per
+ sostenere il <a href="/altri/cortiana.shtml">disegno di legge</a> sul
+ software libero dal titolo "<i>Norme in materia di pluralismo
+ informatico sulla adozione e la diffusione del software libero e sulla
+ portabilità dei documenti informatici nella Pubblica
+ Amministrazione</i>" (XIV Legislatura Atto Senato n. 1188).<P>
+
+</ul>
+
+<H2>
+ Comunicati e iniziative
+</H2>
+
+<ul>
+
+ <p></p><li>
+ Combattiamo il "bollino SIAE". Nel <A HREF="/news/">notiziario</A>
+ tutte le nostre iniziative in proposito. Insieme al <a
+ href="http://www.lugroma.org">LUG Roma</a> abbiamo scritto il <A
+ HREF="/bollino/">Bollino-HOWTO</A>, istruzioni passo passo su come
+ ottenere l'esenzione dal bollilno SIAE per la distribuzione di
+ software libero a titolo oneroso o gratuito. <A
+ HREF="/altri/semenzato-pieroni.shtml">Qui</A> il disegno di legge
+ Semenzato Pieroni sul diritto d'autore. E non è finita.
+
+ <p></p><li>
+ <a href="/altri/adeos.shtml">Salutiamo</a> l'arrivo di ADEOS, kernel
+ real-time per Linux libero da brevetti
+
+ <p></p><li>
+ <a href="/news/news020315_01.shtml">Comunicato</a> stampa di FSF Europa
+ ed Assoli in appoggio al disegno di legge per l'uso del software libero
+ nella pubblica amministrazione
+
+ <p></p><li>
+ <a href="/docs/pirateria.shtml">Posizione dell'Associazione</a> sulle
+ attuali campagna anti-"pirateria"</a>
+
+</ul>
+
+<H2>
+ Ultime notizie dall'associazione
+</H2>
+<P>
+<!--#include virtual="/news/notizie.shtml"-->
+</P>
+
+<!--#include virtual="inc/content-end.html"-->
+<!--#include virtual="inc/f.shtml"-->
diff --git a/test/etags/html-src/software.html b/test/etags/html-src/software.html
new file mode 100644
index 00000000000..4d174c63b07
--- /dev/null
+++ b/test/etags/html-src/software.html
@@ -0,0 +1,241 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40">
+<HTML LANG="en">
+<HEAD>
+ <STYLE TYPE="text/css"><!--
+ BODY { font-size: 12pt; }
+ P { text-indent: 0; text-align: justify }
+ DD { text-indent: 0; text-align: justify }
+ --></STYLE>
+ <TITLE>Francesco Potortì Software Page</TITLE>
+ <LINK REV="made" HREF="mailto:F.Potorti@cnuce.cnr.it">
+ <META NAME="description" CONTENT="Home page of Francesco Potortì.">
+ <META NAME="keywords"
+ CONTENT="Potorti Potortì Potorti' Potorti`
+ satellites MTG fracas simulator LEO MEO GEO
+ GNU emacs etags checkiso debian-bug">
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+</HEAD><BODY>
+
+<CENTER>
+ [<A HREFLANG="en" HREF="/home.html">home</A>]
+ | [<A HREFLANG="en" HREF="/foda/foda.html">FODA/IBEA</A>]
+ | [<A HREFLANG="en" HREF="/galileo/index.html">GaliLEO</A>]
+ | [<A HREFLANG="en" HREF="#fracas">fracas</A>]
+ | [<A HREFLANG="en" HREF="#leasqr">leasqr</A>]<BR>
+ [<A HREFLANG="en" HREF="#etags">etags</A>]
+ | [<A HREFLANG="en" HREF="#checkiso">checkiso</A>]
+ | [<A HREFLANG="en" HREF="#cgrep">cgrep</A>]
+ | [<A HREFLANG="en" HREF="#debian-bug">debian-bug</A>]
+</CENTER>
+
+<HR> <!---------------------------------------------------------------->
+
+<H4 ID="simulation">
+ <IMG SRC="/pictures/cnr-4.png" ALIGN="right"
+ ALT="CNR logo (png 3k)">
+ Software that I wrote for supporting my research activity
+</H4>
+
+
+<H5 ID="mtg">
+ MTG
+</H5>
+
+<P> The <A
+ HREF="/curriculum/pot-abstracts.html#R05:MTG-RealTimeSystems97"><CITE>M</CITE>ulti-Application
+ <cite>t</CITE>raffic <cite>g</CITE>enerator</A> was written in 1990 to run on
+ a proprietary Motorola Delta SysV Unix running on 68030. It is a
+ programmable packet traffic generator for Ethernet with a
+ <CITE>curses</CITE>-based frontend and a backend that I wrote. MTG was
+ used to develop, test and evaluate the <A HREF="/foda/foda.html">FODA/IBEA</A>
+ satellite access protocol.
+
+<P> The backend of MTG
+ was a Unix device driver which took control of the timer and Lance
+ interrupts, after having programmed them at the unmaskable level. Since I
+ had no access to the kernel sources, after having studied <CITE>Writing a
+ Unix device driver</CITE> by Egan Teixeira I had to get really well
+ acquainted with the Motorola C compiler and then to disassemble a couple of
+ kernel routines. For anyone interested in historical programming, <A
+ HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/mtg.tgz"
+ TYPE="application/octet-stream">here</A> is the code.
+
+
+<H5 ID="fracas">
+ Fracas
+</H5>
+
+<P> The <A
+ HREF="/curriculum/pot-abstracts.html#R12:Fracas-TelCommSystems99"><CITE>Fra</CITE>med
+ <CITE>C</CITE>hannel <CITE>A</CITE>ccess <CITE>S</CITE>imulator</A> was
+ written around 1995 to study MAC protocols to access a geostationary
+ satellite channel. It is a little more general than that, though, and can
+ be used to simulate any framed multiple access scheme. It is a very fast,
+ extensible, non-user friendly C program that has been used for several
+ protocol studies:
+ <UL>
+ <LI> <A HREF="/curriculum/pot-abstracts.html#R03:FODAIBEAvsDistributed-IJSC96">
+ <i>Comparison between distributed and centralised demand
+ assignment TDMA satellite access schemes</i></A>
+
+ <LI><A HREF="/curriculum/pot-abstracts.html#R07:FODAIBEAvsCFRA-IJSC97">
+ <i>Delay analysis for interlan traffic using two suitable TDMA
+ satellite access schemes</i></A>
+
+ <LI><A HREF="/curriculum/pot-abstracts.html#R17:VnL-IJSC00">
+ <i>A multi-level satellite channel allocation algorithm for
+ real-time VBR data</i></A>
+ </UL>
+
+<P> Everyone is welcome to download the <A
+ HREF="ftp://fly.cnuce.cnr.it/pub/software/C/fracas.tgz"
+ TYPE="application/octet-stream">complete sources</A> and a <A
+ HREF="ftp://fly.cnuce.cnr.it/pub/software/C/fracas-man-0.0.pdf"
+ TYPE="application/pdf">draft manual</A>. There is also a short <A
+ HREF="ftp://fly.cnuce.cnr.it/pub/data/docs/Fracas-slides.pdf">presentation</A>
+ (10 slides, 340KB). I will be happy to assist those who would like to
+ adapt Fracas to their purposes.
+
+
+<H5 ID="galileo">
+ GaliLEO
+</H5>
+
+<P> A simulator for Low Earth Orbit satellite constellations that I contributed
+ to design and implement in Java. This is work in progress, of which I made
+ a short <A
+ HREF="ftp://fly.cnuce.cnr.it/pub/data/docs/GaliLEO-slides.pdf">presentation</A>
+ (10 slides, 500KB). GaliLEO has <A HREF="http://galileo.tesa.prd.fr/">its
+ own page</A> and a <A HREF="/galileo/index.html">local mirror</A>.
+
+
+
+<H5 ID="leasqr">
+ Leasqr
+</H5>
+
+<P> This is a package for <A HREF="http://www.octave.org/">Octave</A>, a
+high-level language which uses a language very similar to that of Matlab.
+Leasqr uses the Levenberg-Marquardt algorithm for doing nonlinear regression.
+I found leasqr on the web, but it did not run on Octave (it was made for
+Matlab) and so I adapted it and <A
+HREF="ftp://fly.cnuce.cnr.it/pub/software/octave/leasqr/">published</A> it.
+Since then, the original authors Richard I. Shrager, A.Jutan, Ray Muzic, and
+Sean Brennan agreed to put it under the <A
+HREF="http://www.gnu.org/licenses/gpl.html">GPL</A>. Matthias Jueschke tested
+the program using a non-linear optimisation <A
+HREF="http://www.itl.nist.gov/div898/strd/nls/nls_main.shtml">test suite</A>,
+and was satisfied with the results.
+
+<P>The most current version of the leasqr is part of the optimization package
+at <a href="http://octave.sf.net">octave-forge</a>. You should refer to the
+files leasqr.m, leasqrdemo.m and dfdp.m <a
+href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/octave/octave-forge/main/optim/">therein</a>.
+The names of the individual files may change in the future. Please let me know
+if that happens so I can update this page.
+
+<HR> <!---------------------------------------------------------------->
+
+<H4 ID="gnu">
+ <IMG SRC="/pictures/gnu-head-3.png" ALIGN="right"
+ ALT="small GNU Head (png 3k)">
+ Free software that I wrote for the GNU project or for my personal or work
+ interest
+</H4>
+
+
+<H5 ID="etags">
+ Etags
+</H5>
+
+<P> On behalf of the <A HREF="http://www.gnu.org/fsf/fsf.html">Free
+ Software Foundation (FSF)</A> I currently volunteer to maintain
+ <CITE>etags</CITE>, a program that can be compiled either as a replacement
+ of the classic <CITE>ctags</CITE> Unix program or as <CITE>etags</CITE>,
+ whose output file format is used by Emacs. The latest (unofficial) version
+ of etags is available for <A HREF="ftp://fly.cnuce.cnr.it/pub/etags.c.gz"
+ TYPE="application/octet-stream">download</A> (30&nbsp;KB).
+
+
+<H5 ID="checkiso">
+ checkiso
+</H5>
+
+<P> A Unix <A HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/checkiso"
+ TYPE="application/octet-stream">shell script</A> for checking a CD against
+ the iso image from which it has been burned. The comparison is made using
+ an MD5 signature built from the original image or from a known good CD.
+ Shows the location of the first read error detected. Can extract a disk Id
+ from the image or the CD itself and build a local database of Ids for
+ future checking of archived CDs. The Id contains the image length, the MD5
+ signature and the Volume ID of the disk, so it can automatically recognise
+ the CD to check. Contains a small internal database of <A
+ HREF="http://www.debian.org/">Debian</A> <A
+ HREF="http://cdimage.debian.org/">CD images</A>.
+
+
+<H5 ID="cgrep">
+ cgrep
+</H5>
+
+<P> A Unix <A HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/cgrep"
+ TYPE="application/octet-stream">shell script</A> that wraps around grep to
+ make it understand files compressed with gzip or bzip2. You just use it
+ like grep. If you rename it cegrep or cfgrep it will wrap around egrep or
+ fgrep, respectively. Instead of renaming it, you can use a symbolic or
+ hard link.
+
+
+<H5 ID="debian-bug">
+ debian-bug.el
+</H5>
+
+<P> An Emacs add-on script in emacs lisp which simplifies
+ the task of submitting a bug report to the <A
+ HREF="http://www.debian.org/Bugs/">Debian bug tracking system</A>. Part of
+ the <A
+ HREF="http://packages.debian.org/testing/utils/debbugs-el.html">debbugs-el</A>
+ Debian package. I handed the package over to Peter Galbraith, who is
+ maintaining it much more actively than I was. You can download its <A
+ HREF="http://people.debian.org/~psg/debian-bug.el"
+ TYPE="application/octet-stream">latest version</A>.
+
+
+<H5 ID="tcpdump">
+ tcpdump
+</H5>
+
+<P> A Unix <A HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/pottcpdump-1.3"
+ TYPE="application/octet-stream">shell wrapper</A> around
+ <CITE>tcpdump</CITE> which optionally displays the contents of the packets.
+
+
+<HR> <!---------------------------------------------------------------->
+
+<H4 ID="links">
+ Links to interesting software
+</H4>
+
+
+<DL>
+ <DT>The Error Correcting Codes (ECC) Page
+ <DD><A
+ HREF="http://www.csl.sony.co.jp/person/morelos/ecc/codes.html">This</A> is a
+ really good list of free (in various senses) programs for coding and
+ decoding. I keep a <A HREF="codes.html">mirror</A> of this page.
+
+ <DT>Forward error correcting codes by Phil Karn
+ <DD>Phil Karn's optimised really <A HREF="http://www.ka9q.net/code/fec/">free
+ codes</A>.
+
+</DL>
+
+</BODY>
+
+<!--
+Local variables:
+fill-column: 79
+end:
+-->
+
+</HTML>
diff --git a/test/etags/html-src/softwarelibero.html b/test/etags/html-src/softwarelibero.html
new file mode 100644
index 00000000000..7aa74c55bd0
--- /dev/null
+++ b/test/etags/html-src/softwarelibero.html
@@ -0,0 +1,313 @@
+<DIV LANG="it" ALIGN="justify">
+
+<H2>
+ Cos'è il software libero?
+</H2>
+
+<P>
+ Il concetto di software libero discende naturalmente da quello di
+ libertà di scambio di idee e di informazioni. Negli ambienti
+ scientifici, quest'ultimo principio è tenuto in alta considerazione
+ per la fecondità che ha dimostrato; ad esso infatti è generalmente
+ attribuita molta parte dell'eccezionale ed imprevedibile crescita del
+ sapere negli ultimi tre secoli.
+</P>
+<P>
+ La libertà di scambio di idee non è tuttavia una questione puramente
+ pratica: essa è anche alla base dei concetti di libertà di pensiero e
+ di espressione. Analogamente alle idee, il software è immateriale, e
+ può essere riprodotto e trasmesso facilmente. In modo simile a quanto
+ avviene per le idee, parte essenziale del processo che sostiene la
+ crescita e l'evoluzione del software è la sua libera diffusione. Ed
+ ogni giorno di più, come le idee, il software permea il tessuto
+ sociale e lo influenza, produce effetti etici, economici, politici e
+ in un senso più generale culturali.
+</P>
+<P>
+ Fu Richard M. Stallman, nei primi anni Ottanta, a formalizzare per la
+ prima volta il concetto di software libero. La <A TITLE="definizione
+ di software libero secondo FSF"
+ href="http://www.it.gnu.org/philosophy/free-sw.it.html">definizione</A>
+ di Stallman, che da subito assurse al ruolo di definizione per
+ eccellenza di software libero, assume la forma di quattro principi di
+ libertà:
+</P>
+<P>
+<DL>
+ <DT>Libertà 0, o libertà fondamentale:
+ <DD>La libertà di eseguire il programma per qualunque scopo, senza
+ vincoli sul suo utilizzo.
+
+ <DT>Libertà 1:
+ <DD>La libertà di studiare il funzionamento del programma, e
+ di adattarlo alle proprie esigenze.
+
+ <DT>Libertà 2:
+ <DD>La libertà di redistribuire copie del programma.
+
+ <DT>Libertà 3:
+ <DD>La libertà di migliorare il programma, e di distribuirne
+ i miglioramenti.
+</DL>
+</P>
+<P>
+ Il software distribuito con una licenza che rispetti questi principi è
+ detto <Q><EM>software libero</EM></Q> (in inglese <Q><EM>free
+ software</EM></Q>). Nel 1984 Richard M. Stallman <A TITLE="storia
+ del progetto GNU"
+ HREF="http://www.it.gnu.org/gnu/thegnuproject.it.html">diede vita al
+ progetto GNU</A>, con lo scopo di tradurre in pratica il concetto di
+ software libero, e creò la <Q>Free Software Foundation</Q> per
+ dare supporto logistico, legale ed economico al progetto GNU.
+</P>
+
+<H3><A NAME="licenze">
+ Licenze d'uso di un programma
+</A></H3>
+
+<P>
+ La <EM>licenza d'uso</EM> è un documento legale generalmente
+ distribuito assieme a ogni programma. Essa, appoggiandosi alle norme
+ sul diritto d'autore, specifica diritti e doveri di chi riceve tale
+ programma.
+</P>
+<P>
+ Gran parte delle licenze comunemente usate sono <EM>proprietarie</EM>,
+ cioè non libere, in quanto non garantiscono le quattro libertà. Quasi
+ sempre tali licenze non consentono infatti la libera copia del
+ programma, né la sua modifica. Spesso, se il programma è installato
+ sul computer di casa, la licenza impedisce persino di installarlo sul
+ proprio portatile (per utilizzare il programma fuori casa); se il
+ programma è utilizzato in uno studio professionale, non consente di
+ tenerlo installato su un computer di riserva, nel caso che quello
+ principale si guasti.
+</P>
+<P>
+ La licenza del progetto GNU, la <EM>Licenza Pubblica Generica GNU (<A
+ TITLE="traduzione della licenza GNU GPL"
+ HREF="http://softwarelibero.it/gnudoc/gpl.it.txt">GNU GPL</A>)</EM>,
+ al contrario, concede all'utente del programma tutte e quattro le
+ libertà suddette. Inoltre si occupa anche di proteggerle: chi
+ modifichi un programma protetto da GPL e lo distribuisca con tali
+ modifiche, deve distribuirlo sotto licenza GPL. È grazie a questo
+ tipo di protezione che la GPL è attualmente la licenza più usata per
+ il software libero.
+</P>
+<P>
+ Con un gioco di parole, il nome dato a questo tipo di protezione
+ è <EM>permesso d'autore</EM> (in inglese <A TITLE="definizione di
+ copyleft (inglese)" LANG="en"
+ HREF="http://www.it.gnu.org/copyleft/copyleft.html"><EM>copyleft</EM></A>):
+ è il criterio che prevede che le modifiche ad un programma possano
+ essere distribuite solo con la stessa licenza del programma originale.
+ Le licenze proprietarie usano le norme sul diritto d'autore (copyright
+ in inglese) per togliere libertà agli utenti di un programma; il
+ permesso d'autore usa le stesse norme per garantire quelle libertà e
+ per proteggerle.
+</P>
+<P>
+ La GNU GPL non è unica nel suo genere. Diverse <A TITLE="lista di
+ licenze libere e non"
+ HREF="http://www.it.gnu.org/licenses/license-list.it.html">altre
+ licenze</A> garantiscono le quattro libertà e si possono pertanto
+ qualificare come licenze per il software libero. Fra queste, merita
+ una speciale menzione per la sua diffusione la <A TITLE="la licenza
+ BSD (in inglese)" LANG="en"
+ HREF="http://www.freebsd.org/copyright/license.html">licenza BSD</A>,
+ la cui principale differenza dalla GPL è che, non essendo basata sul
+ permesso d'autore, non ha fra i propri obiettivi quello di proteggere
+ la libertà del software cui è applicata. Chi infatti modifichi un
+ programma protetto da BSD, può distribuirlo con le modifiche usando
+ qualunque licenza.
+</P>
+<P>
+ Sia BSD che GPL hanno pro e contro. La licenza GPL riflette l'idea
+ della cooperazione: se io concedo ad altri la libertà di modificare e
+ redistribuire il mio programma, costoro sono tenuti a concedere le
+ stesse libertà sulle loro modifiche. Il problema è che alcuni vedono
+ questo vincolo come un'imposizione ingenerosa, se non addirittura una
+ restrizione insopportabile. La licenza BSD riflette l'idea del dono
+ liberale: chiunque può fare ciò che meglio crede del mio programma.
+ Il problema è che questo significa che chiunque può redistribuire
+ anche in forma chiusa con una licenza proprietaria un programma BSD
+ modificato, impedendo così ai propri acquirenti di modificarlo e
+ redistribuirlo a loro volta.
+</P>
+
+<H3><A NAME="miti">
+ Sfatiamo alcuni miti
+</A></H3>
+
+<P>
+<DL>
+
+ <DT>Il software libero è gratuito
+
+ <DD>È falso: la libertà del software non ha nulla a che vedere con
+ il suo prezzo. Benché gran parte del software libero più diffuso
+ sia distribuito gratuitamente, ci sono programmatori che vivono
+ della vendita e della manutenzione dei programmi liberi da loro
+ creati.
+
+ <DT>Il software gratuito è libero
+
+ <DD>È falso. Molti programmi proprietari vengono distribuiti
+ gratuitamente.
+
+ <DT>Il software libero è privo di copyright
+
+ <DD>È falso. Benché si possa rinunciare al copyright su un proprio
+ programma e renderlo così di pubblico dominio, la gran parte del
+ software libero è distribuito con una licenza. Per esempio, sono
+ licenze di copyright la licenza BSD e la GNU GPL, anche se per
+ qualificare quest'ultima spesso si parla di permesso d'autore
+ (copyleft).
+
+ <DT>L'introduzione del software libero nella scuola e nella pubblica
+ amministrazione, ma anche nei paesi poveri, ridurrebbe i costi
+ relativi al software
+
+ <DD>Potrebbe essere vero, ma una seria valutazione dei costi è molto
+ difficile. Qualunque tipo di software, se usato in ambito non
+ domestico, ha dei costi di manutenzione che sono solitamente
+ maggiori del suo prezzo di acquisto. I motivi per sostenere l'uso
+ del software libero, specie in ambiti pubblici, riguardano anzitutto
+ la libertà, non il prezzo.
+
+<!-- Discorso inadatto ad un documento introduttivo
+ <DT>Chi scrive un programma libero lo deve pubblicare su Internet
+
+ <DD>È una falsa argomentazione spesso usata per scoraggiare
+ un'azienda dall'uso di una licenza libera per i suoi programmi.
+ Sia gli autori che gli acquirenti di un programma libero hanno il
+ diritto di distribuirlo a titolo oneroso o gratuito, ma non hanno
+ alcun obbligo in tal senso.
+-->
+
+</DL>
+</P>
+
+<H3><A NAME="oss">
+ Il movimento open source
+</A></H3>
+
+<P>
+ Nel 1998 Bruce Perens, Eric Raymond e altre personalità nel campo del
+ software libero si convinsero che i principi di libertà associati ad
+ esso fossero malvisti nel mondo degli affari, a causa della loro
+ carica ideologica. Decisero perciò di evitare accuratamente ogni
+ riferimento a considerazioni politiche o di principio, e di lanciare
+ una campagna di promozione del software libero che ne mettesse in luce
+ i numerosi <A TITLE="un discorso di Robert Chassell di FSF"
+ HREF="http://softwarelibero.it/altri/economia-sl.shtml">vantaggi
+ pratici</A>, come la facilità di adattamento, l'affidabilità, la
+ sicurezza, la conformità agli standard, l'indipendenza dai singoli
+ fornitori. A tal fine scrissero la <Q><A TITLE="la definizione di
+ Open Source (in inglese)" LANG="en"
+ HREF="http://www.opensource.org/docs/definition.html">Open Source
+ Definition</A></Q>, il documento fondamentale del movimento <A
+ TITLE="il sito di Open Source Initiative (OSI), in inglese" LANG="en"
+ HREF="http://opensource.org/"><EM>open source</EM></A>.
+</P>
+<P>
+ Il movimento open source fu un successo, e contribuì a sdoganare il
+ concetto di software libero in campo aziendale, dove era guardato con
+ sospetto o condiscendenza. Un esempio di questo successo è
+ l'atteggiamento dell'IBM, l'azienda che ha fatto di gran lunga i
+ maggiori investimenti nel campo del software libero, la quale parla
+ esclusivamente di open source, mai di software libero.
+</P>
+<P>
+ La voluta neutralità del movimento open source verso gli aspetti
+ etici e politici del software libero è la caratteristica sostanziale
+ che lo distingue dalla filosofia del software libero, che al contrario
+ pone l'accento sulle motivazioni ideali. Parlare di software libero
+ piuttosto che di open source è una questione politica piuttosto che
+ pratica; i due movimenti concordano infatti sulle licenze considerate
+ accettabili, ed hanno obiettivi e mezzi comuni.
+</P>
+
+<H3><A NAME="impatto">
+ Impatto pratico del software libero
+</A></H3>
+
+<P>
+ La <A TITLE="usi commerciali del software libero, di Alessandro
+ Rubini"
+ HREF="http://www.it.gnu.org/philosophy/software-libre-commercial-viability.it.html">rilevanza
+ economica</A> del software libero è ancora molto ridotta, ma è in
+ fortissima crescita ormai da alcuni anni, e tutto consente di supporre
+ che tale crescita <A TITLE="prospettive del software libero, gruppo di
+ studio dell'UE"
+ HREF="http://eu.conecta.it/paper/Economics_open_source.html">continui
+ nel prossimo futuro</A>, anche grazie ai <A TITLE="vantaggi del
+ software libero, gruppo di studio UE"
+ HREF="http://eu.conecta.it/paper/Advantages_open_source_soft.html">vantaggi
+ tecnici ed economici</A> del software libero.
+</P>
+<P>
+ Ad oggi, il software libero è ampiamente diffuso in ambito accademico,
+ industriale e fra gli appassionati di calcolatori, soprattutto grazie
+ ai sistemi GNU/Linux. Questi sistemi liberi sono disponibili a costi
+ molto bassi, ben inferiori a quelli di analoghi sistemi proprietari.
+ Tuttavia, a causa delle loro caratteristiche, il loro uso richiede una
+ buona cultura di base nel campo del software.
+</P>
+<P>
+ In ambito accademico viene molto apprezzata la possibilità di
+ personalizzare ogni parte del sistema, visto che i programmi liberi
+ sono liberamente modificabili (libertà numero uno). In ambito
+ industriale, si apprezza l'affidabilità dei sistemi liberi, dovuta al
+ fatto che quando un utente corregge un errore in un programma
+ solitamente rende disponibile la correzione agli altri utenti (libertà
+ numero tre). Gli appassionati di calcolatori apprezzano lo spirito di
+ condivisione esistente fra gli utenti di software libero.
+</P>
+<P>
+ Ma le implicazioni dell'uso del software libero non sono soltanto
+ tecniche ed economiche, perché il software da tempo ormai è avviato ad
+ occupare un ruolo di primo piano nella nostra vita quotidiana, ed è
+ destinato a cambiare in maniera profonda la società.
+</P>
+<P>
+ È per queste ragioni che la nostra libertà futura dipenderà anche
+ dalla capacità di ognuno di noi di controllare il software. È per
+ queste ragioni che ai tradizionali principi di libertà sessuale, di
+ culto, di movimento, di espressione deve essere affiancata la libertà
+ del software. È per queste ragioni che la nostra libertà futura
+ dipenderà anche dall'uso di software libero.
+</P>
+
+<P>
+ <EM>scritto da <A TITLE="pot@softwarelibero.it"
+ HREF="mailto:pot@softwarelibero.it">Francesco Potortì</A> per l'<A
+ TITLE="il sito dell'Associazione Software Libero"
+ HREF="http://softwarelibero.it/">Associazione Software
+ Libero</A></EM>
+</P>
+<HR NOSHADE>
+<P>
+ Copyright &copy; 2002 Francesco Potortì
+ <BR>
+ Ultima versione ipertestuale disponibile su <A TITLE="versione
+ stampabile"
+ HREF="http://softwarelibero.it/documentazione/softwarelibero.html">&lt;http://softwarelibero.it/documentazione/softwarelibero.html></A>
+</P>
+<P>
+ La copia letterale e integrale e la distribuzione sono permesse con
+ qualsiasi mezzo, a condizione che questa nota sia riprodotta.
+</P>
+
+<!--
+Local variables:
+fill-column: 72
+time-stamp-active: t
+time-stamp-time-zone: "GMT"
+time-stamp-format: "%:y-%02m-%02d"
+time-stamp-line-limit: 30
+time-stamp-start: "ultima\\s-+modifica\\s-+è\\s-+del\\s-+"
+time-stamp-end: "\\."
+End:
+-->
+
+</DIV>
diff --git a/test/etags/lua-src/allegro.lua b/test/etags/lua-src/allegro.lua
new file mode 100644
index 00000000000..c316b6f26a0
--- /dev/null
+++ b/test/etags/lua-src/allegro.lua
@@ -0,0 +1,282 @@
+-- ase -- allegro-sprite-editor: the ultimate sprites factory
+-- Copyright (C) 2001-2004 by David A. Capello
+--
+-- Read "LEGAL.txt" for more information.
+
+-- internal routine
+local function get_layer_by_name (sprite, layer, name)
+ if layer.readable == false then
+ return nil;
+ end
+
+ if layer.name and strcmp (layer.name, name) == 0 then
+ return layer;
+ end
+
+ if layer_is_set (layer) then
+ local it, sub;
+
+ it = layer.layers;
+ while it do
+ sub = get_layer_by_name (sprite, it, name)
+ if sub then
+ return sub;
+ end
+ it = it.next
+ end
+ end
+
+ return nil;
+end
+
+-- internal routine
+local function count_layers (layer)
+ local count;
+
+ if layer.parent.type == GFXOBJ_SPRITE then
+ count = 0;
+ else
+ count = 1;
+ end
+
+ if layer_is_set (layer) then
+ local it = layer.layers;
+ while it do
+ count = count + count_layers (it);
+ it = it.next;
+ end
+ end
+
+ return count;
+end
+
+-- Layer *GetLayerByName (const char *name);
+function GetLayerByName (name)
+ local sprite = current_sprite;
+
+ if sprite and name then
+ return get_layer_by_name (sprite, sprite.set, name);
+ else
+ return nil;
+ end
+end
+
+-- const char *GetUniqueLayerName (void);
+function GetUniqueLayerName ()
+ local sprite = current_sprite;
+
+ if sprite then
+ return _("Layer") .. " " .. count_layers (sprite.set);
+ else
+ return nil;
+ end
+end
+
+-- void SelectLayer (Layer *layer);
+function SelectLayer (layer)
+ if current_sprite then
+ sprite_set_layer (current_sprite, layer);
+ end
+end
+
+-- Layer *NewLayer (const char *name, int x, int y, int w, int h);
+-- creates a new layer with the "name" in the current sprite (in the
+-- current frame) with the specified position and size (if w=h=0 the
+-- routine will use the sprite dimension)
+function NewLayer (name, x, y, w, h)
+ local sprite = current_sprite;
+ local layer = nil;
+ local image, frame, index;
+
+ if sprite and name then
+ if not w or w == 0 then w = sprite.w; end
+ if not h or h == 0 then h = sprite.h; end
+
+ -- new image
+ image = image_new (sprite.imgtype, w, h);
+ if not image then
+ return nil;
+ end
+
+ -- new layer
+ layer = layer_image_new (sprite.imgtype, w, h);
+ if not layer then
+ image_free (image);
+ return nil;
+ end
+
+ -- clear with mask color
+ image_clear (image, 0);
+
+ -- configure layer name and blend mode
+ layer_set_name (layer, name);
+ layer_set_blend_mode (layer, BLEND_MODE_NORMAL);
+
+ -- add image in the layer stock
+ index = stock_add_image (layer.stock, image);
+
+ -- create frame (XXX in the current frpos? --dacap)
+ frame = frame_new (sprite.frpos, index, x, y, 255);
+
+ -- add frame
+ layer_add_frame (layer, frame);
+
+ -- undo stuff
+ if undo_is_enabled (sprite.undo) then
+ undo_open (sprite.undo);
+ undo_add_layer (sprite.undo, sprite.set, layer);
+ undo_set_layer (sprite.undo, sprite);
+ undo_close (sprite.undo);
+ end
+
+ -- add the layer in the sprite set
+ layer_add_layer (sprite.set, layer);
+
+ -- select the new layer
+ sprite_set_layer (sprite, layer);
+ end
+
+ return layer;
+end
+
+-- Layer *NewLayerSet (const char *name);
+-- creates a new layer set with the "name" in the current sprite
+function NewLayerSet (name)
+ local sprite = current_sprite;
+ local layer = nil;
+
+ if sprite and name then
+ -- new layer
+ layer = layer_set_new ();
+ if not layer then
+ return nil;
+ end
+
+ -- configure layer name and blend mode
+ layer_set_name (layer, name);
+
+ -- add the layer in the sprite set
+ layer_add_layer (sprite.set, layer);
+
+ -- select the new layer
+ sprite_set_layer (sprite, layer);
+ end
+
+ return layer;
+end
+
+-- void RemoveLayer (void);
+-- removes the current selected layer
+function RemoveLayer ()
+ local sprite = current_sprite;
+
+ if sprite and sprite.layer then
+ local layer = sprite.layer;
+ local parent = layer.parent;
+ local layer_select;
+
+ -- select: previous layer, or next layer, or parent (if it is not
+ -- the main layer of sprite set)
+ if layer.prev then
+ layer_select = layer.prev;
+ elseif layer.next then
+ layer_select = layer.next;
+ elseif parent != sprite.set then
+ layer_select = parent;
+ else
+ layer_select = nil;
+ end
+
+ -- undo stuff
+ if undo_is_enabled (sprite.undo) then
+ undo_open (sprite.undo);
+ undo_set_layer (sprite.undo, sprite);
+ undo_remove_layer (sprite.undo, layer);
+ undo_close (sprite.undo);
+ end
+
+ -- select other layer
+ sprite_set_layer (sprite, layer_select);
+
+ -- remove the layer
+ layer_remove_layer (parent, layer);
+
+ -- destroy the layer
+ layer_free (layer);
+ end
+end
+
+-- void MoveLayerTop (void);
+-- moves the current layer in the top of the main set
+function MoveLayerTop ()
+ if current_sprite and current_sprite.layer then
+ local layer = current_sprite.layer;
+
+ layer_remove_layer (layer.parent, layer);
+
+ layer_add_layer (current_sprite.set, layer);
+ end
+end
+
+-- void MoveLayerBottom (void);
+-- moves the current layer in the bottom of the main set
+function MoveLayerBottom ()
+ if current_sprite and current_sprite.layer then
+ local layer = current_sprite.layer;
+
+ layer_remove_layer (layer.parent, layer);
+
+ layer_add_layer (current_sprite.set, layer);
+ layer_move_layer (current_sprite.set, layer, nil);
+ end
+end
+
+-- void MoveLayerBefore (Layer *this_one);
+-- moves the current layer above the layer "this_one"
+function MoveLayerBefore (this_one)
+ if current_sprite and current_sprite.layer then
+ local layer = current_sprite.layer;
+ local layer_dest;
+
+ if not this_one then
+ layer_dest = current_sprite.set;
+ else
+ layer_dest = this_one;
+ end
+
+ if layer_dest then
+ layer_remove_layer (layer.parent, layer);
+ layer_add_layer (layer_dest.parent, layer);
+ layer_move_layer (layer_dest.parent, layer, layer_dest);
+ end
+ end
+end
+
+-- void MoveLayerAfter (Layer *this_one);
+-- moves the current layer below the layer "this_one" (if that layer
+-- is a set, the layer is put in the top of the layer set)
+function MoveLayerAfter (this_one)
+ if current_sprite and current_sprite.layer then
+ local layer = current_sprite.layer;
+ local layer_dest;
+
+ if not this_one then
+ layer_dest = current_sprite.set;
+ else
+ layer_dest = this_one;
+ end
+
+ if layer_dest then
+ layer_remove_layer (layer.parent, layer);
+
+ -- insert in the first position of the set
+ if layer_is_set (layer_dest) then
+ layer_add_layer (layer_dest, layer);
+ -- insert below the layer
+ else
+ layer_add_layer (layer_dest.parent, layer);
+ layer_move_layer (layer_dest.parent, layer, layer_dest.prev);
+ end
+ end
+ end
+end
diff --git a/test/etags/make-src/Makefile b/test/etags/make-src/Makefile
new file mode 100644
index 00000000000..daf605d0016
--- /dev/null
+++ b/test/etags/make-src/Makefile
@@ -0,0 +1,226 @@
+LATEST=17
+RELEASELIST=pot@gnu.org xemacs-review@xemacs.org jcwren@jcwren.com sxemacs-devel@sxemacs.org
+
+ADASRC=etags-test-for.ada 2ataspri.adb 2ataspri.ads waroquiers.ada
+ASRC=empty.zz empty.zz.gz
+CSRC=abbrev.c ../etags/h.h .//c.c torture.c getopt.h etags.c\
+ exit.c exit.strange_suffix sysdep.h tab.c\
+ emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c dostorture.c\
+ machsyscalls.c machsyscalls.h fail.c a/b/b.c
+CPSRC=c.C abstract.C abstract.H cfront.H burton.cpp burton.cpp\
+ functions.cpp MDiagArray2.h Pctest.h Range.h\
+ screen.cpp screen.hpp conway.cpp conway.hpp clheir.cpp.gz clheir.hpp.gz fail.C
+ELSRC=TAGTEST.EL emacs/lisp/progmodes/etags.el
+ERLSRC=gs_dialog.erl lines.erl lists.erl
+FORTHSRC=test-forth.fth
+FSRC=entry.for entry.strange_suffix entry.strange
+HTMLSRC=softwarelibero.html index.shtml algrthms.html software.html
+JAVASRC=AWTEMul.java KeyEve.java SMan.java SysCol.java TG.java
+LUASRC=allegro.lua
+MAKESRC=Makefile
+OBJCSRC=Subprocess.h Subprocess.m PackInsp.h PackInsp.m
+OBJCPPSRC=SimpleCalc.H SimpleCalc.M
+PASSRC=common.pas
+PERLSRC=htlmify-cystic yagrip.pl kai-test.pl mirror.pl
+PHPSRC=lce_functions.php ptest.php sendmail.php
+PSSRC=rfc1245.ps
+PROLSRC=ordsets.prolog natded.prolog
+PYTSRC=server.py
+TEXSRC=testenv.tex gzip.texi texinfo.tex nonewline.tex
+YSRC=parse.y parse.c atest.y cccp.c cccp.y
+SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
+ ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\
+ ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\
+ ${TEXSRC} ${YSRC}
+NONSRCS=entry.strange lists.erl clheir.hpp.gz
+
+VHDLFLAGS=--language=none --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ ]* +OF/' --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\( BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
+COBOLFLAGS=--language=none --regex='/.......[a-zA-Z0-9-]+\./'
+POSTSCRIPTFLAGS=--language=none --regex='#/[^ \t{]+#'
+TCLFLAGS=--lang=none --regex='/proc[ \t]+\([^ \t]+\)/\1/'
+
+GETOPTOBJS= #getopt.o getopt1.o
+RXINCLUDE=-Iemacs/src
+REGEXOBJS=regex.o
+
+CHECKOBJS=chkmalloc.o chkxm.o
+CHECKFLAGS=-DDEBUG -Wno-unused-function
+OBJS=${GETOPTOBJS} ${REGEXOBJS} ${CHECKOBJS}
+CPPFLAGS=${CHECKFLAGS} -DSTDC_HEADERS -DHAVE_GETCWD ${RXINCLUDE} -I.
+LDFLAGS=#-static -lc_p
+WARNINGS=-pedantic -Wall -Wpointer-arith -Winline -Wmissing-prototypes -Wmissing-declarations -Wunused -Wformat -Wno-switch -Wsign-compare -Wpointer-arith -Wshadow -Wstrict-prototypes
+CFLAGS=${WARNINGS} -ansi -g3 # -pg -O
+#CC=gcc-3.0
+#TARGET_ARCH=
+FASTCFLAGS=-O3 -finline-functions -ffast-math -funroll-loops
+FASTCFLAGSWARN=${WARNINGS} -Werror ${FASTCFLAGS}
+
+FILTER=grep -v '\.[Cchefy][lor]*,[1-9][0-9]*' || true
+REGEX=/[ \t]*DEFVAR_[A-Z_ \t\n(]+"\([^"]+\)"/
+xx="this line is here because of a fontlock bug
+
+MAKE:=$(MAKE) --no-print-directory
+RUN=time --quiet --format '%U + %S: %E'
+RUN=
+OPTIONS=--members --declarations --regex=@regexfile
+ARGS=- < srclist
+
+infiles = $(filter-out ${NONSRCS},${SRCS}) srclist regexfile
+
+quiettest:
+ @rm -f /tmp/[0-9][0-9][0-9][0-9][0-9][0-9]malloc
+ @-$(MAKE) OPTIONS='--no-members' ${LATEST}ediff
+ @-$(MAKE) OPTIONS='--declarations --no-members' ${LATEST}ediff
+ @-$(MAKE) OPTIONS='--members' ${LATEST}ediff
+ @-$(MAKE) OPTIONS='--regex=@regexfile --no-members' ${LATEST}ediff
+ @-$(MAKE) OPTIONS='nonexistent --members --declarations --regex=@regexfile' ${LATEST}ediff
+ @-$(MAKE) ${LATEST}cdiff
+
+test:
+ @rm -f /tmp/[0-9][0-9][0-9][0-9][0-9][0-9]malloc
+ @$(MAKE) OPTIONS='--no-members' ${LATEST}ediff
+ @$(MAKE) OPTIONS='--declarations --no-members' ${LATEST}ediff
+ @$(MAKE) OPTIONS='--members' ${LATEST}ediff
+ @$(MAKE) OPTIONS='--regex=@regexfile --no-members' ${LATEST}ediff
+ @$(MAKE) OPTIONS='nonexistent --members --declarations --regex=@regexfile' ${LATEST}ediff
+ @$(MAKE) ${LATEST}cdiff
+
+${CHECKOBJS}: CFLAGS=-g3 -DNULLFREECHECK=0
+
+checker:
+ @rm -f /tmp/[0-9][0-9][0-9][0-9][0-9][0-9]malloc ${REGEXOBJS}
+ @env CHECKEROPTS="--trace --profile --Wfree-null" \
+ $(MAKE) CFLAGS= CHECKOBJS= CHECKFLAGS= CC=checkergcc ${LATEST}ediff
+ rm -f $REGEXOBJS
+
+standalone:
+ rm -f etags ctags
+ @$(MAKE) etags "CPPFLAGS=-UVERSION"
+ @$(MAKE) ctags "CPPFLAGS=-UVERSION"
+
+prof: ETAGS
+ prof -xgs etags
+
+fastetags:
+ rm -f etags ${GETOPTOBJS} ${REGEXOBJS}
+ @$(MAKE) CHECKOBJS= CHECKFLAGS= etags "CFLAGS=-ansi ${FASTCFLAGSWARN}"
+
+fastctags:
+ rm -f ctags ${GETOPTOBJS} ${REGEXOBJS}
+ @$(MAKE) CHECKOBJS= CHECKFLAGS= ctags "CFLAGS=-ansi ${FASTCFLAGSWARN}"
+
+staticetags:
+ rm -f etags ${GETOPTOBJS} ${REGEXOBJS}
+ @$(MAKE) etags CHECKOBJS= CHECKFLAGS= REGEXOBJS= GETOPTOBJS= RXINCLUDE= "CFLAGS=${FASTCFLAGSWARN} -static"
+
+rsynctofly:
+ rsync --exclude "*~" --exclude core --exclude etags -zauRv . fly:gnu/etags/
+
+rsyncfromfly:
+ rsync --exclude "*~" --exclude core --exclude etags -zauRv fly:gnu/etags/ ../..
+
+web ftp publish:
+ @-echo -e \\ttesting with debugging enabled...; $(MAKE) quiettest
+ @-echo -e \\ttesting standalone...; $(MAKE) standalone quiettest
+ @-echo -e \\ttesting fast versions...; $(MAKE) fastetags fastctags quiettest
+ @$(MAKE) /home/www/pub/etags.c.gz
+ @$(MAKE) /home/www/pub/software/unix/etags.tar.gz
+
+release distrib: web
+ cat xemacs-mail | /usr/sbin/sendmail -f pot@gnu.org ${RELEASELIST}
+ mv etags etags${LATEST}
+ mv ctags ctags${LATEST}
+
+tags: TAGS
+
+clean:
+ rm -f ${OBJS} etags ETAGS
+
+srclist: Makefile
+ @for i in $(SRCS); do echo $$i; done > srclist
+ @echo srclist remade
+
+regexfile: Makefile
+ @echo ' -- This is for GNU Emacs source files' > regexfile
+ @echo '${REGEX}' >> regexfile
+ @echo '{c}${REGEX}\\1/m' >> regexfile
+ @echo regexfile remade
+
+/home/www/pub/etags.c.gz: etags.c
+ co -kv etags.c
+ gzip --best -c etags.c > $@
+
+#/home/www/pub/software/unix/etags.tar.gz: Makefile staticetags etags.1.man ETAGS.EBNF ETAGS.README
+# tar -hzcf $@ COPYING ChangeLog ETAGS.EBNF etags.c etags.1 etags.1.man etags
+
+/home/www/pub/software/unix/etags.tar.gz: Makefile etags.1.man ETAGS.EBNF ETAGS.README maintaining.texi
+ tar -hzcf $@ COPYING ChangeLog ETAGS.EBNF ETAGS.README etags.c etags.1 etags.1.man maintaining.texi
+
+regex.o: emacs/src/regex.c
+ $(CC) ${FASTCFLAGS} -c $?
+
+getopt.o: emacs/lib-src/getopt.c
+ $(CC) ${FASTCFLAGS} -c $?
+
+getopt1.o: emacs/lib-src/getopt1.c
+ $(CC) ${FASTCFLAGS} -c $?
+
+etags: etags.c ${OBJS}
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o etags etags.c ${OBJS}
+
+ctags: etags.c ${OBJS}
+ $(CC) $(CFLAGS) $(CPPFLAGS) -DCTAGS $(LDFLAGS) -o ctags etags.c ${OBJS}
+
+man manpage: etags.1.man
+
+etags.1.man: etags.1
+ nroff -man -Tman etags.1 > $@
+
+maintaining.info: maintaining.texi
+ makeinfo --force --no-split maintaining.texi
+
+TAGS: etags.c
+ etags etags.c
+
+%ediff: ETAGS% ETAGS ${infiles}
+ sdiff --suppress-common-lines --width=103 ETAGS$* ETAGS
+
+oediff: OTAGS ETAGS ${infiles}
+ sdiff --suppress-common-lines --width=103 OTAGS ETAGS
+
+%cdiff: CTAGS% CTAGS ${infiles}
+ sdiff --suppress-common-lines --width=103 CTAGS$* CTAGS
+
+xdiff: ETAGS EXTAGS ${infiles}
+ sdiff --suppress-common-lines --width=103 ETAGS EXTAGS
+
+ETAGS: FRC etags ${infiles}
+ ${RUN} ./etags ${OPTIONS} -o $@ ${ARGS}
+
+ETAGS%: FRC etags% ${infiles}
+ ${RUN} etags$* ${OPTIONS} -o $@ ${ARGS}
+
+ETAGS13 ETAGS14 ETAGS15: etags% ${infiles}
+ TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* --regex=@regexfile} -o $@ ${ARGS}
+
+ETAGS12: etags12 ${infiles}
+ ${RUN} etags12 --members -o $@ --regex='${REGEX}' ${ARGS}
+
+OTAGS: oetags ${SRCS} srclist
+ ${RUN} ./oetags -o $@ -t ${ARGS}
+
+CTAGS: ctags ${infiles}
+ ${RUN} ./ctags -o $@ --regex=@regexfile ${ARGS}
+
+CTAGS%: ctags% ${infiles}
+ ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=@regexfile ${ARGS}
+
+CTAGS13 CTAGS14 CTAGS15: ctags% ${infiles}
+ TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ --regex='${REGEX}' ${ARGS}
+
+EXTAGS: extags ${infiles} Makefile
+ ${RUN} ./extags -e --regex-c='${REGEX}' --c++-types=+x --c-types=+x --if0=yes --line-directives=yes -o $@ -L - < srclist
+
+.PRECIOUS: ETAGS CTAGS ETAGS16 CTAGS16 ETAGS17 CTAGS17
+
+FRC:;
diff --git a/test/etags/objc-src/PackInsp.h b/test/etags/objc-src/PackInsp.h
new file mode 100644
index 00000000000..0e3643c8281
--- /dev/null
+++ b/test/etags/objc-src/PackInsp.h
@@ -0,0 +1,120 @@
+/*+++*
+ * title: PackageInspector.h
+ * abstract: interface definitions for WM PackageInspector
+ * author: T.R.Hageman, Groningen, The Netherlands
+ * created: November 1994
+ * modified: (see RCS Log at end)
+ * copyleft:
+ *
+ * Copyright (C) 1994,1995 Tom R. Hageman.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * description:
+ *
+ *---*/
+
+#import <appkit/appkit.h>
+#import <apps/Workspace.h>
+
+#include <sys/stat.h>
+
+#import "Subprocess.h"
+
+#define NUMSTATS 4
+#define TYPESTOSTAT "bom", "info", "sizes", "tiff"
+
+@interface PackageInspector:WMInspector
+{
+ // Outlets
+ id packageArchesField;
+ id packageDescriptionText;
+ id packageIconButton;
+ id packageLocationField;
+ id packageSizesField;
+ id packageStatusField;
+ id packageTitleField;
+ id packageVersionField;
+
+ id inspectorVersionField;
+ id infoPanel;
+ id infoVersionField;
+
+ // other variables.
+ NXBundle *bundle; // class bundle.
+ NXBundle *package; // package bundle.
+ struct stat stats[NUMSTATS]; // for lazy inspection.
+ enum { listContents, listDescription } revertButtonState;
+
+ Subprocess *archProcess; // To determine architectures.
+}
+
+// Actions.
+-showInfo:sender;
+
+-open:sender;
+
+// The workhorses
+-(BOOL)shouldLoad;
+-load;
+-toggleDescription;
+
+// Load helper methods
+-loadKeyValuesFrom:(const char *)type inTable:(HashTable *)table;
+-loadContentsOf:(const char *)type inTable:(HashTable *)table;
+-loadImage;
+
+// Support methods
+-(const char *)getPath:(char *)path forType:(const char *)type;
+-setRevertButtonTitle;
+-(const char *)formatSize:(const char *)size inBuf:(char *)buf;
+
+// Determine architectures, in separate subprocess.
+-(void)getArchs;
+// Subprocess [TRH-enhanced] delegate methods:
+// Subprocess delegate methods:
+-subprocess:(Subprocess *)sender output:(char *)buffer;
+-subprocessDone:(Subprocess *)sender;
+
+@end // PackageInspector
+
+/*======================================================================
+ * PackageInspector.h,v
+ * Revision 1.7 1995/08/17 22:18:24 tom
+ * (-open:): new method.
+ *
+ * Revision 1.6 1995/07/30 16:59:51 tom
+ * import Subprocess.h; (archProcess): new ivar;
+ * (-getArchs,-subprocess:output:,-subprocessDone:): new methods;
+ * added for asynchronous arch-determination.
+ *
+ * Revision 1.5 1995/07/29 02:59:55 tom
+ * (NUMSTATS,TYPESTOSTAT): new defines, (stats[NUMSTATS]): new ivar, replaces
+ * bomstat, infostat, t ogeneralize lazy-load code.
+ *
+ * Revision 1.4 1995/04/02 02:39:05 tom
+ * (package): NXBundle instead of (const char *). so that localized info files
+ * are found. (this loses out if *.pkg is a symbolic link, though.)
+ *
+ * Revision 1.3 1994/12/07 00:00:36 tom
+ * add GNU copleft comment.
+ *
+ * Revision 1.2 1994/11/25 20:18:56 tom
+ * (package ivar): use (char*) instead of (NXBundle*) to workaround symlink problems
+ *
+ * Revision 1.1 1994/11/24 22:39:56 tom
+ * Initial revision
+ *
+ *======================================================================*/
diff --git a/test/etags/objc-src/PackInsp.m b/test/etags/objc-src/PackInsp.m
new file mode 100644
index 00000000000..41cc876850f
--- /dev/null
+++ b/test/etags/objc-src/PackInsp.m
@@ -0,0 +1,505 @@
+/*+++*
+ * title: PackageInspector.m
+ * abstract: NEXTSTEP Workspace Manager Inspector for Installer ".pkg" files.
+ * author: T.R.Hageman, Groningen, The Netherlands
+ * created: November 1994
+ * modified: (see RCS Log at end)
+ * copyleft:
+ *
+ * Copyright (C) 1994,1995 Tom R. Hageman.
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * description:
+ *
+ *---*/
+
+#ifdef RCS_ID
+static const char RCSid[] =
+"PackageInspector.m,v 1.8 1995/09/01 21:46:27";
+#endif
+
+#define VERSION "0.951"
+
+#ifndef DEBUG
+# define DEBUG 0
+#endif
+#define LISTCONTENTS 0 // List Contents not yet implemented
+
+#import "PackageInspector.h"
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+// Localized strings
+#define OPENBUTTON NXLocalizedStringFromTableInBundle(NULL, bundle, "Open", NULL, button label)
+#define LISTCONTENTSBUTTON NXLocalizedStringFromTableInBundle(NULL, bundle, "List Contents", NULL, button label)
+#define LISTDESCRIPTIONBUTTON NXLocalizedStringFromTableInBundle(NULL, bundle, "Description", NULL, button label)
+
+// States
+#define STATE_UNINSTALLED NXLocalizedStringFromTableInBundle(NULL, bundle, "Uninstalled", NULL, original package state)
+#define STATE_INSTALLED NXLocalizedStringFromTableInBundle(NULL, bundle, "installed", "Installed", package has been uncompressed unto disk)
+#define STATE_COMPRESSD NXLocalizedStringFromTableInBundle(NULL, bundle, "compressed", "Compressed", installed package has been recompressed)
+
+// so InfoView.strings can be ripped off from Installer.app
+#define SIZEFORMAT NXLocalizedStringFromTableInBundle("InfoView", bundle, "%s installed, %s compressed", NULL, Short indication to user about the size of a package once installed and the size when compressed)
+#define KBYTES NXLocalizedStringFromTableInBundle("InfoView", bundle, "KB", NULL, Kilobytes -- package size)
+#define MBYTES NXLocalizedStringFromTableInBundle("InfoView", bundle, "MB", NULL, MegaBytes -- package size)
+
+#define LOCALIZE(s) NXLoadLocalizedStringFromTableInBundle(NULL, bundle, s, NULL)
+#define LOCALIZE_ARCH(s) NXLoadLocalizedStringFromTableInBundle("Architectures", bundle, s, NULL)
+
+
+@implementation PackageInspector
+
++new
+{
+ static PackageInspector *instance;
+
+ if (instance == nil) {
+ char path[MAXPATHLEN+1];
+ const char *nibname = [self name];
+
+ instance = [super new];
+
+ instance->bundle = [NXBundle bundleForClass:self];
+
+ if ([instance->bundle getPath:path forResource:nibname ofType:"nib"] &&
+ [NXApp loadNibFile:path owner:instance]) {
+ [instance->inspectorVersionField setStringValue:VERSION];
+ [instance->packageDescriptionText setVertResizable:YES]; // ??Necessary??
+ }
+ else {
+ fprintf(stderr, "Couldn't load %s.nib\n", nibname);
+ [instance free];
+ instance = nil;
+ }
+ }
+ return instance;
+}
+
+-showInfo:sender
+{
+ if (infoPanel == nil) {
+ char path[MAXPATHLEN+1];
+
+ if ([bundle getPath:path forResource:"Info" ofType:"nib"] &&
+ [NXApp loadNibFile:path owner:self]) {
+ [infoVersionField setStringValue:[inspectorVersionField stringValue]];
+ }
+ }
+ [infoPanel makeKeyAndOrderFront:sender];
+ return self;
+}
+
+-revert:sender
+{
+ [super revert:sender];
+
+ if ([self selectionCount] != 1) {
+ return nil;
+ }
+ if (sender == [self revertButton]) {
+ [self toggleDescription];
+ }
+ else {
+ char path[MAXPATHLEN+1];
+
+ [package free];
+ [self selectionPathsInto:path separator:'\0'];
+ if (!(package = [[NXBundle allocFromZone:[self zone]] initForDirectory:path])) {
+ return nil;
+ }
+ if ([self shouldLoad]) {
+ [self load];
+ revertButtonState = listContents;
+ }
+ }
+ [[[self okButton] setTitle:OPENBUTTON] setEnabled:YES];
+ [self setRevertButtonTitle];
+
+ return self;
+}
+
+-ok:sender
+{
+ [self perform:@selector(open:) with:sender afterDelay:0 cancelPrevious:NO];
+ [super ok:sender];
+ return self;
+}
+
+-load
+{
+ char buf[256], size[2][20];
+ HashTable *table = [[HashTable alloc] initKeyDesc:"*" valueDesc:"*"];
+
+ [self getArchs];
+ // Collect information about the package in a hashtable.
+ [self loadKeyValuesFrom:"info" inTable:table];
+ [self loadKeyValuesFrom:"sizes" inTable:table];
+ [self loadContentsOf:"location" inTable:table];
+ [self loadContentsOf:"status" inTable:table];
+
+ // Convenience macro.
+#define LOOKUP(key, notfound) ([table isKey:key] ? [table valueForKey:key] : \
+ (notfound))
+#if 0
+ // Set the various controls.
+ sprintf(buf, "<<not yet implemented>>");
+ // Well then, how *DOES* Installer determine this???
+ [packageArchesField setStringValue:buf];
+#endif
+ [packageDescriptionText setText:LOOKUP("Description", "")];
+ [packageLocationField setStringValue:
+ LOOKUP("location", LOOKUP("DefaultLocation", "???"))];
+
+ [self formatSize:[table valueForKey:"InstalledSize"] inBuf:size[0]];
+ [self formatSize:[table valueForKey:"CompressedSize"] inBuf:size[1]];
+ sprintf(buf, SIZEFORMAT, size[0], size[1]);
+ [packageSizesField setStringValue:buf];
+
+ [packageStatusField setStringValue:LOCALIZE(LOOKUP("status", "Uninstalled"))];
+ [packageTitleField setStringValue:LOOKUP("Title", "???")];
+ [packageVersionField setStringValue:LOOKUP("Version", "???")];
+#undef LOOKUP
+ // Is this how one frees the contents of a hashtable?
+ [table freeKeys:free values:free];
+ [table free];
+
+ [self loadImage];
+
+ return self;
+}
+
+-loadKeyValuesFrom:(const char *)type inTable:(HashTable *)table
+{
+ char path[MAXPATHLEN+1];
+ NXStream *stream;
+
+ if (stream = NXMapFile([self getPath:path forType:type], NX_READONLY)) {
+ int c;
+
+#if DEBUG & 1
+ fprintf(stderr, "loadKeyValuesFrom:%s\n", path);
+#endif
+ while ((c = NXGetc(stream)) >= 0) {
+ // Buffer sizes should be enough, according to doc.
+ char key[1024+1], value[1024+1];
+ char *p;
+
+ if (NXIsSpace(c)) continue;
+ if (c == '#') {
+ while ((c = NXGetc(stream)) >= 0 && c != '\n') ;
+ continue;
+ }
+ // Found key; collect it.
+ p = key;
+ do {
+ if (p < &key[sizeof key-1]) *p++ = c;
+ } while ((c = NXGetc(stream)) >= 0 && !NXIsSpace(c));
+ *p = '\0';
+
+ // Skip over spaces and tabs.
+ while (c == ' ' || c == '\t') c = NXGetc(stream);
+
+ // Value is rest of line, up to newline.
+ p = value;
+ do {
+ if (p < &value[sizeof value-1]) *p++ = c;
+ } while ((c = NXGetc(stream)) >= 0 && c != '\n');
+ *p = '\0';
+
+ // Insert key/value pair in hashtable.
+#if DEBUG & 1
+ fprintf(stderr, "key:%s value:%s\n", key, value);
+#endif
+ [table insertKey:NXCopyStringBuffer(key)
+ value:NXCopyStringBuffer(value)];
+ }
+
+ NXCloseMemory(stream, NX_FREEBUFFER);
+ }
+ return self;
+
+}
+
+-loadContentsOf:(const char *)type inTable:(HashTable *)table
+{
+ char path[MAXPATHLEN+1];
+ NXStream *stream;
+
+ if (stream = NXMapFile([self getPath:path forType:type], NX_READONLY)) {
+ char line[1024+1];
+ int n = NXRead(stream, line, sizeof line);
+
+ if (n > 0 && line[n-1] == '\n') line[n-1] = '\0'; // remove trailing newline.
+
+ NXCloseMemory(stream, NX_FREEBUFFER);
+
+ [table insertKey:NXCopyStringBuffer(type)
+ value:NXCopyStringBuffer(line)];
+ }
+ return self;
+}
+
+-loadImage
+{
+ char path[MAXPATHLEN+1];
+ NXImage *image;
+
+ // Remove old image from the button.
+ if (image = [packageIconButton image]) {
+ [packageIconButton setImage:nil];
+ [image free];
+ }
+ // Get the image (if any) from the package
+ image = [[NXImage allocFromZone:[self zone]] initFromFile:[self getPath:path forType:"tiff"]];
+ [packageIconButton setImage:image];
+
+ return self;
+}
+
+
+#define STAT_EQ(s1, s2) ((s1)->st_ino == (s2)->st_ino && \
+ (s1)->st_dev == (s2)->st_dev && \
+ (s1)->st_mtime == (s2)->st_mtime && \
+ (s1)->st_size == (s2)->st_size)
+
+-(BOOL)shouldLoad
+{
+ char path[MAXPATHLEN+1];
+ struct stat newstats[NUMSTATS];
+ static const char * const typesToStat[NUMSTATS] = { TYPESTOSTAT };
+ BOOL result = NO;
+ int i;
+
+ for (i = 0; i < NUMSTATS; i++) {
+ memset(&newstats[i], 0, sizeof(struct stat));
+ if (!(stat([self getPath:path forType:typesToStat[i]], &newstats[i]) == 0 &&
+ STAT_EQ(&newstats[i], &stats[i]))) {
+ result = YES;
+ ///break; // NOT!!! must stat all for accurate cache.
+ }
+ stats[i] = newstats[i];
+ }
+
+ return result;
+}
+
+-toggleDescription
+{
+ switch (revertButtonState) {
+ case listContents:
+ // TODO: swap views?
+ revertButtonState = listDescription;
+ break;
+ case listDescription:
+ revertButtonState = listContents;
+ break;
+ }
+ return [self setRevertButtonTitle];
+}
+
+
+// Support methods
+-(const char *)getPath:(char *)buf forType:(const char *)type
+{
+ char name[MAXPATHLEN+1];
+
+ // Get package name, sans extension.
+ *strrchr(strcpy(name, strrchr([package directory], '/')+1), '.') = '\0';
+
+ // Now get the full pathname.
+ [package getPath:buf forResource:name ofType:type];
+#if DEBUG & 2
+ fprintf(stderr, "PackageInspector: type=\"%s\" name=\"%s\" path=\"%s\"\n",
+ type, name, buf);
+#endif
+ return buf;
+}
+
+-setRevertButtonTitle
+{
+#if LISTCONTENTS
+ [[[self revertButton]
+ setTitle:LOCALIZE(revertButtonState == listContents ?
+ "List Contents" : "Description")]
+ setEnabled:YES];
+#endif
+ return self;
+}
+
+-(const char *)formatSize:(const char *)size inBuf:(char *)buf
+{
+ // [TRH] this is very simplistic (but seems consistent with Installer.app)
+ if (!size) {
+ strcpy(buf, "???");
+ }
+ else {
+ int len = strlen(size);
+ if (len < 4) {
+ sprintf(buf, "%s%s", size, KBYTES);
+ }
+ else if (len < 6) {
+ sprintf(buf, "%.*s.%.*s%s",
+ (len-3), size, 3-(len-3), size+(len-3), MBYTES);
+ }
+ else {
+ sprintf(buf, "%.*s%s", (len-3), size, MBYTES);
+ }
+ }
+ return buf;
+}
+
+// Determine architectures, in separate subprocess.
+
+#define WORKING " ..." // `I'm still busy' indicator.
+
+-(void)getArchs
+{
+ char command[2*MAXPATHLEN+10+1];
+
+ if (archProcess) [archProcess terminate:self];
+
+ [packageArchesField setStringValue:WORKING];
+
+ [bundle getPath:command forResource:"archbom" ofType:NULL];
+ strcat(command, " ");
+ [self getPath:&command[strlen(command)] forType:"bom"];
+ archProcess = [[Subprocess allocFromZone:[self zone]] init:command
+ withDelegate:self andPtySupport:NO andStdErr:NO];
+}
+
+-(void)addArchs:(const char *)string
+{
+ char result[1024]; // Should be big enough...
+ const char *s;
+ char *d;
+
+ strcpy(result, [packageArchesField stringValue]);
+ if ((d = strstr(result, WORKING)) != NULL) {
+ *d = '\0';
+ }
+ else {
+ d = result + strlen(result);
+ }
+ if ((s = string)) {
+ do {
+ char name[100];
+ char *t = name;
+
+ while (*s && !NXIsAlNum(*s)) {
+ if (*s == '\n') {
+ *d++ = ' ', s++;
+ }
+ else {
+ *d++ = *s++;
+ }
+ }
+ while (NXIsAlNum(*s)) *t++ = *s++;
+ *t = '\0';
+ if (t > name) {
+#if DEBUG & 4
+ fprintf(stderr, "addArchs:\"%s\" localized: \"%s\"\n", name, LOCALIZE_ARCH(name));
+#endif
+ strcpy(d, LOCALIZE_ARCH(name));
+ d += strlen(d);
+ }
+ } while (*s);
+
+ strcpy(d, WORKING);
+ }
+ [packageArchesField setStringValue:result];
+ [window displayIfNeeded]; // necessary??
+}
+
+-subprocess:(Subprocess *)sender output:(char *)buffer
+{
+ if (sender == archProcess) {
+ [self addArchs:buffer];
+ }
+ return self;
+}
+
+-subprocessDone:(Subprocess *)sender
+{
+ if (sender == archProcess) {
+ archProcess = nil;
+ [self addArchs:NULL];
+ }
+ [sender free];
+ return self;
+}
+
+static void openInWorkspace(const char *filename)
+{
+ // Indirect approach to circumvent Workspace deadlock/timeout.
+ char command[14+3*MAXPATHLEN+1];
+ const char *s;
+ char *d = command;
+
+ for (s = "exec open '"; *s; ) *d++ = *s++;
+ // Escape single quote characters.
+ for (s = filename; *s; ) {
+ if ((*d++ = *s++) == '\'') {
+ *d++ = '\\', *d++ = '\'', *d++ = '\'';
+ }
+ }
+ for (s = "'&"; *d++ = *s++; ) ;
+ system(command);
+}
+
+-open:sender
+{
+ openInWorkspace([package directory]);
+ return self;
+}
+
+@end
+
+/*======================================================================
+ * PackageInspector.m,v
+ * Revision 1.8 1995/09/01 21:46:27 tom
+ * Circumvent open deadlock/timeout (when Installer.app is not yet launched);
+ * (openInWorkspace): new private function; (-open:): new method.
+ *
+ * Revision 1.7 1995/07/30 22:20:26 tom
+ * (LOCALIZE_ARCH): new macro; (-addArchs:): new method;
+ * (-subprocess:output:,-subprocessDone:) use it.
+ *
+ * Revision 1.6 1995/07/30 16:59:51 tom
+ * import Subprocess.h; (archProcess): new ivar;
+ * (-getArchs,-subprocess:output:,-subprocessDone:): new methods;
+ * added for asynchronous arch-determination.
+ *
+ * Revision 1.5 1995/07/29 19:13:35 tom
+ * (+new): avoid reassignment of self;
+ * make packageDescriptionText vertically resizable;
+ * (-shouldLoad): rewritten to generalized array-driven approach.
+ *
+ * Revision 1.4 1995/04/02 02:39:01 tom
+ * (package): NXBundle instead of (const char *). so that localized info files
+ * are found. (this loses out if *.pkg is a symbolic link, though.)
+ *
+ * Revision 1.3 1994/12/07 00:00:36 tom
+ * (RCSid): add spaces.
+ *
+ * Revision 1.2 1994/11/25 21:27:18 tom
+ * (package ivar): use (char*) instead of (NXBundle*) to workaround symlink problems
+ *
+ * Revision 1.1 1994/11/25 16:13:12 tom
+ * Initial revision
+ *
+ *======================================================================*/
diff --git a/test/etags/objc-src/Subprocess.h b/test/etags/objc-src/Subprocess.h
new file mode 100644
index 00000000000..7e586a16a12
--- /dev/null
+++ b/test/etags/objc-src/Subprocess.h
@@ -0,0 +1,81 @@
+/*
+ Subprocess.h (v10)
+ by Charles L. Oei
+ pty support by Joe Freeman
+ with encouragement from Kristofer Younger
+ Subprocess Example, Release 2.0
+ NeXT Computer, Inc.
+
+ You may freely copy, distribute and reuse the code in this example.
+ NeXT disclaims any warranty of any kind, expressed or implied, as to
+ its fitness for any particular use.
+
+ Hacked up for use in PackageInspector by Tom Hageman.
+*/
+
+#import <objc/Object.h>
+#import <stdio.h>
+
+/*
+ This subprocess object sends/receives data to/from any UNIX
+ subprocess asynchronously (via vfork/pipe).
+ Its delegate, if any, will receive the following messages:
+
+ - subprocessDone;
+ // sent when the subprocess exits
+
+ - subprocessOutput:(char *)buffer;
+ // sent whenever there is data on the standard output pipe;
+ // buffer is only valid until next call
+
+ - subprocessError:(const char *)errorString;
+ // sent when an error occurs;
+ // if it ever happens, it's usually only at startup time
+
+ // [TRH] and this is how these should have been done in the first place...
+ - subprocessDone:(SubProcess *)sender;
+ - subprocess:(SubProcess *)sender output:(char *)buffer;
+*/
+
+// Hack to uniquize classname (to avoid dynload errors.)
+#define Subprocess SubprocessForPackageInspector
+
+#define BUFFERSIZE 2048
+
+@interface Subprocess:Object
+{
+ FILE *fpToChild;
+ int fromChild;
+ int childPid;
+ id delegate;
+ int masterPty; // file descriptor for master/slave pty
+ int slavePty;
+ int bufferCount;
+ char outputBuffer[BUFFERSIZE];
+}
+
+- init:(const char *)subprocessString;
+ // a cover for the below withDelegate:nil, andPtySupport:NO, andStdErr:YES
+
+- init:(const char *)subprocessString
+ withDelegate:theDelegate
+ andPtySupport:(BOOL)wantsPty
+ andStdErr:(BOOL)wantsStdErr;
+ // optional requests for pseudo terminal support and
+ // redirecting the standard error stream thru standard output
+
+- send:(const char *)string withNewline:(BOOL)wantNewline;
+ // send the string optionally followed by a new line
+- send:(const char *)string;
+ // sends the string followed by a new line
+ // shorthand for above withNewline:YES
+- terminateInput;
+ // sends an end-of-file (EOF) to the subprocess
+ // (and closes input pipe to child)
+- terminate:sender;
+ // forces the subprocess to terminate (w/ SIGTERM)
+
+- setDelegate:anObject;
+- delegate;
+
+@end
diff --git a/test/etags/objc-src/Subprocess.m b/test/etags/objc-src/Subprocess.m
new file mode 100644
index 00000000000..2d8d586507e
--- /dev/null
+++ b/test/etags/objc-src/Subprocess.m
@@ -0,0 +1,343 @@
+/*
+ Subprocess.m (v10)
+ by Charles L. Oei
+ pty support by Joe Freeman
+ Subprocess Example, Release 2.0
+ NeXT Computer, Inc.
+
+ You may freely copy, distribute and reuse the code in this example.
+ NeXT disclaims any warranty of any kind, expressed or implied, as to
+ its fitness for any particular use.
+*/
+
+#import "Subprocess.h"
+// #import <sgtty.h> // needed to compile under Release 1.0
+#import <appkit/nextstd.h>
+#import <appkit/Application.h>
+#import <appkit/Panel.h>
+#import <sys/wait.h>
+
+#define PTY_TEMPLATE "/dev/pty??"
+#define PTY_LENGTH 11
+
+static void showError();
+
+
+/*==========================================================
+ *
+ * Private Instance Methods
+ *
+ *==========================================================*/
+
+@interface Subprocess(Private)
+- childDidExit;
+- fdHandler:(int)theFd;
+@end
+
+@implementation Subprocess(Private)
+
+- childDidExit
+ // cleanup after a child process exits
+{
+ if (childPid)
+ {
+ union wait exitstatus;
+ int waitresult;
+
+ DPSRemoveFD(fromChild);
+ close(fromChild);
+ fclose(fpToChild);
+ // Cleanup zombie processes. (blocking wait is too dangerous here...)
+ waitresult = wait4(childPid, &exitstatus, WNOHANG, NULL);
+ if (waitresult != childPid) {
+ /* XXX should handle this gracefully, e.g, timed entry. */
+ }
+ childPid=0; // specify that child is dead
+ if (delegate)
+ {
+ if ([delegate respondsTo:@selector(subprocessDone:)])
+ [delegate perform:@selector(subprocessDone:) with:self];
+ else if ([delegate respondsTo:@selector(subprocessDone)])
+ [delegate perform:@selector(subprocessDone)];
+ }
+ }
+ return self;
+}
+
+- fdHandler:(int)theFd
+ // DPS handler for output from subprocess
+{
+ if ((bufferCount = read(theFd, outputBuffer, BUFFERSIZE-1)) <= 0)
+ {
+ [self childDidExit];
+ return self;
+ }
+ outputBuffer[bufferCount] = '\0';
+ if (delegate)
+ {
+ if ([delegate respondsTo:@selector(subprocess:output:)])
+ [delegate perform:@selector(subprocess:output:)
+ with:self with:(void *)&outputBuffer];
+ else if ([delegate respondsTo:@selector(subprocessOutput:)])
+ [delegate perform:@selector(subprocessOutput:)
+ with:(void *)&outputBuffer];
+ }
+ return self;
+}
+
+@end
+
+
+/*==========================================================
+ *
+ * Private Utility Routines
+ *
+ *==========================================================*/
+
+static void
+showError (const char *errorString, id theDelegate)
+ // ensure errors never get dropped on the floor
+{
+ if (theDelegate && [theDelegate respondsTo:@selector(subprocessError:)])
+ [theDelegate
+ perform:@selector(subprocessError:)
+ with:(void *)errorString];
+ else if (NXApp) // no delegate, but we're running w/in an App
+ NXRunAlertPanel(0, errorString, 0, 0, 0);
+ else
+ perror(errorString);
+}
+
+static void
+fdHandler (int theFd, id self)
+ // DPS handler for output from subprocess
+{
+ [self fdHandler:theFd];
+}
+
+static void
+getptys (int *master, int *slave)
+ // attempt to setup the ptys
+{
+ char device[PTY_LENGTH];
+ char *block, *num;
+ char *blockLoc; // specifies the location of block for the device string
+ char *numLoc; // specifies the pty name with the digit ptyxD
+ char *msLoc; // specifies the master (ptyxx) or slave (ttyxx)
+
+ struct sgttyb setp =
+ {B9600, B9600, (char)0x7f, (char)0x15, (CRMOD|ANYP)};
+ struct tchars setc =
+ {CINTR, CQUIT, CSTART, CSTOP, CEOF, CBRK};
+ struct ltchars sltc =
+ {CSUSP, CDSUSP, CRPRNT, CFLUSH, CWERASE, CLNEXT};
+ int lset =
+ (LCRTBS|LCRTERA|LCRTKIL|LCTLECH|LPENDIN|LDECCTQ);
+ int setd = NTTYDISC;
+
+ strcpy(device, PTY_TEMPLATE); // string constants are not writable
+ blockLoc = &device[ strlen("/dev/pty") ];
+ numLoc = &device[ strlen("/dev/pty?") ];
+ msLoc = &device[ strlen("/dev/") ];
+ for (block = "pqrs"; *block; block++)
+ {
+ *blockLoc = *block;
+ for (num = "0123456789abcdef"; *num; num++)
+ {
+ *numLoc = *num;
+ *master = open(device, O_RDWR);
+ if (*master >= 0)
+ {
+ *msLoc = 't';
+ *slave = open(device, O_RDWR);
+ if (*slave >= 0)
+ {
+ (void) ioctl(*slave, TIOCSETP, (char *)&setp);
+ (void) ioctl(*slave, TIOCSETC, (char *)&setc);
+ (void) ioctl(*slave, TIOCSETD, (char *)&setd);
+ (void) ioctl(*slave, TIOCSLTC, (char *)&sltc);
+ (void) ioctl(*slave, TIOCLSET, (char *)&lset);
+ return;
+ } else {
+ // close the master and reset the device
+ // name so that the master opens it properly
+ *msLoc = 'p';
+ close(*master);
+ }
+ }
+ } /* hunting through a bank of ptys */
+ } /* hunting through blocks of ptys in all the right places */
+ *master = -1;
+ *slave = -1;
+}
+
+
+@implementation Subprocess
+
+/*==========================================================
+ *
+ * Public Instance Methods
+ *
+ *==========================================================*/
+
+- init:(const char *)subprocessString
+ // a cover for the below withDelegate:nil, andPtySupport:NO, andStdErr:YES
+{
+ return
+ [self
+ init:subprocessString
+ withDelegate:nil
+ andPtySupport:NO
+ andStdErr:YES];
+}
+
+- init:(const char *)subprocessString
+ withDelegate:theDelegate
+ andPtySupport:(BOOL)wantsPty
+ andStdErr:(BOOL)wantsStdErr
+ // initializes an instance of Subprocess and corresponding UNIX process
+{
+ int pipeTo[2]; // for non-Pty support
+ int pipeFrom[2];
+ int tty, numFds, fd; // for temporary use
+ int processGroup;
+ int pidChild; // needed because childPid does not exist
+ // until Subprocess is instantiated
+
+ if (wantsPty)
+ {
+ tty = open("/dev/tty", O_RDWR);
+ getptys(&masterPty,&slavePty);
+ if (masterPty <= 0 || slavePty <= 0)
+ {
+ showError("Error grabbing ptys for subprocess.", theDelegate);
+ return self;
+ }
+ // remove the controlling tty if launched from a shell,
+ // but not Workspace;
+ // so that we have job control over the parent application in shell
+ // and so that subprocesses can be restarted in Workspace
+ if ((tty<0) && ((tty = open("/dev/tty", 2))>=0))
+ {
+ ioctl(tty, TIOCNOTTY, 0);
+ close(tty);
+ }
+ }
+ else
+ {
+ if (pipe(pipeTo) < 0 || pipe(pipeFrom) < 0)
+ {
+ showError("Error starting UNIX pipes to subprocess.", theDelegate);
+ return self;
+ }
+ }
+
+ switch (pidChild = vfork())
+ {
+ case -1: // error
+ showError("Error starting UNIX vfork of subprocess.", theDelegate);
+ return self;
+
+ case 0: // child
+ if (wantsPty)
+ {
+ dup2(slavePty, 0);
+ dup2(slavePty, 1);
+ if (wantsStdErr)
+ dup2(slavePty, 2);
+ }
+ else
+ {
+ dup2(pipeTo[0], 0);
+ dup2(pipeFrom[1], 1);
+ if (wantsStdErr)
+ dup2(pipeFrom[1], 2);
+ }
+
+ numFds = getdtablesize();
+ for (fd=3; fd<numFds; fd++)
+ close(fd);
+
+ processGroup = getpid();
+ ioctl(0, TIOCSPGRP, (char *)&processGroup);
+ setpgrp (0, processGroup);
+
+ // we exec a /bin/sh so that cmds are easier to specify for the user
+ execl("/bin/sh", "sh", "-c", subprocessString, 0);
+ perror("vfork (child)"); // should never gets here tho
+ exit(1);
+
+ default: // parent
+ [self setDelegate:theDelegate];
+ childPid = pidChild;
+
+ if (wantsPty)
+ {
+ close(slavePty);
+
+ fpToChild = fdopen(masterPty, "w");
+ fromChild = masterPty;
+ }
+ else
+ {
+ close(pipeTo[0]);
+ close(pipeFrom[1]);
+
+ fpToChild = fdopen(pipeTo[1], "w");
+ fromChild = pipeFrom[0];
+ }
+
+ setbuf(fpToChild, NULL);
+ DPSAddFD(
+ fromChild,
+ (DPSFDProc)fdHandler,
+ (id)self,
+ NX_MODALRESPTHRESHOLD+1);
+ return self;
+ }
+}
+
+- send:(const char *)string withNewline:(BOOL)wantNewline
+{
+ fputs(string, fpToChild);
+ if (wantNewline)
+ fputc('\n', fpToChild);
+ return self;
+}
+
+- send:(const char *)string
+{
+ [self send:string withNewline:YES];
+ return self;
+}
+
+- terminateInput
+ // effectively sends an EOF to the child process stdin
+{
+ fclose(fpToChild);
+ return self;
+}
+
+- terminate:sender
+{
+ if (childPid)
+ {
+ //kill(childPid+1, SIGTERM);
+ killpg(childPid, SIGTERM);
+ [self childDidExit];
+ }
+ return self;
+}
+
+- setDelegate:anObject
+{
+ delegate = anObject;
+ return self;
+}
+
+- delegate
+{
+ return delegate;
+}
+
+@end
diff --git a/test/etags/objcpp-src/SimpleCalc.H b/test/etags/objcpp-src/SimpleCalc.H
new file mode 100644
index 00000000000..121ae6bada3
--- /dev/null
+++ b/test/etags/objcpp-src/SimpleCalc.H
@@ -0,0 +1,49 @@
+//
+// SimpleCalc -- Randy Nelson -- NeXT Developer Training
+// A general class that serves as a liaison between a calculator interface
+// and a calculator engine.
+//
+// You may freely copy, distribute and reuse the code in this example.
+// NeXT disclaims any warranty of any kind, expressed or implied, as to
+// its fitness for any particular use.
+//
+// Created 8-8-90
+//
+#import <objc/Object.h>
+
+@interface SimpleCalc:Object
+{
+ // outlets...the front-end.
+ id display;
+ id enterKey;
+ id minusKey;
+ id infoManager;
+ id myNXStringTable;
+
+ // C++ object's can be a-part-of Objective-C objects.
+ class CalcEngine *cplus_object;
+
+ // record each previous user action
+ SEL previousAction;
+}
+
+// actions.
+
+- numberKeys:sender;
+- decimalKey:sender;
+- operationKeys:sender;
+- equalsKey:sender;
+- clearKey:sender;
+- clearAllKey:sender;
+- infoPanel:sender;
+- helpPanel:sender;
+
+// delegate methods.
+
+- windowWillClose:sender;
+- appDidInit:sender;
+
+- registerAction:(SEL)action;
+- appendToDisplay:(const char *)theString;
+
+@end
diff --git a/test/etags/objcpp-src/SimpleCalc.M b/test/etags/objcpp-src/SimpleCalc.M
new file mode 100644
index 00000000000..34846a7aceb
--- /dev/null
+++ b/test/etags/objcpp-src/SimpleCalc.M
@@ -0,0 +1,207 @@
+// SimpleCalc -- Randy Nelson -- NeXT Developer Training
+// A general class that serves as a liaison between a calculator interface
+// and a calculator engine.
+//
+// You may freely copy, distribute and reuse the code in this example.
+// NeXT disclaims any warranty of any kind, expressed or implied, as to
+// its fitness for any particular use.
+//
+// Created 8-22-90
+//
+// C++ "linkage" directive - tells the C++ compiler that the following
+// interface files contain Objective-C code.
+
+extern "Objective-C"
+{
+#import <appkit/Application.h>
+#import <appkit/Panel.h>
+#import <appkit/TextField.h>
+#import <appkit/Button.h>
+}
+
+extern "C"
+{
+#import <appkit/publicWraps.h>
+#import <objc/error.h>
+#import <objc/NXStringTable.h>
+#import <strings.h>
+}
+
+// The C++ "linkage" directive serves two purposes (when importing
+// interface files that contain straight ANSI-C/Objective-C code). It:
+//
+// (a) allows you to link with libraries that have not been compiled with
+// the C++ compiler. Since libraries on the NeXT computer are compiled
+// with the Objective-C compiler (cc, not cc++), you must use the C++
+// linkage directive when importing interface files that represent NeXT
+// libraries (or any library that is not compiled with cc++).
+//
+// (b) tells the compiler to ignore C++ keywords that will result in
+// syntax errors when importing ANSI-C/Objective-C interface files.
+// The linkage directive essentially tells the C++ compiler to treat
+// keywords (such as "new", "delete", etc.) as normal identifiers.
+
+#import "SimpleCalc.h"
+#import "CalcEngine.h"
+#import "InfoManager.h"
+
+@implementation SimpleCalc
+
+// Initialize an instance of the SimpleCalc class. One instance variable of
+// that class is the C++ calculator engine.
+- init
+{
+ cplus_object = new CalcEngine; // new is a keyword in C++.
+ previousAction = 0;
+ return self;
+}
+
+// Append a new digit entered by the user to the text field display.
+- appendToDisplay:(const char *)theDigit
+{
+ char *copyOfDisplay = NXCopyStringBuffer([display stringValue]);
+
+ [display setStringValue: strcat(copyOfDisplay, theDigit)];
+
+ return self;
+}
+
+// We need to keep a history of one action to make decisions about the display.
+- registerAction:(SEL)action
+{
+ previousAction = action;
+ return self;
+}
+
+// The user has pushed the decimal key on the calculator.
+- decimalKey:sender
+{
+ if (previousAction == @selector(operationKeys:))
+ [display setStringValue:"."];
+ else {
+ if (strchr([display stringValue], '.'))
+ NXBeep();
+ else
+ [self appendToDisplay:"."];
+ }
+ return [self registerAction:_cmd];
+}
+
+// One of the number keys was selected by the user.
+- numberKeys:sender
+{
+ char aDigit[2];
+ int digit = [sender selectedTag];
+
+ sprintf(aDigit, "%d", digit);
+
+ if (previousAction == @selector(operationKeys:) ||
+ previousAction == @selector(equalsKey:))
+ {
+ [display setStringValue:aDigit];
+ } else {
+ if ([display doubleValue] == 0 && !strchr([display stringValue], '.'))
+ [display setStringValue:aDigit];
+ else
+ [self appendToDisplay:aDigit];
+ }
+ return [self registerAction:_cmd];
+}
+
+// The user pressed the equals key on the calculator interface.
+- equalsKey:sender
+{
+ if (previousAction == 0)
+ NXBeep();
+ else {
+ NX_DURING
+ [display setDoubleValue:
+ cplus_object->equalsKey([display doubleValue])];
+ NX_HANDLER
+ NXRunAlertPanel(
+ [myNXStringTable valueForStringKey:"operationFailed"],
+ [myNXStringTable valueForStringKey:NXLocalHandler.data1],
+ [myNXStringTable valueForStringKey:"OK"], NULL, NULL);
+ NX_ENDHANDLER
+ }
+ return [self registerAction:_cmd];
+}
+
+// The user pressed one of the operation keys.
+- operationKeys:sender
+{
+ if (previousAction == 0)
+ NXBeep();
+ else if (previousAction == @selector(operationKeys:))
+ cplus_object->setOperation([sender selectedTag]);
+ else {
+ NX_DURING
+ [display setDoubleValue:
+ cplus_object->operationKeys([sender selectedTag],
+ [display doubleValue])];
+ NX_HANDLER
+ NXRunAlertPanel(
+ [myNXStringTable valueForStringKey:"operationFailed"],
+ [myNXStringTable valueForStringKey:NXLocalHandler.data1],
+ [myNXStringTable valueForStringKey:"OK"], NULL, NULL);
+ NX_ENDHANDLER
+ }
+ return [self registerAction:_cmd];
+}
+
+// User pressed the Clear key.
+- clearKey:sender
+{
+ [display setStringValue:"0"];
+ return self;
+}
+
+// User pressed the Clear All key.
+- clearAllKey:sender
+{
+ cplus_object->clear();
+ [self registerAction:0];
+ return [self clearKey:sender];
+}
+
+// Called just after the application initializes and starts up.
+- appDidInit:sender
+{
+ // Set the Enter key on the keypad to be equivalent to the = key.
+ [[display window] addToEventMask:NX_SYMBOLSET];
+ [enterKey setKeyEquivalent:3];
+ [[display window] makeKeyAndOrderFront:self];
+ return self;
+}
+
+// Called just before the window closes.
+- windowWillClose:sender
+{
+ return [NXApp terminate:self];
+}
+
+// Brings up the Info panel. Not done on startup because it's in a separate
+// interface file. Saves startup time for the user if we do this when they ask
+// for it, and not before.
+- infoPanel:sender
+{
+ if(infoManager == nil){
+ infoManager = [[InfoManager alloc] init];
+ }
+ [infoManager orderInfoPanelFront:sender];
+ return self;
+}
+
+// Brings up the Help panel. Not done on startup because it's in a separate
+// interface file. Saves startup time for the user if we do this when they ask
+// for it, and not before.
+- helpPanel:sender
+{
+ if(infoManager == nil){
+ infoManager = [[InfoManager alloc] init];
+ }
+ [infoManager orderHelpPanelFront:sender];
+ return self;
+}
+
+@end
diff --git a/test/etags/pas-src/common.pas b/test/etags/pas-src/common.pas
new file mode 100644
index 00000000000..ec8e80c4a7a
--- /dev/null
+++ b/test/etags/pas-src/common.pas
@@ -0,0 +1,1545 @@
+#include "common.i"
+#include "common.h"
+
+type
+ NSPoolP = ^NSPoolRec;
+ NSPoolRec = record
+ Data: NameStringPointer;
+ Next: NSPoolP;
+ end;
+
+var
+ GlobalNSPool: record
+ Avail, Empty: NSPoolP;
+ end;
+
+var
+ AvailString : TextString;
+ NameList : BinNodePointer;
+ AvailNameList : BinNodePointer;
+
+
+
+(*------------------------------------------------------------------*)
+(* InitializeStringPackage *)
+(*------------------------------------------------------------------*)
+procedure InitializeStringPackage;
+begin (* InitializeStringPackage *)
+ AvailString := nil;
+end; (* InitializeStringPackage *)
+
+(*------------------------------------------------------------------*)
+(* newtextstring *)
+(*------------------------------------------------------------------*)
+function newtextstring; (*: TextString;*)
+var
+ Temp : TextString;
+begin (* newtextstring *)
+ if AvailString = nil then
+ new (Temp)
+ else begin
+ Temp := AvailString;
+ AvailString := Temp^.Next;
+ end;
+ Temp^.String.Length := 0;
+ Temp^.Next := nil;
+ newtextstring := Temp;
+end; (* newtextstring *)
+
+(*------------------------------------------------------------------*)
+(* disposetextstring *)
+(*------------------------------------------------------------------*)
+procedure disposetextstring;(*(
+ var S : TextString);*)
+var
+ Temp : TextString;
+ Temp2 : TextString;
+begin (* disposetextstring *)
+ if S <> nil then begin
+ Temp := S;
+(*
+ while Temp^.Next <> nil do
+ Temp := Temp^.Next;
+ Temp^.Next := AvailString;
+ AvailString := S;
+*)
+ S := nil;
+ repeat
+ Temp2 := Temp^.Next;
+ dispose(Temp);
+ Temp := Temp2;
+ until Temp = nil;
+ end;
+end; (* disposetextstring *)
+
+(*------------------------------------------------------------------*)
+(* ConcatT *)
+(*------------------------------------------------------------------*)
+function ConcatT;(*(
+ ToString : TextString;
+ S : TextString) : TextString;*)
+var
+ Index : integer;
+begin (* ConcatT *)
+ ConcatT := ToString;
+ if ToString = nil then
+ writeln (output, 'Error in ConcatT, ToString is nil')
+ else
+ if S = nil then
+ writeln (output, 'Error in ConcatT, S is nil')
+ else
+ if S^.Next <> nil then
+ writeln (output,
+ 'Error in ConcatT, S contains several linked TextStrings')
+ else begin
+ while ToString^.Next <> nil do
+ ToString := ToString^.Next;
+ if ToString^.String.Length+S^.String.Length > NameStringLength then begin
+ ToString^.Next := newtextstring;
+ ToString := ToString^.Next;
+ end;
+ with ToString^, String do begin
+ for Index := 1 to S^.String.Length do
+ Value[Length+Index] := S^.String.Value[Index];
+ Length := Length+S^.String.Length;
+ end;
+ end;
+end; (* ConcatT *)
+
+(*------------------------------------------------------------------*)
+(* AppendTextString *)
+(*------------------------------------------------------------------*)
+function AppendTextString;(*(
+ ToString : TextString;
+ S : TextString) : TextString;*)
+begin (* AppendTextString *)
+ AppendTextString := ToString;
+ if ToString = nil then
+ writeln (output, 'Error in AppendTextString, ToString is nil')
+ else
+ if S = nil then
+ writeln (output, 'Error in AppendTextString, S is nil')
+ else begin
+ while ToString^.Next <> nil do
+ ToString := ToString^.Next;
+ ToString^.Next := S;
+ end;
+end; (* AppendTextString *)
+
+(*------------------------------------------------------------------*)
+(* CopyTextString *)
+(*------------------------------------------------------------------*)
+function CopyTextString;(*(
+ S : TextString
+ ) : TextString;*)
+var
+ Temp : TextString;
+begin (* CopyTextString *)
+ if S <> nil then begin
+ Temp := newtextstring;
+ Temp^.String := S^.String;
+ Temp^.Next := CopyTextString(S^.Next);
+ CopyTextString := Temp;
+ end
+ else
+ CopyTextString := nil;
+end; (* CopyTextString *)
+
+(*------------------------------------------------------------------*)
+(* CONVERT_CHARSTRING_TO_VALUE *)
+(*------------------------------------------------------------------*)
+procedure CONVERT_CHARSTRING_TO_VALUE;(*(
+ S : NameString;
+ var V : NameString);*)
+var
+ Pos : integer;
+ VPos : integer;
+ Ch : char;
+begin (* CONVERT_CHARSTRING_TO_VALUE *)
+ VPos := 0;
+ for Pos := 2 to S.Length - 1 do begin
+ Ch := S.Value[Pos];
+ if not ((Ch = '''') and (Pos > 2) and (S.Value[Pos - 1] = '''')) then
+ VPos := VPos + 1;
+ V.Value[VPos] := Ch;
+ end;
+ V.Length := VPos;
+end; (* CONVERT_CHARSTRING_TO_VALUE *)
+
+(*------------------------------------------------------------------*)
+(* append_string *)
+(*------------------------------------------------------------------*)
+procedure append_string;(*(
+ var Txt : TextString;
+ var String : NameString);*)
+var
+ Temp : TextString;
+begin (* append_string *)
+ Temp := newtextstring;
+ Temp^.String := String;
+ if Txt = nil then
+ Txt := Temp
+ else
+ Txt := AppendTextString(Txt, Temp);
+end; (* append_string *)
+
+function To_Upper;(*(ch:char) : char;*)
+begin
+ if ch in ['a'..'z'] then
+ To_Upper := chr(ord(ch) + ord('A')-ord('a'))
+ else
+ To_Upper := ch;
+end;
+
+function To_Lower;(*(ch:char) : char;*)
+begin
+ if ch in ['A'..'Z'] then
+ To_Lower := chr(ord(ch) - ord('A') + ord('a'))
+ else
+ To_Lower := ch;
+end;
+
+(*----------------------------------------------------------------------*)
+(* Operations on NameString *)
+(*----------------------------------------------------------------------*)
+
+(*------------------------------------------------------------------*)
+(* EmptyNmStr *)
+(*------------------------------------------------------------------*)
+function EmptyNmStr(* : NameString*);
+var
+ Nm : NameString;
+begin (* EmptyNmStr *)
+ Nm.Length := 0;
+ EmptyNmStr := Nm;
+end; (* EmptyNmStr *)
+
+
+(* returns a namestring containing one character, the inparameter Ch *)
+function chartonmstr; (*(
+ Ch : Char) : NameString; *)
+var
+ String : NameString;
+begin
+ String.Value[1] := Ch;
+ String.Length := 1;
+ chartonmstr := String;
+end;
+
+(* returns a namestring containing the inparameter Str in lowercase letters *)
+function LowerCaseNmStr; (*(
+ Str : NameString) : NameString; *)
+var
+ i : integer;
+begin (* LowerCaseNmStr *)
+ with Str do
+ for i := 1 to Length do
+ Value[i] := To_Lower(Value[i]);
+ LowerCaseNmStr := Str;
+end; (* LowerCaseNmStr *)
+
+(* returns a namestring containing inparameter S1 concatenated with inpar. S2 *)
+function concatenatenamestrings; (*(
+ S1 : NameString;
+ S2 : NameString) : NameString; *)
+var
+ Temp : NameString;
+ Pos : integer;
+begin (* concatenatenamestrings *)
+ Temp := S1;
+ with Temp do begin
+ Pos := 0;
+ while Pos < S2.Length do begin
+ Pos := Pos + 1;
+ if Length < NameStringLength then begin
+ Length := Length + 1;
+ Value[Length] := S2.Value[Pos];
+ end;
+ end; (* while *)
+ end; (* with *)
+ concatenatenamestrings := Temp;
+end; (* concatenatenamestrings *)
+
+procedure writenamestring;(*(
+ var TextFile : text;
+ var Name : NameString);*)
+var
+ Pos : integer;
+begin
+ with Name do
+ for Pos := 1 to Length do
+ write(TextFile, Value[Pos]);
+end;
+
+(*------------------------------------------------------------------*)
+(* IsControlChar *)
+(*------------------------------------------------------------------*)
+function IsControlChar; (*(
+ Ch : char) : boolean; *)
+begin (* IsControlChar *)
+ IsControlChar := ord(Ch) in [0..32, 127];
+end; (* IsControlChar *)
+
+function namestringequal;(*(var Name1,Name2 : NameString) : Boolean;*)
+var i : Integer;
+ equal : Boolean;
+begin
+ if Name1.Length = Name2.Length then begin
+ equal := true;
+ i := 1;
+ while (i <= Name1.Length) and equal do begin
+ equal := To_Upper(Name1.Value[i]) = To_Upper(Name2.Value[i]);
+ i := i + 1;
+ end;
+ namestringequal := equal;
+ end
+ else
+ namestringequal := false;
+end;
+
+(* Character strings are case sensitive *)
+
+function NameStringLess;(*(var Name1,Name2 : NameString) : Boolean;*)
+var i, minlength : Integer;
+ equal : Boolean;
+ C1, C2 : char;
+ Charstring : boolean;
+begin
+ C1 := ' ';
+ C2 := ' ';
+ if Name1.Length < Name2.Length then
+ minlength := Name1.Length
+ else
+ minlength := Name2.Length;
+ if MinLength > 0 then
+ Charstring := (Name1.Value[1] = '''') or (Name2.Value[1] = '''')
+ else
+ Charstring := false;
+(* Charstring := true; force case sensitive *)
+ i := 1;
+ equal := true;
+ if i <= minlength then
+ while (i <= minlength) and equal do begin
+ if Charstring then begin
+ C1 := Name1.Value[i];
+ C2 := Name2.Value[i];
+ end
+ else begin
+ C1 := To_Upper(Name1.Value[i]);
+ C2 := To_Upper(Name2.Value[i]);
+ end;
+ equal := C1 = C2;
+ i := i + 1;
+ end; (* while *)
+ if equal then
+ NameStringLess := Name1.Length < Name2.Length
+ else
+ NameStringLess := C1 < C2;
+end;
+
+(*------------------------------------------------------------------*)
+(* IsControlCharName *)
+(*------------------------------------------------------------------*)
+function IsControlCharName(
+ Str : NameString;
+ Pos : integer) : boolean;
+begin (* IsControlCharName *)
+ with Str do begin
+ if Pos <= Length then
+ IsControlCharName := IsControlChar(Value[Pos])
+ else
+ IsControlCharName := false;
+ end;
+end; (* IsControlCharName *)
+
+(*------------------------------------------------------------------*)
+(* SubString *)
+(*------------------------------------------------------------------*)
+function SubString; (*(
+ Str : NameString;
+ Start : integer;
+ Len : integer) : NameString; *)
+var
+ i : integer;
+begin (* SubString *)
+ with Str do begin
+ if Len > 0 then
+ for i := Start to Start + Len - 1 do
+ Value[i- Start + 1] := Value[i]
+ else if Len < 0 then
+ Len := 0;
+ Length := Len;
+ end;
+ SubString := Str;
+end; (* SubString *)
+
+(*------------------------------------------------------------------*)
+(* SkipChars *)
+(*------------------------------------------------------------------*)
+function SkipChars; (*(
+ Str : NameString;
+ Start : integer;
+ Len : integer) : NameString; *)
+var
+ i : integer;
+begin (* SkipChars *)
+ with Str do begin
+ for i := Start to Length - Len do
+ Value[i] := Value[i + Len];
+ Length := Length - Len;
+ end;
+ SkipChars := Str;
+end; (* SkipChars *)
+
+(*------------------------------------------------------------------*)
+(* RemoveUnderlineControl *)
+(*------------------------------------------------------------------*)
+function RemoveUnderlineControl; (*(
+ Str : NameString) : NameString; *)
+var
+ Len : integer;
+ i : integer;
+ Start : integer;
+begin (* RemoveUnderlineControl *)
+ with Str do begin
+ i := 1;
+ while i <= Length do begin
+ if Value[i] = '_' then begin
+ Len := 0;
+ Start := i;
+ while IsControlCharName(Str, i + 1 + Len) do
+ Len := Len + 1;
+ if Len > 0 then
+ Str := SkipChars(Str, Start, Len + 1)
+ else
+ i := i + 1;
+ end
+ else
+ i := i + 1;
+ end; (* while *)
+ end; (* with *)
+ RemoveUnderlineControl := Str;
+end; (* RemoveUnderlineControl *)
+
+(*------------------------------------------------------------------*)
+(* First100Chars *)
+(*------------------------------------------------------------------*)
+procedure First100Chars; (*(
+ Txt : TextString;
+ var Str : NameString;
+ var Truncated : boolean); *)
+var
+ Len : integer;
+ i : integer;
+begin (* First100Chars *)
+ Str.Length := 0;
+ if Txt <> nil then begin
+ Str := Txt^.String;
+ Txt := Txt^.Next;
+ end;
+ while (Txt <> nil) and (Str.Length < NameStringLength) do
+ with Txt^, String do begin
+ Str.Length := Str.Length + 1;
+ Str.Value[Str.Length] := ' ';
+ if Str.Length + Length <= NameStringLength then
+ Len := Str.Length + Length
+ else
+ Len := NameStringLength;
+ for i := Str.Length + 1 to Len do
+ Str.Value[i] := Value[i - Str.Length];
+ Str.Length := Len;
+ Txt := Txt^.Next;
+ end; (* while with *)
+ Truncated := Txt <> nil;
+end; (* First100Chars *)
+
+
+(*------------------------------------------------------------------*)
+(* SkipSpaces *)
+(*------------------------------------------------------------------*)
+(* changes I to contain the first index in Str (starting at I) that *)
+(* is not a space *)
+procedure SkipSpaces; (* (Str : NameString; var I : Integer);*)
+var Stop : boolean;
+begin (* SkipSpaces *)
+ Stop := false;
+ while (I < Str.Length) and not Stop do
+ if Str.Value[I] <> ' ' then
+ Stop := true
+ else
+ I := I+1;
+end; (* SkipSpaces *)
+
+
+(*------------------------------------------------------------------*)
+(* SkipBlanks *)
+(*------------------------------------------------------------------*)
+function SkipBlanks; (*(
+ TextLine: NameString) : NameString; *)
+var
+ i : integer;
+ j : integer;
+ SpaceFound : boolean;
+begin (* SkipBlanks *)
+ with TextLine do begin
+ SpaceFound := true;
+ i := 1;
+ while SpaceFound and (i <= Length) do begin
+ SpaceFound := (Value[i] in [' ', chr(9)]);
+ if SpaceFound then
+ i := i + 1;
+ end; (* while *)
+ i := i - 1;
+ if i > 0 then
+ for j := 1 to Length - i do
+ if j <= Length - i then
+ Value[j] := Value[j + i];
+ Length := Length - i;
+ end; (* with *)
+ SkipBlanks := TextLine;
+end; (* SkipBlanks *)
+
+(*------------------------------------------------------------------*)
+(* stripname *)
+(*------------------------------------------------------------------*)
+function stripname; (* (
+ TextLine: NameString) : NameString; *)
+var
+ SpaceFound : boolean;
+begin (* stripname *)
+ TextLine := SkipBlanks(TextLine);
+ with TextLine do begin
+ SpaceFound := true;
+ while SpaceFound and (Length > 0) do begin
+ SpaceFound := (Value[Length ] in [' ', chr(9)]);
+ if SpaceFound then
+ Length := Length - 1;
+ end; (* while *)
+ end; (* with *)
+ stripname := TextLine;
+end; (* stripname *)
+
+function Locate; (*(
+ Str : NameString;
+ Chars : SetOfChar) : integer; *)
+var
+ Pos : integer;
+ Found : boolean;
+begin (* Locate *)
+ Found := false;
+ Pos := 0;
+ with Str do
+ while not Found and (Pos < Length) do begin
+ Pos := Pos + 1;
+ Found := Value[Pos] in Chars;
+ end;
+ Locate := Pos;
+end; (* Locate *)
+
+
+(*------------------------------------------------------------------*)
+(* NameHasChar *)
+(*------------------------------------------------------------------*)
+function NameHasChar; (* (TheName : NameString; TheChar : char) : boolean;*)
+var i : integer;
+ found : boolean;
+
+begin (* NameHasChar *)
+ found := false;
+ i := 0;
+ while not found and (i < TheName.Length) do begin
+ i := i+1;
+ found := TheName.Value[i] = TheChar;
+ end;
+ NameHasChar := found;
+end; (* NameHasChar *)
+
+
+(*------------------------------------------------------------------*)
+(* integertonmstr *)
+(*------------------------------------------------------------------*)
+function integertonmstr; (* (TheInteger : integer) : NameString; *)
+var Nm : NameString;
+ Index,
+ Size,
+ TempNumber : integer;
+begin (* integertonmstr *)
+ Size := 1;
+ TempNumber := TheInteger;
+ while TempNumber div 10 > 0 do begin
+ Size := Size + 1;
+ TempNumber := TempNumber div 10;
+ end;
+ Nm.Length := Size;
+ TempNumber := TheInteger;
+ for Index := Size downto 1 do begin
+ Nm.Value[Index] := chr(TempNumber mod 10 + ord('0'));
+ TempNumber := TempNumber div 10;
+ end;
+ integertonmstr := Nm;
+end; (* integertonmstr *)
+
+(*------------------------------------------------------------------*)
+(* NmStrToInteger *)
+(*------------------------------------------------------------------*)
+function NmStrToInteger; (* (Str : NameString) : integer; *)
+var
+ Index : integer;
+ Numb : integer;
+ Max : integer;
+begin (* NmStrToInteger *)
+ Max := (maxint div 10) - 10;
+ Numb := 0;
+ for Index := 1 to Str.Length do begin
+ if (Numb <= Max) and (Str.Value[Index] in ['0'..'9']) then
+ Numb := 10 * Numb + ord(Str.Value[Index]) - ord('0');
+ end;
+ NmStrToInteger := Numb;
+end; (* NmStrToInteger *)
+
+function AddNullToNmStr; (*(
+ Nm : NameString) : NameString; *)
+begin (* AddNullToNmStr *)
+ with Nm do
+ if Length < NameStringLength then
+ Value[Length + 1] := chr(0)
+ else
+ Value[Length] := chr(0);
+ AddNullToNmStr := Nm;
+end; (* AddNullToNmStr *)
+
+function ValToNmStr; (*(
+ Nm : NameString) : NameString; *)
+begin (* ValToNmStr *)
+ with Nm do begin
+ length := 0;
+ while value[length + 1] <> chr(0) do
+ length := length + 1;
+ end;
+ ValToNmStr := Nm;
+end; (* ValToNmStr *)
+
+(*------------------------------------------------------------------*)
+(* ChangeFileType *)
+(*------------------------------------------------------------------*)
+function ChangeFileType; (*(FileName : NameString;
+ NewType : NameString) : NameString;*)
+var
+ Pos : integer;
+ Found : boolean;
+begin (* ChangeFileType *)
+ with Filename do begin
+ Pos := FileName.Length;
+ Found := false;
+ while not Found and (Pos > 0) do begin
+ Found := Value[Pos] = '.';
+ Pos := Pos - 1;
+ end;
+ if Found then
+ Length := Pos;
+ end; (* with *)
+ ChangeFileType := concatenatenamestrings(FileName, NewType);
+end; (* ChangeFileType*)
+
+(*------------------------------------------------------------------*)
+(* StripPath *)
+(*------------------------------------------------------------------*)
+function StripPath; (*(
+ Str : NameString) : NameString; *)
+var
+ i : integer;
+ Len : integer;
+ Found : boolean;
+begin (* StripPath *)
+ with Str do begin
+ i := Length;
+ Found := false;
+ while not Found and (i > 0) do begin
+ Found := Value[i] in ['/', '\'];
+ if not Found then
+ i := i - 1;
+ end; (* while *)
+ if Found then begin
+ Len := Length - i + 1;
+ if i < Length then begin
+ i := i + 1;
+ Len := Len - 1;
+ end;
+ StripPath := SubString(Str, i, Len);
+ end
+ else
+ StripPath := Str;
+ end; (* with *)
+end; (* StripPath *)
+
+function ReprOfChar; (*( ch : char) : NameString;*)
+var
+ Repr : NameString;
+begin
+ if (ch >= ' ') and (ch <= '~') then
+ Repr := chartonmstr(ch)
+ else
+ Repr := concatenatenamestrings(concatenatenamestrings(chartonmstr('<'),
+ integertonmstr(ord(ch))), chartonmstr('>'));
+ ReprOfChar := Repr;
+end; (* ReprOfChar *)
+
+(*------------------------------------------------------------------*)
+(* ExtractCommentInfo *)
+(*------------------------------------------------------------------*)
+(* check if Comment contains graphic reference or include directive *)
+(* /*#<graphref>*/ or /*#<include-dir>*/ *)
+(* <graphref> =G pagename xcoord ycoord *)
+(* T pagename xcoord ycoord *)
+(* M diagramtype diagramname pagename xcoord ycoord *)
+(* D databankname *)
+(* <include-dir> =INCLUDE 'filename' *)
+(* InfoType will contain the type of the comment *)
+(* Info will contain <graphref> or the filename in <include-dir> if *)
+(* the Comment isn't an ordinary comment *)
+(* /*#E*/ do not count this line *)
+(* /*#S*/ substructure generated from graphic short hand *)
+procedure ExtractCommentInfo; (*(
+ var Comment,
+ Info : NameString;
+ var InfoType : TypeOfComment); *)
+
+const
+ CommentMarkLength = 2;
+ IncludeMarkLength = 7; (* = INCLUDE *)
+ GRRefLen = 6;
+var StartIndex,
+ Index : integer;
+begin (* ExtractCommentInfo *)
+ Info.Length := 0;
+ with Comment do begin
+ InfoType := Ordinary;
+ StartIndex := CommentMarkLength + 1;
+ if Length > StartIndex then
+ if Value[StartIndex] = '#' then
+ if Value[StartIndex+1] in ['I','i', 'S'] then begin
+ if (Value[StartIndex+1] = 'S') and (Length = StartIndex+1+2) then
+ InfoType := SubstrShortHand
+ else if (Value[StartIndex+1] = 'S') and
+ (Length > StartIndex + GRRefLen) then begin
+ if Value[StartIndex+2] = 'D' then
+ if Value[StartIndex+3] = 'T' then
+ if Value[StartIndex+4] = 'R' then
+ if Value[StartIndex+5] = 'E' then
+ if Value[StartIndex+6] = 'F' then
+ InfoType := GRRef;
+ end
+ else begin
+ if Length > StartIndex + IncludeMarkLength then
+ if Value[StartIndex+2] in ['N','n'] then
+ if Value[StartIndex+3] in ['C','c'] then
+ if Value[StartIndex+4] in ['L','l'] then
+ if Value[StartIndex+5] in ['U','u'] then
+ if Value[StartIndex+6] in ['D','d'] then
+ if Value[StartIndex+7] in ['E','e'] then
+ InfoType := IncludeClause;
+ end;
+ end;
+
+ if InfoType = IncludeClause then begin
+ InfoType := Ordinary;
+ StartIndex := StartIndex + IncludeMarkLength + 1;
+ if StartIndex+3 <= Length-2 then (* excluding the comment-end '*/' *) begin
+ if Value[StartIndex] = ' ' then begin
+ while (StartIndex <= Length-2) and (Value[StartIndex] = ' ') do
+ StartIndex := StartIndex + 1; (* Skip the spaces *)
+ if Value[StartIndex] = '''' then begin
+ Index := StartIndex+1;
+ while (Index <= Length-2) and (Value[Index] <> '''') do begin
+ Info.Value[Index-StartIndex] := Value[Index];
+ Index := Index + 1;
+ end;
+ if Value[Index] = '''' then begin
+ Info.Length := Index - StartIndex - 1;
+ Index := Index + 1;
+ while (Index <= Length-2) and (Value[Index] = ' ') do
+ Index := Index + 1; (* Skip the ending spaces *)
+ if Index = Length-1 then
+ InfoType := IncludeClause; (* => a correct include directive *)
+ end;
+ end;
+ end;
+ end;
+ end
+ else if InfoType = SubstrShortHand then
+ Info := chartonmstr('S')
+ else if InfoType = GRRef then begin
+ if (Value[Length] = '/') and (Value[Length - 1] = '*') then
+ Info := SubString(Comment, StartIndex, Length - StartIndex + 1 - 2)
+ else (* truncated *)
+ Info := SubString(Comment, StartIndex, Length - StartIndex + 1);
+ end;
+ end;
+end; (* ExtractCommentInfo *)
+
+(*---------------------------------------------------------------------------*)
+(* inserts a node in a binary tree sorted after value. If node
+ is in tree Found returns true. *)
+
+procedure INSERT_TREE_NODE;(*(
+ New_node: BinNodePointer; node to insert
+ var Node: BinNodePointer; tree to insert in
+ var FoundNode : BinNodePointer;
+ var Found : boolean; return status of operation
+ var Higher: boolean); returned true if the subtree height has
+ increased *)
+
+var
+
+ Node_1, (* helpvariable to rotate nodes *)
+ Node_2: BinNodePointer; (* helpvariable to rotate nodes *)
+
+begin
+
+ if Node = nil then
+ begin (* Value is not in tree, insert *)
+ Node:= New_node;
+ FoundNode := Node;
+ Higher:= true;
+ end
+ else
+
+ (* New_node^.Value < Node^.Value *)
+ if NameStringLess(New_node^.NameP^, Node^.NameP^) then
+ begin (* New Value is lower than actual Value *)
+ INSERT_TREE_NODE( New_node, Node^.left, FoundNode, Found, Higher);
+
+ if Higher then (* left bransch has grown higher *)
+ case Node^.bal of
+
+ 1: begin
+ Node^.bal:= 0;
+ Higher:= false;
+ end;
+
+ 0: begin
+ Node^.bal:= -1;
+ end;
+
+ -1: begin (* rebalance *)
+ Node_1:= Node^.left;
+
+ if Node_1^.bal = -1 then
+ begin (* single LL rotation *)
+ Node^.left:= Node_1^.right;
+ Node_1^.right:= Node;
+ Node^.bal:= 0;
+ Node:= Node_1;
+ end
+ else
+
+ begin (* double LR rotation *)
+ Node_2:= Node_1^.right;
+ Node_1^.right:= Node_2^.left;
+ Node_2^.left:= Node_1;
+ Node^.left:= Node_2^.right;
+ Node_2^.right:= Node;
+
+ if Node_2^.bal = -1 then
+ Node^.bal:= 1
+ else
+ Node^.bal:= 0;
+
+ if Node_2^.bal = 1 then
+ Node_1^.bal:= -1
+ else
+ Node_1^.bal:= 0;
+ Node:= Node_2;
+ end;
+ Node^.bal:= 0;
+ Higher:= false;
+ end;
+ end; (* end case Node^.bal of *)
+ end
+ else
+
+ (* New_node^.value > Node^.value *)
+ if NameStringLess(Node^.NameP^, New_Node^.NameP^) then
+ begin (* New value is higher than actual value *)
+ INSERT_TREE_NODE( New_node, Node^.right, FoundNode, Found, Higher);
+
+ if Higher then (* Right bransch has grown higher *)
+ case Node^.bal of
+
+ -1: begin
+ Node^.bal:= 0;
+ Higher:= false;
+ end;
+
+ 0: begin
+ Node^.bal:= 1;
+ end;
+
+ 1: begin (* Rebalance *)
+ Node_1:= Node^.right;
+
+ if Node_1^.bal = 1 then
+ begin (* single RR rotation *)
+ Node^.right:= Node_1^.left;
+ Node_1^.left:= Node;
+ Node^.bal:= 0;
+ Node:= Node_1;
+ end
+ else
+ begin (* double RL rotation *)
+ Node_2:= Node_1^.left;
+ Node_1^.left:= Node_2^.right;
+ Node_2^.right:= Node_1;
+ Node^.right:= Node_2^.left;
+ Node_2^.left:= Node;
+
+ if Node_2^.bal = 1 then
+ Node^.bal:= -1
+ else
+ Node^.bal:= 0;
+
+ if Node_2^.bal = -1 then
+ Node_1^.bal:= 1
+ else
+ Node_1^.bal:= 0;
+ Node:= Node_2;
+ end;
+ Node^.bal:= 0;
+ Higher:= false;
+ end;
+ end; (* end case Node^.bal of *)
+ end
+ else
+ begin (* New value is equal to actual value *)
+ Found := true;
+ FoundNode := Node;
+ Higher:= false;
+ end;
+end; (* end INSERT_TREE_NODE *)
+
+function GetNameList; (* : BinNodePointer;*)
+begin
+ GetNameList := NameList;
+end;
+
+procedure DisposeANameList(
+ var NodeP : BinNodePointer);
+begin (* DisposeANameList *)
+ if NodeP <> nil then begin
+ DisposeANameList(NodeP^.Left);
+ DisposeANameList(NodeP^.Right);
+ NodeP^.Left := AvailNameList;
+ NodeP^.Right := nil;
+ AvailNameList := NodeP;
+ NodeP := nil;
+ end;
+end; (* DisposeANameList *)
+
+procedure DisposeNameList;
+begin
+ DisposeANameList(NameList);
+end;
+
+function GetNewNameListNode;(*(
+ var Name : NameString) : BinNodePointer;*)
+var
+ NodeP : BinNodePointer;
+begin (* GetNewNameListNode *)
+ if AvailNameList = nil then begin
+ new(NodeP);
+ with NodeP^ do begin
+ Left := nil;
+ Right := nil;
+ Bal := 0;
+ new(NameP);
+ Namep^ := Name;
+ end;
+ end
+ else begin
+ NodeP := AvailNameList;
+ AvailNameList := NodeP^.Left;
+ with NodeP^ do begin
+ Left := nil;
+ Bal := 0;
+ Namep^ := Name;
+ end;
+ end;
+ GetNewNameListNode := NodeP;
+end; (* GetNewNameListNode *)
+
+(*---------------------------------------------------------------------------*)
+
+function insertname;(*(
+ Name : NameString;
+ var Found : boolean) : NameStringPointer;*)
+var
+ Higher : boolean;
+ NodeP : BinNodePointer;
+ FoundNode : BinNodePointer;
+begin (* insertname *)
+ NodeP := GetNewNameListNode(Name);
+ Found := false;
+ INSERT_TREE_NODE(NodeP, NameList, FoundNode, Found, Higher);
+ insertname := FoundNode^.NameP;
+ if Found then
+ DisposeANameList(NodeP);
+end; (* insertname *)
+
+procedure InitNameList;
+begin
+ NameList := nil;
+ AvailNameList := nil;
+end;
+
+(********************************************************************)
+(* NameString - Dynamic Memory Allocation *)
+(********************************************************************)
+
+procedure InitNameStringPool;
+begin
+ GlobalNSPool.Avail := nil;
+ GlobalNSPool.Empty := nil;
+end;
+
+procedure NewNameString; (* (var NSP: NameStringPointer );*)
+(*var Temp: NSPoolP;*)
+begin
+(*
+ if GlobalNSPool.Avail=nil then
+ new( NSP )
+ else begin
+ Temp := GlobalNSPool.Avail;
+ GlobalNSPool.Avail := Temp^.Next;
+ Temp^.Next := GlobalNSPool.Empty;
+ GlobalNSPool.Empty := Temp;
+ NSP := Temp^.Data;
+ end;
+*)
+ new(NSP);
+ NSP^.Length := 0;
+end;
+
+procedure ReleaseNameString; (* (var NSP: NameStringPointer );*)
+(*var Temp: NSPoolP;*)
+begin
+ if NSP <> nil then begin
+(*
+ if GlobalNSPool.Empty=nil then begin
+ new(Temp);
+ Temp^.Next := GlobalNSPool.Avail;
+ GlobalNSPool.Avail := Temp;
+ end
+ else begin
+ Temp := GlobalNSPool.Empty;
+ GlobalNSPool.Empty := Temp^.Next;
+ Temp^.Next := GlobalNSPool.Avail;
+ GlobalNSPool.Avail := Temp;
+ end;
+ Temp^.Data := NSP;
+*)
+ dispose(NSP);
+ NSP := nil;
+ end;
+end;
+
+procedure SDTrefStringToRec (* (
+ var S : SDTrefString;
+ var R : SDTrefRec;
+ var Error : integer) *) ;
+
+(* Converts SDTrefString S to a record R (SDTrefRec). If an error is
+ detected Error is on exit the position in S where the error where
+ detected. If correct Error is 0. *)
+
+label 99;
+var
+ Len : integer;
+ ErrorFound, EndFound : Boolean;
+
+procedure SDTrefSkipSpaces;
+var Found : Boolean;
+begin
+ Found := false;
+ while not Found and (Len <= S.Length) do
+ if (S.Value[Len] = ' ') or (S.Value[Len] = chr(9)) then
+ Len := Len+1
+ else
+ Found := true;
+end;
+
+function SDTrefIsEnd : Boolean;
+begin
+ SDTrefIsEnd := false;
+ if S.Value[Len] = ')' then
+ begin
+ Len := Len+1;
+ SDTrefSkipSpaces;
+ if Len > S.Length then
+ SDTrefIsEnd := true;
+ end;
+end;
+
+function SDTrefGetInteger : integer;
+var
+ Temp : NameString;
+ Found : Boolean;
+begin
+ Temp.Length := 0;
+ Found := false;
+ while not Found and (Temp.Length <= NameStringLength) and
+ (Len <= S.Length) do
+ if S.Value[Len] in ['0'..'9'] then
+ begin
+ Temp.Length := Temp.Length+1;
+ Temp.Value[Temp.Length] := S.Value[Len];
+ Len := Len+1;
+ end
+ else
+ Found := true;
+ if Temp.Length > 0 then
+ SDTrefGetInteger := NmStrToInteger(Temp)
+ else
+ SDTrefGetInteger := SDTrefUndefInt;
+end;
+
+begin
+ ErrorFound := true;
+ R.IsSDTGR := true;
+ R.FileName.Length := 0;
+ R.PageName.Length := 0;
+ R.ObjectId := SDTrefUndefInt;
+ R.XCoord := SDTrefUndefInt;
+ R.YCoord := SDTrefUndefInt;
+ R.LineNumber := SDTrefUndefInt;
+ R.Column := SDTrefUndefInt;
+
+ Len := 1;
+ if S.Length = 0 then goto 99;
+ if S.Value[1] <> '#' then goto 99;
+ Len := 2;
+ if S.Value[2] <> 'S' then goto 99;
+ Len := 3;
+ if S.Value[3] <> 'D' then goto 99;
+ Len := 4;
+ if S.Value[4] <> 'T' then goto 99;
+ Len := 5;
+ if S.Value[5] <> 'R' then goto 99;
+ Len := 6;
+ if S.Value[6] <> 'E' then goto 99;
+ Len := 7;
+ if S.Value[7] <> 'F' then goto 99;
+ Len := 8;
+ if S.Value[8] <> '(' then goto 99;
+ Len := 9;
+
+ if S.Value[9] = 'S' then
+ begin
+ Len := 10;
+ if S.Value[10] <> 'D' then goto 99;
+ Len := 11;
+ if S.Value[11] <> 'L' then goto 99;
+ Len := 12; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* First comma *)
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* FileName *)
+ EndFound := false;
+ while not EndFound and (Len <= S.Length) do
+ if S.Value[Len] in [',', ')', '(', ' ', chr(9)] then
+ EndFound := true
+ else
+ begin
+ R.FileName.Length := R.FileName.Length+1;
+ if R.FileName.Length > S.Length then goto 99;
+ R.FileName.Value[R.FileName.Length] := S.Value[Len];
+ Len := Len+1;
+ if Len > S.Length then goto 99;
+ end;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* PageName *)
+ if S.Value[Len] = '(' then
+ begin
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ EndFound := false;
+ while not EndFound and (Len <= S.Length) do
+ if S.Value[Len] in [',', ')', '(', ' ', chr(9)] then
+ EndFound := true
+ else
+ begin
+ R.PageName.Length := R.PageName.Length+1;
+ if R.PageName.Length > NameStringLength then goto 99;
+ R.PageName.Value[R.PageName.Length] := S.Value[Len];
+ Len := Len+1;
+ if Len > S.Length then goto 99;
+ end;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if S.Value[Len] <> ')' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ end;
+ if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* ObjectId *)
+ R.ObjectId := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* Object_Coordinates *)
+ if S.Value[Len] = '(' then
+ begin
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ R.XCoord := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ R.YCoord := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if S.Value[Len] <> ')' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ end;
+ if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* LineNumber *)
+ R.LineNumber := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* Column *)
+ R.Column := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if SDTrefIsEnd then ErrorFound := false;
+ end
+
+ else if S.Value[9] = 'T' then
+ begin
+ Len := 10;
+ R.IsSDTGR := false;
+ if S.Value[10] <> 'E' then goto 99;
+ Len := 11;
+ if S.Value[11] <> 'X' then goto 99;
+ Len := 12;
+ if S.Value[12] <> 'T' then goto 99;
+ Len := 13; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* First comma *)
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* FileName *)
+ EndFound := false;
+ while not EndFound and (Len <= S.Length) do
+ if S.Value[Len] in [',', ')', '(', ' ', chr(9)] then
+ EndFound := true
+ else
+ begin
+ R.FileName.Length := R.FileName.Length+1;
+ if R.FileName.Length > S.Length then goto 99;
+ R.FileName.Value[R.FileName.Length] := S.Value[Len];
+ Len := Len+1;
+ if Len > S.Length then goto 99;
+ end;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* LineNumber *)
+ R.LineNumber := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+ if S.Value[Len] <> ',' then goto 99;
+ Len := Len+1; SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+
+ (* Column *)
+ R.Column := SDTrefGetInteger;
+ SDTrefSkipSpaces;
+ if Len > S.Length then goto 99;
+ if SDTrefIsEnd then ErrorFound := false;
+ end;
+
+99:
+ if ErrorFound then
+ Error := Len
+ else
+ Error := 0;
+end;
+
+
+procedure SDTrefRecToString (* (
+ var R : SDTrefRec;
+ var S : SDTrefString) *) ;
+
+(* Converts SDTrefRec R to a string S (SDTrefString). If an error is
+ detected (string is not long enough) S.Length becomes 0 on exit *)
+
+label 99;
+var
+ Len, I : integer;
+ Temp : NameString;
+begin
+ S.Value[1] := '#';
+ S.Value[2] := 'S';
+ S.Value[3] := 'D';
+ S.Value[4] := 'T';
+ S.Value[5] := 'R';
+ S.Value[6] := 'E';
+ S.Value[7] := 'F';
+ S.Value[8] := '(';
+ S.Length := 8;
+ if R.IsSDTGR then
+ begin
+ Temp.Value[1] := 'S';
+ Temp.Value[2] := 'D';
+ Temp.Value[3] := 'L';
+ Temp.Value[4] := ',';
+ Temp.Length := 4;
+ S := Concatenatenamestrings(S, Temp);
+ Len := S.Length;
+ (* FileName *)
+ for I := 1 to R.FileName.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := R.FileName.Value[I];
+ end;
+
+ (* PageName *)
+ if R.PageName.Length > 0 then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := '(';
+ for I := 1 to R.PageName.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := R.PageName.Value[I];
+ end;
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ')';
+ end;
+
+ (* ObjectId *)
+ if R.ObjectId <> SDTrefUndefInt then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ',';
+ Temp := integertonmstr(R.ObjectId);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ end;
+
+ (* Object_Coordinates *)
+ if R.XCoord <> SDTrefUndefInt then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := '(';
+ Temp := integertonmstr(R.XCoord);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ',';
+ Temp := integertonmstr(R.YCoord);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ')';
+ end;
+
+ (* LineNumber *)
+ if R.LineNumber <> SDTrefUndefInt then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ',';
+ Temp := integertonmstr(R.LineNumber);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ end;
+
+ (* Column *)
+ if R.Column <> SDTrefUndefInt then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ',';
+ Temp := integertonmstr(R.Column);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ end;
+
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ')';
+ end
+
+ else (* if PR *)
+
+ begin
+ Temp.Value[1] := 'T';
+ Temp.Value[2] := 'E';
+ Temp.Value[3] := 'X';
+ Temp.Value[4] := 'T';
+ Temp.Value[5] := ',';
+ Temp.Length := 5;
+ S := Concatenatenamestrings(S, Temp);
+ Len := S.Length;
+ (* FileName *)
+ for I := 1 to R.FileName.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := R.FileName.Value[I];
+ end;
+
+ (* LineNumber *)
+ if R.LineNumber <> SDTrefUndefInt then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ',';
+ Temp := integertonmstr(R.LineNumber);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ end;
+
+ (* Column *)
+ if R.Column <> SDTrefUndefInt then
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ',';
+ Temp := integertonmstr(R.Column);
+ for I := 1 to Temp.Length do
+ begin
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := Temp.Value[I];
+ end;
+ end;
+
+ Len := Len+1;
+ if Len > SDTrefStringLength then goto 99;
+ S.Value[Len] := ')';
+ end;
+
+99:
+ if Len > SDTrefStringLength then
+ S.Length := 0
+ else
+ S.Length := Len;
+end;
+
+function NmStrToErrStr;(*(
+ NmStr : NameString) : ErrorString;*)
+var
+ ErrStr : ErrorString;
+ i : integer;
+begin
+ for i := 1 to NmStr.Length do
+ ErrStr.Value[i] := NmStr.Value[i];
+ ErrStr.Length := NmStr.Length;
+ NmStrToErrStr := ErrStr;
+end;
+
+function ErrStrToNmStr;(*(
+ ErrStr : ErrorString) : NameString;*)
+var
+ NmStr : NameString;
+ i : integer;
+ n : integer;
+begin
+ if ErrStr.Length < NameStringLength then
+ n := ErrStr.Length
+ else
+ n := NameStringLength;
+ for i := 1 to n do
+ NmStr.Value[i] := ErrStr.Value[i];
+ NmStr.Length := n;
+ ErrStrToNmStr := NmStr;
+end;
+
+(*------------------------------------------------------------------*)
+(* GetTextRef *)
+(*------------------------------------------------------------------*)
+function GetTextRef;(*(
+ FNm : NameString;
+ Ln : integer;
+ Col : integer) : NameString;*)
+var
+ Ref : SDTrefRec;
+ S : NameString;
+begin(* GetTextRef *)
+ Ref.IsSDTGR := false;
+ Ref.FileName := FNm;
+ Ref.LineNumber := Ln;
+ Ref.Column := Col;
+ SDTrefRecToString(Ref, S);
+ GetTextRef := S;
+end; (* GetTextRef *)
+
+ (* module COMMON *)
diff --git a/test/etags/perl-src/htlmify-cystic b/test/etags/perl-src/htlmify-cystic
new file mode 100644
index 00000000000..de150a72b8f
--- /dev/null
+++ b/test/etags/perl-src/htlmify-cystic
@@ -0,0 +1,382 @@
+#! /uns/bin/perl -w
+
+# htmlify-cystic-l-faq: turn text version of cystic-l faq into html
+# run like this: htmlify-cystic-l-faq < cystic-l-faq-all
+
+# Ron Trueworthy should put the date on the FAQ.
+
+use English;
+use Carp;
+use strict;
+
+my @section_name;
+my @appendix_name;
+
+my @section_toc;
+my @appendix_toc;
+
+my $new_tag = "[NEW]";
+
+if (! -d "faq")
+{ die "Can't find faq directory"; }
+
+# Initially undefined
+my $appendix;
+my $section;
+my $subsection;
+my $subsubsection;
+
+my $this_file_toc = "";
+my %file_tocs;
+
+my @output_files = ();
+my $file_index = 0;
+
+my $output_file;
+
+my $line;
+while (defined($line = <>))
+{
+ ### Message headers
+ if ($line =~ /^From /)
+ { while ($line ne "\n")
+ { $line = <>; } }
+
+ if ($line =~ /^See PART ONE of this FAQ for/)
+ { while (defined($line = <>) && ($line ne "\n"))
+ { }
+ next; }
+
+ if ($line =~ /^\s*[-+]+$/)
+ { next; }
+
+ ### File headers
+ if ($line =~ /^\s*CYSTIC-L Frequently Asked Questions - PART (.*)\n$/)
+ { # print "part $1\n";
+ if ($1 ne "ONE")
+ { next; }
+ if ($output_file)
+ { die "output_file shouldn't have been set yet: $output_file"; }
+ $output_file = "faq/index.html";
+ open(OUTPUT, ">$output_file") || die "Couldn't open $output_file";
+ select OUTPUT;
+ print "<HEAD>
+<TITLE>CYSTIC-L FAQ Table of Contents
+</TITLE>
+</HEAD>
+<BODY>
+<H1>CYSTIC-L Frequently Asked Questions</H1>
+<h2>Knowledge Is Power</h2>
+";
+ next; }
+
+ if ($line =~ /^\s*~ Knowledge Is Power ~$/)
+ { next; }
+
+ ### Table of contents
+ if ($line =~ /^\s*~ FAQ Table of Contents ~$/)
+ { read_toc();
+ print "<hr><a href=\"../\">Info-Zone</a> <a href=\"../../\">CF-WEB</a>\n";
+ close(OUTPUT);
+ next;
+ }
+
+ if ($line =~ /^PART /)
+ { next; }
+
+ if ($line =~ s/^>?APPENDIX ([A-Z])\.\s*//)
+ { if (!defined($appendix))
+ { if ($1 ne "A")
+ { die "First appendix is $1"; } }
+ elsif ($1 ne chr(ord($appendix)+1))
+ { die "Appendix $1 follows Appendix $appendix"; }
+
+ file_end();
+ close(OUTPUT);
+ $appendix = $1;
+ $section = undef;
+ $subsection = undef;
+ $subsubsection = undef;
+ $output_file = section_url_base();
+ open(OUTPUT, "> faq/$output_file") || die "Can't open faq/$output_file";
+ select OUTPUT;
+
+ chomp($line);
+ print "<title>$line</title>\n<h1>$line</h1>\n";
+ if (defined($file_tocs{$output_file}) && $file_tocs{$output_file})
+ { print "Contents: $file_tocs{$output_file}\n"; }
+ next; }
+
+ if (($line =~ /^>?([0-9]+)\.\s+/) && (!defined($section) || ($1 == $section+1)))
+ { $line =~ s/^>?([0-9]+)\.\s+//;
+ if (!defined($appendix))
+ { # should do some more here
+ if (defined($section))
+ { file_end(); }
+ close(OUTPUT); }
+ $section = $1;
+ $subsection = undef;
+ $subsubsection = undef;
+ $output_file = section_url_base();
+ if (!defined($appendix))
+ { open(OUTPUT, "> faq/$output_file") || die "Can't open faq/$output_file";
+ select OUTPUT;
+ chomp($line);
+ print "<title>$line</title>\n<h1>$line</h1>\n";
+ if (defined($file_tocs{$output_file}) && $file_tocs{$output_file})
+ { print "Contents: $file_tocs{$output_file}\n"; }
+ next; }
+ }
+
+ if ($line =~ s/^>?o\s+//)
+ { $line =~ s/^>//; # sometimes the > follows the itemization
+ if (!defined($subsection))
+ { $subsection = 1; }
+ else
+ { $subsection++; }
+ $subsubsection = undef;
+ print "<h2>", section_name($line), "</h2>\n";
+ next; }
+
+ if ($line =~ s/^>?-\s+//)
+ { $line =~ s/^>//; # sometimes the > follows the itemization
+ if (!defined($subsubsection))
+ { $subsubsection = 1; }
+ else
+ { $subsubsection++; }
+ print "<h3>", section_name($line), "</h3>\n";
+ next; }
+
+ ### A paragraph of ordinary text
+ if ($line !~ /^\s*$/)
+ { print "<p>$line";
+ while (defined($line = <>) && ($line ne "\n"))
+ { print $line; }
+ print "</p>\n";
+ }
+
+}
+file_end();
+
+my $subsection_marker;
+
+my $new;
+
+sub read_toc ()
+{ # These variables are initially undefined
+ if (defined($appendix)
+ || defined($section)
+ || defined($subsection)
+ || defined($subsubsection))
+ { die "some value should have been undefined when calling read_toc: `$appendix' `$section' `$subsection' `$subsubsection'"; }
+
+ while (defined($line = <>) && $line)
+ { if ($line =~ /^\s*$/)
+ { next; }
+ if ($line =~ /^\s*\((Portions updated since.*)>\)\n/)
+ { print "$1$new_tag<p>\n";
+ next; }
+ if ($line =~ /^PART (.*)$/)
+ # { if ($MATCH eq "ONE")
+ # { print ... }
+ { next; }
+ if ($line eq "APPENDICES\n")
+ { next; }
+ if ($line =~ /^\s*INDEX/)
+ { next; }
+
+ if ($line =~ /^\s*[-+]+$/)
+ { finish_appendices();
+ if (defined($appendix)
+ || defined($section)
+ || defined($subsection)
+ || defined($subsubsection))
+ { die "some value should have been undefined when exiting read_toc: `$appendix' `$section' `$subsection' `$subsubsection'"; }
+ return; }
+
+ $new = ($line =~ s/>//);
+
+ # # Not sure if this is the right place to do this.
+ # if (($line !~ /^\s*([-o]|[0-9A-Z]+\.|APPENDIX [A-Z]\.)/)
+ # && ($line !~ /[ .]*[0-9]+$/))
+ # { die "What line? $line"; }
+ while (!($line =~ s/[ .]*[0-9]+$//))
+ { $line .= <>; }
+ chomp($line);
+
+ if ($line =~ s/^\s*APPENDIX ([A-Z])\.\s*//)
+ { finish_sections();
+ if (!defined($appendix))
+ { if ($1 ne "A")
+ { die "First appendix is $1"; }
+ print "Appendices\n";
+ print "<ol type=\"A\" start=\"$1\">\n"; }
+ elsif ($1 ne chr(ord($appendix)+1))
+ { die "Appendix $1 follows Appendix $appendix"; }
+ $appendix = $1;
+ $appendix_name[ord($appendix)-ord('A')+1] = $line;
+ my $entry = toc_line($line);
+ print $entry;
+ push(@output_files,section_url_base());
+ next; }
+
+ if ($line =~ s/^\s*([0-9]+)\.\s*//)
+ { finish_subsections();
+ if (!defined($section))
+ { my $entry = "<ol start=$1>\n";
+ print $entry;
+ if (defined($appendix))
+ { $this_file_toc .= $entry; } }
+ elsif ($1 != $section+1)
+ { die "Section $1 follows section $section"; }
+ $section = $1;
+ $section_name[$section] = $line;
+ my $entry = " " . toc_line($line);
+ print $entry;
+ if (defined($appendix))
+ { $this_file_toc .= $entry; }
+ else
+ { push(@output_files,section_url_base()); }
+ next; }
+
+ if ($line =~ s/^\s*o\s+//)
+ { if (!defined($subsection))
+ { $subsection = 1;
+ my $entry = " <ul>\n";
+ print $entry;
+ $this_file_toc .= $entry;
+ $subsection_marker = "ul"; }
+ else
+ { finish_subsubsections();
+ $subsection++; }
+ my $entry = " " . toc_line($line);
+ print $entry;
+ $this_file_toc .= $entry;
+ next; }
+
+ if ($line =~ s/^\s*([A-Z])\.\s+//)
+ { finish_subsubsections();
+ if (!defined($subsection))
+ { my $entry = " <ol type=\"A\" start=\"$1\">\n";
+ print $entry;
+ $this_file_toc .= $entry;
+ $subsection_marker = "ol"; }
+ else
+ { if ($1 ne chr(ord($subsection)+1))
+ { die "Subsection $1 follows subsection $subsection"; } }
+ $subsection = $1;
+ my $entry = " " . toc_line($line);
+ print $entry;
+ $this_file_toc .= $entry;
+ next; }
+
+ if ($line =~ s/^\s*-\s+//)
+ { if (!defined($subsubsection))
+ { $subsubsection = 1;
+ my $entry = " <ul>\n";
+ print $entry;
+ $this_file_toc .= $entry; }
+ else
+ { $subsubsection++; }
+ my $entry = " " . toc_line($line);
+ print $entry;
+ $this_file_toc .= $entry;
+ next; }
+
+ # Itemized line without leading "o" (grrr).
+ if (!defined($subsection))
+ { my $entry = " <ul>\n";
+ print $entry;
+ $this_file_toc .= $entry;
+ $subsection = 1;
+ $subsection_marker = "ul"; }
+ else
+ { $subsection++; }
+ $line =~ s/^\s*//;
+ my $entry = " " . toc_line($line);
+ $this_file_toc .= $entry;
+ print $entry;
+ }
+}
+
+sub finish_subsubsections ()
+{ if (defined($subsubsection))
+ { my $entry = " </ul>\n";
+ print $entry;
+ $this_file_toc .= $entry;
+ $subsubsection = undef; } }
+
+sub finish_subsections ()
+{ finish_subsubsections();
+ if (defined($subsection))
+ { my $entry = " </$subsection_marker>\n";
+ print $entry;
+ $this_file_toc .= $entry;
+ $subsection = undef;
+ if (!defined($appendix))
+ { $file_tocs{section_url_base()} = $this_file_toc;
+ $this_file_toc = ""; } } }
+
+sub finish_sections ()
+{ finish_subsections();
+ if (defined($section))
+ { my $entry = " </ol>\n";
+ print $entry;
+ if (defined($appendix))
+ { $this_file_toc .= $entry;
+ $file_tocs{section_url_base()} = $this_file_toc;
+ $this_file_toc = ""; }
+ $section = undef; } }
+
+sub finish_appendices ()
+{ finish_sections();
+ if (defined($appendix))
+ { print "</ol>\n";
+ $appendix = undef; } }
+
+sub section_url_base ()
+{ if (!defined($appendix) && !defined($section))
+ { die "undefined appendix and section"; }
+ return (defined($appendix) ? "app-$appendix.html" : "sec-$section.html"); }
+
+sub section_url_name ()
+{ my $sans_subsubsection
+ = (defined($appendix)
+ ? (defined($section)
+ ? "sec-$section" . (defined($subsection)
+ ? "-$subsection" : "")
+ : "")
+ : (defined($subsection) ? "ssec-$subsection" : ""));
+ if (defined($subsubsection))
+ { $sans_subsubsection . "-$subsubsection"; }
+ else
+ { $sans_subsubsection; } }
+
+sub section_url ()
+{ my $base = section_url_base();
+ my $name = section_url_name();
+ if ($name)
+ { return $base . "\#" . $name; }
+ else
+ { return $base; } }
+
+
+sub section_href ($)
+{ my ($text) = @_;
+ return "<a href=\"" . section_url() . "\">$text</a>"; }
+
+sub section_name ($)
+{ my ($text) = @_;
+ return "<a name=\"" . section_url_name() . "\">$text</a>"; }
+
+sub toc_line ($)
+{ return " <LI>" . section_href($line) . ($new ? " $new_tag" : "") . "\n"; }
+
+sub file_end ()
+{ print "\n\n<hr>\n"
+ . (($file_index < $#output_files)
+ ? "<a href=\"$output_files[$file_index+1]\">Next</a> " : "")
+ . (($file_index > 0)
+ ? "<a href=\"$output_files[$file_index-1]\">Previous</a> " : "")
+ . "<a href=\"./\">FAQ</a> <a href=\"../\">Info-Zone</a> <a href=\"../../\">CF-WEB</a>\n";
+ $file_index++; }
diff --git a/test/etags/perl-src/kai-test.pl b/test/etags/perl-src/kai-test.pl
new file mode 100644
index 00000000000..51b66728f1e
--- /dev/null
+++ b/test/etags/perl-src/kai-test.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+sub f1 {
+ print "f1\n";
+}
+
+sub main::f2 {
+ print "f2\n";
+}
+
+package Foo;
+
+sub f3 {
+ print "f3\n";
+}
+
+sub Bar::f4 {
+ print "f4\n";
+}
+
+package Bar;
+
+sub f5 {
+ print "f5\n";
+}
+
+package Foo::Bar;
+
+sub f6 {
+ print "f6\n";
+}
+
+package main;
+
+sub f7 {
+ print "f7\n";
+}
+
+exit 0;
+# end of Perl code
diff --git a/test/etags/perl-src/yagrip.pl b/test/etags/perl-src/yagrip.pl
new file mode 100644
index 00000000000..be9f09c02d4
--- /dev/null
+++ b/test/etags/perl-src/yagrip.pl
@@ -0,0 +1,54 @@
+#Yet Another Getopt Routine In Perl
+# jgreely@cis.ohio-state.edu, 89/11/1
+#usage:
+#&getopt("f:bar") ||
+# die &usage("script","f:bar","oo","[files ...]");
+#
+sub getopt {
+ local($_,$flag,$opt,$f,$r,@temp) = @_;
+ @temp = split(/(.):/);
+ while ($#temp >= $[) {
+ $flag .= shift(@temp);
+ $opt .= shift(@temp);
+ }
+ while ($_ = $ARGV[0], /^-(.)(.*)/ && shift(@ARGV)) {
+ ($f,$r) = ($1,$2);
+ last if $f eq '-';
+ if (index($flag,$f) >= $[) {
+ eval "\$opt_$f++;";
+ $r =~ /^(.)(.*)/,redo if $r ne '';
+ }elsif (index($opt,$f) >= $[) {
+ $r = $r eq '' ? shift(@ARGV) : $r;
+ eval "\$opt_$f = \$r;";
+ }else{
+ print STDERR "Unrecognized switch \"-$f\".\n";
+ return 0;
+ }
+ }
+ return 1;
+}
+
+#usage: usage:
+# &usage(progname,arglist,@names,@last);
+#ex:
+# &usage("script","f:bar","oo","[file ...]");
+#would return
+# "usage: script [-f oo] [-bar] [file ...]"
+#
+sub usage {
+ local($prog,$_,@list) = @_;
+ local($string,$flag,@string,@temp,@last) = ();
+ @temp = split(/(.):/);
+ push(@string,"usage:",$prog);
+ while ($#temp >= $[) {
+ if (($flag = shift(@temp)) ne '') {
+ push(@string,"[-$flag]");
+ }
+ if (($flag = shift(@temp)) ne '') {
+ push(@string,sprintf("[-%s %s]",$flag,shift(@list)));
+ }
+ }
+ push(@string,@list) if $#list >= $[;
+ return join(' ',@string) . "\n";
+}
+1;
diff --git a/test/etags/php-src/lce_functions.php b/test/etags/php-src/lce_functions.php
new file mode 100644
index 00000000000..65738134593
--- /dev/null
+++ b/test/etags/php-src/lce_functions.php
@@ -0,0 +1,699 @@
+<?php
+if(!defined("LCE_FUNCTIONS"))
+{
+ define("LCE_FUNCTIONS", 1);
+ include("base.php");
+ include("lce_config.php");
+
+ // Unknown line class
+ define("LCE_UNKNOWN", 0);
+ // pure whitespace
+ define("LCE_WS", 1);
+ // a unqualified comment
+ define("LCE_COMMENT", 2);
+ // a user/translator comment
+ define("LCE_COMMENT_USER", 3);
+ // a tool-generated comment
+ define("LCE_COMMENT_TOOL", 4);
+ // A line containing a MSGID
+ define("LCE_MSGID", 5);
+ // A line containing a MSGSTR
+ define("LCE_MSGSTR", 6);
+ // A quoted text string
+ define("LCE_TEXT", 7);
+
+ define("STATE_ABORT", 0);
+ define("STATE_OK", 1);
+ define("STATE_LOOP", 2);
+
+ class POEntryAD extends AD
+ {
+ function validate($value)
+ {
+ // print '"<pre>' . $value . '"<br></pre>';
+ $result = AD::validate(trim($value));
+ //return $result;
+ if($result[0])
+ {
+ $lines = explode("\n", ereg_replace("\r", "", $result[1]));
+ //$lines = explode("\n", $result[1]);
+ /* print "<pre>";
+ print_r($lines);
+ print "</pre>";*/
+ $res = array();
+ for($i = 0; $i < count($lines); $i++)
+ {
+ if(trim($lines[$i]) != "")
+ $res[] = $lines[$i];
+ }
+ $result[1] = join("\n", $res);
+ /* print "<pre>";
+ print_r($result[1]);
+ print "</pre>";*/
+
+ $result[0] = $this->checkQuotation($result[1]);
+ }
+ return $result;
+ }
+
+ function checkQuotation($str)
+ {
+ $rex = "\\\\n|\\\\t|\\\\r|\\\\\"";
+ $str = ereg_replace($rex, "", $str);
+ $str = ereg_replace("\\\\\\\\", "", $str);
+ return !(strstr($str, "\"")
+ || strstr($str, "\\"));
+ }
+ }
+
+
+ class CommentAD extends AD
+ {
+ var $prefix;
+ function CommentAD(
+ $name, // the name of the variable
+ $not_null = 0,
+ $type = "", // as returned by gettype
+ $prefix = "# ")
+ {
+ $this->prefix = $prefix;
+ AD::AD($name, $not_null, $type);
+ }
+
+ function validate($value)
+ {
+ $res = AD::validate($value);
+ return $res;
+ if($res[0] && $res[1] != "")
+ {
+ $mod_lines = array();
+ $lines = explode("\n", $res[1]);
+
+ for($i = 0; $i < count($lines); $i++)
+ {
+ $line = $lines[$i];
+ if(substr($line, 0, 1) != "#")
+ $line = $this->prefix . $line;
+ $mod_lines[] = $line;
+ }
+ $res[1] = join("\n", $mod_lines);
+ }
+ return $res;
+ }
+ }
+
+ class POEntry extends HtmlValidator
+ {
+ var $msgid;
+ var $msgstr;
+ var $user_comment;
+ var $sys_comment;
+ var $unk_comment;
+
+ var $msgid_lc = 0;
+ var $msgstr_lc = 0;
+ var $user_comment_lc = 0;
+ var $sys_comment_lc = 0;
+ var $unk_comment_lc = 0;
+
+ function POEntry()
+ {
+ $this->atts = array(
+ new AD("msgid"),
+ new POEntryAD("msgstr", REQUIRED_ATTRIBUTE),
+ new CommentAD("user_comment"),
+ new POEntryAD("sys_comment"),
+ new POEntryAD("unk_comment"),
+ new AD("msgid_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+ new AD("msgstr_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+ new AD("user_comment_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+ new AD("sys_comment_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+ new AD("unk_comment_lc", NOT_REQUIRED_ATTRIBUTE, 0)
+ );
+ }
+
+ function lineCount($entry)
+ {
+ $lc = count(explode("\n", $entry));
+ return $lc;
+ }
+
+ function serializeToVars($prefix)
+ {
+ $this->user_comment_lc = $this->lineCount($this->user_comment);
+ $this->unk_comment_lc = $this->lineCount($this->sys_comment);
+ $this->sys_comment_lc = $this->lineCount($this->unk_comment);
+ $this->msgid_lc = $this->lineCount($this->msgid);
+ $this->msgstr_lc = $this->lineCount($this->msgstr);
+ return HtmlValidator::serializeToVars($prefix);
+ }
+
+ function write()
+ {
+ $content = "";
+ $content .= $this->user_comment . "\n";
+ $content .= $this->unk_comment . "\n";
+ $content .= $this->sys_comment . "\n";
+ $content .= "msgid \"" . $this->msgid . "\"\n";
+ $content .= 'msgstr "' . join("\"\n\"", explode("\n", $this->msgstr)) . "\"" . "\n\n";
+ return $content;
+ }
+ }
+
+ class POReader extends HTMLValidator
+ {
+ var $msgid;
+ var $msgstr;
+ var $user_comment;
+ var $sys_comment;
+ var $unk_comment;
+ var $state;
+ var $ignore_ws;
+ var $po_entries;
+ var $poe_num;
+ var $filename;
+ var $domain;
+
+ function gettext($msgid)
+ {
+ if(isset($this->po_entries[$msgid]))
+ {
+ $po = $this->po_entries[$msgid];
+ return StripCSlashes(join("", explode("\n", $po->msgstr)));
+ //return $po->msgstr;
+ }
+ return $msgid;
+ }
+
+
+ function parseFromVars($prefix)
+ {
+ $res = HtmlValidator::parseFromVars($prefix);
+ if($res[0])
+ {
+ $poe_res = true;
+ $this->po_entries = array();
+ for($i = 0; $i < $this->poe_num; $i++)
+ {
+ $poe = new POEntry;
+ $res = $poe->parseFromVars($prefix . "_POE$i");
+ if($res[0])
+ {
+ $msgid = $prefix . "_POE" . $i . "_MSGID";
+ $msgid = $$msgid;
+ $this->po_entries[$prefix . "_POE" . $i . "_MSGID"] = $res[1];
+ }
+ else
+ $poe_res = false;
+ }
+ }
+ if(!$poe_res)
+ $GLOBALS[$prefix . "_ERR"] = 1;
+ return array($poe_res, $this);
+ }
+
+ function serializeToVars($prefix)
+ {
+ HtmlValidator::serializeToVars($prefix);
+ reset($this->po_entries);
+ $i = 0;
+ while($poe = each($this->po_entries))
+ {
+ $poe = $poe[1];
+ $poe->serializeToVars($prefix . "_POE$i");
+ $i++;
+ }
+ }
+
+
+ function POReader($domain, $filename)
+ {
+ $this->domain = $domain;
+ $this->filename = $filename;
+ $this->ignore_ws = true;
+ $this->po_entries = array();
+ $this->atts = array(
+ new AD("domain", REQUIRED_ATTRIBUTE),
+ new AD("filename", REQUIRED_ATTRIBUTE),
+ new AD("poe_num", REQUIRED_ATTRIBUTE, 0)
+ );
+ }
+
+
+ function read()
+ {
+ if($fh = fopen($this->filename, "r"))
+ {
+ $this->lines = array();
+ while (!feof ($fh))
+ {
+ $line = fgets($fh, 4096);
+ $this->lines[] = $line;
+ }
+ fclose($fh);
+ }
+ $this->createPOEntries();
+ $this->poe_num = count($this->po_entries);
+ }
+
+ function write($save="yes")
+ {
+ reset($this->po_entries);
+ $content = "";
+ while($poe = each($this->po_entries))
+ {
+ $poe = $poe[1];
+ $content .= $poe->write();
+ }
+
+ if(($fh = fopen($this->filename, "w"))
+ && $save == "yes")
+ {
+ fwrite($fh, $content);
+ }
+ return $content;
+ }
+
+ function isComment($class)
+ {
+ if($class == LCE_COMMENT || $class == LCE_COMMENT_USER || $class == LCE_COMMENT_TOOL)
+ return true;
+ return false;
+ }
+
+ function comment($line, $class)
+ {
+ if($this->isComment($class))
+ {
+ if($class == LCE_COMMENT_USER)
+ $this->user_comment .= $line;
+ else if($class == LCE_COMMENT_TOOL)
+ $this->sys_comment .= $line;
+ else
+ $this->unk_comment .= $line;
+ return STATE_OK;
+ }
+ if($class == LCE_MSGID)
+ {
+ $this->state = "msgid";
+ return STATE_LOOP;
+ }
+ return STATE_ABORT;
+ }
+
+ function msgid($line, $class)
+ {
+ if($class == LCE_MSGID || $class == LCE_TEXT)
+ {
+ $line = $this->stripLine($line, LCE_MSGID);
+ $this->msgid .= $line;
+ return STATE_OK;
+ }
+ if($class == LCE_MSGSTR)
+ {
+ $this->state = "msgstr";
+ return STATE_LOOP;
+ }
+ return STATE_ABORT;
+ }
+
+ function msgstr($line, $class)
+ {
+ if($class == LCE_MSGSTR || $class == LCE_TEXT)
+ {
+ $line = $this->stripLine($line, $class);
+ $this->msgstr .= $line;
+ return STATE_OK;
+ }
+ // We have a different state, so we have to create a POEntry
+ $poe = new POEntry;
+ $poe->user_comment = trim($this->user_comment);
+ $poe->sys_comment = trim($this->sys_comment);
+ $poe->unk_comment = trim($this->unk_comment);
+ $poe->msgid = trim($this->msgid);
+ $poe->msgstr = trim($this->msgstr);
+ $this->po_entries[trim($this->msgid)] = $poe;
+ $this->state = "start";
+ return STATE_LOOP;
+ }
+
+ function start($line, $class)
+ {
+ $this->user_comment = "";
+ $this->sys_comment = "";
+ $this->unk_comment = "";
+ $this->msgid = "";
+ $this->msgstr = "";
+ if($this->isComment($class))
+ {
+ $this->state = "comment";
+ return STATE_LOOP;
+ }
+ if($class == LCE_MSGID)
+ {
+ $this->state = "msgid";
+ return STATE_LOOP;
+ }
+ return STATE_OK;
+ }
+
+ function createPOEntries()
+ {
+ $this->msgid = "";
+ $this->msgstr = "";
+ $this->user_comment = "";
+ $this->sys_comment = "";
+ $this->state = "start";
+
+ reset($this->lines);
+ for($i = 0; $i < count($this->lines); $i++)
+ {
+ $line = $this->lines[$i];
+ $class = $this->classifyLine($line);
+ if($class != LCE_WS || !$this->ignore_ws)
+ {
+ $state_ret = STATE_LOOP;
+ while($state_ret == STATE_LOOP)
+ {
+ $state = $this->state;
+ //print "$this->state $class:$line <br>";
+ $state_ret = $this->$state($line, $class);
+ }
+ //print "state_ret = $state_ret <br>";
+ }
+ if($state_ret == STATE_ABORT)
+ break;
+ }
+ // Get the last entry
+ if($state_ret != STATE_ABORT)
+ {
+ $this->msgstr("", LCE_UNKNOWN);
+ }
+ }
+
+ function stripLine($line, $class)
+ {
+ switch($class)
+ {
+ case LCE_TEXT:
+ ereg('^"(.*)"', $line, $regs);
+ $line = $regs[1] . "\n";
+ break;
+ case LCE_MSGID:
+ if(substr($line, strlen("msgid")) == "msgid")
+ {
+ $line = substr($line, strlen("msgid") + 1);
+ }
+ ereg('"(.*)"', $line, $regs);
+ $line = $regs[1];
+ break;
+ case LCE_MSGSTR:
+ // TODO: Check if ^ can be removed
+ $line = substr($line, strlen("msgstr") + 1);
+ ereg('^"(.*)"', $line, $regs);
+ $line = $regs[1] . "\n";
+ break;
+
+ }
+ return $line;
+ }
+
+ function printClassification()
+ {
+ reset($this->lines);
+ for($i = 0; $i < count($this->lines); $i++)
+ {
+ $line = $this->lines[$i];
+ $class = $this->classifyLine($line);
+ print "#$i: $class $line<br>";
+ }
+ }
+
+ function classifyLine($line)
+ {
+ if(ereg("^[ \n\r\t]*$", $line))
+ return LCE_WS;
+ if(ereg("^#.*\$", $line))
+ {
+ if(ereg("^[,:-~].*", substr($line, 1)))
+ {
+ return LCE_COMMENT_TOOL;
+ }
+ if(ereg("^[ \n\r\t].*", substr($line, 1)))
+ {
+ return LCE_COMMENT_USER;
+ }
+ return LCE_COMMENT;
+ }
+ if(ereg("^msgid (.*)\$", $line, $regs))
+ {
+ $line = $regs[1];
+ if($this->classifyLine($line) == LCE_TEXT)
+ return LCE_MSGID;
+ }
+ if(ereg("^msgstr (.*)\$", $line, $regs))
+ {
+ $line = $regs[1];
+ if($this->classifyLine($line) == LCE_TEXT)
+ return LCE_MSGSTR;
+ }
+ if(ereg('^".*"', $line))
+ {
+ // TODO: Check correct escapes
+ return LCE_TEXT;
+ }
+
+ return LCE_UNKNOWN;
+ }
+ }
+
+
+ function getTextDomains($lines)
+ {
+ $default_domain = "";
+ $domains = array();
+ while($gl = each($GLOBALS))
+ {
+ $gname = $gl[0];
+ global $$gname;
+ }
+ for($i = 0; $i < count($lines); $i++)
+ {
+ if(ereg("bindtextdomain\(([^,]+),([^\)]+)\)", $lines[$i], $regs))
+ {
+ //print "Line:" . $lines[$i] . " <br>";
+ $name = $regs[1];
+ $ev = "\$directory = ". $regs[2] . ";";
+ print $ev;
+ eval($ev);
+ $domains[] = array($name, $directory);
+ }
+ if(ereg("textdomain\(([^\)]+)\)", $lines[$i], $regs))
+ $default_domain = $regs[1];
+ }
+ return array($default_domain, $domains);
+ }
+
+
+ class PORManager extends HtmlValidator
+ {
+ var $por_a;
+
+ function PORManager()
+ {
+ $this->por_a = array();
+ }
+
+ function addPOReader($d_name, &$por)
+ {
+ $this->por_a[$d_name] = &$por;
+ }
+
+ function &getPOReader($domain)
+ {
+ return $this->por_a[$domain];
+ }
+
+ function getDomainNames()
+ {
+ return array_keys($this->por_a);
+ }
+ }
+
+ function &loadPORManager()
+ {
+ global $LCE_PORMAN;
+ if(!isset($LCE_PORMAN))
+ {
+ $LCE_PORMAN = new PORManager();
+ }
+ return $LCE_PORMAN;
+ }
+
+
+ // More or less intelligent filename joining
+ // As available in PYTHONs os.path
+ function fileJoin()
+ {
+ $numargs = func_num_args();
+ $args = func_get_args();
+ for($i = 0; $i < $numargs - 1; $i++)
+ {
+ if(substr($args[$i], -1) != "/")
+ $args[$i] = $args[$i] . "/";
+ if($i > 0)
+ {
+ if(substr($args[$i],0 , 1) == "/")
+ $args[$i] = substr($args[$i], 1);
+ }
+
+ }
+ return join("", $args);
+ }
+
+ if(defined("LCE_TESTSERVER"))
+ {
+
+ function lce_bindtextdomain($d_name, $d_path)
+ {
+ global $LANG, $LC_MESSAGES, $LC_ALL, $LCE_LANG;
+ global $LCE_ERR;
+ global $LCE_PO_SUFFIX;
+ global $LCE_MANAGER;
+
+ $path_orig = $d_path;
+ // This is not complete and reflects
+ // my not very far going understanding of the
+ // different $LC_x thingies.
+ if(isset($LC_MESSAGES))
+ {
+ //print "LC_MESSAGES<br>";
+ $lang_suffix = $LC_MESSAGES;
+ }
+ else if(isset($LC_ALL))
+ {
+ //print "LC_ALL<br>";
+ $lang_suffix = $LC_ALL;
+ }
+ else if(isset($LANG))
+ {
+ //print "LANG<br>";
+ $lang_suffix = $LANG;
+ }
+ else
+ {
+ //print "LCE_LANG<br>";
+ $lang_suffix = $LCE_LANG;
+ }
+
+ //print "LangSuffix: $lang_suffix \n";
+ //print "D_Path: " . fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name . $LCE_PO_SUFFIX) . "<br>";
+ // First try: the whole lang_suffix
+
+ if(file_exists(fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name . $LCE_PO_SUFFIX)))
+ $d_path = fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name . $LCE_PO_SUFFIX);
+ else
+ {
+ $lang_suffix = substr($lang_suffix, 0, 2);
+ if(file_exists(fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name. $LCE_PO_SUFFIX)))
+ $d_path = fileJoin(fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name . $LCE_PO_SUFFIX));
+ else
+ {
+ $LCE_ERR = "No PO-file found";
+ return false;
+ }
+ }
+ //print "D_Path: $d_path \n";
+ $por = new POReader($d_name, $d_path, $path_orig);
+ $por->read();
+ $porman =& loadPORManager();
+ $porman->addPOReader($d_name, $por);
+ return true;
+ }
+
+ function lce_textdomain($domain)
+ {
+ global $LCE_DOMAIN;
+ $LCE_DOMAIN = $domain;
+ }
+
+ function lce_gettext($msgid)
+ {
+ global $LCE_DOMAIN;
+ return lce_dgettext($LCE_DOMAIN, $msgid);
+ }
+
+ function lce_dgettext($domain, $msgid)
+ {
+ $porman =& loadPORManager();
+ if($por = &$porman->getPOReader($domain))
+ return $por->gettext($msgid);
+ return $msgid;
+ }
+
+ function lce()
+ {
+ global $LCE_LCEDITLOC;
+ $porman =& loadPORManager();
+ $domains = $porman->getDomainNames();
+ for($i = 0; $i < count($domains); $i++)
+ {
+ $por =& $porman->getPOReader($domains[$i]);
+ $domain = "domain=" . urlencode($por->domain);
+ $filename = "filename=" . urlencode($por->filename);
+ $url = $LCE_LCEDITLOC . "?" . $domain . "&" . $filename;
+ print "<a target=\"_blank\" href=\"" . $url . "\">Domain: $por->domain</a><br>";
+ }
+ }
+ }
+ else
+ {
+ function lce_bindtextdomain($domain, $path)
+ {
+ bindtextdomain($domain, $path);
+ }
+
+ function lce_textdomain($domain)
+ {
+ textdomain($domain);
+ }
+
+ function lce_gettext($msgid)
+ {
+ return gettext($msgid);
+ }
+
+ function lce_dgettext($domain, $msgid)
+ {
+ return dgettext($domain, $msgid);
+ }
+ function lce()
+ {
+ }
+ }
+
+
+ function lce_geteditcode($type, $name, $text, $rows=2)
+ {
+ global $LCE_EDIT_LEVEL;
+ $level_map = array("msgid" => 4,
+ "sys_comment" => 3,
+ "user_comment" => 2,
+ "msgstr" => 1
+ );
+ if($level_map[$type] > $LCE_EDIT_LEVEL)
+ {
+ return "<input type=\"hidden\" name=\"" . $name . "\" value=\"" . $text . "\"><pre>\n" . $text . "\n</pre>";
+ }
+ else
+ {
+ return "<textarea name=\"" . $name . "\" rows=\"" . $rows . "\" cols=\"60\">" . $text . "</textarea>";
+ }
+ }
+}
+/*
+ ;;; Local Variables: ***
+ ;;; mode:C ***
+ ;;; End: ***
+*/
+?>
diff --git a/test/etags/php-src/ptest.php b/test/etags/php-src/ptest.php
new file mode 100644
index 00000000000..9893839b493
--- /dev/null
+++ b/test/etags/php-src/ptest.php
@@ -0,0 +1,18 @@
+define("TEST", 0);
+
+class
+test
+extends base
+{
+ // use --member to tag
+ var $member;
+ var $memassign="hallo";
+ var $memassign_space ="hallo";
+ // Syntactical wrong, but tagged
+ var $test
+}
+
+function
+foo()
+{
+}
diff --git a/test/etags/php-src/sendmail.php b/test/etags/php-src/sendmail.php
new file mode 100644
index 00000000000..1d15e4ad9f6
--- /dev/null
+++ b/test/etags/php-src/sendmail.php
@@ -0,0 +1,527 @@
+<?php
+
+/*
+ Classe creata da Santoro Diego.
+ Per aiuti nella programmazione in PHP, PERL, C e ECMAScript contattatemi
+ e-Mail vincenza.tralice@tiscali.it oppure santoro.diego@3000.it
+ La classe ? ancora in fase beta.
+*/
+
+final class sendMail {
+
+ const eMailAddressErrorMessage="L' e-Mail indicata non rispetta un formato valido.";
+ const defaultSubject="this is the subject.";
+ const defaultTextMessage="this is text message.";
+ const defaultHtmlMessage="this is html message.";
+ const defaultHeaderMessage="this is a multi-part message in MIME format.";
+
+ private static $messageProperties=array(
+ "charset" => array(
+ "modifiable" => true,
+ "values" => array(
+ "iso-8859-1",
+ "iso-8859-15",
+ "utf-8",
+ "utf-16"
+ )
+ ),
+ "content-transfer-encoding" => array(
+ "modifiable" => true,
+ "values" => array(
+ "7bit",
+ "8bit",
+ "quoted-printable"
+ )
+ )
+ );
+
+ private $attachmentProperties=array(
+ "content-type" => array(
+ "modifiable" => false,
+ "values" => array(
+ "application/octet-stream"
+ )
+ ),
+ "content-transfer-encoding" => array(
+ "modifiable" => false,
+ "values" => array(
+ "base64"
+ )
+ ),
+ "content-disposition" => array(
+ "modifiable" => true,
+ "values" => array(
+ "attachment",
+ "inline"
+ )
+ )
+ );
+
+ private static $relatedProperties=array(
+ "content-transfer-encoding" => array(
+ "modifiable" => false,
+ "values" => array(
+ "base64"
+ )
+ )
+ );
+
+ private $html;
+ private $text;
+
+ private $related;
+ private $attachments;
+
+ public static function valid_eMailAddress($eMailAddress) {
+ if(ereg("^[^@ ]+@[^@ ]+\.[^@ ]+$", $eMailAddress))
+ return true;
+ else
+ return false;
+ }
+
+ public static function validContentId($contentId) {
+ if(ereg("^[a-zA-Z0-9]+$", $contentId))
+ return true;
+ else
+ return false;
+ }
+
+ public static function validContentKey($contentKey) {
+ if(ereg("^[a-zA-Z0-9]+$", $contentKey))
+ return true;
+ else
+ return false;
+ }
+
+ public static function mime_content_type($filename) {
+ $mime=array(
+ '.3dmf' => 'x-world/x-3dmf',
+ '.a' => 'application/octet-stream',
+ '.aab' => 'application/x-authorware-bin',
+ '.xwd' => 'image/x-xwd',
+ '.xyz' => 'chemical/x-pdb',
+ '.z' => 'application/x-compressed',
+ '.zip' => 'application/x-zip-compressed',
+ '.zoo' => 'application/octet-stream',
+ '.zsh' => 'text/x-script.zsh',
+ '.css' => 'text/css'
+ );
+ return $mime[strrchr($filename, '.')];
+ }
+
+ private $from;
+ private $to;
+ private $subject;
+
+ private $finalized;
+
+ private $headerMessage;
+ private $bodyMessage;
+
+ private $boundaries;
+
+ public function __construct($from, $to, $subject=self::defaultSubject) {
+
+ // set from
+ if(!self::valid_eMailAddress($from))
+ die(self::eMailAddressErrorMessage);
+ else
+ $this->from=$from;
+
+ // set to
+ if(!self::valid_eMailAddress($to))
+ die(self::eMailAddressErrorMessage);
+ else
+ $this->to=$to;
+
+ // set subject
+ $this->subject=$subject;
+
+ // set text
+ $this->text=array(
+ "message" => self::defaultTextMessage,
+ "properties" => array(
+ "charset" => self::$messageProperties["charset"]["values"][0],
+ "content-transfer-encoding" => self::$messageProperties["content-transfer-encoding"]["values"][0]
+ )
+ );
+
+ // set html
+ $this->html=array(
+ "message" => self::defaultHtmlMessage,
+ "properties" => array(
+ "charset" => self::$messageProperties["charset"]["values"][0],
+ "content-transfer-encoding" => self::$messageProperties["content-transfer-encoding"]["values"][1]
+ )
+ );
+
+ // set related and attachments
+ $this->related=array();
+ $this->attachments=array();
+
+ // set finalizater counter
+ $this->finalized=false;
+
+ $this->headerMessage="";
+ $this->bodyMessage="";
+
+ $this->boundaries=array(
+ "multipart/alternative" => md5(uniqid(microtime())),
+ "multipart/related" => md5(uniqid(microtime())),
+ "multipart/mixed" => md5(uniqid(microtime()))
+ );
+
+ }
+
+ public function setTo($to, &$errorString) {
+ if(self::valid_eMailAddress($to)) {
+ $this->to=$to;
+ return true;
+ } else {
+ $errorString=eMailAddressErrorMessage;
+ return false;
+ }
+ }
+
+ public function setFrom($from, &$errorString) {
+ if(self::valid_eMailAddress($from)) {
+ $this->from=$from;
+ return true;
+ } else {
+ $errorString=eMailAddressErrorMessage;
+ return false;
+ }
+ }
+
+ public function setSubject($subject=self::defaultSubject) {
+ $this->subject=$subject;
+ }
+
+ public function setTextMessage($textMessage=self::defaultTextMessage) {
+ $this->text["message"]=$textMessage;
+ }
+
+ public function setTextMessageProperty($key, $value, &$errorString) {
+
+ $key=strtolower($key);
+ $value=strtolower($value);
+
+ if(isset(self::$messageProperties[$key])) {
+ if(in_array($value, self::$messageProperties[$key]["values"])) {
+ if(self::$messageProperties[$key]["modifiable"]) {
+ $this->text["properties"][$key]=$value;
+ return true;
+ } else {
+ $errorString="Il valore della propriet? indicata non ? modificabile.";
+ return false;
+ }
+ } else {
+ $errorString="Il valore indicato per questa propriet? non ? valido.";
+ return false;
+ }
+ } else {
+ $errorString="Non esiste questa propriet? per i messaggi html.";
+ return false;
+ }
+ }
+
+ public function setHtmlMessage($htmlMessage=self::defaultHtmlMessage) {
+ $this->html["message"]=$htmlMessage;
+ }
+
+ public function setHtmlMessageProperty($key, $value, &$errorString) {
+
+ $key=strtolower($key);
+ $value=strtolower($value);
+
+ if(isset(self::$messageProperties[$key])) {
+ if(in_array($value, self::$messageProperties[$key]["values"])) {
+ if(self::$messageProperties[$key]["modifiable"]) {
+ $this->html["properties"][$key]=$value;
+ return true;
+ } else {
+ $errorString="Il valore della propriet? indicata non ? modificabile.";
+ return false;
+ }
+ } else {
+ $errorString="Il valore indicato per questa propriet? non ? valido.";
+ return false;
+ }
+ } else {
+ $errorString="Non esiste questa propriet? per i messaggi html.";
+ return false;
+ }
+ }
+
+ public function addRelated($fileName, $relatedKey, $contentId, &$errorString) {
+ if(is_file($fileName)) {
+ if($fileHandle=fopen($fileName, "r")) {
+ if(self::validContentId($contentId)) {
+ if(!isset($this->related[$relatedKey])) {
+ if(self::validContentKey($relatedKey)) {
+ $this->related[$relatedKey]=array(
+ "fileName" => basename($fileName),
+ "properties" => array(
+ "content-type" => self::mime_content_type($fileName),
+ "content-transfer-encoding" => self::$relatedProperties["content-transfer-encoding"]["values"][0],
+ "content-id" => $contentId
+ ),
+ "source" => base64_encode(
+ fread($fileHandle, filesize($fileName))
+ )
+ );
+ return true;
+ } else {
+ $errorString="L' id specificato non ? valido.";
+ return false;
+ }
+ } else {
+ $errorString="La chiave specificata ? gi? associata ad un altro related.";
+ return false;
+ }
+ } else {
+ $errorString="La chiave specificata per il related non ? valida.";
+ return false;
+ }
+ } else {
+ $errorString="Non ? possibile aprire il file indicato.";
+ return false;
+ }
+ } else {
+ $errorString="Il nome del file indicato non ? valido.";
+ return false;
+ }
+ }
+
+ public function setRelatedProperty($relatedKey, $key, $value, &$errorString) {
+
+ $key=strtolower($key);
+ $value=strtolower($value);
+
+ if(isset(self::$relatedProperties[$key])) {
+ if(in_array($value, self::$relatedProperties[$key]["values"])) {
+ if(self::$relatedProperties[$key]["modifiable"]) {
+ if(isset($this->related[$relatedKey])) {
+ $this->related[$relatedKey]["properties"][$key]=$value;
+ return true;
+ } else {
+ $errorString="Il related indicato non esiste.";
+ return false;
+ }
+ } else {
+ $errorString="Il valore della propriet? indicata non ? modificabile.";
+ return false;
+ }
+ } else {
+ $errorString="Il valore indicato per questa propriet? non ? valido.";
+ return false;
+ }
+ } else {
+ $errorString="Non esiste questa propriet? per i related.";
+ return false;
+ }
+ }
+
+ public function addAttachment($fileName, $attachmentKey, &$errorString) {
+ if(is_file($fileName)) {
+ if($fileHandle=fopen($fileName, "r")) {
+ if(self::validContentKey($attachmentKey)) {
+ if(!isset($this->attachments[$attachmentKey])) {
+ $this->attachments[$attachmentKey]=array(
+ "fileName" => basename($fileName),
+ "properties" => array(
+ "content-type" => self::$attachmentProperties["content-type"]["values"][0],
+ "content-disposition" => self::$attachmentProperties["content-disposition"]["values"][0],
+ "content-transfer-encoding" => self::$attachmentProperties["content-transfer-encoding"]["values"][0]
+ ),
+ "source" => base64_encode(
+ fread($fileHandle, filesize($fileName))
+ )
+ );
+ return true;
+ } else {
+ $errorString="La chiave specificata ? gi? associata ad un altro allegato.";
+ return false;
+ }
+ } else {
+ $errorString="La chiave specificata per l'allegato non ? valida.";
+ return false;
+ }
+ } else {
+ $errorString="Non ? possibile aprire il file indicato.";
+ return false;
+ }
+ } else {
+ $errorString="Il nome del file indicato non ? valido.";
+ return false;
+ }
+ }
+
+ public function setAttachmentProperty($attachmentKey, $key, $value, &$errorString) {
+
+ $key=strtolower($key);
+ $value=strtolower($value);
+
+ if(isset(self::$attachmentProperties[$key])) {
+ if(in_array($value, self::$attachmentProperties[$key]["values"])) {
+ if(self::$attachmentProperties[$key]["modifiable"]) {
+ if(isset($this->attachments[$attachmentKey])) {
+ $this->attachments[$attachmentKey]["properties"][$key]=$value;
+ return true;
+ } else {
+ $errorString="L'allegato indicato non esiste.";
+ return false;
+ }
+ } else {
+ $errorString="Il valore della propriet? indicata non ? modificabile.";
+ return false;
+ }
+ } else {
+ $errorString="Il valore indicato per questa propriet? non ? valido.";
+ return false;
+ }
+ } else {
+ $errorString="Non esiste questa propriet? per gli allegati.";
+ return false;
+ }
+ }
+
+ public function finalize(&$errorString) {
+ if(!$this->finalized) {
+ $this->headerMessage="from: ".($this->from)."\n";
+ $this->headerMessage.="to: ".($this->to)."\n";
+ $this->headerMessage.="subject: ".($this->subject)."\n";
+ $this->headerMessage.="mime-version: 1.0\n";
+
+ if(($countAttachments=count($this->attachments))>0) {
+ $this->headerMessage.="content-type: multipart/mixed; boundary=\"".($this->boundaries["multipart/mixed"])."\"\n\n";
+ $this->headerMessage.=self::defaultHeaderMessage;
+ $this->headerMessage.="\n\n";
+
+ $this->bodyMessage="--".($this->boundaries["multipart/mixed"])."\n";
+
+ if(($countRelated=count($this->related))>0) {
+ $this->bodyMessage.="content-type: multipart/related; type=\"multipart/alternative\"; boundary=\"".($this->boundaries["multipart/related"])."\"\n\n";
+
+ $this->bodyMessage.="--".($this->boundaries["multipart/related"])."\n";
+
+ $this->bodyMessage.="content-type: multipart/alternative; boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+ $this->createMultipartAlternativeMessage($this->boundaries["multipart/alternative"]);
+ $this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--\n\n";
+
+ // aggiungere i related e chiudere
+
+ $relatedCounter=0;
+ while(list($key,)=each($this->related)) {
+ $relatedCounter++;
+
+ $this->bodyMessage.="--".$this->boundaries["multipart/related"]."\n";
+ $this->createMultipartRelatedMessage($key);
+ if($relatedCounter!=$countRelated) $this->bodyMessage.="--".($this->boundaries["multipart/related"])."\n";
+ else $this->bodyMessage.="--".($this->boundaries["multipart/related"])."--\n\n";
+ }
+ } else {
+ $this->bodyMessage.="content-type: multipart/alternative; boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+ $this->createMultipartAlternativeMessage();
+ $this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--\n\n";
+ }
+
+ $attachmentsCounter=0;
+ while(list($key,)=each($this->attachments)) {
+ $attachmentsCounter++;
+ $this->bodyMessage.="--".($this->boundaries["multipart/mixed"])."\n";
+ $this->createMultipartMixedMessage($key);
+ if($attachmentsCounter!=$countAttachments) $this->bodyMessage.="--".($this->boundaries["multipart/mixed"])."\n";
+ else $this->bodyMessage.="--".($this->boundaries["multipart/mixed"])."--\n\n";
+ }
+ } else {
+ if(($countRelated=count($this->related))>0) {
+ $this->headerMessage.="content-type: multipart/related; type=\"multipart/alternative\"; boundary=\"".($this->boundaries["multipart/related"])."\"\n\n";
+ $this->headerMessage.=self::defaultHeaderMessage;
+ $this->headerMessage.="\n\n";
+
+ $this->bodyMessage="--".($this->boundaries["multipart/related"])."\n";
+ $this->bodyMessage.="content-type: multipart/alternative; boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+ $this->createMultipartAlternativeMessage();
+ $this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--\n\n";
+
+ $relatedCounter=0;
+ while(list($key,)=each($this->related)) {
+ $relatedCounter++;
+ $this->bodyMessage.="--".$this->boundaries["multipart/related"]."\n";
+ $this->createMultipartRelatedMessage($key);
+ if($relatedCounter!=$countRelated) $this->bodyMessage.="--".($this->boundaries["multipart/related"])."\n";
+ else $this->bodyMessage.="--".($this->boundaries["multipart/related"])."--\n\n";
+ }
+ } else {
+ $this->headerMessage.="content-type: multipart/alternative; boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+ $this->headerMessage.=self::defaultHeaderMessage;
+ $this->headerMessage.="\n\n";
+
+ $this->createMultipartAlternativeMessage();
+ $this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--";
+
+ }
+ }
+ $this->finalized=true;
+ return true;
+ } else {
+ $errorString="Al momento non ? possibile finalizzare.";
+ return false;
+ }
+ }
+
+ private function createMultipartAlternativeMessage() {
+ $multipartAlternativeBoundary=$this->boundaries["multipart/alternative"];
+ $this->bodyMessage.="--$multipartAlternativeBoundary\n";
+ $this->bodyMessage.="content-type: text/plain; charset=\"".($this->text["properties"]["charset"])."\"\n";
+ $this->bodyMessage.="content-transfer-encoding: ".($this->text["properties"]["content-transfer-encoding"])."\n\n";
+ $this->bodyMessage.=$this->text["message"];
+ $this->bodyMessage.="\n\n";
+ $this->bodyMessage.="--$multipartAlternativeBoundary\n";
+ $this->bodyMessage.="content-type: text/html; charset=\"".($this->html["properties"]["charset"])."\"\n";
+ $this->bodyMessage.="content-transfer-encoding: ".($this->html["properties"]["content-transfer-encoding"])."\n\n";
+ $this->bodyMessage.=$this->html["message"];
+ $this->bodyMessage.="\n\n";
+ }
+
+ private function createMultipartRelatedMessage($key) {
+ $obj=$this->related[$key];
+ $this->bodyMessage.="content-type: ".($obj["properties"]["content-type"])."; name=\"".($obj["fileName"])."\"\n";
+ $this->bodyMessage.="content-transfer-encoding: ".($obj["properties"]["content-transfer-encoding"])."\n";
+ $this->bodyMessage.="content-id: <".($obj["properties"]["content-id"]).">\n\n";
+ $this->bodyMessage.=$obj["source"];
+ $this->bodyMessage.="\n\n";
+ }
+
+ private function createMultipartMixedMessage($key) {
+ $obj=$this->attachments[$key];
+ $this->bodyMessage.="content-type: ".($obj["properties"]["content-type"])."; name=\"".($obj["fileName"])."\"\n";
+ $this->bodyMessage.="content-transfer-encoding: ".($obj["properties"]["content-transfer-encoding"])."\n";
+ $this->bodyMessage.="content-disposition: ".($obj["properties"]["content-disposition"])."; filename=\"".($obj["fileName"])."\"\n\n";
+ $this->bodyMessage.=$obj["source"];
+ $this->bodyMessage.="\n\n";
+ }
+
+ public function getSource(&$errorString) {
+ if($this->finalized) {
+ return ($this->headerMessage).($this->bodyMessage);
+ } else {
+ $errorString="Ancora non ? avvenuta la finalizzazione.";
+ return false;
+ }
+ }
+
+ public function sendMail(&$errorString) {
+ if($this->finalized) {
+ mail($this->to, $this->subject, $this->bodyMessage, $this->headerMessage);
+ $this->finalized=false;
+ return true;
+ } else {
+ $errorString="Ancora non ? avvenuta la finalizzazione.";
+ return false;
+ }
+ }
+}
+
+?>
diff --git a/test/etags/prol-src/natded.prolog b/test/etags/prol-src/natded.prolog
new file mode 100644
index 00000000000..f0ee6b41b12
--- /dev/null
+++ b/test/etags/prol-src/natded.prolog
@@ -0,0 +1,1545 @@
+% $Id: natded.pl,v 1.7 2001/04/26 12:22:56 geertk Exp geertk $
+% NATURAL DEDUCTION CG PARSER WITH SEMANTICS
+% =========================================================================
+% Bob CARPENTER
+% Computational Linguistics Program, Department of Philosophy
+% Carnegie Mellon University, Pittsburgh, PA 15213
+% Net: carp+@cmu.edu
+% Voice: (412) 268-8043 Fax: (412) 268-1440
+
+% Copyright 1995, Bob Carpenter
+
+% Written: 12 March 1993
+% Revised: 4 February 1994
+% Further Revised: 2 May 1994
+% Revised for CGI: 16 November 1995
+% Revised for Lambek notation: ? Novemeber 1995
+% Revised again: 30 November 1995
+
+
+% Library Includes
+% =========================================================================
+
+:- use_module(library(system)).
+% :- use_module(library(random)).
+
+
+% Data Types
+% =========================================================================
+
+% <lambda_term> ::= <lambda_var>
+% | <lambda_con>
+% | <lambda_term>@<lambda_term>
+% | <lambda_var>^<lambda_term>
+
+% <lambda_var> ::= var(<prolog_var>)
+
+% <lambda_con> ::= con(<prolog_atom>)
+
+% <tree> ::= tree(<rule>,<cat>,<list(<tree>)>)
+% | ass(<syn>,<var>,<index>)
+% | leaf(<word>)
+
+% <rule> ::= <prolog_atom>
+
+% <cat> ::= <syn> : <lambda_term>
+
+% <syn> ::= <basic_syn>
+% | <syn> / <syn> | <syn> \ <syn>
+% | scop(<syn>,<syn>)
+% | <syn> - <syn>
+
+% <basic_syn> ::= bas(<prolog_term>)
+
+% <grammar> ::= <sequence(<lex_entry>)>
+% <sequence(<empty_category>)>
+% <sequence(<grammar_rule>)>
+
+% <lex_entry> ::= <word> ==> <cat>.
+
+% <empty_category> ::= empty <cat>.
+
+% <grammar_rule> ::= <cat> ===> <list(<cat>)> if <prolog_goal>.
+
+% <index> ::= <integer>
+
+% <word> ::= <prolog_atom>
+
+% <chart_edge> ::= edge(<int>, <int>, <cat>)
+
+% Operator Declarations
+% =========================================================================
+
+ :-op(150,yfx,@). % function application
+% :-op(200,xfy,^). % lambda abstraction
+% :-op(400,yfx,/). % forward slash
+ :-op(350,yfx,\). % backward slash
+ :-op(500,xfx,:). % category constructor
+ :-op(600,xfx,==>). % lexical rewriting
+ :-op(600,xfx,===>). % grammar rule
+ :-op(600,fx,empty). % empty categories
+ :- op(600,xfx,macro). % lexical macros
+ :- op(600,xfx,means). % meaning postulates
+ :-op(1200,xfx,if). % conditions on rule schemes
+
+:- dynamic edge/3.
+:- dynamic emptyedge/1.
+:- dynamic active/3.
+
+
+
+
+% Lambda Calculus
+% =========================================================================
+
+% expandmng(+M:<term>, -MExp:<term>)
+% ----------------------------------------------------------------------
+% MExp is the result of recursively replacing constants with their
+% definitions in M; disallows non-determinism
+% ----------------------------------------------------------------------
+expandmng(var(V),var(V)).
+expandmng(con(C),MExp):-
+ con(C) means M, !,
+ expandmng(M,MExp).
+expandmng(con(C),con(C)).
+expandmng(V^M,V^MExp):-
+ expandmng(M,MExp).
+expandmng(M@N,MExp@NExp):-
+ expandmng(M,MExp),
+ expandmng(N,NExp).
+
+
+% normalize(+M:<term>, -MNorm:<term>)
+% ----------------------------------------------------------------------
+% MNorm is the normal form of M; all bound variables renamed
+% ----------------------------------------------------------------------
+normalize(M,MNorm):-
+ fresh_vars(M,MFr),
+ normalize_fresh(MFr,MNorm).
+
+% fresh_vars(+M:<term>, -MFr:<term>)
+% ----------------------------------------------------------------------
+% MFr is the result of renaming all bound variables
+% in M to fresh instances, using alpha-reduction
+% ----------------------------------------------------------------------
+fresh_vars(var(V),var(V)).
+fresh_vars(con(C),con(C)).
+fresh_vars(M@N,MFr@NFr):-
+ fresh_vars(M,MFr),
+ fresh_vars(N,NFr).
+fresh_vars(X^M,var(Y)^MFr):-
+ subst(M,X,var(Y),M2),
+ fresh_vars(M2,MFr).
+
+% substitute(+M:<term>, +X:<var>, +N:<term>, -L:<term>)
+% ----------------------------------------------------------------------
+% L = M[X |--> N]
+% ----------------------------------------------------------------------
+subst(var(Y),var(X),M,N):-
+ ( X == Y
+ -> N=M
+ ; N = var(Y)
+ ).
+subst(con(C),_,_,con(C)).
+subst(M@L,X,N,M2@L2):-
+ subst(M,X,N,M2),
+ subst(L,X,N,L2).
+subst(Y^M,X,N,Y^M2):-
+ ( Y == X
+ -> M2 = M
+ ; subst(M,X,N,M2)
+ ).
+
+% normalize_fresh(+M:<term>, -N:<term>)
+% ----------------------------------------------------------------------
+% M is normalized to N
+% -- all bound variables are made fresh
+% -- cut corresponds to leftmost normalization
+% ----------------------------------------------------------------------
+normalize_fresh(M,N):-
+ reduce_subterm(M,L),
+ !, normalize_fresh(L,N).
+normalize_fresh(M,M).
+
+% reduce_subterm(+M:<term>, -N:<term>)
+% ----------------------------------------------------------------------
+% N is the result of performing one beta- or
+% eta-reduction on some subterm of M;
+% -- reduces leftmost subterm first, but provides
+% all reductions on backtracking
+% ----------------------------------------------------------------------
+reduce_subterm(M,M2):-
+ reduce(M,M2).
+reduce_subterm(M@N,M2@N):-
+ reduce_subterm(M,M2).
+reduce_subterm(M@N,M@N2):-
+ reduce_subterm(N,N2).
+reduce_subterm(X^M,X^N):-
+ reduce_subterm(M,N).
+
+% reduce(+M:<term>, -N:<term>)
+% ----------------------------------------------------------------------
+% reduces M to N using beta- or eta-reduction
+% -- assumes no variable clashes
+% ----------------------------------------------------------------------
+reduce((X^M)@N,L):- % beta reduction
+ subst(M,X,N,L).
+reduce(X^(M@Y),M):- % eta reduction
+ X == Y,
+ \+ ( free_var(M,Z),
+ Z == X ).
+
+% free_var(+M:<term>, -X:<var>)
+% ----------------------------------------------------------------------
+% X is free in M
+% ----------------------------------------------------------------------
+free_var(var(V),var(V)).
+free_var(M@N,X):-
+ ( free_var(M,X)
+ ; free_var(N,X)
+ ).
+free_var(X^M,Y):-
+ free_var(M,Y),
+ Y \== X.
+
+% free_for(+N:<term>, +X:<var>, +M:<term>)
+% ----------------------------------------------------------------------
+% M is free for X in N
+% ----------------------------------------------------------------------
+free_for(var(_),_,_).
+free_for(con(_),_,_).
+free_for(L@K,X,M):-
+ free_for(L,X,M),
+ free_for(K,X,M).
+free_for(Y^L,X,M):-
+ free_for(L,X,M),
+ ( \+ free_var(L,X)
+ ; \+ free_var(M,Y)
+ ).
+
+
+% Right-Left, Bottom-Up Dynamic Chart Parser (after ALE)
+% =========================================================================
+
+% Lexical Compiler
+% ----------------------------------------------------------------------
+
+% compile_lex(+File:<file>)
+% ----------------------------------------------------------------------
+% compiles lexical entries into file
+% ----------------------------------------------------------------------
+compile_lex(File):-
+ tell(File),
+ write('% Lexical Entries'), nl,
+ write('% ---------------'), nl, nl,
+ lex(W,Syn,Sem),
+ numbervars(lexentry(W,Syn,Sem),0,_),
+ write('lexentry(\''), write(W), write('\','),
+ write(Syn),write(','), write(Sem), write(').'), nl,
+ fail.
+compile_lex(File):-
+ told,
+ compile(File).
+
+% consult_lex
+% ----------------------------------------------------------------------
+% consults lexicon in place
+% ----------------------------------------------------------------------
+consult_lex:-
+ retractall(lexentry(_,_,_)),
+ lex(W,Syn,Sem),
+ assert(lexentry(W,Syn,Sem)),
+ fail.
+consult_lex.
+
+% lex(?W:<word>, ?Syn:<syn>, ?Sem:<lambda_term>)
+% ----------------------------------------------------------------------
+% word W has syntactic category Syn and smenantic term Sem
+% ----------------------------------------------------------------------
+lex(W,SynOut,Sem):-
+ W ==> Syn : Sem,
+ expandsyn(Syn,SynOut).
+
+% expandsyn(+SynIn:<syn>, ?SynOut:<syn>)
+% ----------------------------------------------------------------------
+% the category SynIn is macro expanded recursively to SynOut
+% ----------------------------------------------------------------------
+expandsyn(Syn,Syn):-
+ var(Syn), !.
+expandsyn(SynIn,SynOut):-
+ macro(SynIn,SynMid), % cut means unique macro expansion
+ !, expandsyn(SynMid,SynOut).
+expandsyn(Syn1/Syn2,Syn1Out/Syn2Out):-
+ !, expandsyn(Syn1,Syn1Out),
+ expandsyn(Syn2,Syn2Out).
+expandsyn(Syn1\Syn2,Syn1Out\Syn2Out):-
+ !, expandsyn(Syn1,Syn1Out),
+ expandsyn(Syn2,Syn2Out).
+expandsyn(Syn1-Syn2,Syn1Out-Syn2Out):-
+ !, expandsyn(Syn1,Syn1Out),
+ expandsyn(Syn2,Syn2Out).
+expandsyn(q(Syn1,Syn2,Syn3),q(Syn1Out,Syn2Out,Syn3Out)):-
+ !, expandsyn(Syn1,Syn1Out),
+ expandsyn(Syn2,Syn2Out),
+ expandsyn(Syn3,Syn3Out).
+expandsyn(Syn,Syn):-
+ bas_syn(Syn).
+
+% bas_syn(?Syn:<syn>)
+% ----------------------------------------------------------------------
+% Syn is a basic syntactic category
+% ----------------------------------------------------------------------
+bas_syn(n(_)).
+bas_syn(np(_,_)).
+bas_syn(s(_)).
+bas_syn(coor).
+bas_syn(sc(_)).
+bas_syn(ex(_)).
+
+
+
+
+% Empty Edge Compilation
+% ----------------------------------------------------------------------
+
+% compile_empty
+% ----------------------------------------------------------------------
+% compiles empty categories, asserting all active and inactive edges
+% they can produce by themselves; always succeeds
+% ----------------------------------------------------------------------
+compile_empty:-
+ retractall(emptyedge(_)), retractall(active(_,_,_)),
+ empty SynIn:Sem,
+ expandsyn(SynIn,Syn),
+ complete(cat(Syn,Sem,[],[],empty(Syn,Sem))).
+compile_empty:-
+ bagof(C,emptyedge(C),Cs),
+ length(Cs,N),
+ nl, write(N), write(' complete empty edges'), nl,
+ bagof(D-Ds,G^active(Ds,D,G),Es),
+ length(Es,M),
+ write(M), write(' active rules with empty starts'), nl.
+
+% complete_cat(Cat:+<cat>)
+% ----------------------------------------------------------------------
+% Cat is asserted as empty, and all current active edges are tested to
+% see if Cat can extend them; fails for looping
+% ----------------------------------------------------------------------
+complete(Cat):-
+ assert(emptyedge(Cat)),
+ ( (CatM ===> [Cat|Cats] if Goal)
+ ; active(CatM,[Cat|Cats],Goal)
+ ),
+ add_active(Cats,CatM,Goal).
+
+% add_active(Cats:+<list(<cat>)>, +Cat:<cat>, +Goal:<goal>)
+% ----------------------------------------------------------------------
+% the active edge Cat --> . Cats is asserted, and any extensions
+% computed and themselves asserted; fails for looping
+% ----------------------------------------------------------------------
+add_active([],Cat,Goal):-
+ call(Goal),
+ assert(emptyedge(Cat)),
+ complete(Cat).
+add_active([Cat|Cats],CatM,Goal):-
+ assert(active([Cat|Cats],CatM,Goal)),
+ emptyedge(Cat),
+ add_active(Cats,CatM,Goal).
+
+% parse(Ws:+<list(<word>)>, Cat:?<cat>)
+% ----------------------------------------------------------------------
+% Cat can be derived from Ws
+% ----------------------------------------------------------------------
+parse(Ws,Cat):-
+ derived_analyses(Ws,WsMid),
+ retractall(edge(_,_,_)),
+ reverse(WsMid,[],WsRev),
+ build(WsRev,0,Length),
+ edge(Length,0,Cat).
+
+% derived_analyses(WsIn:+<list(<word>)>, WsOut:-<list(<word>)>)
+% ----------------------------------------------------------------------
+% computes subderivations of WsIn
+% ----------------------------------------------------------------------
+derived_analyses([],[]).
+derived_analyses([der(Ws)|Ws2],[der(Ws,Ass,Syn,Sem)|DerWs2]):-
+ !, parse(Ws,cat(Syn,Sem,Ass,[],_)),
+ \+ member(abs(_,_,_),Ass),
+ derived_analyses(Ws2,DerWs2).
+derived_analyses([W|Ws],[W|DerWs]):-
+ derived_analyses(Ws,DerWs).
+
+% build(Ws:+<list(<word>)>, Right:+<int>, Left:-<int>)
+% ----------------------------------------------------------------------
+% finishes building chart with Ws as remaing word, starting from
+% right position Right and finishing on left position Left
+% -- counts backwards, so Left > Right
+% ----------------------------------------------------------------------
+build([],Left,Left).
+build([W|Ws],Right,FinalLeft):-
+ RightPlus1 is Right+1,
+ ( buildact(W,Right,RightPlus1)
+ ; build(Ws,RightPlus1,FinalLeft)
+ ).
+
+% build_act(+W:<inputword>, +Left:<int>, +Right:<int>)
+% ----------------------------------------------------------------------
+% take action basedon whether input W is:
+% [SynCat] assume hypothetical category with syntax SynCat
+% der(WsSub,Ass,Syn,Sem) add derived result
+% W treat as input word
+% ----------------------------------------------------------------------
+buildact([SynIn],Right,RightPlus1):-
+ mapsyn(SynIn,Syn), % add unspecified features
+ !, add_edge(RightPlus1,Right,cat(Syn,var(X),[abs(Syn,var(X),N)],[],
+ ass(Syn,var(X),N))).
+buildact(der(WsSub,Ass,Syn,Sem),Right,RightPlus1):-
+ !, add_edge(RightPlus1,Right,cat(Syn,Sem,Ass,[],
+ tree(der,Syn:Sem,[ders(WsSub)]))).
+buildact(W,Right,RightPlus1):-
+ lexentry(W,Syn,Sem),
+ add_edge(RightPlus1,Right,cat(Syn,Sem,[l],[],tree(lex,Syn:Sem,[leaf(W)]))).
+buildact(W,_,_):-
+ \+ (W ==> _),
+ nl, write('Input not recognized: '), write(W), write('<br>').
+
+% mapsyn(+SynCat:<syncat>, -SynCatOut:<syncat)
+% ----------------------------------------------------------------------
+% SynCatOut is result of adding default features to subcategories of
+% SynCat if any are missing; allows [SynCat] to specify cats without
+% features for input; ones with features will be passed along
+% ----------------------------------------------------------------------
+mapsyn(A/B,AM/BM):-
+ mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(A\B,AM\BM):-
+ mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(A-B,AM-BM):-
+ mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(scop(A,B),scop(AM,BM)):-
+ mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(q(A,B,C),q(AM,BM,CM)):-
+ mapsyn(A,AM), mapsyn(B,BM), mapsyn(C,CM).
+mapsyn(s,s(_)).
+mapsyn(n,n(ind(sng))).
+mapsyn(np,np(ind(sng),nm(_))).
+mapsyn(np(X,Y),np(X,Y)).
+mapsyn(n(X),n(X)).
+mapsyn(s(X),s(X)).
+
+% add_edge(Left:+<int>, Right:+<int>, Cat:+<cat>)
+% ----------------------------------------------------------------------
+% asserts edge into chart and then tries to extend it in all possible ways
+% -- always fails to force backgracking
+% ----------------------------------------------------------------------
+add_edge(Left,Right,Cat):-
+ asserta(edge(Left,Right,Cat)),
+ ( (MotherCat ===> [Cat|Cats] if Goal)
+ ; active([Cat|Cats],MotherCat,Goal)
+ ),
+ findcats(Cats,Right,NewRight),
+ call(Goal),
+ add_edge(Left,NewRight,MotherCat).
+
+% findcats(Left:+<int>, Cats:+<cats>, Right:-<int>)
+% ----------------------------------------------------------------------
+% Cats is a list of categories spanning Left to Right
+% ----------------------------------------------------------------------
+findcats([],Left,Left).
+findcats([Cat|Cats],Left,Right):-
+ ( edge(Left,Mid,Cat),
+ findcats(Cats,Mid,Right)
+ ; emptyedge(Cat),
+ findcats(Cats,Left,Right)
+ ).
+
+% edge(Left:?<nat>, Right:?<nat>, Cat:?<cat>) (dynamic)
+% ----------------------------------------------------------------------
+% There is an edge with category Cat from Left to Right;
+% ----------------------------------------------------------------------
+
+% normalize_tree(+TreeIn:<tree>, -TreeOut:<tree>)
+% ----------------------------------------------------------------------
+% TreeOut is isomorphic to TreeIn, with normalized semantics at
+% every node
+% ----------------------------------------------------------------------
+normalize_tree(tree(Rule,Syn:Sem,Trees),
+ tree(Rule,Syn:SemNorm,TreesNorm)):-
+ normalize_fresh(Sem,SemNorm),
+ normalize_trees(Trees,TreesNorm).
+normalize_tree(ass(Syn,Var,Index),ass(Syn,Var,Index)).
+normalize_tree(leaf(Word),leaf(Word)).
+normalize_tree(ders(Word),ders(Word)).
+normalize_tree(empty(Syn,Sem),empty(Syn,SemNorm)):-
+ normalize_fresh(Sem,SemNorm).
+
+normalize_trees([],[]).
+normalize_trees([T|Ts],[TNorm|TsNorm]):-
+ normalize_tree(T,TNorm),
+ normalize_trees(Ts,TsNorm).
+
+
+% expandmng_tree(+TreeIn:<tree>, -TreeOut:<tree>)
+% ----------------------------------------------------------------------
+% TreeOut is isomorphic to TreeIn, with expanded semantics
+% every node
+% ----------------------------------------------------------------------
+expandmng_tree(tree(Rule,Syn:Sem,Trees),
+ tree(Rule,Syn:SemNorm,TreesNorm)):-
+ expandmng(Sem,SemNorm),
+ expandmng_trees(Trees,TreesNorm).
+expandmng_tree(ass(Syn,Var,Index),ass(Syn,Var,Index)).
+expandmng_tree(leaf(Word),leaf(Word)).
+expandmng_tree(ders(Word),ders(Word)).
+expandmng_tree(empty(Syn,Sem),empty(Syn,SemNorm)):-
+ expandmng(Sem,SemNorm).
+
+expandmng_trees([],[]).
+expandmng_trees([T|Ts],[TExp|TsExp]):-
+ expandmng_tree(T,TExp),
+ expandmng_trees(Ts,TsExp).
+
+
+% Grammar Rules
+% =========================================================================
+
+% C:<-cat> ===> Cs:<+list(<cat>)>
+% ----------------------------------------------------------------------
+% C can be composed of Cs; may be conditions
+
+% / elimination
+% -------------
+cat(A, Alpha@Beta, Ass3, Qs3, tree(fe,A:Alpha@Beta,[T1,T2]))
+===>
+[ cat(A/B, Alpha, Ass1, Qs1, T1),
+ cat(B, Beta, Ass2, Qs2, T2)
+] if
+ append(Ass1,Ass2,Ass3),
+ append(Qs1,Qs2,Qs3).
+
+% \ elimination
+% -------------
+cat(A, Alpha@Beta, Ass3, Qs3, tree(be,A:Alpha@Beta,[T1,T2]))
+===>
+[ cat(B, Beta, Ass1, Qs1, T1),
+ cat(B\A, Alpha, Ass2, Qs2, T2)
+] if
+ append(Ass1,Ass2,Ass3),
+ append(Qs1,Qs2,Qs3).
+
+% \ introduction
+% --------------
+cat(B\A, X^Alpha, Ass, Qs, tree(bi(N),B\A:X^Alpha,[T1]))
+===>
+[ cat(A, Alpha, [abs(B,X,N)|Ass], Qs, T1)
+] if
+ \+ T1 = tree(be,_,[_,ass(_,_,N)]), % normal
+ at_least_one_member(l,Ass), % non-empty condition
+ \+ ( subtree(tree(AssumeM,_,Ts),T1), % properly nested
+ member(TMid,Ts),
+ subtree(ass(_,_,'$VAR'(J)),TMid),
+ J == N,
+ hypothetical_mem(AssumeM,Ass,Qs) ).
+
+% / introduction
+% --------------
+cat(A/B, X^Alpha, Ass2, Qs, tree(fi(N),A/B:X^Alpha,[T1]))
+===>
+[ cat(A,Alpha,Ass1,Qs,T1)
+] if
+ \+ T1 = tree(fe,_,[_,ass(_,_,N)]), % normal
+ at_least_one_member(l,Ass1), % non-empty condition
+ select_last(Ass1,abs(B,X,N),Ass2),
+ \+ ( subtree(tree(AssumeM,_,Ts),T1), % properly nested
+ member(TMid,Ts),
+ subtree(ass(_,_,'$VAR'(J)),TMid),
+ J == N,
+ hypothetical_mem(AssumeM,Ass1,Qs) ).
+
+% - introduction
+% --------------
+cat(A-B, X^Alpha, Ass2, Qs, tree(gi(N),(A-B):X^Alpha,[T1]))
+===>
+[ cat(A, Alpha, Ass1, Qs, T1)
+] if
+ at_least_one_member(l,Ass1), % non-empty condition
+ select(abs(B,X,N),Ass1,Ass2),
+ \+ ( subtree(tree(AssumeM,_,Ts),T1), % normalized?
+ member(TMid,Ts),
+ subtree(ass(_,_,'$VAR'(J)),TMid),
+ J == N,
+ hypothetical_mem(AssumeM,Ass1,Qs) ).
+
+
+% q quantifier pushing (q-elimination part 1)
+% ----------------------------------------------------------------------
+cat(C, var(X), Ass, [gq(B,A,Q,var(X),N)|Qs],
+ tree(qqpush(N),C:var(X),[T1]))
+===>
+[ cat(q(C,B,A), Q, Ass, Qs, T1)
+] if
+ \+ T1 = tree(qqi,_,_). % normal
+
+% q quantifier popping (q-elimination part 2)
+% ----------------------------------------------------------------------
+cat(A, Q@(X^Alpha), Ass, Qs2, tree(qqpop(N),A:Q@(X^Alpha),[T1]))
+===>
+[ cat(B,Alpha,Ass,Qs1,T1)
+] if
+ select(gq(B,A,Q,X,N),Qs1,Qs2),
+ \+ ( subtree(tree(AssumeM,_,Ts),T1),
+ member(TMid,Ts),
+ subtree(tree(qqpush(J),_,_),TMid),
+ J == N,
+ hypothetical_mem(AssumeM,Ass,Qs1) ).
+
+% q quantifier introduction [restricted to q(np,s,s)]
+% ----------------------------------------------------------------------
+% restricted to A = s(_), B=np case for termination
+cat(q(np(ind(Num),Case),s(VF),s(VF)), var(P)^(var(P)@Alpha), Ass, Qs1,
+ tree(qqi,q(np(ind(Num),Case),s(VF),s(VF)):var(P)^var(P)@Alpha,[T1]))
+===>
+[ cat(np(ind(Num),Case),Alpha,Ass,Qs1,T1)
+] if
+ true.
+
+% coordination elimination
+% ----------------------------------------------------------------------
+cat(C, Sem, [], [], tree(coel,C:Sem,[T1,T2,T3]))
+===>
+[ cat(C, Sem1, Ass1, [], T1),
+ cat(coor, Alpha, Ass2, [],T2),
+ cat(C, Sem2, Ass3, [], T3)
+] if
+ \+ member(abs(_,_,_),Ass1), % coordination condition
+ \+ member(abs(_,_,_),Ass2),
+ \+ member(abs(_,_,_),Ass3),
+ \+ T1 = tree(coel,_,_),
+ \+ T2 = tree(coel,_,_),
+ make_coor(C,Alpha,Sem1,Sem2,Sem).
+
+% non-boolean coordination
+% ----------------------------------------------------------------------
+%cat(np(pl,-), con(union)@Alpha1P@Alpha3P, [], [],
+% tree(nbc,np(pl,-):con(union)@Alpha1P@Alpha3P,[T1,T2,T3]))
+%===>
+%[ cat(NP1, Alpha1, Ass1, [], T1),
+% cat(coor, nbc, Ass2, [],T2),
+% cat(NP3, Alpha3, Ass3, [], T3)
+% ]:-
+% \+ member(abs(_,_,_),Ass1), % coordination condition
+% \+ member(abs(_,_,_),Ass2),
+% \+ member(abs(_,_,_),Ass3),
+% make_nb_coor(NP1,Alpha1,Alpha1P),
+% make_nb_coor(NP3,Alpha3,Alpha3P).
+%
+% make_nb_coor(np,Alpha,con(singleton)@Alpha).
+% make_nb_coor(np(pl,+),Alpha,con(singleton)@Alpha).
+% make_nb_coor(np(pl,-),Alpha,Alpha).
+
+
+% subtree(-TSub:<tree>, +T:<tree>)
+% ----------------------------------------------------------------------
+% TSub is a subtree of T
+% ----------------------------------------------------------------------
+subtree(T,T).
+subtree(T,tree(_,_,Ts)):-
+ member(T2,Ts),
+ subtree(T,T2).
+
+% hypothetical_mem(Rule,Assumptions,Qs)
+% ----------------------------------------------------------------------
+% Rule is a member of the assumptions
+% ----------------------------------------------------------------------
+hypothetical_mem(fi(N),Ass,_):-
+ member(abs(_,_,M),Ass), N == M.
+hypothetical_mem(bi(N),Ass,_):-
+ member(abs(_,_,M),Ass), N == M.
+hypothetical_mem(gi(N),Ass,_):-
+ member(abs(_,_,M),Ass), N == M.
+hypothetical_mem(qqpush(N),_,Qs):-
+ member(gq(_,_,_,_,M),Qs), N == M.
+
+% make_coor(Cat,CoorSem,Sem1,Sem2,SemOut)
+% ----------------------------------------------------------------------
+% generalized coordination semantics CoorSem is applied to
+% Sem1 and Sem2 of type Cat, with result SemOut
+% ----------------------------------------------------------------------
+make_coor(s(_),Alpha,Sem1,Sem2,Alpha@Sem1@Sem2).
+make_coor(n(_),Alpha,Sem1,Sem2,var(X)^Alpha@(Sem1@var(X))@(Sem2@var(X))).
+make_coor(A/_,Alpha,Sem1,Sem2,var(X)^Sem):-
+ make_coor(A,Alpha,Sem1@var(X),Sem2@var(X),Sem).
+make_coor(_\A,Alpha,Sem1,Sem2,var(X)^Sem):-
+ make_coor(A,Alpha,Sem1@var(X),Sem2@var(X),Sem).
+make_coor(A-_,Alpha,Sem1,Sem2,var(X)^Sem):-
+ make_coor(A,Alpha,Sem1@var(X),Sem2@var(X),Sem).
+make_coor(q(_,_,A),Alpha,Sem1,Sem2,var(X)^Sem):-
+ make_coor(A,Alpha,Sem1@var(X),Sem2@var(X),Sem).
+
+
+% General CGI Handling
+% =========================================================================
+
+% start_up
+% ----------------------------------------------------------------------
+% executed when saved state is restarted;
+% tokenizes, parses and sends off input for handling;
+% halts on termination
+% ----------------------------------------------------------------------
+start_up:-
+% getenv('QUERY_STRING', Arg),
+ prolog_flag(argv,[Arg]),
+
+ % write('<p>'), write(Arg), nl, ttyflush,
+ ( tokenizeatom(Arg,TokenList)
+ % ,write('<p>'), write(TokenList), ttyflush
+ ; write('Input '), write(Arg), write(' could not be tokenized'), ttyflush, halt
+ ),
+ ( parse_cgi(TokenList,KeyVals)
+ % , write('<p>'), write(KeyVals), ttyflush
+ ; write('Tokens '), write(TokenList), write(' could not be parsed'), halt
+ ),
+ ( action(KeyVals)
+ ; told, write('Action '), write(KeyVals), write(' could not be executed')
+ ),
+ halt.
+
+% tokenizeatom(+Input:<atom>, -Tokens:<list(<token>)>)
+% ----------------------------------------------------------------------
+% breaks input Input into list of tokens;
+% ----------------------------------------------------------------------
+tokenizeatom(Atom,Ws):-
+ name(Atom,Cs),
+ tokenize(Cs,Xs-Xs,Ws).
+
+% tokenize(+Chars:<list(<char>)>, +CharsSoFar:<d_list(<char>)>,
+% -Tokens:<list(<token>)>)
+% ----------------------------------------------------------------------
+% Tokens is the list of tokens retrieved from Chars; ChrsSoFar
+% accumulates prefixes of atoms being recognized
+% ----------------------------------------------------------------------
+tokenize([C1,C2,C3|Cs],Xs-Ys,TsResult):- % special symbol
+ name('%',[C1]),
+ specialsymbol(C2,C3,SpecialSymbol),
+ !,
+ ( Xs = []
+ -> TsResult = [SpecialSymbol|TsOut]
+ ; Ys = [],
+ name(CsAtom,Xs),
+ TsResult = [CsAtom,SpecialSymbol|TsOut]
+ ),
+ tokenize(Cs,Zs-Zs,TsOut).
+tokenize([C|Cs],Xs-Ys,TsResult):- % one-character operator
+ isoperator(C),
+ !, name(OpToken,[C]),
+ ( Xs = []
+ -> TsResult = [OpToken|Ts]
+ ; Ys = [],
+ name(CsAtom,Xs),
+ TsResult = [CsAtom,OpToken|Ts]
+ ),
+ tokenize(Cs,Zs-Zs,Ts).
+tokenize([C|Cs],Xs-[C|Ys],Ts):- % more of string
+ tokenize(Cs,Xs-Ys,Ts).
+tokenize([],Xs-_,[]):- % no more input; nothing accum.
+ Xs = [], !.
+tokenize([],Xs-[],[CsAtom]):- % no more input; stringg accum.
+ name(CsAtom,Xs).
+
+% isoperator(+Char:<char>)
+% ----------------------------------------------------------------------
+% Char is the name of an operator character
+% ----------------------------------------------------------------------
+isoperator(Char):-
+ name(Op,[Char]),
+ isoptab(Op).
+
+isoptab('%').
+isoptab('+').
+isoptab('&').
+isoptab('=').
+
+% specialsymbol(+C1:<char>, +C2:<char>, -S:<token>)
+% ----------------------------------------------------------------------
+% C1 and C2 are the names of characters completing a % special symbol
+% ----------------------------------------------------------------------
+specialsymbol(C1,C2,S):-
+ name(N1,[C1]), name(N2,[C2]),
+ ( sstab(N1,N2,S), !
+ ; S = spec(N1,N2)
+ ).
+
+sstab(2,'C',',').
+sstab(2,'F','/').
+sstab(2,8,'(').
+sstab(2,9,')').
+sstab(5,'B','[').
+sstab(5,'C','\\').
+sstab(5,'D',']').
+sstab(3,'D','=').
+sstab(3,'E','>').
+
+
+% parse_cgi(+TokenList:<list(<token>)>, -KeyVals:<list(<keyval>)>)
+% ----------------------------------------------------------------------
+% KeyVals is Key/Val list resulting from parsing TokenList using
+% the compiled DCG to perform a top-down parse
+% ----------------------------------------------------------------------
+parse_cgi(TokenList,KeyVals):-
+ keyvalseq(KeyVals,TokenList,[]).
+
+% Grammar for Parser
+% ----------------------------------------------------------------------
+keyvalseq([KeyVal|KeyVals]) -->
+ keyval(KeyVal), andkeyvalseq(KeyVals).
+keyvalseq([]) --> [].
+
+andkeyvalseq(KeyVals) --> ['&'], keyvalseq(KeyVals).
+andkeyvalseq([]) --> [].
+
+keyval(key(Key,Val)) --> [Key,'='], valseq(Val).
+
+% valseq(rec(Ws,Cat)) --> valseq(Ws), as(Cat).
+
+% as('$ANY') --> [].
+% as(Cat) --> optplus, ['=','>'], optplus, val(Cat).
+
+% valseq([]) --> []. % subsumed by plusvalseq([]) --> []
+valseq([Val|Vals]) --> val(Val), plusvalseq(Vals).
+valseq(Vals) --> plusvalseq(Vals).
+
+plusvalseq([]) --> [].
+plusvalseq(Vals) --> ['+'], valseq(Vals).
+
+optplus --> [].
+optplus --> ['+'].
+
+val(X) --> ['['], valseq(X), [']'].
+val(der(X)) --> [der,'('], valseq(X), [')'].
+val(X) --> atomval(X).
+val(X/Y) --> atomval(X), ['/'], atomval(Y).
+val(Y\X) --> atomval(Y), ['\\'], atomval(X).
+val(X-Y) --> atomval(Y), ['-'], atomval(X).
+val(Term) --> atom(Fun), ['('], argvals(Args), [')'], {Term =.. [Fun|Args]}.
+
+argvals([]) --> [].
+argvals([Arg|Args]) -->
+ val(Arg), commaargvals(Args).
+
+commaargvals(Args) -->
+ [','], argvals(Args).
+commaargvals([]) -->
+ [].
+
+atomval(X) --> atom(X).
+atomval(X) --> ['('], val(X), [')'].
+
+atom(X) --> [X], {atomic(X)}.
+
+
+% Specific CGI Query Handling
+% =========================================================================
+
+% action(+KeyVals:<list(<keyval>)>)
+% ----------------------------------------------------------------------
+% take an action based on list of KeyVals
+% ----------------------------------------------------------------------
+action(KeyVals):-
+ retractall(keyvalscgi(_)),
+ assert(keyvalscgi(KeyVals)),
+ member(key(inputfrom,[InputFrom]),KeyVals),
+ ( InputFrom = 'Typing'
+ -> member(key(parsestringone,Ws),KeyVals)
+ ; InputFrom = 'Corpus'
+ -> member(key(parsestringtwo,Ws),KeyVals)
+ ),
+% write('<p>'), write(Ws), nl,
+ nl, write('P<font size=-1>ARSE</font> R<font size=-1>ESULTS FOR:</font> <cite>'),
+ writelist(Ws),
+ write('</cite><br><br>'), nl,
+ member(key(outputform,[OutForm]),KeyVals),
+ member(key(outputsyn,OutSynSym),KeyVals),
+ outsyn(OutSynSym,OutSyn),
+ act(OutForm,OutSyn,Ws).
+
+keyvalcgi(Key,Val):-
+keyvalscgi(KeyVals),
+ member(key(Key,Val),KeyVals).
+
+outsyn(['Any'],_).
+outsyn(['Finite','S'],s(fin)).
+outsyn(['Noun','Phrase'],np(_,_)).
+
+% act(+Form:<form>, ?Syn:<syn>, +Ws:<list(<word>)>)
+% ----------------------------------------------------------------------
+% the input Ws is parsed and output in form Form;
+% ----------------------------------------------------------------------
+act(OutForm,OutSyn,Ws):-
+ findall(Tree, ( parse(Ws,cat(OutSyn,_,Ass,[],Tree)),
+ \+ member(abs(_,_,_),Ass) ), Trees), % all parses
+ ( Trees = [],
+ !, write('<BR> No Parses Found') % none found
+ ; ( keyvalcgi(expandmng,['Yes']),
+ !, expandmng_trees(Trees,Trees2)
+ ; Trees2 = Trees
+ ),
+ ( keyvalcgi(normalize,['Yes']),
+ !, normalize_trees(Trees2,Trees3)
+ ; Trees3 = Trees2
+ ),
+ write('parse('),
+ write_term(Ws,[quoted(true)]),
+ write(',Cat).<br>'), nl,
+ actout(OutForm,Trees3)
+ ).
+
+
+
+% actout(+Form:<form>, +Ts:<list(<tree>)>)
+% ----------------------------------------------------------------------
+% return output for list of trees Ts in form Form
+% ----------------------------------------------------------------------
+actout('Text',Trees):-
+ write('<PRE>'), nl,
+ texttreelist(Trees),
+ nl, write('</PRE>').
+actout('Prawitz',Ts):-
+ htmltreelist(Ts).
+actout('Fitch',Ts):-
+ fitchtreelist(Ts).
+
+
+
+texttreelist([]).
+texttreelist([T|Ts]):-
+ pp_tree(T),
+ nl, write('<BR>'), nl,
+ texttreelist(Ts).
+
+htmltreelist([]).
+htmltreelist([T|Ts]):-
+ pp_html_table_tree(T),
+ nl, write('<BR>'), nl,
+ htmltreelist(Ts).
+
+fitchtreelist([]).
+fitchtreelist([T|Ts]):-
+ pp_html_table_fitch_tree(T),
+ nl, write('<BR>'), nl,
+ fitchtreelist(Ts).
+
+
+% PRETTY PRINTING ROUTINES
+% ======================================================================
+
+% pp_html_table_tree(+Tree:<tree>)
+% ----------------------------------------------------------------------
+% Tree is output as an HTML table; first numbered
+% ----------------------------------------------------------------------
+pp_html_table_tree(T):-
+ numbervars(T),
+% nl,
+% write_term(T,[quoted(true)]),
+% nl, write('<P>'),
+ pp_html_tree(T).
+
+% pp_html_tree(+Tree:<tree>)
+% ----------------------------------------------------------------------
+% Tree is output as an HTML table; assume numbered
+% ----------------------------------------------------------------------
+pp_html_tree(ass(Syn,V,'$VAR'(N))):-
+ write('['), pp_cat(Syn:V), write(']<sup>'), write(N), write('</sup>').
+pp_html_tree(leaf(Word)):-
+ pp_word(Word).
+pp_html_tree(ders(Words)):-
+ pp_word_list(Words).
+pp_html_tree(empty(Syn,Sem)):-
+ nl, write('<TABLE BORDER=1>'), nl,
+ write('<TR VALIGN=bottom>
+ <TD ALIGN=CENTER>-</TD>
+ <TD ROWSPAN=2 ALIGN=CENTER>Nil</TD>
+ </TR>'),
+ nl,
+ write('<TR VALIGN=bottom>
+ <TD ALIGN=CENTER>'),
+ pp_cat(Syn:Sem),
+ write('</TD></TR>'),
+ nl,
+ write('</TABLE>').
+pp_html_tree(tree(Rule,Root,SubTrees)):-
+ nl, write('<TABLE BORDER=1>'), nl,
+ write('<TR VALIGN=bottom>'), nl,
+ pp_html_trees(SubTrees,0,N),
+ nl,
+ ( Rule = lex
+ -> true
+ ; write('<TD ROWSPAN=2 ALIGN=CENTER>'), pp_rule(Rule), write('</TD>')
+ ),
+ write('</TR>'),
+ write('<TR VALIGN=bottom><TD ALIGN=CENTER COLSPAN='), write(N), write('>'),
+ pp_cat(Root),
+ write('</TD></TR>'),
+ nl, write('</TABLE>').
+
+% pp_html_trees(+Trees: <list(<tree>)>,+N:<int>,-M:<int>)
+% ----------------------------------------------------------------------
+% prints the trees in Trees, where (M-N) is the length of the list (N
+% acts as an accumulator, initialized to 0
+% ----------------------------------------------------------------------
+pp_html_trees([T|Ts],N,M):-
+ write('<TD ALIGN=center>'), pp_html_tree(T),
+ write('</TD>'),
+ K is N+1,
+ pp_html_trees(Ts,K,M).
+pp_html_trees([],N,N).
+
+% pp_html_table_fitch_tree(+T:<tree>)
+% ----------------------------------------------------------------------
+% T is numbered and output as a table Fitch-style
+% ----------------------------------------------------------------------
+pp_html_table_fitch_tree(T):-
+ numbervars(T),
+ nl, write('<TABLE BORDER=1>'),
+ pp_html_fitch_tree(T,1,_,_,_,[],_),
+ nl, write('</TABLE>').
+
+% pp_html_fitch_tree(+Tree:<tree>, +Start:<int>, -Next:<int>, -Me:<int>,
+% +Exp:<exp>,
+% +AssIn:<list(<assgn>)>, -AssOut:<list(<assgn>)>)
+% ----------------------------------------------------------------------
+% the rows of the table for Tree are printed;
+% Start is where the numbering begins; Next is the next available number
+% after last one used; Me is the row representing the output of the
+% derivation; Exp is the expression corresponding to Tree;
+% AssIn are existing assignments coming in and AssOut are assignments
+% going out (an <assgn> is a pair ass(M,X) where M is a row number on the
+% table and X is the abstracted variable)
+% ----------------------------------------------------------------------
+pp_html_fitch_tree(tree(der,Root,[ders(Words)]),M,N,M,Exp,Ass,Ass):-
+ !, nl, write('<TR><TD>'),
+ write(M), write('</TD><TD>'),
+ map_word(Words,Exp), pp_exp(Exp),
+ write('-'), pp_cat(Root),
+ write('</TD><TD>'), write('Der'), write('</TD></TR>'), nl,
+ N is M+1.
+pp_html_fitch_tree(tree(lex,Root,[leaf(Word)]),M,N,M,Word,Ass,Ass):-
+ !, nl, write('<TR><TD>'),
+ write(M), write('</TD><TD>'), pp_exp(Word), write('-'), pp_cat(Root),
+ write('</TD><TD>'), write('Lex'), write('</TD></TR>'), nl,
+ N is M+1.
+pp_html_fitch_tree(tree(fe,Root,[T1,T2]),M,N,L,Exp1+Exp2,AssIn,AssOut):-
+ !, pp_html_fitch_tree(T1,M,K,Source1,Exp1,AssIn,AssMid),
+ pp_html_fitch_tree(T2,K,L,Source2,Exp2,AssMid,AssOut),
+ nl, write('<TR><TD>'),
+ write(L), write('</TD><TD>'), pp_exp(Exp1+Exp2), write('-'), pp_cat(Root),
+ write('</TD><TD>'), write('E/ '), write((Source1,Source2)), write('</TD></TR>'), nl,
+ N is L + 1.
+pp_html_fitch_tree(tree(be,Root,[T1,T2]),M,N,L,Exp1+Exp2,AssIn,AssOut):-
+ !, pp_html_fitch_tree(T1,M,K,Source1,Exp1,AssIn,AssMid),
+ pp_html_fitch_tree(T2,K,L,Source2,Exp2,AssMid,AssOut),
+ nl, write('<TR><TD>'),
+ write(L), write('</TD><TD>'), pp_exp(Exp1+Exp2), write('-'), pp_cat(Root),
+ write('</TD><TD>'), write('E\\ '), write((Source1,Source2)), write('</TD></TR>'), nl,
+ N is L + 1.
+pp_html_fitch_tree(tree(qqi,Root,[T]),M,Next,Me,Exp,AssIn,AssOut):-
+ !, pp_html_fitch_tree(T,M,Me,Source,Exp,AssIn,AssOut),
+ nl, write('<TR><TD>'),
+ write(Me), write('</TD><TD>'), pp_exp(Exp), write('-'), pp_cat(Root),
+ write('</TD><TD>'), write('q I '), write(Source), write('</TD></TR>'), nl,
+ Next is Me+1.
+pp_html_fitch_tree(tree(coel,Root,[T1,T2,T3]),M,N,L,Exp1+Exp2+Exp3,AssIn,AssOut):-
+ !, pp_html_fitch_tree(T1,M,K,Source1,Exp1,AssIn,AssMid),
+ pp_html_fitch_tree(T2,K,L1,Source2,Exp2,AssMid,AssMid2),
+ pp_html_fitch_tree(T3,L1,L,Source3,Exp3,AssMid2,AssOut),
+ nl, write('<TR><TD>'),
+ write(L), write('</TD><TD>'), pp_exp(Exp1+Exp2+Exp3), write('-'), pp_cat(Root),
+ write('</TD><TD>'), write('E co '), write((Source1,Source2,Source3)), write('</TD></TR>'), nl,
+ N is L + 1.
+pp_html_fitch_tree(tree(fi(_),(C1/C2):(var(X)^Sem),[T]),M,Q,N,ExpNew,AssIn,AssOut):-
+ K is M+1,
+ write('<TR><TD COLSPAN=3><TABLE BORDER=1>'),
+ write('<TR><TD>'), write(M), write('</TD><TD>'),
+ X = '$VAR'(Num),
+ cat_atoms(Num,'</sub>',ExpMid),
+ cat_atoms('e<sub>',ExpMid,ExpNum),
+ pp_exp(ExpNum), write(' - '),
+ pp_cat(C2:var(X)), write('</TD><TD>'), write('Assume</TD></TR>'),
+ pp_html_fitch_tree(T,K,N,L, Exp, [ass(M,X)|AssIn],AssOut),
+ write('<TR><TD>'), write(N), write('</TD><TD>'),
+ removeexp(ExpNum,Exp,ExpNew),
+ pp_exp(ExpNew), write(' - '), pp_cat(C1/C2:var(X)^Sem), write('</TD><TD>'),
+ write('/I '), write((M,L)), write('</TD></TR>'),
+ write('</TD></TR></TABLE>'),
+ Q is N+1.
+pp_html_fitch_tree(tree(bi(_),(C2\C1):(var(X)^Sem),[T]),M,Q,N,ExpNew,AssIn,AssOut):-
+ K is M+1,
+ write('<TR><TD COLSPAN=3><TABLE BORDER=1>'),
+ write('<TR><TD>'), write(M), write('</TD><TD>'),
+ X = '$VAR'(Num),
+ cat_atoms(Num,'</sub>',ExpMid),
+ cat_atoms('e<sub>',ExpMid,ExpNum),
+ pp_exp(ExpNum), write(' - '),
+ pp_cat(C2:var(X)), write('</TD><TD>'), write('Assume</TD></TR>'),
+ pp_html_fitch_tree(T,K,N,L, Exp, [ass(M,X)|AssIn],AssOut),
+ write('<TR><TD>'), write(N), write('</TD><TD>'),
+ removeexp(ExpNum,Exp,ExpNew),
+ pp_exp(ExpNew), write(' - '), pp_cat(C2\C1:var(X)^Sem), write('</TD><TD>'),
+ write('/I '), write((M,L)), write('</TD></TR>'),
+ write('</TD></TR></TABLE>'),
+ Q is N+1.
+pp_html_fitch_tree(tree(gi(_),(C1-C2):var(X)^Sem,[T]),M,Q,N,ExpNew,AssIn,AssOut):-
+ K is M+1,
+ write('<TR><TD COLSPAN=3><TABLE BORDER=1>'),
+ write('<TR><TD>'), write(M), write('</TD><TD>'),
+ X = '$VAR'(Num),
+ cat_atoms(Num,'</sub>',ExpMid),
+ cat_atoms('e<sub>',ExpMid,ExpNum),
+ pp_exp(ExpNum), write(' - '),
+ pp_cat(C2:var(X)), write('</TD><TD>'), write('Assume</TD></TR>'),
+ pp_html_fitch_tree(T,K,N,L,Exp, [ass(M,X)|AssIn],AssOut),
+ write('<TR><TD>'), write(N), write('</TD><TD>'),
+ splitexp(ExpNum,Exp,ExpNew),
+ pp_exp(ExpNew), write(' - '),
+ pp_cat((C1-C2):var(X)^Sem), write('</TD><TD>'),
+ write('I- '), write((M,L)), write('</TD></TR>'),
+ write('</TD></TR></TABLE>'),
+ Q is N+1.
+% pp_html_fitch_tree(tree(qqpop(N),A:(Q@(X^Alpha)),[T1]),M,N,K,Exp,Ass,Ass):-
+% !, replace_qtree(qqpush(N),T1,T1Mid,T1Extract),
+% pp_html_fitch_tree(T1Extract,M,L,J,_,_,_),
+% pp_html_fitch_tree(T1Mid,L,P,I,_,_,_),
+% write('<TR><TD>'), write(P), write('</TD><TD>'),
+% pp_exp(Exp), write(' - '),
+% pp_cat(A:(Q@(X^Alpha))), write('</TD><TD>'),
+% write(' ').
+pp_html_fitch_tree(empty(Syn,Sem),M,N,M,[],Ass,Ass):-
+ !, nl, write('<TR><TD>'),
+ write(M), write('</TD><TD>'), write('NIL'), write(' '), pp_cat(Syn:Sem),
+ write('</TD><TD>'), write('Empty'), write('</TD></TR>'), nl,
+ N is M+1.
+pp_html_fitch_tree(ass(_Syn,var(Var),_),N,N,M,Exp,Ass,Ass):-
+ member(ass(M,Var),Ass),
+ Var = '$VAR'(Num),
+ cat_atoms(Num,'</sub>',ExpMid),
+ cat_atoms('e<sub>',ExpMid,Exp).
+
+% removexp(+ExpRem:<exp>,+Exp:<exp>,-ExpOut:<exp>)
+% ----------------------------------------------------------------------
+% he expression ExpRem is removed from Exp with result ExpOut
+% ----------------------------------------------------------------------
+removeexp(E,E,'NIL'):-!.
+removeexp(E,E+E2,E2):-!.
+removeexp(E,E2+E,E2):-!.
+removeexp(E,E2+E3,E2New+E3New):-
+ !, removeexp(E,E2,E2New),
+ removeexp(E,E3,E3New).
+removeexp(_,E2,E2).
+
+% splitexp(+ExpRem:<exp>, +Exp:<exp>, -ExpOut:<exp>)
+% ----------------------------------------------------------------------
+% ExpRem is removed from Exp with ExpOut left over; the extraction
+% site is represented as a split point
+% ----------------------------------------------------------------------
+splitexp(E,E,('NIL','NIL')):-!.
+splitexp(E,E+E2,('NIL',E2)):-!.
+splitexp(E,E2+E,(E2,'NIL')):-!.
+splitexp(E,E1+E2,(E3,E4+E2)):-
+ splitexp(E,E1,(E3,E4)), !.
+splitexp(E,E1+E2,(E1+E3,E4)):-
+ splitexp(E,E2,(E3,E4)).
+
+% pp_exp(+Exp:<exp>)
+% ----------------------------------------------------------------------
+% the expression Exp is output; concatenations are represented as
+% spaces and split points by (_,_) and empty by '0'
+% ----------------------------------------------------------------------
+pp_exp('NIL'):-
+ !, write(0).
+pp_exp(A+'NIL'):-
+ !, pp_exp(A).
+pp_exp(B+'NIL'):-
+ !, pp_exp(B).
+pp_exp(A+B):-
+ !, pp_exp(A), write(' '), pp_exp(B).
+pp_exp((A,B)):-
+ !, write('('), pp_exp(A), write(', '), pp_exp(B), write(')').
+pp_exp(A):-
+ pp_word(A).
+
+map_word([[_]|Ws],Exp):-
+ !, map_word(Ws,Exp).
+map_word([W|Ws],Exp):-
+ map_word(Ws,W,Exp).
+map_word([],'NIL').
+
+map_word(Ws,[_],W):-
+ !, map_word(Ws,W).
+map_word([],W,W).
+map_word([W|Ws],W1,W1+Exp):-
+ map_word(Ws,W,Exp).
+
+pp_exps([]).
+pp_exps([Exp|Exps]):-
+ pp_exp(Exp), write('+'), pp_exp(Exps).
+
+% pp_tree(+T:<tree>)
+% ----------------------------------------------------------------------
+% tree T is output in indented list notation; first number
+% ----------------------------------------------------------------------
+pp_tree(T):-
+ numbervars(T),
+ pp_tree(T,0).
+
+% pp_tree(+T:<tree>, +Col:<int>)
+% ----------------------------------------------------------------------
+% print tree T beginning at column Col
+% ----------------------------------------------------------------------
+pp_tree(empty(Syn,Sem),Col):-
+ nl, tab(Col), pp_cat(Syn:Sem), write(' via empty').
+pp_tree(ass(Syn,V,'$VAR'(N)),Column):-
+ nl, tab(Column), write('['), pp_cat(Syn:V), write(']'),
+ write('<SUP>'), write(N), write('</SUP>').
+pp_tree(leaf(Word),Column):-
+ nl, tab(Column), pp_word(Word).
+pp_tree(ders(Words),Column):-
+ nl, tab(Column), pp_word_list(Words).
+pp_tree(tree(Rule,Root,SubTrees),Column):-
+ nl, tab(Column),
+ pp_cat(Root),
+ write(' via '), pp_rule(Rule),
+ NewColumn is Column + 2,
+ pp_trees(SubTrees,NewColumn).
+
+% pp_trees(+Ts:<list(<tree>)>, +Col:<int>)
+% ----------------------------------------------------------------------
+% print tree list Ts beginning at column Col
+% ----------------------------------------------------------------------
+pp_trees([T|Ts],Column):-
+ pp_tree(T,Column),
+ pp_trees(Ts,Column).
+pp_trees([],_).
+
+% pp_word_list(+Ws:<list(<word>)>)
+% ----------------------------------------------------------------------
+% the list of words Ws is output, ignoring non-atoms
+% ----------------------------------------------------------------------
+pp_word_list([]).
+pp_word_list([W|Ws]):-
+ atom(W), !, pp_word(W), pp_word_list_rest(Ws).
+pp_word_list([_|Ws]):-
+ pp_word_list(Ws).
+
+pp_word(W):-
+ write('<I>'), write(W), write('</I>').
+
+% pp_word_list_rest(+Ws:<list(<word>)>)
+% ----------------------------------------------------------------------
+% word list Ws is output with an initial blank if Ws is non-empty
+% ----------------------------------------------------------------------
+pp_word_list_rest([]).
+pp_word_list_rest([W|Ws]):-
+ atom(W), !, write(' '), pp_word(W), pp_word_list_rest(Ws).
+pp_word_list_rest([_|Ws]):-
+ pp_word_list_rest(Ws).
+
+% pp_cat(Cat:<cat>)
+% ----------------------------------------------------------------------
+% pretty print category Cat
+% ----------------------------------------------------------------------
+pp_cat(Syn:Sem):-
+ pp_lam(Sem), write(' : '), pp_syn(Syn).
+
+% pp_syn(SynCat:<syncat>)
+% ----------------------------------------------------------------------
+% pretty print syntactic category
+% ----------------------------------------------------------------------
+pp_syn(A/B):-
+ !, pp_syn(A), write('/'), pp_syn_paren(B).
+pp_syn(A-B):-
+ !, pp_syn(A), write('-'), pp_syn_paren(B).
+pp_syn(B\A):-
+ !, pp_syn_paren(B), write('\\'), pp_syn_back(A).
+pp_syn(q(A,B,B)):-
+ !, pp_syn(scop(A,B)).
+pp_syn(q(A,B,C)):-
+ !, write('q('), pp_syn(A), write(','), pp_syn(B), write(','),
+ pp_syn(C), write(')').
+pp_syn(scop(A,B)):-
+ !, pp_syn(A), write('^^'), pp_syn(B).
+pp_syn(C):-
+ pp_bas_cat(C).
+
+% pp_syn_paren(SynCat:<syncat>)
+% ----------------------------------------------------------------------
+% pretty print syntactic category with enclosing parens if it
+% is functional (used for arguments)
+% ----------------------------------------------------------------------
+pp_syn_paren(A/B):-
+ !, pp_paren(A/B).
+pp_syn_paren(A-B):-
+ !, pp_paren(A-B).
+pp_syn_paren(B\A):-
+ !, pp_paren(B\A).
+pp_syn_paren(q(A,B,B)):-
+ !, pp_paren(q(A,B,B)).
+pp_syn_paren(q(A,B,C)):-
+ !, pp_syn(q(A,B,C)).
+pp_syn_paren(C):-
+ pp_bas_cat(C).
+
+% pp_paren(+C:<cat>)
+% ----------------------------------------------------------------------
+% category Cat is pretty printed with surrounding parens
+% ----------------------------------------------------------------------
+pp_paren(C):-
+ write('('), pp_syn(C), write(')').
+
+% pp_syn_back(+Cat:<cat>)
+% ----------------------------------------------------------------------
+% Cat is pretty printed as the result of a backward functor
+% ----------------------------------------------------------------------
+pp_syn_back(A/B):-
+ !, pp_syn_paren(A/B).
+pp_syn_back(A-B):-
+ !, pp_syn_paren(A-B).
+pp_syn_back(A):-
+ pp_syn(A).
+
+% pp_bas_cat(+BasCat:<bascat>)
+% ----------------------------------------------------------------------
+% the basic category BasCat is pretty printed
+% ----------------------------------------------------------------------
+pp_bas_cat(Cat):-
+ writecat(Cat,Atom,Subs,Sups),
+ write(Atom),
+ writesubs(Subs),
+ writesups(Sups).
+
+% writecat(+BasCat:<bascat>,-Root:<atom>,-Subs:<list>,-Sups:<list>)
+% ----------------------------------------------------------------------
+% basic category BasCat is printed as Root with superscripts Sups
+% and subscripts Subs
+% ----------------------------------------------------------------------
+writecat(np(ind(sng),nm(_)),np,[],[]):-!.
+writecat(np(ind(sng),pp(C)),np,[C],[]):-!.
+writecat(np(ind(plu),nm(_)),np,[p],[]):-!.
+writecat(np(ind(plu),pp(C)),np,[p,C],[]):-!.
+writecat(np(ind(_),nm(_)),np,[],[]):-!.
+writecat(np(set,nm(_)),np,[p],['*']):-!.
+writecat(np(set,pp(C)),np,[p,C],['*']):-!.
+writecat(np(_,_),np,[],[]):-!.
+writecat(s(fin),s,[],[]):-!.
+writecat(s('$VAR'(_)),s,[],[]):-!.
+writecat(s(V),s,[V],[]):-!.
+writecat(n(ind(plu)),n,[p],[]):-!.
+writecat(n(set),n,[p],['*']):-!.
+writecat(n(ind(sng)),n,[],[]):-!.
+writecat(n(_),n,[],[]):-!.
+writecat(sc(th(fin)),sc,[th,fin],[]):-!.
+writecat(sc(th(bse)),sc,[th,bse],[]):-!.
+writecat(sc(wh),sc,[wh],[]):-!.
+writecat(sc(if),sc,[if],[]):-!.
+writecat(sc(_),sc,[],[]):-!.
+writecat(ex(it),ex,[it],[]):-!.
+writecat(ex(th(_)),ex,[th],[]):-!.
+writecat(ex(_),ex,[],[]):-!.
+writecat(C,C,[],[]).
+
+% writesubs(+List:<list>)
+% ----------------------------------------------------------------------
+% List is output as a subscript
+% ----------------------------------------------------------------------
+writesubs([]).
+writesubs([X|Xs]):-
+ write('<SUB>'),
+ writelistsubs(Xs,X),
+ write('</SUB>').
+
+% writesups(+List:<list>)
+% ----------------------------------------------------------------------
+% List is output as a superscript
+% ----------------------------------------------------------------------
+writesups([]).
+writesups([X|Xs]):-
+ write('<SUP>'),
+ writelistsubs(Xs,X),
+ write('</SUP>').
+
+% writelistsubs(+Xs:<list>, +X:<term>)
+% ----------------------------------------------------------------------
+% Xs is written as a list with commas as separators
+% ----------------------------------------------------------------------
+writelistsubs([],X):-
+ write(X).
+writelistsubs([X|Xs],Y):-
+ write(Y), write(' ,'), writelistsubs(Xs,X).
+
+% pp_lam(+Term:<lambdaterm>)
+% ----------------------------------------------------------------------
+% lambda term Term is pretty printed
+% ----------------------------------------------------------------------
+pp_lam(Var^Alpha):-
+ !, pp_lam(Var), write('<B>. </B>'), pp_lam(Alpha).
+pp_lam(con(and)@Alpha@Beta):-
+ !, pp_lam_paren(Alpha), write(' &amp '), pp_lam_paren(Beta).
+pp_lam(con(or)@Alpha@Beta):-
+ !, pp_lam_paren(Alpha), write(' <b>or</b> '), pp_lam_paren(Beta).
+pp_lam(con(not)@Alpha):-
+ !, write(' &#172 '), write('('), pp_lam_paren(Alpha), write(')').
+pp_lam(Alpha@Beta):-
+ !, pp_lam_bracket(Alpha),
+ write('('),
+ pp_lam(Beta),
+ write(')').
+pp_lam(var('$VAR'(N))):-
+ !, write('<I>'), write(x), write('<SUB>'), write(N), write('</SUB></I>').
+pp_lam(con(Con)):-
+ write('<B>'), write(Con), write('</B>').
+
+pp_lam_bracket(A^B):-
+ !, write('('), pp_lam(A^B), write(')').
+pp_lam_bracket(A):-
+ pp_lam(A).
+
+% pp_lam_paren(+Term:<lambdaterm>)
+% ----------------------------------------------------------------------
+% lambda term Term is pretty printed
+% ----------------------------------------------------------------------
+pp_lam_paren(Var^Alpha):-
+ !, pp_lam(Var), write('<B>. </B>'), pp_lam(Alpha).
+pp_lam_paren(con(and)@Alpha@Beta):-
+ !, write('('), pp_lam_paren(Alpha), write(' &amp '), pp_lam_paren(Beta), write(')').
+pp_lam_paren(con(or)@Alpha@Beta):-
+ !, write('('), pp_lam_paren(Alpha), write(' <b>or</b> '), pp_lam_paren(Beta), write(')').
+pp_lam_paren(con(not)@Alpha):-
+ !, write(' &#172 '), write('('), pp_lam_paren(Alpha), write(')').
+pp_lam_paren(Alpha@Beta):-
+ !, pp_lam(Alpha),
+ write('('),
+ pp_lam(Beta),
+ write(')').
+pp_lam_paren(var('$VAR'(N))):-
+ !, write('<I>'), write(x), write('<SUB>'), write(N), write('</SUB></I>').
+pp_lam_paren(con(Con)):-
+ write('<B>'), write(Con), write('</B>').
+
+% pp_rule(+Rule:<rulename>)
+% ----------------------------------------------------------------------
+% rule Rule is pretty printed
+% ----------------------------------------------------------------------
+pp_rule(fe):-write('/E').
+pp_rule(be):-write('\\E').
+pp_rule(fi('$VAR'(N))):-write('/I<sup>'), write(N), write('</sup>').
+pp_rule(bi('$VAR'(N))):-write('\\I<sup>'), write(N), write('</sup>').
+pp_rule(gi('$VAR'(N))):-write('-I<sup>'), write(N), write('</sup>').
+pp_rule(qqpush('$VAR'(N))):-write('qE<sup>'), write(N), write('</sup>').
+pp_rule(qqpop('$VAR'(N))):-write(N).
+pp_rule(qqi):-write(qI).
+pp_rule(coel):-write('coE').
+pp_rule(lex):-write('L').
+pp_rule(der):-write('D').
+pp_rule(nbc):-write('NBC').
+pp_rule(qi):-write('qI').
+
+
+% Standard Utilities
+% ======================================================================
+
+member(X,[X|_]).
+member(X,[_|Xs]):-
+ member(X,Xs).
+
+append_list([],[]).
+append_list([Xs|Xss],Ys):-
+ append(Xs,Zs,Ys),
+ append_list(Xss,Zs).
+
+append([],Xs,Xs).
+append([X|Xs],Ys,[X|Zs]):-
+ append(Xs,Ys,Zs).
+
+at_least_one_member(X,[X|_]):-!.
+at_least_one_member(X,[_|Xs]):-
+ at_least_one_member(X,Xs).
+
+numbervars(X):-
+ numbervars(X,0,_).
+
+reverse([],Ws,Ws).
+reverse([W|Ws],WsAcc,WsRev):-
+ reverse(Ws,[W|WsAcc],WsRev).
+
+select(X,[X|Xs],Xs).
+select(X,[Y|Xs],[Y|Zs]):-
+ select(X,Xs,Zs).
+
+select_last([X],X,[]).
+select_last([X|Xs],Y,[X|Zs]):-
+ select_last(Xs,Y,Zs).
+
+cat_atoms(A1,A2,A3):-
+ name(A1,L1),
+ name(A2,L2),
+ append(L1,L2,L3),
+ name(A3,L3).
+
+writelist([der(Ws)|Ws2]):-
+ !, writelist(Ws), write(' '), writelist(Ws2).
+writelist([W|Ws]):-
+ write(W), write(' '),
+ writelist(Ws).
+writelist([]).
+
+write_lex_cat(File):-
+ tell(File),
+ write('<HTML><HEAD><TITLE>Natural Deduction CG Parser</TITLE></HEAD><BODY><b> L<FONT SIZE = -1>EXICON</FONT> </b><br><br><FONT SIZE=-1>'), nl, nl,
+ setof(lexe(W,Syn:Sem),lexentry(W,Syn,Sem),Ws),
+ !, writebreaklex(Ws),
+ nl, write('</FONT></HEAD></HTML>'), nl,
+ told.
+
+writebreaklex([]).
+writebreaklex([W|Ws]):-
+ writebreaklex(Ws,W).
+
+writebreaklex([],lexe(W,Cat)):-
+ write(W), write(' ==> '),
+ pp_cat(Cat), nl.
+writebreaklex([W2|Ws],lexe(W,Cat)):-
+ write(W), write(' ==> '),
+ pp_cat(Cat),
+ write(' <BR> '), nl,
+ writebreaklex(Ws,W2).
+
+write_lex(File):-
+ tell(File),
+ write('<HTML><HEAD><TITLE>Natural Deduction CG Parser</TITLE></HEAD><BODY><b> L<FONT SIZE = -1>EXICON</FONT> </b><br><FONT SIZE=-1><BR>'), nl,
+ setof(W,C^(W==>C),Ws),
+ !, writebreak(Ws),
+ nl, write('</FONT></HEAD></HTML>'), nl,
+ told.
+
+writebreak([]).
+writebreak([W|Ws]):-
+ writebreak(Ws,W).
+
+writebreak([],W):-
+ write(W), nl.
+writebreak([W2|Ws],W):-
+ write(W), write(' <BR> '), nl,
+ writebreak(Ws,W2).
+
+tt:-
+ consult(natded), consult(lexicon), consult_lex, compile_empty.
+
+mt:-
+ consult(natded), consult(lexicon), consult_lex, compile_empty, save(test3), start_up.
+
+cmt:-
+ compile(natded), compile(lexicon), compile_lex('compilelex.pl'), compile_empty, save(test3), start_up.
+
+
+%%% Local Variables:
+%%% mode: prolog
+%%% prolog-indent-width: 2
+%%% tab-width: 2
+%%% End:
diff --git a/test/etags/prol-src/ordsets.prolog b/test/etags/prol-src/ordsets.prolog
new file mode 100644
index 00000000000..7192129fdce
--- /dev/null
+++ b/test/etags/prol-src/ordsets.prolog
@@ -0,0 +1,337 @@
+/* Copyright(C) 1988, Swedish Institute of Computer Science */
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% File : ORDSETS.PL %
+% Author : Lena Flood %
+% Updated: 9 September 1988 %
+% Purpose: Ordered set manipulation utilities %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+:- module(ordsets, [
+ is_ordset/1,
+ list_to_ord_set/2,
+ ord_add_element/3,
+ ord_del_element/3,
+ ord_disjoint/2,
+ ord_intersect/2,
+ ord_intersection/3,
+ ord_intersection/4,
+ ord_intersection/2,
+ ord_member/2,
+ ord_seteq/2,
+ ord_setproduct/3,
+ ord_subset/2,
+ ord_subtract/3,
+ ord_symdiff/3,
+ ord_union/3,
+ ord_union/4,
+ ord_union/2
+ ]).
+
+% Adapted from shared code written by Richard A O'Keefe.
+
+% In this package, sets are represented by ordered lists with no
+% duplicates. Thus {c,r,a,f,t} would be [a,c,f,r,t]. The ordering
+% is defined by the @< family of term comparison predicates, which
+% is the ordering used by sort/2 and setof/3.
+
+% The benefit of the ordered representation is that the elementary
+% set operations can be done in time proportional to the Sum of the
+% argument sizes rather than their Product.
+
+
+
+% is_ordset(+Set)
+% is true when Set is an ordered set.
+
+is_ordset(X) :- var(X), !, fail.
+is_ordset([]).
+is_ordset([Head|Tail]) :-
+ is_ordset(Tail, Head).
+
+is_ordset(X, _) :- var(X), !, fail.
+is_ordset([], _).
+is_ordset([Head|Tail], Left) :-
+ Left @< Head,
+ is_ordset(Tail, Head).
+
+
+% list_to_ord_set(+List, ?Set)
+% is true when Set is the ordered representation of the set represented
+% by the unordered representation List.
+
+list_to_ord_set(List, Set) :-
+ sort(List, Set).
+
+
+% ord_add_element(+Set1, +Element -Set2)
+% is true when Set2 is Set1 with Element inserted in it, preserving
+% the order.
+
+ord_add_element([], Element, [Element]).
+ord_add_element([Head|Tail], Element, Set) :-
+ compare(Order, Head, Element),
+ ord_add_element(Order, Head, Tail, Element, Set).
+
+ord_add_element(<, Head, Tail, Element, [Head|Set]) :-
+ ord_add_element(Tail, Element, Set).
+ord_add_element(=, Head, Tail, _, [Head|Tail]).
+ord_add_element(>, Head, Tail, Element, [Element,Head|Tail]).
+
+
+% ord_del_element(+Set1, +Element, ?Set2)
+% is true when Set2 is Set1 but with Element removed.
+
+ord_del_element([], _, []).
+ord_del_element([Head|Tail], Element, Set) :-
+ compare(Order, Head, Element),
+ ord_del_element(Order, Head, Tail, Element, Set).
+
+ord_del_element(<, Head, Tail, Element, [Head|Set]) :-
+ ord_del_element(Tail, Element, Set).
+ord_del_element(=, _, Tail, _, Tail).
+ord_del_element(>, Head, Tail, _, [Head|Tail]).
+
+
+
+% ord_disjoint(+Set1, +Set2)
+% is true when the two ordered sets have no element in common.
+
+ord_disjoint(Set1, Set2) :-
+ \+ ord_intersect(Set1, Set2).
+
+
+
+% ord_intersect(+Set1, +Set2)
+% is true when the two ordered sets have at least one element in common.
+
+ord_intersect([Head1|Tail1], [Head2|Tail2]) :-
+ compare(Order, Head1, Head2),
+ ord_intersect(Order, Head1, Tail1, Head2, Tail2).
+
+ord_intersect(<, _, [Head1|Tail1], Head2, Tail2) :-
+ compare(Order, Head1, Head2),
+ ord_intersect(Order, Head1, Tail1, Head2, Tail2).
+ord_intersect(=, _, _, _, _).
+ord_intersect(>, Head1, Tail1, _, [Head2|Tail2]) :-
+ compare(Order, Head1, Head2),
+ ord_intersect(Order, Head1, Tail1, Head2, Tail2).
+
+
+
+% ord_intersection(+Set1, +Set2, ?Intersection)
+% is true when Intersection is the intersecton of Set1
+% and Set2, provided that Set1 and Set2 are ordered sets.
+
+ord_intersection([], _, []).
+ord_intersection([Head1|Tail1], Set2, Intersection) :-
+ ord_intersection3(Set2, Head1, Tail1, Intersection).
+
+ord_intersection3(<, _, Set1, Head2, Tail2, Intersection) :-
+ ord_intersection3(Set1, Head2, Tail2, Intersection).
+ord_intersection3(=, Head, Tail1, _, Tail2, [Head|Intersection]) :-
+ ord_intersection(Tail1, Tail2, Intersection).
+ord_intersection3(>, Head1, Tail1, _, Set2, Intersection) :-
+ ord_intersection3(Set2, Head1, Tail1, Intersection).
+
+% could be a disjunction, but is used in three places
+ord_intersection3([], _, _, []).
+ord_intersection3([Head2|Tail2], Head1, Tail1, Intersection) :-
+ compare(Order, Head1, Head2),
+ ord_intersection3(Order, Head1, Tail1, Head2, Tail2, Intersection).
+
+
+
+% ord_intersection(+Set1, +Set2, ?Intersection, ?Difference)
+% is true when Intersection is the intersection of Set1 and Set2,
+% and Differens is Set2 \ Set1 (like in ord_union/4),
+% provided that Set1 and Set2 are ordered sets.
+
+ord_intersection([], Set2, [], Set2).
+ord_intersection([Head1|Tail1], Set2, Intersection, Difference) :-
+ ord_intersection4(Set2, Head1, Tail1, Intersection, Difference).
+
+ord_intersection4(<, _, Set1, Head2, Tail2, Intersection, Difference) :-
+ ( Set1 = [], Intersection = [], Difference = [Head2|Tail2]
+ ; Set1 = [Head1|Tail1],
+ compare(Order, Head1, Head2),
+ ord_intersection4(Order, Head1, Tail1, Head2, Tail2, Intersection, Difference)
+ ).
+ord_intersection4(=, Head, Tail1, _, Tail2, [Head|Intersection], Difference) :-
+ ord_intersection(Tail1, Tail2, Intersection, Difference).
+ord_intersection4(>, Head1, Tail1, Head2, Set2, Intersection, [Head2|Difference]) :-
+ ord_intersection4(Set2, Head1, Tail1, Intersection, Difference).
+
+ord_intersection4([], _, _, [], []).
+ord_intersection4([Head2|Tail2], Head1, Tail1, Intersection, Difference) :-
+ compare(Order, Head1, Head2),
+ ord_intersection4(Order, Head1, Tail1, Head2, Tail2, Intersection, Difference).
+
+
+
+% ord_intersection(+Sets, ?Intersection)
+% is true when Intersection is the ordered set representation of the
+% intersection of all the sets in Sets.
+
+ord_intersection(Sets, Intersection) :-
+ length(Sets, NumberOfSets),
+ NumberOfSets > 0,
+ ord_intersection2(NumberOfSets, Sets, Intersection, []).
+
+ord_intersection2(1, [Set|Sets], Set0, Sets0) :- !,
+ Set = Set0,
+ Sets = Sets0.
+ord_intersection2(2, [Set,Set2|Sets], Intersection, Sets0) :- !,
+ Sets = Sets0,
+ ord_intersection2(Set, Set2, Intersection).
+ord_intersection2(N, Sets0, Intersection, Sets) :-
+% N > 2,
+ A is N>>1,
+ Z is N-A,
+ ord_intersection2(A, Sets0, X, Sets1),
+ ord_intersection2(Z, Sets1, Y, Sets),
+ ord_intersection(X, Y, Intersection).
+
+
+
+% ord_member(+Elt, +Set)
+% is true when Elt is a member of Set. Suggested by Mark Johnson.
+
+ord_member(X, [E|Es]) :-
+ compare(C, X, E),
+ ord_member(C, X, Es).
+
+ord_member(=, _X, _Es).
+ord_member(>, X, [E|Es]) :-
+ compare(C, X, E),
+ ord_member(C, X, Es).
+
+
+
+% ord_seteq(+Set1, +Set2)
+% is true when the two arguments represent the same set. Since they
+% are assumed to be ordered representations, they must be identical.
+
+
+ord_seteq(Set1, Set2) :-
+ Set1 == Set2.
+
+
+% ord_setproduct(+Set1, +Set2, ?SetProduct)
+% is true when SetProduct is the cartesian product of Set1 and Set2. The
+% product is represented as pairs Elem1-Elem2, where Elem1 is an element
+% from Set1 and Elem2 is an element from Set2.
+
+ord_setproduct([], _, []).
+ord_setproduct([Head|Tail], Set, SetProduct) :-
+ ord_setproduct(Set, Head, SetProduct, Rest),
+ ord_setproduct(Tail, Set, Rest).
+
+ord_setproduct([], _, Set, Set).
+ord_setproduct([Head|Tail], X, [X-Head|TailX], Tl) :-
+ ord_setproduct(Tail, X, TailX, Tl).
+
+
+
+% ord_subset(+Set1, +Set2)
+% is true when every element of the ordered set Set1 appears in the
+% ordered set Set2.
+
+ord_subset([], _).
+ord_subset([Head1|Tail1], [Head2|Tail2]) :-
+ compare(Order, Head1, Head2),
+ ord_subset(Order, Head1, Tail1, Tail2).
+
+ord_subset(=, _, Tail1, Tail2) :-
+ ord_subset(Tail1, Tail2).
+ord_subset(>, Head1, Tail1, [Head2|Tail2]) :-
+ compare(Order, Head1, Head2),
+ ord_subset(Order, Head1, Tail1, Tail2).
+
+
+
+% ord_subtract(+Set1, +Set2, ?Difference)
+% is true when Difference contains all and only the elements of Set1
+% which are not also in Set2, i.e. Set1 \ Set2.
+
+ord_subtract(Set1, Set2, Union) :-
+ prolog:subtract(Set1, Set2, Union).
+
+
+
+% ord_symdiff(+Set1, +Set2, ?Difference)
+% is true when Difference is the symmetric difference of Set1 and Set2.
+
+ord_symdiff([], Set2, Set2).
+ord_symdiff([Head1|Tail1], Set2, Symdiff) :-
+ ord_symdiff(Set2, Head1, Tail1, Symdiff).
+
+ord_symdiff(<, Head1, Set1, Head2, Tail2, [Head1|Symdiff]) :-
+ ord_symdiff(Set1, Head2, Tail2, Symdiff).
+ord_symdiff(=, _, Tail1, _, Tail2, Symdiff) :-
+ ord_symdiff(Tail1, Tail2, Symdiff).
+ord_symdiff(>, Head1, Tail1, Head2, Set2, [Head2|Symdiff]) :-
+ ord_symdiff(Set2, Head1, Tail1, Symdiff).
+
+% could be a disjunction, but is used in three places
+ord_symdiff([], Head1, Tail1, [Head1|Tail1]).
+ord_symdiff([Head2|Tail2], Head1, Tail1, Symdiff) :-
+ compare(Order, Head1, Head2),
+ ord_symdiff(Order, Head1, Tail1, Head2, Tail2, Symdiff).
+
+
+
+% ord_union(+Set1, +Set2, ?Union)
+% is true when Union is the union of Set1 and Set2. Note that when
+% something occurs in both sets, we want to retain only one copy.
+
+ord_union(Set1, Set2, Union) :-
+ prolog:merge(Set1, Set2, Union).
+
+
+
+% ord_union(+Set1, +Set2, ?Union, ?New)
+% is true when Union is the union of Set1 and Set2, and New is
+% Set2 \ Set1. This is useful if you
+% are accumulating members of a set and you want to process new
+% elements as they are added to the set.
+
+ord_union([], Set2, Set2, Set2).
+ord_union([Head1|Tail1], Set2, Union, Difference) :-
+ ord_union4(Set2, Head1, Tail1, Union, Difference).
+
+ord_union4(<, Head, Set1, Head2, Tail2, [Head|Union], Difference) :-
+ ( Set1 = [], Union = [Head2|Tail2], Difference = [Head2|Tail2]
+ ; Set1 = [Head1|Tail1],
+ compare(Order, Head1, Head2),
+ ord_union4(Order, Head1, Tail1, Head2, Tail2, Union, Difference)
+ ).
+ord_union4(=, Head, Tail1, _, Tail2, [Head|Union], Difference) :-
+ ord_union(Tail1, Tail2, Union, Difference).
+ord_union4(>, Head1, Tail1, Head2, Set2, [Head2|Union], [Head2|Difference]) :-
+ ord_union4(Set2, Head1, Tail1, Union, Difference).
+
+ord_union4([], Head1, Tail1, [Head1|Tail1], []).
+ord_union4([Head2|Tail2], Head1, Tail1, Union, Difference) :-
+ compare(Order, Head1, Head2),
+ ord_union4(Order, Head1, Tail1, Head2, Tail2, Union, Difference).
+
+
+
+% ord_union(+Sets, ?Union)
+% is true when Union is the union of all the sets in Sets.
+
+ord_union([], Union) :- !, Union = [].
+ord_union(Sets, Union) :-
+ length(Sets, NumberOfSets),
+ ord_union_all(NumberOfSets, Sets, Union, []).
+
+ord_union_all(1, [Set|Sets], Set, Sets) :- !.
+ord_union_all(2, [Set,Set2|Sets], Union, Sets) :- !,
+ ord_union(Set, Set2, Union).
+ord_union_all(N, Sets0, Union, Sets) :-
+ A is N>>1,
+ Z is N-A,
+ ord_union_all(A, Sets0, X, Sets1),
+ ord_union_all(Z, Sets1, Y, Sets),
+ ord_union(X, Y, Union).
diff --git a/test/etags/ps-src/rfc1245.ps b/test/etags/ps-src/rfc1245.ps
new file mode 100644
index 00000000000..ad2244f1dc0
--- /dev/null
+++ b/test/etags/ps-src/rfc1245.ps
@@ -0,0 +1,2085 @@
+%!
+%%BoundingBox: (atend)
+%%Pages: (atend)
+%%DocumentFonts: (atend)
+%%EndComments
+%
+% FrameMaker PostScript Prolog 2.0, for use with FrameMaker 2.0
+% Copyright (c) 1986,87,89 by Frame Technology, Inc. All rights reserved.
+%
+% Known Problems:
+% Due to bugs in Transcript, the 'PS-Adobe-' is omitted from line 1
+/FMversion (2.0) def
+% Set up Color vs. Black-and-White
+ /FMPrintInColor systemdict /colorimage known def
+% Uncomment this line to force b&w on color printer
+% /FMPrintInColor false def
+/FrameDict 190 dict def
+systemdict /errordict known not {/errordict 10 dict def
+ errordict /rangecheck {stop} put} if
+% The readline in 23.0 doesn't recognize cr's as nl's on AppleTalk
+FrameDict /tmprangecheck errordict /rangecheck get put
+errordict /rangecheck {FrameDict /bug true put} put
+FrameDict /bug false put
+mark
+% Some PS machines read past the CR, so keep the following 3 lines together!
+currentfile 5 string readline
+00
+0000000000
+cleartomark
+errordict /rangecheck FrameDict /tmprangecheck get put
+FrameDict /bug get {
+ /readline {
+ /gstring exch def
+ /gfile exch def
+ /gindex 0 def
+ {
+ gfile read pop
+ dup 10 eq {exit} if
+ dup 13 eq {exit} if
+ gstring exch gindex exch put
+ /gindex gindex 1 add def
+ } loop
+ pop
+ gstring 0 gindex getinterval true
+ } def
+ } if
+/FMVERSION {
+ FMversion ne {
+ /Times-Roman findfont 18 scalefont setfont
+ 100 100 moveto
+ (FrameMaker version does not match postscript_prolog!)
+ dup =
+ show showpage
+ } if
+ } def
+/FMLOCAL {
+ FrameDict begin
+ 0 def
+ end
+ } def
+ /gstring FMLOCAL
+ /gfile FMLOCAL
+ /gindex FMLOCAL
+ /orgxfer FMLOCAL
+ /orgproc FMLOCAL
+ /organgle FMLOCAL
+ /orgfreq FMLOCAL
+ /yscale FMLOCAL
+ /xscale FMLOCAL
+ /manualfeed FMLOCAL
+ /paperheight FMLOCAL
+ /paperwidth FMLOCAL
+/FMDOCUMENT {
+ array /FMfonts exch def
+ /#copies exch def
+ FrameDict begin
+ 0 ne dup {setmanualfeed} if
+ /manualfeed exch def
+ /paperheight exch def
+ /paperwidth exch def
+ setpapername
+ manualfeed {true} {papersize} ifelse
+ {manualpapersize} {false} ifelse
+ {desperatepapersize} if
+ /yscale exch def
+ /xscale exch def
+ currenttransfer cvlit /orgxfer exch def
+ currentscreen cvlit /orgproc exch def
+ /organgle exch def /orgfreq exch def
+ end
+ } def
+ /pagesave FMLOCAL
+ /orgmatrix FMLOCAL
+ /landscape FMLOCAL
+/FMBEGINPAGE {
+ FrameDict begin
+ /pagesave save def
+ 3.86 setmiterlimit
+ /landscape exch 0 ne def
+ landscape {
+ 90 rotate 0 exch neg translate pop
+ }
+ {pop pop}
+ ifelse
+ xscale yscale scale
+ /orgmatrix matrix def
+ gsave
+ } def
+/FMENDPAGE {
+ grestore
+ pagesave restore
+ end
+ showpage
+ } def
+/FMDEFINEFONT {
+ FrameDict begin
+ findfont
+ ReEncode
+ 2 index exch
+ definefont exch
+ scalefont
+ FMfonts 3 1 roll
+ put
+ end
+ } bind def
+/FMNORMALIZEGRAPHICS {
+ newpath
+ 0.0 0.0 moveto
+ 1 setlinewidth
+ 0 setlinecap
+ 0 0 0 sethsbcolor
+ 0 setgray
+ } bind def
+ /fx FMLOCAL
+ /fy FMLOCAL
+ /fh FMLOCAL
+ /fw FMLOCAL
+ /llx FMLOCAL
+ /lly FMLOCAL
+ /urx FMLOCAL
+ /ury FMLOCAL
+/FMBEGINEPSF {
+ end
+ /FMEPSF save def
+ /showpage {} def
+ FMNORMALIZEGRAPHICS
+ [/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall
+ fx fy translate
+ rotate
+ fw urx llx sub div fh ury lly sub div scale
+ llx neg lly neg translate
+ } bind def
+/FMENDEPSF {
+ FMEPSF restore
+ FrameDict begin
+ } bind def
+FrameDict begin
+/setmanualfeed {
+%%BeginFeature *ManualFeed True
+ statusdict /manualfeed true put
+%%EndFeature
+ } def
+/max {2 copy lt {exch} if pop} bind def
+/min {2 copy gt {exch} if pop} bind def
+/inch {72 mul} def
+/pagedimen {
+ paperheight sub abs 16 lt exch
+ paperwidth sub abs 16 lt and
+ {/papername exch def} {pop} ifelse
+ } def
+ /papersizedict FMLOCAL
+/setpapername {
+ /papersizedict 14 dict def
+ papersizedict begin
+ /papername /unknown def
+ /Letter 8.5 inch 11.0 inch pagedimen
+ /LetterSmall 7.68 inch 10.16 inch pagedimen
+ /Tabloid 11.0 inch 17.0 inch pagedimen
+ /Ledger 17.0 inch 11.0 inch pagedimen
+ /Legal 8.5 inch 14.0 inch pagedimen
+ /Statement 5.5 inch 8.5 inch pagedimen
+ /Executive 7.5 inch 10.0 inch pagedimen
+ /A3 11.69 inch 16.5 inch pagedimen
+ /A4 8.26 inch 11.69 inch pagedimen
+ /A4Small 7.47 inch 10.85 inch pagedimen
+ /B4 10.125 inch 14.33 inch pagedimen
+ /B5 7.16 inch 10.125 inch pagedimen
+ end
+ } def
+/papersize {
+ papersizedict begin
+ /Letter {lettertray} def
+ /LetterSmall {lettertray lettersmall} def
+ /Tabloid {11x17tray} def
+ /Ledger {ledgertray} def
+ /Legal {legaltray} def
+ /Statement {statementtray} def
+ /Executive {executivetray} def
+ /A3 {a3tray} def
+ /A4 {a4tray} def
+ /A4Small {a4tray a4small} def
+ /B4 {b4tray} def
+ /B5 {b5tray} def
+ /unknown {unknown} def
+ papersizedict dup papername known {papername} {/unknown} ifelse get
+ end
+ /FMdicttop countdictstack 1 add def
+ statusdict begin stopped end
+ countdictstack -1 FMdicttop {pop end} for
+ } def
+/manualpapersize {
+ papersizedict begin
+ /Letter {letter} def
+ /LetterSmall {lettersmall} def
+ /Tabloid {11x17} def
+ /Ledger {ledger} def
+ /Legal {legal} def
+ /Statement {statement} def
+ /Executive {executive} def
+ /A3 {a3} def
+ /A4 {a4} def
+ /A4Small {a4small} def
+ /B4 {b4} def
+ /B5 {b5} def
+ /unknown {unknown} def
+ papersizedict dup papername known {papername} {/unknown} ifelse get
+ end
+ stopped
+ } def
+/desperatepapersize {
+ statusdict /setpageparams known
+ {
+ paperwidth paperheight 0 1
+ statusdict begin
+ {setpageparams} stopped pop
+ end
+ } if
+ } def
+/savematrix {
+ orgmatrix currentmatrix pop
+ } bind def
+/restorematrix {
+ orgmatrix setmatrix
+ } bind def
+/dmatrix matrix def
+/dpi 72 0 dmatrix defaultmatrix dtransform
+ dup mul exch dup mul add sqrt def
+/freq dpi 18.75 div 8 div round dup 0 eq {pop 1} if 8 mul dpi exch div def
+/sangle 1 0 dmatrix defaultmatrix dtransform exch atan def
+/DiacriticEncoding [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl
+/numbersign /dollar /percent /ampersand /quotesingle /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash
+/bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h
+/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar
+/braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute
+/Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis
+/atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis
+/iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve
+/ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex
+/udieresis /dagger /.notdef /cent /sterling /section /bullet
+/paragraph /germandbls /registered /copyright /trademark /acute
+/dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef
+/yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown
+/exclamdown /logicalnot /.notdef /florin /.notdef /.notdef
+/guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde
+/Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright
+/quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis
+/fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl
+/periodcentered /quotesinglbase /quotedblbase /perthousand
+/Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute
+/Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve
+/Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron
+/breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
+] def
+/ReEncode {
+ dup
+ length
+ dict begin
+ {
+ 1 index /FID ne
+ {def}
+ {pop pop} ifelse
+ } forall
+ Encoding StandardEncoding eq
+ {
+ /Encoding DiacriticEncoding def
+ }if
+ currentdict
+ end
+ } bind def
+/graymode true def
+ /bwidth FMLOCAL
+ /bpside FMLOCAL
+ /bstring FMLOCAL
+ /onbits FMLOCAL
+ /offbits FMLOCAL
+ /xindex FMLOCAL
+ /yindex FMLOCAL
+ /x FMLOCAL
+ /y FMLOCAL
+/setpattern {
+ /bwidth exch def
+ /bpside exch def
+ /bstring exch def
+ /onbits 0 def /offbits 0 def
+ freq sangle landscape {90 add} if
+ {/y exch def
+ /x exch def
+ /xindex x 1 add 2 div bpside mul cvi def
+ /yindex y 1 add 2 div bpside mul cvi def
+ bstring yindex bwidth mul xindex 8 idiv add get
+ 1 7 xindex 8 mod sub bitshift and 0 ne
+ {/onbits onbits 1 add def 1}
+ {/offbits offbits 1 add def 0}
+ ifelse
+ }
+ setscreen
+ {} settransfer
+ offbits offbits onbits add div FMsetgray
+ /graymode false def
+ } bind def
+/grayness {
+ FMsetgray
+ graymode not {
+ /graymode true def
+ orgxfer cvx settransfer
+ orgfreq organgle orgproc cvx setscreen
+ } if
+ } bind def
+ /HUE FMLOCAL
+ /SAT FMLOCAL
+ /BRIGHT FMLOCAL
+ /Colors FMLOCAL
+FMPrintInColor
+
+ {
+ /HUE 0 def
+ /SAT 0 def
+ /BRIGHT 0 def
+ % array of arrays Hue and Sat values for the separations [HUE BRIGHT]
+ /Colors
+ [[0 0 ] % black
+ [0 0 ] % white
+ [0.00 1.0] % red
+ [0.37 1.0] % green
+ [0.60 1.0] % blue
+ [0.50 1.0] % cyan
+ [0.83 1.0] % magenta
+ [0.16 1.0] % comment / yellow
+ ] def
+
+ /BEGINBITMAPCOLOR {
+ BITMAPCOLOR} def
+ /BEGINBITMAPCOLORc {
+ BITMAPCOLORc} def
+ /K {
+ Colors exch get dup
+ 0 get /HUE exch store
+ 1 get /BRIGHT exch store
+ HUE 0 eq BRIGHT 0 eq and
+ {1.0 SAT sub setgray}
+ {HUE SAT BRIGHT sethsbcolor}
+ ifelse
+ } def
+ /FMsetgray {
+ /SAT exch 1.0 exch sub store
+ HUE 0 eq BRIGHT 0 eq and
+ {1.0 SAT sub setgray}
+ {HUE SAT BRIGHT sethsbcolor}
+ ifelse
+ } bind def
+ }
+
+ {
+ /BEGINBITMAPCOLOR {
+ BITMAPGRAY} def
+ /BEGINBITMAPCOLORc {
+ BITMAPGRAYc} def
+ /FMsetgray {setgray} bind def
+ /K {
+ pop
+ } def
+ }
+ifelse
+/normalize {
+ transform round exch round exch itransform
+ } bind def
+/dnormalize {
+ dtransform round exch round exch idtransform
+ } bind def
+/lnormalize {
+ 0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop
+ } bind def
+/H {
+ lnormalize setlinewidth
+ } bind def
+/Z {
+ setlinecap
+ } bind def
+/X {
+ fillprocs exch get exec
+ } bind def
+/V {
+ gsave eofill grestore
+ } bind def
+/N {
+ stroke
+ } bind def
+/M {newpath moveto} bind def
+/E {lineto} bind def
+/D {curveto} bind def
+/O {closepath} bind def
+ /n FMLOCAL
+/L {
+ /n exch def
+ newpath
+ normalize
+ moveto
+ 2 1 n {pop normalize lineto} for
+ } bind def
+/Y {
+ L
+ closepath
+ } bind def
+ /x1 FMLOCAL
+ /x2 FMLOCAL
+ /y1 FMLOCAL
+ /y2 FMLOCAL
+ /rad FMLOCAL
+/R {
+ /y2 exch def
+ /x2 exch def
+ /y1 exch def
+ /x1 exch def
+ x1 y1
+ x2 y1
+ x2 y2
+ x1 y2
+ 4 Y
+ } bind def
+/RR {
+ /rad exch def
+ normalize
+ /y2 exch def
+ /x2 exch def
+ normalize
+ /y1 exch def
+ /x1 exch def
+ newpath
+ x1 y1 rad add moveto
+ x1 y2 x2 y2 rad arcto
+ x2 y2 x2 y1 rad arcto
+ x2 y1 x1 y1 rad arcto
+ x1 y1 x1 y2 rad arcto
+ closepath
+ 16 {pop} repeat
+ } bind def
+/C {
+ grestore
+ gsave
+ R
+ clip
+ } bind def
+/U {
+ grestore
+ gsave
+ } bind def
+/F {
+ FMfonts exch get
+ setfont
+ } bind def
+/T {
+ moveto show
+ } bind def
+/RF {
+ rotate
+ 0 ne {-1 1 scale} if
+ } bind def
+/TF {
+ gsave
+ moveto
+ RF
+ show
+ grestore
+ } bind def
+/P {
+ moveto
+ 0 32 3 2 roll widthshow
+ } bind def
+/PF {
+ gsave
+ moveto
+ RF
+ 0 32 3 2 roll widthshow
+ grestore
+ } bind def
+/S {
+ moveto
+ 0 exch ashow
+ } bind def
+/SF {
+ gsave
+ moveto
+ RF
+ 0 exch ashow
+ grestore
+ } bind def
+/B {
+ moveto
+ 0 32 4 2 roll 0 exch awidthshow
+ } bind def
+/BF {
+ gsave
+ moveto
+ RF
+ 0 32 4 2 roll 0 exch awidthshow
+ grestore
+ } bind def
+ /x FMLOCAL
+ /y FMLOCAL
+ /dx FMLOCAL
+ /dy FMLOCAL
+ /dl FMLOCAL
+ /t FMLOCAL
+ /t2 FMLOCAL
+ /Cos FMLOCAL
+ /Sin FMLOCAL
+ /r FMLOCAL
+/W {
+ dnormalize
+ /dy exch def
+ /dx exch def
+ normalize
+ /y exch def
+ /x exch def
+ /dl dx dx mul dy dy mul add sqrt def
+ dl 0.0 gt {
+ /t currentlinewidth def
+ savematrix
+ /Cos dx dl div def
+ /Sin dy dl div def
+ /r [Cos Sin Sin neg Cos 0.0 0.0] def
+ /t2 t 2.5 mul 3.5 max def
+ newpath
+ x y translate
+ r concat
+ 0.0 0.0 moveto
+ dl t 2.7 mul sub 0.0 rlineto
+ stroke
+ restorematrix
+ x dx add y dy add translate
+ r concat
+ t 0.67 mul setlinewidth
+ t 1.61 mul neg 0.0 translate
+ 0.0 0.0 moveto
+ t2 1.7 mul neg t2 2.0 div moveto
+ 0.0 0.0 lineto
+ t2 1.7 mul neg t2 2.0 div neg lineto
+ stroke
+ t setlinewidth
+ restorematrix
+ } if
+ } bind def
+/G {
+ gsave
+ newpath
+ normalize translate 0.0 0.0 moveto
+ dnormalize scale
+ 0.0 0.0 1.0 5 3 roll arc
+ closepath fill
+ grestore
+ } bind def
+/A {
+ gsave
+ savematrix
+ newpath
+ 2 index 2 div add exch 3 index 2 div sub exch
+ normalize 2 index 2 div sub exch 3 index 2 div add exch
+ translate
+ scale
+ 0.0 0.0 1.0 5 3 roll arc
+ restorematrix
+ stroke
+ grestore
+ } bind def
+ /x FMLOCAL
+ /y FMLOCAL
+ /w FMLOCAL
+ /h FMLOCAL
+ /xx FMLOCAL
+ /yy FMLOCAL
+ /ww FMLOCAL
+ /hh FMLOCAL
+ /FMsaveobject FMLOCAL
+ /FMoptop FMLOCAL
+ /FMdicttop FMLOCAL
+/BEGINPRINTCODE {
+ /FMdicttop countdictstack 1 add def
+ /FMoptop count 4 sub def
+ /FMsaveobject save def
+ userdict begin
+ /showpage {} def
+ FMNORMALIZEGRAPHICS
+ 3 index neg 3 index neg translate
+ } bind def
+/ENDPRINTCODE {
+ count -1 FMoptop {pop pop} for
+ countdictstack -1 FMdicttop {pop end} for
+ FMsaveobject restore
+ } bind def
+/gn {
+ 0
+ { 46 mul
+ cf read pop
+ 32 sub
+ dup 46 lt {exit} if
+ 46 sub add
+ } loop
+ add
+ } bind def
+ /str FMLOCAL
+/cfs {
+ /str sl string def
+ 0 1 sl 1 sub {str exch val put} for
+ str def
+ } bind def
+/ic [
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
+ 0
+ {0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx}
+ {10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx}
+ {19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12}
+ {13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh}
+ {4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh}
+ {13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl}
+ {7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl}
+ {0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl}
+ {10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl}
+ ] def
+ /sl FMLOCAL
+ /val FMLOCAL
+ /ws FMLOCAL
+ /im FMLOCAL
+ /bs FMLOCAL
+ /cs FMLOCAL
+ /len FMLOCAL
+ /pos FMLOCAL
+/ms {
+ /sl exch def
+ /val 255 def
+ /ws cfs
+ /im cfs
+ /val 0 def
+ /bs cfs
+ /cs cfs
+ } bind def
+400 ms
+/ip {
+ is
+ 0
+ cf cs readline pop
+ { ic exch get exec
+ add
+ } forall
+ pop
+
+ } bind def
+/wh {
+ /len exch def
+ /pos exch def
+ ws 0 len getinterval im pos len getinterval copy pop
+ pos len
+ } bind def
+/bl {
+ /len exch def
+ /pos exch def
+ bs 0 len getinterval im pos len getinterval copy pop
+ pos len
+ } bind def
+/s1 1 string def
+/fl {
+ /len exch def
+ /pos exch def
+ /val cf s1 readhexstring pop 0 get def
+ pos 1 pos len add 1 sub {im exch val put} for
+ pos len
+ } bind def
+/hx {
+ 3 copy getinterval
+ cf exch readhexstring pop pop
+ } bind def
+ /h FMLOCAL
+ /w FMLOCAL
+ /d FMLOCAL
+ /lb FMLOCAL
+ /bitmapsave FMLOCAL
+ /is FMLOCAL
+ /cf FMLOCAL
+/wbytes {
+ dup
+ 8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse
+ } bind def
+/BEGINBITMAPBWc {
+ 1 {} COMMONBITMAPc
+ } bind def
+/BEGINBITMAPGRAYc {
+ 8 {} COMMONBITMAPc
+ } bind def
+/BEGINBITMAP2BITc {
+ 2 {} COMMONBITMAPc
+ } bind def
+/COMMONBITMAPc {
+ /r exch def
+ /d exch def
+ gsave
+ translate rotate scale /h exch def /w exch def
+ /lb w d wbytes def
+ sl lb lt {lb ms} if
+ /bitmapsave save def
+ r
+ /is im 0 lb getinterval def
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {ip} image
+ bitmapsave restore
+ grestore
+ } bind def
+/BEGINBITMAPBW {
+ 1 {} COMMONBITMAP
+ } bind def
+/BEGINBITMAPGRAY {
+ 8 {} COMMONBITMAP
+ } bind def
+/BEGINBITMAP2BIT {
+ 2 {} COMMONBITMAP
+ } bind def
+/COMMONBITMAP {
+ /r exch def
+ /d exch def
+ gsave
+ translate rotate scale /h exch def /w exch def
+ /bitmapsave save def
+ r
+ /is w d wbytes string def
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {cf is readhexstring pop} image
+ bitmapsave restore
+ grestore
+ } bind def
+ /proc1 FMLOCAL
+ /proc2 FMLOCAL
+ /newproc FMLOCAL
+/Fmcc {
+ /proc2 exch cvlit def
+ /proc1 exch cvlit def
+ /newproc proc1 length proc2 length add array def
+ newproc 0 proc1 putinterval
+ newproc proc1 length proc2 putinterval
+ newproc cvx
+} bind def
+/ngrayt 256 array def
+/nredt 256 array def
+/nbluet 256 array def
+/ngreent 256 array def
+ /gryt FMLOCAL
+ /blut FMLOCAL
+ /grnt FMLOCAL
+ /redt FMLOCAL
+ /indx FMLOCAL
+ /cynu FMLOCAL
+ /magu FMLOCAL
+ /yelu FMLOCAL
+ /k FMLOCAL
+ /u FMLOCAL
+/colorsetup {
+ currentcolortransfer
+ /gryt exch def
+ /blut exch def
+ /grnt exch def
+ /redt exch def
+ 0 1 255 {
+ /indx exch def
+ /cynu 1 red indx get 255 div sub def
+ /magu 1 green indx get 255 div sub def
+ /yelu 1 blue indx get 255 div sub def
+ /k cynu magu min yelu min def
+ /u k currentundercolorremoval exec def
+ nredt indx 1 0 cynu u sub max sub redt exec put
+ ngreent indx 1 0 magu u sub max sub grnt exec put
+ nbluet indx 1 0 yelu u sub max sub blut exec put
+ ngrayt indx 1 k currentblackgeneration exec sub gryt exec put
+ } for
+ {255 mul cvi nredt exch get}
+ {255 mul cvi ngreent exch get}
+ {255 mul cvi nbluet exch get}
+ {255 mul cvi ngrayt exch get}
+ setcolortransfer
+ {pop 0} setundercolorremoval
+ {} setblackgeneration
+ } bind def
+ /tran FMLOCAL
+/fakecolorsetup {
+ /tran 256 string def
+ 0 1 255 {/indx exch def
+ tran indx
+ red indx get 77 mul
+ green indx get 151 mul
+ blue indx get 28 mul
+ add add 256 idiv put} for
+ currenttransfer
+ {255 mul cvi tran exch get 255.0 div}
+ exch Fmcc settransfer
+} bind def
+/BITMAPCOLOR {
+ /d 8 def
+ gsave
+ translate rotate scale /h exch def /w exch def
+ /bitmapsave save def
+ colorsetup
+ /is w d wbytes string def
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {cf is readhexstring pop} {is} {is} true 3 colorimage
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPCOLORc {
+ /d 8 def
+ gsave
+ translate rotate scale /h exch def /w exch def
+ /lb w d wbytes def
+ sl lb lt {lb ms} if
+ /bitmapsave save def
+ colorsetup
+ /is im 0 lb getinterval def
+ ws 0 lb getinterval is copy pop
+ /cf currentfile def
+ w h d [w 0 0 h neg 0 h]
+ {ip} {is} {is} true 3 colorimage
+ bitmapsave restore
+ grestore
+ } bind def
+/BITMAPGRAY {
+ 8 {fakecolorsetup} COMMONBITMAP
+ } bind def
+/BITMAPGRAYc {
+ 8 {fakecolorsetup} COMMONBITMAPc
+ } bind def
+/ENDBITMAP {
+ } bind def
+end
+%%EndProlog
+%%BeginSetup
+(2.0) FMVERSION
+1 1 612 792 0 1 7 FMDOCUMENT
+/fillprocs 32 array def
+fillprocs 0 { 0.000000 grayness } put
+fillprocs 1 { 0.100000 grayness } put
+fillprocs 2 { 0.300000 grayness } put
+fillprocs 3 { 0.500000 grayness } put
+fillprocs 4 { 0.700000 grayness } put
+fillprocs 5 { 0.900000 grayness } put
+fillprocs 6 { 0.970000 grayness } put
+fillprocs 7 { 1.000000 grayness } put
+fillprocs 8 {<0f87c3e1f0783c1e> 8 1 setpattern } put
+fillprocs 9 {<0f1e3c78f0e1c387> 8 1 setpattern } put
+fillprocs 10 {<cccccccccccccccc> 8 1 setpattern } put
+fillprocs 11 {<ffff0000ffff0000> 8 1 setpattern } put
+fillprocs 12 {<8142241818244281> 8 1 setpattern } put
+fillprocs 13 {<8040201008040201> 8 1 setpattern } put
+fillprocs 14 {<03060c183060c081> 8 1 setpattern } put
+fillprocs 15 {} put
+fillprocs 16 { 1.000000 grayness } put
+fillprocs 17 { 0.900000 grayness } put
+fillprocs 18 { 0.700000 grayness } put
+fillprocs 19 { 0.500000 grayness } put
+fillprocs 20 { 0.300000 grayness } put
+fillprocs 21 { 0.100000 grayness } put
+fillprocs 22 { 0.030000 grayness } put
+fillprocs 23 { 0.000000 grayness } put
+fillprocs 24 {<f0783c1e0f87c3e1> 8 1 setpattern } put
+fillprocs 25 {<f0e1c3870f1e3c78> 8 1 setpattern } put
+fillprocs 26 {<3333333333333333> 8 1 setpattern } put
+fillprocs 27 {<0000ffff0000ffff> 8 1 setpattern } put
+fillprocs 28 {<7ebddbe7e7dbbd7e> 8 1 setpattern } put
+fillprocs 29 {<7fbfdfeff7fbfdfe> 8 1 setpattern } put
+fillprocs 30 {<fcf9f3e7cf9f3f7e> 8 1 setpattern } put
+fillprocs 31 {} put
+%%EndSetup
+0 12 /Times-Roman FMDEFINEFONT
+1 24 /Times-Roman FMDEFINEFONT
+2 16 /Times-Bold FMDEFINEFONT
+%%Page: "1" 1
+%%BeginPaperSize: Letter
+%%EndPaperSize
+612 792 0 FMBEGINPAGE
+72 675 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(Network Working Group) 72 712 T
+(J. Moy, Editor) 470.7 712 T
+(Request for Comments: 1245) 72 698 T
+(Proteon, Inc.) 478.38 698 T
+(July 1991) 493.02 684 T
+72 72 540 83.95 R
+7 X
+V
+0 X
+([Moy]) 72 75.95 T
+([Page 1]) 499.7 75.95 T
+72 117 540 603 R
+7 X
+V
+1 F
+0 X
+(OSPF protocol analysis) 192.72 587 T
+2 F
+(Status of this Memo) 72 514.33 T
+0 F
+-0.23 (This memo provides information for the Internet community) 72 487 P
+-0.23 (. It does not specify any Internet stan-) 360.42 487 P
+(dard. Distribution of this memo is unlimited.) 72 473 T
+2 F
+(Abstract) 72 447 T
+0 F
+-0.11 (This is the \336rst of two reports on the OSPF protocol. These reports are required by the IAB/IESG ) 72 421 P
+(in order for an Internet routing protocol to advance to Draft Standard Status. OSPF is a TCP/IP ) 72 407 T
+-0.28 (routing protocol, designed to be used internal to an Autonomous System \050in other words, OSPF is ) 72 393 P
+(an Interior Gateway Protocol\051.) 72 379 T
+-0.09 (V) 72 353 P
+-0.09 (ersion 1 of the OSPF protocol was published in RFC 1) 79.33 353 P
+-0.09 (131. Since then OSPF version 2 has been ) 339.85 353 P
+-0.22 (developed. V) 72 339 P
+-0.22 (ersion 2 has been documented in RFC 1247. The changes between version 1 and ver-) 134.4 339 P
+-0 (sion 2 of the OSPF protocol are explained in Appendix F of RFC 1247. It is OSPF V) 72 325 P
+-0 (ersion 2 that ) 477.72 325 P
+(is the subject of this report.) 72 311 T
+(This report attempts to summarize the key features of OSPF V2. It also attempts to analyze how ) 72 285 T
+(the protocol will perform and scale in the Internet.) 72 271 T
+(Please send comments to ospf@trantor) 72 245 T
+(.umd.edu.) 258.27 245 T
+FMENDPAGE
+%%EndPage: "1" 2
+1 10 /Times-Roman FMDEFINEFONT
+%%Page: "2" 2
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 2]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(T) 72 673.33 T
+(able of Contents) 81.19 673.33 T
+0 F
+(1.0) 72 650 T
+(Introduction) 108 650 T
+(..............................................................................................................) 167.91 650 T
+(3) 498 650 T
+1 F
+(1.1) 108 635.33 T
+(Acknowledgments) 144 635.33 T
+(...............................................................................................................) 219.88 635.33 T
+(3) 499 635.33 T
+0 F
+(2.0) 72 616 T
+(Key features of the OSPF protocol) 108 616 T
+(..........................................................................) 275.85 616 T
+(4) 498 616 T
+(3.0) 72 596 T
+(Cost of the protocol) 108 596 T
+(..................................................................................................) 203.89 596 T
+(7) 498 596 T
+1 F
+(3.1) 108 581.33 T
+( Operational data) 144 581.33 T
+(.................................................................................................................) 214.88 581.33 T
+(7) 499 581.33 T
+(3.2) 108 567.33 T
+(Link bandwidth) 144 567.33 T
+(...................................................................................................................) 209.88 567.33 T
+(9) 499 567.33 T
+(3.3) 108 553.33 T
+(Router memory) 144 553.33 T
+(....................................................................................................................) 207.39 553.33 T
+(9) 499 553.33 T
+(3.4) 108 539.33 T
+(Router CPU) 144 539.33 T
+(.......................................................................................................................) 194.89 539.33 T
+(10) 494.01 539.33 T
+(3.5) 108 525.33 T
+(Role of Designated Router) 144 525.33 T
+(................................................................................................) 252.36 525.33 T
+(1) 494.38 525.33 T
+(1) 499 525.33 T
+(3.6) 108 511.33 T
+(Summary) 144 511.33 T
+(...........................................................................................................................) 184.9 511.33 T
+(1) 494.38 511.33 T
+(1) 499 511.33 T
+0 F
+(4.0) 72 492 T
+(Suitable environments) 108 492 T
+(............................................................................................) 215.88 492 T
+(13) 492.01 492 T
+(5.0) 72 472 T
+(Unsuitable environments) 108 472 T
+(.......................................................................................) 230.87 472 T
+(13) 492.01 472 T
+(6.0) 72 452 T
+(Reference Documents) 108 452 T
+(............................................................................................) 215.88 452 T
+(14) 492.01 452 T
+FMENDPAGE
+%%EndPage: "2" 3
+3 14 /Times-Bold FMDEFINEFONT
+%%Page: "3" 3
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 3]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(1.0 Intr) 72 673.33 T
+(oduction) 127.23 673.33 T
+0 F
+-0.02 (This document addresses, for OSPF V2, the requirements set forth by the IAB/IESG for an Inter-) 72 646 P
+-0.19 (net routing protocol to advance to Draft Standard state. This requirements are brie\337y summarized ) 72 632 P
+(below) 72 618 T
+(. The remaining sections of this report document how OSPF V2 satis\336es these require-) 100.53 618 T
+(ments:) 72 604 T
+(\245) 72 584 T
+(What are the key features and algorithms of the protocol?) 85.54 584 T
+(\245) 72 564 T
+(How much link bandwidth, router memory and router CPU cycles does the protocol consume ) 85.54 564 T
+(under normal conditions?) 85.54 550 T
+(\245) 72 530 T
+(For these metrics, how does the usage scale as the routing environment grows? This should ) 85.54 530 T
+(include topologies at least an order of magnitude lar) 85.54 516 T
+(ger than the current environment.) 335.14 516 T
+(\245) 72 496 T
+(What are the limits of the protocol for these metrics? \050i.e., when will the routing protocol ) 85.54 496 T
+(break?\051 ) 85.54 482 T
+(\245) 72 462 T
+(For what environments is the protocol well suited, and for what is it not suitable? ) 85.54 462 T
+3 F
+(1.1 Acknowledgments) 72 428.67 T
+0 F
+-0.03 (The OSPF protocol has been developed by the OSPF W) 72 402 P
+-0.03 (orking Group of the Internet Engineering ) 339.64 402 P
+(T) 72 388 T
+(ask Force. ) 78.49 388 T
+FMENDPAGE
+%%EndPage: "3" 4
+4 12 /Times-Bold FMDEFINEFONT
+%%Page: "4" 4
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 4]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(2.0 Key featur) 72 673.33 T
+(es of the OSPF pr) 172.97 673.33 T
+(otocol) 293.49 673.33 T
+0 F
+(This section summarizes the key features of the OSPF protocol. OSPF is an) 72 646 T
+4 F
+( Internal gateway ) 434.78 646 T
+-0.2 (pr) 72 632 P
+-0.2 (otocol) 83.78 632 P
+0 F
+-0.2 (; it is designed to be used internal to a single Autonomous System. OSPF uses) 114.42 632 P
+4 F
+-0.2 ( link-state ) 486.43 632 P
+-0.36 (or SPF-based) 72 618 P
+0 F
+-0.36 ( technology \050as compared to the distance-vector or Bellman-Ford technology found ) 140.6 618 P
+-0.48 (in routing protocols such as RIP\051. Individual ) 72 604 P
+4 F
+-0.48 (link state advertisements \050LSAs\051) 285.2 604 P
+0 F
+-0.48 ( describe pieces of ) 449.99 604 P
+-0.13 (the OSPF routing domain \050Autonomous System\051. These LSAs are \337ooded throughout the routing ) 72 590 P
+(domain, forming the ) 72 576 T
+4 F
+(link state database) 173.27 576 T
+0 F
+(. Each router has an identical link state database; syn-) 268.56 576 T
+(chronization of link state databases is maintained via a ) 72 562 T
+4 F
+(r) 336.81 562 T
+(eliable \337ooding algorithm) 341.92 562 T
+0 F
+(. From this ) 473.2 562 T
+(link state database, each router builds a routing table by calculating a shortest-path tree, with the ) 72 548 T
+(root of the tree being the calculating router itself. This calculation is commonly referred to as the ) 72 534 T
+4 F
+(Dijkstra pr) 72 520 T
+(ocedur) 129.41 520 T
+(e) 164.51 520 T
+0 F
+(.) 169.83 520 T
+(Link state advertisements are small. Each advertisement describes a small pieces of the OSPF ) 72 494 T
+(routing domain, namely either: the neighborhood of a single router) 72 480 T
+(, the neighborhood of a single ) 391.97 480 T
+(transit network, a single inter) 72 466 T
+(-area route \050see below\051 or a single external route.) 212 466 T
+(The other key features of the OSPF protocol are:) 72 440 T
+(\245) 72 420 T
+4 F
+-0.31 (Adjacency bringup) 85.54 420 P
+0 F
+-0.31 (. ) 183.51 420 P
+4 F
+-0.31 (Certain pairs of OSPF r) 189.2 420 P
+-0.31 (outers become \322adjacent\323) 311.01 420 P
+0 F
+-0.31 (. As an adjacency is ) 442.96 420 P
+(formed, the two routers synchronize their link state databases by ) 85.54 406 T
+4 F
+(exchanging database sum-) 397.64 406 T
+(maries) 85.54 392 T
+0 F
+( in the form of OSPF Database Exchange packets. Adjacent routers then maintain syn-) 120.17 392 T
+(chronization of their link state databases through the ) 85.54 378 T
+4 F
+(r) 340.02 378 T
+(eliable \337ooding algorithm) 345.13 378 T
+0 F
+(. Routers ) 476.41 378 T
+-0.27 (connected by serial lines always become adjacent. On multi-access networks \050e.g., ethernets or ) 85.54 364 P
+(X.25 PDNs\051, all routers attached to the network become adjacent to both the Designated ) 85.54 350 T
+(Router and the Backup Designated router) 85.54 336 T
+(.) 283.73 336 T
+(\245) 72 316 T
+4 F
+-0.02 (Designated r) 85.54 316 P
+-0.02 (outer) 150.26 316 P
+-0.02 (.) 176.46 316 P
+0 F
+-0.02 ( A Designated Router is elected on all multi-access networks \050e.g., ether-) 179.46 316 P
+(nets or X.25 PDNs\051. The network\325) 85.54 302 T
+(s Designated Router ) 250.42 302 T
+4 F
+(originates the network LSA) 350.69 302 T
+0 F
+( describ-) 492.27 302 T
+(ing the network\325) 85.54 288 T
+(s local environment. It also plays a ) 164.15 288 T
+4 F
+(special r) 334.04 288 T
+(ole in the \337ooding algorithm) 376.8 288 T
+0 F
+(, ) 521.4 288 T
+(since all routers on the network are synchronizing their link state databases by sending and ) 85.54 274 T
+(receiving LSAs to/from the Designated Router during the \337ooding process.) 85.54 260 T
+(\245) 72 240 T
+4 F
+-0.46 (Backup Designated Router) 85.54 240 P
+0 F
+-0.46 (. A Backup Designated Router is elected on multi-access networks ) 221.87 240 P
+(to speed/ease the transition of Designated Routers when the current Designated Router disap-) 85.54 226 T
+(pears. In that event, the Backup DR takes over) 85.54 212 T
+(, and does not need to go through the adjacency ) 308.22 212 T
+-0.13 (bringup process on the LAN \050since it already had done this in its Backup capacity\051. Also, even ) 85.54 198 P
+(before the disappearance of the Designated Router is noticed, the Backup DR will enable the ) 85.54 184 T
+(reliable \337ooding algorithm to proceed in the DR\325) 85.54 170 T
+(s absence.) 320.39 170 T
+FMENDPAGE
+%%EndPage: "4" 5
+%%Page: "5" 5
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 5]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+(\245) 72 676 T
+4 F
+(Non-br) 85.54 676 T
+(oadcast multi-access network support.) 122.63 676 T
+0 F
+( OSPF treats these networks \050e.g., X.25 ) 318.51 676 T
+-0.01 (PDNs\051 pretty much as if they were LANs \050i.e., a DR is elected, and a network LSA is gener-) 85.54 662 P
+-0.29 (ated\051. Additional con\336guration information is needed however for routers attached to these net-) 85.54 648 P
+(work to initially \336nd each other) 85.54 634 T
+(.) 236.45 634 T
+(\245) 72 614 T
+4 F
+(OSPF ar) 85.54 614 T
+(eas) 130.29 614 T
+0 F
+(. OSPF allows the Autonomous Systems to be broken up into regions call areas. ) 146.28 614 T
+(This is useful for several reasons. First, it provides an extra level of ) 85.54 600 T
+4 F
+(r) 411.64 600 T
+(outing pr) 416.75 600 T
+(otection) 464.18 600 T
+0 F
+(: rout-) 504.81 600 T
+-0.29 (ing within an area is protected from all information external to the area. Second, by splitting an ) 85.54 586 P
+-0.3 (Autonomous System into areas the ) 85.54 572 P
+4 F
+-0.3 (cost of the Dijkstra pr) 254.27 572 P
+-0.3 (ocedur) 365.44 572 P
+-0.3 (e ) 400.53 572 P
+0 F
+-0.3 (\050in terms of CPU cycles\051 is ) 408.55 572 P
+(reduced.) 85.54 558 T
+(\245) 72 538 T
+4 F
+(Flexible import of external r) 85.54 538 T
+(outing information.) 230.55 538 T
+0 F
+( In OSPF) 330.5 538 T
+(, ) 374.19 538 T
+4 F
+(each external r) 380.19 538 T
+(oute) 456.58 538 T
+0 F
+( is imported ) 478.56 538 T
+(into the Autonomous System in ) 85.54 524 T
+4 F
+(a separate LSA) 240.47 524 T
+0 F
+(. This reduces the amount of \337ooding traf) 319.08 524 T
+(\336c ) 518.07 524 T
+(\050since external routes change often, and you want to only \337ood the changes\051. It also enables ) 85.54 510 T
+4 F
+-0.43 (partial r) 85.54 496 P
+-0.43 (outing table updates) 127.86 496 P
+0 F
+-0.43 ( when only a single external route changes. OSPF external LSAs ) 230.96 496 P
+(also provide the following features. A ) 85.54 482 T
+4 F
+(forwarding addr) 270.4 482 T
+(ess) 355.81 482 T
+0 F
+( can be included in the external ) 370.46 482 T
+(LSA, eliminating extra-hops at the edge of the Autonomous System. There are two levels of ) 85.54 468 T
+(external metrics that can be speci\336ed, ) 85.54 454 T
+4 F
+(type 1) 269.06 454 T
+0 F
+( and ) 300.04 454 T
+4 F
+(type 2) 323.35 454 T
+0 F
+(. Also, external routes can be tagged ) 354.33 454 T
+(with a 32-bit number \050the ) 85.54 440 T
+4 F
+(external r) 211.12 440 T
+(oute tag) 261.19 440 T
+0 F
+(; commonly used as an AS number of the route\325) 302.16 440 T
+(s ) 531.68 440 T
+(origin\051, simplifying external route management in a transit Autonomous System.) 85.54 426 T
+(\245) 72 406 T
+4 F
+(Four level r) 85.54 406 T
+(outing hierar) 145.27 406 T
+(chy) 212.69 406 T
+0 F
+(. OSPF has a four level routing hierarchy) 229.9 406 T
+(, or trust model: ) 426.32 406 T
+4 F
+(intra-) 505.94 406 T
+(ar) 85.54 392 T
+(ea) 96.64 392 T
+0 F
+(, ) 107.96 392 T
+4 F
+(inter) 113.96 392 T
+(-ar) 138.16 392 T
+(ea) 153.26 392 T
+0 F
+(, ) 164.59 392 T
+4 F
+(external type 1) 170.58 392 T
+0 F
+( and ) 246.52 392 T
+4 F
+(external type 2) 269.84 392 T
+0 F
+( routes. This enables multiple levels of ) 345.78 392 T
+(routing protection, and simpli\336es routing management in an Autonomous System.) 85.54 378 T
+(\245) 72 358 T
+4 F
+(V) 85.54 358 T
+(irtual links) 93.75 358 T
+0 F
+(. By allowing the con\336guration of virtual links, OSPF ) 150.07 358 T
+4 F
+(r) 410.94 358 T
+(emoves topological ) 416.05 358 T
+(r) 85.54 344 T
+(estrictions) 90.64 344 T
+0 F
+( on area layout in an Autonomous System.) 143.27 344 T
+(\245) 72 324 T
+4 F
+-0.32 (Authentication of r) 85.54 324 P
+-0.32 (outing pr) 182.62 324 P
+-0.32 (otocol exchanges) 229.74 324 P
+0 F
+-0.32 (. Every time an OSPF router receives a routing ) 315.03 324 P
+(protocol packet, it authenticates the packet before processing it further) 85.54 310 T
+(.) 422.61 310 T
+(\245) 72 290 T
+4 F
+-0.03 (Flexible r) 85.54 290 P
+-0.03 (outing metric.) 134.26 290 P
+0 F
+-0.03 ( In OSPF) 206.18 290 P
+-0.03 (, metric are assigned to outbound router interfaces. The cost ) 249.82 290 P
+(of a path is then the sum of the path\325) 85.54 276 T
+(s component interfaces. The routing metric itself can be ) 260.42 276 T
+(assigned by the system administrator to indicate any combination of network characteristics ) 85.54 262 T
+(\050e.g., delay) 85.54 248 T
+(, bandwidth, dollar cost, etc.\051.) 138.04 248 T
+(\245) 72 228 T
+4 F
+-0.09 (Equal-cost multipath.) 85.54 228 P
+0 F
+-0.09 ( When multiple best cost routes to a destination exist, OSPF \336nds them ) 196.73 228 P
+(and they can be then used to load share traf) 85.54 214 T
+(\336c to the destination.) 292.82 214 T
+(\245) 72 194 T
+4 F
+(T) 85.54 194 T
+(OS-based r) 93.32 194 T
+(outing.) 150.74 194 T
+0 F
+( Separate sets of routes can be calculated for each IP type of service. For ) 186.4 194 T
+(example, low delay traf) 85.54 180 T
+(\336c could be routed on one path, while high bandwidth traf) 198.56 180 T
+(\336c is routed ) 477.16 180 T
+-0.39 (on another) 85.54 166 P
+-0.39 (. This is done by \050optionally\051 assigning, to each outgoing router interface, one metric ) 135.44 166 P
+(for each IP T) 85.54 152 T
+(OS.) 148.26 152 T
+(\245) 72 132 T
+4 F
+(V) 85.54 132 T
+(ariable-length subnet support.) 93.09 132 T
+0 F
+( OSPF includes support for variable-length subnet masks by ) 248.02 132 T
+(carrying a network mask with each advertised destination.) 85.54 118 T
+FMENDPAGE
+%%EndPage: "5" 6
+%%Page: "6" 6
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 6]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+(\245) 72 676 T
+4 F
+-0.08 (Stub ar) 85.54 676 P
+-0.08 (ea support. ) 123.56 676 P
+0 F
+-0.08 (T) 183.69 676 P
+-0.08 (o support routers having insuf) 190.18 676 P
+-0.08 (\336cient memory) 333.53 676 P
+-0.08 (, areas can be con\336gured as ) 405.63 676 P
+(stubs. External LSAs \050often making up the bulk of the Autonomous System\051 are not \337ooded ) 85.54 662 T
+(into/throughout stub areas. Routing to external destinations in stub areas is based solely on ) 85.54 648 T
+(default.) 85.54 634 T
+FMENDPAGE
+%%EndPage: "6" 7
+%%Page: "7" 7
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 7]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(3.0 Cost of the pr) 72 673.33 T
+(otocol) 193.4 673.33 T
+0 F
+-0.1 (This section attempts to analyze how the OSPF protocol will perform and scale in the Internet. In ) 72 646 P
+(this analysis, we will concentrate on the following four areas:) 72 632 T
+(\245) 72 612 T
+4 F
+(Link bandwidth) 85.54 612 T
+0 F
+(. In OSPF) 168.53 612 T
+(, a reliable \337ooding mechanism is used to ensure that router link ) 215.22 612 T
+(state databases are remained synchronized. Individual components of the link state databases ) 85.54 598 T
+-0.17 (\050the LSAs\051 are refreshed infrequently \050every 30 minutes\051, at least in the absence of topological ) 85.54 584 P
+(changes. Still, as the size of the database increases, the amount of link bandwidth used by the ) 85.54 570 T
+(\337ooding procedure also increases.) 85.54 556 T
+(\245) 72 536 T
+4 F
+-0.03 (Router memory) 85.54 536 P
+0 F
+-0.03 (. The size of an OSPF link state database can get quite lar) 166.32 536 P
+-0.03 (ge, especially in the ) 441.86 536 P
+(presence of many external LSAs. This imposes requirements on the amount of router memory ) 85.54 522 T
+(available.) 85.54 508 T
+(\245) 72 488 T
+4 F
+(CPU usage) 85.54 488 T
+0 F
+(. In OSPF) 141.83 488 T
+(, this is dominated by the length of time it takes to run the shortest path ) 188.52 488 T
+(calculation \050Dijkstra procedure\051. This is a function of the number of routers in the OSPF sys-) 85.54 474 T
+(tem.) 85.54 460 T
+(\245) 72 440 T
+4 F
+(Role of the Designated Router) 85.54 440 T
+(.) 238.32 440 T
+0 F
+( The Designated router receives and sends more packets on a ) 241.32 440 T
+-0.46 (multi-access networks than the other routers connected to the network. Also, there is some time ) 85.54 426 P
+(involved in cutting over to a new Designated Router after the old one fails \050especially when ) 85.54 412 T
+(both the Backup Designated Router and the Designated Router fail at the same time\051. For this ) 85.54 398 T
+-0.27 (reason, it is possible that you may want to limit the number of routers connected to a single net-) 85.54 384 P
+(work.) 85.54 370 T
+(The remaining section will analyze these areas, estimating how much resources the OSPF proto-) 72 344 T
+-0.05 (col will consume, both now and in the future. T) 72 330 P
+-0.05 (o aid in this analysis, the next section will present ) 298.93 330 P
+(some data that have been collected in actual OSPF \336eld deployments.) 72 316 T
+3 F
+(3.1 Operational data) 72 282.67 T
+0 F
+-0.44 (The OSPF protocol has been deployed in a number of places in the Internet. For a summary of this ) 72 256 P
+(deployment, see [1]. Some statistics have been gathered from this operational experience, via ) 72 242 T
+-0.03 (local network management facilities. Some of these statistics are presented in the following table:) 72 228 P
+FMENDPAGE
+%%EndPage: "7" 8
+5 10 /Times-Bold FMDEFINEFONT
+%%Page: "8" 8
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 8]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+72 666.01 540 674 C
+72 671.98 540 671.98 2 L
+0.5 H
+0 Z
+0 X
+0 K
+N
+0 0 612 792 C
+5 F
+0 X
+0 K
+(T) 72 677.33 T
+(ABLE 1. Pertinent operational statistics) 77.93 677.33 T
+(Statistic) 72 655.34 T
+(BARRNet) 216 655.34 T
+(NSI) 324 655.34 T
+(OARnet) 432 655.34 T
+1 F
+(Data gathering \050duration\051) 72 638.34 T
+(99 hours) 216 638.34 T
+(277 hours) 324 638.34 T
+(28 hours) 432 638.34 T
+(Dijkstra frequency) 72 622.34 T
+(50 minutes) 216 622.34 T
+(25 minutes) 324 622.34 T
+(13 minutes) 432 622.34 T
+(External incremental frequency) 72 606.34 T
+(1.2 minutes) 216 606.34 T
+(.98 minutes) 324 606.34 T
+(not gathered) 432 606.34 T
+(Database turnover) 72 590.34 T
+(29.7 minutes) 216 590.34 T
+(30.9 minutes) 324 590.34 T
+(28.2 minutes) 432 590.34 T
+(LSAs per packet) 72 574.34 T
+(3.38) 216 574.34 T
+(3.16) 324 574.34 T
+(2.99) 432 574.34 T
+(Flooding retransmits) 72 558.34 T
+(1.3%) 216 558.34 T
+(1.4%) 324 558.34 T
+(.7%) 432 558.34 T
+0 F
+(The \336rst line in the above table show the length of time that statistics were gathered on the three ) 72 533.01 T
+(networks. A brief description of the other statistics follows:) 72 519.01 T
+(\245) 72 499.01 T
+4 F
+(Dijkstra fr) 85.54 499.01 T
+(equency) 140.27 499.01 T
+(. ) 181.59 499.01 T
+0 F
+(In OSPF) 187.59 499.01 T
+(, the Dijkstra calculation involves only those routers and transit ) 228.28 499.01 T
+-0.14 (networks belonging to the AS. The Dijkstra is run only when something in the system changes ) 85.54 485.01 P
+(\050like a serial line between two routers goes down\051. Note that in these operational systems, the ) 85.54 471.01 T
+(Dijkstra process runs only infrequently \050the most frequent being every 13 minutes\051.) 85.54 457.01 T
+(\245) 72 437.01 T
+4 F
+(External incr) 85.54 437.01 T
+(emental fr) 153.61 437.01 T
+(equency) 206.35 437.01 T
+0 F
+(. In OSPF) 247.54 437.01 T
+(, when an external route changes only its entry in ) 294.23 437.01 T
+-0.13 (the routing table is recalculated. These are called external incremental updates. Note that these ) 85.54 423.01 P
+(happen much more frequently than the Dijkstra procedure. \050in other words, incremental ) 85.54 409.01 T
+(updates are saving quite a bit of processor time\051.) 85.54 395.01 T
+(\245) 72 375.01 T
+4 F
+-0.45 (Database turnover) 85.54 375.01 P
+-0.45 (.) 179.58 375.01 P
+0 F
+-0.45 ( In OSPF) 182.58 375.01 P
+-0.45 (, link state advertisements are refreshed at a minimum of every 30 ) 225.36 375.01 P
+(minutes. New advertisement instances are sent out more frequently when some part of the ) 85.54 361.01 T
+-0.2 (topology changes. The table shows that, even taking topological changes into account, on aver-) 85.54 347.01 P
+(age an advertisement is updated close to only every 30 minutes. This statistic will be used in ) 85.54 333.01 T
+(the link bandwidth calculations below) 85.54 319.01 T
+(. Note that NSI actually shows advertisements updated ) 267.31 319.01 T
+(every 30.7 \050> 30\051 minutes. This probably means that at one time earlier in the measurement ) 85.54 305.01 T
+(period, NSI had a smaller link state database that it did at the end.) 85.54 291.01 T
+(\245) 72 271.01 T
+4 F
+-0.39 (LSAs per packet.) 85.54 271.01 P
+0 F
+-0.39 ( In OSPF) 173.04 271.01 P
+-0.39 (, multiple LSAs can be included in either Link State Update or Link ) 215.95 271.01 P
+-0.35 (State Acknowledgment packets.The table shows that, on average, around 3 LSAs are carried in ) 85.54 257.01 P
+(a single packet. This statistic is used when calculating the header overhead in the link band-) 85.54 243.01 T
+(width calculation below) 85.54 229.01 T
+(. This statistic was derived by diving the number of LSAs \337ooded by ) 200.01 229.01 T
+(the number of \050non-hello\051 multicasts sent.) 85.54 215.01 T
+(\245) 72 195.01 T
+4 F
+(Flooding r) 85.54 195.01 T
+(etransmits.) 138.97 195.01 T
+0 F
+( This counts both retransmission of LS Update packets and Link State ) 195.92 195.01 T
+(Acknowledgment packets, as a percentage of the original multicast \337ooded packets. The table ) 85.54 181.01 T
+(shows that \337ooding is working well, and that retransmits can be ignored in the link bandwidth ) 85.54 167.01 T
+(calculation below) 85.54 153.01 T
+(.) 169.69 153.01 T
+FMENDPAGE
+%%EndPage: "8" 9
+%%Page: "9" 9
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 9]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+3 F
+0 X
+(3.2 Link bandwidth) 72 674.67 T
+0 F
+-0.02 (In this section we attempt to calculate how much link bandwidth is consumed by the OSPF \337ood-) 72 648 P
+(ing process. The amount of link bandwidth consumed increases linearly with the number of ) 72 634 T
+(advertisements present in the OSPF database.W) 72 620 T
+(e assume that the majority of advertisements in ) 300.88 620 T
+(the database will be AS external LSAs \050operationally this is true, see [1]\051.) 72 606 T
+(From the statistics presented in Section 3.1, any particular advertisement is \337ooded \050on average\051 ) 72 580 T
+(every 30 minutes. In addition, three advertisements \336t in a single packet. \050This packet could be ) 72 566 T
+(either a Link State Update packet or a Link State Acknowledgment packet; in this analysis we ) 72 552 T
+(select the Link State Update packet, which is the lar) 72 538 T
+(ger\051. An AS external LSA is 36 bytes long. ) 320.93 538 T
+(Adding one third of a packet header \050IP header plus OSPF Update packet\051 yields 52 bytes. T) 72 524 T
+(rans-) 515.59 524 T
+(mitting this amount of data every 30 minutes gives an average rate of 23/100 bits/second.) 72 510 T
+-0.05 (If you want to limit your routing traf) 72 484 P
+-0.05 (\336c to 5% of the link\325) 247.03 484 P
+-0.05 (s total bandwidth, you get the following ) 345.75 484 P
+(maximums for database size:) 72 470 T
+72 434.01 540 442 C
+72 439.98 540 439.98 2 L
+0.5 H
+0 Z
+0 X
+0 K
+N
+0 0 612 792 C
+5 F
+0 X
+0 K
+(T) 72 445.33 T
+(ABLE 2. Database size as a function of link speed \0505% utilization\051) 77.93 445.33 T
+(Speed) 180 423.34 T
+(# external advertisements) 288 423.34 T
+1 F
+(9.6 Kb) 180 406.34 T
+(2087) 288 406.34 T
+(56 Kb) 180 390.34 T
+(12,174) 288 390.34 T
+0 F
+-0.46 (Higher line speeds have not been included, because other factors will then limit database size \050like ) 72 365.01 P
+-0.12 (router memory\051 before line speed becomes a factor) 72 351.01 P
+-0.12 (. Note that in the above calculation, the size of ) 315.32 351.01 P
+-0.06 (the data link header was not taken into account. Also, note that while the OSPF database is likely ) 72 337.01 P
+(to be mostly external LSAs, other LSAs have a size also. As a ballpark estimate, router links and ) 72 323.01 T
+-0.01 (network links are generally three times as lar) 72 309.01 P
+-0.01 (ge as an AS external link, with summary link adver-) 287.18 309.01 P
+(tisements being the same size as external link LSAs.) 72 295.01 T
+(OSPF consumes considerably less link bandwidth than RIP) 72 269.01 T
+(. This has been shown experimentally ) 355.51 269.01 T
+(in the NSI network. See Jef) 72 255.01 T
+(frey Bur) 203.69 255.01 T
+(gan\325) 243.77 255.01 T
+(s \322NASA Sciences Internet\323 report in [3].) 264.42 255.01 T
+3 F
+(3.3 Router memory) 72 221.67 T
+0 F
+-0.1 (Memory requirements in OSPF are dominated by the size of the link state database. As in the pre-) 72 195.01 P
+(vious section, it is probably safe to assume that most of the advertisements in the database are ) 72 181.01 T
+(external LSAs. While an external LSA is 36 bytes long, it is generally stored by an OSPF imple-) 72 167.01 T
+-0.34 (mentation together with some support data. So a good estimate of router memory consumed by an ) 72 153.01 P
+(external LSA is probably 64 bytes. So a database having 10,000 external LSAs will consume ) 72 139.01 T
+(640K bytes of router memory) 72 125.01 T
+(. OSPF de\336nitely requires more memory than RIP) 213.79 125.01 T
+(.) 452.98 125.01 T
+FMENDPAGE
+%%EndPage: "9" 10
+%%Page: "10" 10
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 10]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+-0.35 (Using the Proteon P4200 implementation as an example, the P4200 has 2Mbytes of memory) 72 676 P
+-0.35 (. This ) 510.38 676 P
+-0.02 (is shared between instruction, data and packet buf) 72 662 P
+-0.02 (fer memory) 310.78 662 P
+-0.02 (. The P4200 has enough memory to ) 366.26 662 P
+(store 10, 000 external LSAs, and still have enough packet buf) 72 648 T
+(fer memory available to run a rea-) 367.58 648 T
+(sonable number of interfaces.) 72 634 T
+(Also, note that while the OSPF database is likely to be mostly external LSAs, other LSAs have a ) 72 608 T
+-0.06 (size also. As a ballpark estimate, router links and network links consume generally three times as ) 72 594 P
+(much memory as an AS external link, with summary link advertisements being the same size as ) 72 580 T
+(external link LSAs.) 72 566 T
+3 F
+(3.4 Router CPU) 72 532.67 T
+0 F
+(Assume that, as the size of the OSPF routing domain grows, the number of interfaces per router ) 72 506 T
+(stays bounded. Then the Dijkstra calculation is of order \050n * log \050n\051\051, where n is the number of ) 72 492 T
+(routers in the routing domain. \050This is the complexity of the Dijkstra algorithm in a sparse net-) 72 478 T
+(work\051. Of course, it is implementation speci\336c as to how expensive the Dijkstra really is.) 72 464 T
+(W) 72 438 T
+(e have no experimental numbers for the cost of the Dijkstra calculation in a real OSPF imple-) 82.36 438 T
+(mentation. However) 72 424 T
+(, Steve Deering presented results for the Dijkstra calculation in the \322MOSPF ) 169.45 424 T
+(meeting report\323 in [3]. Steve\325) 72 410 T
+(s calculation was done on a DEC 5000 \05010 mips processor\051, using ) 212.9 410 T
+(the Stanford internet as a model. His graphs are based on numbers of networks, not number of ) 72 396 T
+(routers. However) 72 382 T
+(, if we extrapolate that the ratio of routers to networks remains the same, the ) 154.78 382 T
+(time to run Dijkstra for 200 routers in Steve\325) 72 368 T
+(s implementation was around 15 milliseconds.) 285.87 368 T
+-0.46 (This seems a reasonable cost, particularly when you notice that the Dijkstra calculation is run very ) 72 342 P
+(infrequently in operational deployments. In the three networks presented in Section 3.1, Dijkstra ) 72 328 T
+-0.35 (was run on average only every 13 to 50 minutes. Since the Dijkstra is run so infrequently) 72 314 P
+-0.35 (, it seems ) 493.06 314 P
+-0.02 (likely that OSPF overall consumes less CPU than RIP \050because of RIP\325) 72 300 P
+-0.02 (s frequent updates, requir-) 413.95 300 P
+(ing routing table lookups\051.) 72 286 T
+(As another example, the routing algorithm in MILNET is SPF-based. MILNET\325) 72 260 T
+(s current size is ) 456.42 260 T
+-0.02 (230 nodes, and the routing calculation still consumes less than 5% of the MILNET switches\325 pro-) 72 246 P
+(cessor bandwidth [4]. Because the routing algorithm in the MILNET adapts to network load, it ) 72 232 T
+(runs the Dijkstra process quite frequently \050on the order of seconds as compared to OSPF\325) 72 218 T
+(s min-) 499.7 218 T
+(utes\051. However) 72 204 T
+(, it should be noted that the routing algorithm in MILNET incrementally updates ) 144.79 204 T
+(the SPF-tree, while OSPF rebuilds it from scratch at each Dijkstra calculation) 72 190 T
+(OSPF\325) 72 164 T
+(s Area capability provides a way to reduce Dijkstra overhead, if it becomes a burden. The ) 104 164 T
+-0 (routing domain can be split into areas. The extent of the Dijkstra calculation \050and its complexity\051 ) 72 150 P
+(is limited to a single area at a time.) 72 136 T
+FMENDPAGE
+%%EndPage: "10" 11
+%%Page: "11" 11
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 11]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+3 F
+0 X
+(3.5 Role of Designated Router) 72 674.67 T
+0 F
+(This section explores the number of routers that can be attached to a single network. As the num-) 72 648 T
+-0.36 (ber of routers attached to a network grows, so does the amount of OSPF routing traf) 72 634 P
+-0.36 (\336c seen on the ) 469.48 634 P
+(network. Some of this is Hello traf) 72 620 T
+(\336c, which is generally multicast by each router every 10 sec-) 238.01 620 T
+-0.07 (onds. This burden is borne by all routers attached to the network. However) 72 606 P
+-0.07 (, because of its special ) 429.77 606 P
+-0.08 (role in the \337ooding process, the Designated router ends up sending more Link State Updates than ) 72 592 P
+(the other routers on the network. Also, the Designated Router receives Link State Acknowledg-) 72 578 T
+-0.15 (ments from all attached routers, while the other routers just receive them from the DR. \050Although ) 72 564 P
+(it is important to note that the rate of Link State Acknowledgments will generally be limited to ) 72 550 T
+(one per second from each router) 72 536 T
+(, because acknowledgments are generally delayed.\051) 226.38 536 T
+-0.22 (So, if the amount of protocol traf) 72 510 P
+-0.22 (\336c on the LAN becomes a limiting factor) 228.71 510 P
+-0.22 (, the limit is likely to be ) 424.24 510 P
+(detected in the Designated Router \336rst. However) 72 496 T
+(, such a limit is not expected to be reached in ) 305.68 496 T
+(practice. The amount of routing protocol traf) 72 482 T
+(\336c generated by OSPF has been shown to be small ) 286.62 482 T
+-0.11 (\050see Section 3.2\051. Also, if need be OSPF\325) 72 468 P
+-0.11 (s hello timers can be con\336gured to reduce the amount of ) 268.43 468 P
+(protocol traf) 72 454 T
+(\336c on the network. Note that more than 50 routers have been simulated attached to a ) 131.4 454 T
+(single LAN \050see [1]\051. Also, in interoperability testing 13 routers have been attached to a single ) 72 440 T
+(ethernet with no problems encountered.) 72 426 T
+-0.02 (Another factor in the number of routers attached to a single network is the cutover time when the ) 72 400 P
+-0.17 (Designated Router fails. OSPF has a Backup Designated Router so that the cutover does not have ) 72 386 P
+-0.31 (to wait for the new DR to synchronize \050the adjacency bring-up process mentioned earlier\051 with all ) 72 372 P
+-0.43 (the other routers on the LAN; as a Backup DR it had already synchronized. However) 72 358 P
+-0.43 (, in those rare ) 473.46 358 P
+-0.33 (cases when both DR and Backup DR crash at the same time, the new DR will have to synchronize ) 72 344 P
+(\050via the adjacency bring-up process\051 with all other routers before becoming functional. Field ) 72 330 T
+-0.44 (experience show that this synchronization process takes place in a timely fashion \050see the OARnet ) 72 316 P
+(report in [1]\051. However) 72 302 T
+(, this may be an issue in systems that have many routers attached to a sin-) 183.42 302 T
+(gle network.) 72 288 T
+-0.15 (In the unlikely event that the number of routers attached to a LAN becomes a problem, either due ) 72 262 P
+(to the amount of routing protocol traf) 72 248 T
+(\336c or the cutover time, the LAN can be split into separate ) 251 248 T
+(pieces \050similar to splitting up the AS into separate areas\051.) 72 234 T
+3 F
+(3.6 Summary) 72 200.67 T
+0 F
+(In summary) 72 174 T
+(, it seems like the most likely limitation to the size of an OSPF system is available ) 128.85 174 T
+-0.4 (router memory) 72 160 P
+-0.4 (. W) 142.43 160 P
+-0.4 (e have given as 10,000 as the number of external LSAs that can be supported by ) 158.39 160 P
+(the memory available in one con\336guration of a particular implementation \050the Proteon P4200\051. ) 72 146 T
+-0.09 (Other implementations may vary; nowadays routers are being built with more and more memory) 72 132 P
+-0.09 (. ) 534.09 132 P
+FMENDPAGE
+%%EndPage: "11" 12
+%%Page: "12" 12
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 12]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+(Note that 10,000 routes is considerably lar) 72 676 T
+(ger than the lar) 275.31 676 T
+(gest \336eld implementation \050BARRNet; ) 347.37 676 T
+(which at 1816 external LSAs is still very lar) 72 662 T
+(ge\051.) 283.65 662 T
+(Note that there may be ways to reduce database size in a routing domain. First, the domain can ) 72 636 T
+-0.19 (make use of default routing, reducing the number of external routes that need to be imported. Sec-) 72 622 P
+(ondly) 72 608 T
+(, an EGP can be used that will transport its own information through the AS instead of rely-) 98.54 608 T
+-0.21 (ing on the IGP \050OSPF in this case\051 to do transfer the information for it \050the EGP\051. Thirdly) 72 594 P
+-0.21 (, routers ) 498.11 594 P
+(having insuf) 72 580 T
+(\336cient memory may be able to be assigned to stub areas \050whose databases are drasti-) 131.41 580 T
+(cally smaller\051. Lastly) 72 566 T
+(, if the Internet went away from a \337at address space the amount of external ) 172.82 566 T
+(information imported into an OSPF domain could be reduced drastically) 72 552 T
+(.) 418.67 552 T
+(While not as likely) 72 526 T
+(, there could be other issues that would limit the size of an OSPF routing ) 162.17 526 T
+(domain. If there are slow lines \050like 9600 baud\051, the size of the database will be limited \050see Sec-) 72 512 T
+(tion 3.2\051. Dijkstra may get to be expensive when there are hundreds of routers in the OSPF ) 72 498 T
+(domain; although at this point the domain can be split into areas. Finally) 72 484 T
+(, when there are many ) 418.69 484 T
+(routers attached to a single network, there may be undue burden imposed upon the Designated ) 72 470 T
+(Router; although at that point a LAN can be split into separate LANs.) 72 456 T
+FMENDPAGE
+%%EndPage: "12" 13
+%%Page: "13" 13
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 13]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(4.0 Suitable envir) 72 673.33 T
+(onments) 195.21 673.33 T
+0 F
+-0.14 (Suitable environments for the OSPF protocol range from lar) 72 646 P
+-0.14 (ge to small. OSPF is particular suited ) 359.11 646 P
+(for transit Autonomous Systems for the following reasons. OSPF can accommodate a lar) 72 632 T
+(ge num-) 497.84 632 T
+(ber of external routes. In OSPF the import of external information is very \337exible, having provi-) 72 618 T
+-0.39 (sions for a forwarding address, two levels of external metrics, and the ability to tag external routes ) 72 604 P
+-0.29 (with their AS number for easy management. Also OSPF\325) 72 590 P
+-0.29 (s ability to do partial updates when exter-) 343.17 590 P
+(nal information changes is very useful on these networks.) 72 576 T
+(OSPF is also suited for smaller) 72 550 T
+(, either stand alone or stub Autonomous Systems, because of its ) 220.44 550 T
+(wide array of features: fast conver) 72 536 T
+(gence, equal-cost-multipath, T) 235.96 536 T
+(OS routing, areas, etc.) 382.3 536 T
+2 F
+(5.0 Unsuitable envir) 72 469.33 T
+(onments) 212.98 469.33 T
+0 F
+-0.22 (OSPF has a very limited ability to express policy) 72 442 P
+-0.22 (. Basically) 304.62 442 P
+-0.22 (, its only policy mechanisms are in the ) 354.25 442 P
+(establishment of a four level routing hierarchy: intra-area, inter) 72 428 T
+(-area, type 1 and type 2 external ) 374.52 428 T
+(routes. A system wanting more sophisticated policies would have to be split up into separate ) 72 414 T
+(ASes, running a policy-based EGP between them.) 72 400 T
+FMENDPAGE
+%%EndPage: "13" 14
+%%Page: "14" 14
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 14]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(6.0 Refer) 72 673.33 T
+(ence Documents) 137.87 673.33 T
+0 F
+(The following documents have been referenced by this report:) 72 646 T
+([1]) 72 626 T
+(Moy) 108 626 T
+(, J., \322Experience with the OSPF protocol\323, RFC 1246, July 1991.) 129.88 626 T
+([2]) 72 608 T
+(Moy) 108 608 T
+(, J., \322OSPF V) 129.88 608 T
+(ersion 2\323, RFC 1247, July 1991.) 193.85 608 T
+([3]) 72 590 T
+(Corporation for National Research Initiatives, \322Proceedings of the Eighteenth Internet ) 108 590 T
+(Engineering T) 108 576 T
+(ask Force\323, University of British Columbia, July 30-August 3, 1990.) 176.11 576 T
+FMENDPAGE
+%%EndPage: "14" 15
+%%Page: "15" 15
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 15]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(Security Considerations) 72 673.33 T
+0 F
+(Security issues are not discussed in this memo.) 72 646 T
+2 F
+(Author) 72 617.33 T
+(\325) 122.04 617.33 T
+(s Addr) 126.77 617.33 T
+(ess) 173.13 617.33 T
+0 F
+(John Moy) 72 590 T
+(Proteon Inc.) 72 576 T
+(2 T) 72 562 T
+(echnology Drive) 87.48 562 T
+(W) 72 548 T
+(estborough, MA 01581) 82.36 548 T
+(Phone: \050508\051 898-2800) 72 522 T
+(Email: jmoy@proteon.com) 72 508 T
+FMENDPAGE
+%%EndPage: "15" 16
+%%Trailer
+%%BoundingBox: 0 0 612 792
+%%Pages: 15 1
+%%DocumentFonts: Times-Roman
+%%+ Times-Bold
diff --git a/test/etags/pyt-src/server.py b/test/etags/pyt-src/server.py
new file mode 100644
index 00000000000..68aa29abcfd
--- /dev/null
+++ b/test/etags/pyt-src/server.py
@@ -0,0 +1,819 @@
+#!/usr/bin/python
+#
+# NOTE: THIS PROGRAM DOES NOT WORK!
+# It is intended as a regression test source for the Python support in etags.
+# If you want a working version, you'll find it in the fetchmail distribution.
+#
+
+from Tkinter import *
+from Dialog import *
+import sys
+import time
+import os
+
+#
+# Define the data structures the GUIs will be tossing around
+#
+class Controls:
+ def __init__(self):
+ self.foreground = FALSE; # Run in background
+ self.daemon = 300 # Default to 5-minute timeout
+ self.syslog = FALSE # Use syslogd for logging?
+ self.logfile = None # No logfile, initially
+
+ def __repr__(self):
+ str = "";
+ if self.syslog:
+ str = str + ("set syslog\n")
+ elif self.logfile:
+ str = str + ("set logfile \"%s\"\n" % (self.logfile,));
+ if not self.foreground and self.daemon:
+ str = str + ("set daemon %s\n" % (self.daemon,))
+ return str + "\n"
+
+ def __str__(self):
+ return "[Server: " + repr(self) + "]"
+
+class Server:
+ def __init__(self):
+ self.pollname = None # Poll label
+ self.via = None # True name of host
+ self.active = TRUE # Poll status
+ self.interval = 0 # Skip interval
+ self.protocol = 'auto' # Default to auto protocol
+ self.port = 0 # Port number to use
+ self.uidl = FALSE # Don't use RFC1725 UIDLs by default
+ self.auth = "password" # Default to password authentication
+ self.timeout = 300 # 5-minute timeout
+ self.envelope = "Received" # Envelope-address header
+ self.aka = [] # List of DNS aka names
+ self.dns = TRUE # Enable DNS lookup on multidrop
+ self.localdomains = [] # Domains to be considered local
+ self.interface = None # IP address and range
+ self.monitor = None # IP address and range
+ self.userlist = [] # List of user entries for site
+ self.typemap = (
+ ('pollname', 'String'),
+ ('via', 'String'),
+ ('active', 'Boolean'),
+ ('interval', 'Int'),
+ ('protocol', 'String'),
+ ('interval', 'Int'),
+ ('port', 'Int'),
+ ('uidl', 'Boolean'),
+ ('auth', 'String'),
+ ('timeout', 'Int'),
+ ('envelope', 'String'),
+ # leave aka out
+ ('dns', 'Boolean'),
+ # leave localdomains out
+ ('interface', 'String'),
+ ('monitor', 'String'))
+
+ def dump(self, folded):
+ str = ""
+ if self.active: str = str + "poll"
+ else: str = str + "skip"
+ str = str + (" " + self.pollname)
+ if self.via != self.pollname:
+ str = str + " via " + self.via
+ if self.protocol != ServerDefaults.protocol:
+ str = str + " with proto " + self.protocol
+ if self.port != defaultports[self.protocol]:
+ str = str + " port " + `self.port`
+ if self.timeout != ServerDefaults.timeout:
+ str = str + " timeout " + `self.timeout`
+ if self.interval != ServerDefaults.interval:
+ str = str + " interval " + `self.interval`
+ if self.envelope != ServerDefaults.envelope:
+ str = str + " envelope " + self.envelope
+ if self.auth != ServerDefaults.auth:
+ str = str + " auth " + self.auth
+ if self.dns != ServerDefaults.dns or self.uidl != ServerDefaults.uidl:
+ str = str + " and options"
+ if self.dns != ServerDefaults.dns:
+ str = str + flag2str(self.dns, 'dns')
+ if self.uidl != ServerDefaults.uidl:
+ str = str + flag2str(self.uidl, 'uidl')
+ if folded: str = str + "\n\t"
+ else: str = str + " "
+
+ if self.aka:
+ str = str + "aka"
+ for x in self.aka:
+ str = str + " " + x
+ if self.aka and self.localdomains: str = str + " "
+ if self.localdomains:
+ str = str + ("localdomains")
+ for x in self.localdomains:
+ str = str + " " + x
+ if (self.aka or self.localdomains):
+ if folded:
+ str = str + "\n\t"
+ else:
+ str = str + " "
+
+ if self.interface: str = str + " interface " + self.interface
+ if self.monitor: str = str + " monitor " + self.monitor
+ if (self.interface or self.monitor):
+ if folded:
+ str = str + "\n"
+
+ if str[-1] == "\t": str = str[0:-1]
+ return str;
+
+ def __repr__(self):
+ return self.dump(TRUE)
+
+ def __str__(self):
+ return "[Server: " + self.dump(FALSE) + "]"
+
+class User:
+ def __init__(self):
+ self.username = "" # Remote username
+ self.localnames = None # Local names
+ self.password = "" # Password for mail account access
+ self.smpthost = 'localhost' # Host to forward to
+ self.mda = "" # Mail Delivery Agent
+ self.preconnect = "" # Connection setup
+ self.postconnect = "" # Connection wrapup
+ self.keep = FALSE # Keep messages
+ self.flush = FALSE # Flush messages
+ self.fetchall = FALSE # Fetch old messages
+ self.rewrite = TRUE # Rewrite message headers
+ self.forcecr = FALSE # Force LF -> CR/LF
+ self.stripcr = FALSE # Strip CR
+ self.pass8bits = FALSE # Force BODY=7BIT
+ self.dropstatus = FALSE # Force BODY=7BIT
+ self.limit = 0 # Message size limit
+ self.fetchlimit = 0 # Max messages fetched per batch
+ self.batchlimit = 0 # Max message forwarded per batch
+ self.typemap = (
+ ('username', 'String')
+ ('folder', 'String')
+ # leave out localnames
+ ('password', 'String')
+ ('smtphost', 'String')
+ ('preconnect', 'String')
+ ('postconnect', 'String')
+ ('mda', 'String')
+ ('keep', 'Boolean')
+ ('flush', 'Boolean')
+ ('fetchall', 'Boolean')
+ ('rewrite', 'Boolean')
+ ('forcecr', 'Boolean')
+ ('stripcr', 'Boolean')
+ ('pass8bits', 'Boolean')
+ ('dropstatus', 'Boolean')
+ ('limit', 'Int')
+ ('fetchlimit', 'Int')
+ ('batchlimit', 'Int'))
+
+ def __repr__(self):
+ str = ""
+ str = str + "user " + self.user;
+ if self.password: str = str + "with password " + self.password
+ if self.localnames:
+ str = str + "localnames"
+ for x in self.localnames:
+ str = str + " " + x
+ if (self.keep or self.flush or self.fetchall or self.rewrite or
+ self.forcecr or self.stripcr or self.pass8bits or self.dropstatus):
+ str = str + " options"
+ if self.keep != UserDefaults.keep:
+ str = str + flag2str(self.keep, 'keep')
+ if self.flush != UserDefaults.flush:
+ str = str + flag2str(self.flush, 'flush')
+ if self.fetchall != UserDefaults.fetchall:
+ str = str + flag2str(self.fetchall, 'fetchall')
+ if self.rewrite != UserDefaults.rewrite:
+ str = str + flag2str(self.rewrite, 'rewrite')
+ if self.forcecr != UserDefaults.forcecr:
+ str = str + flag2str(self.forcecr, 'forcecr')
+ if self.stripcr != UserDefaults.stripcr:
+ str = str + flag2str(self.stripcr, 'stripcr')
+ if self.pass8bits != UserDefaults.pass8bits:
+ str = str + flag2str(self.pass8bits, 'pass8bits')
+ if self.dropstatus != UserDefaults.dropstatus:
+ str = str + flag2str(self.dropstatus, 'dropstatus')
+ if self.limit != UserDefaults.limit:
+ str = str + " limit " + `self.limit`
+ if self.fetchlimit != UserDefaults.fetchlimit:
+ str = str + " fetchlimit " + `self.fetchlimit`
+ if self.batchlimit != UserDefaults.batchlimit:
+ str = str + " batchlimit " + `self.batchlimit`
+
+ def __str__(self):
+ return "[User: " + repr(self) + "]"
+
+#
+# Helper code
+#
+
+defaultports = {"auto":0,
+ "POP2":109,
+ "POP3":110, "APOP":110, "KPOP":1109, "IMAP":143,
+ "IMAP-K4":143,
+ "ETRN":25}
+
+protolist = ("auto", "POP2", "POP3", "APOP", "KPOP", "IMAP", "IMAP-K4", "ETRN")
+
+authlist = ("password", "kerberos")
+
+def flag2str(value, string):
+# make a string representation of a .fetchmailrc flag or negated flag
+ str = ""
+ if value != None:
+ str = str + (" ")
+ if value == FALSE: str = str + ("no ")
+ str = str + string;
+ return str
+
+class LabeledEntry(Frame):
+# widget consisting of entry field with caption to left
+ def bind(self, key, action):
+ self.E.bind(key, action)
+ def focus_set(self):
+ self.E.focus_set()
+ def __init__(self, Master, text, textvar, width):
+ Frame.__init__(self, Master)
+ self.L = Label(self, {'text':text, 'width':width, 'anchor':'w'})
+ self.E = Entry(self, {'textvar':textvar})
+ self.L.pack({'side':'left'})
+ self.E.pack({'side':'left', 'expand':'1', 'fill':'x'})
+
+def ButtonBar(frame, legend, ref, alternatives, command):
+# horizontal bar of radio buttons, caption to left, picking from a string list
+ bar = Frame(frame)
+ Label(bar, text=legend).pack(side=LEFT)
+ for alt in alternatives:
+ Radiobutton(bar,
+ {'text':alt, 'variable':ref, 'value':alt, 'command':command}).pack(side=LEFT)
+ bar.pack(side=TOP);
+ return bar
+
+def helpwin(helpdict):
+# help message window with a self-destruct button
+ helpwin = Toplevel()
+ helpwin.title(helpdict['title'])
+ helpwin.iconname(helpdict['title'])
+ Label(helpwin, text=helpdict['banner']).pack()
+ textwin = Message(helpwin, text=helpdict['text'], width=600)
+ textwin.pack()
+ Button(helpwin, text='Done',
+ command=lambda x=helpwin: Widget.destroy(x),
+ relief=SUNKEN, bd=2).pack()
+
+class ListEdit(Frame):
+# edit a list of values (duplicates not allowed) with a supplied editor hook
+ def __init__(self, newlegend, list, editor, master):
+ self.editor = editor
+ self.list = list
+
+ # Set up a widget to accept new sites
+ self.newval = StringVar(master)
+ newwin = LabeledEntry(master, newlegend, self.newval, '16')
+ newwin.bind('<Double-1>', self.handleNew)
+ newwin.bind('<Return>', self.handleNew)
+ newwin.pack(side=TOP, fill=X, anchor=E)
+
+ # Create the sitelist for site-configuration selection
+ listframe = Frame(master)
+ scroll = Scrollbar(listframe)
+ listwidget = Listbox(listframe, height=0, selectmode='browse')
+ if list:
+ for dnsname in list:
+ listwidget.insert('end', dnsname)
+ listframe.pack(side=TOP, expand=YES, fill=BOTH)
+ listwidget.config(yscrollcommand=scroll.set, relief=SUNKEN)
+ listwidget.pack(side=LEFT, expand=YES, fill=BOTH)
+ scroll.config(command=listwidget.yview, relief=SUNKEN)
+ scroll.pack(side=RIGHT, fill=BOTH)
+ listwidget.config(selectmode=SINGLE, setgrid=TRUE)
+ listwidget.bind('<Double-1>', self.handleList);
+ listwidget.bind('<Return>', self.handleList);
+ self.listwidget = listwidget
+
+ bf = Frame(master);
+ if self.editor:
+ Button(bf, text='Edit', command=self.editItem).pack(side=LEFT)
+ Button(bf, text='Delete', command=self.deleteItem).pack(side=RIGHT)
+ bf.pack(fill=X)
+
+ def handleList(self, event):
+ self.editItem();
+
+ def handleNew(self, event):
+ item = self.newval.get()
+ entire = self.listwidget.get(0, self.listwidget.index('end'));
+ if item and (not entire) or (not item in self.listwidget.get(0, self.listwidget.index('end'))):
+ self.listwidget.insert('end', item)
+ if self.list != None: self.list.append(item)
+ self.newval.set('')
+
+ def editItem(self):
+ index = self.listwidget.curselection()[0]
+ if index and self.editor:
+ label = self.listwidget.get(index);
+ apply(self.editor, (label,))
+
+ def deleteItem(self):
+ index = self.listwidget.curselection()[0]
+ if index:
+ self.listwidget.delete(index)
+ if self.list != None: del self.list[index]
+
+def ConfirmQuit(frame, context):
+ ans = Dialog(frame,
+ title = 'Quit?',
+ text = 'Really quit ' + context + ' without saving?',
+ bitmap = 'question',
+ strings = ('Yes', 'No'),
+ default = 1)
+ return ans.num == 0
+#
+# First, code to set the global fetchmail run controls.
+#
+
+confighelp = {
+ 'title' : 'Fetchmail configurator help',
+ 'banner': 'Configurator help',
+ 'text' : """
+In the `Configurator Controls' panel, you can:
+
+Press `Save' to save the new fetchmail configuration you have created.
+Press `Quit' to exit without saving.
+Press `Help' to bring up this help message.
+
+In the `Configurator Controls' panel, you can set the following options that
+control how fetchmail runs:
+
+Poll interval
+ Number of seconds to wait between polls in the background.
+ Ignored if the `Run in Foreground?' option is on.
+
+Logfile
+ If empty, emit progress and error messages to stderr.
+ Otherwise this gives the name of the files to write to.
+ This field is ignored if the "Log to syslog?" option is on.
+
+In the `Remote Mail Configurations' panel, you can:
+
+1. Enter the name of a new remote mail server you want fetchmail to query.
+
+To do this, simply enter a label for the poll configuration in the
+`New Server:' box. The label should be a DNS name of the server (unless
+you are using ssh or some other tunneling method and will fill in the `via'
+option on the site configuration screen).
+
+2. Change the configuration of an existing site.
+
+To do this, find the site's label in the listbox and double-click it.
+This will take you to a site configuration dialogue.
+"""}
+
+class ControlEdit(Frame):
+ def PostControls(self):
+ self.foreground = BooleanVar(self)
+ self.foreground.set(self.controls.foreground)
+ self.daemon = StringVar(self)
+ self.daemon.set(`self.controls.daemon`)
+ self.syslog = BooleanVar(self)
+ self.syslog.set(self.controls.syslog);
+ self.logfile = StringVar(self)
+ if self.controls.logfile: self.logfile.set(self.controls.logfile);
+
+ gf = Frame(self, relief=RAISED, bd = 5)
+
+ Label(gf,
+ text='Fetchmail Run Controls',
+ bd=2).pack(side=TOP, pady=10)
+
+ df = Frame(gf, relief=RAISED, bd=2)
+
+ # Run in foreground?
+ Checkbutton(df,
+ {'text':'Run in foreground?',
+ 'variable':self.foreground,
+ 'relief':GROOVE}).pack(side=LEFT,anchor=W)
+
+ # Set the poll interval
+ de = LabeledEntry(df, ' Poll interval:', self.daemon, '14')
+ de.pack(side=RIGHT, anchor=E)
+
+ df.pack();
+
+ sf = Frame(gf, relief=RAISED, bd=2)
+
+ # Use syslog for logging?
+ Checkbutton(sf,
+ {'text':'Log to syslog?',
+ 'variable':self.syslog,
+ 'relief':GROOVE}).pack(side=LEFT, anchor=W)
+
+ # Set the logfile
+ log = LabeledEntry(sf, ' Logfile:', self.logfile, '14')
+ log.pack(side=RIGHT, anchor=E)
+
+ sf.pack(fill=X)
+ gf.pack(fill=X)
+
+ def GatherControls(self):
+ self.controls.daemon = self.daemon.get()
+ self.controls.foreground = self.foreground.get()
+ self.controls.logfile = self.logfile.get()
+ self.controls.syslog = self.syslog.get()
+
+#
+# Server editing stuff.
+#
+serverhelp = {
+ 'title' : 'Server options help',
+ 'banner': 'Server Options',
+ 'text' : """
+The server options screen controls fetchmail
+options that apply to one of your mailservers.
+
+Once you have a mailserver configuration set
+up as you like it, you can select `Save' to
+store it in the server list maintained in
+the main configuration window.
+
+If you wish to discard changes to a server
+configuration, select `Quit'.
+"""}
+
+controlhelp = {
+ 'title' : 'Run Control help',
+ 'banner': 'Run Controls',
+ 'text' : """
+If the `Poll normally' checkbox is on, the host is polled as part of
+the normal operation of fetchmail when it is run with no arguments.
+If it is off, fetchmail will only query this host when it is given as
+a command-line argument.
+
+The `True name of server' box should specify the actual DNS name
+to query. By default this is the same as the poll name.
+
+Normally each host described in the file is queried once each
+poll cycle. If `Cycles to skip between polls' is greater than 0,
+that's the number of poll cycles that are skipped between the
+times this post is actually polled.
+
+The `Server timeout' is the number of seconds fetchmail will wait
+for a reply from the mailserver before concluding it is hung and
+giving up.
+"""}
+
+protohelp = {
+ 'title' : 'Protocol and Port help',
+ 'banner': 'Protocol and Port',
+ 'text' : """
+These options control the remote-mail protocol
+and TCP/IP service port used to query this
+server.
+
+The `Protocol' button bar offers you a choice of
+all the different protocols available. The `auto'
+protocol is a special mode that probes the host
+ports for POP3 and IMAP to see if either is
+available.
+
+Normally the TCP/IP service port to use is
+dictated by the protocol choice. The `Port'
+field lets you set a non-standard port.
+"""}
+
+sechelp = {
+ 'title' : 'Security option help',
+ 'banner': 'Security',
+ 'text' : """
+These options control the security procedure used
+to protect mail transfer
+
+Normally the mail fetch is validated using an
+ordinary password logon. If your server speaks
+MIT Kerberos IV it is possible to pre-authenticate
+the exxchange with a Kerberos ticket.
+
+The `interface' and `monitor' options are available
+only for Linux systems. See the fetchmail manual page
+for details on these.
+"""}
+
+multihelp = {
+ 'title' : 'Multidrop option help',
+ 'banner': 'Multidrop',
+ 'text' : """
+These options are only useful with multidrop mode.
+See the manual page for extended discussion.
+"""}
+
+class ServerEdit(Frame):
+ def __init__(self, host, sitelist, master=None):
+ Frame.__init__(self, master)
+ Pack.config(self)
+ self.master.title('Fetchmail host ' + host);
+ self.master.iconname('Fetchmail host ' + host);
+ self.server = Server()
+ self.server.pollname = host
+ self.server.via = host
+ self.sitelist = sitelist
+ self.post()
+ self.createWidgets(host)
+
+ def post(self):
+ # we can't abstract this away, execs would happen in the wrong scope
+ for x in self.server.typemap:
+ target = "self." + x[0]
+ source = "self.server." + x[0]
+ if x[1] == 'Boolean':
+ exec target + " = BooleanVar(self)"
+ if eval(source):
+ exec target + ".set(" + source + ")"
+ elif x[1] == 'String':
+ exec target + " = StringVar(self)"
+ if eval(source):
+ exec target + ".set(" + source + ")"
+ elif x[1] == 'Int':
+ exec target + " = IntVar(self)"
+ if eval(source):
+ exec target + ".set(" + source + ")"
+
+ def gather(self):
+ for x in self.server.typemap:
+ setattr(self.server, x[0], getattr(self, x[0]).get())
+
+ def nosave(self):
+ if ConfirmQuit(self, 'server option editing'):
+ Widget.destroy(self.master)
+
+ def save(self):
+ self.gather()
+ self.sitelist.append(self.server)
+ Widget.destroy(self.master)
+
+ def refreshPort(self):
+ proto = self.protocol.get()
+ self.port.set(defaultports[proto])
+ if not proto in ("POP3", "APOP", "KPOP"): self.uidl = FALSE
+
+ def createWidgets(self, host):
+ topwin = Frame(self, relief=RAISED, bd=5)
+ Label(topwin, text="Server options for " + host).pack(side=TOP,pady=10)
+ Button(topwin, text='Save', fg='blue',
+ command=self.save).pack(side=LEFT)
+ Button(topwin, text='Quit', fg='blue',
+ command=self.nosave).pack(side=LEFT)
+ Button(topwin, text='Help', fg='blue',
+ command=lambda: helpwin(serverhelp)).pack(side=RIGHT)
+ topwin.pack(fill=X)
+
+ ctlwin = Frame(self, relief=RAISED, bd=5)
+ Label(ctlwin, text="Run Controls").pack(side=TOP)
+ Checkbutton(ctlwin, text='Poll ' + host + ' normally?', variable=self.active).pack(side=TOP)
+ LabeledEntry(ctlwin, 'True name of ' + host + ':',
+ self.via, '30').pack(side=TOP, fill=X)
+ LabeledEntry(ctlwin, 'Cycles to skip between polls:',
+ self.interval, '30').pack(side=TOP, fill=X)
+ LabeledEntry(ctlwin, 'Server timeout (seconds):',
+ self.timeout, '30').pack(side=TOP, fill=X)
+ Button(ctlwin, text='Help', fg='blue',
+ command=lambda: helpwin(controlhelp)).pack(side=RIGHT)
+ ctlwin.pack(fill=X)
+
+ protwin = Frame(self, relief=RAISED, bd=5)
+ Label(protwin, text="Protocol and Port").pack(side=TOP)
+ pb = ButtonBar(protwin, 'Protocol:', self.protocol, protolist, self.refreshPort)
+ LabeledEntry(protwin, 'TCP/IP service port to query:',
+ self.port, '30').pack(side=TOP, fill=X)
+ Checkbutton(protwin,
+ text="Track seen POP3 messages with client-side UIDL list?",
+ variable=self.uidl).pack(side=TOP)
+ Button(protwin, text='Help', fg='blue',
+ command=lambda: helpwin(protohelp)).pack(side=RIGHT)
+ protwin.pack(fill=X)
+
+ secwin = Frame(self, relief=RAISED, bd=5)
+ Label(secwin, text="Security").pack(side=TOP)
+ ButtonBar(secwin, 'Authorization mode:',
+ self.auth, authlist, None).pack(side=TOP)
+
+ if os.popen("uname").readlines()[0] == 'Linux\n':
+ LabeledEntry(secwin, 'Interface to check before polling:',
+ self.interface, '30').pack(side=TOP, fill=X)
+ LabeledEntry(secwin, 'IP addresses to watch for activity:',
+ self.monitor, '30').pack(side=TOP, fill=X)
+
+ Button(secwin, text='Help', fg='blue',
+ command=lambda: helpwin(sechelp)).pack(side=RIGHT)
+ secwin.pack(fill=X)
+
+ mdropwin = Frame(self, relief=RAISED, bd=5)
+ Label(mdropwin, text="Multidrop options").pack(side=TOP)
+ LabeledEntry(mdropwin, 'Envelope address header:',
+ self.envelope, '30').pack(side=TOP, fill=X)
+ Checkbutton(mdropwin, text="Enable multidrop DNS lookup?",
+ variable=self.dns).pack(side=TOP)
+ Label(mdropwin, text="DNS aliases").pack(side=TOP)
+ ListEdit("New site alias: ", self.server.aka, None, mdropwin)
+ Label(mdropwin, text="Domains to be considered local").pack(side=TOP)
+ ListEdit("New local domain: ", self.server.localdomains, None,mdropwin)
+ Button(mdropwin, text='Help', fg='blue',
+ command=lambda: helpwin(multihelp)).pack(side=RIGHT)
+ mdropwin.pack(fill=X)
+
+ userwin = Frame(self, relief=RAISED, bd=5)
+ Label(userwin, text="User entries for " + host).pack(side=TOP)
+ ListEdit("New user: ", None, self.edituser, userwin)
+ userwin.pack(fill=X)
+
+ def edituser(self, user):
+ UserEdit(user, self.server.userlist, Toplevel())
+
+#
+# User editing stuff
+#
+
+userhelp = {
+ 'title' : 'User option help',
+ 'banner': 'User options',
+ 'text' : """
+FIXME
+"""}
+
+class UserEdit(Frame):
+ def __init__(self, user, userlist, master=None):
+ Frame.__init__(self, master)
+ Pack.config(self)
+ self.master.title('Fetchmail user ' + user);
+ self.master.iconname('Fetchmail user ' + user);
+ self.user = User()
+ self.user.remote = user
+ self.user.localnames = [user]
+ self.userlist = userlist
+ self.post()
+ self.createWidgets(user)
+
+ def post(self):
+ # we can't abstract this away, execs would happen in the wrong scope
+ for x in self.user.typemap:
+ target = "self." + x[0]
+ source = "self.user." + x[0]
+ if x[1] == 'Boolean':
+ exec target + " = BooleanVar(self)"
+ if eval(source):
+ exec target + ".set(" + source + ")"
+ elif x[1] == 'String':
+ exec target + " = StringVar(self)"
+ if eval(source):
+ exec target + ".set(" + source + ")"
+ elif x[1] == 'Int':
+ exec target + " = IntVar(self)"
+ if eval(source):
+ exec target + ".set(" + source + ")"
+
+ def gather(self):
+ for x in self.user.typemap:
+ setattr(self.user, x[0], getattr(self, x[0]).get())
+
+ def nosave(self):
+ if ConfirmQuit(self, 'user option editing'):
+ Widget.destroy(self.master)
+
+ def save(self):
+ self.gather()
+ self.userlist.append(self.user)
+ Widget.destroy(self.master)
+
+ def createWidgets(self):
+ topwin = Frame(self, relief=RAISED, bd=5)
+ Label(topwin,
+ text="User options for " + self.user.remote).pack(side=TOP,pady=10)
+ Button(topwin, text='Save', fg='blue',
+ command=self.save).pack(side=LEFT)
+ Button(topwin, text='Quit', fg='blue',
+ command=self.nosave).pack(side=LEFT)
+ Button(topwin, text='Help', fg='blue',
+ command=lambda: helpwin(userhelp)).pack(side=RIGHT)
+ topwin.pack(fill=X)
+
+ secwin = Frame(self, relief=RAISED, bd=5)
+ Label(secwin, text="Authentication").pack(side=TOP)
+ LabeledEntry(mdropwin, 'Password:',
+ self.password, '30').pack(side=TOP, fill=X)
+ LabeledEntry(mdropwin, 'Remote folder:',
+ self.folder, '30').pack(side=TOP, fill=X)
+ secwin.pack(fill=X)
+
+ names = Frame(self, relief=RAISED, bd=5)
+ Label(names, text="Local names").pack(side=TOP)
+ ListEdit("New local name: ", self.localnames, None, names)
+ names.pack(fill=X)
+
+ targwin = Frame(self, relief=RAISED, bd=5)
+ Label(targwin, text="Forwarding Options").pack(side=TOP)
+ LabeledEntry(targwin, 'System to forward to:',
+ self.smtphost, '30').pack(side=TOP, fill=X)
+ LabeledEntry(targwin, 'Connection setup command:',
+ self.preconnect, '30').pack(side=TOP, fill=X)
+ LabeledEntry(targwin, 'Connection wrapup command:',
+ self.postconnect, '30').pack(side=TOP, fill=X)
+ LabeledEntry(targwin, 'Local delivery agent:',
+ self.mda, '30').pack(side=TOP, fill=X)
+ targwin.pack(fill=X)
+
+ optwin = Frame(self, relief=RAISED, bd=5)
+ Checkbutton(optwin, "Suppress deletion of messages after reading",
+ self.keep)
+ Checkbutton(optwin, "Flush seen messages before retrieval",
+ self.flush)
+ Checkbutton(optwin, "Fetch old messages as well as new",
+ self.fetchall)
+ Checkbutton(optwin, "Rewrite To/Cc/Bcc messages to enable reply",
+ self.rewrite)
+ Checkbutton(optwin, "Force CR/LF at end of each line",
+ self.forcecr)
+ Checkbutton(optwin, "Strip CR from end of eacgh line",
+ self.stripcr)
+ Checkbutton(optwin, "Pass 8 bits even theough SMTP says 7BIT",
+ self.pass8bits)
+ Checkbutton(optwin, "Drop Status lines from forwarded messages",
+ self.dropstatus)
+ optwin.pack(fill=X)
+
+ limwin = Frame(self, relief=RAISED, bd=5)
+ Label(limwin, text="Resource Limits").pack(side=TOP)
+ LabeledEntry(limwin, 'Message size limit:',
+ self.limit, '30').pack(side=TOP, fill=X)
+ LabeledEntry(limwin, 'Maximum messages to fetch each poll:',
+ self.fetchlimit, '30').pack(side=TOP, fill=X)
+ LabeledEntry(limwin, 'Maximum messages to forward each poll:',
+ self.batchlimit, '30').pack(side=TOP, fill=X)
+ limwin.pack(fill=X)
+
+#
+# Configure drives the configuration dialogue. It may call multiple
+# instances of ServerEdit to do its job.
+#
+
+class Configure(Frame, ControlEdit):
+ def __init__(self, master=None):
+ Frame.__init__(self, master)
+ self.master.title('fetchmail configurator');
+ self.master.iconname('fetchmail configurator');
+ Pack.config(self)
+ self.MakeDispose()
+ self.controls = Controls()
+ self.PostControls()
+ self.MakeSitelist(master)
+ self.sites = []
+
+ def MakeDispose(self):
+ # Set the disposal of the given configuration
+ dispose = Frame(self, relief=RAISED, bd=5);
+ Label(dispose,
+ text='Configurator Controls',
+ bd=2).pack(side=TOP, pady=10)
+ Button(dispose, text='Save', fg='blue',
+ command=self.save).pack(side=LEFT)
+ Button(dispose, text='Quit', fg='blue',
+ command=self.nosave).pack(side=LEFT)
+ Button(dispose, text='Help', fg='blue',
+ command=lambda: helpwin(confighelp)).pack(side=RIGHT)
+ dispose.pack(side=TOP, fill=X);
+
+ def MakeSitelist(self, master):
+ lf = Frame(master, relief=RAISED, bd=5)
+ Label(lf,
+ text='Remote Mail Server Configurations',
+ bd=2).pack(side=TOP, pady=10)
+ ListEdit('New Server:', None, self.editsite, lf)
+ lf.pack(fill=X)
+
+ def editsite(self, site):
+ ServerEdit(site, self.sites, Toplevel())
+
+ def save(self):
+ self.GatherControls()
+ sys.stdout.write("# Configuration created %s\n" % time.ctime(time.time()))
+ sys.stdout.write(`self.controls`)
+ for site in self.sites:
+ sys.stdout.write(`site`)
+ for user in self.sites.userlist:
+ sys.stdout.write(`user`)
+ self.quit()
+
+ def nosave(self):
+ if ConfirmQuit(self, "configuration editor"):
+ self.quit()
+
+if __name__ == '__main__':
+ ServerDefaults = Server()
+ UserDefaults = User()
+ Configure().mainloop()
+
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# mode:python
+# End:
diff --git a/test/etags/tex-src/gzip.texi b/test/etags/tex-src/gzip.texi
new file mode 100644
index 00000000000..07be37187d7
--- /dev/null
+++ b/test/etags/tex-src/gzip.texi
@@ -0,0 +1,479 @@
+\input texinfo @c -*-texinfo-*-
+@c %**start of header
+@setfilename gzip.info
+@settitle Gzip User's Manual
+@finalout
+@setchapternewpage odd
+@c %**end of header
+
+@ifinfo
+This file documents the the GNU @code{gzip} command for compressing files.
+
+Copyright (C) 1992-1993 Jean-loup Gailly
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end ifinfo
+
+@titlepage
+@title gzip
+@subtitle The data compression program
+@subtitle Edition 1.2.4, for Gzip Version 1.2.4
+@subtitle July 1993
+@author by Jean-loup Gailly
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1992-1993 Jean-loup Gailly
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end titlepage
+
+@node Top, , , (dir)
+
+@ifinfo
+This file documents the @code{gzip} command to compress files.
+@end ifinfo
+
+@menu
+* Copying:: How you can copy and share @code{gzip}.
+* Overview:: Preliminary information.
+* Sample:: Sample output from @code{gzip}.
+* Invoking gzip:: How to run @code{gzip}.
+* Advanced usage:: Concatenated files.
+* Environment:: The @code{GZIP} environment variable
+* Tapes:: Using @code{gzip} on tapes.
+* Problems:: Reporting bugs.
+* Concept Index:: Index of concepts.
+@end menu
+
+@node Copying, Overview, , Top
+@include gpl.texinfo
+
+@node Overview, Sample, Copying, Top
+@chapter Overview
+@cindex overview
+
+@code{gzip} reduces the size of the named files using Lempel-Ziv coding
+(LZ77). Whenever possible, each file is replaced by one with the
+extension @samp{.gz}, while keeping the same ownership modes, access and
+modification times. (The default extension is @samp{-gz} for VMS,
+@samp{z} for MSDOS, OS/2 FAT and Atari.) If no files are specified or
+if a file name is "-", the standard input is compressed to the standard
+output. @code{gzip} will only attempt to compress regular files. In
+particular, it will ignore symbolic links.
+
+If the new file name is too long for its file system, @code{gzip}
+truncates it. @code{gzip} attempts to truncate only the parts of the
+file name longer than 3 characters. (A part is delimited by dots.) If
+the name consists of small parts only, the longest parts are truncated.
+For example, if file names are limited to 14 characters, gzip.msdos.exe
+is compressed to gzi.msd.exe.gz. Names are not truncated on systems
+which do not have a limit on file name length.
+
+By default, @code{gzip} keeps the original file name and timestamp in
+the compressed file. These are used when decompressing the file with the
+@samp{-N} option. This is useful when the compressed file name was
+truncated or when the time stamp was not preserved after a file
+transfer.
+
+Compressed files can be restored to their original form using @samp{gzip -d}
+or @code{gunzip} or @code{zcat}. If the original name saved in the
+compressed file is not suitable for its file system, a new name is
+constructed from the original one to make it legal.
+
+@code{gunzip} takes a list of files on its command line and replaces
+each file whose name ends with @samp{.gz}, @samp{.z}, @samp{.Z},
+@samp{-gz}, @samp{-z} or @samp{_z} and which begins with the correct
+magic number with an uncompressed file without the original extension.
+@code{gunzip} also recognizes the special extensions @samp{.tgz} and
+@samp{.taz} as shorthands for @samp{.tar.gz} and @samp{.tar.Z}
+respectively. When compressing, @code{gzip} uses the @samp{.tgz}
+extension if necessary instead of truncating a file with a @samp{.tar}
+extension.
+
+@code{gunzip} can currently decompress files created by @code{gzip},
+@code{zip}, @code{compress} or @code{pack}. The detection of the input
+format is automatic. When using the first two formats, @code{gunzip}
+checks a 32 bit CRC (cyclic redundancy check). For @code{pack},
+@code{gunzip} checks the uncompressed length. The @code{compress} format
+was not designed to allow consistency checks. However @code{gunzip} is
+sometimes able to detect a bad @samp{.Z} file. If you get an error when
+uncompressing a @samp{.Z} file, do not assume that the @samp{.Z} file is
+correct simply because the standard @code{uncompress} does not complain.
+This generally means that the standard @code{uncompress} does not check
+its input, and happily generates garbage output. The SCO @samp{compress
+-H} format (@code{lzh} compression method) does not include a CRC but
+also allows some consistency checks.
+
+Files created by @code{zip} can be uncompressed by @code{gzip} only if
+they have a single member compressed with the 'deflation' method. This
+feature is only intended to help conversion of @code{tar.zip} files to
+the @code{tar.gz} format. To extract @code{zip} files with several
+members, use @code{unzip} instead of @code{gunzip}.
+
+@code{zcat} is identical to @samp{gunzip -c}. @code{zcat}
+uncompresses either a list of files on the command line or its standard
+input and writes the uncompressed data on standard output. @code{zcat}
+will uncompress files that have the correct magic number whether they
+have a @samp{.gz} suffix or not.
+
+@code{gzip} uses the Lempel-Ziv algorithm used in @code{zip} and PKZIP.
+The amount of compression obtained depends on the size of the input and
+the distribution of common substrings. Typically, text such as source
+code or English is reduced by 60-70%. Compression is generally much
+better than that achieved by LZW (as used in @code{compress}), Huffman
+coding (as used in @code{pack}), or adaptive Huffman coding
+(@code{compact}).
+
+Compression is always performed, even if the compressed file is slightly
+larger than the original. The worst case expansion is a few bytes for
+the @code{gzip} file header, plus 5 bytes every 32K block, or an expansion
+ratio of 0.015% for large files. Note that the actual number of used
+disk blocks almost never increases. @code{gzip} preserves the mode,
+ownership and timestamps of files when compressing or decompressing.
+
+@node Sample, Invoking gzip, Overview, Top
+@chapter Sample Output
+@cindex sample
+
+Here are some realistic examples of running @code{gzip}.
+
+This is the output of the command @samp{gzip -h}:
+
+@example
+gzip 1.2.4 (18 Aug 93)
+usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+ -c --stdout write on standard output, keep original files unchanged
+ -d --decompress decompress
+ -f --force force overwrite of output file and compress links
+ -h --help give this help
+ -l --list list compressed file contents
+ -L --license display software license
+ -n --no-name do not save or restore the original name and time stamp
+ -N --name save or restore the original name and time stamp
+ -q --quiet suppress all warnings
+ -r --recursive operate recursively on directories
+ -S .suf --suffix .suf use suffix .suf on compressed files
+ -t --test test compressed file integrity
+ -v --verbose verbose mode
+ -V --version display version number
+ -1 --fast compress faster
+ -9 --best compress better
+ file... files to (de)compress. If none given, use standard input.
+@end example
+
+This is the output of the command @samp{gzip -v texinfo.tex}:
+
+@example
+texinfo.tex: 71.6% -- replaced with texinfo.tex.gz
+@end example
+
+The following command will find all @code{gzip} files in the current
+directory and subdirectories, and extract them in place without
+destroying the original:
+
+@example
+find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip < "&" > "\1"/' | sh
+@end example
+
+@node Invoking gzip, Advanced usage, Sample, Top
+@chapter Invoking @code{gzip}
+@cindex invoking
+@cindex options
+
+The format for running the @code{gzip} program is:
+
+@example
+gzip @var{option} @dots{}
+@end example
+
+@code{gzip} supports the following options:
+
+@table @samp
+@item --stdout
+@itemx --to-stdout
+@itemx -c
+Write output on standard output; keep original files unchanged.
+If there are several input files, the output consists of a sequence of
+independently compressed members. To obtain better compression,
+concatenate all input files before compressing them.
+
+@item --decompress
+@itemx --uncompress
+@itemx -d
+Decompress.
+
+@item --force
+@itemx -f
+Force compression or decompression even if the file has multiple links
+or the corresponding file already exists, or if the compressed data
+is read from or written to a terminal. If the input data is not in
+a format recognized by @code{gzip}, and if the option --stdout is also
+given, copy the input data without change to the standard ouput: let
+@code{zcat} behave as @code{cat}. If @samp{-f} is not given, and
+when not running in the background, @code{gzip} prompts to verify
+whether an existing file should be overwritten.
+
+@item --help
+@itemx -h
+Print an informative help message describing the options then quit.
+
+@item --list
+@itemx -l
+For each compressed file, list the following fields:
+
+@example
+compressed size: size of the compressed file
+uncompressed size: size of the uncompressed file
+ratio: compression ratio (0.0% if unknown)
+uncompressed_name: name of the uncompressed file
+@end example
+
+The uncompressed size is given as @samp{-1} for files not in @code{gzip}
+format, such as compressed @samp{.Z} files. To get the uncompressed size for
+such a file, you can use:
+
+@example
+zcat file.Z | wc -c
+@end example
+
+In combination with the --verbose option, the following fields are also
+displayed:
+
+@example
+method: compression method (deflate,compress,lzh,pack)
+crc: the 32-bit CRC of the uncompressed data
+date & time: time stamp for the uncompressed file
+@end example
+
+The crc is given as ffffffff for a file not in gzip format.
+
+With --verbose, the size totals and compression ratio for all files
+is also displayed, unless some sizes are unknown. With --quiet,
+the title and totals lines are not displayed.
+
+@item --license
+@itemx -L
+Display the @code{gzip} license then quit.
+
+@item --no-name
+@itemx -n
+When compressing, do not save the original file name and time stamp by
+default. (The original name is always saved if the name had to be
+truncated.) When decompressing, do not restore the original file name
+if present (remove only the @code{gzip}
+suffix from the compressed file name) and do not restore the original
+time stamp if present (copy it from the compressed file). This option
+is the default when decompressing.
+
+@item --name
+@itemx -N
+When compressing, always save the original file name and time stamp; this
+is the default. When decompressing, restore the original file name and
+time stamp if present. This option is useful on systems which have
+a limit on file name length or when the time stamp has been lost after
+a file transfer.
+
+@item --quiet
+@itemx -q
+Suppress all warning messages.
+
+@item --recursive
+@itemx -r
+Travel the directory structure recursively. If any of the file names
+specified on the command line are directories, @code{gzip} will descend
+into the directory and compress all the files it finds there (or
+decompress them in the case of @code{gunzip}).
+
+@item --suffix @var{suf}
+@itemx -S @var{suf}
+Use suffix @samp{@var{suf}} instead of @samp{.gz}. Any suffix can be
+given, but suffixes other than @samp{.z} and @samp{.gz} should be
+avoided to avoid confusion when files are transferred to other systems.
+A null suffix forces gunzip to try decompression on all given files
+regardless of suffix, as in:
+
+@example
+gunzip -S "" * (*.* for MSDOS)
+@end example
+
+Previous versions of gzip used the @samp{.z} suffix. This was changed to
+avoid a conflict with @code{pack}.
+
+@item --test
+@itemx -t
+Test. Check the compressed file integrity.
+
+@item --verbose
+@itemx -v
+Verbose. Display the name and percentage reduction for each file compressed.
+
+@item --version
+@itemx -V
+Version. Display the version number and compilation options, then quit.
+
+@item --fast
+@itemx --best
+@itemx -@var{n}
+Regulate the speed of compression using the specified digit @var{n},
+where @samp{-1} or @samp{--fast} indicates the fastest compression
+method (less compression) and @samp{--best} or @samp{-9} indicates the
+slowest compression method (optimal compression). The default
+compression level is @samp{-6} (that is, biased towards high compression at
+expense of speed).
+@end table
+
+@node Advanced usage, Environment, Invoking gzip, Top
+@chapter Advanced usage
+@cindex concatenated files
+
+Multiple compressed files can be concatenated. In this case,
+@code{gunzip} will extract all members at once. If one member is
+damaged, other members might still be recovered after removal of the
+damaged member. Better compression can be usually obtained if all
+members are decompressed and then recompressed in a single step.
+
+This is an example of concatenating @code{gzip} files:
+
+@example
+gzip -c file1 > foo.gz
+gzip -c file2 >> foo.gz
+@end example
+
+Then
+
+@example
+gunzip -c foo
+@end example
+
+is equivalent to
+
+@example
+cat file1 file2
+@end example
+
+In case of damage to one member of a @samp{.gz} file, other members can
+still be recovered (if the damaged member is removed). However,
+you can get better compression by compressing all members at once:
+
+@example
+cat file1 file2 | gzip > foo.gz
+@end example
+
+compresses better than
+
+@example
+gzip -c file1 file2 > foo.gz
+@end example
+
+If you want to recompress concatenated files to get better compression, do:
+
+@example
+zcat old.gz | gzip > new.gz
+@end example
+
+If a compressed file consists of several members, the uncompressed
+size and CRC reported by the @samp{--list} option applies to the last member
+only. If you need the uncompressed size for all members, you can use:
+
+@example
+zcat file.gz | wc -c
+@end example
+
+If you wish to create a single archive file with multiple members so
+that members can later be extracted independently, use an archiver such
+as @code{tar} or @code{zip}. GNU @code{tar} supports the @samp{-z}
+option to invoke @code{gzip} transparently. @code{gzip} is designed as a
+complement to @code{tar}, not as a replacement.
+
+@node Environment, Tapes, Advanced usage, Top
+@chapter Environment
+@cindex Environment
+
+The environment variable @code{GZIP} can hold a set of default options for
+@code{gzip}. These options are interpreted first and can be overwritten by
+explicit command line parameters. For example:
+
+@example
+for sh: GZIP="-8v --name"; export GZIP
+for csh: setenv GZIP "-8v --name"
+for MSDOS: set GZIP=-8v --name
+@end example
+
+On Vax/VMS, the name of the environment variable is @code{GZIP_OPT}, to
+avoid a conflict with the symbol set for invocation of the program.
+
+@node Tapes, Problems, Environment, Top
+@chapter Using @code{gzip} on tapes
+@cindex tapes
+
+When writing compressed data to a tape, it is generally necessary to pad
+the output with zeroes up to a block boundary. When the data is read and
+the whole block is passed to @code{gunzip} for decompression,
+@code{gunzip} detects that there is extra trailing garbage after the
+compressed data and emits a warning by default. You have to use the
+@samp{--quiet} option to suppress the warning. This option can be set in the
+@code{GZIP} environment variable, as in:
+
+@example
+for sh: GZIP="-q" tar -xfz --block-compress /dev/rst0
+for csh: (setenv GZIP "-q"; tar -xfz --block-compress /dev/rst0)
+@end example
+
+In the above example, @code{gzip} is invoked implicitly by the @samp{-z}
+option of GNU @code{tar}. Make sure that the same block size (@samp{-b}
+option of @code{tar}) is used for reading and writing compressed data on
+tapes. (This example assumes you are using the GNU version of
+@code{tar}.)
+
+@node Problems, Concept Index, Tapes, Top
+@chapter Reporting Bugs
+@cindex bugs
+
+If you find a bug in @code{gzip}, please send electronic mail to
+@w{@samp{jloup@@chorus.fr}} or, if this fails, to
+@w{@samp{bug-gnu-utils@@prep.ai.mit.edu}}. Include the version number,
+which you can find by running @w{@samp{gzip -V}}. Also include in your
+message the hardware and operating system, the compiler used to compile
+@code{gzip},
+a description of the bug behavior, and the input to @code{gzip} that triggered
+the bug.@refill
+
+@node Concept Index, , Problems, Top
+@unnumbered Concept Index
+
+@printindex cp
+
+@contents
+@bye
diff --git a/test/etags/tex-src/nonewline.tex b/test/etags/tex-src/nonewline.tex
new file mode 100644
index 00000000000..8cc01ce9151
--- /dev/null
+++ b/test/etags/tex-src/nonewline.tex
@@ -0,0 +1 @@
+% This comment does not end with newline \ No newline at end of file
diff --git a/test/etags/tex-src/testenv.tex b/test/etags/tex-src/testenv.tex
new file mode 100644
index 00000000000..efb83cb834f
--- /dev/null
+++ b/test/etags/tex-src/testenv.tex
@@ -0,0 +1,15 @@
+\documentclass[11pt]{report}
+\usepackage{verbatim,amsmath,amssymb,morehelp}
+
+\newcommand{\nm}[2]{\nomenclature{#1}{#2}}
+
+
+\begin{document}
+\section{blah}
+
+MAKE PICTURE
+
+To develop notation, we examine a few particular cases.
+
+
+\end{document}
diff --git a/test/etags/tex-src/texinfo.tex b/test/etags/tex-src/texinfo.tex
new file mode 100644
index 00000000000..203dca72c22
--- /dev/null
+++ b/test/etags/tex-src/texinfo.tex
@@ -0,0 +1,3350 @@
+%% TeX macros to handle texinfo files
+
+% Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc.
+
+%This texinfo.tex file is free software; you can redistribute it and/or
+%modify it under the terms of the GNU General Public License as
+%published by the Free Software Foundation; either version 2, or (at
+%your option) any later version.
+
+%This texinfo.tex file is distributed in the hope that it will be
+%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%General Public License for more details.
+
+%You should have received a copy of the GNU General Public License
+%along with this texinfo.tex file; see the file COPYING. If not, write
+%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
+%USA.
+
+
+%In other words, you are welcome to use, share and improve this program.
+%You are forbidden to forbid anyone else to use, share and improve
+%what you give them. Help stamp out software-hoarding!
+
+\def\texinfoversion{2.73}
+\message{Loading texinfo package [Version \texinfoversion]:}
+\message{}
+
+% Print the version number if in a .fmt file.
+\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+
+% Save some parts of plain tex whose names we will redefine.
+
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexdots=\dots
+\let\ptexdot=\.
+\let\ptexstar=\*
+\let\ptexend=\end
+\let\ptexbullet=\bullet
+\let\ptexb=\b
+\let\ptexc=\c
+\let\ptexi=\i
+\let\ptext=\t
+\let\ptexl=\l
+\let\ptexL=\L
+
+\def\tie{\penalty 10000\ } % Save plain tex definition of ~.
+
+\message{Basics,}
+\chardef\other=12
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen \bindingoffset \bindingoffset=0pt
+\newdimen \normaloffset \normaloffset=\hoffset
+\newdimen\pagewidth \newdimen\pageheight
+\pagewidth=\hsize \pageheight=\vsize
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{\tracingcommands2 \tracingstats2
+ \tracingpages1 \tracingoutput1 \tracinglostchars1
+ \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+
+%---------------------Begin change-----------------------
+%
+%%%% For @cropmarks command.
+% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\cornerlong \newdimen\cornerthick
+\newdimen \topandbottommargin
+\newdimen \outerhsize \newdimen \outervsize
+\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks
+\outerhsize=7in
+%\outervsize=9.5in
+% Alternative @smallbook page size is 9.25in
+\outervsize=9.25in
+\topandbottommargin=.75in
+%
+%---------------------End change-----------------------
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions itself, but you have to call it yourself.
+\chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}}
+\def\onepageout#1{\hoffset=\normaloffset
+\ifodd\pageno \advance\hoffset by \bindingoffset
+\else \advance\hoffset by -\bindingoffset\fi
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
+{\let\hsize=\pagewidth \makefootline}}}%
+\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+
+%%%% For @cropmarks command %%%%
+
+% Here is a modification of the main output routine for Near East Publications
+% This provides right-angle cropmarks at all four corners.
+% The contents of the page are centerlined into the cropmarks,
+% and any desired binding offset is added as an \hskip on either
+% site of the centerlined box. (P. A. MacKay, 12 November, 1986)
+%
+\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
+ \shipout
+ \vbox to \outervsize{\hsize=\outerhsize
+ \vbox{\line{\ewtop\hfill\ewtop}}
+ \nointerlineskip
+ \line{\vbox{\moveleft\cornerthick\nstop}
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}}
+ \vskip \topandbottommargin
+ \centerline{\ifodd\pageno\hskip\bindingoffset\fi
+ \vbox{
+ {\let\hsize=\pagewidth \makeheadline}
+ \pagebody{#1}
+ {\let\hsize=\pagewidth \makefootline}}
+ \ifodd\pageno\else\hskip\bindingoffset\fi}
+ \vskip \topandbottommargin plus1fill minus1fill
+ \boxmaxdepth\cornerthick
+ \line{\vbox{\moveleft\cornerthick\nsbot}
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}}
+ \nointerlineskip
+ \vbox{\line{\ewbot\hfill\ewbot}}
+ }
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+%
+% Do @cropmarks to get crop marks
+\def\cropmarks{\let\onepageout=\croppageout }
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+%
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.
+% The argument can be delimited with [...] or with "..." or braces
+% or it can be a whole line.
+% #1 should be a macro which expects
+% an ordinary undelimited TeX argument.
+
+\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}
+
+\def\parseargx{%
+\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
+\aftergroup \parseargline %
+\fi \endgroup}
+
+{\obeyspaces %
+\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}
+
+\gdef\obeyedspace{\ }
+
+\def\parseargline{\begingroup \obeylines \parsearglinex}
+{\obeylines %
+\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment. Type Return to continue.}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo is the same as @foo, for now.
+\newhelp\EMsimple{Type <Return> to continue}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+%% @end foo executes the definition of \Efoo.
+%% foo can be delimited by doublequotes or brackets.
+
+\def\end{\parsearg\endxxx}
+
+\def\endxxx #1{%
+\expandafter\ifx\csname E#1\endcsname\relax
+\expandafter\ifx\csname #1\endcsname\relax
+\errmessage{Undefined command @end #1}\else
+\errorE{#1}\fi\fi
+\csname E#1\endcsname}
+\def\errorE#1{
+{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}}
+
+% Single-spacing is done by various environments.
+
+\newskip\singlespaceskip \singlespaceskip = \baselineskip
+\def\singlespace{%
+{\advance \baselineskip by -\singlespaceskip
+\kern \baselineskip}%
+\baselineskip=\singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt \char '100}}
+
+% Define @` and @' to be the same as ` and '
+% but suppressing ligatures.
+\def\`{{`}}
+\def\'{{'}}
+
+% Used to generate quoted braces.
+
+\def\mylbrace {{\tt \char '173}}
+\def\myrbrace {{\tt \char '175}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+\def\group{\begingroup
+ \ifnum\catcode13=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \def\Egroup{\egroup\endgroup}%
+ \vtop\bgroup
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+ % Go into vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % Don't add any leading before our big empty box, but allow a page
+ % break, since the best break might be right here.
+ \allowbreak
+ \nointerlineskip
+ \vtop to #1\mil{\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+}
+
+% @br forces paragraph break
+
+\let\br = \par
+
+% @dots{} output some dots
+
+\def\dots{$\ldots$}
+
+% @page forces the start of a new page
+
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+%\hbox{{\rm#1}}\hfil\break}}
+
+% @include file insert text of that file as input.
+
+\def\include{\parsearg\includezzz}
+\def\includezzz #1{{\def\thisfile{#1}\input #1
+}}
+
+\def\thisfile{}
+
+% @center line outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @sp n outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\par \vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+\parsearg \commentxxx}
+
+\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+
+\let\c=\comment
+
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+\let\chapter=\relax
+\let\unnumbered=\relax
+\let\top=\relax
+\let\unnumberedsec=\relax
+\let\unnumberedsection=\relax
+\let\unnumberedsubsec=\relax
+\let\unnumberedsubsection=\relax
+\let\unnumberedsubsubsec=\relax
+\let\unnumberedsubsubsection=\relax
+\let\section=\relax
+\let\subsec=\relax
+\let\subsubsec=\relax
+\let\subsection=\relax
+\let\subsubsection=\relax
+\let\appendix=\relax
+\let\appendixsec=\relax
+\let\appendixsection=\relax
+\let\appendixsubsec=\relax
+\let\appendixsubsection=\relax
+\let\appendixsubsubsec=\relax
+\let\appendixsubsubsection=\relax
+\let\contents=\relax
+\let\smallbook=\relax
+\let\titlepage=\relax
+}
+
+\def\ignore{\begingroup\ignoresections
+% Make sure that spaces turn into tokens that match what \ignorexxx wants.
+\catcode32=10
+\ignorexxx}
+\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces}
+
+\def\direntry{\begingroup\direntryxxx}
+\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces}
+
+% Conditionals to test whether a flag is set.
+
+\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}
+
+\def\ifsetxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
+\else \let\temp=\relax \fi
+\temp}
+\def\Eifset{}
+\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
+\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces}
+
+\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}
+
+\def\ifclearxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
+\else \let\temp=\ifclearfail \fi
+\temp}
+\def\Eifclear{}
+\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
+\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces}
+
+% @set foo to set the flag named foo.
+% @clear foo to clear the flag named foo.
+\def\set{\parsearg\setxxx}
+\def\setxxx #1{
+\expandafter\let\csname IF#1\endcsname=\set}
+
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx #1{
+\expandafter\let\csname IF#1\endcsname=\relax}
+
+% Some texinfo constructs that are trivial in tex
+
+\def\iftex{}
+\def\Eiftex{}
+\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
+\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces}
+
+\long\def\menu #1\end menu{}
+\def\asis#1{#1}
+
+% @math means output in math mode.
+% We don't use $'s directly in the definition of \math because control
+% sequences like \math are expanded when the toc file is written. Then,
+% we read the toc file back, the $'s will be normal characters (as they
+% should be, according to the definition of Texinfo). So we must use a
+% control sequence to switch into and out of math mode.
+%
+% This isn't quite enough for @math to work properly in indices, but it
+% seems unlikely it will ever be needed there.
+%
+\let\implicitmath = $
+\def\math#1{\implicitmath #1\implicitmath}
+
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\lastnode=\relax
+
+\def\donoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\unnumbnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\appendixnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\let\refill=\relax
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \readauxfile
+ \opencontents
+ \openindices
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+ \comment % Ignore the actual filename.
+}
+
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}},
+ node \samp{\losespace#1{}}}
+\def\losespace #1{#1}
+
+\message{fonts,}
+
+% Font-change commands.
+
+% Texinfo supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+%% Try out Computer Modern fonts at \magstephalf
+\let\mainmagstep=\magstephalf
+
+\ifx\bigger\relax
+\let\mainmagstep=\magstep1
+\font\textrm=cmr12
+\font\texttt=cmtt12
+\else
+\font\textrm=cmr10 scaled \mainmagstep
+\font\texttt=cmtt10 scaled \mainmagstep
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\font\textbf=cmb10 scaled \mainmagstep
+\font\textit=cmti10 scaled \mainmagstep
+\font\textsl=cmsl10 scaled \mainmagstep
+\font\textsf=cmss10 scaled \mainmagstep
+\font\textsc=cmcsc10 scaled \mainmagstep
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\font\defbf=cmbx10 scaled \magstep1 %was 1314
+\font\deftt=cmtt10 scaled \magstep1
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices and small examples.
+% We actually use the slanted font rather than the italic,
+% because texinfo normally uses the slanted fonts for that.
+% Do not make many font distinctions in general in the index, since they
+% aren't very useful.
+\font\ninett=cmtt9
+\font\indrm=cmr9
+\font\indit=cmsl9
+\let\indsl=\indit
+\let\indtt=\ninett
+\let\indsf=\indrm
+\let\indbf=\indrm
+\let\indsc=\indrm
+\font\indi=cmmi9
+\font\indsy=cmsy9
+
+% Fonts for headings
+\font\chaprm=cmbx12 scaled \magstep2
+\font\chapit=cmti12 scaled \magstep2
+\font\chapsl=cmsl12 scaled \magstep2
+\font\chaptt=cmtt12 scaled \magstep2
+\font\chapsf=cmss12 scaled \magstep2
+\let\chapbf=\chaprm
+\font\chapsc=cmcsc10 scaled\magstep3
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+\font\secrm=cmbx12 scaled \magstep1
+\font\secit=cmti12 scaled \magstep1
+\font\secsl=cmsl12 scaled \magstep1
+\font\sectt=cmtt12 scaled \magstep1
+\font\secsf=cmss12 scaled \magstep1
+\font\secbf=cmbx12 scaled \magstep1
+\font\secsc=cmcsc10 scaled\magstep2
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad.
+% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded.
+% \font\ssecsl=cmsl10 scaled \magstep1
+% \font\ssectt=cmtt10 scaled \magstep1
+% \font\ssecsf=cmss10 scaled \magstep1
+
+%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx.
+%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than
+%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1.
+%\font\ssectt=cmtt10 scaled 1315
+%\font\ssecsf=cmss10 scaled 1315
+
+%\let\ssecbf=\ssecrm
+
+\font\ssecrm=cmbx12 scaled \magstephalf
+\font\ssecit=cmti12 scaled \magstephalf
+\font\ssecsl=cmsl12 scaled \magstephalf
+\font\ssectt=cmtt12 scaled \magstephalf
+\font\ssecsf=cmss12 scaled \magstephalf
+\font\ssecbf=cmbx12 scaled \magstephalf
+\font\ssecsc=cmcsc10 scaled \magstep1
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled \magstep1
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% Fonts for title page:
+\font\titlerm = cmbx12 scaled \magstep3
+\let\authorrm = \secrm
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts, we
+% don't bother to reset \scriptfont and \scriptscriptfont (which would
+% also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
+ \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
+ \textfont\ttfam = \tentt \textfont\sffam = \tensf
+}
+
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current. Plain TeX does, for example,
+% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need
+% to redefine \bf itself.
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \resetmathfonts}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \resetmathfonts}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \resetmathfonts}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \resetmathfonts}
+\def\indexfonts{%
+ \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+ \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+ \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
+ \resetmathfonts}
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\font\shortcontrm=cmr12
+\font\shortcontbf=cmbx12
+\font\shortcontsl=cmsl12
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartitalic
+\let\dfn=\smartitalic
+\let\emph=\smartitalic
+\let\cite=\smartitalic
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null}
+\let\ttfont = \t
+%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
+\def\samp #1{`\tclose{#1}'\null}
+\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+\let\file=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\newdimen\tclosesave
+\newdimen\tcloserm
+\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font
+\fontdimen2\font=\tcloserm
+% prevent breaking lines at hyphens.
+\exhyphenpenalty=10000
+\def\ {{\fontdimen2\font=\tclosesave{} }}%
+ \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null}
+\let\code=\tclose
+%\let\exp=\tclose %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else\tclose{\look}\fi
+\else\tclose{\look}\fi}
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of
+% @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+\def\l#1{{\li #1}\null} %
+
+\def\r#1{{\rm #1}} % roman font
+% Use of \lowercase was suggested.
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\def\titlefont#1{{\titlerm #1}}
+
+\newtoks\realeverypar
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+ \let\subtitlerm=\tenrm
+% I deinstalled the following change because \cmr12 is undefined.
+% This change was not in the ChangeLog anyway. --rms.
+% \let\subtitlerm=\cmr12
+ \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+ %
+ \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+ %
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ %
+ % Now you can print the title using @title.
+ \def\title{\parsearg\titlezzz}%
+ \def\titlezzz##1{\leftline{\titlefont{##1}}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt \vskip4pt}%
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Now you can put text using @subtitle.
+ \def\subtitle{\parsearg\subtitlezzz}%
+ \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+ %
+ % @author should come last, but may come many times.
+ \def\author{\parsearg\authorzzz}%
+ \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+ {\authorfont \leftline{##1}}}%
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \oldpage
+ \let\page = \oldpage
+ \hbox{}}%
+% \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ \HEADINGSon
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks \evenheadline % Token sequence for heading line of even pages
+\newtoks \oddheadline % Token sequence for heading line of odd pages
+\newtoks \evenfootline % Token sequence for footing line of even pages
+\newtoks \oddfootline % Token sequence for footing line of odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
+\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
+\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+%
+}% unbind the catcode of @.
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+% Subroutines used in generating headings
+% Produces Day Month Year style of output.
+\def\today{\number\day\space
+\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\year}
+
+% Use this if you want the Month Day, Year style of output.
+%\def\today{\ifcase\month\or
+%January\or February\or March\or April\or May\or June\or
+%July\or August\or September\or October\or November\or December\fi
+%\space\number\day, \number\year}
+
+% @settitle line... specifies the title of the document, for headings
+% It generates no output of its own
+
+\def\thistitle{No Title}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+\message{tables,}
+
+% @tabs -- simple alignment
+
+% These don't work. For one thing, \+ is defined as outer.
+% So these macros cannot even be defined.
+
+%\def\tabs{\parsearg\tabszzz}
+%\def\tabszzz #1{\settabs\+#1\cr}
+%\def\tabline{\parsearg\tablinezzz}
+%\def\tablinezzz #1{\+#1\cr}
+%\def\&{&}
+
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\par \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\par \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+ \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+ \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemfont{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % Be sure we are not still in the middle of a paragraph.
+ \parskip=0in
+ \par
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0
+ \nobreak
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line. Since that
+ % text will be indented by \tableindent, we make the item text be in
+ % a zero-width box.
+ \noindent
+ \rlap{\hskip -\tableindent\box0}%
+ \fi
+ \endgroup
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+%% Contains a kludge to get @end[description] to work
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1 \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1 \endtabley
+\def\Eftable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1 \endtabley
+\def\Evtable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Neccessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\endgroup\afterenvbreak}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+ \begingroup % ended by the @end itemsize
+ \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\endgroup\afterenvbreak}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+ \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ \begingroup % ended by the @end enumerate
+ %
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{\in hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+
+\def\newindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#1}}
+}
+
+% @defindex foo == \newindex{foo}
+
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+
+\def\newcodeindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#1}}
+}
+
+\def\defcodeindex{\parsearg\newcodeindex}
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+\def\synindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\doindex {#2}}%
+}
+
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+\def\syncodeindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex
+\noexpand\docodeindex {#2}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+\def\indexdummies{%
+\def\_{{\realbackslash _}}%
+\def\w{\realbackslash w }%
+\def\bf{\realbackslash bf }%
+\def\rm{\realbackslash rm }%
+\def\sl{\realbackslash sl }%
+\def\sf{\realbackslash sf}%
+\def\tt{\realbackslash tt}%
+\def\gtr{\realbackslash gtr}%
+\def\less{\realbackslash less}%
+\def\hat{\realbackslash hat}%
+\def\char{\realbackslash char}%
+\def\TeX{\realbackslash TeX}%
+\def\dots{\realbackslash dots }%
+\def\copyright{\realbackslash copyright }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\t##1{\realbackslash r {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\b##1{\realbackslash b {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+}
+
+% \indexnofonts no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+\let\w=\indexdummyfont
+\let\t=\indexdummyfont
+\let\r=\indexdummyfont
+\let\i=\indexdummyfont
+\let\b=\indexdummyfont
+\let\emph=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\sc=\indexdummyfont
+%Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |...
+%\let\tt=\indexdummyfont
+\let\tclose=\indexdummyfont
+\let\code=\indexdummyfont
+\let\file=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\var=\indexdummyfont
+\let\TeX=\indexdummytex
+\let\dots=\indexdummydots
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
+{\catcode`\@=0 \catcode`\\=\other
+@gdef@realbackslash{\}}
+
+\let\indexbackslash=0 %overridden during \printindex.
+
+\def\doind #1#2{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0% Expand all macros now EXCEPT \folio
+\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+% so it will be output as is; and it will print as backslash in the indx.
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}}}%
+\temp }%
+}\penalty\count10}}
+
+\def\dosubind #1#2#3{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0%
+\def\rawbackslashxx{\indexbackslash}%
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2 #3}%
+}%
+% Now produce the complete index entry. We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+\temp }%
+}\penalty\count10}}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% This is what you call to cause a particular index to get printed.
+% Write
+% @unnumbered Function Index
+% @printindex fn
+
+\def\printindex{\parsearg\doprintindex}
+
+\def\doprintindex#1{%
+ \tex
+ \dobreak \chapheadingskip {10000}
+ \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
+ \catcode`\$=\other\catcode`\_=\other
+ \catcode`\~=\other
+ %
+ % The following don't help, since the chars were translated
+ % when the raw index was written, and their fonts were discarded
+ % due to \indexnofonts.
+ %\catcode`\"=\active
+ %\catcode`\^=\active
+ %\catcode`\_=\active
+ %\catcode`\|=\active
+ %\catcode`\<=\active
+ %\catcode`\>=\active
+ % %
+ \def\indexbackslash{\rawbackslashxx}
+ \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+ \begindoublecolumns
+ %
+ % See if the index file exists and is nonempty.
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ (Index is nonexistent)
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ (Index is empty)
+ \else
+ \input \jobname.#1s
+ \fi
+ \fi
+ \closein 1
+ \enddoublecolumns
+ \Etex
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+% Same as \bigskipamount except no shrink.
+% \balancecolumns gets confused if there is any shrink.
+\newskip\initialskipamount \initialskipamount 12pt plus4pt
+
+\def\initial #1{%
+{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+\ifdim\lastskip<\initialskipamount
+\removelastskip \penalty-200 \vskip \initialskipamount\fi
+\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
+
+\def\entry #1#2{\begingroup
+ \parfillskip=0in \parskip=0in \parindent=0in
+ %
+ % \hangindent is only relevant when the page number and the entry text
+ % don't fit on one line. In that case, bob suggests starting the dots
+ % pretty far over on the line.
+ % \hangafter is reset to 1 at the start of each paragraph.
+ \hangindent=.75\hsize
+ \noindent
+ %
+ % Don't break the text of the index entry.
+ \hbox{#1}%
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without, a spurious underfull \hbox ensues.
+ \ #2% The page number ends the paragraph.
+ \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+
+\def\secondary #1#2{
+{\parfillskip=0in \parskip=0in
+\hangindent =1in \hangafter=1
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
+}}
+
+%% Define two-column mode, which is used in indexes.
+%% Adapted from the TeXBook, page 416
+\catcode `\@=11
+
+\newbox\partialpage
+
+\newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in
+\newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in
+\newdimen\availdimen@
+
+\def\begindoublecolumns{\begingroup
+ \output={\global\setbox\partialpage=
+ \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
+ \output={\doublecolumnout}%
+ \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
+\def\enddoublecolumns{\output={\balancecolumns}\eject
+ \endgroup \pagegoal=\vsize}
+
+\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
+\def\pagesofar{\unvbox\partialpage %
+ \hsize=\doublecolumnhsize % have to restore this since output routine
+% changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
+ \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
+\def\balancecolumns{%
+% Unset the glue.
+ \setbox255=\vbox{\unvbox255}
+ \dimen@=\ht255
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2
+ \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage
+% If the remaining data is too big for one page,
+% output one page normally, then work with what remains.
+ \ifdim \dimen@>\availdimen@
+ {
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ }
+% Recompute size of what remains, in case we just output some of it.
+ \dimen@=\ht255
+ \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by2
+ \fi
+ \setbox0=\vbox{\unvbox255}
+ \splittopskip=\topskip
+ {\vbadness=10000 \loop \global\setbox3=\copy0
+ \global\setbox1=\vsplit3 to\dimen@
+ \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
+ \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3}
+ \pagesofar}
+
+\catcode `\@=\other
+\message{sectioning,}
+% Define chapters, sections, etc.
+
+\newcount \chapno
+\newcount \secno \secno=0
+\newcount \subsecno \subsecno=0
+\newcount \subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount \appendixno \appendixno = `\@
+\def\appendixletter{\char\the\appendixno}
+
+\newwrite \contentsfile
+% This is called from \setfilename.
+\def\opencontents{\openout \contentsfile = \jobname.toc}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it. @section does likewise
+
+\def\thischapter{} \def\thissection{}
+\def\seccheck#1{\if \pageno<0 %
+\errmessage{@#1 not allowed after generating table of contents}\fi
+%
+}
+
+\def\chapternofonts{%
+\let\rawbackslash=\relax%
+\let\frenchspacing=\relax%
+\def\result{\realbackslash result}
+\def\equiv{\realbackslash equiv}
+\def\expansion{\realbackslash expansion}
+\def\print{\realbackslash print}
+\def\TeX{\realbackslash TeX}
+\def\dots{\realbackslash dots}
+\def\copyright{\realbackslash copyright}
+\def\tt{\realbackslash tt}
+\def\bf{\realbackslash bf }
+\def\w{\realbackslash w}
+\def\less{\realbackslash less}
+\def\gtr{\realbackslash gtr}
+\def\hat{\realbackslash hat}
+\def\char{\realbackslash char}
+\def\tclose##1{\realbackslash tclose {##1}}
+\def\code##1{\realbackslash code {##1}}
+\def\samp##1{\realbackslash samp {##1}}
+\def\r##1{\realbackslash r {##1}}
+\def\b##1{\realbackslash b {##1}}
+\def\key##1{\realbackslash key {##1}}
+\def\file##1{\realbackslash file {##1}}
+\def\kbd##1{\realbackslash kbd {##1}}
+% These are redefined because @smartitalic wouldn't work inside xdef.
+\def\i##1{\realbackslash i {##1}}
+\def\cite##1{\realbackslash cite {##1}}
+\def\var##1{\realbackslash var {##1}}
+\def\emph##1{\realbackslash emph {##1}}
+\def\dfn##1{\realbackslash dfn {##1}}
+}
+
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapterzzz}
+\def\chapterzzz #1{\seccheck{chapter}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\chapmacro {#1}{\the\chapno}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+% We don't substitute the actual chapter name into \thischapter
+% because we don't want its macros evaluated now.
+\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}}
+
+\outer\def\appendix{\parsearg\appendixzzz}
+\def\appendixzzz #1{\seccheck{appendix}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
+\chapmacro {#1}{Appendix \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry
+ {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\global\let\section = \appendixsec
+\global\let\subsection = \appendixsubsec
+\global\let\subsubsection = \appendixsubsubsec
+}}
+
+\outer\def\top{\parsearg\unnumberedzzz}
+\outer\def\unnumbered{\parsearg\unnumberedzzz}
+\def\unnumberedzzz #1{\seccheck{unnumbered}%
+\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}}
+
+\outer\def\numberedsec{\parsearg\seczzz}
+\def\seczzz #1{\seccheck{section}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsection{\parsearg\appendixsectionzzz}
+\outer\def\appendixsec{\parsearg\appendixsectionzzz}
+\def\appendixsectionzzz #1{\seccheck{appendixsection}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
+\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsec{\parsearg\numberedsubseczzz}
+\def\numberedsubseczzz #1{\seccheck{subsection}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
+\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz}
+\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry %
+ {#1}
+ {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+ {\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
+\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+ {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry{#1}%
+ {\appendixletter}
+ {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and
+% such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+{\advance\chapheadingskip by 10pt \chapbreak }%
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\heading{\parsearg\secheadingi}
+
+\def\subheading{\parsearg\subsecheadingi}
+
+\def\subsubheading{\parsearg\subsubsecheadingi}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain}
+
+\def\chfplain #1#2{%
+ \pchapsepmacro
+ {%
+ \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #2\enspace #1}%
+ }%
+ \bigskip
+ \penalty5000
+}
+
+\def\unnchfplain #1{%
+\pchapsepmacro %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen}
+
+% Parameter controlling skip before section headings.
+
+\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+
+\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+
+% @paragraphindent is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
+% Section fonts are the base font at magstep2, which produces
+% a size a bit more than 14 points in the default situation.
+
+\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
+\def\plainsecheading #1{\secheadingi {#1}}
+\def\secheadingi #1{{\advance \secheadingskip by \parskip %
+\secheadingbreak}%
+{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+
+% Subsection fonts are the base font at magstep1,
+% which produces a size of 12 points.
+
+\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
+\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
+ % Perhaps make sssec fonts scaled
+ % magstep half
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
+\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+
+
+\message{toc printing,}
+
+% Finish up the main text and prepare to read what we've written
+% to \contentsfile.
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\def\startcontents#1{%
+ \pagealignmacro
+ \immediate\closeout \contentsfile
+ \ifnum \pageno>0
+ \pageno = -1 % Request roman numbered pages.
+ \fi
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \unnumbchapmacro{#1}\def\thischapter{}%
+ \begingroup % Set up to handle contents files properly.
+ \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+}
+
+
+% Normal (long) toc.
+\outer\def\contents{%
+ \startcontents{Table of Contents}%
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+
+% And just the chapters.
+\outer\def\summarycontents{%
+ \startcontents{Short Contents}%
+ %
+ \let\chapentry = \shortchapentry
+ \let\unnumbchapentry = \shortunnumberedentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+ \rm
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\secentry ##1##2##3##4{}
+ \def\unnumbsecentry ##1##2{}
+ \def\subsecentry ##1##2##3##4##5{}
+ \def\unnumbsubsecentry ##1##2{}
+ \def\subsubsecentry ##1##2##3##4##5##6{}
+ \def\unnumbsubsubsecentry ##1##2{}
+ \input \jobname.toc
+ \endgroup
+ \vfill \eject
+}
+\let\shortcontents = \summarycontents
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapter-level things, for both the long and short contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+
+% See comments in \dochapentry re vbox and related settings
+\def\shortchapentry#1#2#3{%
+ \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright
+ {#2\labelspace #1}\dotfill\doshortpageno{#3}}%
+}
+
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{%
+ \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright
+ #1\dotfill\doshortpageno{#2}}%
+}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+ \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we would want to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip\baselineskip
+ % This \vbox (and similar ones in dosecentry etc.) used to be a
+ % \line; changed to permit linebreaks for long headings. See
+ % comments above \majorheading. Here we also use \strut to
+ % keep the top end of the vbox from jamming up against the previous
+ % entry in the table of contents.
+ \vbox{\chapentryfonts
+ \hyphenpenalty=10000\tolerance=5000 % this line and next introduced
+ \parindent=0pt\strut\raggedright % with \line -> \vbox change
+ #1\dotfill
+ \dopageno{#2}}%
+ \nobreak\vskip .25\baselineskip
+}
+
+\def\dosecentry#1#2{%
+ \vbox{\secentryfonts \leftskip=\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+\def\dosubsecentry#1#2{%
+ \vbox{\subsecentryfonts \leftskip=2\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+\def\dosubsubsecentry#1#2{%
+ \vbox{\subsubsecentryfonts \leftskip=3\tocindent
+ \hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\strut\raggedright #1\dotfill
+ \dopageno{#2}}%
+}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox \newbox\longdblarrowbox
+\newbox\pushcharbox \newbox\bullbox
+\newbox\equivbox \newbox\errorbox
+
+\let\ptexequiv = \equiv
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
+% depth .1ex\hfil}
+%}
+
+\def\point{$\star$}
+
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% Adapted from the TeXbook's \boxit.
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+
+% The @error{} command.
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+\catcode `\%=14
+\catcode 43=12
+\catcode`\"=12
+\catcode`\==12
+\catcode`\|=12
+\catcode`\<=12
+\catcode`\>=12
+\escapechar=`\\
+%
+\let\{=\ptexlbrace
+\let\}=\ptexrbrace
+\let\.=\ptexdot
+\let\*=\ptexstar
+\let\dots=\ptexdots
+\def\@{@}%
+\let\bullet=\ptexbullet
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
+\let\L=\ptexL
+%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^M gets inside @lisp
+% phr: changed space to \null, to avoid overfull hbox problems.
+{\obeyspaces%
+\gdef\lisppar{\null\endgraf}}
+
+% Cause \obeyspaces to make each Space cause a word-separation
+% rather than the default which is that it acts punctuation.
+% This is because space in tt font looks funny.
+{\obeyspaces %
+\gdef\sepspaces{\def {\ }}}
+
+\newskip\aboveenvskipamount \aboveenvskipamount= 0pt
+\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip
+\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}}
+
+\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \cartouche: draw rectangle w/rounded corners around argument
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\long\def\cartouche{%
+\begingroup
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt %we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18pt % allow for 3pt kerns on either
+% side, and for 6pt waste from
+% each corner char
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing=\comment
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \hsize=\cartinner
+ \kern3pt
+ \begingroup
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+\def\Ecartouche{%
+ \endgroup
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+\endgroup
+}}
+
+\def\lisp{\aboveenvbreak
+\begingroup\inENV % This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Elisp{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines \tt \rawbackslash
+\def\next##1{}\next}
+
+
+\let\example=\lisp
+\def\Eexample{\Elisp}
+
+\let\smallexample=\lisp
+\def\Esmallexample{\Elisp}
+
+% Macro for 9 pt. examples, necessary to print with 5" lines.
+% From Pavel@xerox. This is not really used unless the
+% @smallbook command is given.
+
+\def\smalllispx{\aboveenvbreak\begingroup\inENV
+% This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Esmalllisp{\endgroup\afterenvbreak}%
+%%%% Smaller baseline skip for small examples.
+\baselineskip 10pt
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslash
+\def\next##1{}\next}
+
+% This is @display; same as @lisp except use roman font.
+
+\def\display{\begingroup\inENV %This group ends at the end of the @display body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Edisplay{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% This is @format; same as @lisp except use roman font and don't narrow margins
+
+\def\format{\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Eformat{\endgroup\afterenvbreak}
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @flushleft and @flushright
+
+\def\flushleft{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushleft{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+\def\flushright{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushright{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\advance \leftskip by 0pt plus 1fill
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @quotation - narrow the margins.
+
+\def\quotation{%
+\begingroup\inENV %This group ends at the end of the @quotation body
+{\parskip=0pt % because we will skip by \parskip too, later
+\aboveenvbreak}%
+\singlespace
+\parindent=0pt
+\def\Equotation{\par\endgroup\afterenvbreak}%
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\advance \rightskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\nonarrowing=\relax
+\fi}
+
+\message{defuns,}
+% Define formatter for defuns
+% First, allow user to change definition object font (\df) internally
+\def\setdeffont #1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\def\activeparens{%
+\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
+\catcode`\[=\active \catcode`\]=\active}
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
+\global\advance\parencount by 1 }
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+% also in that case restore the outer-level definition of (.
+\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+\global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text. This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
+\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\dimen3=\rightskip
+\advance\dimen3 by -\defbodyindent
+\noindent %
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+\parshape 2 0in \dimen0 \defargsindent \dimen1 %
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000
+\advance\leftskip by -\defbodyindent
+\exdentamount=\defbodyindent
+{\df #1}\enskip % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+% such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\activeparens\spacesplit#3}
+
+\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+
+\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+\def\defvrparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#4}}}
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 at the first space token.
+% call #1 with two arguments:
+% the first is all of #2 before the space token,
+% the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+
+{\obeylines
+\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs #1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\hyphenchar\tensl=0
+#1%
+\hyphenchar\tensl=45
+\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\functionparens
+\code{#1}%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Function}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type. #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\code{#1} #2}{Function}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% #1 is the classification. #2 is the data type. #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup\defname {\code{#2} #3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Macro}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Special Form}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% This definition is run if you use @defunx
+% anywhere other than immediately after a @defun or @defunx.
+
+\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
+\def\defunx #1 {\errmessage{@defunx in invalid context}}
+\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
+\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
+\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+
+% @defmethod, and so on
+
+% @defop {Funny Method} foo-class frobnicate argument
+
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+
+\def\defopheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype{} on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defmethod == @defop Method
+
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+
+\def\defmethodheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+\begingroup\defname {#2}{Method on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype{} of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar == @defcv {Instance Variable}
+
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+
+\def\defivarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{Instance Variable of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% These definitions are run if you use @defmethodx, etc.,
+% anywhere other than immediately after a @defmethod, etc.
+
+\def\defopx #1 {\errmessage{@defopx in invalid context}}
+\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
+\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
+\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
+
+% Now @defvar
+
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{Variable}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{User Option}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type. #2 is the name.
+\def\deftypevarheader #1#2{%
+\doind {vr}{\code{#2}}% Make entry in variables index
+\begingroup\defname {\code{#1} #2}{Variable}%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
+\begingroup\defname {\code{#2} #3}{#1}
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% This definition is run if you use @defvarx
+% anywhere other than immediately after a @defvar or @defvarx.
+
+\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
+\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% This definition is run if you use @deftpx, etc
+% anywhere other than immediately after a @deftp, etc.
+
+\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
+\message{cross reference,}
+% Define cross-reference macros
+\newwrite \auxfile
+
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% \setref{foo} defines a cross-reference point named foo.
+
+\def\setref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ysectionnumberandtype}}
+
+\def\unnumbsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ynothing}}
+
+\def\appendixsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Yappendixletterandtype}}
+
+% \xref, \pxref, and \ref generate cross-references to specified points.
+% For \xrefX, #1 is the node name, #2 the name of the Info
+% cross-reference, #3 the printed node name, #4 the name of the Info
+% file, #5 the name of the printed manual. All but the node name can be
+% omitted.
+%
+\def\pxref#1{see \xrefX[#1,,,,,,,]}
+\def\xref#1{See \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup%
+\def\printedmanual{\ignorespaces #5}%
+\def\printednodename{\ignorespaces #3}%
+%
+\setbox1=\hbox{\printedmanual}%
+\setbox0=\hbox{\printednodename}%
+\ifdim \wd0=0pt%
+\def\printednodename{\ignorespaces #1}%
+%%% Uncommment the following line to make the actual chapter or section title
+%%% appear inside the square brackets.
+%\def\printednodename{#1-title}%
+\fi%
+%
+%
+% If we use \unhbox0 and \unhbox1 to print the node names, TeX does
+% not insert empty discretionaries after hyphens, which means that it
+% will not find a line break at a hyphen in a node names. Since some
+% manuals are best written with fairly long node names, containing
+% hyphens, this is a loss. Therefore, we simply give the text of
+% the node name again, so it is as if TeX is seeing it for the first
+% time.
+\ifdim \wd1>0pt
+section ``\printednodename'' in \cite{\printedmanual}%
+\else%
+\turnoffactive%
+\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
+\fi
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \turnoffactive so that punctuation chars such as underscore
+% work in node names.
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
+\next}}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq
+
+\def\Ypagenumber{\folio}
+
+\def\Ytitle{\thischapter}
+
+\def\Ynothing{}
+
+\def\Ysectionnumberandtype{%
+\ifnum\secno=0 Chapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Non-3.0.
+\else
+ \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+
+\def\refx#1#2{%
+ \expandafter\ifx\csname X#1\endcsname\relax
+ % If not defined, say something at least.
+ $\langle$un\-de\-fined$\rangle$%
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \csname X#1\endcsname
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+
+% This is the macro invoked by entries in the aux file.
+\def\xrdef #1#2{
+{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
+
+\def\readauxfile{%
+\begingroup
+\catcode `\^^@=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\^^C=\other
+\catcode `\^^D=\other
+\catcode `\^^E=\other
+\catcode `\^^F=\other
+\catcode `\^^G=\other
+\catcode `\^^H=\other
+\catcode `\ =\other
+\catcode `\^^L=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode 26=\other
+\catcode `\^^[=\other
+\catcode `\^^\=\other
+\catcode `\^^]=\other
+\catcode `\^^^=\other
+\catcode `\^^_=\other
+\catcode `\@=\other
+\catcode `\^=\other
+\catcode `\~=\other
+\catcode `\[=\other
+\catcode `\]=\other
+\catcode`\"=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode `\$=\other
+\catcode `\#=\other
+\catcode `\&=\other
+% the aux file uses ' as the escape.
+% Turn off \ as an escape so we do not lose on
+% entries which were dumped with control sequences in their names.
+% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
+% Reference to such entries still does not work the way one would wish,
+% but at least they do not bomb out when the aux file is read in.
+\catcode `\{=1 \catcode `\}=2
+\catcode `\%=\other
+\catcode `\'=0
+\catcode `\\=\other
+\openin 1 \jobname.aux
+\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
+\fi
+% Open the new aux file. Tex will close it automatically at exit.
+\openout \auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed.
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only..
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+\long\gdef\footnote #1{\global\advance \footnoteno by \@ne
+\unskip
+\edef\thisfootno{$^{\the\footnoteno}$}%
+\let\@sf\empty
+\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+\thisfootno\@sf \footnotezzz{#1}}
+% \parsearg\footnotezzz}
+
+\long\gdef\footnotezzz #1{\insert\footins{
+\interlinepenalty\interfootnotelinepenalty
+\splittopskip\ht\strutbox % top baseline for broken footnotes
+\splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}}
+
+}%end \catcode `\@=11
+
+% End of control word definitions.
+
+\message{and turning on texinfo input format.}
+
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% Set some numeric style parameters, for 8.5 x 11 format.
+
+%\hsize = 6.5in
+\newdimen\defaultparindent \defaultparindent = 15pt
+\parindent = \defaultparindent
+\parskip 18pt plus 1pt
+\baselineskip 15pt
+\advance\topskip by 1.2cm
+
+% Prevent underfull vbox error messages.
+\vbadness=10000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. This makes it come to about 9pt for the 8.5x11 format.
+%
+\ifx\emergencystretch\thisisundefined \else
+ \emergencystretch = \hsize
+ \divide\emergencystretch by 45
+\fi
+
+% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25)
+\def\smallbook{
+\global\lispnarrowing = 0.3in
+\global\baselineskip 12pt
+\advance\topskip by -1cm
+\global\parskip 3pt plus 1pt
+\global\hsize = 5in
+\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in
+\global\vsize=7.5in
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\contentsrightmargin=0pt
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+
+\global\let\smalllisp=\smalllispx
+\global\let\smallexample=\smalllispx
+\global\def\Esmallexample{\Esmalllisp}
+}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\baselineskip=12pt
+\global\parskip 15pt plus 1pt
+
+\global\vsize= 53\baselineskip
+\advance\vsize by \topskip
+%\global\hsize= 5.85in % A4 wide 10pt
+\global\hsize= 6.5in
+\global\outerhsize=\hsize
+\global\advance\outerhsize by 0.5in
+\global\outervsize=\vsize
+\global\advance\outervsize by 0.6in
+\global\doublecolumnhsize=\hsize
+\global\divide\doublecolumnhsize by 2
+\global\advance\doublecolumnhsize by -0.1in
+\global\doublecolumnvsize=\vsize
+\global\multiply\doublecolumnvsize by 2
+\global\advance\doublecolumnvsize by 0.1in
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+}
+
+%% For a final copy, take out the rectangles
+%% that mark overfull boxes (in case you have decided
+%% that the text looks ok even though it passes the margin).
+\def\finalout{\overfullrule=0pt}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt \char '042}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt \char '176}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+% \lvvmode is equivalent in function to \leavevmode.
+% Using \leavevmode runs into trouble when written out to
+% an index file due to the expansion of \leavevmode into ``\unhbox
+% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
+% magic tricks with @.
+\def\lvvmode{\vbox to 0pt{}}
+
+\catcode`\|=\active
+\def|{{\tt \char '174}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+\def\turnoffactive{\let"=\normaldoublequote
+\let~=\normaltilde
+\let^=\normalcaret
+\let_=\normalunderscore
+\let|=\normalverticalbar
+\let<=\normalless
+\let>=\normalgreater
+\let+=\normalplus}
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`\@=0
+
+% \rawbackslashxx output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
+%@gdef@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
+@gdef@rawbackslash{@let\=@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% Say @foo, not \foo, in error messages.
+\escapechar=`\@
+
+% \catcode 17=0 % Define control-q
+\catcode`\\=\active
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+%
+@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
+
+%% These look ok in all fonts, so just make them not special. The @rm below
+%% makes sure that the current font starts out as the newly loaded cmr10
+@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
+
+@textfonts
+@rm
+
+@c Local variables:
+@c page-delimiter: "^\\\\message"
+@c End:
diff --git a/test/etags/y-src/atest.y b/test/etags/y-src/atest.y
new file mode 100644
index 00000000000..81087b8d86e
--- /dev/null
+++ b/test/etags/y-src/atest.y
@@ -0,0 +1,5 @@
+%%
+exp : exp '*' exp
+ { $$.value = $1.value ? $3.value : $5.value;
+ $$.unsignedp = $3.unsignedp || $5.unsignedp; }
+ ;
diff --git a/test/etags/y-src/cccp.c b/test/etags/y-src/cccp.c
new file mode 100644
index 00000000000..6996705d7cb
--- /dev/null
+++ b/test/etags/y-src/cccp.c
@@ -0,0 +1,2202 @@
+/* A Bison parser, made from cccp.y
+ by GNU bison 1.32. */
+
+#define YYBISON 1 /* Identify Bison output. */
+
+# define INT 257
+# define CHAR 258
+# define NAME 259
+# define ERROR 260
+# define OR 261
+# define AND 262
+# define EQUAL 263
+# define NOTEQUAL 264
+# define LEQ 265
+# define GEQ 266
+# define LSH 267
+# define RSH 268
+# define UNARY 269
+
+#line 26 "cccp.y"
+
+#include "config.h"
+#include <setjmp.h>
+/* #define YYDEBUG 1 */
+
+#ifdef MULTIBYTE_CHARS
+#include <stdlib.h>
+#include <locale.h>
+#endif
+
+#include <stdio.h>
+
+typedef unsigned char U_CHAR;
+
+/* This is used for communicating lists of keywords with cccp.c. */
+struct arglist {
+ struct arglist *next;
+ U_CHAR *name;
+ int length;
+ int argno;
+};
+
+/* Define a generic NULL if one hasn't already been defined. */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef GENERIC_PTR
+#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
+#define GENERIC_PTR void *
+#else
+#define GENERIC_PTR char *
+#endif
+#endif
+
+#ifndef NULL_PTR
+#define NULL_PTR ((GENERIC_PTR)0)
+#endif
+
+int yylex ();
+void yyerror ();
+int expression_value;
+
+static jmp_buf parse_return_error;
+
+/* Nonzero means count most punctuation as part of a name. */
+static int keyword_parsing = 0;
+
+/* some external tables of character types */
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[];
+
+extern char *xmalloc ();
+
+/* Flag for -pedantic. */
+extern int pedantic;
+
+/* Flag for -traditional. */
+extern int traditional;
+
+#ifndef CHAR_TYPE_SIZE
+#define CHAR_TYPE_SIZE BITS_PER_UNIT
+#endif
+
+#ifndef INT_TYPE_SIZE
+#define INT_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef LONG_TYPE_SIZE
+#define LONG_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
+#endif
+
+/* Yield nonzero if adding two numbers with A's and B's signs can yield a
+ number with SUM's sign, where A, B, and SUM are all C integers. */
+#define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
+
+static void integer_overflow ();
+static long left_shift ();
+static long right_shift ();
+
+#line 111 "cccp.y"
+#ifndef YYSTYPE
+typedef union {
+ struct constant {long value; int unsignedp;} integer;
+ struct name {U_CHAR *address; int length;} name;
+ struct arglist *keywords;
+ int voidval;
+ char *sval;
+} yystype;
+# define YYSTYPE yystype
+#endif
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define YYFINAL 73
+#define YYFLAG -32768
+#define YYNTBASE 34
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 269 ? yytranslate[x] : 39)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 29, 2, 31, 2, 27, 14, 2,
+ 32, 33, 25, 23, 9, 24, 2, 26, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 8, 2,
+ 17, 2, 18, 7, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 13, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 12, 2, 30, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 3, 4, 5,
+ 6, 10, 11, 15, 16, 19, 20, 21, 22, 28
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+ 0, 0, 2, 4, 8, 11, 14, 17, 20, 23,
+ 24, 31, 35, 39, 43, 47, 51, 55, 59, 63,
+ 67, 71, 75, 79, 83, 87, 91, 95, 99, 103,
+ 107, 113, 115, 117, 119, 120, 125
+};
+static const short yyrhs[] =
+{
+ 35, 0, 36, 0, 35, 9, 36, 0, 24, 36,
+ 0, 29, 36, 0, 23, 36, 0, 30, 36, 0,
+ 31, 5, 0, 0, 31, 5, 37, 32, 38, 33,
+ 0, 32, 35, 33, 0, 36, 25, 36, 0, 36,
+ 26, 36, 0, 36, 27, 36, 0, 36, 23, 36,
+ 0, 36, 24, 36, 0, 36, 21, 36, 0, 36,
+ 22, 36, 0, 36, 15, 36, 0, 36, 16, 36,
+ 0, 36, 19, 36, 0, 36, 20, 36, 0, 36,
+ 17, 36, 0, 36, 18, 36, 0, 36, 14, 36,
+ 0, 36, 13, 36, 0, 36, 12, 36, 0, 36,
+ 11, 36, 0, 36, 10, 36, 0, 36, 7, 36,
+ 8, 36, 0, 3, 0, 4, 0, 5, 0, 0,
+ 32, 38, 33, 38, 0, 5, 38, 0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+ 0, 143, 148, 149, 156, 161, 164, 166, 169, 173,
+ 173, 180, 185, 197, 212, 223, 230, 237, 243, 249,
+ 252, 255, 261, 267, 273, 279, 282, 285, 288, 291,
+ 294, 297, 299, 301, 306, 308, 321
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+ "$", "error", "$undefined.", "INT", "CHAR", "NAME", "ERROR", "'?'", "':'",
+ "','", "OR", "AND", "'|'", "'^'", "'&'", "EQUAL", "NOTEQUAL", "'<'",
+ "'>'", "LEQ", "GEQ", "LSH", "RSH", "'+'", "'-'", "'*'", "'/'", "'%'",
+ "UNARY", "'!'", "'~'", "'#'", "'('", "')'", "start", "exp1", "exp",
+ "@1", "keywords", NULL
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+ 0, 34, 35, 35, 36, 36, 36, 36, 36, 37,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+ 36, 36, 36, 36, 38, 38, 38
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+ 0, 1, 1, 3, 2, 2, 2, 2, 2, 0,
+ 6, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 5, 1, 1, 1, 0, 4, 2
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+ doesn't specify something else to do. Zero means the default is an
+ error. */
+static const short yydefact[] =
+{
+ 0, 31, 32, 33, 0, 0, 0, 0, 0, 0,
+ 1, 2, 6, 4, 5, 7, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,
+ 3, 0, 29, 28, 27, 26, 25, 19, 20, 23,
+ 24, 21, 22, 17, 18, 15, 16, 12, 13, 14,
+ 34, 0, 34, 34, 0, 30, 36, 0, 10, 34,
+ 35, 0, 0, 0
+};
+
+static const short yydefgoto[] =
+{
+ 71, 10, 11, 38, 64
+};
+
+static const short yypact[] =
+{
+ 31,-32768,-32768,-32768, 31, 31, 31, 31, 4, 31,
+ 3, 80,-32768,-32768,-32768,-32768, 6, 32, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
+ 31, 31, 31, 31, 31, 31, 31, 31, 7,-32768,
+ 80, 59, 97, 113, 128, 142, 155, 25, 25, 162,
+ 162, 162, 162, 167, 167, -19, -19,-32768,-32768,-32768,
+ 5, 31, 5, 5, -20, 80,-32768, 20,-32768, 5,
+ -32768, 40, 56,-32768
+};
+
+static const short yypgoto[] =
+{
+ -32768, 49, -4,-32768, -58
+};
+
+
+#define YYLAST 194
+
+
+static const short yytable[] =
+{
+ 12, 13, 14, 15, 66, 67, 35, 36, 37, 16,
+ 62, 70, 18, 68, 40, 41, 42, 43, 44, 45,
+ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 1, 2, 3, 63, -9, 60,
+ 72, 18, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 69, 4, 5, 73, 65, 17, 0,
+ 6, 7, 8, 9, 0, 39, 19, 61, 0, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 32, 33, 34, 35, 36, 37, 19, 0, 0,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 21, 22,
+ 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+ 33, 34, 35, 36, 37, 22, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 24, 25, 26, 27,
+ 28, 29, 30, 31, 32, 33, 34, 35, 36, 37,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 31, 32, 33, 34, 35, 36, 37,
+ 33, 34, 35, 36, 37
+};
+
+static const short yycheck[] =
+{
+ 4, 5, 6, 7, 62, 63, 25, 26, 27, 5,
+ 5, 69, 9, 33, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+ 34, 35, 36, 37, 3, 4, 5, 32, 32, 32,
+ 0, 9, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 33, 23, 24, 0, 61, 9, -1,
+ 29, 30, 31, 32, -1, 33, 7, 8, -1, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 7, -1, -1,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 11, 12,
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 27, 12, 13, 14, 15, 16,
+ 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+ 27, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 14, 15, 16, 17,
+ 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 21, 22, 23, 24, 25, 26, 27,
+ 23, 24, 25, 26, 27
+};
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "/usr/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* This is the parser code that is written into each bison parser when
+ the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+#ifdef __cplusplus
+# define YYSTD(x) std::x
+#else
+# define YYSTD(x) x
+#endif
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# define YYSIZE_T YYSTD (size_t)
+# else
+# ifndef YYSTACK_USE_ALLOCA
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# define YYSIZE_T YYSTD (size_t)
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# ifdef __cplusplus
+# include <cstdlib> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T std::size_t
+# else
+# ifdef __STDC__
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# endif
+# define YYSTACK_ALLOC YYSTD (malloc)
+# define YYSTACK_FREE YYSTD (free)
+# endif
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short yyss;
+ YYSTYPE yyvs;
+# if YYLSP_NEEDED
+ YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# if YYLSP_NEEDED
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+ + 2 * YYSTACK_GAP_MAX)
+# else
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAX)
+# endif
+
+/* Relocate the TYPE STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Type, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ yymemcpy ((char *) yyptr, (char *) (Stack), \
+ yysize * (YYSIZE_T) sizeof (Type)); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# ifdef __cplusplus
+# include <cstddef> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T std::size_t
+# else
+# ifdef __STDC__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up"); \
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run).
+
+ When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+ first token. By default, to implement support for ranges, extend
+ its range to the last symbol. */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ Current.last_line = Rhs[N].last_line; \
+ Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#if YYPURE
+# if YYLSP_NEEDED
+# ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
+# else
+# define YYLEX yylex (&yylval, &yylloc)
+# endif
+# else /* !YYLSP_NEEDED */
+# ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+# else
+# define YYLEX yylex (&yylval)
+# endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# ifdef __cplusplus
+# include <cstdio> /* INFRINGES ON USER NAME SPACE */
+# else
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYFPRINTF YYSTD (fprintf)
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+/* Nonzero means print parse trace. [The following comment makes no
+ sense to me. Could someone clarify it? --akim] Since this is
+ uninitialized, it does not stop multiple parsers from coexisting.
+ */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+#if ! defined (yyoverflow) && ! defined (yymemcpy)
+# if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+# define yymemcpy __builtin_memcpy
+# else /* not GNU C or C++ */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+# if defined (__STDC__) || defined (__cplusplus)
+yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T yycount)
+# else
+yymemcpy (yyto, yyfrom, yycount)
+ char *yyto;
+ const char *yyfrom;
+ YYSIZE_T yycount;
+# endif
+{
+ register const char *yyf = yyfrom;
+ register char *yyt = yyto;
+ register YYSIZE_T yyi = yycount;
+
+ while (yyi-- != 0)
+ *yyt++ = *yyf++;
+}
+# endif
+#endif
+
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+#endif
+
+#line 341 "/usr/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+# ifdef __cplusplus
+# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+# define YYPARSE_PARAM_DECL
+# else /* !__cplusplus */
+# define YYPARSE_PARAM_ARG YYPARSE_PARAM
+# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif /* !__cplusplus */
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+ variables are global, or local to YYPARSE. */
+
+#define YY_DECL_NON_LSP_VARIABLES \
+/* The lookahead symbol. */ \
+int yychar; \
+ \
+/* The semantic value of the lookahead symbol. */ \
+YYSTYPE yylval; \
+ \
+/* Number of parse errors so far. */ \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES \
+YY_DECL_NON_LSP_VARIABLES \
+ \
+/* Location data for the lookahead symbol. */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ /* If reentrant, generate the variables here. */
+#if YYPURE
+ YY_DECL_VARIABLES
+#endif /* !YYPURE */
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yychar1 = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short yyssa[YYINITDEPTH];
+ short *yyss = yyssa;
+ register short *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+ /* The location stack. */
+ YYLTYPE yylsa[YYINITDEPTH];
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+#if YYLSP_NEEDED
+ YYLTYPE yyloc;
+#endif
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+#if YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. */
+# if YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yyls1, yysize * sizeof (*yylsp),
+ &yystacksize);
+ yyls = yyls1;
+# else
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+# endif
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (short, yyss);
+ YYSTACK_RELOCATE (YYSTYPE, yyvs);
+# if YYLSP_NEEDED
+ YYSTACK_RELOCATE (YYLTYPE, yyls);
+# endif
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+ yylsp = yyls + yysize - 1;
+#endif
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+ /* We have to keep this `#if YYDEBUG', since we use variables
+ which are defined only if `YYDEBUG' is set. */
+ if (yydebug)
+ {
+ YYFPRINTF (stderr, "Next token is %d (%s",
+ yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise
+ meaning of a token, for further debugging info. */
+# ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+# endif
+ YYFPRINTF (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+ yychar, yytname[yychar1]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#if YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to the semantic value of
+ the lookahead token. This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+ /* Similarly for the default location. Let the user run additional
+ commands if for instance locations are ranges. */
+ yyloc = yylsp[1-yylen];
+ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+ /* We have to keep this `#if YYDEBUG', since we use variables which
+ are defined only if `YYDEBUG' is set. */
+ if (yydebug)
+ {
+ int yyi;
+
+ YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+ YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+ switch (yyn) {
+
+case 1:
+#line 144 "cccp.y"
+{ expression_value = yyvsp[0].integer.value; }
+ break;
+case 3:
+#line 150 "cccp.y"
+{ if (pedantic)
+ pedwarn ("comma operator in operand of `#if'");
+ yyval.integer = yyvsp[0].integer; }
+ break;
+case 4:
+#line 157 "cccp.y"
+{ yyval.integer.value = - yyvsp[0].integer.value;
+ if ((yyval.integer.value & yyvsp[0].integer.value) < 0 && ! yyvsp[0].integer.unsignedp)
+ integer_overflow ();
+ yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; }
+ break;
+case 5:
+#line 162 "cccp.y"
+{ yyval.integer.value = ! yyvsp[0].integer.value;
+ yyval.integer.unsignedp = 0; }
+ break;
+case 6:
+#line 165 "cccp.y"
+{ yyval.integer = yyvsp[0].integer; }
+ break;
+case 7:
+#line 167 "cccp.y"
+{ yyval.integer.value = ~ yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; }
+ break;
+case 8:
+#line 170 "cccp.y"
+{ yyval.integer.value = check_assertion (yyvsp[0].name.address, yyvsp[0].name.length,
+ 0, NULL_PTR);
+ yyval.integer.unsignedp = 0; }
+ break;
+case 9:
+#line 174 "cccp.y"
+{ keyword_parsing = 1; }
+ break;
+case 10:
+#line 176 "cccp.y"
+{ yyval.integer.value = check_assertion (yyvsp[-4].name.address, yyvsp[-4].name.length,
+ 1, yyvsp[-1].keywords);
+ keyword_parsing = 0;
+ yyval.integer.unsignedp = 0; }
+ break;
+case 11:
+#line 181 "cccp.y"
+{ yyval.integer = yyvsp[-1].integer; }
+ break;
+case 12:
+#line 186 "cccp.y"
+{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
+ if (yyval.integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value * yyvsp[0].integer.value;
+ else
+ {
+ yyval.integer.value = yyvsp[-2].integer.value * yyvsp[0].integer.value;
+ if (yyvsp[-2].integer.value
+ && (yyval.integer.value / yyvsp[-2].integer.value != yyvsp[0].integer.value
+ || (yyval.integer.value & yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0))
+ integer_overflow ();
+ } }
+ break;
+case 13:
+#line 198 "cccp.y"
+{ if (yyvsp[0].integer.value == 0)
+ {
+ error ("division by zero in #if");
+ yyvsp[0].integer.value = 1;
+ }
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
+ if (yyval.integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value / yyvsp[0].integer.value;
+ else
+ {
+ yyval.integer.value = yyvsp[-2].integer.value / yyvsp[0].integer.value;
+ if ((yyval.integer.value & yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0)
+ integer_overflow ();
+ } }
+ break;
+case 14:
+#line 213 "cccp.y"
+{ if (yyvsp[0].integer.value == 0)
+ {
+ error ("division by zero in #if");
+ yyvsp[0].integer.value = 1;
+ }
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
+ if (yyval.integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value % yyvsp[0].integer.value;
+ else
+ yyval.integer.value = yyvsp[-2].integer.value % yyvsp[0].integer.value; }
+ break;
+case 15:
+#line 224 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
+ if (! yyval.integer.unsignedp
+ && ! possible_sum_sign (yyvsp[-2].integer.value, yyvsp[0].integer.value,
+ yyval.integer.value))
+ integer_overflow (); }
+ break;
+case 16:
+#line 231 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp;
+ if (! yyval.integer.unsignedp
+ && ! possible_sum_sign (yyval.integer.value, yyvsp[0].integer.value,
+ yyvsp[-2].integer.value))
+ integer_overflow (); }
+ break;
+case 17:
+#line 238 "cccp.y"
+{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
+ if (yyvsp[0].integer.value < 0 && ! yyvsp[0].integer.unsignedp)
+ yyval.integer.value = right_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
+ else
+ yyval.integer.value = left_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); }
+ break;
+case 18:
+#line 244 "cccp.y"
+{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
+ if (yyvsp[0].integer.value < 0 && ! yyvsp[0].integer.unsignedp)
+ yyval.integer.value = left_shift (&yyvsp[-2].integer, -yyvsp[0].integer.value);
+ else
+ yyval.integer.value = right_shift (&yyvsp[-2].integer, yyvsp[0].integer.value); }
+ break;
+case 19:
+#line 250 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value);
+ yyval.integer.unsignedp = 0; }
+ break;
+case 20:
+#line 253 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value);
+ yyval.integer.unsignedp = 0; }
+ break;
+case 21:
+#line 256 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value <= yyvsp[0].integer.value;
+ else
+ yyval.integer.value = yyvsp[-2].integer.value <= yyvsp[0].integer.value; }
+ break;
+case 22:
+#line 262 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value >= yyvsp[0].integer.value;
+ else
+ yyval.integer.value = yyvsp[-2].integer.value >= yyvsp[0].integer.value; }
+ break;
+case 23:
+#line 268 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value < yyvsp[0].integer.value;
+ else
+ yyval.integer.value = yyvsp[-2].integer.value < yyvsp[0].integer.value; }
+ break;
+case 24:
+#line 274 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+ if (yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp)
+ yyval.integer.value = (unsigned long) yyvsp[-2].integer.value > yyvsp[0].integer.value;
+ else
+ yyval.integer.value = yyvsp[-2].integer.value > yyvsp[0].integer.value; }
+ break;
+case 25:
+#line 280 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; }
+ break;
+case 26:
+#line 283 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; }
+ break;
+case 27:
+#line 286 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; }
+ break;
+case 28:
+#line 289 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value && yyvsp[0].integer.value);
+ yyval.integer.unsignedp = 0; }
+ break;
+case 29:
+#line 292 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value || yyvsp[0].integer.value);
+ yyval.integer.unsignedp = 0; }
+ break;
+case 30:
+#line 295 "cccp.y"
+{ yyval.integer.value = yyvsp[-4].integer.value ? yyvsp[-2].integer.value : yyvsp[0].integer.value;
+ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || yyvsp[0].integer.unsignedp; }
+ break;
+case 31:
+#line 298 "cccp.y"
+{ yyval.integer = yylval.integer; }
+ break;
+case 32:
+#line 300 "cccp.y"
+{ yyval.integer = yylval.integer; }
+ break;
+case 33:
+#line 302 "cccp.y"
+{ yyval.integer.value = 0;
+ yyval.integer.unsignedp = 0; }
+ break;
+case 34:
+#line 307 "cccp.y"
+{ yyval.keywords = 0; }
+ break;
+case 35:
+#line 309 "cccp.y"
+{ struct arglist *temp;
+ yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
+ yyval.keywords->next = yyvsp[-2].keywords;
+ yyval.keywords->name = (U_CHAR *) "(";
+ yyval.keywords->length = 1;
+ temp = yyval.keywords;
+ while (temp != 0 && temp->next != 0)
+ temp = temp->next;
+ temp->next = (struct arglist *) xmalloc (sizeof (struct arglist));
+ temp->next->next = yyvsp[0].keywords;
+ temp->next->name = (U_CHAR *) ")";
+ temp->next->length = 1; }
+ break;
+case 36:
+#line 322 "cccp.y"
+{ yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
+ yyval.keywords->name = yyvsp[-1].name.address;
+ yyval.keywords->length = yyvsp[-1].name.length;
+ yyval.keywords->next = yyvsp[0].keywords; }
+ break;
+}
+
+#line 727 "/usr/share/bison/bison.simple"
+
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#if YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+ if (yydebug)
+ {
+ short *yyssp1 = yyss - 1;
+ YYFPRINTF (stderr, "state stack now");
+ while (yyssp1 != yyssp)
+ YYFPRINTF (stderr, " %d", *++yyssp1);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+#if YYLSP_NEEDED
+ *++yylsp = yyloc;
+#endif
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ char *yymsg;
+ int yyx, yycount;
+
+ yycount = 0;
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+ if (yycheck[yyx + yyn] == yyx)
+ yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+ yysize += yystrlen ("parse error, unexpected ") + 1;
+ yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+ if (yycount < 5)
+ {
+ yycount = 0;
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *));
+ yyx++)
+ if (yycheck[yyx + yyn] == yyx)
+ {
+ const char *yyq = ! yycount ? ", expecting " : " or ";
+ yyp = yystpcpy (yyp, yyq);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yycount++;
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exhausted");
+ }
+ else
+#endif /* defined (YYERROR_VERBOSE) */
+ yyerror ("parse error");
+ }
+ goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+ YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+ yychar, yytname[yychar1]));
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token. |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+
+ /* If its default is to accept any token, ok. Otherwise pop it. */
+ yyn = yydefact[yystate];
+ if (yyn)
+ goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token |
+`---------------------------------------------------------------*/
+yyerrpop:
+ if (yyssp == yyss)
+ YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#if YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG
+ if (yydebug)
+ {
+ short *yyssp1 = yyss - 1;
+ YYFPRINTF (stderr, "Error: state stack now");
+ while (yyssp1 != yyssp)
+ YYFPRINTF (stderr, " %d", *++yyssp1);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+/*--------------.
+| yyerrhandle. |
+`--------------*/
+yyerrhandle:
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+#if YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here. |
+`---------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+#line 327 "cccp.y"
+
+
+/* During parsing of a C expression, the pointer to the next character
+ is in this variable. */
+
+static char *lexptr;
+
+/* Take care of parsing a number (anything that starts with a digit).
+ Set yylval and return the token type; update lexptr.
+ LEN is the number of characters in it. */
+
+/* maybe needs to actually deal with floating point numbers */
+
+int
+parse_number (olen)
+ int olen;
+{
+ register char *p = lexptr;
+ register int c;
+ register unsigned long n = 0, nd, ULONG_MAX_over_base;
+ register int base = 10;
+ register int len = olen;
+ register int overflow = 0;
+ register int digit, largest_digit = 0;
+ int spec_long = 0;
+
+ for (c = 0; c < len; c++)
+ if (p[c] == '.') {
+ /* It's a float since it contains a point. */
+ yyerror ("floating point numbers not allowed in #if expressions");
+ return ERROR;
+ }
+
+ yylval.integer.unsignedp = 0;
+
+ if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
+ p += 2;
+ base = 16;
+ len -= 2;
+ }
+ else if (*p == '0')
+ base = 8;
+
+ ULONG_MAX_over_base = (unsigned long) -1 / base;
+
+ for (; len > 0; len--) {
+ c = *p++;
+
+ if (c >= '0' && c <= '9')
+ digit = c - '0';
+ else if (base == 16 && c >= 'a' && c <= 'f')
+ digit = c - 'a' + 10;
+ else if (base == 16 && c >= 'A' && c <= 'F')
+ digit = c - 'A' + 10;
+ else {
+ /* `l' means long, and `u' means unsigned. */
+ while (1) {
+ if (c == 'l' || c == 'L')
+ {
+ if (spec_long)
+ yyerror ("two `l's in integer constant");
+ spec_long = 1;
+ }
+ else if (c == 'u' || c == 'U')
+ {
+ if (yylval.integer.unsignedp)
+ yyerror ("two `u's in integer constant");
+ yylval.integer.unsignedp = 1;
+ }
+ else
+ break;
+
+ if (--len == 0)
+ break;
+ c = *p++;
+ }
+ /* Don't look for any more digits after the suffixes. */
+ break;
+ }
+ if (largest_digit < digit)
+ largest_digit = digit;
+ nd = n * base + digit;
+ overflow |= ULONG_MAX_over_base < n | nd < n;
+ n = nd;
+ }
+
+ if (len != 0) {
+ yyerror ("Invalid number in #if expression");
+ return ERROR;
+ }
+
+ if (base <= largest_digit)
+ warning ("integer constant contains digits beyond the radix");
+
+ if (overflow)
+ warning ("integer constant out of range");
+
+ /* If too big to be signed, consider it unsigned. */
+ if ((long) n < 0 && ! yylval.integer.unsignedp)
+ {
+ if (base == 10)
+ warning ("integer constant is so large that it is unsigned");
+ yylval.integer.unsignedp = 1;
+ }
+
+ lexptr = p;
+ yylval.integer.value = n;
+ return INT;
+}
+
+struct token {
+ char *operator;
+ int token;
+};
+
+static struct token tokentab2[] = {
+ {"&&", AND},
+ {"||", OR},
+ {"<<", LSH},
+ {">>", RSH},
+ {"==", EQUAL},
+ {"!=", NOTEQUAL},
+ {"<=", LEQ},
+ {">=", GEQ},
+ {"++", ERROR},
+ {"--", ERROR},
+ {NULL, ERROR}
+};
+
+/* Read one token, getting characters through lexptr. */
+
+int
+yylex ()
+{
+ register int c;
+ register int namelen;
+ register unsigned char *tokstart;
+ register struct token *toktab;
+ int wide_flag;
+
+ retry:
+
+ tokstart = (unsigned char *) lexptr;
+ c = *tokstart;
+ /* See if it is a special token of length 2. */
+ if (! keyword_parsing)
+ for (toktab = tokentab2; toktab->operator != NULL; toktab++)
+ if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
+ lexptr += 2;
+ if (toktab->token == ERROR)
+ {
+ char *buf = (char *) alloca (40);
+ sprintf (buf, "`%s' not allowed in operand of `#if'", toktab->operator);
+ yyerror (buf);
+ }
+ return toktab->token;
+ }
+
+ switch (c) {
+ case 0:
+ return 0;
+
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ lexptr++;
+ goto retry;
+
+ case 'L':
+ /* Capital L may start a wide-string or wide-character constant. */
+ if (lexptr[1] == '\'')
+ {
+ lexptr++;
+ wide_flag = 1;
+ goto char_constant;
+ }
+ if (lexptr[1] == '"')
+ {
+ lexptr++;
+ wide_flag = 1;
+ goto string_constant;
+ }
+ break;
+
+ case '\'':
+ wide_flag = 0;
+ char_constant:
+ lexptr++;
+ if (keyword_parsing) {
+ char *start_ptr = lexptr - 1;
+ while (1) {
+ c = *lexptr++;
+ if (c == '\\')
+ c = parse_escape (&lexptr);
+ else if (c == '\'')
+ break;
+ }
+ yylval.name.address = tokstart;
+ yylval.name.length = lexptr - start_ptr;
+ return NAME;
+ }
+
+ /* This code for reading a character constant
+ handles multicharacter constants and wide characters.
+ It is mostly copied from c-lex.c. */
+ {
+ register int result = 0;
+ register num_chars = 0;
+ unsigned width = CHAR_TYPE_SIZE;
+ int max_chars;
+ char *token_buffer;
+
+ if (wide_flag)
+ {
+ width = WCHAR_TYPE_SIZE;
+#ifdef MULTIBYTE_CHARS
+ max_chars = MB_CUR_MAX;
+#else
+ max_chars = 1;
+#endif
+ }
+ else
+ max_chars = LONG_TYPE_SIZE / width;
+
+ token_buffer = (char *) alloca (max_chars + 1);
+
+ while (1)
+ {
+ c = *lexptr++;
+
+ if (c == '\'' || c == EOF)
+ break;
+
+ if (c == '\\')
+ {
+ c = parse_escape (&lexptr);
+ if (width < HOST_BITS_PER_INT
+ && (unsigned) c >= (1 << width))
+ pedwarn ("escape sequence out of range for character");
+ }
+
+ num_chars++;
+
+ /* Merge character into result; ignore excess chars. */
+ if (num_chars < max_chars + 1)
+ {
+ if (width < HOST_BITS_PER_INT)
+ result = (result << width) | (c & ((1 << width) - 1));
+ else
+ result = c;
+ token_buffer[num_chars - 1] = c;
+ }
+ }
+
+ token_buffer[num_chars] = 0;
+
+ if (c != '\'')
+ error ("malformatted character constant");
+ else if (num_chars == 0)
+ error ("empty character constant");
+ else if (num_chars > max_chars)
+ {
+ num_chars = max_chars;
+ error ("character constant too long");
+ }
+ else if (num_chars != 1 && ! traditional)
+ warning ("multi-character character constant");
+
+ /* If char type is signed, sign-extend the constant. */
+ if (! wide_flag)
+ {
+ int num_bits = num_chars * width;
+
+ if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)
+ || ((result >> (num_bits - 1)) & 1) == 0)
+ yylval.integer.value
+ = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
+ else
+ yylval.integer.value
+ = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
+ }
+ else
+ {
+#ifdef MULTIBYTE_CHARS
+ /* Set the initial shift state and convert the next sequence. */
+ result = 0;
+ /* In all locales L'\0' is zero and mbtowc will return zero,
+ so don't use it. */
+ if (num_chars > 1
+ || (num_chars == 1 && token_buffer[0] != '\0'))
+ {
+ wchar_t wc;
+ (void) mbtowc (NULL_PTR, NULL_PTR, 0);
+ if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
+ result = wc;
+ else
+ warning ("Ignoring invalid multibyte character");
+ }
+#endif
+ yylval.integer.value = result;
+ }
+ }
+
+ /* This is always a signed type. */
+ yylval.integer.unsignedp = 0;
+
+ return CHAR;
+
+ /* some of these chars are invalid in constant expressions;
+ maybe do something about them later */
+ case '/':
+ case '+':
+ case '-':
+ case '*':
+ case '%':
+ case '|':
+ case '&':
+ case '^':
+ case '~':
+ case '!':
+ case '@':
+ case '<':
+ case '>':
+ case '[':
+ case ']':
+ case '.':
+ case '?':
+ case ':':
+ case '=':
+ case '{':
+ case '}':
+ case ',':
+ case '#':
+ if (keyword_parsing)
+ break;
+ case '(':
+ case ')':
+ lexptr++;
+ return c;
+
+ case '"':
+ string_constant:
+ if (keyword_parsing) {
+ char *start_ptr = lexptr;
+ lexptr++;
+ while (1) {
+ c = *lexptr++;
+ if (c == '\\')
+ c = parse_escape (&lexptr);
+ else if (c == '"')
+ break;
+ }
+ yylval.name.address = tokstart;
+ yylval.name.length = lexptr - start_ptr;
+ return NAME;
+ }
+ yyerror ("string constants not allowed in #if expressions");
+ return ERROR;
+ }
+
+ if (c >= '0' && c <= '9' && !keyword_parsing) {
+ /* It's a number */
+ for (namelen = 0;
+ c = tokstart[namelen], is_idchar[c] || c == '.';
+ namelen++)
+ ;
+ return parse_number (namelen);
+ }
+
+ /* It is a name. See how long it is. */
+
+ if (keyword_parsing) {
+ for (namelen = 0;; namelen++) {
+ if (is_hor_space[tokstart[namelen]])
+ break;
+ if (tokstart[namelen] == '(' || tokstart[namelen] == ')')
+ break;
+ if (tokstart[namelen] == '"' || tokstart[namelen] == '\'')
+ break;
+ }
+ } else {
+ if (!is_idstart[c]) {
+ yyerror ("Invalid token in expression");
+ return ERROR;
+ }
+
+ for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
+ ;
+ }
+
+ lexptr += namelen;
+ yylval.name.address = tokstart;
+ yylval.name.length = namelen;
+ return NAME;
+}
+
+
+/* Parse a C escape sequence. STRING_PTR points to a variable
+ containing a pointer to the string to parse. That pointer
+ is updated past the characters we use. The value of the
+ escape sequence is returned.
+
+ A negative value means the sequence \ newline was seen,
+ which is supposed to be equivalent to nothing at all.
+
+ If \ is followed by a null character, we return a negative
+ value and leave the string pointer pointing at the null character.
+
+ If \ is followed by 000, we return 0 and leave the string pointer
+ after the zeros. A value of 0 does not mean end of string. */
+
+int
+parse_escape (string_ptr)
+ char **string_ptr;
+{
+ register int c = *(*string_ptr)++;
+ switch (c)
+ {
+ case 'a':
+ return TARGET_BELL;
+ case 'b':
+ return TARGET_BS;
+ case 'e':
+ case 'E':
+ if (pedantic)
+ pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
+ return 033;
+ case 'f':
+ return TARGET_FF;
+ case 'n':
+ return TARGET_NEWLINE;
+ case 'r':
+ return TARGET_CR;
+ case 't':
+ return TARGET_TAB;
+ case 'v':
+ return TARGET_VT;
+ case '\n':
+ return -2;
+ case 0:
+ (*string_ptr)--;
+ return 0;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ register int i = c - '0';
+ register int count = 0;
+ while (++count < 3)
+ {
+ c = *(*string_ptr)++;
+ if (c >= '0' && c <= '7')
+ i = (i << 3) + c - '0';
+ else
+ {
+ (*string_ptr)--;
+ break;
+ }
+ }
+ if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0)
+ {
+ i &= (1 << CHAR_TYPE_SIZE) - 1;
+ warning ("octal character constant does not fit in a byte");
+ }
+ return i;
+ }
+ case 'x':
+ {
+ register unsigned i = 0, overflow = 0, digits_found = 0, digit;
+ for (;;)
+ {
+ c = *(*string_ptr)++;
+ if (c >= '0' && c <= '9')
+ digit = c - '0';
+ else if (c >= 'a' && c <= 'f')
+ digit = c - 'a' + 10;
+ else if (c >= 'A' && c <= 'F')
+ digit = c - 'A' + 10;
+ else
+ {
+ (*string_ptr)--;
+ break;
+ }
+ overflow |= i ^ (i << 4 >> 4);
+ i = (i << 4) + digit;
+ digits_found = 1;
+ }
+ if (!digits_found)
+ yyerror ("\\x used with no following hex digits");
+ if (overflow | (i & ~((1 << BITS_PER_UNIT) - 1)))
+ {
+ i &= (1 << BITS_PER_UNIT) - 1;
+ warning ("hex character constant does not fit in a byte");
+ }
+ return i;
+ }
+ default:
+ return c;
+ }
+}
+
+void
+yyerror (s)
+ char *s;
+{
+ error (s);
+ longjmp (parse_return_error, 1);
+}
+
+static void
+integer_overflow ()
+{
+ if (pedantic)
+ pedwarn ("integer overflow in preprocessor expression");
+}
+
+static long
+left_shift (a, b)
+ struct constant *a;
+ unsigned long b;
+{
+ if (b >= HOST_BITS_PER_LONG)
+ {
+ if (! a->unsignedp && a->value != 0)
+ integer_overflow ();
+ return 0;
+ }
+ else if (a->unsignedp)
+ return (unsigned long) a->value << b;
+ else
+ {
+ long l = a->value << b;
+ if (l >> b != a->value)
+ integer_overflow ();
+ return l;
+ }
+}
+
+static long
+right_shift (a, b)
+ struct constant *a;
+ unsigned long b;
+{
+ if (b >= HOST_BITS_PER_LONG)
+ return a->unsignedp ? 0 : a->value >> (HOST_BITS_PER_LONG - 1);
+ else if (a->unsignedp)
+ return (unsigned long) a->value >> b;
+ else
+ return a->value >> b;
+}
+
+/* This page contains the entry point to this file. */
+
+/* Parse STRING as an expression, and complain if this fails
+ to use up all of the contents of STRING. */
+/* We do not support C comments. They should be removed before
+ this function is called. */
+
+int
+parse_c_expression (string)
+ char *string;
+{
+ lexptr = string;
+
+ if (lexptr == 0 || *lexptr == 0) {
+ error ("empty #if expression");
+ return 0; /* don't include the #if group */
+ }
+
+ /* if there is some sort of scanning error, just return 0 and assume
+ the parsing routine has printed an error message somewhere.
+ there is surely a better thing to do than this. */
+ if (setjmp (parse_return_error))
+ return 0;
+
+ if (yyparse ())
+ return 0; /* actually this is never reached
+ the way things stand. */
+ if (*lexptr)
+ error ("Junk after end of expression.");
+
+ return expression_value; /* set by yyparse () */
+}
+
+#ifdef TEST_EXP_READER
+extern int yydebug;
+
+/* Main program for testing purposes. */
+int
+main ()
+{
+ int n, c;
+ char buf[1024];
+
+/*
+ yydebug = 1;
+*/
+ initialize_random_junk ();
+
+ for (;;) {
+ printf ("enter expression: ");
+ n = 0;
+ while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)
+ n++;
+ if (buf[n] == EOF)
+ break;
+ buf[n] = '\0';
+ printf ("parser returned %d\n", parse_c_expression (buf));
+ }
+
+ return 0;
+}
+
+/* table to tell if char can be part of a C identifier. */
+unsigned char is_idchar[256];
+/* table to tell if char can be first char of a c identifier. */
+unsigned char is_idstart[256];
+/* table to tell if c is horizontal space. isspace () thinks that
+ newline is space; this is not a good idea for this program. */
+char is_hor_space[256];
+
+/*
+ * initialize random junk in the hash table and maybe other places
+ */
+initialize_random_junk ()
+{
+ register int i;
+
+ /*
+ * Set up is_idchar and is_idstart tables. These should be
+ * faster than saying (is_alpha (c) || c == '_'), etc.
+ * Must do set up these things before calling any routines tthat
+ * refer to them.
+ */
+ for (i = 'a'; i <= 'z'; i++) {
+ ++is_idchar[i - 'a' + 'A'];
+ ++is_idchar[i];
+ ++is_idstart[i - 'a' + 'A'];
+ ++is_idstart[i];
+ }
+ for (i = '0'; i <= '9'; i++)
+ ++is_idchar[i];
+ ++is_idchar['_'];
+ ++is_idstart['_'];
+#if DOLLARS_IN_IDENTIFIERS
+ ++is_idchar['$'];
+ ++is_idstart['$'];
+#endif
+
+ /* horizontal space table */
+ ++is_hor_space[' '];
+ ++is_hor_space['\t'];
+}
+
+error (msg)
+{
+ printf ("error: %s\n", msg);
+}
+
+warning (msg)
+{
+ printf ("warning: %s\n", msg);
+}
+
+struct hashnode *
+lookup (name, len, hash)
+ char *name;
+ int len;
+ int hash;
+{
+ return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);
+}
+#endif
diff --git a/test/etags/y-src/cccp.y b/test/etags/y-src/cccp.y
new file mode 100644
index 00000000000..1cd2111464c
--- /dev/null
+++ b/test/etags/y-src/cccp.y
@@ -0,0 +1,1006 @@
+/* Parse C expressions for CCCP.
+ Copyright (C) 1987, 1992 Free Software Foundation.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ In other words, you are welcome to use, share and improve this program.
+ You are forbidden to forbid anyone else to use, share and improve
+ what you give them. Help stamp out software-hoarding!
+
+ Adapted from expread.y of GDB by Paul Rubin, July 1986. */
+
+/* Parse a C expression from text in a string */
+
+%{
+#include "config.h"
+#include <setjmp.h>
+/* #define YYDEBUG 1 */
+
+#ifdef MULTIBYTE_CHARS
+#include <stdlib.h>
+#include <locale.h>
+#endif
+
+#include <stdio.h>
+
+typedef unsigned char U_CHAR;
+
+/* This is used for communicating lists of keywords with cccp.c. */
+struct arglist {
+ struct arglist *next;
+ U_CHAR *name;
+ int length;
+ int argno;
+};
+
+/* Define a generic NULL if one hasn't already been defined. */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef GENERIC_PTR
+#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
+#define GENERIC_PTR void *
+#else
+#define GENERIC_PTR char *
+#endif
+#endif
+
+#ifndef NULL_PTR
+#define NULL_PTR ((GENERIC_PTR)0)
+#endif
+
+int yylex ();
+void yyerror ();
+int expression_value;
+
+static jmp_buf parse_return_error;
+
+/* Nonzero means count most punctuation as part of a name. */
+static int keyword_parsing = 0;
+
+/* some external tables of character types */
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[];
+
+extern char *xmalloc ();
+
+/* Flag for -pedantic. */
+extern int pedantic;
+
+/* Flag for -traditional. */
+extern int traditional;
+
+#ifndef CHAR_TYPE_SIZE
+#define CHAR_TYPE_SIZE BITS_PER_UNIT
+#endif
+
+#ifndef INT_TYPE_SIZE
+#define INT_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef LONG_TYPE_SIZE
+#define LONG_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
+#endif
+
+/* Yield nonzero if adding two numbers with A's and B's signs can yield a
+ number with SUM's sign, where A, B, and SUM are all C integers. */
+#define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
+
+static void integer_overflow ();
+static long left_shift ();
+static long right_shift ();
+%}
+
+%union {
+ struct constant {long value; int unsignedp;} integer;
+ struct name {U_CHAR *address; int length;} name;
+ struct arglist *keywords;
+ int voidval;
+ char *sval;
+}
+
+%type <integer> exp exp1 start
+%type <keywords> keywords
+%token <integer> INT CHAR
+%token <name> NAME
+%token <integer> ERROR
+
+%right '?' ':'
+%left ','
+%left OR
+%left AND
+%left '|'
+%left '^'
+%left '&'
+%left EQUAL NOTEQUAL
+%left '<' '>' LEQ GEQ
+%left LSH RSH
+%left '+' '-'
+%left '*' '/' '%'
+%right UNARY
+
+/* %expect 40 */
+
+%%
+
+start : exp1
+ { expression_value = $1.value; }
+ ;
+
+/* Expressions, including the comma operator. */
+exp1 : exp
+ | exp1 ',' exp
+ { if (pedantic)
+ pedwarn ("comma operator in operand of `#if'");
+ $$ = $3; }
+ ;
+
+/* Expressions, not including the comma operator. */
+exp : '-' exp %prec UNARY
+ { $$.value = - $2.value;
+ if (($$.value & $2.value) < 0 && ! $2.unsignedp)
+ integer_overflow ();
+ $$.unsignedp = $2.unsignedp; }
+ | '!' exp %prec UNARY
+ { $$.value = ! $2.value;
+ $$.unsignedp = 0; }
+ | '+' exp %prec UNARY
+ { $$ = $2; }
+ | '~' exp %prec UNARY
+ { $$.value = ~ $2.value;
+ $$.unsignedp = $2.unsignedp; }
+ | '#' NAME
+ { $$.value = check_assertion ($2.address, $2.length,
+ 0, NULL_PTR);
+ $$.unsignedp = 0; }
+ | '#' NAME
+ { keyword_parsing = 1; }
+ '(' keywords ')'
+ { $$.value = check_assertion ($2.address, $2.length,
+ 1, $5);
+ keyword_parsing = 0;
+ $$.unsignedp = 0; }
+ | '(' exp1 ')'
+ { $$ = $2; }
+ ;
+
+/* Binary operators in order of decreasing precedence. */
+exp : exp '*' exp
+ { $$.unsignedp = $1.unsignedp || $3.unsignedp;
+ if ($$.unsignedp)
+ $$.value = (unsigned long) $1.value * $3.value;
+ else
+ {
+ $$.value = $1.value * $3.value;
+ if ($1.value
+ && ($$.value / $1.value != $3.value
+ || ($$.value & $1.value & $3.value) < 0))
+ integer_overflow ();
+ } }
+ | exp '/' exp
+ { if ($3.value == 0)
+ {
+ error ("division by zero in #if");
+ $3.value = 1;
+ }
+ $$.unsignedp = $1.unsignedp || $3.unsignedp;
+ if ($$.unsignedp)
+ $$.value = (unsigned long) $1.value / $3.value;
+ else
+ {
+ $$.value = $1.value / $3.value;
+ if (($$.value & $1.value & $3.value) < 0)
+ integer_overflow ();
+ } }
+ | exp '%' exp
+ { if ($3.value == 0)
+ {
+ error ("division by zero in #if");
+ $3.value = 1;
+ }
+ $$.unsignedp = $1.unsignedp || $3.unsignedp;
+ if ($$.unsignedp)
+ $$.value = (unsigned long) $1.value % $3.value;
+ else
+ $$.value = $1.value % $3.value; }
+ | exp '+' exp
+ { $$.value = $1.value + $3.value;
+ $$.unsignedp = $1.unsignedp || $3.unsignedp;
+ if (! $$.unsignedp
+ && ! possible_sum_sign ($1.value, $3.value,
+ $$.value))
+ integer_overflow (); }
+ | exp '-' exp
+ { $$.value = $1.value - $3.value;
+ $$.unsignedp = $1.unsignedp || $3.unsignedp;
+ if (! $$.unsignedp
+ && ! possible_sum_sign ($$.value, $3.value,
+ $1.value))
+ integer_overflow (); }
+ | exp LSH exp
+ { $$.unsignedp = $1.unsignedp;
+ if ($3.value < 0 && ! $3.unsignedp)
+ $$.value = right_shift (&$1, -$3.value);
+ else
+ $$.value = left_shift (&$1, $3.value); }
+ | exp RSH exp
+ { $$.unsignedp = $1.unsignedp;
+ if ($3.value < 0 && ! $3.unsignedp)
+ $$.value = left_shift (&$1, -$3.value);
+ else
+ $$.value = right_shift (&$1, $3.value); }
+ | exp EQUAL exp
+ { $$.value = ($1.value == $3.value);
+ $$.unsignedp = 0; }
+ | exp NOTEQUAL exp
+ { $$.value = ($1.value != $3.value);
+ $$.unsignedp = 0; }
+ | exp LEQ exp
+ { $$.unsignedp = 0;
+ if ($1.unsignedp || $3.unsignedp)
+ $$.value = (unsigned long) $1.value <= $3.value;
+ else
+ $$.value = $1.value <= $3.value; }
+ | exp GEQ exp
+ { $$.unsignedp = 0;
+ if ($1.unsignedp || $3.unsignedp)
+ $$.value = (unsigned long) $1.value >= $3.value;
+ else
+ $$.value = $1.value >= $3.value; }
+ | exp '<' exp
+ { $$.unsignedp = 0;
+ if ($1.unsignedp || $3.unsignedp)
+ $$.value = (unsigned long) $1.value < $3.value;
+ else
+ $$.value = $1.value < $3.value; }
+ | exp '>' exp
+ { $$.unsignedp = 0;
+ if ($1.unsignedp || $3.unsignedp)
+ $$.value = (unsigned long) $1.value > $3.value;
+ else
+ $$.value = $1.value > $3.value; }
+ | exp '&' exp
+ { $$.value = $1.value & $3.value;
+ $$.unsignedp = $1.unsignedp || $3.unsignedp; }
+ | exp '^' exp
+ { $$.value = $1.value ^ $3.value;
+ $$.unsignedp = $1.unsignedp || $3.unsignedp; }
+ | exp '|' exp
+ { $$.value = $1.value | $3.value;
+ $$.unsignedp = $1.unsignedp || $3.unsignedp; }
+ | exp AND exp
+ { $$.value = ($1.value && $3.value);
+ $$.unsignedp = 0; }
+ | exp OR exp
+ { $$.value = ($1.value || $3.value);
+ $$.unsignedp = 0; }
+ | exp '?' exp ':' exp
+ { $$.value = $1.value ? $3.value : $5.value;
+ $$.unsignedp = $3.unsignedp || $5.unsignedp; }
+ | INT
+ { $$ = yylval.integer; }
+ | CHAR
+ { $$ = yylval.integer; }
+ | NAME
+ { $$.value = 0;
+ $$.unsignedp = 0; }
+ ;
+
+keywords :
+ { $$ = 0; }
+ | '(' keywords ')' keywords
+ { struct arglist *temp;
+ $$ = (struct arglist *) xmalloc (sizeof (struct arglist));
+ $$->next = $2;
+ $$->name = (U_CHAR *) "(";
+ $$->length = 1;
+ temp = $$;
+ while (temp != 0 && temp->next != 0)
+ temp = temp->next;
+ temp->next = (struct arglist *) xmalloc (sizeof (struct arglist));
+ temp->next->next = $4;
+ temp->next->name = (U_CHAR *) ")";
+ temp->next->length = 1; }
+ | NAME keywords
+ { $$ = (struct arglist *) xmalloc (sizeof (struct arglist));
+ $$->name = $1.address;
+ $$->length = $1.length;
+ $$->next = $2; }
+ ;
+%%
+
+/* During parsing of a C expression, the pointer to the next character
+ is in this variable. */
+
+static char *lexptr;
+
+/* Take care of parsing a number (anything that starts with a digit).
+ Set yylval and return the token type; update lexptr.
+ LEN is the number of characters in it. */
+
+/* maybe needs to actually deal with floating point numbers */
+
+int
+parse_number (olen)
+ int olen;
+{
+ register char *p = lexptr;
+ register int c;
+ register unsigned long n = 0, nd, ULONG_MAX_over_base;
+ register int base = 10;
+ register int len = olen;
+ register int overflow = 0;
+ register int digit, largest_digit = 0;
+ int spec_long = 0;
+
+ for (c = 0; c < len; c++)
+ if (p[c] == '.') {
+ /* It's a float since it contains a point. */
+ yyerror ("floating point numbers not allowed in #if expressions");
+ return ERROR;
+ }
+
+ yylval.integer.unsignedp = 0;
+
+ if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
+ p += 2;
+ base = 16;
+ len -= 2;
+ }
+ else if (*p == '0')
+ base = 8;
+
+ ULONG_MAX_over_base = (unsigned long) -1 / base;
+
+ for (; len > 0; len--) {
+ c = *p++;
+
+ if (c >= '0' && c <= '9')
+ digit = c - '0';
+ else if (base == 16 && c >= 'a' && c <= 'f')
+ digit = c - 'a' + 10;
+ else if (base == 16 && c >= 'A' && c <= 'F')
+ digit = c - 'A' + 10;
+ else {
+ /* `l' means long, and `u' means unsigned. */
+ while (1) {
+ if (c == 'l' || c == 'L')
+ {
+ if (spec_long)
+ yyerror ("two `l's in integer constant");
+ spec_long = 1;
+ }
+ else if (c == 'u' || c == 'U')
+ {
+ if (yylval.integer.unsignedp)
+ yyerror ("two `u's in integer constant");
+ yylval.integer.unsignedp = 1;
+ }
+ else
+ break;
+
+ if (--len == 0)
+ break;
+ c = *p++;
+ }
+ /* Don't look for any more digits after the suffixes. */
+ break;
+ }
+ if (largest_digit < digit)
+ largest_digit = digit;
+ nd = n * base + digit;
+ overflow |= ULONG_MAX_over_base < n | nd < n;
+ n = nd;
+ }
+
+ if (len != 0) {
+ yyerror ("Invalid number in #if expression");
+ return ERROR;
+ }
+
+ if (base <= largest_digit)
+ warning ("integer constant contains digits beyond the radix");
+
+ if (overflow)
+ warning ("integer constant out of range");
+
+ /* If too big to be signed, consider it unsigned. */
+ if ((long) n < 0 && ! yylval.integer.unsignedp)
+ {
+ if (base == 10)
+ warning ("integer constant is so large that it is unsigned");
+ yylval.integer.unsignedp = 1;
+ }
+
+ lexptr = p;
+ yylval.integer.value = n;
+ return INT;
+}
+
+struct token {
+ char *operator;
+ int token;
+};
+
+static struct token tokentab2[] = {
+ {"&&", AND},
+ {"||", OR},
+ {"<<", LSH},
+ {">>", RSH},
+ {"==", EQUAL},
+ {"!=", NOTEQUAL},
+ {"<=", LEQ},
+ {">=", GEQ},
+ {"++", ERROR},
+ {"--", ERROR},
+ {NULL, ERROR}
+};
+
+/* Read one token, getting characters through lexptr. */
+
+int
+yylex ()
+{
+ register int c;
+ register int namelen;
+ register unsigned char *tokstart;
+ register struct token *toktab;
+ int wide_flag;
+
+ retry:
+
+ tokstart = (unsigned char *) lexptr;
+ c = *tokstart;
+ /* See if it is a special token of length 2. */
+ if (! keyword_parsing)
+ for (toktab = tokentab2; toktab->operator != NULL; toktab++)
+ if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
+ lexptr += 2;
+ if (toktab->token == ERROR)
+ {
+ char *buf = (char *) alloca (40);
+ sprintf (buf, "`%s' not allowed in operand of `#if'", toktab->operator);
+ yyerror (buf);
+ }
+ return toktab->token;
+ }
+
+ switch (c) {
+ case 0:
+ return 0;
+
+ case ' ':
+ case '\t':
+ case '\r':
+ case '\n':
+ lexptr++;
+ goto retry;
+
+ case 'L':
+ /* Capital L may start a wide-string or wide-character constant. */
+ if (lexptr[1] == '\'')
+ {
+ lexptr++;
+ wide_flag = 1;
+ goto char_constant;
+ }
+ if (lexptr[1] == '"')
+ {
+ lexptr++;
+ wide_flag = 1;
+ goto string_constant;
+ }
+ break;
+
+ case '\'':
+ wide_flag = 0;
+ char_constant:
+ lexptr++;
+ if (keyword_parsing) {
+ char *start_ptr = lexptr - 1;
+ while (1) {
+ c = *lexptr++;
+ if (c == '\\')
+ c = parse_escape (&lexptr);
+ else if (c == '\'')
+ break;
+ }
+ yylval.name.address = tokstart;
+ yylval.name.length = lexptr - start_ptr;
+ return NAME;
+ }
+
+ /* This code for reading a character constant
+ handles multicharacter constants and wide characters.
+ It is mostly copied from c-lex.c. */
+ {
+ register int result = 0;
+ register num_chars = 0;
+ unsigned width = CHAR_TYPE_SIZE;
+ int max_chars;
+ char *token_buffer;
+
+ if (wide_flag)
+ {
+ width = WCHAR_TYPE_SIZE;
+#ifdef MULTIBYTE_CHARS
+ max_chars = MB_CUR_MAX;
+#else
+ max_chars = 1;
+#endif
+ }
+ else
+ max_chars = LONG_TYPE_SIZE / width;
+
+ token_buffer = (char *) alloca (max_chars + 1);
+
+ while (1)
+ {
+ c = *lexptr++;
+
+ if (c == '\'' || c == EOF)
+ break;
+
+ if (c == '\\')
+ {
+ c = parse_escape (&lexptr);
+ if (width < HOST_BITS_PER_INT
+ && (unsigned) c >= (1 << width))
+ pedwarn ("escape sequence out of range for character");
+ }
+
+ num_chars++;
+
+ /* Merge character into result; ignore excess chars. */
+ if (num_chars < max_chars + 1)
+ {
+ if (width < HOST_BITS_PER_INT)
+ result = (result << width) | (c & ((1 << width) - 1));
+ else
+ result = c;
+ token_buffer[num_chars - 1] = c;
+ }
+ }
+
+ token_buffer[num_chars] = 0;
+
+ if (c != '\'')
+ error ("malformatted character constant");
+ else if (num_chars == 0)
+ error ("empty character constant");
+ else if (num_chars > max_chars)
+ {
+ num_chars = max_chars;
+ error ("character constant too long");
+ }
+ else if (num_chars != 1 && ! traditional)
+ warning ("multi-character character constant");
+
+ /* If char type is signed, sign-extend the constant. */
+ if (! wide_flag)
+ {
+ int num_bits = num_chars * width;
+
+ if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)
+ || ((result >> (num_bits - 1)) & 1) == 0)
+ yylval.integer.value
+ = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
+ else
+ yylval.integer.value
+ = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - num_bits));
+ }
+ else
+ {
+#ifdef MULTIBYTE_CHARS
+ /* Set the initial shift state and convert the next sequence. */
+ result = 0;
+ /* In all locales L'\0' is zero and mbtowc will return zero,
+ so don't use it. */
+ if (num_chars > 1
+ || (num_chars == 1 && token_buffer[0] != '\0'))
+ {
+ wchar_t wc;
+ (void) mbtowc (NULL_PTR, NULL_PTR, 0);
+ if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
+ result = wc;
+ else
+ warning ("Ignoring invalid multibyte character");
+ }
+#endif
+ yylval.integer.value = result;
+ }
+ }
+
+ /* This is always a signed type. */
+ yylval.integer.unsignedp = 0;
+
+ return CHAR;
+
+ /* some of these chars are invalid in constant expressions;
+ maybe do something about them later */
+ case '/':
+ case '+':
+ case '-':
+ case '*':
+ case '%':
+ case '|':
+ case '&':
+ case '^':
+ case '~':
+ case '!':
+ case '@':
+ case '<':
+ case '>':
+ case '[':
+ case ']':
+ case '.':
+ case '?':
+ case ':':
+ case '=':
+ case '{':
+ case '}':
+ case ',':
+ case '#':
+ if (keyword_parsing)
+ break;
+ case '(':
+ case ')':
+ lexptr++;
+ return c;
+
+ case '"':
+ string_constant:
+ if (keyword_parsing) {
+ char *start_ptr = lexptr;
+ lexptr++;
+ while (1) {
+ c = *lexptr++;
+ if (c == '\\')
+ c = parse_escape (&lexptr);
+ else if (c == '"')
+ break;
+ }
+ yylval.name.address = tokstart;
+ yylval.name.length = lexptr - start_ptr;
+ return NAME;
+ }
+ yyerror ("string constants not allowed in #if expressions");
+ return ERROR;
+ }
+
+ if (c >= '0' && c <= '9' && !keyword_parsing) {
+ /* It's a number */
+ for (namelen = 0;
+ c = tokstart[namelen], is_idchar[c] || c == '.';
+ namelen++)
+ ;
+ return parse_number (namelen);
+ }
+
+ /* It is a name. See how long it is. */
+
+ if (keyword_parsing) {
+ for (namelen = 0;; namelen++) {
+ if (is_hor_space[tokstart[namelen]])
+ break;
+ if (tokstart[namelen] == '(' || tokstart[namelen] == ')')
+ break;
+ if (tokstart[namelen] == '"' || tokstart[namelen] == '\'')
+ break;
+ }
+ } else {
+ if (!is_idstart[c]) {
+ yyerror ("Invalid token in expression");
+ return ERROR;
+ }
+
+ for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
+ ;
+ }
+
+ lexptr += namelen;
+ yylval.name.address = tokstart;
+ yylval.name.length = namelen;
+ return NAME;
+}
+
+
+/* Parse a C escape sequence. STRING_PTR points to a variable
+ containing a pointer to the string to parse. That pointer
+ is updated past the characters we use. The value of the
+ escape sequence is returned.
+
+ A negative value means the sequence \ newline was seen,
+ which is supposed to be equivalent to nothing at all.
+
+ If \ is followed by a null character, we return a negative
+ value and leave the string pointer pointing at the null character.
+
+ If \ is followed by 000, we return 0 and leave the string pointer
+ after the zeros. A value of 0 does not mean end of string. */
+
+int
+parse_escape (string_ptr)
+ char **string_ptr;
+{
+ register int c = *(*string_ptr)++;
+ switch (c)
+ {
+ case 'a':
+ return TARGET_BELL;
+ case 'b':
+ return TARGET_BS;
+ case 'e':
+ case 'E':
+ if (pedantic)
+ pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
+ return 033;
+ case 'f':
+ return TARGET_FF;
+ case 'n':
+ return TARGET_NEWLINE;
+ case 'r':
+ return TARGET_CR;
+ case 't':
+ return TARGET_TAB;
+ case 'v':
+ return TARGET_VT;
+ case '\n':
+ return -2;
+ case 0:
+ (*string_ptr)--;
+ return 0;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ register int i = c - '0';
+ register int count = 0;
+ while (++count < 3)
+ {
+ c = *(*string_ptr)++;
+ if (c >= '0' && c <= '7')
+ i = (i << 3) + c - '0';
+ else
+ {
+ (*string_ptr)--;
+ break;
+ }
+ }
+ if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0)
+ {
+ i &= (1 << CHAR_TYPE_SIZE) - 1;
+ warning ("octal character constant does not fit in a byte");
+ }
+ return i;
+ }
+ case 'x':
+ {
+ register unsigned i = 0, overflow = 0, digits_found = 0, digit;
+ for (;;)
+ {
+ c = *(*string_ptr)++;
+ if (c >= '0' && c <= '9')
+ digit = c - '0';
+ else if (c >= 'a' && c <= 'f')
+ digit = c - 'a' + 10;
+ else if (c >= 'A' && c <= 'F')
+ digit = c - 'A' + 10;
+ else
+ {
+ (*string_ptr)--;
+ break;
+ }
+ overflow |= i ^ (i << 4 >> 4);
+ i = (i << 4) + digit;
+ digits_found = 1;
+ }
+ if (!digits_found)
+ yyerror ("\\x used with no following hex digits");
+ if (overflow | (i & ~((1 << BITS_PER_UNIT) - 1)))
+ {
+ i &= (1 << BITS_PER_UNIT) - 1;
+ warning ("hex character constant does not fit in a byte");
+ }
+ return i;
+ }
+ default:
+ return c;
+ }
+}
+
+void
+yyerror (s)
+ char *s;
+{
+ error (s);
+ longjmp (parse_return_error, 1);
+}
+
+static void
+integer_overflow ()
+{
+ if (pedantic)
+ pedwarn ("integer overflow in preprocessor expression");
+}
+
+static long
+left_shift (a, b)
+ struct constant *a;
+ unsigned long b;
+{
+ if (b >= HOST_BITS_PER_LONG)
+ {
+ if (! a->unsignedp && a->value != 0)
+ integer_overflow ();
+ return 0;
+ }
+ else if (a->unsignedp)
+ return (unsigned long) a->value << b;
+ else
+ {
+ long l = a->value << b;
+ if (l >> b != a->value)
+ integer_overflow ();
+ return l;
+ }
+}
+
+static long
+right_shift (a, b)
+ struct constant *a;
+ unsigned long b;
+{
+ if (b >= HOST_BITS_PER_LONG)
+ return a->unsignedp ? 0 : a->value >> (HOST_BITS_PER_LONG - 1);
+ else if (a->unsignedp)
+ return (unsigned long) a->value >> b;
+ else
+ return a->value >> b;
+}
+
+/* This page contains the entry point to this file. */
+
+/* Parse STRING as an expression, and complain if this fails
+ to use up all of the contents of STRING. */
+/* We do not support C comments. They should be removed before
+ this function is called. */
+
+int
+parse_c_expression (string)
+ char *string;
+{
+ lexptr = string;
+
+ if (lexptr == 0 || *lexptr == 0) {
+ error ("empty #if expression");
+ return 0; /* don't include the #if group */
+ }
+
+ /* if there is some sort of scanning error, just return 0 and assume
+ the parsing routine has printed an error message somewhere.
+ there is surely a better thing to do than this. */
+ if (setjmp (parse_return_error))
+ return 0;
+
+ if (yyparse ())
+ return 0; /* actually this is never reached
+ the way things stand. */
+ if (*lexptr)
+ error ("Junk after end of expression.");
+
+ return expression_value; /* set by yyparse () */
+}
+
+#ifdef TEST_EXP_READER
+extern int yydebug;
+
+/* Main program for testing purposes. */
+int
+main ()
+{
+ int n, c;
+ char buf[1024];
+
+/*
+ yydebug = 1;
+*/
+ initialize_random_junk ();
+
+ for (;;) {
+ printf ("enter expression: ");
+ n = 0;
+ while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)
+ n++;
+ if (buf[n] == EOF)
+ break;
+ buf[n] = '\0';
+ printf ("parser returned %d\n", parse_c_expression (buf));
+ }
+
+ return 0;
+}
+
+/* table to tell if char can be part of a C identifier. */
+unsigned char is_idchar[256];
+/* table to tell if char can be first char of a c identifier. */
+unsigned char is_idstart[256];
+/* table to tell if c is horizontal space. isspace () thinks that
+ newline is space; this is not a good idea for this program. */
+char is_hor_space[256];
+
+/*
+ * initialize random junk in the hash table and maybe other places
+ */
+initialize_random_junk ()
+{
+ register int i;
+
+ /*
+ * Set up is_idchar and is_idstart tables. These should be
+ * faster than saying (is_alpha (c) || c == '_'), etc.
+ * Must do set up these things before calling any routines tthat
+ * refer to them.
+ */
+ for (i = 'a'; i <= 'z'; i++) {
+ ++is_idchar[i - 'a' + 'A'];
+ ++is_idchar[i];
+ ++is_idstart[i - 'a' + 'A'];
+ ++is_idstart[i];
+ }
+ for (i = '0'; i <= '9'; i++)
+ ++is_idchar[i];
+ ++is_idchar['_'];
+ ++is_idstart['_'];
+#if DOLLARS_IN_IDENTIFIERS
+ ++is_idchar['$'];
+ ++is_idstart['$'];
+#endif
+
+ /* horizontal space table */
+ ++is_hor_space[' '];
+ ++is_hor_space['\t'];
+}
+
+error (msg)
+{
+ printf ("error: %s\n", msg);
+}
+
+warning (msg)
+{
+ printf ("warning: %s\n", msg);
+}
+
+struct hashnode *
+lookup (name, len, hash)
+ char *name;
+ int len;
+ int hash;
+{
+ return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);
+}
+#endif
diff --git a/test/etags/y-src/parse.c b/test/etags/y-src/parse.c
new file mode 100644
index 00000000000..7b1eedc85db
--- /dev/null
+++ b/test/etags/y-src/parse.c
@@ -0,0 +1,2236 @@
+/* A Bison parser, made from parse.y
+ by GNU bison 1.32. */
+
+#define YYBISON 1 /* Identify Bison output. */
+
+# define NE 257
+# define LE 258
+# define GE 259
+# define NEG 260
+# define L_CELL 261
+# define L_RANGE 262
+# define L_VAR 263
+# define L_CONST 264
+# define L_FN0 265
+# define L_FN1 266
+# define L_FN2 267
+# define L_FN3 268
+# define L_FN4 269
+# define L_FNN 270
+# define L_FN1R 271
+# define L_FN2R 272
+# define L_FN3R 273
+# define L_FN4R 274
+# define L_FNNR 275
+# define L_LE 276
+# define L_NE 277
+# define L_GE 278
+
+#line 1 "parse.y"
+
+/* Copyright (C) 1990, 1992, 1993 Free Software Foundation, Inc.
+
+This file is part of Oleo, the GNU Spreadsheet.
+
+Oleo is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+Oleo is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Oleo; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+#line 41 "parse.y"
+
+#include "funcdef.h"
+
+#include <ctype.h>
+
+#define obstack_chunk_alloc ck_malloc
+#define obstack_chunk_free free
+#include "obstack.h"
+#include "sysdef.h"
+
+#include "global.h"
+#include "errors.h"
+#include "node.h"
+#include "eval.h"
+#include "ref.h"
+
+int yylex ();
+#ifdef __STDC__
+void yyerror (char *);
+#else
+void yyerror ();
+#endif
+VOIDSTAR parse_hash;
+extern VOIDSTAR hash_find();
+
+/* This table contains a list of the infix single-char functions */
+unsigned char fnin[] = {
+ SUM, DIFF, DIV, PROD, MOD, /* AND, OR, */ POW, EQUAL, IF, CONCAT, 0
+};
+
+#define YYSTYPE _y_y_s_t_y_p_e
+typedef struct node *YYSTYPE;
+YYSTYPE parse_return;
+#ifdef __STDC__
+YYSTYPE make_list (YYSTYPE, YYSTYPE);
+#else
+YYSTYPE make_list ();
+#endif
+
+char *instr;
+int parse_error = 0;
+extern struct obstack tmp_mem;
+
+#ifndef YYSTYPE
+#define YYSTYPE int
+#endif
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define YYFINAL 131
+#define YYFLAG -32768
+#define YYNTBASE 41
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 278 ? yytranslate[x] : 47)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 19, 2, 2, 2, 16, 5, 2,
+ 38, 39, 14, 12, 40, 13, 2, 15, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 4, 2,
+ 8, 6, 10, 3, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 17, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 7, 9, 11,
+ 18, 20, 21, 22, 23, 24, 25, 26, 27, 28,
+ 29, 30, 31, 32, 33, 34, 35, 36, 37
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+ 0, 0, 2, 4, 6, 8, 12, 17, 24, 33,
+ 44, 49, 54, 59, 66, 73, 82, 91, 100, 109,
+ 114, 120, 124, 128, 132, 136, 140, 144, 148, 152,
+ 156, 160, 164, 168, 172, 175, 178, 182, 186, 189,
+ 191, 195, 197, 199, 201, 205, 207
+};
+static const short yyrhs[] =
+{
+ 42, 0, 1, 0, 23, 0, 46, 0, 24, 38,
+ 39, 0, 25, 38, 42, 39, 0, 26, 38, 42,
+ 40, 42, 39, 0, 27, 38, 42, 40, 42, 40,
+ 42, 39, 0, 28, 38, 42, 40, 42, 40, 42,
+ 40, 42, 39, 0, 29, 38, 43, 39, 0, 30,
+ 38, 21, 39, 0, 30, 38, 22, 39, 0, 31,
+ 38, 21, 40, 42, 39, 0, 31, 38, 22, 40,
+ 42, 39, 0, 31, 38, 21, 40, 42, 40, 42,
+ 39, 0, 31, 38, 22, 40, 42, 40, 42, 39,
+ 0, 32, 38, 21, 40, 42, 40, 42, 39, 0,
+ 32, 38, 22, 40, 42, 40, 42, 39, 0, 34,
+ 38, 45, 39, 0, 42, 3, 42, 4, 42, 0,
+ 42, 5, 42, 0, 42, 8, 42, 0, 42, 9,
+ 42, 0, 42, 6, 42, 0, 42, 7, 42, 0,
+ 42, 10, 42, 0, 42, 11, 42, 0, 42, 12,
+ 42, 0, 42, 13, 42, 0, 42, 14, 42, 0,
+ 42, 15, 42, 0, 42, 16, 42, 0, 42, 17,
+ 42, 0, 13, 42, 0, 19, 42, 0, 38, 42,
+ 39, 0, 38, 42, 1, 0, 38, 1, 0, 42,
+ 0, 43, 40, 42, 0, 21, 0, 42, 0, 44,
+ 0, 45, 40, 44, 0, 20, 0, 22, 0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+ 0, 86, 88, 94, 95, 96, 98, 102, 106, 110,
+ 114, 118, 121, 125, 129, 135, 142, 150, 154, 159,
+ 163, 174, 178, 182, 186, 190, 194, 198, 202, 206,
+ 210, 214, 218, 222, 226, 241, 245, 247, 255, 262,
+ 264, 268, 269, 272, 274, 278, 280
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+ "$", "error", "$undefined.", "'?'", "':'", "'&'", "'='", "NE", "'<'",
+ "LE", "'>'", "GE", "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", "NEG",
+ "'!'", "L_CELL", "L_RANGE", "L_VAR", "L_CONST", "L_FN0", "L_FN1",
+ "L_FN2", "L_FN3", "L_FN4", "L_FNN", "L_FN1R", "L_FN2R", "L_FN3R",
+ "L_FN4R", "L_FNNR", "L_LE", "L_NE", "L_GE", "'('", "')'", "','", "line",
+ "exp", "exp_list", "range_exp", "range_exp_list", "cell", NULL
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+ 0, 41, 41, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 43,
+ 43, 44, 44, 45, 45, 46, 46
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+ 0, 1, 1, 1, 1, 3, 4, 6, 8, 10,
+ 4, 4, 4, 6, 6, 8, 8, 8, 8, 4,
+ 5, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 2, 2, 3, 3, 2, 1,
+ 3, 1, 1, 1, 3, 1, 1
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+ doesn't specify something else to do. Zero means the default is an
+ error. */
+static const short yydefact[] =
+{
+ 0, 2, 0, 0, 45, 46, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 4,
+ 34, 35, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 38, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+ 0, 0, 0, 39, 0, 0, 0, 0, 0, 0,
+ 0, 41, 42, 43, 0, 37, 36, 0, 21, 24,
+ 25, 22, 23, 26, 27, 28, 29, 30, 31, 32,
+ 33, 6, 0, 0, 0, 10, 0, 11, 12, 0,
+ 0, 0, 0, 19, 0, 0, 0, 0, 0, 40,
+ 0, 0, 0, 0, 44, 20, 7, 0, 0, 13,
+ 0, 14, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8, 0, 15, 16, 17, 18, 0, 9, 0,
+ 0, 0
+};
+
+static const short yydefgoto[] =
+{
+ 129, 62, 54, 63, 64, 19
+};
+
+static const short yypact[] =
+{
+ 104,-32768, 486, 486,-32768,-32768,-32768, -37, -22, -16,
+ 10, 12, 14, 29, 43, 47, 50, 124, 537,-32768,
+ -32768,-32768, 59, 486, 486, 486, 486, 486, 7, 9,
+ 11, 464,-32768, 48, 486, 486, 486, 486, 486, 486,
+ 486, 486, 486, 486, 486, 486, 486, 486,-32768, 332,
+ 173, 209, 224, 537, 54, 60, 61, 64, 66, 69,
+ 71,-32768, 537,-32768, 57,-32768,-32768, 522, -2, 193,
+ 193, 547, 547, 547, 547, 4, 4, 84, 84, 84,
+ 84,-32768, 486, 486, 486,-32768, 486,-32768,-32768, 486,
+ 486, 486, 486,-32768, 464, 486, 353, 245, 260, 537,
+ 63, 158, 281, 296,-32768, 537,-32768, 486, 486,-32768,
+ 486,-32768, 486, 486, 486, 369, 317, 388, 404, 423,
+ 439,-32768, 486,-32768,-32768,-32768,-32768, 458,-32768, 115,
+ 116,-32768
+};
+
+static const short yypgoto[] =
+{
+ -32768, 0,-32768, 24,-32768,-32768
+};
+
+
+#define YYLAST 564
+
+
+static const short yytable[] =
+{
+ 18, 22, 20, 21, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 23, 33, 44, 45,
+ 46, 47, 24, 49, 50, 51, 52, 53, 55, 56,
+ 57, 58, 59, 60, 67, 68, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, 78, 79, 80, 25, 65,
+ 26, 34, 27, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 34, 28, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 29, 96, 97, 98, 30, 99, 66, 31, 100,
+ 101, 102, 103, 85, 86, 105, 93, 94, 48, 87,
+ 88, 47, 109, 110, 89, 1, 90, 115, 116, 91,
+ 117, 92, 118, 119, 120, 130, 131, 2, 104, 0,
+ 0, 0, 127, 3, 4, 32, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 2, 16, 0,
+ 0, 0, 17, 3, 4, 0, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 0, 16, 0,
+ 0, 34, 17, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 34, 0, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 0, 0, 0, 0, 0, 0, 111, 112,-32768,
+ -32768, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 0, 34, 82, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 34, 0, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
+ 46, 47, 0, 0, 0, 0, 0, 0, 34, 83,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 34, 84, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 0, 0,
+ 0, 0, 0, 0, 34, 107, 35, 36, 37, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 34,
+ 108, 35, 36, 37, 38, 39, 40, 41, 42, 43,
+ 44, 45, 46, 47, 0, 0, 0, 0, 0, 0,
+ 34, 113, 35, 36, 37, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47, 34, 114, 35, 36, 37,
+ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 0, 0, 0, 0, 0, 0, 34, 122, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 81, 34, 0, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 0, 0, 0,
+ 0, 34, 106, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 0, 34, 121, 35,
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
+ 46, 47, 0, 0, 0, 0, 34, 123, 35, 36,
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+ 47, 0, 34, 124, 35, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 0, 0, 0,
+ 0, 34, 125, 35, 36, 37, 38, 39, 40, 41,
+ 42, 43, 44, 45, 46, 47, 0, 2, 126, 0,
+ 0, 0, 0, 3, 4, 61, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 128, 16, 2,
+ 0, 0, 17, 0, 0, 3, 4, 0, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 0,
+ 16, 0, 0, 0, 17, 34, 95, 35, 36, 37,
+ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 34, 0, 35, 36, 37, 38, 39, 40, 41, 42,
+ 43, 44, 45, 46, 47,-32768,-32768,-32768,-32768, 42,
+ 43, 44, 45, 46, 47
+};
+
+static const short yycheck[] =
+{
+ 0, 38, 2, 3, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 38, 17, 14, 15,
+ 16, 17, 38, 23, 24, 25, 26, 27, 21, 22,
+ 21, 22, 21, 22, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 38, 1,
+ 38, 3, 38, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 3, 38, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 38, 82, 83, 84, 38, 86, 39, 38, 89,
+ 90, 91, 92, 39, 40, 95, 39, 40, 39, 39,
+ 39, 17, 39, 40, 40, 1, 40, 107, 108, 40,
+ 110, 40, 112, 113, 114, 0, 0, 13, 94, -1,
+ -1, -1, 122, 19, 20, 1, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 13, 34, -1,
+ -1, -1, 38, 19, 20, -1, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, -1, 34, -1,
+ -1, 3, 38, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, 3, -1, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, -1, -1, -1, -1, -1, -1, 39, 40, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, -1, 3, 40, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 3, -1, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, -1, -1, -1, -1, -1, -1, 3, 40,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 3, 40, 5, 6, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, -1, -1,
+ -1, -1, -1, -1, 3, 40, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 16, 17, 3,
+ 40, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, -1, -1, -1, -1, -1, -1,
+ 3, 40, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 3, 40, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ -1, -1, -1, -1, -1, -1, 3, 40, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, 39, 3, -1, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, -1, -1, -1,
+ -1, 3, 39, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, -1, 3, 39, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, -1, -1, -1, -1, 3, 39, 5, 6,
+ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 17, -1, 3, 39, 5, 6, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, -1, -1, -1,
+ -1, 3, 39, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15, 16, 17, -1, 13, 39, -1,
+ -1, -1, -1, 19, 20, 21, 22, 23, 24, 25,
+ 26, 27, 28, 29, 30, 31, 32, 39, 34, 13,
+ -1, -1, 38, -1, -1, 19, 20, -1, 22, 23,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, -1,
+ 34, -1, -1, -1, 38, 3, 4, 5, 6, 7,
+ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
+ 3, -1, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17
+};
+/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
+#line 3 "/usr/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+ Copyright (C) 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* As a special exception, when this file is copied by Bison into a
+ Bison output file, you may use that output file without restriction.
+ This special exception was added by the Free Software Foundation
+ in version 1.24 of Bison. */
+
+/* This is the parser code that is written into each bison parser when
+ the %semantic_parser declaration is not specified in the grammar.
+ It was written by Richard Stallman by simplifying the hairy parser
+ used when %semantic_parser is specified. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+#ifdef __cplusplus
+# define YYSTD(x) std::x
+#else
+# define YYSTD(x) x
+#endif
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# if YYSTACK_USE_ALLOCA
+# define YYSTACK_ALLOC alloca
+# define YYSIZE_T YYSTD (size_t)
+# else
+# ifndef YYSTACK_USE_ALLOCA
+# if defined (alloca) || defined (_ALLOCA_H)
+# define YYSTACK_ALLOC alloca
+# define YYSIZE_T YYSTD (size_t)
+# else
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's `empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+# ifdef __cplusplus
+# include <cstdlib> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T std::size_t
+# else
+# ifdef __STDC__
+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# endif
+# define YYSTACK_ALLOC YYSTD (malloc)
+# define YYSTACK_FREE YYSTD (free)
+# endif
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ short yyss;
+ YYSTYPE yyvs;
+# if YYLSP_NEEDED
+ YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# if YYLSP_NEEDED
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+ + 2 * YYSTACK_GAP_MAX)
+# else
+# define YYSTACK_BYTES(N) \
+ ((N) * (sizeof (short) + sizeof (YYSTYPE)) \
+ + YYSTACK_GAP_MAX)
+# endif
+
+/* Relocate the TYPE STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Type, Stack) \
+ do \
+ { \
+ YYSIZE_T yynewbytes; \
+ yymemcpy ((char *) yyptr, (char *) (Stack), \
+ yysize * (YYSIZE_T) sizeof (Type)); \
+ Stack = &yyptr->Stack; \
+ yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX; \
+ yyptr += yynewbytes / sizeof (*yyptr); \
+ } \
+ while (0)
+
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# ifdef __cplusplus
+# include <cstddef> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T std::size_t
+# else
+# ifdef __STDC__
+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# endif
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+#define YYEMPTY -2
+#define YYEOF 0
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrlab1
+/* Like YYERROR except do call yyerror. This remains here temporarily
+ to ease the transition to the new meaning of YYERROR, for GCC.
+ Once GCC version 2 has supplanted version 1, this can go. */
+#define YYFAIL goto yyerrlab
+#define YYRECOVERING() (!!yyerrstatus)
+#define YYBACKUP(Token, Value) \
+do \
+ if (yychar == YYEMPTY && yylen == 1) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ yychar1 = YYTRANSLATE (yychar); \
+ YYPOPSTACK; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror ("syntax error: cannot back up"); \
+ YYERROR; \
+ } \
+while (0)
+
+#define YYTERROR 1
+#define YYERRCODE 256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+ are run).
+
+ When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+ first token. By default, to implement support for ranges, extend
+ its range to the last symbol. */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N) \
+ Current.last_line = Rhs[N].last_line; \
+ Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments. */
+
+#if YYPURE
+# if YYLSP_NEEDED
+# ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM)
+# else
+# define YYLEX yylex (&yylval, &yylloc)
+# endif
+# else /* !YYLSP_NEEDED */
+# ifdef YYLEX_PARAM
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
+# else
+# define YYLEX yylex (&yylval)
+# endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# ifdef __cplusplus
+# include <cstdio> /* INFRINGES ON USER NAME SPACE */
+# else
+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYFPRINTF YYSTD (fprintf)
+# endif
+
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
+/* Nonzero means print parse trace. [The following comment makes no
+ sense to me. Could someone clarify it? --akim] Since this is
+ uninitialized, it does not stop multiple parsers from coexisting.
+ */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+#if ! defined (yyoverflow) && ! defined (yymemcpy)
+# if __GNUC__ > 1 /* GNU C and GNU C++ define this. */
+# define yymemcpy __builtin_memcpy
+# else /* not GNU C or C++ */
+
+/* This is the most reliable way to avoid incompatibilities
+ in available built-in functions on various systems. */
+static void
+# if defined (__STDC__) || defined (__cplusplus)
+yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T yycount)
+# else
+yymemcpy (yyto, yyfrom, yycount)
+ char *yyto;
+ const char *yyfrom;
+ YYSIZE_T yycount;
+# endif
+{
+ register const char *yyf = yyfrom;
+ register char *yyt = yyto;
+ register YYSIZE_T yyi = yycount;
+
+ while (yyi-- != 0)
+ *yyt++ = *yyf++;
+}
+# endif
+#endif
+
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+# if defined (__GLIBC__) && defined (_STRING_H)
+# define yystrlen strlen
+# else
+/* Return the length of YYSTR. */
+static YYSIZE_T
+# if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+# else
+yystrlen (yystr)
+ const char *yystr;
+# endif
+{
+ register const char *yys = yystr;
+
+ while (*yys++ != '\0')
+ continue;
+
+ return yys - yystr - 1;
+}
+# endif
+# endif
+
+# ifndef yystpcpy
+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+# define yystpcpy stpcpy
+# else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+ YYDEST. */
+static char *
+# if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+# else
+yystpcpy (yydest, yysrc)
+ char *yydest;
+ const char *yysrc;
+# endif
+{
+ register char *yyd = yydest;
+ register const char *yys = yysrc;
+
+ while ((*yyd++ = *yys++) != '\0')
+ continue;
+
+ return yyd - 1;
+}
+# endif
+# endif
+#endif
+
+#line 341 "/usr/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+ into yyparse. The argument should have type void *.
+ It should actually point to an object.
+ Grammar actions can access the variable by casting it
+ to the proper pointer type. */
+
+#ifdef YYPARSE_PARAM
+# ifdef __cplusplus
+# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+# define YYPARSE_PARAM_DECL
+# else /* !__cplusplus */
+# define YYPARSE_PARAM_ARG YYPARSE_PARAM
+# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif /* !__cplusplus */
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes. */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+ variables are global, or local to YYPARSE. */
+
+#define YY_DECL_NON_LSP_VARIABLES \
+/* The lookahead symbol. */ \
+int yychar; \
+ \
+/* The semantic value of the lookahead symbol. */ \
+YYSTYPE yylval; \
+ \
+/* Number of parse errors so far. */ \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES \
+YY_DECL_NON_LSP_VARIABLES \
+ \
+/* Location data for the lookahead symbol. */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+ YYPARSE_PARAM_DECL
+{
+ /* If reentrant, generate the variables here. */
+#if YYPURE
+ YY_DECL_VARIABLES
+#endif /* !YYPURE */
+
+ register int yystate;
+ register int yyn;
+ int yyresult;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus;
+ /* Lookahead token as an internal (translated) token number. */
+ int yychar1 = 0;
+
+ /* Three stacks and their tools:
+ `yyss': related to states,
+ `yyvs': related to semantic values,
+ `yyls': related to locations.
+
+ Refer to the stacks thru separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* The state stack. */
+ short yyssa[YYINITDEPTH];
+ short *yyss = yyssa;
+ register short *yyssp;
+
+ /* The semantic value stack. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+ /* The location stack. */
+ YYLTYPE yylsa[YYINITDEPTH];
+ YYLTYPE *yyls = yylsa;
+ YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK (yyvsp--, yyssp--)
+#endif
+
+ YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+#if YYLSP_NEEDED
+ YYLTYPE yyloc;
+#endif
+
+ /* When reducing, the number of symbols on the RHS of the reduced
+ rule. */
+ int yylen;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yystate = 0;
+ yyerrstatus = 0;
+ yynerrs = 0;
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ /* Initialize stack pointers.
+ Waste one element of value and location stack
+ so that they stay on the same level as the state stack.
+ The wasted elements are never initialized. */
+
+ yyssp = yyss;
+ yyvsp = yyvs;
+#if YYLSP_NEEDED
+ yylsp = yyls;
+#endif
+ goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
+ yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. so pushing a state here evens the stacks.
+ */
+ yyssp++;
+
+ yysetstate:
+ *yyssp = yystate;
+
+ if (yyssp >= yyss + yystacksize - 1)
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ YYSTYPE *yyvs1 = yyvs;
+ short *yyss1 = yyss;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. */
+# if YYLSP_NEEDED
+ YYLTYPE *yyls1 = yyls;
+ /* This used to be a conditional around just the two extra args,
+ but that might be undefined if yyoverflow is a macro. */
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yyls1, yysize * sizeof (*yylsp),
+ &yystacksize);
+ yyls = yyls1;
+# else
+ yyoverflow ("parser stack overflow",
+ &yyss1, yysize * sizeof (*yyssp),
+ &yyvs1, yysize * sizeof (*yyvsp),
+ &yystacksize);
+# endif
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+#else /* no yyoverflow */
+ /* Extend the stack our own way. */
+ if (yystacksize >= YYMAXDEPTH)
+ goto yyoverflowlab;
+ yystacksize *= 2;
+ if (yystacksize > YYMAXDEPTH)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ short *yyss1 = yyss;
+ union yyalloc *yyptr =
+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+ if (! yyptr)
+ goto yyoverflowlab;
+ YYSTACK_RELOCATE (short, yyss);
+ YYSTACK_RELOCATE (YYSTYPE, yyvs);
+# if YYLSP_NEEDED
+ YYSTACK_RELOCATE (YYLTYPE, yyls);
+# endif
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+#endif /* no yyoverflow */
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+ yylsp = yyls + yysize - 1;
+#endif
+
+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+ (unsigned long int) yystacksize));
+
+ if (yyssp >= yyss + yystacksize - 1)
+ YYABORT;
+ }
+
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+ goto yybackup;
+
+
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state. */
+/* Read a lookahead token if we need one and don't already have one. */
+/* yyresume: */
+
+ /* First try to decide what to do without reference to lookahead token. */
+
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yydefault;
+
+ /* Not known => get a lookahead token if don't already have one. */
+
+ /* yychar is either YYEMPTY or YYEOF
+ or a valid token in external form. */
+
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token: "));
+ yychar = YYLEX;
+ }
+
+ /* Convert token to internal form (in yychar1) for indexing tables with */
+
+ if (yychar <= 0) /* This means end of input. */
+ {
+ yychar1 = 0;
+ yychar = YYEOF; /* Don't call YYLEX any more */
+
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else
+ {
+ yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+ /* We have to keep this `#if YYDEBUG', since we use variables
+ which are defined only if `YYDEBUG' is set. */
+ if (yydebug)
+ {
+ YYFPRINTF (stderr, "Next token is %d (%s",
+ yychar, yytname[yychar1]);
+ /* Give the individual parser a way to print the precise
+ meaning of a token, for further debugging info. */
+# ifdef YYPRINT
+ YYPRINT (stderr, yychar, yylval);
+# endif
+ YYFPRINTF (stderr, ")\n");
+ }
+#endif
+ }
+
+ yyn += yychar1;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+ goto yydefault;
+
+ yyn = yytable[yyn];
+
+ /* yyn is what to do for this token type in this state.
+ Negative => reduce, -yyn is rule number.
+ Positive => shift, yyn is new state.
+ New state is final state => don't bother to shift,
+ just return success.
+ 0, or most negative number => error. */
+
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrlab;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ /* Shift the lookahead token. */
+ YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+ yychar, yytname[yychar1]));
+
+ /* Discard the token being shifted unless it is eof. */
+ if (yychar != YYEOF)
+ yychar = YYEMPTY;
+
+ *++yyvsp = yylval;
+#if YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction. |
+`-----------------------------*/
+yyreduce:
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
+
+ /* If YYLEN is nonzero, implement the default value of the action:
+ `$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to the semantic value of
+ the lookahead token. This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+ /* Similarly for the default location. Let the user run additional
+ commands if for instance locations are ranges. */
+ yyloc = yylsp[1-yylen];
+ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+ /* We have to keep this `#if YYDEBUG', since we use variables which
+ are defined only if `YYDEBUG' is set. */
+ if (yydebug)
+ {
+ int yyi;
+
+ YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+ yyn, yyrline[yyn]);
+
+ /* Print the symbols being reduced, and their result. */
+ for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+ YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+ }
+#endif
+
+ switch (yyn) {
+
+case 1:
+#line 87 "parse.y"
+{ parse_return=yyvsp[0]; }
+ break;
+case 2:
+#line 88 "parse.y"
+{
+ if(!parse_error)
+ parse_error=PARSE_ERR;
+ parse_return=0; }
+ break;
+case 5:
+#line 96 "parse.y"
+{
+ yyval=yyvsp[-2]; }
+ break;
+case 6:
+#line 98 "parse.y"
+{
+ (yyvsp[-3])->n_x.v_subs[0]=yyvsp[-1];
+ (yyvsp[-3])->n_x.v_subs[1]=(struct node *)0;
+ yyval=yyvsp[-3]; }
+ break;
+case 7:
+#line 102 "parse.y"
+{
+ (yyvsp[-5])->n_x.v_subs[0]=yyvsp[-3];
+ (yyvsp[-5])->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-5]; }
+ break;
+case 8:
+#line 106 "parse.y"
+{
+ (yyvsp[-7])->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+ (yyvsp[-7])->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-7];}
+ break;
+case 9:
+#line 110 "parse.y"
+{
+ (yyvsp[-9])->n_x.v_subs[0]=make_list(yyvsp[-7],yyvsp[-5]);
+ (yyvsp[-9])->n_x.v_subs[1]=make_list(yyvsp[-3],yyvsp[-1]);
+ yyval=yyvsp[-9];}
+ break;
+case 10:
+#line 114 "parse.y"
+{
+ (yyvsp[-3])->n_x.v_subs[0]=(struct node *)0;
+ (yyvsp[-3])->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-3]; }
+ break;
+case 11:
+#line 118 "parse.y"
+{
+ yyvsp[-3]->n_x.v_subs[0]=yyvsp[-1];
+ yyval=yyvsp[-3]; }
+ break;
+case 12:
+#line 121 "parse.y"
+{
+ yyvsp[-3]->n_x.v_subs[0]=yyvsp[-1];
+ yyval=yyvsp[-3]; }
+ break;
+case 13:
+#line 125 "parse.y"
+{
+ yyvsp[-5]->n_x.v_subs[0]=yyvsp[-3];
+ yyvsp[-5]->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-5]; }
+ break;
+case 14:
+#line 129 "parse.y"
+{
+ yyvsp[-5]->n_x.v_subs[0]=yyvsp[-3];
+ yyvsp[-5]->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-5]; }
+ break;
+case 15:
+#line 135 "parse.y"
+{
+ if(yyvsp[-7]->comp_value!=F_INDEX)
+ parse_error=PARSE_ERR;
+ yyvsp[-7]->comp_value=F_INDEX2;
+ yyvsp[-7]->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+ yyvsp[-7]->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-7]; }
+ break;
+case 16:
+#line 142 "parse.y"
+{
+ if(yyvsp[-7]->comp_value!=F_INDEX)
+ parse_error=PARSE_ERR;
+ yyvsp[-7]->comp_value=F_INDEX2;
+ yyvsp[-7]->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+ yyvsp[-7]->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-7]; }
+ break;
+case 17:
+#line 150 "parse.y"
+{
+ (yyvsp[-7])->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+ (yyvsp[-7])->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-7];}
+ break;
+case 18:
+#line 154 "parse.y"
+{
+ (yyvsp[-7])->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+ (yyvsp[-7])->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-7];}
+ break;
+case 19:
+#line 159 "parse.y"
+{
+ (yyvsp[-3])->n_x.v_subs[0]=(struct node *)0;
+ (yyvsp[-3])->n_x.v_subs[1]=yyvsp[-1];
+ yyval=yyvsp[-3]; }
+ break;
+case 20:
+#line 163 "parse.y"
+{
+ yyvsp[-3]->comp_value=IF;
+ yyvsp[-3]->n_x.v_subs[0]=yyvsp[-1];
+ yyvsp[-3]->n_x.v_subs[1]=yyvsp[0];
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-4];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[-2];
+ yyval=yyvsp[-3]; }
+ break;
+case 21:
+#line 174 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 22:
+#line 178 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 23:
+#line 182 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 24:
+#line 186 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 25:
+#line 190 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 26:
+#line 194 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 27:
+#line 198 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 28:
+#line 202 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 29:
+#line 206 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 30:
+#line 210 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 31:
+#line 214 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 32:
+#line 218 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 33:
+#line 222 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+ yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+ yyval = yyvsp[-1]; }
+ break;
+case 34:
+#line 226 "parse.y"
+{
+ if(yyvsp[0]->comp_value==CONST_FLT) {
+ yyvsp[0]->n_x.v_float= -(yyvsp[0]->n_x.v_float);
+ /* free($1); */
+ yyval=yyvsp[0];
+ } else if(yyvsp[0]->comp_value==CONST_INT) {
+ yyvsp[0]->n_x.v_int= -(yyvsp[0]->n_x.v_int);
+ /* free($1); */
+ yyval=yyvsp[0];
+ } else {
+ yyvsp[-1]->comp_value = NEGATE;
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[0];
+ yyvsp[-1]->n_x.v_subs[1]=(struct node *)0;
+ yyval = yyvsp[-1];
+ } }
+ break;
+case 35:
+#line 241 "parse.y"
+{
+ yyvsp[-1]->n_x.v_subs[0]=yyvsp[0];
+ yyvsp[-1]->n_x.v_subs[1]=(struct node *)0;
+ yyval = yyvsp[-1]; }
+ break;
+case 36:
+#line 246 "parse.y"
+{ yyval = yyvsp[-1]; }
+ break;
+case 37:
+#line 247 "parse.y"
+{
+ if(!parse_error)
+ parse_error=NO_CLOSE;
+ }
+ break;
+case 38:
+#line 255 "parse.y"
+{
+ if(!parse_error)
+ parse_error=NO_CLOSE;
+ }
+ break;
+case 39:
+#line 263 "parse.y"
+{ yyval = make_list(yyvsp[0], 0); }
+ break;
+case 40:
+#line 265 "parse.y"
+{ yyval = make_list(yyvsp[0], yyvsp[-2]); }
+ break;
+case 43:
+#line 273 "parse.y"
+{ yyval=make_list(yyvsp[0], 0); }
+ break;
+case 44:
+#line 275 "parse.y"
+{ yyval=make_list(yyvsp[0],yyvsp[-2]); }
+ break;
+case 45:
+#line 279 "parse.y"
+{ yyval=yyvsp[0]; }
+ break;
+}
+
+#line 727 "/usr/share/bison/bison.simple"
+
+
+ yyvsp -= yylen;
+ yyssp -= yylen;
+#if YYLSP_NEEDED
+ yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+ if (yydebug)
+ {
+ short *yyssp1 = yyss - 1;
+ YYFPRINTF (stderr, "state stack now");
+ while (yyssp1 != yyssp)
+ YYFPRINTF (stderr, " %d", *++yyssp1);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+ *++yyvsp = yyval;
+#if YYLSP_NEEDED
+ *++yylsp = yyloc;
+#endif
+
+ /* Now `shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+
+ yyn = yyr1[yyn];
+
+ yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+ if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+ yystate = yytable[yystate];
+ else
+ yystate = yydefgoto[yyn - YYNTBASE];
+
+ goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+ yyn = yypact[yystate];
+
+ if (yyn > YYFLAG && yyn < YYLAST)
+ {
+ YYSIZE_T yysize = 0;
+ char *yymsg;
+ int yyx, yycount;
+
+ yycount = 0;
+ /* Start YYX at -YYN if negative to avoid negative indexes in
+ YYCHECK. */
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+ if (yycheck[yyx + yyn] == yyx)
+ yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+ yysize += yystrlen ("parse error, unexpected ") + 1;
+ yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+ yymsg = (char *) YYSTACK_ALLOC (yysize);
+ if (yymsg != 0)
+ {
+ char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+ yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+ if (yycount < 5)
+ {
+ yycount = 0;
+ for (yyx = yyn < 0 ? -yyn : 0;
+ yyx < (int) (sizeof (yytname) / sizeof (char *));
+ yyx++)
+ if (yycheck[yyx + yyn] == yyx)
+ {
+ const char *yyq = ! yycount ? ", expecting " : " or ";
+ yyp = yystpcpy (yyp, yyq);
+ yyp = yystpcpy (yyp, yytname[yyx]);
+ yycount++;
+ }
+ }
+ yyerror (yymsg);
+ YYSTACK_FREE (yymsg);
+ }
+ else
+ yyerror ("parse error; also virtual memory exhausted");
+ }
+ else
+#endif /* defined (YYERROR_VERBOSE) */
+ yyerror ("parse error");
+ }
+ goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ /* return failure if at end of input */
+ if (yychar == YYEOF)
+ YYABORT;
+ YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+ yychar, yytname[yychar1]));
+ yychar = YYEMPTY;
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+
+ yyerrstatus = 3; /* Each real token shifted decrements this */
+
+ goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token. |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+ /* This is wrong; only states that explicitly want error tokens
+ should shift them. */
+
+ /* If its default is to accept any token, ok. Otherwise pop it. */
+ yyn = yydefact[yystate];
+ if (yyn)
+ goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token |
+`---------------------------------------------------------------*/
+yyerrpop:
+ if (yyssp == yyss)
+ YYABORT;
+ yyvsp--;
+ yystate = *--yyssp;
+#if YYLSP_NEEDED
+ yylsp--;
+#endif
+
+#if YYDEBUG
+ if (yydebug)
+ {
+ short *yyssp1 = yyss - 1;
+ YYFPRINTF (stderr, "Error: state stack now");
+ while (yyssp1 != yyssp)
+ YYFPRINTF (stderr, " %d", *++yyssp1);
+ YYFPRINTF (stderr, "\n");
+ }
+#endif
+
+/*--------------.
+| yyerrhandle. |
+`--------------*/
+yyerrhandle:
+ yyn = yypact[yystate];
+ if (yyn == YYFLAG)
+ goto yyerrdefault;
+
+ yyn += YYTERROR;
+ if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+ goto yyerrdefault;
+
+ yyn = yytable[yyn];
+ if (yyn < 0)
+ {
+ if (yyn == YYFLAG)
+ goto yyerrpop;
+ yyn = -yyn;
+ goto yyreduce;
+ }
+ else if (yyn == 0)
+ goto yyerrpop;
+
+ if (yyn == YYFINAL)
+ YYACCEPT;
+
+ YYDPRINTF ((stderr, "Shifting error token, "));
+
+ *++yyvsp = yylval;
+#if YYLSP_NEEDED
+ *++yylsp = yylloc;
+#endif
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here. |
+`---------------------------------------------*/
+yyoverflowlab:
+ yyerror ("parser stack overflow");
+ yyresult = 2;
+ /* Fall through. */
+
+yyreturn:
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
+#endif
+ return yyresult;
+}
+#line 282 "parse.y"
+
+
+void
+yyerror FUN1(char *, s)
+{
+ if(!parse_error)
+ parse_error=PARSE_ERR;
+}
+
+YYSTYPE
+make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)
+{
+ YYSTYPE ret;
+
+ ret=(YYSTYPE)obstack_alloc(&tmp_mem,sizeof(*ret));
+ ret->comp_value = 0;
+ ret->n_x.v_subs[0]=car;
+ ret->n_x.v_subs[1]=cdr;
+ return ret;
+}
+
+#define ERROR -1
+
+extern struct node *yylval;
+
+#ifdef __STDC__
+unsigned char parse_cell_or_range (char **,struct rng *);
+#else
+unsigned char parse_cell_or_range ();
+#endif
+
+int
+yylex FUN0()
+{
+ int ch;
+ struct node *new;
+ int isflt;
+ char *begin;
+ char *tmp_str;
+ unsigned char byte_value;
+ int n;
+
+ /* unsigned char *ptr; */
+ int nn;
+ struct function *fp;
+ int tmp_ch;
+
+#ifdef TEST
+ if(!instr)
+ return ERROR;
+#endif
+ while(isspace(*instr))
+ instr++;
+ ch = *instr++;
+ if(ch=='(' || ch==',' || ch==')')
+ return ch;
+
+ new=(struct node *)obstack_alloc(&tmp_mem,sizeof(struct node));
+ new->add_byte=0;
+ new->sub_value=0;
+ switch(ch) {
+ case 0:
+ return 0;
+
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': case '8': case '9': case '.':
+ isflt = (ch=='.');
+
+ begin=instr-1;
+ tmp_str=instr;
+
+ while(isdigit(*tmp_str) || (!isflt && *tmp_str=='.' && ++isflt))
+ tmp_str++;
+ if(*tmp_str=='e' || *tmp_str=='E') {
+ isflt=1;
+ tmp_str++;
+ if(*tmp_str=='-' || *tmp_str=='+')
+ tmp_str++;
+ while(isdigit(*tmp_str))
+ tmp_str++;
+ }
+ if(isflt) {
+ new->n_x.v_float=astof((char **)(&begin));
+ byte_value=CONST_FLT;
+ } else {
+ new->n_x.v_int=astol((char **)(&begin));
+ if(begin!=tmp_str) {
+ begin=instr-1;
+ new->n_x.v_float=astof((char **)(&begin));
+ byte_value=CONST_FLT;
+ } else
+ byte_value=CONST_INT;
+ }
+ ch=L_CONST;
+ instr=begin;
+ break;
+
+ case '"':
+ begin=instr;
+ while(*instr && *instr!='"') {
+ if(*instr=='\\' && instr[1])
+ instr++;
+ instr++;
+ }
+ if(!*instr) {
+ parse_error=NO_QUOTE;
+ return ERROR;
+ }
+ tmp_str=new->n_x.v_string=(char *)ck_malloc(1+instr-begin);
+ while(begin!=instr) {
+ unsigned char n;
+
+ if(*begin=='\\') {
+ begin++;
+ if(begin[0]>='0' && begin[0]<='7') {
+ if(begin[1]>='0' && begin[1]<='7') {
+ if(begin[2]>='0' && begin[2]<='7') {
+ n=(begin[2]-'0') + (010 * (begin[1]-'0')) + ( 0100 * (begin[0]-'0'));
+ begin+=3;
+ } else {
+ n=(begin[1]-'0') + (010 * (begin[0]-'0'));
+ begin+=2;
+ }
+ } else {
+ n=begin[0]-'0';
+ begin++;
+ }
+ } else
+ n= *begin++;
+ *tmp_str++= n;
+ } else
+ *tmp_str++= *begin++;
+ }
+ *tmp_str='\0';
+ instr++;
+ byte_value=CONST_STR;
+ ch=L_CONST;
+ break;
+
+ case '+': case '-':
+
+ case '*': case '/': case '%': case '&':
+ /* case '|': */ case '^': case '=':
+
+ case '?':
+ {
+ unsigned char *ptr;
+
+ for(ptr= fnin;*ptr;ptr++)
+ if(the_funs[*ptr].fn_str[0]==ch)
+ break;
+#ifdef TEST
+ if(!*ptr)
+ panic("Can't find fnin[] entry for '%c'",ch);
+#endif
+ byte_value= *ptr;
+ }
+ break;
+
+ case ':':
+ byte_value=IF;
+ break;
+
+ case '!':
+ case '<':
+ case '>':
+ if(*instr!='=') {
+ byte_value = (ch=='<') ? LESS : (ch=='>') ? GREATER : NOT;
+ break;
+ }
+ instr++;
+ byte_value = (ch=='<') ? LESSEQ : (ch=='>') ? GREATEQ : NOTEQUAL;
+ ch = (ch=='<') ? LE : (ch=='>') ? GE : NE;
+ break;
+
+ case '\'':
+ case ';':
+ case '[':
+ case '\\':
+ case ']':
+ case '`':
+ case '{':
+ case '}':
+ case '~':
+ bad_chr:
+ parse_error=BAD_CHAR;
+ return ERROR;
+
+ case '#':
+ begin=instr-1;
+ while(*instr && (isalnum(*instr) || *instr=='_'))
+ instr++;
+ ch= *instr;
+ *instr=0;
+ if(!stricmp(begin,tname))
+ byte_value=F_TRUE;
+ else if(!stricmp(begin,fname))
+ byte_value=F_FALSE;
+ else if(!stricmp(begin,iname) && (begin[4]==0 || !stricmp(begin+4,"inity")))
+ byte_value=CONST_INF;
+ else if(!stricmp(begin,mname) ||
+ !stricmp(begin,"#ninf"))
+ byte_value=CONST_NINF;
+ else if(!stricmp(begin,nname) ||
+ !stricmp(begin,"#nan"))
+ byte_value=CONST_NAN;
+ else {
+ for(n=1;n<=ERR_MAX;n++)
+ if(!stricmp(begin,ename[n]))
+ break;
+ if(n>ERR_MAX)
+ n=BAD_CHAR;
+ new->n_x.v_int=n;
+ byte_value=CONST_ERR;
+ }
+ *instr=ch;
+ ch=L_CONST;
+ break;
+
+ default:
+ if(!a0 && (ch=='@' || ch=='$'))
+ goto bad_chr;
+
+ if(a0 && ch=='@') {
+ begin=instr;
+ while(*instr && (isalpha(*instr) || isdigit(*instr) || *instr=='_'))
+ instr++;
+ n=instr-begin;
+ } else {
+ begin=instr-1;
+ byte_value=parse_cell_or_range(&begin,&(new->n_x.v_rng));
+ if(byte_value) {
+ if((byte_value& ~0x3)==R_CELL)
+ ch=L_CELL;
+ else
+ ch=L_RANGE;
+ instr=begin;
+ break;
+ }
+
+ while(*instr && (isalpha(*instr) || isdigit(*instr) || *instr=='_'))
+ instr++;
+
+ n=instr-begin;
+ while(isspace(*instr))
+ instr++;
+
+ if(*instr!='(') {
+ ch=L_VAR;
+ byte_value=VAR;
+ new->n_x.v_var=find_or_make_var(begin,n);
+ break;
+ }
+ }
+ tmp_ch=begin[n];
+ begin[n]='\0';
+ fp=hash_find(parse_hash,begin);
+ begin[n]=tmp_ch;
+ byte_value= ERROR;
+ if(!fp) {
+ parse_error=BAD_FUNC;
+ return ERROR;
+ }
+
+ if(fp>=the_funs && fp<=&the_funs[USR1])
+ byte_value=fp-the_funs;
+ else {
+ for(nn=0;nn<n_usr_funs;nn++) {
+ if(fp>=&usr_funs[nn][0] && fp<=&usr_funs[nn][usr_n_funs[nn]]) {
+ byte_value=USR1+nn;
+ new->sub_value=fp-&usr_funs[nn][0];
+ break;
+ }
+ }
+#ifdef TEST
+ if(nn==n_usr_funs) {
+ io_error_msg("Couln't turn fp into a ##");
+ parse_error=BAD_FUNC;
+ return ERROR;
+ }
+#endif
+ }
+
+ if(fp->fn_argn&X_J)
+ ch= byte_value==F_IF ? L_FN3 : L_FN2;
+ else if(fp->fn_argt[0]=='R' || fp->fn_argt[0]=='E')
+ ch=L_FN1R-1+fp->fn_argn-X_A0;
+ else
+ ch=L_FN0 + fp->fn_argn-X_A0;
+
+ break;
+ }
+ /* new->node_type=ch; */
+ new->comp_value=byte_value;
+ yylval=new;
+ return ch;
+}
+
+/* Return value is
+ 0 if it doesn't look like a cell or a range,
+ R_CELL if it is a cell (ptr now points past the characters, lr and lc hold the row and col of the cell)
+ RANGE if it is a range (ptr points past the chars)
+ */
+unsigned char
+parse_cell_or_range FUN2(char **,ptr, struct rng *,retp)
+{
+ if(a0) {
+ unsigned tmpc,tmpr;
+ char *p;
+ int abz = ROWREL|COLREL;
+
+ p= *ptr;
+ tmpc=0;
+ if(*p=='$') {
+ abz-=COLREL;
+ p++;
+ }
+ if(!isalpha(*p))
+ return 0;
+ tmpc=str_to_col(&p);
+ if(tmpc<MIN_COL || tmpc>MAX_COL)
+ return 0;
+ if(*p=='$') {
+ abz-=ROWREL;
+ p++;
+ }
+ if(!isdigit(*p))
+ return 0;
+ for(tmpr=0;isdigit(*p);p++)
+ tmpr=tmpr*10 + *p - '0';
+
+ if(tmpr<MIN_ROW || tmpr>MAX_ROW)
+ return 0;
+
+ if(*p==':' || *p=='.') {
+ unsigned tmpc1,tmpr1;
+
+ abz = ((abz&COLREL) ? LCREL : 0)|((abz&ROWREL) ? LRREL : 0)|HRREL|HCREL;
+ p++;
+ if(*p=='$') {
+ abz-=HCREL;
+ p++;
+ }
+ if(!isalpha(*p))
+ return 0;
+ tmpc1=str_to_col(&p);
+ if(tmpc1<MIN_COL || tmpc1>MAX_COL)
+ return 0;
+ if(*p=='$') {
+ abz-=HRREL;
+ p++;
+ }
+ if(!isdigit(*p))
+ return 0;
+ for(tmpr1=0;isdigit(*p);p++)
+ tmpr1=tmpr1*10 + *p - '0';
+ if(tmpr1<MIN_ROW || tmpr1>MAX_ROW)
+ return 0;
+
+ if(tmpr<tmpr1) {
+ retp->lr=tmpr;
+ retp->hr=tmpr1;
+ } else {
+ retp->lr=tmpr1;
+ retp->hr=tmpr;
+ }
+ if(tmpc<tmpc1) {
+ retp->lc=tmpc;
+ retp->hc=tmpc1;
+ } else {
+ retp->lc=tmpc1;
+ retp->hc=tmpc;
+ }
+ *ptr= p;
+ return RANGE | abz;
+ }
+ retp->lr = retp->hr = tmpr;
+ retp->lc = retp->hc = tmpc;
+ *ptr=p;
+ return R_CELL | abz;
+ } else {
+ char *p;
+ unsigned char retr;
+ unsigned char retc;
+ int ended;
+ long num;
+ CELLREF tmp;
+
+#define CK_ABS_R(x) if((x)<MIN_ROW || (x)>MAX_ROW) \
+ return 0; \
+ else
+
+#define CK_REL_R(x) if( ((x)>0 && MAX_ROW-(x)<cur_row) \
+ || ((x)<0 && MIN_ROW-(x)>cur_row)) \
+ return 0; \
+ else
+
+#define CK_ABS_C(x) if((x)<MIN_COL || (x)>MAX_COL) \
+ return 0; \
+ else
+
+#define CK_REL_C(x) if( ((x)>0 && MAX_COL-(x)<cur_col) \
+ || ((x)<0 && MIN_COL-(x)>cur_col)) \
+ return 0; \
+ else
+
+#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1]) || (((p)[1]=='+' || (p)[1]=='-') && isdigit((p)[2]))))
+
+ p= *ptr;
+ retr=0;
+ retc=0;
+ ended=0;
+ while(ended==0) {
+ switch(*p) {
+ case 'r':
+ case 'R':
+ if(retr) {
+ ended++;
+ break;
+ }
+ p++;
+ retr=R_CELL;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_R(num);
+ retp->lr= retp->hr=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_R(num);
+ retp->lr= retp->hr=num+cur_row;
+ retr|=ROWREL;
+ if(*p==':') {
+ retr=RANGE|LRREL|HRREL;
+ p++;
+ num=astol(&p);
+ CK_REL_R(num);
+ retp->hr=num+cur_row;
+ }
+ if(*p++!=']')
+ return 0;
+ } else if(retc || *p=='c' || *p=='C') {
+ retr|=ROWREL;
+ retp->lr= retp->hr=cur_row;
+ } else
+ return 0;
+ if(*p==':' && retr!=(RANGE|LRREL|HRREL)) {
+ retr= (retr&ROWREL) ? RANGE|LRREL : RANGE;
+ p++;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_R(num);
+ retp->hr=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_R(num);
+ retp->hr=num+cur_row;
+ retr|=HRREL;
+ if(*p++!=']')
+ return 0;
+ } else
+ return 0;
+ }
+
+ if(retc)
+ ended++;
+ break;
+
+ case 'c':
+ case 'C':
+ if(retc) {
+ ended++;
+ break;
+ }
+ p++;
+ retc=R_CELL;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_C(num);
+ retp->lc= retp->hc=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_C(num);
+ retp->lc= retp->hc=num+cur_col;
+ retc|=COLREL;
+ if(*p==':') {
+ retc=RANGE|LCREL|HCREL;
+ p++;
+ num=astol(&p);
+ CK_REL_C(num);
+ retp->hc=num+cur_col;
+ }
+ if(*p++!=']')
+ return 0;
+ } else if(retr || *p=='r' || *p=='R') {
+ retc|=COLREL;
+ retp->lc= retp->hc=cur_col;
+ } else
+ return 0;
+ if(*p==':' && retc!=(RANGE|LCREL|HCREL)) {
+ retc= (retc&COLREL) ? RANGE|LCREL : RANGE;
+ p++;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_C(num);
+ retp->hc=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_C(num);
+ retp->hc=num+cur_col;
+ retc|=HCREL;
+ if(*p++!=']')
+ return 0;
+ } else
+ return 0;
+ }
+
+ if(retr)
+ ended++;
+ break;
+ default:
+ if(retr) {
+ *ptr=p;
+ retp->lc=MIN_COL;
+ retp->hc=MAX_COL;
+ if((retr|ROWREL)==(R_CELL|ROWREL))
+ return (retr&ROWREL) ? (RANGE|LRREL|HRREL) : RANGE;
+ else
+ return retr;
+ } else if(retc) {
+ *ptr=p;
+ retp->lr=MIN_ROW;
+ retp->hr=MAX_COL;
+ if((retc|COLREL)==(R_CELL|COLREL))
+ return (retc&COLREL) ? (RANGE|LCREL|HCREL) : RANGE;
+ else
+ return retc;
+ }
+ return 0;
+ }
+ }
+ if(!retr || !retc)
+ return 0;
+ *ptr=p;
+ if(retp->lr>retp->hr)
+ tmp=retp->lr,retp->lr=retp->hr,retp->hr=tmp;
+ if(retp->lc>retp->hc)
+ tmp=retp->lc,retp->lc=retp->hc,retp->hc=tmp;
+
+ if((retr|ROWREL)==(R_CELL|ROWREL)) {
+ if((retc|COLREL)==(R_CELL|COLREL))
+ return retr|retc;
+ return (retr&ROWREL) ? (retc|LRREL|HRREL) : retc;
+ }
+ if((retc|COLREL)==(R_CELL|COLREL))
+ return (retc&COLREL) ? (retr|LCREL|HCREL) : retr;
+ return retr|retc;
+ }
+}
+
+int
+str_to_col FUN1(char **,str)
+{
+ int ret;
+ char c,cc,ccc;
+#if MAX_COL>702
+ char cccc;
+#endif
+
+ ret=0;
+ c=str[0][0];
+ if(!isalpha((cc=str[0][1]))) {
+ (*str)++;
+ return MIN_COL + (isupper(c) ? c-'A' : c-'a');
+ }
+ if(!isalpha((ccc=str[0][2]))) {
+ (*str)+=2;
+ return MIN_COL+26 + (isupper(c) ? c-'A' : c-'a')*26 + (isupper(cc) ? cc-'A' : cc-'a');
+ }
+#if MAX_COL>702
+ if(!isalpha((cccc=str[0][3]))) {
+ (*str)+=3;
+ return MIN_COL+702 + (isupper(c) ? c-'A' : c-'a')*26*26 + (isupper(cc) ? cc-'A' : cc-'a')*26 + (isupper(ccc) ? ccc-'A' : ccc-'a');
+ }
+ if(!isalpha(str[0][4])) {
+ (*str)+=4;
+ return MIN_COL+18278 + (isupper(c) ? c-'A' : c-'a')*26*26*26 + (isupper(cc) ? cc-'A' : cc-'a')*26*26 + (isupper(ccc) ? ccc-'A' : ccc-'a')*26 + (isupper(cccc) ? cccc-'A' : cccc-'a');
+ }
+#endif
+ return 0;
+}
diff --git a/test/etags/y-src/parse.y b/test/etags/y-src/parse.y
new file mode 100644
index 00000000000..75fd7870ff8
--- /dev/null
+++ b/test/etags/y-src/parse.y
@@ -0,0 +1,875 @@
+%{
+/* Copyright (C) 1990, 1992, 1993 Free Software Foundation, Inc.
+
+This file is part of Oleo, the GNU Spreadsheet.
+
+Oleo is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+Oleo is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Oleo; see the file COPYING. If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+%}
+
+
+%right '?' ':'
+/* %left '|' */
+%left '&'
+%nonassoc '=' NE
+%nonassoc '<' LE '>' GE
+%left '+' '-'
+%left '*' '/' '%'
+%right '^'
+%left NEG '!'
+
+%token L_CELL L_RANGE
+%token L_VAR
+
+%token L_CONST
+%token L_FN0 L_FN1 L_FN2 L_FN3 L_FN4 L_FNN
+%token L_FN1R L_FN2R L_FN3R L_FN4R L_FNNR
+
+%token L_LE L_NE L_GE
+
+%{
+#include "funcdef.h"
+
+#include <ctype.h>
+
+#define obstack_chunk_alloc ck_malloc
+#define obstack_chunk_free free
+#include "obstack.h"
+#include "sysdef.h"
+
+#include "global.h"
+#include "errors.h"
+#include "node.h"
+#include "eval.h"
+#include "ref.h"
+
+int yylex ();
+#ifdef __STDC__
+void yyerror (char *);
+#else
+void yyerror ();
+#endif
+VOIDSTAR parse_hash;
+extern VOIDSTAR hash_find();
+
+/* This table contains a list of the infix single-char functions */
+unsigned char fnin[] = {
+ SUM, DIFF, DIV, PROD, MOD, /* AND, OR, */ POW, EQUAL, IF, CONCAT, 0
+};
+
+#define YYSTYPE _y_y_s_t_y_p_e
+typedef struct node *YYSTYPE;
+YYSTYPE parse_return;
+#ifdef __STDC__
+YYSTYPE make_list (YYSTYPE, YYSTYPE);
+#else
+YYSTYPE make_list ();
+#endif
+
+char *instr;
+int parse_error = 0;
+extern struct obstack tmp_mem;
+
+%}
+%%
+line: exp
+ { parse_return=$1; }
+ | error {
+ if(!parse_error)
+ parse_error=PARSE_ERR;
+ parse_return=0; }
+ ;
+
+exp: L_CONST
+ | cell
+ | L_FN0 '(' ')' {
+ $$=$1; }
+ | L_FN1 '(' exp ')' {
+ ($1)->n_x.v_subs[0]=$3;
+ ($1)->n_x.v_subs[1]=(struct node *)0;
+ $$=$1; }
+ | L_FN2 '(' exp ',' exp ')' {
+ ($1)->n_x.v_subs[0]=$3;
+ ($1)->n_x.v_subs[1]=$5;
+ $$=$1; }
+ | L_FN3 '(' exp ',' exp ',' exp ')' {
+ ($1)->n_x.v_subs[0]=make_list($3,$5);
+ ($1)->n_x.v_subs[1]=$7;
+ $$=$1;}
+ | L_FN4 '(' exp ',' exp ',' exp ',' exp ')' {
+ ($1)->n_x.v_subs[0]=make_list($3,$5);
+ ($1)->n_x.v_subs[1]=make_list($7,$9);
+ $$=$1;}
+ | L_FNN '(' exp_list ')' {
+ ($1)->n_x.v_subs[0]=(struct node *)0;
+ ($1)->n_x.v_subs[1]=$3;
+ $$=$1; }
+ | L_FN1R '(' L_RANGE ')' {
+ $1->n_x.v_subs[0]=$3;
+ $$=$1; }
+ | L_FN1R '(' L_VAR ')' {
+ $1->n_x.v_subs[0]=$3;
+ $$=$1; }
+
+ | L_FN2R '(' L_RANGE ',' exp ')' {
+ $1->n_x.v_subs[0]=$3;
+ $1->n_x.v_subs[1]=$5;
+ $$=$1; }
+ | L_FN2R '(' L_VAR ',' exp ')' {
+ $1->n_x.v_subs[0]=$3;
+ $1->n_x.v_subs[1]=$5;
+ $$=$1; }
+
+ /* JF: These should be FN2R, but I'm hacking this for SYLNK */
+ | L_FN2R '(' L_RANGE ',' exp ',' exp ')' {
+ if($1->comp_value!=F_INDEX)
+ parse_error=PARSE_ERR;
+ $1->comp_value=F_INDEX2;
+ $1->n_x.v_subs[0]=make_list($3,$5);
+ $1->n_x.v_subs[1]=$7;
+ $$=$1; }
+ | L_FN2R '(' L_VAR ',' exp ',' exp ')' {
+ if($1->comp_value!=F_INDEX)
+ parse_error=PARSE_ERR;
+ $1->comp_value=F_INDEX2;
+ $1->n_x.v_subs[0]=make_list($3,$5);
+ $1->n_x.v_subs[1]=$7;
+ $$=$1; }
+
+ | L_FN3R '(' L_RANGE ',' exp ',' exp ')' {
+ ($1)->n_x.v_subs[0]=make_list($3,$5);
+ ($1)->n_x.v_subs[1]=$7;
+ $$=$1;}
+ | L_FN3R '(' L_VAR ',' exp ',' exp ')' {
+ ($1)->n_x.v_subs[0]=make_list($3,$5);
+ ($1)->n_x.v_subs[1]=$7;
+ $$=$1;}
+
+ | L_FNNR '(' range_exp_list ')' {
+ ($1)->n_x.v_subs[0]=(struct node *)0;
+ ($1)->n_x.v_subs[1]=$3;
+ $$=$1; }
+ | exp '?' exp ':' exp {
+ $2->comp_value=IF;
+ $2->n_x.v_subs[0]=$4;
+ $2->n_x.v_subs[1]=$5;
+ $4->n_x.v_subs[0]=$1;
+ $4->n_x.v_subs[1]=$3;
+ $$=$2; }
+ /* | exp '|' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; } */
+ | exp '&' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '<' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp LE exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '=' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp NE exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '>' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp GE exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '+' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '-' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '*' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '/' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '%' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | exp '^' exp {
+ $2->n_x.v_subs[0]=$1;
+ $2->n_x.v_subs[1]=$3;
+ $$ = $2; }
+ | '-' exp %prec NEG {
+ if($2->comp_value==CONST_FLT) {
+ $2->n_x.v_float= -($2->n_x.v_float);
+ /* free($1); */
+ $$=$2;
+ } else if($2->comp_value==CONST_INT) {
+ $2->n_x.v_int= -($2->n_x.v_int);
+ /* free($1); */
+ $$=$2;
+ } else {
+ $1->comp_value = NEGATE;
+ $1->n_x.v_subs[0]=$2;
+ $1->n_x.v_subs[1]=(struct node *)0;
+ $$ = $1;
+ } }
+ | '!' exp {
+ $1->n_x.v_subs[0]=$2;
+ $1->n_x.v_subs[1]=(struct node *)0;
+ $$ = $1; }
+ | '(' exp ')'
+ { $$ = $2; }
+ | '(' exp error {
+ if(!parse_error)
+ parse_error=NO_CLOSE;
+ }
+ /* | exp ')' error {
+ if(!parse_error)
+ parse_error=NO_OPEN;
+ } */
+ | '(' error {
+ if(!parse_error)
+ parse_error=NO_CLOSE;
+ }
+ ;
+
+
+exp_list: exp
+ { $$ = make_list($1, 0); }
+ | exp_list ',' exp
+ { $$ = make_list($3, $1); }
+ ;
+
+range_exp: L_RANGE
+ | exp
+ ;
+
+range_exp_list: range_exp
+ { $$=make_list($1, 0); }
+ | range_exp_list ',' range_exp
+ { $$=make_list($3,$1); }
+ ;
+
+cell: L_CELL
+ { $$=$1; }
+ | L_VAR
+ ;
+%%
+
+void
+yyerror FUN1(char *, s)
+{
+ if(!parse_error)
+ parse_error=PARSE_ERR;
+}
+
+YYSTYPE
+make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)
+{
+ YYSTYPE ret;
+
+ ret=(YYSTYPE)obstack_alloc(&tmp_mem,sizeof(*ret));
+ ret->comp_value = 0;
+ ret->n_x.v_subs[0]=car;
+ ret->n_x.v_subs[1]=cdr;
+ return ret;
+}
+
+#define ERROR -1
+
+extern struct node *yylval;
+
+#ifdef __STDC__
+unsigned char parse_cell_or_range (char **,struct rng *);
+#else
+unsigned char parse_cell_or_range ();
+#endif
+
+int
+yylex FUN0()
+{
+ int ch;
+ struct node *new;
+ int isflt;
+ char *begin;
+ char *tmp_str;
+ unsigned char byte_value;
+ int n;
+
+ /* unsigned char *ptr; */
+ int nn;
+ struct function *fp;
+ int tmp_ch;
+
+#ifdef TEST
+ if(!instr)
+ return ERROR;
+#endif
+ while(isspace(*instr))
+ instr++;
+ ch = *instr++;
+ if(ch=='(' || ch==',' || ch==')')
+ return ch;
+
+ new=(struct node *)obstack_alloc(&tmp_mem,sizeof(struct node));
+ new->add_byte=0;
+ new->sub_value=0;
+ switch(ch) {
+ case 0:
+ return 0;
+
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': case '8': case '9': case '.':
+ isflt = (ch=='.');
+
+ begin=instr-1;
+ tmp_str=instr;
+
+ while(isdigit(*tmp_str) || (!isflt && *tmp_str=='.' && ++isflt))
+ tmp_str++;
+ if(*tmp_str=='e' || *tmp_str=='E') {
+ isflt=1;
+ tmp_str++;
+ if(*tmp_str=='-' || *tmp_str=='+')
+ tmp_str++;
+ while(isdigit(*tmp_str))
+ tmp_str++;
+ }
+ if(isflt) {
+ new->n_x.v_float=astof((char **)(&begin));
+ byte_value=CONST_FLT;
+ } else {
+ new->n_x.v_int=astol((char **)(&begin));
+ if(begin!=tmp_str) {
+ begin=instr-1;
+ new->n_x.v_float=astof((char **)(&begin));
+ byte_value=CONST_FLT;
+ } else
+ byte_value=CONST_INT;
+ }
+ ch=L_CONST;
+ instr=begin;
+ break;
+
+ case '"':
+ begin=instr;
+ while(*instr && *instr!='"') {
+ if(*instr=='\\' && instr[1])
+ instr++;
+ instr++;
+ }
+ if(!*instr) {
+ parse_error=NO_QUOTE;
+ return ERROR;
+ }
+ tmp_str=new->n_x.v_string=(char *)ck_malloc(1+instr-begin);
+ while(begin!=instr) {
+ unsigned char n;
+
+ if(*begin=='\\') {
+ begin++;
+ if(begin[0]>='0' && begin[0]<='7') {
+ if(begin[1]>='0' && begin[1]<='7') {
+ if(begin[2]>='0' && begin[2]<='7') {
+ n=(begin[2]-'0') + (010 * (begin[1]-'0')) + ( 0100 * (begin[0]-'0'));
+ begin+=3;
+ } else {
+ n=(begin[1]-'0') + (010 * (begin[0]-'0'));
+ begin+=2;
+ }
+ } else {
+ n=begin[0]-'0';
+ begin++;
+ }
+ } else
+ n= *begin++;
+ *tmp_str++= n;
+ } else
+ *tmp_str++= *begin++;
+ }
+ *tmp_str='\0';
+ instr++;
+ byte_value=CONST_STR;
+ ch=L_CONST;
+ break;
+
+ case '+': case '-':
+
+ case '*': case '/': case '%': case '&':
+ /* case '|': */ case '^': case '=':
+
+ case '?':
+ {
+ unsigned char *ptr;
+
+ for(ptr= fnin;*ptr;ptr++)
+ if(the_funs[*ptr].fn_str[0]==ch)
+ break;
+#ifdef TEST
+ if(!*ptr)
+ panic("Can't find fnin[] entry for '%c'",ch);
+#endif
+ byte_value= *ptr;
+ }
+ break;
+
+ case ':':
+ byte_value=IF;
+ break;
+
+ case '!':
+ case '<':
+ case '>':
+ if(*instr!='=') {
+ byte_value = (ch=='<') ? LESS : (ch=='>') ? GREATER : NOT;
+ break;
+ }
+ instr++;
+ byte_value = (ch=='<') ? LESSEQ : (ch=='>') ? GREATEQ : NOTEQUAL;
+ ch = (ch=='<') ? LE : (ch=='>') ? GE : NE;
+ break;
+
+ case '\'':
+ case ';':
+ case '[':
+ case '\\':
+ case ']':
+ case '`':
+ case '{':
+ case '}':
+ case '~':
+ bad_chr:
+ parse_error=BAD_CHAR;
+ return ERROR;
+
+ case '#':
+ begin=instr-1;
+ while(*instr && (isalnum(*instr) || *instr=='_'))
+ instr++;
+ ch= *instr;
+ *instr=0;
+ if(!stricmp(begin,tname))
+ byte_value=F_TRUE;
+ else if(!stricmp(begin,fname))
+ byte_value=F_FALSE;
+ else if(!stricmp(begin,iname) && (begin[4]==0 || !stricmp(begin+4,"inity")))
+ byte_value=CONST_INF;
+ else if(!stricmp(begin,mname) ||
+ !stricmp(begin,"#ninf"))
+ byte_value=CONST_NINF;
+ else if(!stricmp(begin,nname) ||
+ !stricmp(begin,"#nan"))
+ byte_value=CONST_NAN;
+ else {
+ for(n=1;n<=ERR_MAX;n++)
+ if(!stricmp(begin,ename[n]))
+ break;
+ if(n>ERR_MAX)
+ n=BAD_CHAR;
+ new->n_x.v_int=n;
+ byte_value=CONST_ERR;
+ }
+ *instr=ch;
+ ch=L_CONST;
+ break;
+
+ default:
+ if(!a0 && (ch=='@' || ch=='$'))
+ goto bad_chr;
+
+ if(a0 && ch=='@') {
+ begin=instr;
+ while(*instr && (isalpha(*instr) || isdigit(*instr) || *instr=='_'))
+ instr++;
+ n=instr-begin;
+ } else {
+ begin=instr-1;
+ byte_value=parse_cell_or_range(&begin,&(new->n_x.v_rng));
+ if(byte_value) {
+ if((byte_value& ~0x3)==R_CELL)
+ ch=L_CELL;
+ else
+ ch=L_RANGE;
+ instr=begin;
+ break;
+ }
+
+ while(*instr && (isalpha(*instr) || isdigit(*instr) || *instr=='_'))
+ instr++;
+
+ n=instr-begin;
+ while(isspace(*instr))
+ instr++;
+
+ if(*instr!='(') {
+ ch=L_VAR;
+ byte_value=VAR;
+ new->n_x.v_var=find_or_make_var(begin,n);
+ break;
+ }
+ }
+ tmp_ch=begin[n];
+ begin[n]='\0';
+ fp=hash_find(parse_hash,begin);
+ begin[n]=tmp_ch;
+ byte_value= ERROR;
+ if(!fp) {
+ parse_error=BAD_FUNC;
+ return ERROR;
+ }
+
+ if(fp>=the_funs && fp<=&the_funs[USR1])
+ byte_value=fp-the_funs;
+ else {
+ for(nn=0;nn<n_usr_funs;nn++) {
+ if(fp>=&usr_funs[nn][0] && fp<=&usr_funs[nn][usr_n_funs[nn]]) {
+ byte_value=USR1+nn;
+ new->sub_value=fp-&usr_funs[nn][0];
+ break;
+ }
+ }
+#ifdef TEST
+ if(nn==n_usr_funs) {
+ io_error_msg("Couln't turn fp into a ##");
+ parse_error=BAD_FUNC;
+ return ERROR;
+ }
+#endif
+ }
+
+ if(fp->fn_argn&X_J)
+ ch= byte_value==F_IF ? L_FN3 : L_FN2;
+ else if(fp->fn_argt[0]=='R' || fp->fn_argt[0]=='E')
+ ch=L_FN1R-1+fp->fn_argn-X_A0;
+ else
+ ch=L_FN0 + fp->fn_argn-X_A0;
+
+ break;
+ }
+ /* new->node_type=ch; */
+ new->comp_value=byte_value;
+ yylval=new;
+ return ch;
+}
+
+/* Return value is
+ 0 if it doesn't look like a cell or a range,
+ R_CELL if it is a cell (ptr now points past the characters, lr and lc hold the row and col of the cell)
+ RANGE if it is a range (ptr points past the chars)
+ */
+unsigned char
+parse_cell_or_range FUN2(char **,ptr, struct rng *,retp)
+{
+ if(a0) {
+ unsigned tmpc,tmpr;
+ char *p;
+ int abz = ROWREL|COLREL;
+
+ p= *ptr;
+ tmpc=0;
+ if(*p=='$') {
+ abz-=COLREL;
+ p++;
+ }
+ if(!isalpha(*p))
+ return 0;
+ tmpc=str_to_col(&p);
+ if(tmpc<MIN_COL || tmpc>MAX_COL)
+ return 0;
+ if(*p=='$') {
+ abz-=ROWREL;
+ p++;
+ }
+ if(!isdigit(*p))
+ return 0;
+ for(tmpr=0;isdigit(*p);p++)
+ tmpr=tmpr*10 + *p - '0';
+
+ if(tmpr<MIN_ROW || tmpr>MAX_ROW)
+ return 0;
+
+ if(*p==':' || *p=='.') {
+ unsigned tmpc1,tmpr1;
+
+ abz = ((abz&COLREL) ? LCREL : 0)|((abz&ROWREL) ? LRREL : 0)|HRREL|HCREL;
+ p++;
+ if(*p=='$') {
+ abz-=HCREL;
+ p++;
+ }
+ if(!isalpha(*p))
+ return 0;
+ tmpc1=str_to_col(&p);
+ if(tmpc1<MIN_COL || tmpc1>MAX_COL)
+ return 0;
+ if(*p=='$') {
+ abz-=HRREL;
+ p++;
+ }
+ if(!isdigit(*p))
+ return 0;
+ for(tmpr1=0;isdigit(*p);p++)
+ tmpr1=tmpr1*10 + *p - '0';
+ if(tmpr1<MIN_ROW || tmpr1>MAX_ROW)
+ return 0;
+
+ if(tmpr<tmpr1) {
+ retp->lr=tmpr;
+ retp->hr=tmpr1;
+ } else {
+ retp->lr=tmpr1;
+ retp->hr=tmpr;
+ }
+ if(tmpc<tmpc1) {
+ retp->lc=tmpc;
+ retp->hc=tmpc1;
+ } else {
+ retp->lc=tmpc1;
+ retp->hc=tmpc;
+ }
+ *ptr= p;
+ return RANGE | abz;
+ }
+ retp->lr = retp->hr = tmpr;
+ retp->lc = retp->hc = tmpc;
+ *ptr=p;
+ return R_CELL | abz;
+ } else {
+ char *p;
+ unsigned char retr;
+ unsigned char retc;
+ int ended;
+ long num;
+ CELLREF tmp;
+
+#define CK_ABS_R(x) if((x)<MIN_ROW || (x)>MAX_ROW) \
+ return 0; \
+ else
+
+#define CK_REL_R(x) if( ((x)>0 && MAX_ROW-(x)<cur_row) \
+ || ((x)<0 && MIN_ROW-(x)>cur_row)) \
+ return 0; \
+ else
+
+#define CK_ABS_C(x) if((x)<MIN_COL || (x)>MAX_COL) \
+ return 0; \
+ else
+
+#define CK_REL_C(x) if( ((x)>0 && MAX_COL-(x)<cur_col) \
+ || ((x)<0 && MIN_COL-(x)>cur_col)) \
+ return 0; \
+ else
+
+#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1]) || (((p)[1]=='+' || (p)[1]=='-') && isdigit((p)[2]))))
+
+ p= *ptr;
+ retr=0;
+ retc=0;
+ ended=0;
+ while(ended==0) {
+ switch(*p) {
+ case 'r':
+ case 'R':
+ if(retr) {
+ ended++;
+ break;
+ }
+ p++;
+ retr=R_CELL;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_R(num);
+ retp->lr= retp->hr=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_R(num);
+ retp->lr= retp->hr=num+cur_row;
+ retr|=ROWREL;
+ if(*p==':') {
+ retr=RANGE|LRREL|HRREL;
+ p++;
+ num=astol(&p);
+ CK_REL_R(num);
+ retp->hr=num+cur_row;
+ }
+ if(*p++!=']')
+ return 0;
+ } else if(retc || *p=='c' || *p=='C') {
+ retr|=ROWREL;
+ retp->lr= retp->hr=cur_row;
+ } else
+ return 0;
+ if(*p==':' && retr!=(RANGE|LRREL|HRREL)) {
+ retr= (retr&ROWREL) ? RANGE|LRREL : RANGE;
+ p++;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_R(num);
+ retp->hr=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_R(num);
+ retp->hr=num+cur_row;
+ retr|=HRREL;
+ if(*p++!=']')
+ return 0;
+ } else
+ return 0;
+ }
+
+ if(retc)
+ ended++;
+ break;
+
+ case 'c':
+ case 'C':
+ if(retc) {
+ ended++;
+ break;
+ }
+ p++;
+ retc=R_CELL;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_C(num);
+ retp->lc= retp->hc=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_C(num);
+ retp->lc= retp->hc=num+cur_col;
+ retc|=COLREL;
+ if(*p==':') {
+ retc=RANGE|LCREL|HCREL;
+ p++;
+ num=astol(&p);
+ CK_REL_C(num);
+ retp->hc=num+cur_col;
+ }
+ if(*p++!=']')
+ return 0;
+ } else if(retr || *p=='r' || *p=='R') {
+ retc|=COLREL;
+ retp->lc= retp->hc=cur_col;
+ } else
+ return 0;
+ if(*p==':' && retc!=(RANGE|LCREL|HCREL)) {
+ retc= (retc&COLREL) ? RANGE|LCREL : RANGE;
+ p++;
+ if(isdigit(*p)) {
+ num=astol(&p);
+ CK_ABS_C(num);
+ retp->hc=num;
+ } else if(MAYBEREL(p)) {
+ p++;
+ num=astol(&p);
+ CK_REL_C(num);
+ retp->hc=num+cur_col;
+ retc|=HCREL;
+ if(*p++!=']')
+ return 0;
+ } else
+ return 0;
+ }
+
+ if(retr)
+ ended++;
+ break;
+ default:
+ if(retr) {
+ *ptr=p;
+ retp->lc=MIN_COL;
+ retp->hc=MAX_COL;
+ if((retr|ROWREL)==(R_CELL|ROWREL))
+ return (retr&ROWREL) ? (RANGE|LRREL|HRREL) : RANGE;
+ else
+ return retr;
+ } else if(retc) {
+ *ptr=p;
+ retp->lr=MIN_ROW;
+ retp->hr=MAX_COL;
+ if((retc|COLREL)==(R_CELL|COLREL))
+ return (retc&COLREL) ? (RANGE|LCREL|HCREL) : RANGE;
+ else
+ return retc;
+ }
+ return 0;
+ }
+ }
+ if(!retr || !retc)
+ return 0;
+ *ptr=p;
+ if(retp->lr>retp->hr)
+ tmp=retp->lr,retp->lr=retp->hr,retp->hr=tmp;
+ if(retp->lc>retp->hc)
+ tmp=retp->lc,retp->lc=retp->hc,retp->hc=tmp;
+
+ if((retr|ROWREL)==(R_CELL|ROWREL)) {
+ if((retc|COLREL)==(R_CELL|COLREL))
+ return retr|retc;
+ return (retr&ROWREL) ? (retc|LRREL|HRREL) : retc;
+ }
+ if((retc|COLREL)==(R_CELL|COLREL))
+ return (retc&COLREL) ? (retr|LCREL|HCREL) : retr;
+ return retr|retc;
+ }
+}
+
+int
+str_to_col FUN1(char **,str)
+{
+ int ret;
+ char c,cc,ccc;
+#if MAX_COL>702
+ char cccc;
+#endif
+
+ ret=0;
+ c=str[0][0];
+ if(!isalpha((cc=str[0][1]))) {
+ (*str)++;
+ return MIN_COL + (isupper(c) ? c-'A' : c-'a');
+ }
+ if(!isalpha((ccc=str[0][2]))) {
+ (*str)+=2;
+ return MIN_COL+26 + (isupper(c) ? c-'A' : c-'a')*26 + (isupper(cc) ? cc-'A' : cc-'a');
+ }
+#if MAX_COL>702
+ if(!isalpha((cccc=str[0][3]))) {
+ (*str)+=3;
+ return MIN_COL+702 + (isupper(c) ? c-'A' : c-'a')*26*26 + (isupper(cc) ? cc-'A' : cc-'a')*26 + (isupper(ccc) ? ccc-'A' : ccc-'a');
+ }
+ if(!isalpha(str[0][4])) {
+ (*str)+=4;
+ return MIN_COL+18278 + (isupper(c) ? c-'A' : c-'a')*26*26*26 + (isupper(cc) ? cc-'A' : cc-'a')*26*26 + (isupper(ccc) ? ccc-'A' : ccc-'a')*26 + (isupper(cccc) ? cccc-'A' : cccc-'a');
+ }
+#endif
+ return 0;
+}