]> code.delx.au - gnu-emacs/commitdiff
Merge from emacs--devo--0
authorMiles Bader <miles@gnu.org>
Thu, 6 Dec 2007 09:51:45 +0000 (09:51 +0000)
committerMiles Bader <miles@gnu.org>
Thu, 6 Dec 2007 09:51:45 +0000 (09:51 +0000)
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-294

639 files changed:
ChangeLog
Makefile.in
admin/ChangeLog
admin/FOR-RELEASE
admin/admin.el
configure
configure.in
doc/emacs/ChangeLog
doc/emacs/calendar.texi
doc/emacs/custom.texi
doc/emacs/files.texi
doc/emacs/frames.texi
doc/emacs/help.texi
doc/emacs/maintaining.texi
doc/emacs/major.texi
doc/emacs/mule.texi
doc/lispref/ChangeLog
doc/lispref/advice.texi
doc/lispref/compile.texi
doc/lispref/customize.texi
doc/lispref/display.texi
doc/lispref/functions.texi
doc/lispref/help.texi
doc/lispref/hooks.texi
doc/lispref/loading.texi
doc/lispref/macros.texi
doc/lispref/objects.texi
doc/lispref/variables.texi
doc/lispref/vol1.texi
doc/lispref/vol2.texi
doc/man/ChangeLog
doc/man/etags.1
doc/misc/ChangeLog
doc/misc/Makefile.in
doc/misc/calc.texi
doc/misc/cc-mode.texi
doc/misc/cl.texi
doc/misc/dbus.texi [new file with mode: 0644]
doc/misc/emacs-mime.texi
doc/misc/flymake.texi
doc/misc/gnus.texi
doc/misc/makefile.w32-in
doc/misc/nxml-mode.texi [new file with mode: 0644]
doc/misc/remember.texi
doc/misc/tramp.texi
etc/ChangeLog
etc/GNUS-NEWS
etc/NEWS
etc/NEWS.22
etc/NXML-NEWS [new file with mode: 0644]
etc/PROBLEMS
etc/TODO
etc/compilation.txt
etc/images/gnus/README
etc/images/gnus/mail-send.xpm [moved from etc/images/gnus/mail_send.xpm with 100% similarity]
etc/images/icons/README
etc/images/icons/macemacs_16.png [new file with mode: 0644]
etc/images/icons/macemacs_24.png [new file with mode: 0644]
etc/images/icons/macemacs_256.png [new file with mode: 0644]
etc/images/icons/macemacs_32.png [new file with mode: 0644]
etc/images/icons/macemacs_48.png [new file with mode: 0644]
etc/images/icons/macemacs_512.png [new file with mode: 0644]
etc/images/smilies/grayscale/README [new file with mode: 0644]
etc/images/smilies/medium/README [new file with mode: 0644]
etc/nxml/00000-0007F.el [new file with mode: 0644]
etc/nxml/00080-000FF.el [new file with mode: 0644]
etc/nxml/00100-0017F.el [new file with mode: 0644]
etc/nxml/00180-0024F.el [new file with mode: 0644]
etc/nxml/00250-002AF.el [new file with mode: 0644]
etc/nxml/002B0-002FF.el [new file with mode: 0644]
etc/nxml/00300-0036F.el [new file with mode: 0644]
etc/nxml/00370-003FF.el [new file with mode: 0644]
etc/nxml/00400-004FF.el [new file with mode: 0644]
etc/nxml/00500-0052F.el [new file with mode: 0644]
etc/nxml/00530-0058F.el [new file with mode: 0644]
etc/nxml/00590-005FF.el [new file with mode: 0644]
etc/nxml/00600-006FF.el [new file with mode: 0644]
etc/nxml/00700-0074F.el [new file with mode: 0644]
etc/nxml/00780-007BF.el [new file with mode: 0644]
etc/nxml/00900-0097F.el [new file with mode: 0644]
etc/nxml/00980-009FF.el [new file with mode: 0644]
etc/nxml/00A00-00A7F.el [new file with mode: 0644]
etc/nxml/00A80-00AFF.el [new file with mode: 0644]
etc/nxml/00B00-00B7F.el [new file with mode: 0644]
etc/nxml/00B80-00BFF.el [new file with mode: 0644]
etc/nxml/00C00-00C7F.el [new file with mode: 0644]
etc/nxml/00C80-00CFF.el [new file with mode: 0644]
etc/nxml/00D00-00D7F.el [new file with mode: 0644]
etc/nxml/00D80-00DFF.el [new file with mode: 0644]
etc/nxml/00E00-00E7F.el [new file with mode: 0644]
etc/nxml/00E80-00EFF.el [new file with mode: 0644]
etc/nxml/00F00-00FFF.el [new file with mode: 0644]
etc/nxml/01000-0109F.el [new file with mode: 0644]
etc/nxml/010A0-010FF.el [new file with mode: 0644]
etc/nxml/01100-011FF.el [new file with mode: 0644]
etc/nxml/01200-0137F.el [new file with mode: 0644]
etc/nxml/013A0-013FF.el [new file with mode: 0644]
etc/nxml/01400-0167F.el [new file with mode: 0644]
etc/nxml/01680-0169F.el [new file with mode: 0644]
etc/nxml/016A0-016FF.el [new file with mode: 0644]
etc/nxml/01700-0171F.el [new file with mode: 0644]
etc/nxml/01720-0173F.el [new file with mode: 0644]
etc/nxml/01740-0175F.el [new file with mode: 0644]
etc/nxml/01760-0177F.el [new file with mode: 0644]
etc/nxml/01780-017FF.el [new file with mode: 0644]
etc/nxml/01800-018AF.el [new file with mode: 0644]
etc/nxml/01E00-01EFF.el [new file with mode: 0644]
etc/nxml/01F00-01FFF.el [new file with mode: 0644]
etc/nxml/02000-0206F.el [new file with mode: 0644]
etc/nxml/02070-0209F.el [new file with mode: 0644]
etc/nxml/020A0-020CF.el [new file with mode: 0644]
etc/nxml/020D0-020FF.el [new file with mode: 0644]
etc/nxml/02100-0214F.el [new file with mode: 0644]
etc/nxml/02150-0218F.el [new file with mode: 0644]
etc/nxml/02190-021FF.el [new file with mode: 0644]
etc/nxml/02200-022FF.el [new file with mode: 0644]
etc/nxml/02300-023FF.el [new file with mode: 0644]
etc/nxml/02400-0243F.el [new file with mode: 0644]
etc/nxml/02440-0245F.el [new file with mode: 0644]
etc/nxml/02460-024FF.el [new file with mode: 0644]
etc/nxml/02500-0257F.el [new file with mode: 0644]
etc/nxml/02580-0259F.el [new file with mode: 0644]
etc/nxml/025A0-025FF.el [new file with mode: 0644]
etc/nxml/02600-026FF.el [new file with mode: 0644]
etc/nxml/02700-027BF.el [new file with mode: 0644]
etc/nxml/027C0-027EF.el [new file with mode: 0644]
etc/nxml/027F0-027FF.el [new file with mode: 0644]
etc/nxml/02800-028FF.el [new file with mode: 0644]
etc/nxml/02900-0297F.el [new file with mode: 0644]
etc/nxml/02980-029FF.el [new file with mode: 0644]
etc/nxml/02A00-02AFF.el [new file with mode: 0644]
etc/nxml/02E80-02EFF.el [new file with mode: 0644]
etc/nxml/02F00-02FDF.el [new file with mode: 0644]
etc/nxml/02FF0-02FFF.el [new file with mode: 0644]
etc/nxml/03000-0303F.el [new file with mode: 0644]
etc/nxml/03040-0309F.el [new file with mode: 0644]
etc/nxml/030A0-030FF.el [new file with mode: 0644]
etc/nxml/03100-0312F.el [new file with mode: 0644]
etc/nxml/03130-0318F.el [new file with mode: 0644]
etc/nxml/03190-0319F.el [new file with mode: 0644]
etc/nxml/031A0-031BF.el [new file with mode: 0644]
etc/nxml/031F0-031FF.el [new file with mode: 0644]
etc/nxml/03200-032FF.el [new file with mode: 0644]
etc/nxml/03300-033FF.el [new file with mode: 0644]
etc/nxml/03400-04DBF.el [new file with mode: 0644]
etc/nxml/0A000-0A48F.el [new file with mode: 0644]
etc/nxml/0A490-0A4CF.el [new file with mode: 0644]
etc/nxml/0FB00-0FB4F.el [new file with mode: 0644]
etc/nxml/0FB50-0FDFF.el [new file with mode: 0644]
etc/nxml/0FE00-0FE0F.el [new file with mode: 0644]
etc/nxml/0FE20-0FE2F.el [new file with mode: 0644]
etc/nxml/0FE30-0FE4F.el [new file with mode: 0644]
etc/nxml/0FE50-0FE6F.el [new file with mode: 0644]
etc/nxml/0FE70-0FEFF.el [new file with mode: 0644]
etc/nxml/0FF00-0FFEF.el [new file with mode: 0644]
etc/nxml/0FFF0-0FFFF.el [new file with mode: 0644]
etc/nxml/10300-1032F.el [new file with mode: 0644]
etc/nxml/10330-1034F.el [new file with mode: 0644]
etc/nxml/10400-1044F.el [new file with mode: 0644]
etc/nxml/1D000-1D0FF.el [new file with mode: 0644]
etc/nxml/1D100-1D1FF.el [new file with mode: 0644]
etc/nxml/1D400-1D7FF.el [new file with mode: 0644]
etc/nxml/E0000-E007F.el [new file with mode: 0644]
etc/nxml/README [new file with mode: 0644]
etc/schema/calstbl.rnc [new file with mode: 0644]
etc/schema/dbcalstbl.rnc [new file with mode: 0644]
etc/schema/dbdyntbl.rnc [new file with mode: 0644]
etc/schema/dbhier.rnc [new file with mode: 0644]
etc/schema/dbnotn.rnc [new file with mode: 0644]
etc/schema/dbpool.rnc [new file with mode: 0644]
etc/schema/dbsoextbl.rnc [new file with mode: 0644]
etc/schema/dbstart.rnc [new file with mode: 0644]
etc/schema/docbook-dyntbl.rnc [new file with mode: 0644]
etc/schema/docbook-soextbl.rnc [new file with mode: 0644]
etc/schema/docbook.rnc [new file with mode: 0644]
etc/schema/locate.rnc [new file with mode: 0644]
etc/schema/rdfxml.rnc [new file with mode: 0644]
etc/schema/relaxng.rnc [new file with mode: 0644]
etc/schema/schemas.xml [new file with mode: 0644]
etc/schema/soextbl.rnc [new file with mode: 0644]
etc/schema/xhtml-applet.rnc [new file with mode: 0644]
etc/schema/xhtml-attribs.rnc [new file with mode: 0644]
etc/schema/xhtml-base.rnc [new file with mode: 0644]
etc/schema/xhtml-basic-form.rnc [new file with mode: 0644]
etc/schema/xhtml-basic-table.rnc [new file with mode: 0644]
etc/schema/xhtml-bdo.rnc [new file with mode: 0644]
etc/schema/xhtml-csismap.rnc [new file with mode: 0644]
etc/schema/xhtml-datatypes.rnc [new file with mode: 0644]
etc/schema/xhtml-edit.rnc [new file with mode: 0644]
etc/schema/xhtml-events.rnc [new file with mode: 0644]
etc/schema/xhtml-form.rnc [new file with mode: 0644]
etc/schema/xhtml-frames.rnc [new file with mode: 0644]
etc/schema/xhtml-hypertext.rnc [new file with mode: 0644]
etc/schema/xhtml-iframe.rnc [new file with mode: 0644]
etc/schema/xhtml-image.rnc [new file with mode: 0644]
etc/schema/xhtml-inlstyle.rnc [new file with mode: 0644]
etc/schema/xhtml-legacy.rnc [new file with mode: 0644]
etc/schema/xhtml-link.rnc [new file with mode: 0644]
etc/schema/xhtml-list.rnc [new file with mode: 0644]
etc/schema/xhtml-meta.rnc [new file with mode: 0644]
etc/schema/xhtml-nameident.rnc [new file with mode: 0644]
etc/schema/xhtml-object.rnc [new file with mode: 0644]
etc/schema/xhtml-param.rnc [new file with mode: 0644]
etc/schema/xhtml-pres.rnc [new file with mode: 0644]
etc/schema/xhtml-ruby.rnc [new file with mode: 0644]
etc/schema/xhtml-script.rnc [new file with mode: 0644]
etc/schema/xhtml-ssismap.rnc [new file with mode: 0644]
etc/schema/xhtml-struct.rnc [new file with mode: 0644]
etc/schema/xhtml-style.rnc [new file with mode: 0644]
etc/schema/xhtml-table.rnc [new file with mode: 0644]
etc/schema/xhtml-target.rnc [new file with mode: 0644]
etc/schema/xhtml-text.rnc [new file with mode: 0644]
etc/schema/xhtml.rnc [new file with mode: 0644]
etc/schema/xslt.rnc [new file with mode: 0644]
leim/ChangeLog
leim/Makefile.in
lib-src/ChangeLog
lib-src/etags.c
lib-src/makefile.w32-in
lib-src/pop.c
lisp/ChangeLog
lisp/ChangeLog.12
lisp/ChangeLog.unicode
lisp/Makefile.in
lisp/abbrev.el
lisp/add-log.el
lisp/arc-mode.el
lisp/bindings.el
lisp/calc/README
lisp/calc/calc-aent.el
lisp/calc/calc-ext.el
lisp/calc/calc-forms.el
lisp/calc/calc-help.el
lisp/calc/calc-lang.el
lisp/calc/calc-macs.el
lisp/calc/calc-menu.el [new file with mode: 0644]
lisp/calc/calc-misc.el
lisp/calc/calc-mode.el
lisp/calc/calc-nlfit.el
lisp/calc/calc-prog.el
lisp/calc/calc-vec.el
lisp/calc/calc.el
lisp/calc/calcalg3.el
lisp/calc/calccomp.el
lisp/calendar/appt.el
lisp/calendar/cal-bahai.el
lisp/calendar/cal-hebrew.el
lisp/calendar/cal-islam.el
lisp/calendar/cal-menu.el
lisp/calendar/cal-x.el
lisp/calendar/calendar.el
lisp/calendar/holidays.el
lisp/calendar/time-date.el
lisp/calendar/todo-mode.el
lisp/complete.el
lisp/cus-edit.el
lisp/desktop.el
lisp/dired-aux.el
lisp/dired-x.el
lisp/dired.el
lisp/doc-view.el
lisp/dos-fns.el
lisp/dos-w32.el
lisp/ediff-diff.el
lisp/ediff-help.el
lisp/ediff-init.el
lisp/ediff-merg.el
lisp/ediff-mult.el
lisp/ediff-ptch.el
lisp/ediff-util.el
lisp/ediff-vers.el
lisp/ediff-wind.el
lisp/ediff.el
lisp/emacs-lisp/authors.el
lisp/emacs-lisp/backquote.el
lisp/emacs-lisp/byte-opt.el
lisp/emacs-lisp/bytecomp.el
lisp/emacs-lisp/check-declare.el [new file with mode: 0644]
lisp/emacs-lisp/easymenu.el
lisp/emacs-lisp/find-func.el
lisp/emacs-lisp/gulp.el
lisp/emacs-lisp/lisp.el
lisp/emacs-lisp/ring.el
lisp/emacs-lisp/tcover-ses.el
lisp/emacs-lisp/tcover-unsafep.el
lisp/emacs-lisp/timer.el
lisp/emulation/cua-base.el
lisp/emulation/cua-gmrk.el
lisp/emulation/cua-rect.el
lisp/emulation/edt-vt100.el
lisp/emulation/edt.el
lisp/emulation/pc-select.el
lisp/emulation/tpu-edt.el
lisp/emulation/vi.el
lisp/emulation/viper-cmd.el
lisp/emulation/viper-ex.el
lisp/emulation/viper-init.el
lisp/emulation/viper-keym.el
lisp/emulation/viper-macs.el
lisp/emulation/viper-mous.el
lisp/emulation/viper-util.el
lisp/emulation/viper.el
lisp/erc/ChangeLog
lisp/erc/erc-autoaway.el
lisp/erc/erc-backend.el
lisp/erc/erc-log.el
lisp/erc/erc-match.el
lisp/erc/erc-netsplit.el
lisp/erc/erc-notify.el
lisp/erc/erc-track.el
lisp/erc/erc.el
lisp/eshell/em-alias.el
lisp/eshell/em-banner.el
lisp/eshell/em-basic.el
lisp/eshell/em-cmpl.el
lisp/eshell/em-dirs.el
lisp/eshell/em-glob.el
lisp/eshell/em-hist.el
lisp/eshell/em-ls.el
lisp/eshell/em-pred.el
lisp/eshell/em-prompt.el
lisp/eshell/em-rebind.el
lisp/eshell/em-script.el
lisp/eshell/em-smart.el
lisp/eshell/em-term.el
lisp/eshell/em-unix.el
lisp/eshell/em-xtra.el
lisp/eshell/esh-arg.el
lisp/eshell/esh-cmd.el
lisp/eshell/esh-ext.el
lisp/eshell/esh-io.el
lisp/eshell/esh-maint.el
lisp/eshell/esh-mode.el
lisp/eshell/esh-module.el
lisp/eshell/esh-opt.el
lisp/eshell/esh-proc.el
lisp/eshell/esh-test.el
lisp/eshell/esh-util.el
lisp/eshell/esh-var.el
lisp/eshell/eshell.el
lisp/ffap.el
lisp/filecache.el
lisp/files.el
lisp/font-lock.el
lisp/format-spec.el [moved from lisp/gnus/format-spec.el with 100% similarity]
lisp/frame.el
lisp/generic-x.el
lisp/gnus/ChangeLog
lisp/gnus/assistant.el [deleted file]
lisp/gnus/canlock.el
lisp/gnus/ecomplete.el
lisp/gnus/encrypt.el [deleted file]
lisp/gnus/flow-fill.el
lisp/gnus/gnus-agent.el
lisp/gnus/gnus-art.el
lisp/gnus/gnus-bookmark.el
lisp/gnus/gnus-cache.el
lisp/gnus/gnus-cite.el
lisp/gnus/gnus-cus.el
lisp/gnus/gnus-demon.el
lisp/gnus/gnus-dired.el
lisp/gnus/gnus-ems.el
lisp/gnus/gnus-fun.el
lisp/gnus/gnus-group.el
lisp/gnus/gnus-int.el
lisp/gnus/gnus-kill.el
lisp/gnus/gnus-mh.el
lisp/gnus/gnus-move.el
lisp/gnus/gnus-msg.el
lisp/gnus/gnus-registry.el
lisp/gnus/gnus-srvr.el
lisp/gnus/gnus-start.el
lisp/gnus/gnus-sum.el
lisp/gnus/gnus-util.el
lisp/gnus/gnus-uu.el
lisp/gnus/gnus.el
lisp/gnus/mail-source.el
lisp/gnus/mailcap.el
lisp/gnus/message.el
lisp/gnus/mm-bodies.el
lisp/gnus/mm-decode.el
lisp/gnus/mm-util.el
lisp/gnus/mm-uu.el
lisp/gnus/mm-view.el
lisp/gnus/mml-sec.el
lisp/gnus/mml-smime.el
lisp/gnus/mml.el
lisp/gnus/mml1991.el
lisp/gnus/mml2015.el
lisp/gnus/nndiary.el
lisp/gnus/nnheader.el
lisp/gnus/nnimap.el
lisp/gnus/nnkiboze.el
lisp/gnus/nnmail.el
lisp/gnus/nnmaildir.el
lisp/gnus/nnml.el
lisp/gnus/nnnil.el
lisp/gnus/nnrss.el
lisp/gnus/nntp.el
lisp/gnus/pop3.el
lisp/gnus/qp.el
lisp/gnus/rfc2047.el
lisp/gnus/sieve-manage.el
lisp/gnus/smime-ldap.el [deleted file]
lisp/gnus/smime.el
lisp/gnus/spam-wash.el
lisp/gnus/spam.el
lisp/gnus/utf7.el
lisp/gnus/yenc.el
lisp/help-fns.el
lisp/help.el
lisp/hex-util.el [moved from lisp/gnus/hex-util.el with 80% similarity]
lisp/ibuffer.el
lisp/ido.el
lisp/image-dired.el
lisp/informat.el
lisp/international/iso-cvt.el
lisp/international/mule-cmds.el
lisp/international/titdic-cnv.el
lisp/isearch-multi.el
lisp/log-edit.el
lisp/longlines.el
lisp/mail/binhex.el [moved from lisp/gnus/binhex.el with 98% similarity]
lisp/mail/emacsbug.el
lisp/mail/hashcash.el [moved from lisp/gnus/hashcash.el with 98% similarity]
lisp/mail/mail-extr.el
lisp/mail/mspools.el
lisp/mail/reporter.el
lisp/mail/rmail.el
lisp/mail/rmailedit.el
lisp/mail/rmailkwd.el
lisp/mail/rmailmsc.el
lisp/mail/rmailout.el
lisp/mail/rmailsort.el
lisp/mail/rmailsum.el
lisp/mail/sendmail.el
lisp/mail/supercite.el
lisp/mail/uce.el
lisp/mail/undigest.el
lisp/mail/unrmail.el
lisp/mail/uudecode.el [moved from lisp/gnus/uudecode.el with 98% similarity]
lisp/mail/vms-pmail.el
lisp/makefile.w32-in
lisp/man.el
lisp/md4.el [moved from lisp/gnus/md4.el with 95% similarity]
lisp/menu-bar.el
lisp/mh-e/ChangeLog
lisp/mh-e/mh-comp.el
lisp/mh-e/mh-e.el
lisp/mh-e/mh-folder.el
lisp/mh-e/mh-gnus.el
lisp/mh-e/mh-mime.el
lisp/mh-e/mh-show.el
lisp/mh-e/mh-utils.el
lisp/mh-e/mh-xface.el
lisp/net/browse-url.el
lisp/net/dbus.el [new file with mode: 0644]
lisp/net/dig.el [moved from lisp/gnus/dig.el with 97% similarity]
lisp/net/dns.el [moved from lisp/gnus/dns.el with 54% similarity]
lisp/net/eudc-export.el
lisp/net/eudcb-bbdb.el
lisp/net/hmac-def.el [moved from lisp/gnus/hmac-def.el with 81% similarity]
lisp/net/hmac-md5.el [moved from lisp/gnus/hmac-md5.el with 80% similarity]
lisp/net/imap.el [moved from lisp/gnus/imap.el with 99% similarity]
lisp/net/netrc.el
lisp/net/newsticker.el
lisp/net/ntlm.el [moved from lisp/gnus/ntlm.el with 98% similarity]
lisp/net/sasl-cram.el [moved from lisp/gnus/sasl-cram.el with 63% similarity]
lisp/net/sasl-digest.el [moved from lisp/gnus/sasl-digest.el with 87% similarity]
lisp/net/sasl-ntlm.el [moved from lisp/gnus/sasl-ntlm.el with 87% similarity]
lisp/net/sasl.el [moved from lisp/gnus/sasl.el with 92% similarity]
lisp/net/socks.el
lisp/net/tls.el
lisp/net/tramp-ftp.el
lisp/net/tramp.el
lisp/newcomment.el
lisp/nxml/.gitignore [new file with mode: 0644]
lisp/nxml/TODO [new file with mode: 0644]
lisp/nxml/nxml-enc.el [new file with mode: 0644]
lisp/nxml/nxml-glyph.el [new file with mode: 0644]
lisp/nxml/nxml-maint.el [new file with mode: 0644]
lisp/nxml/nxml-mode.el [new file with mode: 0644]
lisp/nxml/nxml-ns.el [new file with mode: 0644]
lisp/nxml/nxml-outln.el [new file with mode: 0644]
lisp/nxml/nxml-parse.el [new file with mode: 0644]
lisp/nxml/nxml-rap.el [new file with mode: 0644]
lisp/nxml/nxml-uchnm.el [new file with mode: 0644]
lisp/nxml/nxml-util.el [new file with mode: 0644]
lisp/nxml/rng-cmpct.el [new file with mode: 0644]
lisp/nxml/rng-dt.el [new file with mode: 0644]
lisp/nxml/rng-loc.el [new file with mode: 0644]
lisp/nxml/rng-maint.el [new file with mode: 0644]
lisp/nxml/rng-match.el [new file with mode: 0644]
lisp/nxml/rng-nxml.el [new file with mode: 0644]
lisp/nxml/rng-parse.el [new file with mode: 0644]
lisp/nxml/rng-pttrn.el [new file with mode: 0644]
lisp/nxml/rng-uri.el [new file with mode: 0644]
lisp/nxml/rng-util.el [new file with mode: 0644]
lisp/nxml/rng-valid.el [new file with mode: 0644]
lisp/nxml/rng-xsd.el [new file with mode: 0644]
lisp/nxml/test.invalid.xml [new file with mode: 0644]
lisp/nxml/test.valid.xml [new file with mode: 0644]
lisp/nxml/xmltok.el [new file with mode: 0644]
lisp/nxml/xsd-regexp.el [new file with mode: 0644]
lisp/obsolete/fast-lock.el
lisp/obsolete/mlsupport.el
lisp/obsolete/rnews.el
lisp/password-cache.el [moved from lisp/gnus/password.el with 86% similarity]
lisp/pcomplete.el
lisp/pcvs-parse.el
lisp/pcvs.el
lisp/pgg-parse.el
lisp/pgg.el
lisp/play/blackbox.el
lisp/play/dunnet.el
lisp/play/yow.el
lisp/progmodes/antlr-mode.el
lisp/progmodes/cc-engine.el
lisp/progmodes/cc-subword.el
lisp/progmodes/compile.el
lisp/progmodes/cperl-mode.el
lisp/progmodes/dcl-mode.el
lisp/progmodes/flymake.el
lisp/progmodes/fortran.el
lisp/progmodes/gdb-ui.el
lisp/progmodes/grep.el
lisp/progmodes/gud.el
lisp/progmodes/idlw-complete-structtag.el
lisp/progmodes/idlw-help.el
lisp/progmodes/idlwave.el
lisp/progmodes/octave-mod.el
lisp/progmodes/perl-mode.el
lisp/progmodes/prolog.el
lisp/progmodes/ps-mode.el
lisp/progmodes/python.el
lisp/progmodes/sh-script.el
lisp/replace.el
lisp/reposition.el
lisp/saveplace.el
lisp/select.el
lisp/server.el
lisp/sha1.el [moved from lisp/gnus/sha1.el with 96% similarity]
lisp/simple.el
lisp/smerge-mode.el
lisp/subr.el
lisp/term/mac-win.el
lisp/term/pc-win.el
lisp/term/tty-colors.el
lisp/term/w32-win.el
lisp/term/w32console.el [new file with mode: 0644]
lisp/term/x-win.el
lisp/textmodes/css-mode.el
lisp/textmodes/fill.el
lisp/textmodes/flyspell.el
lisp/textmodes/ispell.el
lisp/textmodes/org-export-latex.el
lisp/textmodes/org.el
lisp/textmodes/paragraphs.el
lisp/textmodes/reftex-auc.el
lisp/textmodes/reftex-dcr.el
lisp/textmodes/reftex-index.el
lisp/textmodes/reftex-toc.el
lisp/textmodes/remember-diary.el [deleted file]
lisp/textmodes/remember.el
lisp/textmodes/texinfmt.el
lisp/url/ChangeLog
lisp/url/url-about.el
lisp/url/url-cookie.el
lisp/url/url-dav.el
lisp/url/url-dired.el
lisp/url/url-file.el
lisp/url/url-handlers.el
lisp/url/url-history.el
lisp/url/url-http.el
lisp/url/url-imap.el
lisp/url/url-irc.el
lisp/url/url-mailto.el
lisp/url/url-news.el
lisp/url/url-privacy.el
lisp/url/url.el
lisp/vc-cvs.el
lisp/vc-git.el
lisp/vc-hg.el
lisp/vc-hooks.el
lisp/vc.el
lisp/vms-patch.el
lisp/vmsproc.el
lisp/w32-fns.el
lisp/wdired.el
lisp/wid-edit.el
lisp/window.el
lisp/x-dnd.el
mac/ChangeLog
mac/INSTALL
make-dist
src/ChangeLog
src/ChangeLog.10
src/Makefile.in
src/alloc.c
src/buffer.c
src/buffer.h
src/config.in
src/data.c
src/dbusbind.c [new file with mode: 0644]
src/dispnew.c
src/editfns.c
src/emacs.c
src/eval.c
src/gtkutil.c
src/image.c
src/keyboard.c
src/keymap.c
src/lisp.h
src/mac.c
src/macfns.c
src/macterm.c
src/print.c
src/process.c
src/puresize.h
src/s/darwin.h
src/s/gnu-kfreebsd.h [new file with mode: 0644]
src/s/ms-w32.h
src/search.c
src/sysdep.c
src/term.c
src/termhooks.h
src/unexmacosx.c
src/w32bdf.c
src/w32console.c
src/w32fns.c
src/w32proc.c
src/w32term.h
src/window.c
src/xdisp.c
src/xfaces.c
src/xfns.c
src/xterm.c
src/xterm.h
update-subdirs

index 2ca36bb3a02ad6be50be08472aec27d9c1f568d5..4366e4a7a698b877ca065cfce6bddc50f3097ccc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,68 @@
+2007-12-06  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * configure.in: Add AC_CONFIG_SRCDIR which was lost in the previous
+       change.
+
+2007-12-04  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * configure.in: Give package name and verision to AC_INIT.
+
+2007-12-03  Magnus Henoch  <mange@freemail.hu>
+
+       * configure.in: Use PKG_CHECK_MODULES to check for D-Bus.
+
+       * configure: Regenerate.
+
+2007-12-03  Michael Albinus  <michael.albinus@gmx.de>
+
+       * configure.in: No need for DBUS_INFO anymore.
+
+       * configure: Regenerate.
+
+       * Makefile.in (INFO_FILES): Use dbus unconditionally.
+
+2007-12-02  Michael Albinus  <michael.albinus@gmx.de>
+
+       * configure.in: Add D-Bus checks.  D-Bus is disabled by default.
+
+       * configure: Regenerate.
+
+       * Makefile.in (INFO_FILES): Add dbus.
+
+2007-12-02  Romain Francoise  <romain@orebokech.com>
+
+       * make-dist: Fix last change.
+
+2007-11-28  Petr Salinger  <Petr.Salinger@seznam.cz>  (tiny change)
+
+       * configure.in: Add support for gnu-kfreebsd.
+
+2007-11-28  Glenn Morris  <rgm@gnu.org>
+
+       * make-dist: Add etc/nxml.
+
+2007-11-24  Romain Francoise  <romain@orebokech.com>
+
+       * Makefile.in (INFO_FILES): Add nxml-mode.
+
+2007-11-23  Romain Francoise  <romain@orebokech.com>
+
+       * make-dist: Include nXML.  Don't try to copy FTP, it was removed on
+       2007/10/17.  Don't special-case alloca.c which is no longer in CVS.
+
+2007-11-20  Andreas Schwab  <schwab@suse.de>
+
+       * configure.in: Always include <resolv.h> when checking for
+       res_init.
+
+2007-11-17  Andreas Schwab  <schwab@suse.de>
+
+       * update-subdirs: Atomically update subdirs.el.
+
+2007-11-17  Glenn Morris  <rgm@gnu.org>
+
+       * Makefile.in (check-declare): New target.
+
 2007-11-07  Glenn Morris  <rgm@gnu.org>
 
        * configure.in: Deprecate Mac Carbon port.
index f0f710b47116bac8644ec0f2327802733435b3f1..b3de304491a4f8c43590f13e0b7715619d188ea7 100644 (file)
@@ -138,11 +138,11 @@ man1dir=$(mandir)/man1
 # since there are now many packages documented with the texinfo
 # system, it is inappropriate to imply that it is part of Emacs.
 infodir=@infodir@
-INFO_FILES=ada-mode autotype calc ccmode cl dired-x ebrowse ediff efaq \
-           eintr elisp emacs emacs-mime erc eshell eudc flymake forms  \
-           gnus idlwave info message mh-e newsticker org pcl-cvs pgg   \
-           rcirc reftex remember sc ses sieve speedbar tramp vip viper \
-           widget woman smtpmail url
+INFO_FILES=ada-mode autotype calc ccmode cl dbus dired-x ebrowse ediff \
+           efaq eintr elisp emacs emacs-mime erc eshell eudc flymake   \
+           forms gnus idlwave info message mh-e newsticker nxml-mode   \
+           org pcl-cvs pgg rcirc reftex remember sc ses sieve speedbar \
+           tramp vip viper widget woman smtpmail url
 
 # Directory for local state files for all programs.
 localstatedir=@localstatedir@
@@ -424,7 +424,7 @@ install-arch-dep: mkdir
 ## Note that the Makefiles in the etc directory are potentially useful
 ## in an installed Emacs, so should not be excluded.
 
-## installuser: 
+## installuser:
 ## http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg01672.html
 ## Nuisance because i) it needs to be the user running install, so
 ## configure can't set it; ii) can't (?) use the result of rule
@@ -811,3 +811,13 @@ bootstrap-clean-before-fast: FRC
        -(cd doc/lispref &&   $(MAKE) $(MFLAGS) clean)
        -(cd doc/lispintro &&   $(MAKE) $(MFLAGS) clean)
        (cd leim;     $(MAKE) $(MFLAGS) clean)
+
+.PHONY: check-declare
+
+check-declare:
+       @if [ ! -e $(srcdir)/src/emacs ]; then \
+         echo "You must build Emacs to use this command"; \
+         exit 1; \
+       fi
+       (cd leim; $(MAKE) $(MFLAGS) $@)
+       (cd lisp; $(MAKE) $(MFLAGS) $@)
index 706b2f68c8d5784e15c5056dfa72ffa5bcdcf7eb..c3252d3ff704bc719b7b42172c08ebf960023eeb 100644 (file)
@@ -1,3 +1,18 @@
+2007-12-05  Glenn Morris  <rgm@gnu.org>
+
+       * admin.el (set-version): Handle configure.in.  Adapt for doc/
+       directory layout for manuals.
+
+2007-12-01  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * FOR-RELEASE: Remove Gnus send mail problem.  Other Gnus bugs
+       have been fixed in Gnus CVS but have not yet been synched to
+       Emacs.
+
+2007-11-17  Glenn Morris  <rgm@gnu.org>
+
+       * admin.el (process-lines): Move to ../lisp/subr.el.
+
 2007-10-23  Glenn Morris  <rgm@gnu.org>
 
        * MAINTAINERS: Move here from ../.
index 387baade381b166a04e4c0b4ada3dddace30c0e2..3ab61ba577c1758c14f03b8d1c89de91f57a55a3 100644 (file)
@@ -89,23 +89,31 @@ http://lists.gnu.org/archive/html/emacs-devel/2007-05/msg00209.html
 ** menu indications of key bindings for remapped commands
 http://lists.gnu.org/archive/html/emacs-devel/2007-05/msg01339.html
 
-** tromey@redhat.com: two View-mode "quit" bugs
-http://lists.gnu.org/archive/html/emacs-devel/2007-07/msg00103.html
-
 ** rms: gnus-dired.el is a mistake.  Those features should not
 be part of Gnus.  They should be moved to some other part of Emacs.
 
-** C-x v v no longer works the way it used to
-http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg00785.html
+** sdl.web@gmail.com, 28 Oct: window-system in face definition
+
+** Gnus archive groups are not shown at all if they are not at the default level. 
+Fixed in Gnus CVS, but the patch has not been synched to Emacs yet:
+http://thread.gmane.org/gmane.emacs.gnus.general/65622/focus=65757
 
-** vc-diff no longer works the way it used to
-http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg01753.html
-(vc-revert also needs the repository now with CVS)
+** Extra question asked when doing a reply in Gnus
+Fixed in Gnus CVS, but the patch has not been synched to Emacs yet:
+http://thread.gmane.org/gmane.emacs.gnus.general/65627/65768
 
-** sdl.web@gmail.com, 28 Oct: window-system in face definition
+** sdl.web@gmail.com, 30 Oct: ps-lpr-switches has no effect
+
+** Stephen.Berman@gmx.net: minibuffer and current-local-map
+
+** timh@insightful.com, 9 Nov: X-coding-system incompatibility, and workaround
+
+** Get rid of old-style backquotes in cc-vars.el.
+ttn has a patch:
+http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg02052.html
 
-** add README files for etc/gnus, etc/images/smilies/medium,grayscale
-update etc/images README files with any new images
+** Fix or document the shortcoming of easymenu and :suffix.
+http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg01857.html
 
 * DOCUMENTATION
 
index 76c50243b3dc4bc9cfc91bbaf473b76f057ee0ba..a490442a44bf1d339fe7d7cada67fcf987232d33 100644 (file)
 
 ;;; Code:
 
-(defun process-lines (program &rest args)
-  "Execute PROGRAM with ARGS, returning its output as a list of lines.
-Signal an error if the program returns with a non-zero exit status."
-  (with-temp-buffer
-    (let ((status (apply 'call-process program nil (current-buffer) nil args)))
-      (unless (eq status 0)
-       (error "%s exited with status %s" program status))
-      (goto-char (point-min))
-      (let (lines)
-       (while (not (eobp))
-         (setq lines (cons (buffer-substring-no-properties
-                            (line-beginning-position)
-                            (line-end-position))
-                           lines))
-         (forward-line 1))
-       (nreverse lines)))))
-
 (defun add-release-logs (root version)
   "Add \"Version VERSION released.\" change log entries in ROOT.
 Root must be the root of an Emacs source tree."
@@ -85,10 +68,14 @@ Root must be the root of an Emacs source tree."
   (set-version-in-file root "README" version
                       (rx (and "version" (1+ space)
                                (submatch (1+ (in "0-9."))))))
-  (set-version-in-file root "man/emacs.texi" version
+  (set-version-in-file root "configure.in" version
+                      (rx (and "AC_INIT" (1+ (not (in ?,)))
+                                ?, (0+ space)
+                                (submatch (1+ (in "0-9."))))))
+  (set-version-in-file root "doc/emacs/emacs.texi" version
                       (rx (and "EMACSVER" (1+ space)
                                (submatch (1+ (in "0-9."))))))
-  (set-version-in-file root "lispref/elisp.texi" version
+  (set-version-in-file root "doc/lispref/elisp.texi" version
                       (rx (and "EMACSVER" (1+ space)
                                (submatch (1+ (in "0-9."))))))
   (set-version-in-file root "lib-src/makefile.w32-in" version
index 1fc2db097b822f5ce93dceb8ac66e8d745c863f3..74ab9d542f9881b7e3ae93137cf341b39d440b7a 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61.
+# Generated by GNU Autoconf 2.61 for emacs 23.0.50.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -570,11 +570,11 @@ MAKEFLAGS=
 SHELL=${CONFIG_SHELL-/bin/sh}
 
 # Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
+PACKAGE_NAME='emacs'
+PACKAGE_TARNAME='emacs'
+PACKAGE_VERSION='23.0.50'
+PACKAGE_STRING='emacs 23.0.50'
+PACKAGE_BUGREPORT=''
 
 ac_unique_file="src/lisp.h"
 ac_config_libobj_dir=src
@@ -692,6 +692,8 @@ RSVG_CFLAGS
 RSVG_LIBS
 GTK_CFLAGS
 GTK_LIBS
+DBUS_CFLAGS
+DBUS_LIBS
 XFT_CFLAGS
 XFT_LIBS
 FREETYPE_CFLAGS
@@ -783,7 +785,7 @@ sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE}'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
 infodir='${datarootdir}/info'
 htmldir='${docdir}'
 dvidir='${docdir}'
@@ -1247,7 +1249,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures this package to adapt to many kinds of systems.
+\`configure' configures emacs 23.0.50 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1295,7 +1297,7 @@ Fine tuning of the installation directories:
   --infodir=DIR          info documentation [DATAROOTDIR/info]
   --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
   --mandir=DIR           man documentation [DATAROOTDIR/man]
-  --docdir=DIR           documentation root [DATAROOTDIR/doc/PACKAGE]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/emacs]
   --htmldir=DIR          html documentation [DOCDIR]
   --dvidir=DIR           dvi documentation [DOCDIR]
   --pdfdir=DIR           pdf documentation [DOCDIR]
@@ -1320,7 +1322,9 @@ _ACEOF
 fi
 
 if test -n "$ac_init_help"; then
-
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of emacs 23.0.50:";;
+   esac
   cat <<\_ACEOF
 
 Optional Features:
@@ -1366,6 +1370,7 @@ Optional Packages:
   --without-xaw3d         don't use Xaw3d
   --without-xim           don't use X11 XIM
   --without-carbon        don't use Carbon GUI on Mac OS X
+  --without-dbus          don't use D-Bus
   --with-x                use the X Window System
 
 Some influential environment variables:
@@ -1442,7 +1447,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-configure
+emacs configure 23.0.50
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1456,7 +1461,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by $as_me, which was
+It was created by emacs $as_me 23.0.50, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -1792,6 +1797,14 @@ fi
 
 
 
+
+
+
+
+
+
+
+
 
 
 
@@ -1807,6 +1820,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 ac_config_headers="$ac_config_headers src/config.h:src/config.in"
 
 
+
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
@@ -2028,6 +2042,12 @@ if test "${with_carbon+set}" = set; then
 fi
 
 
+# Check whether --with-dbus was given.
+if test "${with_dbus+set}" = set; then
+  withval=$with_dbus;
+fi
+
+
 # Check whether --enable-carbon-app was given.
 if test "${enable_carbon_app+set}" = set; then
   enableval=$enable_carbon_app;  carbon_appdir_x=${enableval}
@@ -2278,6 +2298,19 @@ case "${canonical}" in
     esac
   ;;
 
+  ## FreeBSD kernel + glibc based userland
+  *-*-kfreebsd*gnu* )
+    opsys=gnu-kfreebsd
+    case "${canonical}" in
+      alpha*-*-kfreebsd*)      machine=alpha ;;
+      ia64-*-kfreebsd*)                machine=ia64 ;;
+      sparc64-*-kfreebsd*)     machine=sparc ;;
+      powerpc-*-kfreebsd*)     machine=macppc ;;
+      i[3456]86-*-kfreebsd*)   machine=intel386 ;;
+      amd64-*-kfreebsd*|x86_64-*-kfreebsd*) machine=amdx86-64 ;;
+    esac
+  ;;
+
   ## NetBSD ports
   *-*-netbsd* )
     opsys=netbsd
@@ -12012,6 +12045,113 @@ _ACEOF
   fi
 fi
 
+HAVE_DBUS=no
+if test "${with_dbus}" = "yes"; then
+
+  succeeded=no
+
+  if test -z "$PKG_CONFIG"; then
+    # Extract the first word of "pkg-config", so it can be a program name with args.
+set dummy pkg-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PKG_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
+  ;;
+esac
+fi
+PKG_CONFIG=$ac_cv_path_PKG_CONFIG
+if test -n "$PKG_CONFIG"; then
+  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+echo "${ECHO_T}$PKG_CONFIG" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+
+  if test "$PKG_CONFIG" = "no" ; then
+     HAVE_DBUS=no
+  else
+     PKG_CONFIG_MIN_VERSION=0.9.0
+     if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
+        { echo "$as_me:$LINENO: checking for dbus-1 >= 1.0" >&5
+echo $ECHO_N "checking for dbus-1 >= 1.0... $ECHO_C" >&6; }
+
+        if $PKG_CONFIG --exists "dbus-1 >= 1.0" 2>&5; then
+            { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+            succeeded=yes
+
+            { echo "$as_me:$LINENO: checking DBUS_CFLAGS" >&5
+echo $ECHO_N "checking DBUS_CFLAGS... $ECHO_C" >&6; }
+            DBUS_CFLAGS=`$PKG_CONFIG --cflags "dbus-1 >= 1.0"|sed -e 's,///*,/,g'`
+            { echo "$as_me:$LINENO: result: $DBUS_CFLAGS" >&5
+echo "${ECHO_T}$DBUS_CFLAGS" >&6; }
+
+            { echo "$as_me:$LINENO: checking DBUS_LIBS" >&5
+echo $ECHO_N "checking DBUS_LIBS... $ECHO_C" >&6; }
+            DBUS_LIBS=`$PKG_CONFIG --libs "dbus-1 >= 1.0"|sed -e 's,///*,/,g'`
+            { echo "$as_me:$LINENO: result: $DBUS_LIBS" >&5
+echo "${ECHO_T}$DBUS_LIBS" >&6; }
+        else
+            { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+            DBUS_CFLAGS=""
+            DBUS_LIBS=""
+            ## If we have a custom action on failure, don't print errors, but
+            ## do set a variable so people can do so.
+            DBUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-1 >= 1.0"`
+
+        fi
+
+
+
+     else
+        echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
+        echo "*** See http://www.freedesktop.org/software/pkgconfig"
+     fi
+  fi
+
+  if test $succeeded = yes; then
+     HAVE_DBUS=yes
+  else
+     HAVE_DBUS=no
+  fi
+
+   if test "$HAVE_DBUS" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DBUS 1
+_ACEOF
+
+   fi
+fi
+
 HAVE_XAW3D=no
 if test x"${USE_X_TOOLKIT}" = xmaybe || test x"${USE_X_TOOLKIT}" = xLUCID; then
   if test "$with_xaw3d" != no; then
@@ -18962,13 +19102,11 @@ _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-#include <sys/types.h> /* for off_t */
-     #include <stdio.h>
+#include <stdio.h>
 int
 main ()
 {
-int (*fp) (FILE *, off_t, int) = fseeko;
-     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+return fseeko (stdin, 0, 0) && (fseeko) (stdin, 0, 0);
   ;
   return 0;
 }
@@ -19008,13 +19146,11 @@ cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
 #define _LARGEFILE_SOURCE 1
-#include <sys/types.h> /* for off_t */
-     #include <stdio.h>
+#include <stdio.h>
 int
 main ()
 {
-int (*fp) (FILE *, off_t, int) = fseeko;
-     return fseeko (stdin, 0, 0) && fp (stdin, 0, 0);
+return fseeko (stdin, 0, 0) && (fseeko) (stdin, 0, 0);
   ;
   return 0;
 }
 # Do we have res_init, for detecting changes in /etc/resolv.conf?
 
 resolv=no
-{ echo "$as_me:$LINENO: checking for res_init" >&5
-echo $ECHO_N "checking for res_init... $ECHO_C" >&6; }
-if test "${ac_cv_func_res_init+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
+cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
 cat confdefs.h >>conftest.$ac_ext
 cat >>conftest.$ac_ext <<_ACEOF
 /* end confdefs.h.  */
-/* Define res_init to an innocuous variant, in case <limits.h> declares res_init.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define res_init innocuous_res_init
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char res_init (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef res_init
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char res_init ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_res_init || defined __stub___res_init
-choke me
-#endif
-
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
 int
 main ()
 {
-return res_init ();
+return res_init();
   ;
   return 0;
 }
@@ -20114,25 +20217,16 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
         test ! -s conftest.err
        } && test -s conftest$ac_exeext &&
        $as_test_x conftest$ac_exeext; then
-  ac_cv_func_res_init=yes
+  have_res_init=yes
 else
   echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-       ac_cv_func_res_init=no
+       have_res_init=no
 fi
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_func_res_init" >&5
-echo "${ECHO_T}$ac_cv_func_res_init" >&6; }
-if test $ac_cv_func_res_init = yes; then
-  have_res_init=yes
-else
-  have_res_init=no
-fi
-
 if test "$have_res_init" = no; then
   OLIBS="$LIBS"
   LIBS="$LIBS -lresolv"
@@ -20150,7 +20244,7 @@ cat >>conftest.$ac_ext <<_ACEOF
 int
 main ()
 {
-res_init();
+return res_init();
   ;
   return 0;
 }
@@ -24356,6 +24450,11 @@ Read the emacs-devel archives for more information."
    echo
 fi
 
+if test "$HAVE_DBUS" = yes && test "${opsys}" != "gnu-linux"; then
+  echo "D-Bus integration has been tested for GNU/Linux only."
+  echo
+fi
+
 
 # Remove any trailing slashes in these variables.
 test "${prefix}" != NONE &&
@@ -24785,7 +24884,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by $as_me, which was
+This file was extended by emacs $as_me 23.0.50, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -24838,7 +24937,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-config.status
+emacs config.status 23.0.50
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
@@ -25102,6 +25201,8 @@ RSVG_CFLAGS!$RSVG_CFLAGS$ac_delim
 RSVG_LIBS!$RSVG_LIBS$ac_delim
 GTK_CFLAGS!$GTK_CFLAGS$ac_delim
 GTK_LIBS!$GTK_LIBS$ac_delim
+DBUS_CFLAGS!$DBUS_CFLAGS$ac_delim
+DBUS_LIBS!$DBUS_LIBS$ac_delim
 XFT_CFLAGS!$XFT_CFLAGS$ac_delim
 XFT_LIBS!$XFT_LIBS$ac_delim
 FREETYPE_CFLAGS!$FREETYPE_CFLAGS$ac_delim
@@ -25121,8 +25222,6 @@ KMEM_GROUP!$KMEM_GROUP$ac_delim
 GETLOADAVG_LIBS!$GETLOADAVG_LIBS$ac_delim
 GETOPT_H!$GETOPT_H$ac_delim
 GETOPTOBJS!$GETOPTOBJS$ac_delim
-version!$version$ac_delim
-configuration!$configuration$ac_delim
 _ACEOF
 
   if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@@ -25164,6 +25263,8 @@ _ACEOF
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   cat >conf$$subs.sed <<_ACEOF
+version!$version$ac_delim
+configuration!$configuration$ac_delim
 canonical!$canonical$ac_delim
 srcdir!$srcdir$ac_delim
 lispdir!$lispdir$ac_delim
@@ -25187,7 +25288,7 @@ carbon_appdir!$carbon_appdir$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 21; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 23; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
index 7150e5fa0ba20d949f587d8264527fd3dfbcd08d..76fd9a48173dc97d9f419eebf6950435c6b2fb00 100644 (file)
@@ -24,8 +24,9 @@ dnl  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 dnl  Boston, MA 02110-1301, USA.
 
 AC_PREREQ(2.61)dnl
-AC_INIT(src/lisp.h)
+AC_INIT(emacs, 23.0.50)
 AC_CONFIG_HEADER(src/config.h:src/config.in)
+AC_CONFIG_SRCDIR(src/lisp.h)
 
 dnl Support for --program-prefix, --program-suffix and
 dnl --program-transform-name options
@@ -120,6 +121,7 @@ EMACS_ARG_N([toolkit-scroll-bars],[don't use Motif or Xaw3d scroll bars])
 EMACS_ARG_N([xaw3d],[don't use Xaw3d])
 EMACS_ARG_N([xim],[don't use X11 XIM])
 EMACS_ARG_N([carbon],[don't use Carbon GUI on Mac OS X])
+EMACS_ARG_N([dbus],[don't use D-Bus])
 
 AC_ARG_ENABLE(carbon-app,
 [AS_HELP_STRING([--enable-carbon-app@<:@=DIR@:>@],
@@ -253,6 +255,19 @@ case "${canonical}" in
     esac
   ;;
 
+  ## FreeBSD kernel + glibc based userland
+  *-*-kfreebsd*gnu* )
+    opsys=gnu-kfreebsd
+    case "${canonical}" in
+      alpha*-*-kfreebsd*)      machine=alpha ;;
+      ia64-*-kfreebsd*)                machine=ia64 ;;
+      sparc64-*-kfreebsd*)     machine=sparc ;;
+      powerpc-*-kfreebsd*)     machine=macppc ;;
+      i[3456]86-*-kfreebsd*)   machine=intel386 ;;
+      amd64-*-kfreebsd*|x86_64-*-kfreebsd*) machine=amdx86-64 ;;
+    esac
+  ;;
+
   ## NetBSD ports
   *-*-netbsd* )
     opsys=netbsd
@@ -1193,7 +1208,7 @@ dnl see the `changequote' comment above.
     machine=amdx86-64 opsys=gnu-linux
   ;;
 
-  ## Tensilica Xtensa Linux-based GNU system    
+  ## Tensilica Xtensa Linux-based GNU system
   xtensa-*-linux-gnu* )
     machine=xtensa opsys=gnu-linux
     ;;
@@ -1351,11 +1366,11 @@ AC_PATH_PROG(GZIP_PROG, gzip)
 
 ## Need makeinfo >= 4.6 (?) to build the manuals.
 AC_PATH_PROG(MAKEINFO, makeinfo, no)
-dnl By this stage, configure has already checked for egrep and set EGREP, 
+dnl By this stage, configure has already checked for egrep and set EGREP,
 dnl or exited with an error if no egrep was found.
 if test "$MAKEINFO" != "no" && \
   test x"`$MAKEINFO --version 2> /dev/null | $EGREP 'texinfo[[^0-9]]*([[1-4]][[0-9]]+|[[5-9]]|4\.[[6-9]]|4\.[[1-5]][[0-9]]+)'`" = x; then
-   MAKEINFO=no    
+   MAKEINFO=no
 fi
 
 if test "$MAKEINFO" = "no"; then
@@ -1547,7 +1562,7 @@ dnl Do this early because it can frob feature test macros for Unix-98 &c.
 AC_SYS_LARGEFILE
 
 
-### The standard library on x86-64 GNU/Linux distributions can 
+### The standard library on x86-64 GNU/Linux distributions can
 ### be located in either /usr/lib64 or /usr/lib.
 case "${canonical}" in
   x86_64-*-linux-gnu* )
@@ -1898,7 +1913,7 @@ dnl USE_X_TOOLKIT is set.
       no ) USE_X_TOOLKIT=none ;;
 dnl If user did not say whether to use a toolkit, make this decision later:
 dnl use the toolkit if we have gtk, or X11R5 or newer.
-      * ) 
+      * )
           if test x"$with_gtk" = xyes; then
              USE_X_TOOLKIT=none
           else
@@ -1917,7 +1932,7 @@ esac
 if test "$window_system" = none && test "X$with_x" != "Xno"; then
    AC_CHECK_PROG(HAVE_XSERVER, X, true, false)
    if test "$HAVE_XSERVER" = true ||
-      test -n "$DISPLAY" || 
+      test -n "$DISPLAY" ||
       test "`echo /usr/lib/libX11.*`" != "/usr/lib/libX11.*"; then
         AC_MSG_ERROR([You seem to be running X, but no X development libraries
 were found.  You should install the relevant development files for X
@@ -2252,6 +2267,17 @@ if test "${HAVE_GTK}" = "yes"; then
   fi
 fi
 
+dnl D-Bus has been tested under GNU/Linux only.  Must be adapted for
+dnl other platforms.  Support for higher D-Bus versions but 1.0 is
+dnl also not configured.
+HAVE_DBUS=no
+if test "${with_dbus}" = "yes"; then
+   PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.0, HAVE_DBUS=yes, HAVE_DBUS=no)
+   if test "$HAVE_DBUS" = yes; then
+      AC_DEFINE(HAVE_DBUS, 1, [Define to 1 if using D-Bus.])
+   fi
+fi
+
 dnl Do not put whitespace before the #include statements below.
 dnl Older compilers (eg sunos4 cc) choke on it.
 HAVE_XAW3D=no
@@ -2836,15 +2862,19 @@ AC_CHECK_LIB(ncurses, tparm)
 # Do we have res_init, for detecting changes in /etc/resolv.conf?
 
 resolv=no
-AC_CHECK_FUNC(res_init, have_res_init=yes, have_res_init=no)
+AC_TRY_LINK([#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>],
+    [return res_init();],
+    have_res_init=yes, have_res_init=no)
 if test "$have_res_init" = no; then
   OLIBS="$LIBS"
   LIBS="$LIBS -lresolv"
   AC_MSG_CHECKING(for res_init with -lresolv)
   AC_TRY_LINK([#include <netinet/in.h>
 #include <arpa/nameser.h>
-#include <resolv.h> ],
-    [res_init();],
+#include <resolv.h>],
+    [return res_init();],
     have_res_init=yes, have_res_init=no)
   AC_MSG_RESULT($have_res_init)
   if test "$have_res_init" = yes ; then
@@ -3538,7 +3568,12 @@ if test "$HAVE_CARBON" = "yes"; then
 known problems.  It is not recommended for use by non-developers.
 Read the emacs-devel archives for more information."
    echo
-fi 
+fi
+
+if test "$HAVE_DBUS" = yes && test "${opsys}" != "gnu-linux"; then
+  echo "D-Bus integration has been tested for GNU/Linux only."
+  echo
+fi
 
 
 # Remove any trailing slashes in these variables.
index 3c020fcc5e7c5f7166c0d461d8b3030321dfb3ea..9c4d874e13968b61fc6b3d30b8f312b1a4cf6acc 100644 (file)
@@ -1,12 +1,50 @@
+2007-11-26  Richard Stallman  <rms@gnu.org>
+
+       * help.texi (Help Echo): Cleanups.
+
+2007-11-23  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * files.texi (Why Version Control?): Fix typo.
+       (VCS Concepts): Fix typos; small tense fix.
+       (Selecting a Fileset): Fix typos; small rewording.
+       (Log Buffer): Likewise.
+       (Old Revisions): Likewise.
+
+2007-11-17  Eli Zaretskii  <eliz@gnu.org>
+
+       * mule.texi (Communication Coding): Fix wording of last change.
+
+2007-11-16  Werner Lemberg <wl@gnu.org>
+
+       * custom.texi (Specifying File Variables), major.texi (Choosing
+       Modes): Mention '\" in man pages.
+
+2007-11-16  Kenichi Handa  <handa@ni.aist.go.jp>
+
+       * mule.texi (Communication Coding): Document x-select-request-type.
+
+       * frames.texi (Cut/Paste Other App): Mention x-select-request-type.
+
+2007-11-15  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * maintaining.texi (TEXTAGS): note that you can use "-" for stdout with
+       --output=file.
+
+2007-11-13  Martin Rudalics  <rudalics@gmx.at>
+
+       * help.texi (Help Summary, Apropos, Misc Help): Fix typos.
+       (Help Echo): Avoid mentioning the term "region" here and
+       consistently use the term "active text".
+
+2007-11-11  Glenn Morris  <rgm@gnu.org>
+
+       * calendar.texi (Special Diary Entries): Fix Thanksgiving example.
+
 2007-11-10  Paul Pogonyshev  <pogonyshev@gmx.net>
 
        * search.texi (Query Replace): Mention
        `query-replace-show-replacement'.
 
-2007-11-09  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi, gnus-faq.texi, message.texi: Bump version to 5.10.9.
-
 2007-11-09  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Watch Expressions): Remove obscure sentence.
 
        * cmdargs.texi (Misc Variables): Remove Sun windows info.
 
-2007-10-27  Emanuele Giaquinta  <e.giaquinta@glauco.it>  (tiny change)
-
-       * gnus-faq.texi ([5.12]): Remove reference to discontinued service.
-
-2007-10-27  Reiner Steib  <Reiner.Steib@gmx.de>
-
-       * gnus.texi (Troubleshooting): Adjust Gnus version number.
-
 2007-10-30  Nick Roberts  <nickrob@snap.net.nz>
 
        * building.texi (Watch Expressions): Describe gdb-delete-out-of-scope.
        * misc.texi (Directory Tracking): Explain a bit more about
        dirtrack-mode.
 
-2007-10-29  Richard Stallman  <rms@gnu.org>
-
-       * widget.texi (Introduction): Delete discussion of implementation
-       internals.
-
 2007-10-25  Glenn Morris  <rgm@gnu.org>
 
        * fortran-xtra.texi (Fortran): F90 mode handles F2003.
index 6b28509473587ecc65827c34a4564ff3eae90f88..bb359a962a3e87d39c40ec1d7239a1d48b443fb6 100644 (file)
@@ -1397,19 +1397,19 @@ nonmarking (with @samp{&}) when possible.
 specifies a regularly occurring event by offsets specified in days,
 weeks, and months.  It is comparable to a crontab entry interpreted by
 the @code{cron} utility.  Here is a nonmarking, floating diary entry
-that applies to the last Thursday in November:
+that applies to the fourth Thursday in November:
 
 @findex diary-float
 @example
-&%%(diary-float 11 4 -1) American Thanksgiving
+&%%(diary-float 11 4 4) American Thanksgiving
 @end example
 
 @noindent
 The 11 specifies November (the eleventh month), the 4 specifies Thursday
 (the fourth day of the week, where Sunday is numbered zero), and the
-@minus{}1 specifies ``last'' (1 would mean ``first,'' 2 would mean
-``second,'' @minus{}2 would mean ``second-to-last,'' and so on).  The
-month can be a single month or a list of months.  Thus you could change
+second 4 specifies the fourth Thursday (1 would mean ``first,'' 2 would
+mean ``second,'' @minus{}2 would mean ``second-to-last,'' and so on).
+The month can be a single month or a list of months.  Thus you could change
 the 11 above to @samp{'(1 2 3)} and have the entry apply to the last
 Thursday of January, February, and March.  If the month is @code{t}, the
 entry applies to all months of the year.@refill
index 29d1c902b7c868c59b727f3b7b28c90f73e2cb02..4bd1ba66df7254c313ece7b777d52a771ae61ad7 100644 (file)
@@ -1099,10 +1099,14 @@ particular Lisp file.  @xref{Enabling Multibyte}.
 the first line as well.
 
 @cindex shell scripts, and local file variables
+@cindex man pages, and local file variables
   In shell scripts, the first line is used to identify the script
 interpreter, so you cannot put any local variables there.  To
 accommodate this, Emacs looks for local variable specifications in the
 @emph{second} line when the first line specifies an interpreter.
+The same is true for man pages which start with the magic string
+@samp{'\"} to specify a list of troff preprocessors (not all do,
+however).
 
   A @dfn{local variables list} goes near the end of the file, in the
 last page.  (It is often best to put it on a page by itself.)  The local
index dc819bef178f87cbc97503e6b214c8cb38a44413..8e2cb879754a865aa485c905a23ce2140dd2f961 100644 (file)
@@ -1270,7 +1270,7 @@ you want to use.
 @subsubsection Understanding the problems it addresses
 
   Version control systems provide you with three important capabilities: 
-@dfn{reversibility}. @dfn{concurrency}, and @dfn{history}.
+@dfn{reversibility}, @dfn{concurrency}, and @dfn{history}.
 
   The most basic capability you get from a version-control system is
 reversibility, the ability to back up to a saved, known-good state when
@@ -1298,7 +1298,7 @@ git, and Mercurial.
 @cindex SCCS
   SCCS was the first version-control system ever built, and was long ago
 superseded by later and more advanced ones; Emacs supports it only for
-backward compatibility and historical reasons. VC compensates for
+backward compatibility and historical reasons.  VC compensates for
 certain features missing in SCCS (snapshots, for example) by
 implementing them itself, but some other VC features, such as multiple
 branches, are not available with SCCS.  Since SCCS is non-free you
@@ -1439,7 +1439,7 @@ happen when you check in a change to a file that conflicts with a change
 checked in by someone else after your checkout.  Both kinds of conflict
 have to be resolved by human judgment and communication.
 
-  SCCS always uses locking. RCS is lock-based by default but can be
+  SCCS always uses locking.  RCS is lock-based by default but can be
 told to operate in a merging style.  CVS and Subversion are
 merge-based by default but can be told to operate in a locking mode.
 Most later version-control systems, such as GNU Arch, git, and
@@ -1463,7 +1463,7 @@ between them as much as possible.
 and other operations are @dfn{file-based}; each file has its own
 @dfn{master file} with its own comment and revision history separate
 from that of all other files in the system.  Later systems, beginning
-with Subversion, became @dfn{changeset-based}; a checkin under these
+with Subversion, are @dfn{changeset-based}; a checkin under these
 may include changes to several files and that change set is treated as
 a unit by the system.  Any comment associated with the change belongs
 to no single file, but is attached to the changeset itself.
@@ -1489,7 +1489,7 @@ systems and a bit archaic; nowadays those operations are usually called
   Early version-control systems were designed around a @dfn{centralized}
 model in which each project has only one repository used by all
 developers.  SCCS, RCS, CVS, and Subversion share this kind of model.
-It has two important problems. One is that a single repository is a
+It has two important problems.  One is that a single repository is a
 single point of failure---if the repository server is down all work
 stops.  The other is that you need to be connected live to the server to
 do checkins and checkouts; if you're offline, you can't work.
@@ -1622,7 +1622,7 @@ your fileset is the marked files only.
 If they are not, VC mode will fail when you attempt to execute 
 a command on the fileset.
 
-   In VC, filesets, are, essentially, a way to pass multiple file
+   VC filesets are, essentially, a way to pass multiple file
 arguments as a group to underlying version-control commands.  For
 example, on Subversion a checkin with more than one file in its
 fileset will become a joint commit, as though you had typed
@@ -1640,7 +1640,7 @@ version-control systems.
 
    Emacs uses the concept of named filesets elsewhere
 (@pxref{Filesets}) to allow you to view and visit files in functional
-groups. Unlike those, VC filesets are not named and don't persist
+groups.  Unlike those, VC filesets are not named and don't persist
 across sessions.
 
 @node Doing The Right Thing
@@ -1803,8 +1803,8 @@ are set around the entire contents of the buffer so that it is easy to
 kill the contents of the buffer with @kbd{C-w}.
 
 @findex log-edit-insert-changelog
-  If you work by writing entries in the @file{ChangeLog}
-(@pxref{Change Log}) and then commit the change under revision
+  If you work by first writing entries in the @file{ChangeLog}
+(@pxref{Change Log}) and afterwards committing the change under revision
 control, you can generate the Log Edit text from the ChangeLog using
 @kbd{C-c C-a} (@kbd{log-edit-insert-changelog}).  This looks for
 entries for the file(s) concerned in the top entry in the ChangeLog
@@ -1845,7 +1845,7 @@ time to complete the check-in.
 convenient to specify the same log entry for many of the files.  (This
 is the normal way to do things on a changeset-oriented system, where
 comments are attached to changesets rather than the history of
-individual files.) The most convenient way to do this is to mark all the
+individual files.)  The most convenient way to do this is to mark all the
 files in VC-Dired mode and check in from there; the log buffer will
 carry the fileset information with it and do a group commit when you
 confirm it with @kbd{C-c C-c}.
@@ -1952,15 +1952,15 @@ revisions are not, in general, present as files on your disk.)
 @kindex C-x v g
   For some back ends, you can display the file @dfn{annotated} with
 per-line revision information and using colors to enhance the visual
-appearance, with the command @kbd{M-x vc-annotate}.  It creates a new
+appearance, with the command @kbd{M-x vc-annotate}.  This creates a new
 buffer (the ``annotate buffer'') displaying the file's text, with each
 part colored to show how old it is.  Text colored red is new, blue means
 old, and intermediate colors indicate intermediate ages.  By default,
 the color is scaled over the full range of ages, such that the oldest
 changes are blue, and the newest changes are red.
 
-  When you give a prefix argument to this command, it uses the
-minibuffer to read two arguments: the ID of which revision to display and
+  When you give a prefix argument to this command, Emacs reads two
+arguments using the minibuffer: the ID of which revision to display and
 annotate (instead of the current file contents), and the time span in
 days the color range should cover.  
 
@@ -2006,7 +2006,7 @@ return to your working revision.
 @node Secondary VC Commands
 @subsection The Secondary Commands of VC
 
-  This section explains the secondary commands of VC; those that you might
+  This section explains the secondary commands of VC, those that you might
 use once a day.
 
 @menu
index e1207738cfa187194d3e27894e63b3a107110b5f..23c48b72b41046b258866f2171af2e9afa48e6ce 100644 (file)
@@ -224,9 +224,12 @@ for text in the cut buffer.  If neither of those sources provides text
 to yank, the kill ring contents are used.
 
   The standard coding system for X Window System selections is
-@code{compound-text-with-extensions}.  To specify another coding
-system for selections, use @kbd{C-x @key{RET} x} or @kbd{C-x @key{RET}
-X}.  @xref{Communication Coding}.
+@code{compound-text-with-extensions}.  You may find that the pasted
+text is not what you expected.  In such a case, you can specify
+another coding system for selections by @kbd{C-x @key{RET} x} or
+@kbd{C-x @key{RET} X}, or can request the different data type by
+modifying the variable @code{x-select-request-type}.
+@xref{Communication Coding}.
 
 @node Word and Line Mouse
 @subsection Mouse Commands for Words and Lines
index fe7c2a85ffa3bf20d29e99fce810d1fd326662f4..ee170e0c7da814d6af90552dcf55a1d4c5f57a80 100644 (file)
@@ -155,10 +155,10 @@ Display information on the character sets, coding systems, and input
 methods used in language environment @var{language-env}
 (@code{describe-language-environment}).
 @item C-h F @var{function} @key{RET}
-Enter Info and goes to the node that documents the Emacs function
+Enter Info and go to the node that documents the Emacs function
 @var{function} (@code{Info-goto-emacs-command-node}).
 @item C-h K @var{key}
-Enter Info and goes to the node that documents the key sequence
+Enter Info and go to the node that documents the key sequence
 @var{key} (@code{Info-goto-emacs-key-command-node}).
 @item C-h S @var{symbol} @key{RET}
 Display the Info documentation on symbol @var{symbol} according to the
@@ -296,8 +296,8 @@ be found by this command.
 Search for user-option variables whose names match @var{pattern}.
 
 @item M-x apropos-value @key{RET} @var{pattern} @key{RET}
-Search for functions whose definitions @var{pattern}, and variables
-whose values match @var{pattern}.
+Search for functions whose definitions match @var{pattern}, and
+variables whose values match @var{pattern}.
 
 @item C-h d @var{pattern} @key{RET}
 Search for functions and variables whose @strong{documentation
@@ -545,9 +545,9 @@ documentation of @var{function} or @var{key}.
 @findex info-lookup-symbol
   When editing a program, if you have an Info version of the manual
 for the programming language, you can use @kbd{C-h S}
-(@code{info-lookup-symbol}) to find symbol (keyword, function or
-variable) in the proper manual.  The details of how this command works
-depend on the major mode.
+(@code{info-lookup-symbol}) to find an entry for a symbol (keyword,
+function or variable) in the proper manual.  The details of how this
+command works depend on the major mode.
 
 @kindex C-h l
 @findex view-lossage
@@ -642,24 +642,23 @@ Emacs (@code{describe-no-warranty}).
 
 @cindex tooltips
 @cindex balloon help
-  When a region of text is ``active,'' so that you can select it with
-the mouse or a key like @kbd{RET}, it often has associated help text.
-For instance, most parts of the mode line have help text.  On
-graphical displays, the help text is displayed as a ``tooltip''
-(sometimes known as ``balloon help''), when you move the mouse over
-the active text.  @xref{Tooltips}.  On some systems, it is shown in
-the echo area.  On text-only terminals, if Emacs cannot follow the
-mouse, it cannot show the help text on mouse-over.
+  When text on the screen is ``active'', so that it does something
+special in response to mouse clicks or @kbd{RET}, it often has associated
+help text.  For instance, most parts of the mode line have help text.  On
+terminals that support mouse tracking, Emacs displays the help text as a
+``tooltip'' (sometimes known as ``balloon help'') or in the echo area,
+whenever you leave the mouse stationary over the active text.
+@xref{Tooltips}.
 
 @kindex C-h .
 @findex display-local-help
 @vindex help-at-pt-display-when-idle
-  You can also access text region help info using the keyboard.  The
-command @kbd{C-h .} (@code{display-local-help}) displays any help text
-associated with the text at point, using the echo area.  If you want
-help text to be displayed automatically whenever it is available at
-point, set the variable @code{help-at-pt-display-when-idle} to
-@code{t}.
+  If your terminal doesn't support mouse-tracking, you can display the
+help text for active buffer text using the keyboard.  @kbd{C-h .}
+(@code{display-local-help}) displays any help text associated with the
+character after point, using the echo area.  To display help text
+automatically whenever it is available on the character after point, set
+the variable @code{help-at-pt-display-when-idle} to @code{t}.
 
 @ignore
    arch-tag: 6f33ab62-bc75-4367-8057-fd67cc15c3a1
index 988d5890b8cb96b1e07795fae9846b25c383587a..24337cb6f9e197b010e1b12fd547e25b1ebd2883 100644 (file)
@@ -367,7 +367,10 @@ etags @var{inputfiles}@dots{}
 
 @noindent
 The @code{etags} program reads the specified files, and writes a tags
-table named @file{TAGS} in the current working directory.
+table named @file{TAGS} in the current working directory.  You can
+optionally specify a different file name for the tags table by using the
+@samp{--output=@var{file}} option; specifying @file{-} as a file name
+prints the tags table to standard output.
 
   If the specified files don't exist, @code{etags} looks for
 compressed versions of them and uncompresses them to read them.  Under
@@ -406,7 +409,8 @@ well as the files it directly contains.
 directory where the tags file was initially written.  This way, you can
 move an entire directory tree containing both the tags file and the
 source files, and the tags file will still refer correctly to the source
-files.  If the tags file is in @file{/dev}, however, the file names are
+files.  If the tags file is @file{-} or is in the @file{/dev} directory,
+however, the file names are 
 made relative to the current working directory.  This is useful, for
 example, when writing the tags to @file{/dev/stdout}.
 
index 1cb76ee5fdfca5140ba206a65e0327bbc253a619..3980c5de003bbd666fa415dc4e16a5096ac9ae3e 100644 (file)
@@ -174,7 +174,10 @@ interpreter program names and major modes.
 systems) use the @samp{-*-} feature on the first line, because the
 system would get confused when running the interpreter.  So Emacs looks
 for @samp{-*-} on the second line in such files as well as on the
-first line.
+first line.  The same is true for man pages which start with the magic
+string @samp{'\"} to specify a list of troff preprocessors (not all do,
+however).
+
 
 @vindex default-major-mode
   When you visit a file that does not specify a major mode to use, or
index 0def4bc5c3ef6b1bfffca92e8d71655be8adb4b8..d7dd364b6d0d1d33a685dbcad3717f0178911de6 100644 (file)
@@ -1086,6 +1086,20 @@ you override it by using the command again.  The command @kbd{C-x
 @key{RET} X} (@code{set-next-selection-coding-system}) specifies the
 coding system for the next selection made in Emacs or read by Emacs.
 
+@vindex x-select-request-type
+  The variable @code{x-select-request-type} specifies the data type to
+request from the X Window System for receiving text selections from
+other applications.  If the value is @code{nil} (the default), Emacs
+tries @code{COMPOUND_TEXT} and @code{UTF8_STRING}, in this order, and
+uses various heuristics to choose the more appropriate of the two
+results; if none of these succeed, Emacs falls back on @code{STRING}.
+If the value of @code{x-select-request-type} is one of the symbols
+@code{COMPOUND_TEXT}, @code{UTF8_STRING}, @code{STRING}, or
+@code{TEXT}, Emacs uses only that request type.  If the value is a
+list of some of these symbols, Emacs tries only the request types in
+the list, in order, until one of them succeeds, or until the list is
+exhausted.
+
 @kindex C-x RET p
 @findex set-buffer-process-coding-system
   The command @kbd{C-x @key{RET} p} (@code{set-buffer-process-coding-system})
@@ -1115,6 +1129,15 @@ specified by one of the environment variables @env{LC_ALL},
 specified above, whose value is nonempty is the one that determines
 the text representation.)
 
+@vindex x-select-request-type
+  The variable @code{x-select-request-type} specifies a selection data
+type of selection to request from the X server.  The default value is
+@code{nil}, which means Emacs tries @code{COMPOUND_TEXT} and
+@code{UTF8_STRING}, and uses whichever result seems more appropriate.
+You can explicitly specify the data type by setting the variable to
+one of the symbols @code{COMPOUND_TEXT}, @code{UTF8_STRING},
+@code{STRING} and @code{TEXT}.
+
 @node File Name Coding
 @section Coding Systems for File Names
 
index 284809bdac119734f285f1a80b26fc60a1128196..586f250bd0629bb03542741f9d8125d8906b2853 100644 (file)
@@ -1,3 +1,71 @@
+2007-12-04  Richard Stallman  <rms@gnu.org>
+
+       * objects.texi (Symbol Type): Fix typo.
+
+2007-12-03  Richard Stallman  <rms@gnu.org>
+
+       * hooks.texi (Standard Hooks): Add link to Hooks for Loading.
+
+2007-12-01  Glenn Morris  <rgm@gnu.org>
+
+       * functions.texi (Declaring Functions): Improve previous change.
+
+2007-11-30  Glenn Morris  <rgm@gnu.org>
+
+       * functions.texi (Declaring Functions): Add optional fourth
+       argument of declare-function, and setting third argument to `t'.
+
+2007-11-29  Richard Stallman  <rms@gnu.org>
+
+       * customize.texi (Composite Types): Document `group' type.
+
+2007-11-29  Glenn Morris  <rgm@gnu.org>
+
+       * functions.texi (Declaring Functions): Add findex.  Mention
+       `external' files.
+
+2007-11-26  Juanma Barranquero  <lekktu@gmail.com>
+
+       * functions.texi (Declaring Functions): Fix directive.
+
+2007-11-25  Richard Stallman  <rms@gnu.org>
+
+       * help.texi (Help Functions): Clean up last change.
+
+       * advice.texi (Preactivation, Activation of Advice): Minor cleanup.
+
+       * loading.texi (Named Features): Minor cleanup.
+
+       * macros.texi (Eval During Expansion): Minor cleanup.
+
+       * variables.texi (Variable Aliases): Minor cleanup.
+
+2007-11-24  Richard Stallman  <rms@gnu.org>
+
+       * functions.texi (Declaring Functions): Clarify previous change.
+
+       * compile.texi (Compiler Errors): Clarify previous change.
+
+2007-11-24  Richard Stallman  <rms@gnu.org>
+
+       * display.texi (Refresh Screen, Forcing Redisplay):
+       Clarify the text and move items around.
+
+2007-11-24  Glenn Morris  <rgm@gnu.org>
+
+       * functions.texi (Declaring Functions): New section.
+       * compile.texi (Compiler Errors): Mention declaring functions,
+       defvar with no initvalue, and byte-compile-warnings.
+
+2007-11-15  Martin Rudalics  <rudalics@gmx.at>
+
+       * vol1.texi (Top): Remove Frame-Local Variables from Node Listing.
+       * vol2.texi (Top): Remove Frame-Local Variables from Node Listing.
+
+2007-11-13  Martin Rudalics  <rudalics@gmx.at>
+
+       * help.texi (Help Functions): Document new macro `with-help-window'.
+
 2007-11-10  Paul Pogonyshev  <pogonyshev@gmx.net>
 
        * searching.texi (Replacing Match): Describe new
        Explain string and vector representations of key sequences
 
        * keymaps.texi (Changing Key Bindings):
-       * commands.texi (Interactive Codes, Interactive Codes):
+       * commands.texi (Interactive Codes):
        * help.texi (Describing Characters): Refer to it.
 
 2006-05-23  Luc Teirlinck  <teirllm@auburn.edu>
 
        * text.texi (Undo): Document extensible undo entries.
 
-       * searching.texi (String Search, Regexp Search, Regexp Search):
-       Cleanups.
+       * searching.texi (String Search, Regexp Search): Cleanups.
 
        * nonascii.texi (Character Codes): Minor fix.
 
index 7eb89d7bd4152f6be33c871f66fe197b3e479b23..168135ef794b02e40a486893e839b34e4ec75cae 100644 (file)
@@ -448,7 +448,7 @@ that results from activating advice for a function.
 A value of @code{always} specifies to compile unconditionally.
 A value of @code{never} specifies never compile the advice.
 
-A value of @code{maybe} specifies to compile if the byte-compiler is
+A value of @code{maybe} specifies to compile if the byte compiler is
 already loaded.  A value of @code{like-original} specifies to compile
 the advice if the original definition of the advised function is
 compiled or a built-in function.
@@ -545,11 +545,11 @@ work properly, because of a mismatch.
 Activation of the advised
 function takes longer than usual.
 @item
-The byte-compiler gets
+The byte compiler gets
 loaded while an advised function gets activated.
 @item
 @code{byte-compile} is included in the value of @code{features} even
-though you did not ever explicitly use the byte-compiler.
+though you did not ever explicitly use the byte compiler.
 @end itemize
 
 Compiled preactivated advice works properly even if the function itself
index aeaa9f79eb82b00e9721a893d1ee87b79713ef17..292c52a6dfa1bb891b1e9e2c44de796b86f4107b 100644 (file)
@@ -505,9 +505,14 @@ The call to @var{func} must be in the @var{then-form} of the
 @code{if}, and @var{func} must appear quoted in the call to
 @code{fboundp}.  (This feature operates for @code{cond} as well.)
 
-  Likewise, you can suppress a compiler warning for an unbound variable
-@var{variable} by conditionalizing its use on a @code{boundp} test,
-like this:
+  You can tell the compiler that a function is defined using
+@code{declare-function} (@pxref{Declaring Functions}).  Likewise, you
+can tell the compiler that a variable is defined using @code{defvar}
+with no initial value.
+
+  You can suppress the compiler warning for a specific use of an
+undefined variable @var{variable} by conditionalizing its use on a
+@code{boundp} test, like this:
 
 @example
 (if (boundp '@var{variable}) ...@var{variable}...)
@@ -518,8 +523,8 @@ The reference to @var{variable} must be in the @var{then-form} of the
 @code{if}, and @var{variable} must appear quoted in the call to
 @code{boundp}.
 
-  You can suppress any compiler warnings using the construct
-@code{with-no-warnings}:
+  You can suppress any and all compiler warnings within a certain
+expression using the construct @code{with-no-warnings}:
 
 @c This is implemented with a defun, but conceptually it is
 @c a special form.
@@ -530,9 +535,13 @@ but the compiler does not issue warnings for anything that occurs
 inside @var{body}.
 
 We recommend that you use this construct around the smallest
-possible piece of code.
+possible piece of code, to avoid missing possible warnings other than one
+one you intend to suppress.
 @end defspec
 
+  More precise control of warnings is possible by setting the variable
+@code{byte-compile-warnings}.
+
 @node Byte-Code Objects
 @section Byte-Code Function Objects
 @cindex compiled function
index 7c723a29f28898d2742af59572e8798ceb95133f..b97ce20fc228609d006078c37c13a9e4c5b7d0da 100644 (file)
@@ -755,6 +755,11 @@ string, and the third a function.
 In the customization buffer, each element is displayed and edited
 separately, according to the type specified for it.
 
+@item (group @var{element-types}@dots{})
+This works like @code{list} except for the formatting
+of text in the Custom buffer.  @code{list} labels each
+element value with its tag; @code{group} does not.
+
 @item (vector @var{element-types}@dots{})
 Like @code{list} except that the value must be a vector instead of a
 list.  The elements work the same as in @code{list}.
index 4c9df9c5ede6ad9804848d4b82a06d1b80188a66..165636006d3f72ab6dc36460af6f46dbc4c1994b 100644 (file)
@@ -55,21 +55,10 @@ This function clears and redisplays frame @var{frame}.
 This function clears and redisplays all visible frames.
 @end deffn
 
-  This function calls for redisplay of certain windows, the next time
-redisplay is done, but does not clear them first.
-
-@defun force-window-update &optional object
-This function forces some or all windows to be updated on next redisplay.
-If @var{object} is a window, it forces redisplay of that window.  If
-@var{object} is a buffer or buffer name, it forces redisplay of all
-windows displaying that buffer.  If @var{object} is @code{nil} (or
-omitted), it forces redisplay of all windows.
-@end defun
-
-  Processing user input takes absolute priority over redisplay.  If you
-call these functions when input is available, they do nothing
-immediately, but a full redisplay does happen eventually---after all the
-input has been processed.
+  In Emacs, processing user input takes priority over redisplay.  If
+you call these functions when input is available, they don't redisplay
+immediately, but the requested redisplay does happen
+eventually---after all the input has been processed.
 
   Normally, suspending and resuming Emacs also refreshes the screen.
 Some terminal emulators record separate contents for display-oriented
@@ -89,11 +78,56 @@ to redraw, @code{nil} means redrawing is needed.  The default is @code{nil}.
 @section Forcing Redisplay
 @cindex forcing redisplay
 
+  Emacs normally tries to redisplay the screen whenever it waits for
+input.  With this function you can request an immediate attempt to
+redisplay, in the middle of Lisp code, without actually waiting for
+input.
+
+@defun redisplay &optional force
+This function tries immediately to redisplay, provided there are no
+pending input events.  It is equivalent to @code{(sit-for 0)}.
+
+If the optional argument @var{force} is non-@code{nil}, it does all
+pending redisplay work even if input is available, with no
+pre-emption.
+
+The function returns @code{t} if it actually tried to redisplay, and
+@code{nil} otherwise.  A value of @code{t} does not mean that
+redisplay proceeded to completion; it could have been pre-empted by
+newly arriving terminal input.
+@end defun
+
+  @code{redisplay} with no argument tries immediately to redisplay,
+but has no effect on the usual rules for what parts of the screen to
+redisplay.  By contrast, the following function adds certain windows
+to the pending redisplay work (as if their contents had completely
+changed), but doesn't immediately try to do any redisplay work.
+
+@defun force-window-update &optional object
+This function forces some or all windows to be updated on next
+redisplay.  If @var{object} is a window, it requires eventual
+redisplay of that window.  If @var{object} is a buffer or buffer name,
+it requires eventual redisplay of all windows displaying that buffer.
+If @var{object} is @code{nil} (or omitted), it requires eventual
+redisplay of all windows.
+@end defun
+
+  @code{force-window-update} does not do a redisplay immediately.
+(Emacs will do that when it waits for input.)  Rather, its effect is
+to put more work on the queue to be done by redisplay whenever there
+is a chance.
+
   Emacs redisplay normally stops if input arrives, and does not happen
 at all if input is available before it starts.  Most of the time, this
 is exactly what you want.  However, you can prevent preemption by
 binding @code{redisplay-dont-pause} to a non-@code{nil} value.
 
+@defvar redisplay-dont-pause
+If this variable is non-@code{nil}, pending input does not
+prevent or halt redisplay; redisplay occurs, and finishes,
+regardless of whether input is available.
+@end defvar
+
 @defvar redisplay-preemption-period
 This variable specifies how many seconds Emacs waits between checks
 for new input during redisplay.  (The default is 0.1 seconds.)  If
@@ -107,22 +141,6 @@ This variable is only obeyed on graphical terminals.  For
 text terminals, see @ref{Terminal Output}.
 @end defvar
 
-@defvar redisplay-dont-pause
-If this variable is non-@code{nil}, pending input does not
-prevent or halt redisplay; redisplay occurs, and finishes,
-regardless of whether input is available.
-@end defvar
-
-@defun redisplay &optional force
-This function performs an immediate redisplay provided there are no
-pending input events.  This is equivalent to @code{(sit-for 0)}.
-
-If the optional argument @var{force} is non-@code{nil}, it forces an
-immediate and complete redisplay even if input is available.
-
-Returns @code{t} if redisplay was performed, or @code{nil} otherwise.
-@end defun
-
 @node Truncation
 @section Truncation
 @cindex line wrapping
index 601644629e5f4d2997820ebcf40100c5260fff52..3767e778cf76a49d2cd438306b45ad094061fe8b 100644 (file)
@@ -23,6 +23,7 @@ define them.
                             of a symbol.
 * Obsolete Functions::    Declaring functions obsolete.
 * Inline Functions::     Defining functions that the compiler will open code.
+* Declaring Functions::   Telling the compiler that a function is defined.
 * Function Safety::       Determining whether a function is safe to call.
 * Related Topics::        Cross-references to specific Lisp primitives
                             that have a special bearing on how functions work.
@@ -1222,6 +1223,88 @@ do for macros.  (@xref{Argument Evaluation}.)
 Inline functions can be used and open-coded later on in the same file,
 following the definition, just like macros.
 
+@node Declaring Functions
+@section Telling the Compiler that a Function is Defined
+@cindex function declaration
+@cindex declaring functions
+@findex declare-function
+
+Byte-compiling a file often produces warnings about functions that the
+compiler doesn't know about (@pxref{Compiler Errors}).  Sometimes this
+indicates a real problem, but usually the functions in question are
+defined in other files which would be loaded if that code is run.  For
+example, byte-compiling @file{fortran.el} used to warn:
+
+@smallexample
+In end of data:
+fortran.el:2152:1:Warning: the function `gud-find-c-expr' is not known to be defined.
+@end smallexample
+
+In fact, @code{gud-find-c-expr} is only used in the function that
+Fortran mode uses for the local value of
+@code{gud-find-expr-function}, which is a callback from GUD; if it is
+called, the GUD functions will be loaded.  When you know that such a
+warning does not indicate a real problem, it is good to suppress the
+warning.  That makes new warnings which might mean real problems more
+visible.  You do that with @code{declare-function}.
+
+All you need to do is add a @code{declare-function} statement before the
+first use of the function in question:
+
+@smallexample
+(declare-function gud-find-c-expr "gud.el" nil)
+@end smallexample
+
+This says that @code{gud-find-c-expr} is defined in @file{gud.el} (the
+@samp{.el} can be omitted).  The compiler takes for granted that that file
+really defines the function, and does not check.
+
+  The optional third argument specifies the argument list of
+@code{gud-find-c-expr}.  In this case, it takes no arguments
+(@code{nil} is different from not specifying a value).  In other
+cases, this might be something like @code{(file &optional overwrite)}.
+You don't have to specify the argument list, but if you do the
+byte compiler can check that the calls match the declaration.
+
+@defmac declare-function function file &optional arglist fileonly
+Tell the byte compiler to assume that @var{function} is defined, with
+arguments @var{arglist}, and that the definition should come from
+the file @var{file}.  @var{fileonly} non-nil means only check that
+@var{file} exists, not that it actually defines @var{function}.
+@end defmac
+
+  To verify that these functions really are declared where
+@code{declare-function} says they are, use @code{check-declare-file}
+to check all @code{declare-function} calls in one source file, or use
+@code{check-declare-directory} check all the files in and under a
+certain directory.
+
+  These commands find the file that ought to contain a function's
+definition using @code{locate-library}; if that finds no file, they
+expand the definition file name relative to the directory of the file
+that contains the @code{declare-function} call.
+
+  You can also say that a function is defined by C code by specifying
+a file name ending in @samp{.c}.  @code{check-declare-file} looks for
+these files in the C source code directory.  This is useful only when
+you call a function that is defined only on certain systems.  Most
+of the primitive functions of Emacs are always defined so they will
+never give you a warning.
+
+  Sometimes a file will optionally use functions from an external package.
+If you prefix the filename in the @code{declare-function} statement with
+@samp{ext:}, then it will be checked if it is found, otherwise skipped
+without error.
+
+  There are some function definitions that @samp{check-declare} does not
+understand (e.g. @code{defstruct} and some other macros).  In such cases,
+you can pass a non-@code{nil} @var{fileonly} argument to
+@code{declare-function}, meaning to only check that the file exists, not
+that it actually defines the function.  Note that to do this without
+having to specify an argument list, you should set the @var{arglist}
+argument to @code{t} (because @code{nil} means an empty argument list, as
+opposed to an unspecified one).
+
 @node Function Safety
 @section Determining whether a Function is Safe to Call
 @cindex function safety
index 64b6a6ecfa2f212a06b912b67d0e859e87e92388..1454e5ab95e601421b2be8cea15ab7f0095de3da 100644 (file)
@@ -687,6 +687,18 @@ This macro is used in the command @code{help-for-help} which is the
 binding of @kbd{C-h C-h}.
 @end defmac
 
+@defmac with-help-window buffer-name body@dots{}
+This macro evaluates the @var{body} forms, inserting any output they
+produce into a buffer named @var{buffer-name} like
+@code{with-output-to-temp-buffer} (@pxref{Temporary Displays}).  It
+also puts that buffer in Help mode, displays a message telling the
+user how to quit and scroll the help window, and does various other
+things that make a help window work better.
+
+Don't use @code{print-help-return-message} in the body of this macro;
+it would cause bad results.
+@end defmac
+
 @defopt three-step-help
 If this variable is non-@code{nil}, commands defined with
 @code{make-help-screen} display their @var{help-line} strings in the
index d0bb2de8675f0404b19062aafe627290c13949bc..3f7f4b4d8bb5b0a5336f83045e10484010bd420d 100644 (file)
@@ -31,6 +31,10 @@ these functions are called in a special way (they are passed arguments,
 or their values are used). The variables whose names end in
 @samp{-function} have single functions as their values.
 
+A special feature allows you to specify expressions to evaluate if and
+when a file is loaded (@pxref{Hooks for Loading}).  That feature is
+not exactly a hook, but does a similar job.
+
 @c We need to xref to where each hook is documented or else document
 @c it here.
 
index cbea262cc45ecdd91f8ac2659018047faef07a6b..06f9b6bc0162a8e2c88f6a68067e2f5ae73e9fa4 100644 (file)
@@ -692,7 +692,7 @@ done.
   When @code{require} is used at top level in a file, it takes effect
 when you byte-compile that file (@pxref{Byte Compilation}) as well as
 when you load it.  This is in case the required package contains macros
-that the byte compiler must know about.  It also avoids byte-compiler
+that the byte compiler must know about.  It also avoids byte compiler
 warnings for functions and variables defined in the file loaded with
 @code{require}.
 
index 152b7b652b6d88159a52433392a37f82e384826c..81477bb2effc020e4567de476f2c7c126511cfe3 100644 (file)
@@ -623,7 +623,7 @@ it.  Here is an example:
 
   Another problem with calling @code{eval} in a macro definition is that
 it probably won't do what you intend in a compiled program.  The
-byte-compiler runs macro definitions while compiling the program, when
+byte compiler runs macro definitions while compiling the program, when
 the program's own computations (which you might have wished to access
 with @code{eval}) don't occur and its local variable bindings don't
 exist.
index 0da054888588cf6bc102838df466ac874f8d3b2b..64c79d6316262e92474c91cfb243514988693bad 100644 (file)
@@ -525,7 +525,7 @@ bit values are 2**22 for alt, 2**23 for super and 2**24 for hyper.
 
   A @dfn{symbol} in GNU Emacs Lisp is an object with a name.  The
 symbol name serves as the printed representation of the symbol.  In
-ordinary Lisp use, with one single obarray (@pxref{Creating Symbols},
+ordinary Lisp use, with one single obarray (@pxref{Creating Symbols}),
 a symbol's name is unique---no two symbols have the same name.
 
   A symbol can serve as a variable, as a function name, or to hold a
index 0ca217dbe475e95914f074d7d80b025b2c660912..aee7d4f8be3484b5b9ab8f9efb18fc163d12b3a3 100644 (file)
@@ -1701,7 +1701,7 @@ the old name is obsolete and therefore that it may be removed at some
 stage in the future.
 
 @defun make-obsolete-variable obsolete-name current-name &optional when
-This function makes the byte-compiler warn that the variable
+This function makes the byte compiler warn that the variable
 @var{obsolete-name} is obsolete.  If @var{current-name} is a symbol, it is
 the variable's new name; then the warning message says to use
 @var{current-name} instead of @var{obsolete-name}.  If @var{current-name}
index d41b2f076df52672314dbd5584d3c356a89fa64f..5784ed0b19bcf46b0eb16dbb3b684acc81b51b2a 100644 (file)
@@ -441,7 +441,6 @@ Variables
 * Setting Variables::       Storing new values in variables.
 * Variable Scoping::        How Lisp chooses among local and global values.
 * Buffer-Local Variables::  Variable values in effect only in one buffer.
-* Frame-Local Variables::   Variable values in effect only in one frame.
 * Future Local Variables::  New kinds of local values we might add some day.
 * File Local Variables::    Handling local variable lists in files.
 * Variable Aliases::        Variables that are aliases for other variables.
index 515973c6281814395f23b64cfb94aa568ce6b2a7..c27f004e16f4a673b08da89c5438f9ed97d787e1 100644 (file)
@@ -440,7 +440,6 @@ Variables
 * Setting Variables::       Storing new values in variables.
 * Variable Scoping::        How Lisp chooses among local and global values.
 * Buffer-Local Variables::  Variable values in effect only in one buffer.
-* Frame-Local Variables::   Variable values in effect only in one frame.
 * Future Local Variables::  New kinds of local values we might add some day.
 * File Local Variables::    Handling local variable lists in files.
 * Variable Aliases::        Variables that are aliases for other variables.
index 24cae258db59ec27e2abaa433a633dddd771d930..90346a186a78b158abb5af73043335d6c5571b5d 100644 (file)
@@ -1,3 +1,12 @@
+2007-11-22  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * etags.1: Ctags and Etags now share the same defaults, so remove
+       --defines, --globals, --members, --typedefs, --typedefs-and-c++.
+
+2007-11-15  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * etags.1: Note that you can use "-" for stdout with -o.
+
 2007-09-06  Glenn Morris  <rgm@gnu.org>
 
        * ctags.1, emacs.1, emacsclient.1, etags.1: Move from etc/ to
index 04b67f389f4965ee93cba199c9ca546b627dccb9..897cd0b881a99960c015fbfbcb4a9ae617fd1236 100644 (file)
@@ -32,11 +32,10 @@ etags, ctags \- generate tag file for Emacs, vi
 [\|\-\-parse\-stdin=\fIfile\fP\|]
 .br
 [\|\-\-append\|] [\|\-\-backward\-search\|]
-[\|\-\-cxref\|] [\|\-\-defines\|] [\|\-\-forward\-search\|]
-[\|\-\-globals\|] [\|\-\-ignore\-indentation\|]
-[\|\-\-language=\fIlanguage\fP\|] [\|\-\-members\|]
+[\|\-\-cxref\|] [\|\-\-no\-defines\|] [\|\-\-forward\-search\|]
+[\|\-\-no\-globals\|] [\|\-\-ignore\-indentation\|]
+[\|\-\-language=\fIlanguage\fP\|] [\|\-\-no\-members\|]
 [\|\-\-output=\fItagfile\fP\|] [\|\-\-regex=\fIregexp\fP\|]
-[\|\-\-typedefs\|] [\|\-\-typedefs\-and\-c++\|]
 [\|\-\-update\|]
 [\|\-\-help\|] [\|\-\-version\|]
 \fIfile\fP .\|.\|.
@@ -59,9 +58,9 @@ table (defaults: \fBTAGS\fP for \fBetags\fP, \fBtags\fP for
 \fBctags\fP) in the current working directory.
 Files specified with relative file names will be recorded in the tag
 table with file names relative to the directory where the tag table
-resides.  If the tag table is in /dev, however, the file names are made
-relative to the working directory.  Files specified with absolute file
-names will be recorded
+resides.  If the tag table is in /dev or is the standard output,
+however, the file names are made relative to the working directory.
+Files specified with absolute file names will be recorded
 with absolute file names.  Files generated from a source file\-\-like
 a C file generated from a source Cweb file\-\-will be recorded with
 the name of the source file.
@@ -91,28 +90,14 @@ Only \fBctags\fP accepts this option.
 In C and derived languages, create tags for function declarations,
 and create tags for extern variables unless \-\-no\-globals is used.
 .TP
-.B \-d, \-\-defines
-Create tag entries for C preprocessor constant definitions
-and enum constants, too.  Since this is the default behavior of
-\fBetags\fP, only \fBctags\fP accepts this option.
-.TP
 .B \-D, \-\-no\-defines
 Do not create tag entries for C preprocessor constant definitions
 and enum constants.
 This may make the tags file much smaller if many header files are tagged.
-Since this is the default behavior of \fBctags\fP, only \fBetags\fP
-accepts this option.
-.TP
-.B \-\-globals
-Create tag entries for global variables in C, C++, Objective C, Java,
-and Perl.
-Since this is the default behavior of \fBetags\fP, only \fBctags\fP
-accepts this option.
 .TP
 .B \-\-no\-globals
 Do not tag global variables.  Typically this reduces the file size by
-one fourth.  Since this is the default behavior of \fBctags\fP, only
-\fBetags\fP accepts this option.
+one fourth.
 .TP
 \fB\-i\fP \fIfile\fP, \fB\-\-include=\fIfile\fP
 Include a note in the tag file indicating that, when searching for a
@@ -135,10 +120,10 @@ regexp matching is done in this case (see the \fB\-\-regex\fP option).
 .TP
 .B \-\-members
 Create tag entries for variables that are members of structure-like
-constructs in C++, Objective C, Java.  This is the default for etags.
+constructs in C++, Objective C, Java.  This is the default.
 .TP
 .B \-\-no\-members
-Do not tag member variables.  This is the default for ctags.
+Do not tag member variables.
 .TP
 .B \-\-packages\-only
 Only tag packages in Ada files.
@@ -149,8 +134,9 @@ May be used (only once) in place of a file name on the command line.
 as belonging to the file \fBFILE\fP.
 .TP
 \fB\-o\fP \fItagfile\fP, \fB\-\-output=\fItagfile\fP
-Explicit name of file for tag table; overrides default \fBTAGS\fP or
-\fBtags\fP.   (But ignored with \fB\-v\fP or \fB\-x\fP.)
+Explicit name of file for tag table; for \fBetags\fP only, a file name
+of \- means standard output; overrides default \fBTAGS\fP or \fBtags\fP.
+(But ignored with \fB\-v\fP or \fB\-x\fP.)
 .TP
 \fB\-r\fP \fIregexp\fP, \fB\-\-regex=\fIregexp\fP
 
@@ -241,15 +227,6 @@ reads the regexes contained in the file regex.file.
 Don't do any more regexp matching on the following files.  May be
 freely intermixed with filenames and the \fB\-\-regex\fP option.
 .TP
-.B \-t, \-\-typedefs
-Record typedefs in C code as tags.  Since this is the default behavior
-of \fBetags\fP, only \fBctags\fP accepts this option.
-.TP
-.B \-T, \-\-typedefs\-and\-c++
-Generate tag entries for typedefs, struct, enum, and union tags, and
-C++ member functions.  Since this is the default behavior
-of \fBetags\fP, only \fBctags\fP accepts this option.
-.TP
 .B \-u, \-\-update
 Update tag entries for \fIfiles\fP specified on command line, leaving
 tag entries for other files in place.  Currently, this is implemented
index 63f9a6e596feda63252f03eaecdd760cf1cc9071..61fd28a0622a30059bda13d00b79e1559ebebb29 100644 (file)
@@ -1,9 +1,125 @@
+2007-12-03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus.texi (Other Files): Add the yenc command.
+
+2007-11-30  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (MIME Commands): Default of gnus-article-loose-mime is t
+       since 2004-08-06.
+
+2007-11-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus.texi (Fancy Mail Splitting): Fix description of splitting based
+       on body.
+
+2007-11-27  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * emacs-mime.texi (rfc2047): Mention rfc2047-encoded-word-regexp-loose
+       and rfc2047-allow-irregular-q-encoded-words; fix description of
+       rfc2047-encode-encoded-words.
+
+2007-11-24  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Fetching Mail): Remove obsoleted `nnmail-spool-file'.
+
+2007-12-05  Michael Olson  <mwolson@gnu.org>
+
+       * remember.texi (Diary): Remove "require" line for remember-diary.el.
+       Update documentation for `remember-diary-file'.
+
+2007-12-04  Michael Albinus  <michael.albinus@gmx.de>
+
+       * dbus.texi (Signals): Precise `dbus-register-signal'.
+       (Errors and Events): Rework events part, the internal structure of
+       dbus-event has changed.
+
+2007-12-03  Juanma Barranquero  <lekktu@gmail.com>
+
+       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS, clean): Add dbus.
+       ($(infodir)/dbus, dbus.dvi): New targets.
+
+2007-12-03  Michael Albinus  <michael.albinus@gmx.de>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Apply dbus and dbus.dvi
+       unconditionally.
+
+       * dbus.texi (Synchronous Methods): Show the result of the "lshal"
+       emulation with @print{}.
+
+2007-12-02  Richard Stallman  <rms@gnu.org>
+
+       * dbus.texi (Overview): Minor cleanup.
+
+2007-12-02  Michael Albinus  <michael.albinus@gmx.de>
+
+       * Makefile.in (INFO_TARGETS): Add dbus.
+       (DVI_TARGETS): Add dbus.dvi.
+       (dbus, dbus.dvi): New targets.
+
+       * dbus.texi: New file.
+
+2007-11-24  Romain Francoise  <romain@orebokech.com>
+
+       * nxml-mode.texi: Add description in @direntry.
+       Fix file name to match @setfilename.
+
+2007-11-23  Mark A. Hershberger  <mah@everybody.org>
+
+       * Makefile.in (INFO_TARGETS, DVI_TARGETS): Add nxml-mode.
+       ($(infodir)/nxml-mode): New rule.
+
+       * makefile.w32-in (INFO_TARGETS, DVI_TARGETS): Add nxml-mode.
+       ($(infodir)/nxml-mode): New rule.
+       (clean): Add nxml-mode*.
+
+       * nxml-mode.texi: New file with nxml manual.
+
+2007-11-18  Richard Stallman  <rms@gnu.org>
+
+       * flymake.texi (Example -- Configuring a tool called directly):
+       Update example.
+
+2007-11-18  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Filename completion): Simplify explanation of
+       double-slash behaviour.  Explain directory contents flushing.
+
+2007-11-16  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (TeX and LaTeX Language Modes): Put in
+       missing braces.
+
+2007-11-15  Richard Stallman  <rms@gnu.org>
+
+       * cl.texi (Equality Predicates): Delete `eql'.
+       (Predicates, Naming Conventions, Top): Delete `eql'.
+       (Common Lisp Compatibility): Delete `eql'.
+       (Porting Common Lisp): Delete obsolete backquote info.
+       Minor clarification about character constants.
+       (Sequence Basics): Minor clarification.
+
+2007-11-15  Juanma Barranquero  <lekktu@gmail.com>
+
+       * cc-mode.texi (Electric Keys, Custom Macros):
+       * tramp.texi (Filename completion): Fix typos.
+
+2007-11-15  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc.texi (Basic commands): Mention the menu.
+
+2007-11-12  Michael Albinus  <michael.albinus@gmx.de>
+
+       * tramp.texi (Connection caching): Tramp flushes connection
+       properties when remote operating system has been changed.
+
 2007-11-09  Reiner Steib  <Reiner.Steib@gmx.de>
 
        * gnus-news.texi: Fix spelling.
        `message-insert-formatted-citation-line', not
        `message-insert-formated-citation-line'.
 
+       * gnus.texi, gnus-faq.texi, message.texi: Bump version to 5.10.9.
+
 2007-11-07  Michael Albinus  <michael.albinus@gmx.de>
 
        * tramp.texi (Overview): Mention also the PuTTY integration under
        (Keystrokes): Document C-c C-k.
        (Introduction): Fix typographical issue with "---".
 
+2007-10-29  Richard Stallman  <rms@gnu.org>
+
+       * widget.texi (Introduction): Delete discussion of implementation
+       internals.
+
 2007-10-29  Michael Albinus  <michael.albinus@gmx.de>
 
        * tramp.texi (Connection caching): Host names must be different
 
        * gnus.texi (Top): Add SASL.
 
+2007-10-27  Emanuele Giaquinta  <e.giaquinta@glauco.it>  (tiny change)
+
+       * gnus-faq.texi ([5.12]): Remove reference to discontinued service.
+
+2007-10-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus.texi (Troubleshooting): Adjust Gnus version number.
+
 2007-10-27  Jay Belanger  <jay.p.belanger@gmail.com>
 
        * calc.texi (Formulas, Composition Basics): Lower the
        (Custom Filling and Breaking, Custom Braces, Syntactic Symbols)
        (Line-Up Functions, Custom Macros):
        * ediff.texi (Window and Frame Configuration)
-       (Highlighting Difference Regions, Highlighting Difference Regions):
+       (Highlighting Difference Regions):
        * emacs-mime.texi (Display Customization):
        * erc.texi (History):
        * eshell.texi (Known problems):
        * gnus.texi (NNTP, IMAP, Advanced Scoring Examples)
        (The problem of spam, SpamOracle, Extending the Spam package)
        (Conformity, Terminology):
-       * idlwave.texi (Routine Info, Routine Info)
+       * idlwave.texi (Routine Info)
        (Class and Keyword Inheritance, Padding Operators)
        (Breakpoints and Stepping, Electric Debug Mode)
        (Examining Variables, Troubleshooting):
index 93982f419dca239fea24bc0594ea1dda8ffb81ae..e8ab579c079a344fb7c8cc37d95dffb325814068 100644 (file)
@@ -44,6 +44,7 @@ INFO_TARGETS = \
        $(infodir)/calc \
        $(infodir)/ccmode \
        $(infodir)/cl \
+       $(infodir)/dbus \
        $(infodir)/dired-x \
        $(infodir)/ebrowse \
        $(infodir)/ediff \
@@ -60,6 +61,7 @@ INFO_TARGETS = \
        $(infodir)/message \
        $(infodir)/mh-e \
        $(infodir)/newsticker \
+       $(infodir)/nxml-mode \
        $(infodir)/org \
        $(infodir)/pcl-cvs \
        $(infodir)/pgg \
@@ -84,6 +86,7 @@ DVI_TARGETS = \
        calc.dvi \
        cc-mode.dvi \
        cl.dvi \
+       dbus.dvi \
        dired-x.dvi \
        ebrowse.dvi \
        ediff.dvi \
@@ -100,6 +103,7 @@ DVI_TARGETS = \
        message.dvi \
        mh-e.dvi \
        newsticker.dvi \
+       nxml-mode.dvi \
        org.dvi \
        pcl-cvs.dvi \
        pgg.dvi \
@@ -173,6 +177,12 @@ $(infodir)/cl: cl.texi
 cl.dvi: cl.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/cl.texi
 
+dbus : $(infodir)/dbus
+$(infodir)/dbus: dbus.texi
+       cd $(srcdir); $(MAKEINFO) dbus.texi
+dbus.dvi: dbus.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/dbus.texi
+
 dired-x : $(infodir)/dired-x
 $(infodir)/dired-x: dired-x.texi
        cd $(srcdir); $(MAKEINFO) dired-x.texi
@@ -278,6 +288,12 @@ $(infodir)/newsticker: newsticker.texi
 newsticker.dvi: newsticker.texi
        $(ENVADD) $(TEXI2DVI) ${srcdir}/newsticker.texi
 
+nxml-mode : $(infodir)/nxml-mode
+$(infodir)/nxml-mode: nxml-mode.texi
+       cd $(srcdir); $(MAKEINFO) nxml-mode.texi
+nxml-mode.dvi: nxml-mode.texi
+       $(ENVADD) $(TEXI2DVI) ${srcdir}/nxml-mode.texi
+
 org : $(infodir)/org
 $(infodir)/org: org.texi
        cd $(srcdir); $(MAKEINFO) org.texi
index 2441f0c116693a72823e28a1c5a8ae3619d8acc1..b8a42f3c74622168d707b3c4baab6cc901e95b90 100644 (file)
@@ -9667,6 +9667,11 @@ is like @kbd{M-x} except that it enters the initial string @samp{calc-}
 for you.  For example, the following key sequences are equivalent:
 @kbd{S}, @kbd{M-x calc-sin @key{RET}}, @kbd{x sin @key{RET}}.
 
+Although Calc is designed to be used from the keyboard, some of
+Calc's more common commands are available from a menu.  In the menu, the
+arguments to the functions are given by referring to their stack level
+numbers.
+
 @cindex Extensions module
 @cindex @file{calc-ext} module
 The Calculator exists in many parts.  When you type @kbd{C-x * c}, the
@@ -14001,7 +14006,7 @@ mode may display it differently.
 Formulas are entered and displayed in the appropriate notation;
 @texline @math{\sin(a/b)}
 @infoline @expr{sin(a/b)}
-will appear as @samp{\sin\left( a \over b \right)} in @TeX{} mode and
+will appear as @samp{\sin\left( @{a \over b@} \right)} in @TeX{} mode and
 @samp{\sin\left(\frac@{a@}@{b@}\right)} in La@TeX{} mode.
 Math formulas are often enclosed by @samp{$ $} signs in @TeX{} and
 La@TeX{}; these should be omitted when interfacing with Calc.  To Calc,
index f4d65ed07aa3b8acb7d58e9ebac5828edd5431a5..7c9a2ac1f1bb99babb63f679b1b15808b4134d1a 100644 (file)
@@ -1228,7 +1228,7 @@ reindenting the line.  This reindentation saves you from having to
 reindent a line manually after typing, say, a @samp{@}}.  A few
 keywords, such as @code{else}, also trigger electric action.
 
-You can inhibit the electric behaviour described here by disabling
+You can inhibit the electric behavior described here by disabling
 electric minor mode (@pxref{Minor Modes}).
 
 Common to all these keys is that they only behave electrically when
@@ -1281,7 +1281,7 @@ whitespace before it).
 Additionally, you can configure @ccmode{} so that typing a slash at
 the start of a line within a block comment will terminate the
 comment.  You don't need to have electric minor mode enabled to get
-this behaviour.  @xref{Clean-ups}.
+this behavior.  @xref{Clean-ups}.
 
 In AWK mode, @samp{*} and @samp{/} do not delimit comments and are not
 electric.
@@ -6458,7 +6458,7 @@ functions to this hook, not remove them.  @xref{Style Variables}.
 @comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 Normally, the lines in a multi-line macro are indented relative to
-each other as though they were code.  You can suppress this behaviour
+each other as though they were code.  You can suppress this behavior
 by setting the following user option:
 
 @defopt c-syntactic-indentation-in-macros
index c27021cb3253396dbc77f80ac5d5e805db11c817..ea485ef84f8200a4a53980b9ec33292b13582e33 100644 (file)
@@ -62,14 +62,14 @@ does assume a basic familiarity with Emacs Lisp.
 @menu
 * Overview::             Installation, usage, etc.
 * Program Structure::    Arglists, `eval-when', `defalias'
-* Predicates::           `typep', `eql', and `equalp'
+* Predicates::           `typep' and `equalp'
 * Control Structure::    `setf', `do', `loop', etc.
 * Macros::               Destructuring, `define-compiler-macro'
 * Declarations::         `proclaim', `declare', etc.
 * Symbols::              Property lists, `gensym'
 * Numbers::              Predicates, functions, random numbers
 * Sequences::            Mapping, functions, searching, sorting
-* Lists::                `cadr', `sublis', `member*', `assoc*', etc.
+* Lists::                `caddr', `sublis', `member*', `assoc*', etc.
 * Structures::           `defstruct'
 * Assertions::           `check-type', `assert', `ignore-errors'.
 
@@ -287,7 +287,7 @@ The following simple functions and macros are defined in @file{cl.el};
 they do not cause other components like @file{cl-extra} to be loaded.
 
 @example
-eql           floatp-safe   endp
+floatp-safe   endp
 evenp         oddp          plusp         minusp
 caaar .. cddddr
 list*         ldiff         rest          first .. tenth
@@ -700,7 +700,7 @@ facts are true or false.
 
 @menu
 * Type Predicates::      `typep', `deftype', and `coerce'
-* Equality Predicates::  `eql' and `equalp'
+* Equality Predicates::  `equalp'
 @end menu
 
 @node Type Predicates, Equality Predicates, Predicates, Predicates
@@ -840,40 +840,7 @@ arguments to specify the type of sequence to return.  @xref{Sequences}.
 @section Equality Predicates
 
 @noindent
-This package defines two Common Lisp predicates, @code{eql} and
-@code{equalp}.
-
-@defun eql a b
-This function is almost the same as @code{eq}, except that if @var{a}
-and @var{b} are numbers of the same type, it compares them for numeric
-equality (as if by @code{equal} instead of @code{eq}).  This makes a
-difference only for versions of Emacs that are compiled with
-floating-point support.  Emacs floats are allocated
-objects just like cons cells, which means that @code{(eq 3.0 3.0)}
-will not necessarily be true---if the two @code{3.0}s were allocated
-separately, the pointers will be different even though the numbers are
-the same.  But @code{(eql 3.0 3.0)} will always be true.
-
-The types of the arguments must match, so @code{(eql 3 3.0)} is
-still false.
-
-Note that Emacs integers are ``direct'' rather than allocated, which
-basically means @code{(eq 3 3)} will always be true.  Thus @code{eq}
-and @code{eql} behave differently only if floating-point numbers are
-involved, and are indistinguishable on Emacs versions that don't
-support floats.
-
-There is a slight inconsistency with Common Lisp in the treatment of
-positive and negative zeros.  Some machines, notably those with IEEE
-standard arithmetic, represent @code{+0} and @code{-0} as distinct
-values.  Normally this doesn't matter because the standard specifies
-that @code{(= 0.0 -0.0)} should always be true, and this is indeed
-what Emacs Lisp and Common Lisp do.  But the Common Lisp standard
-states that @code{(eql 0.0 -0.0)} and @code{(equal 0.0 -0.0)} should
-be false on IEEE-like machines; Emacs Lisp does not do this, and in
-fact the only known way to distinguish between the two zeros in Emacs
-Lisp is to @code{format} them and check for a minus sign.
-@end defun
+This package defines the Common Lisp predicate @code{equalp}.
 
 @defun equalp a b
 This function is a more flexible version of @code{equal}.  In
@@ -3685,7 +3652,7 @@ the same sequence, in the same order as they appear in that sequence.)
 The @code{:test} argument specifies a function which must return
 true (non-@code{nil}) to indicate a match; instead, you may use
 @code{:test-not} to give a function which returns @emph{false} to
-indicate a match.  The default test function is @code{:test 'eql}.
+indicate a match.  The default test function is @code{eql}.
 
 Many functions which take @var{item} and @code{:test} or @code{:test-not}
 arguments also come in @code{-if} and @code{-if-not} varieties,
@@ -4998,7 +4965,7 @@ which understand full-featured argument lists.  The @code{&whole}
 keyword does not work in @code{defmacro} argument lists (except
 inside recursive argument lists).
 
-The @code{eql} and @code{equal} predicates do not distinguish
+The @code{equal} predicate does not distinguish
 between IEEE floating-point plus and minus zero.  The @code{equalp}
 predicate has several differences with Common Lisp; @pxref{Predicates}.
 
@@ -5218,12 +5185,6 @@ whereas Emacs Lisp's parser just treats quote as a special case.
 Some Lisp packages use reader macros to create special syntaxes
 for themselves, which the Emacs parser is incapable of reading.
 
-The lack of reader macros, incidentally, is the reason behind
-Emacs Lisp's unusual backquote syntax.  Since backquotes are
-implemented as a Lisp package and not built-in to the Emacs
-parser, they are forced to use a regular macro named @code{`}
-which is used with the standard function/macro call notation.
-
 @item
 Other syntactic features.  Common Lisp provides a number of
 notations beginning with @code{#} that the Emacs Lisp parser
@@ -5287,11 +5248,11 @@ matters, Emacs has its own @code{#(} notation for
 something entirely different---strings with properties.
 
 @item
-Characters are distinct from integers in Common Lisp.  The
-notation for character constants is also different:  @code{#\A}
-instead of @code{?A}.  Also, @code{string=} and @code{string-equal}
-are synonyms in Emacs Lisp whereas the latter is case-insensitive
-in Common Lisp.
+Characters are distinct from integers in Common Lisp.  The notation
+for character constants is also different: @code{#\A} in Common Lisp
+where Emacs Lisp uses @code{?A}.  Also, @code{string=} and
+@code{string-equal} are synonyms in Emacs Lisp, whereas the latter is
+case-insensitive in Common Lisp.
 
 @item
 Data types.  Some Common Lisp data types do not exist in Emacs
diff --git a/doc/misc/dbus.texi b/doc/misc/dbus.texi
new file mode 100644 (file)
index 0000000..14ceea3
--- /dev/null
@@ -0,0 +1,564 @@
+\input texinfo   @c -*-texinfo-*-
+@setfilename ../../info/dbus
+@c %**start of header
+@settitle Using of D-Bus
+@c @setchapternewpage odd
+@c %**end of header
+
+@copying
+Copyright @copyright{} 2007 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.2 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with the Front-Cover texts being ``A GNU
+Manual'', and with the Back-Cover Texts as in (a) below.  A copy of the
+license is included in the section entitled ``GNU Free Documentation
+License'' in the Emacs manual.
+
+(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
+this GNU Manual, like GNU software.  Copies published by the Free
+Software Foundation raise funds for GNU development.''
+
+This document is part of a collection distributed under the GNU Free
+Documentation License.  If you want to distribute this document
+separately from the collection, you can do so by adding a copy of the
+license to the document, as described in section 6 of the license.
+@end quotation
+@end copying
+
+@dircategory Emacs
+@direntry
+* D-Bus: (dbus).                Using D-Bus in Emacs.
+@end direntry
+
+@node Top, Overview, (dir), (dir)
+@top D-Bus integration in Emacs
+
+This manual documents an API for usage of D-Bus in
+Emacs.@footnote{D-Bus is not enabled by default.  You must run
+@command{./configure --with-dbus} in Emacs' top level directory,
+before you compile Emacs.}  D-Bus is a message bus system, a simple
+way for applications to talk to one another.  An overview of D-Bus can
+be found at @uref{http://dbus.freedesktop.org/}.
+
+@insertcopying
+
+@menu
+* Overview::                    An overview of D-Bus.
+* Inspection::                  Inspection of the bus names.
+* Type Conversion::             Mapping Lisp types and D-Bus types.
+* Synchronous Methods::         Calling methods in a blocking way.
+* Signals::                     Sending and receiving signals.
+* Errors and Events::           Errors and events.
+* GNU Free Documentation License:: The license for this documentation.
+@end menu
+
+@node Overview
+@chapter An overview of D-Bus
+@cindex overview
+
+D-Bus is an inter-process communication mechanism for applications
+residing on the same host.  The communication is based on
+@dfn{messages}.  Data in the messages is carried in a structured way,
+it is not just a byte stream.
+
+The communication is connection oriented to two kinds of message
+buses: a so called @dfn{system bus}, and a @dfn{session bus}.  On a
+given machine, there is always one single system bus for miscellaneous
+system-wide communication, like changing of hardware configuration.
+On the other hand, the session bus is always related to a single
+user's session.
+
+Every client application, which is connected to a bus, registers under
+a @dfn{unique name} at the bus.  This name is used for identifying the
+client application.  Such a unique name starts always with a colon,
+and looks like @samp{:1.42}.
+
+Additionally, a client application can register itself to a so called
+@dfn{known name}, which is a series of identifiers separated by dots,
+as in @samp{org.gnu.Emacs}.  If several applications register to the
+same known name, these registrations are queued, and only the first
+application which has registered for the known name is reachable via
+this name.  If this application disconnects from the bus, the next
+queued unique name becomes the owner of this known name.
+
+An application can install one or several objects under its name.
+Such objects are identified by an @dfn{object path}, which looks
+similar to paths in a filesystem.  An example of such an object path
+could be @samp{/org/gnu/Emacs/}.
+
+Applications might send a request to an object, that means sending a
+message with some data as input parameters, and receiving a message
+from that object with the result of this message, the output
+parameters.  Such a request is called @dfn{method} in D-Bus.
+
+The other form of communication are @dfn{signals}.  The underlying
+message is emitted from an object and will be received by all other
+applications which have registered for such a signal.
+
+All methods and signals an object supports are called @dfn{interface}
+of the object.  Interfaces are specified under a hierarchical name in
+D-Bus; an object can support several interfaces.  Such an interface
+name could be @samp{org.gnu.Emacs.TextEditor} or
+@samp{org.gnu.Emacs.FileManager}.
+
+
+@node Inspection
+@chapter Inspection of the bus names.
+@cindex inspection
+
+There are several basic functions which inspect the buses for
+registered names.  Internally they use the basic interface
+@samp{org.freedesktop.DBus}, which is supported by all objects of a bus.
+
+@defun dbus-list-activatable-names
+This function returns the D-Bus service names, which can be activated.
+An activatable service is described in a service registration file.
+Under GNU/Linux, such files are located at
+@file{/usr/share/dbus-1/services/}.
+
+The result is a list of strings, which is @code{nil} when there are no
+activatable service names at all.
+@end defun
+
+@defun dbus-list-names bus
+All service names, which are registered at D-Bus @var{bus}, are
+returned.  The result is a list of strings, which is @code{nil} when
+there are no registered service names at all.  Well known names are
+strings like @samp{org.freedesktop.DBus}.  Names starting with
+@samp{:} are unique names for services.
+
+@var{bus} must be either the symbol @code{:system} or the symbol
+@code{:session}.
+@end defun
+
+@defun dbus-list-known-names bus
+Retrieves all services which correspond to a known name in @var{bus}.
+A service has a known name if it doesn't start with @samp{:}.  The
+result is a list of strings, which is @code{nil} when there are no
+known names at all.
+
+@var{bus} must be either the symbol @code{:system} or the symbol
+@code{:session}.
+@end defun
+
+@defun dbus-list-queued-owners bus service
+For a given service, registered at D-Bus @var{bus} under the name
+@var{service}, all queued unique names are returned.  The result is a
+list of strings, or @code{nil} when there are no queued names for
+@var{service} at all.
+
+@var{bus} must be either the symbol @code{:system} or the symbol
+@code{:session}.  @var{service} must be a known service name as
+string.
+@end defun
+
+@defun dbus-get-name-owner bus service
+For a given service, registered at D-Bus @var{bus} under the name
+@var{service}, the unique name of the name owner is returned.  The result is a
+string, or @code{nil} when there exist no name owner of @var{service}.
+
+@var{bus} must be either the symbol @code{:system} or the symbol
+@code{:session}.  @var{service} must be a known service name as
+string.
+@end defun
+
+@defun dbus-get-unique-name bus
+The unique name, under which Emacs is registered at D-Bus @var{bus},
+is returned as string.
+
+@var{bus} must be either the symbol @code{:system} or the symbol
+@code{:session}.
+@end defun
+
+@defun dbus-introspect bus service path
+Objects can publish there interfaces to the D-Bus.  This function
+returns all interfaces of @var{service}, registered at object path
+@var{path} at bus @var{bus}.
+
+@var{bus} must be either the symbol @code{:system} or the symbol
+@code{:session}.  @var{service} must be a known service name, and
+@var{path} must be a valid object path.  The last two parameters are
+strings.  The result, the introspection data, is a string in XML
+format. Example:
+
+@example
+(dbus-introspect
+  :system "org.freedesktop.Hal"
+  "/org/freedesktop/Hal/devices/computer")
+
+@result{} "<!DOCTYPE node PUBLIC
+    \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"
+    \"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">
+    <node>
+      <interface name=\"org.freedesktop.Hal.Device\">
+        <method name=\"GetAllProperties\">
+          <arg name=\"properties\" direction=\"out\" type=\"a@{sv@}\"/>
+        </method>
+        ...
+        <signal name=\"PropertyModified\">
+          <arg name=\"num_updates\" type=\"i\"/>
+          <arg name=\"updates\" type=\"a(sbb)\"/>
+        </signal>
+      </interface>
+      ...
+    </node>"
+@end example
+
+This example informs us, that the service @code{org.freedesktop.Hal}
+at object path @code{/org/freedesktop/Hal/devices/computer} offers the
+interface @code{org.freedesktop.Hal.Device} (and 2 other interfaces
+not documented here).  This interface contains the method
+@code{GetAllProperties}, which needs no input parameters, but returns
+as output parameter an array of dictionary entries (key-value pairs).
+Every dictionary entry has a string as key, and a variant as value.
+
+The interface offers also a signal, which returns 2 parameters: an
+integer, and an array consisting of elements which are a struct of a
+string and 2 boolean values.
+
+Such type descriptions are called @dfn{signature} in D-Bus.  For a
+discussion of D-Bus types and their Lisp representation see @ref{Type
+Conversion}.@footnote{D-Bus signatures are explained in the D-Bus
+specification
+@uref{http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures}.
+The interfaces of the service @code{org.freedesktop.Hal} are described
+at
+@uref{http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interfaces}.}
+@end defun
+
+
+@node Type Conversion
+@chapter Mapping Lisp types and D-Bus types.
+@cindex type conversion
+
+D-Bus method calls and signals accept usually several arguments as
+parameters, either as input parameter, or as output parameter.  Every
+argument belongs to a D-Bus type.
+
+Such arguments must be mapped between the the value encoded as a D-Bus
+type, and the corresponding type of Lisp objects.  The mapping is
+applied Lisp object @expansion{} D-Bus type for input parameters, and
+D-Bus type @expansion{} Lisp object for output parameters.
+
+
+@section Input parameters.
+
+Input parameters for D-Bus methods and signals occur as arguments of a
+Lisp function call.  Only some primitive Lisp types are supported in
+the current implementation.  The following mapping to D-Bus types is
+applied, when the corresponding D-Bus message is created:
+
+@example
+@multitable {@code{t} and @code{nil}} {@expansion{}} {DBUS_TYPE_BOOLEAN}
+@item Lisp type               @tab              @tab D-Bus type
+@item
+@item @code{t} and @code{nil} @tab @expansion{} @tab DBUS_TYPE_BOOLEAN
+@item number                  @tab @expansion{} @tab DBUS_TYPE_UINT32
+@item integer                 @tab @expansion{} @tab DBUS_TYPE_INT32
+@item float                   @tab @expansion{} @tab DBUS_TYPE_DOUBLE
+@item string                  @tab @expansion{} @tab DBUS_TYPE_STRING
+@end multitable
+@end example
+
+@noindent
+Other Lisp types, especially lists, are not supported (yet).
+
+
+@section Output parameters.
+
+Output parameters of D-Bus methods and signals are mapped to Lisp
+objects.  This mapping is more powerful than the one for input
+parameters, i.e., more D-Bus types are supported by the current
+implementation.
+
+@example
+@multitable {DBUS_TYPE_OBJECT_PATH} {@expansion{}} {@code{t} or @code{nil}}
+@item D-Bus type            @tab              @tab Lisp type
+@item
+@item DBUS_TYPE_BOOLEAN     @tab @expansion{} @tab @code{t} or @code{nil}
+@item DBUS_TYPE_UINT32      @tab @expansion{} @tab number
+@item DBUS_TYPE_INT32       @tab @expansion{} @tab number
+@item DBUS_TYPE_DOUBLE      @tab @expansion{} @tab float
+@item DBUS_TYPE_STRING      @tab @expansion{} @tab string
+@item DBUS_TYPE_OBJECT_PATH @tab @expansion{} @tab string
+@item DBUS_TYPE_ARRAY       @tab @expansion{} @tab list
+@item DBUS_TYPE_VARIANT     @tab @expansion{} @tab list
+@item DBUS_TYPE_STRUCT      @tab @expansion{} @tab list
+@item DBUS_TYPE_DICT_ENTRY  @tab @expansion{} @tab list
+@end multitable
+@end example
+
+The resulting list of the last 4 D-Bus compound types contains as
+elements the elements of the D-Bus container, mapped according to the
+same rules.
+
+The signal @code{PropertyModified}, discussed as example in
+@ref{Inspection}, would offer as Lisp data the following object
+(@var{BOOL} stands here for either @code{nil} or @code{t}):
+
+@lisp
+(@var{NUMBER} ((@var{STRING} @var{BOOL} @var{BOOL}) (@var{STRING} @var{BOOL} @var{BOOL}) ...))
+@end lisp
+
+
+@node Synchronous Methods
+@chapter Calling methods in a blocking way.
+@cindex method calls, synchronous
+@cindex synchronous method calls
+
+Methods can be called synchronously (@dfn{blocking}) or asynchronously
+(@dfn{non-blocking}).  Currently, just synchronous methods are
+implemented.
+
+At D-Bus level, a method call consist of two messages: one message
+which carries the input parameters to the object owning the method to
+be called, and a reply message returning the resulting output
+parameters from the object.
+
+@defun dbus-call-method bus method service path interface &rest args
+This function calls @var{method} on the D-Bus @var{bus}.  @var{bus} is
+either the symbol @code{:system} or the symbol @code{:session}.
+
+@var{service} is the D-Bus service name to be used.  @var{path} is the
+D-Bus object path, @var{service} is registered at.  @var{interface} is
+an interface offered by @var{service}.  It must provide @var{method}.
+
+All other arguments args are passed to @var{method} as arguments.
+They are converted into D-Bus types as described in @ref{Type
+Conversion}.
+
+The function returns the resulting values of @var{method} as a list of
+Lisp objects, according to the type conversion rules described in
+@ref{Type Conversion}.  Example:
+
+@example
+(dbus-call-method
+  :session "GetKeyField" "org.gnome.seahorse"
+  "/org/gnome/seahorse/keys/openpgp" "org.gnome.seahorse.Keys"
+  "openpgp:657984B8C7A966DD" "simple-name")
+
+@result{} (t ("Philip R. Zimmermann"))
+@end example
+
+If the result of the method call is just one value, the converted Lisp
+object is returned instead of a list containing this single Lisp
+object.  Example:
+
+@example
+(dbus-call-method
+  :system "GetPropertyString" "org.freedesktop.Hal"
+  "/org/freedesktop/Hal/devices/computer" "org.freedesktop.Hal.Device"
+  "system.kernel.machine")
+
+@result{} "i686"
+@end example
+
+With the @code{dbus-introspect} function it is possible to explore the
+interfaces of @samp{org.freedesktop.Hal} service. It offers the
+interfaces @samp{org.freedesktop.Hal.Manager} for the object at the
+path @samp{/org/freedesktop/Hal/Manager} as well as the interface
+@samp{org.freedesktop.Hal.Device} for all objects prefixed with the
+path @samp{/org/freedesktop/Hal/devices}.  With the methods
+@samp{GetAllDevices} and @samp{GetAllProperties}, it is simple to
+emulate the @code{lshal} command on GNU/Linux systems:
+
+@example
+(dolist (device
+          (dbus-call-method
+            :system "GetAllDevices" "org.freedesktop.Hal"
+            "/org/freedesktop/Hal/Manager"
+            "org.freedesktop.Hal.Manager"))
+  (message "\nudi = %s" device)
+  (dolist (properties
+            (dbus-call-method
+              :system "GetAllProperties" "org.freedesktop.Hal"
+              device "org.freedesktop.Hal.Device"))
+    (message "  %s = %S"
+             (car properties) (or (caar (cdr properties)) ""))))
+
+@print{} "udi = /org/freedesktop/Hal/devices/computer
+      info.addons = (\"hald-addon-acpi\")
+      info.bus = \"unknown\"
+      info.product = \"Computer\"
+      info.subsystem = \"unknown\"
+      info.udi = \"/org/freedesktop/Hal/devices/computer\"
+      linux.sysfs_path_device = \"(none)\"
+      power_management.acpi.linux.version = \"20051216\"
+      power_management.can_suspend_to_disk = t
+      power_management.can_suspend_to_ram = \"\"
+      power_management.type = \"acpi\"
+      smbios.bios.release_date = \"11/07/2001\"
+      system.chassis.manufacturer = \"COMPAL\"
+      system.chassis.type = \"Notebook\"
+      system.firmware.release_date = \"03/19/2005\"
+      ..."
+@end example
+@end defun
+
+
+@node Signals
+@chapter Sending and receiving signals.
+@cindex signals
+
+Signals are broadcast messages.  They carry input parameters, which
+are received by all objects which have registered for such a signal.
+
+@defun dbus-send-signal bus signal service path interface &rest args
+This function is similar to @code{dbus-call-method}.  The difference
+is, that there are no returning output parameters.
+
+The function emits @var{signal} on the D-Bus @var{bus}.  @var{bus} is
+either the symbol @code{:system} or the symbol @code{:session}.  It
+doesn't matter whether another object has registered for @var{signal}.
+
+@var{service} is the D-Bus service name of the object the signal is
+emitted from.  @var{path} is the corresponding D-Bus object path,
+@var{service} is registered at.  @var{interface} is an interface
+offered by @var{service}.  It must provide @var{signal}.
+
+All other arguments args are passed to @var{signal} as arguments.
+They are converted into D-Bus types as described in @ref{Type
+Conversion}.  Example:
+
+@example
+(dbus-send-signal
+  :session "FileModified" "org.gnu.Emacs" "/org/gnu/Emacs"
+  "org.gnu.Emacs.FileManager" "/home/albinus/.emacs")
+@end example
+@end defun
+
+@defun dbus-register-signal bus signal service path interface handler
+With this function, an application registers for @var{signal} on the
+D-Bus @var{bus}.
+
+@var{bus} is either the symbol @code{:system} or the symbol
+@code{:session}.
+
+@var{service} is the D-Bus service name used by the sending D-Bus
+object.  It can be either a known name or the unique name of the D-Bus
+object sending the signal.  In case of a unique name, signals won't be
+received any longer once the object owning this unique name has
+disappeared, and a new queued object has replaced it.
+
+When @var{service} is @code{nil}, related signals from all D-Bus
+objects shall be accepted.
+
+@var{path} is the corresponding D-Bus object path, @var{service} is
+registered at.  It can also be @code{nil} if the path name of incoming
+signals shall not be checked.
+
+@var{interface} is an interface offered by @var{service}.  It must
+provide @var{signal}.
+
+@var{handler} is a Lisp function to be called when the @var{signal} is
+received.  It must accept as arguments the output parameters
+@var{signal} is sending.  Example:
+
+@example
+(defun my-dbus-signal-handler (device)
+  (message "Device %s added" device))
+
+(dbus-register-signal
+  :system "DeviceAdded"
+  (dbus-get-name-owner :system "org.freedesktop.Hal")
+  "/org/freedesktop/Hal/Manager" "org.freedesktop.Hal.Manager"
+  'my-dbus-signal-handler)
+
+@result{} (:system "org.freedesktop.Hal.Manager" "DeviceAdded")
+@end example
+
+As we know from the inspection data of interface
+@code{org.freedesktop.Hal.Manager}, the signal @code{DeviceAdded}
+provides one single parameter, which is mapped into a Lisp string.
+The callback function @code{my-dbus-signal-handler} must define one
+single string argument therefore.  Plugging an USB device to your
+machine, when registered for signal @code{DeviceAdded}, will show you
+which objects the GNU/Linux @code{hal} daemon adds.
+
+@code{dbus-register-signal} returns a Lisp symbol, which can be used
+as argument in @code{dbus-unregister-signal} for removing the
+registration for @var{signal}.
+@end defun
+
+@defun dbus-unregister-signal object
+Unregister @var{object} from the the D-Bus.  @var{object} must be the
+result of a preceding @code{dbus-register-signal} call.
+@end defun
+
+
+@node Errors and Events
+@chapter Errors and events.
+@cindex errors
+@cindex events
+
+All errors raised by D-Bus are signaled with the error symbol
+@code{dbus-error}.  As usual, such an error can be trapped with a
+@code{condition-case} form.  If possible, error messages from D-Bus
+are appended to the @code{dbus-error}.
+
+Incoming D-Bus messages are handled as Emacs events (see @pxref{Misc
+Events, , , elisp}).  The generated event has this form:
+
+@example
+(dbus-event @var{handler} @var{bus} @var{service} @var{path} @var{interface} @var{member} &rest @var{args})
+@end example
+
+@var{handler} is the callback function which has been registered for
+this signal (see @pxref{Signals}).  When a @code{dbus-event} event
+arrives, @var{handler} is called with @var{args} as arguments.
+
+@var{bus} identifies the D-Bus the signal is coming from.  It is
+either the symbol @code{:system} or the symbol @code{:session}.
+
+@var{service} and @var{path} are the unique name and the object path
+of the D-Bus object emitting the signal.  @var{interface} and
+@var{member} denote the signal which has been sent.
+
+In order to inspect the @code{dbus-event} data, you could extend the
+definition of the callback function in @ref{Signals}:
+
+@example
+(defun my-dbus-signal-handler (&rest args)
+  (message "my-dbus-signal-handler: %S" last-input-event))
+@end example
+
+There exist convenience functions which could be called inside a
+callback function in order to retrieve the information from the event.
+
+@defun dbus-event-bus-name event
+Returns the bus name @var{event} is coming from.
+The result is either the symbol @code{:system} or the symbol @code{:session}.
+@end defun
+
+@defun dbus-event-service-name event
+Returns the unique name of the D-Bus object @var{event} is coming from.
+@end defun
+
+@defun dbus-event-path-name event
+Returns the object path of the D-Bus object @var{event} is coming from.
+@end defun
+
+@defun dbus-event-interface-name event
+Returns the interface name of of the D-Bus object @var{event} is coming from.
+@end defun
+
+@defun dbus-event-member-name event
+Returns the member name of of the D-Bus object @var{event} is coming
+from.  It is either a signal name or a method name.
+@end defun
+
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+@include doclicense.texi
+
+@contents
+@c End of dbus.texi
+@bye
+
+@ignore
+   arch-tag: 2eeec19d-0caf-44e0-a193-329d7f9951d8
+@end ignore
index d4cbf8380b695f4143417ece0be20f479f0f7d22..f8be71ef860dc440dc0adb886dbcbe2f978ec9ad 100644 (file)
@@ -1417,10 +1417,23 @@ This is an alist of encoding / function pairs.  The encodings are
 @vindex rfc2047-encoded-word-regexp
 When decoding words, this library looks for matches to this regexp.
 
+@item rfc2047-encoded-word-regexp-loose
+@vindex rfc2047-encoded-word-regexp-loose
+This is a version from which the regexp for the Q encoding pattern of
+@code{rfc2047-encoded-word-regexp} is made loose.
+
 @item rfc2047-encode-encoded-words
 @vindex rfc2047-encode-encoded-words
 The boolean variable specifies whether encoded words
-(e.g. @samp{=?hello?=}) should be encoded again.
+(e.g. @samp{=?us-ascii?q?hello?=}) should be encoded again.
+@code{rfc2047-encoded-word-regexp} is used to look for such words.
+
+@item rfc2047-allow-irregular-q-encoded-words
+@vindex rfc2047-allow-irregular-q-encoded-words
+The boolean variable specifies whether irregular Q encoded words
+(e.g. @samp{=?us-ascii?q?hello??=}) should be decoded.  If it is
+non-@code{nil}, @code{rfc2047-encoded-word-regexp-loose} is used instead
+of @code{rfc2047-encoded-word-regexp} to look for encoded words.
 
 @end table
 
index 491ee631fe7977629d13221f263caa13dc0a17c0..6ab4c199de660ff9deebd5819bc29848a19ad0c3 100644 (file)
@@ -413,12 +413,9 @@ First, we write the @code{init-function}:
 (defun flymake-perl-init ()
   (let* ((temp-file (flymake-init-create-temp-buffer-copy
                      'flymake-create-temp-inplace))
-         (local-file  (concat (flymake-build-relative-filename
-                               (file-name-directory
-                                (buffer-file-name
-                                 (current-buffer)))
-                               (file-name-directory temp-file))
-                              (file-name-nondirectory temp-file))))
+        (local-file (file-relative-name
+                      temp-file
+                      (file-name-directory buffer-file-name))))
     (list "perl" (list "-wc " local-file))))
 @end lisp
 
index 97e70c1cec2945ab9309244b5bbfbea3cbb8c498..8ec39ce81fed85c486ea976defa576048618bfb5 100644 (file)
@@ -8175,6 +8175,11 @@ Save the current series
 @findex gnus-uu-decode-binhex
 Unbinhex the current series (@code{gnus-uu-decode-binhex}).  This
 doesn't really work yet.
+
+@item X Y
+@kindex X Y (Summary)
+@findex gnus-uu-decode-yenc
+yEnc-decode the current series and save it (@code{gnus-uu-decode-yenc}).
 @end table
 
 
@@ -9740,7 +9745,7 @@ To have all Vcards be ignored, you'd say something like this:
 If non-@code{nil}, Gnus won't require the @samp{MIME-Version} header
 before interpreting the message as a @acronym{MIME} message.  This helps
 when reading messages from certain broken mail user agents.  The
-default is @code{nil}.
+default is @code{t}.
 
 @item gnus-article-emulate-mime
 @vindex gnus-article-emulate-mime
@@ -14649,14 +14654,12 @@ If non-@code{nil}, name of program for fetching new mail.  If
 @subsubsection Fetching Mail
 
 @vindex mail-sources
-@vindex nnmail-spool-file
 The way to actually tell Gnus where to get new mail from is to set
 @code{mail-sources} to a list of mail source specifiers
 (@pxref{Mail Source Specifiers}).
 
-If this variable (and the obsolescent @code{nnmail-spool-file}) is
-@code{nil}, the mail back ends will never attempt to fetch mail by
-themselves.
+If this variable is @code{nil}, the mail back ends will never attempt to
+fetch mail by themselves.
 
 If you want to fetch mail both from your local spool as well as a
 @acronym{POP} mail server, you'd say something like:
@@ -14865,10 +14868,10 @@ body of the messages:
         "string.group"))))
 @end lisp
 
-The buffer is narrowed to the message in question when @var{function}
-is run.  That's why @code{(widen)} needs to be called after
-@code{save-excursion} and @code{save-restriction} in the example
-above.  Also note that with the nnimap back end, message bodies will
+The buffer is narrowed to the header of the message in question when
+@var{function} is run.  That's why @code{(widen)} needs to be called
+after @code{save-excursion} and @code{save-restriction} in the example
+above.  Also note that with the nnimap backend, message bodies will
 not be downloaded by default.  You need to set
 @code{nnimap-split-download-body} to @code{t} to do that
 (@pxref{Splitting in IMAP}).
index 4d8d44765d4d474332ff7494c08f6f9cdd462ec8..a676da55e26eb52c6343fea2216dd76a7b653be5 100644 (file)
@@ -31,27 +31,27 @@ infodir = $(srcdir)/../../info
 MAKEINFO = makeinfo --force
 MULTI_INSTALL_INFO = $(srcdir)\..\..\nt\multi-install-info.bat
 INFO_TARGETS = $(infodir)/ccmode \
-               $(infodir)/cl $(infodir)/dired-x $(infodir)/ediff \
-               $(infodir)/forms $(infodir)/gnus $(infodir)/message \
-               $(infodir)/sieve $(infodir)/pgg $(infodir)/emacs-mime \
-               $(infodir)/info $(infodir)/mh-e $(infodir)/reftex \
-               $(infodir)/sc $(infodir)/vip $(infodir)/viper \
-               $(infodir)/widget $(infodir)/efaq $(infodir)/ada-mode \
-               $(infodir)/autotype $(infodir)/calc $(infodir)/idlwave \
-               $(infodir)/eudc $(infodir)/ebrowse $(infodir)/pcl-cvs \
-               $(infodir)/woman $(infodir)/eshell $(infodir)/org \
-               $(infodir)/url $(infodir)/speedbar $(infodir)/tramp \
-               $(infodir)/ses $(infodir)/smtpmail $(infodir)/flymake \
-               $(infodir)/newsticker $(infodir)/rcirc $(infodir)/erc \
-               $(infodir)/remember
-DVI_TARGETS = calc.dvi cc-mode.dvi cl.dvi dired-x.dvi \
-                ediff.dvi forms.dvi gnus.dvi message.dvi emacs-mime.dvi \
-                 gnus.dvi message.dvi sieve.dvi pgg.dvi mh-e.dvi \
-                reftex.dvi sc.dvi vip.dvi viper.dvi widget.dvi faq.dvi \
-                ada-mode.dvi autotype.dvi idlwave.dvi eudc.dvi ebrowse.dvi \
-                pcl-cvs.dvi woman.dvi eshell.dvi org.dvi url.dvi \
-                speedbar.dvi tramp.dvi ses.dvi smtpmail.dvi flymake.dvi \
-                 newsticker.dvi rcirc.dvi erc.dvi remember.dvi
+               $(infodir)/cl $(infodir)/dbus $(infodir)/dired-x \
+               $(infodir)/ediff $(infodir)/forms $(infodir)/gnus \
+               $(infodir)/message $(infodir)/sieve $(infodir)/pgg \
+               $(infodir)/emacs-mime $(infodir)/info $(infodir)/mh-e \
+               $(infodir)/reftex $(infodir)/sc $(infodir)/vip \
+               $(infodir)/viper $(infodir)/widget $(infodir)/efaq \
+               $(infodir)/ada-mode $(infodir)/autotype $(infodir)/calc \
+               $(infodir)/idlwave $(infodir)/eudc $(infodir)/ebrowse \
+               $(infodir)/pcl-cvs $(infodir)/woman $(infodir)/eshell \
+               $(infodir)/org $(infodir)/url $(infodir)/speedbar \
+               $(infodir)/tramp $(infodir)/ses $(infodir)/smtpmail \
+               $(infodir)/flymake $(infodir)/newsticker $(infodir)/rcirc \
+               $(infodir)/erc $(infodir)/remember $(infodir)/nxml-mode
+DVI_TARGETS = calc.dvi cc-mode.dvi cl.dvi dbus.dvi dired-x.dvi \
+               ediff.dvi forms.dvi gnus.dvi message.dvi emacs-mime.dvi \
+               gnus.dvi message.dvi sieve.dvi pgg.dvi mh-e.dvi \
+               reftex.dvi sc.dvi vip.dvi viper.dvi widget.dvi faq.dvi \
+               ada-mode.dvi autotype.dvi idlwave.dvi eudc.dvi ebrowse.dvi \
+               pcl-cvs.dvi woman.dvi eshell.dvi org.dvi url.dvi \
+               speedbar.dvi tramp.dvi ses.dvi smtpmail.dvi flymake.dvi \
+               newsticker.dvi rcirc.dvi erc.dvi remember.dvi nxml-mode.dvi
 INFOSOURCES = info.texi
 
 # The following rule does not work with all versions of `make'.
@@ -114,6 +114,11 @@ $(infodir)/cl: cl.texi
 cl.dvi: cl.texi
        $(ENVADD) $(TEXI2DVI) $(srcdir)/cl.texi
 
+$(infodir)/dbus: dbus.texi
+       $(MAKEINFO) dbus.texi
+dbus.dvi: dbus.texi
+       $(ENVADD) $(TEXI2DVI) $(srcdir)/dbus.texi
+
 $(infodir)/dired-x: dired-x.texi
        $(MAKEINFO) dired-x.texi
 dired-x.dvi: dired-x.texi
@@ -271,6 +276,11 @@ $(infodir)/newsticker: newsticker.texi
 newsticker.dvi: newsticker.texi
        $(ENVADD) $(TEXI2DVI) $(srcdir)/newsticker.texi
 
+$(infodir)/nxml-mode: nxml-mode.texi
+       $(MAKEINFO) nxml-mode.texi
+nxml-mod.dvi: nxml-mode.texi
+       $(ENVADD) $(TEXI2DVI) $(srcdir)/nxml-mode.texi
+
 $(infodir)/rcirc: rcirc.texi
        $(MAKEINFO) rcirc.texi
 rcirc.dvi: rcirc.texi
@@ -286,8 +296,8 @@ mostlyclean:
 
 clean: mostlyclean
        - $(DEL) *.dvi
-       - $(DEL) $(infodir)/ccmode* \
-                $(infodir)/cl* $(infodir)/dired-x* \
+       - $(DEL) $(infodir)/ccmode* $(infodir)/cl* \
+                $(infodir)/dbus* $(infodir)/dired-x* \
                 $(infodir)/ediff* $(infodir)/forms* \
                 $(infodir)/gnus* $(infodir)/info* \
                 $(infodir)/message* $(infodir)/mh-e* \
@@ -304,7 +314,7 @@ clean: mostlyclean
                 $(infodir)/flymake* $(infodir)/newsticker* \
                 $(infodir)/sieve* $(infodir)/pgg* \
                 $(infodir)/erc* $(infodir)/rcirc* \
-                $(infodir)/remember*
+                $(infodir)/remember* $(infodir)/nxml-mode*
 
 distclean: clean
 
diff --git a/doc/misc/nxml-mode.texi b/doc/misc/nxml-mode.texi
new file mode 100644 (file)
index 0000000..c79a552
--- /dev/null
@@ -0,0 +1,838 @@
+\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename ../../info/nxml-mode
+@settitle nXML Mode
+@c %**end of header
+
+@dircategory Emacs
+@direntry
+* nXML Mode: (nxml-mode).       XML editing mode with RELAX NG support.
+@end direntry
+
+@node Top
+@top nXML Mode
+
+This manual documents nxml-mode, an Emacs major mode for editing
+XML with RELAX NG support.  This manual is not yet complete.
+
+@menu
+* Completion::                  
+* Inserting end-tags::          
+* Paragraphs::                  
+* Outlining::                   
+* Locating a schema::           
+* DTDs::                        
+* Limitations::                 
+@end menu
+
+@node Completion
+@chapter Completion
+
+Apart from real-time validation, the most important feature that
+nxml-mode provides for assisting in document creation is "completion".
+Completion assists the user in inserting characters at point, based on
+knowledge of the schema and on the contents of the buffer before
+point.
+
+The traditional GNU Emacs key combination for completion in a
+buffer is @kbd{M-@key{TAB}}. However, many window systems
+and window managers use this key combination themselves (typically for
+switching between windows) and do not pass it to applications. It's
+hard to find key combinations in GNU Emacs that are both easy to type
+and not taken by something else.  @kbd{C-@key{RET}} (i.e.
+pressing the Enter or Return key, while the Ctrl key is held down) is
+available.  It won't be available on a traditional terminal (because
+it is indistinguishable from Return), but it will work with a window
+system.  Therefore we adopt the following solution by default: use
+@kbd{C-@key{RET}} when there's a window system and
+@kbd{M-@key{TAB}} when there's not.  In the following, I
+will assume that a window system is being used and will therefore
+refer to @kbd{C-@key{RET}}.
+
+Completion works by examining the symbol preceding point.  This
+is the symbol to be completed. The symbol to be completed may be the
+empty. Completion considers what symbols starting with the symbol to
+be completed would be valid replacements for the symbol to be
+completed, given the schema and the contents of the buffer before
+point.  These symbols are the possible completions.  An example may
+make this clearer.  Suppose the buffer looks like this (where @point{}
+indicates point):
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<h@point{}
+@end example
+
+@noindent
+and the schema is XHTML.  In this context, the symbol to be completed
+is @samp{h}.  The possible completions consist of just
+@samp{head}.  Another example, is
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<@point{}
+@end example
+
+@noindent
+In this case, the symbol to be completed is empty, and the possible
+completions are @samp{base}, @samp{isindex},
+@samp{link}, @samp{meta}, @samp{script},
+@samp{style}, @samp{title}.  Another example is:
+
+@example
+<html xmlns="@point{}
+@end example
+
+@noindent
+In this case, the symbol to be completed is empty, and the possible
+completions are just @samp{http://www.w3.org/1999/xhtml}.
+
+When you type @kbd{C-@key{RET}}, what happens depends
+on what the set of possible completions are.
+
+@itemize @bullet
+@item
+If the set of completions is empty, nothing
+happens.
+@item
+If there is one possible completion, then that completion is
+inserted, together with any following characters that are
+required. For example, in this case:
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<@point{}
+@end example
+
+@noindent
+@kbd{C-@key{RET}} will yield
+
+@example
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head@point{}
+@end example
+@item
+If there is more than one possible completion, but all
+possible completions share a common non-empty prefix, then that prefix
+is inserted. For example, suppose the buffer is:
+
+@example
+<html x@point{}
+@end example
+
+@noindent
+The symbol to be completed is @samp{x}. The possible completions
+are @samp{xmlns} and @samp{xml:lang}.  These share a
+common prefix of @samp{xml}.  Thus, @kbd{C-@key{RET}}
+will yield:
+
+@example
+<html xml@point{}
+@end example
+
+@noindent
+Typically, you would do @kbd{C-@key{RET}} again, which would
+have the result described in the next item.
+@item
+If there is more than one possible completion, but the
+possible completions do not share a non-empty prefix, then Emacs will
+prompt you to input the symbol in the minibuffer, initializing the
+minibuffer with the symbol to be completed, and popping up a buffer
+showing the possible completions.  You can now input the symbol to be
+inserted.  The symbol you input will be inserted in the buffer instead
+of the symbol to be completed.  Emacs will then insert any required
+characters after the symbol.  For example, if it contains:
+
+@example
+<html xml@point{}
+@end example
+
+@noindent
+Emacs will prompt you in the minibuffer with
+
+@example
+Attribute: xml@point{}
+@end example
+
+@noindent
+and the buffer showing possible completions will contain
+
+@example
+Possible completions are:
+xml:lang                          xmlns
+@end example
+
+@noindent
+If you input @kbd{xmlns}, the result will be:
+
+@example
+<html xmlns="@point{}
+@end example
+
+@noindent
+(If you do @kbd{C-@key{RET}} again, the namespace URI will
+be inserted. Should that happen automatically?)
+@end itemize
+
+@node Inserting end-tags
+@chapter Inserting end-tags
+
+The main redundancy in XML syntax is end-tags.  nxml-mode provides
+several ways to make it easier to enter end-tags.  You can use all of
+these without a schema.
+
+You can use @kbd{C-@key{RET}} after @samp{</}
+to complete the rest of the end-tag.
+
+@kbd{C-c C-f} inserts an end-tag for the element containing
+point. This command is useful when you want to input the start-tag,
+then input the content and finally input the end-tag. The @samp{f}
+is mnemonic for finish.
+
+If you want to keep tags balanced and input the end-tag at the
+same time as the start-tag, before inputting the content, then you can
+use @kbd{C-c C-i}. This inserts a @samp{>}, then inserts
+the end-tag and leaves point before the end-tag.  @kbd{C-c C-b}
+is similar but more convenient for block-level elements: it puts the
+start-tag, point and the end-tag on successive lines, appropriately
+indented. The @samp{i} is mnemonic for inline and the
+@samp{b} is mnemonic for block.
+
+Finally, you can customize nxml-mode so that @kbd{/}
+automatically inserts the rest of the end-tag when it occurs after
+@samp{<}, by doing
+
+@display
+@kbd{M-x customize-variable @key{RET} nxml-slash-auto-complete-flag @key{RET}}
+@end display
+
+@noindent
+and then following the instructions in the displayed buffer.
+
+@node Paragraphs
+@chapter Paragraphs
+
+Emacs has several commands that operate on paragraphs, most
+notably @kbd{M-q}. nXML mode redefines these to work in a way
+that is useful for XML.  The exact rules that are used to find the
+beginning and end of a paragraph are complicated; they are designed
+mainly to ensure that @kbd{M-q} does the right thing.
+
+A paragraph consists of one or more complete, consecutive lines.
+A group of lines is not considered a paragraph unless it contains some
+non-whitespace characters between tags or inside comments.  A blank
+line separates paragraphs.  A single tag on a line by itself also
+separates paragraphs.  More precisely, if one tag together with any
+leading and trailing whitespace completely occupy one or more lines,
+then those lines will not be included in any paragraph.
+
+A start-tag at the beginning of the line (possibly indented) may
+be treated as starting a paragraph.  Similarly, an end-tag at the end
+of the line may be treated as ending a paragraph. The following rules
+are used to determine whether such a tag is in fact treated as a
+paragraph boundary:
+
+@itemize @bullet
+@item
+If the schema does not allow text at that point, then it
+is a paragraph boundary.
+@item
+If the end-tag corresponding to the start-tag is not at
+the end of its line, or the start-tag corresponding to the end-tag is
+not at the beginning of its line, then it is not a paragraph
+boundary. For example, in
+
+@example
+<p>This is a paragraph with an
+<emph>emphasized</emph> phrase.
+@end example
+
+@noindent
+the @samp{<emph>} start-tag would not be considered as
+starting a paragraph, because its corresponding end-tag is not at the
+end of the line.
+@item
+If there is text that is a sibling in element tree, then
+it is not a paragraph boundary.  For example, in
+
+@example
+<p>This is a paragraph with an
+<emph>emphasized phrase that takes one source line</emph>
+@end example
+
+@noindent
+the @samp{<emph>} start-tag would not be considered as
+starting a paragraph, even though its end-tag is at the end of its
+line, because there the text @samp{This is a paragraph with an}
+is a sibling of the @samp{emph} element.
+@item
+Otherwise, it is a paragraph boundary.
+@end itemize
+
+@node Outlining
+@chapter Outlining
+
+nXML mode allows you to display all or part of a buffer as an
+outline, in a similar way to Emacs' outline mode.  An outline in nXML
+mode is based on recognizing two kinds of element: sections and
+headings.  There is one heading for every section and one section for
+every heading.  A section contains its heading as or within its first
+child element.  A section also contains its subordinate sections (its
+subsections).  The text content of a section consists of anything in a
+section that is neither a subsection nor a heading.
+
+Note that this is a different model from that used by XHTML.
+nXML mode's outline support will not be useful for XHTML unless you
+adopt a convention of adding a @code{div} to enclose each
+section, rather than having sections implicitly delimited by different
+@code{h@var{n}} elements.  This limitation may be removed
+in a future version.
+
+The variable @code{nxml-section-element-name-regexp} gives
+a regexp for the local names (i.e. the part of the name following any
+prefix) of section elements. The variable
+@code{nxml-heading-element-name-regexp} gives a regexp for the
+local names of heading elements. For an element to be recognized
+as a section
+
+@itemize @bullet
+@item
+its start-tag must occur at the beginning of a line
+(possibly indented);
+@item
+its local name must match
+@code{nxml-section-element-name-regexp};
+@item
+either its first child element or a descendant of that
+first child element must have a local name that matches
+@code{nxml-heading-element-name-regexp}; the first such element
+is treated as the section's heading.
+@end itemize
+
+@noindent
+You can customize these variables using @kbd{M-x
+customize-variable}.
+
+There are three possible outline states for a section:
+
+@itemize @bullet
+@item
+normal, showing everything, including its heading, text
+content and subsections; each subsection is displayed according to the
+state of that subsection;
+@item
+showing just its heading, with both its text content and
+its subsections hidden; all subsections are hidden regardless of their
+state;
+@item
+showing its heading and its subsections, with its text
+content hidden; each subsection is displayed according to the state of
+that subsection.
+@end itemize
+
+In the last two states, where the text content is hidden, the
+heading is displayed specially, in an abbreviated form. An element
+like this:
+
+@example
+<section>
+<title>Food</title>
+<para>There are many kinds of food.</para>
+</section>
+@end example
+
+@noindent
+would be displayed on a single line like this:
+
+@example
+<-section>Food...</>
+@end example
+
+@noindent
+If there are hidden subsections, then a @code{+} will be used
+instead of a @code{-} like this:
+
+@example
+<+section>Food...</>
+@end example
+
+@noindent
+If there are non-hidden subsections, then the section will instead be
+displayed like this:
+
+@example
+<-section>Food...
+  <-section>Delicious Food...</>
+  <-section>Distasteful Food...</>
+</-section>
+@end example
+
+@noindent
+The heading is always displayed with an indent that corresponds to its
+depth in the outline, even it is not actually indented in the buffer.
+The variable @code{nxml-outline-child-indent} controls how much
+a subheading is indented with respect to its parent heading when the
+heading is being displayed specially.
+
+Commands to change the outline state of sections are bound to
+key sequences that start with @kbd{C-c C-o} (@kbd{o} is
+mnemonic for outline).  The third and final key has been chosen to be
+consistent with outline mode.  In the following descriptions
+current section means the section containing point, or, more precisely,
+the innermost section containing the character immediately following
+point.
+
+@itemize @bullet
+@item
+@kbd{C-c C-o C-a} shows all sections in the buffer
+normally.
+@item
+@kbd{C-c C-o C-t} hides the text content
+of all sections in the buffer.
+@item
+@kbd{C-c C-o C-c} hides the text content
+of the current section.
+@item
+@kbd{C-c C-o C-e} shows the text content
+of the current section.
+@item
+@kbd{C-c C-o C-d} hides the text content
+and subsections of the current section.
+@item
+@kbd{C-c C-o C-s} shows the current section 
+and all its direct and indirect subsections normally.
+@item
+@kbd{C-c C-o C-k} shows the headings of the
+direct and indirect subsections of the current section.
+@item
+@kbd{C-c C-o C-l} hides the text content of the
+current section and of its direct and indirect
+subsections.
+@item
+@kbd{C-c C-o C-i} shows the headings of the
+direct subsections of the current section.
+@item
+@kbd{C-c C-o C-o} hides as much as possible without
+hiding the current section's text content; the headings of ancestor
+sections of the current section and their child section sections will
+not be hidden.
+@end itemize
+
+When a heading is displayed specially, you can use
+@key{RET} in that heading to show the text content of the section
+in the same way as @kbd{C-c C-o C-e}.
+
+You can also use the mouse to change the outline state:
+@kbd{S-mouse-2} hides the text content of a section in the same
+way as@kbd{C-c C-o C-c}; @kbd{mouse-2} on a specially
+displayed heading shows the text content of the section in the same
+way as @kbd{C-c C-o C-e}; @kbd{mouse-1} on a specially
+displayed start-tag toggles the display of subheadings on and
+off.
+
+The outline state for each section is stored with the first
+character of the section (as a text property). Every command that
+changes the outline state of any section updates the display of the
+buffer so that each section is displayed correctly according to its
+outline state.  If the section structure is subsequently changed, then
+it is possible for the display to no longer correctly reflect the
+stored outline state. @kbd{C-c C-o C-r} can be used to refresh
+the display so it is correct again.
+
+@node Locating a schema
+@chapter Locating a schema
+
+nXML mode has a configurable set of rules to locate a schema for
+the file being edited.  The rules are contained in one or more schema
+locating files, which are XML documents.
+
+The variable @samp{rng-schema-locating-files} specifies
+the list of the file-names of schema locating files that nXML mode
+should use.  The order of the list is significant: when file
+@var{x} occurs in the list before file @var{y} then rules
+from file @var{x} have precedence over rules from file
+@var{y}.  A filename specified in
+@samp{rng-schema-locating-files} may be relative. If so, it will
+be resolved relative to the document for which a schema is being
+located. It is not an error if relative file-names in
+@samp{rng-schema-locating-files} do not not exist. You can use
+@kbd{M-x customize-variable @key{RET} rng-schema-locating-files
+@key{RET}} to customize the list of schema locating
+files.
+
+By default, @samp{rng-schema-locating-files} list has two
+members: @samp{schemas.xml}, and
+@samp{@var{dist-dir}/schema/schemas.xml} where
+@samp{@var{dist-dir}} is the directory containing the nXML
+distribution. The first member will cause nXML mode to use a file
+@samp{schemas.xml} in the same directory as the document being
+edited if such a file exist.  The second member contains rules for the
+schemas that are included with the nXML distribution.
+
+@menu
+* Commands for locating a schema::  
+* Schema locating files::       
+@end menu
+
+@node Commands for locating a schema
+@section Commands for locating a schema
+
+The command @kbd{C-c C-s C-w} will tell you what schema
+is currently being used.
+
+The rules for locating a schema are applied automatically when
+you visit a file in nXML mode. However, if you have just created a new
+file and the schema cannot be inferred from the file-name, then this
+will not locate the right schema.  In this case, you should insert the
+start-tag of the root element and then use the command @kbd{C-c
+C-a}, which reapplies the rules based on the current content of
+the document.  It is usually not necessary to insert the complete
+start-tag; often just @samp{<@var{name}} is
+enough.
+
+If you want to use a schema that has not yet been added to the
+schema locating files, you can use the command @kbd{C-c C-s C-f}
+to manually select the file contaiing the schema for the document in
+current buffer.  Emacs will read the file-name of the schema from the
+minibuffer. After reading the file-name, Emacs will ask whether you
+wish to add a rule to a schema locating file that persistently
+associates the document with the selected schema.  The rule will be
+added to the first file in the list specified
+@samp{rng-schema-locating-files}; it will create the file if
+necessary, but will not create a directory. If the variable
+@samp{rng-schema-locating-files} has not been customized, this
+means that the rule will be added to the file @samp{schemas.xml}
+in the same directory as the document being edited.
+
+The command @kbd{C-c C-s C-t} allows you to select a schema by
+specifying an identifier for the type of the document.  The schema
+locating files determine the available type identifiers and what
+schema is used for each type identifier. This is useful when it is
+impossible to infer the right schema from either the file-name or the
+content of the document, even though the schema is already in the
+schema locating file.  A situation in which this can occur is when
+there are multiple variants of a schema where all valid documents have
+the same document element.  For example, XHTML has Strict and
+Transitional variants.  In a situation like this, a schema locating file
+can define a type identifier for each variant. As with @kbd{C-c
+C-s C-f}, Emacs will ask whether you wish to add a rule to a schema
+locating file that persistently associates the document with the
+specified type identifier.
+
+The command @kbd{C-c C-s C-l} adds a rule to a schema
+locating file that persistently associates the document with
+the schema that is currently being used.
+
+@node Schema locating files
+@section Schema locating files
+
+Each schema locating file specifies a list of rules.  The rules
+from each file are appended in order. To locate a schema each rule is
+applied in turn until a rule matches.  The first matching rule is then
+used to determine the schema.
+
+Schema locating files are designed to be useful for other
+applications that need to locate a schema for a document. In fact,
+there is nothing specific to locating schemas in the design; it could
+equally well be used for locating a stylesheet.
+
+@menu
+* Schema locating file syntax basics::  
+* Using the document's URI to locate a schema::  
+* Using the document element to locate a schema::  
+* Using type identifiers in schema locating files::  
+* Using multiple schema locating files::  
+@end menu
+
+@node Schema locating file syntax basics
+@subsection Schema locating file syntax basics
+
+There is a schema for schema locating files in the file
+@samp{locate.rnc} in the schema directory.  Schema locating
+files must be valid with respect to this schema.
+
+The document element of a schema locating file must be
+@samp{locatingRules} and the namespace URI must be
+@samp{http://thaiopensource.com/ns/locating-rules/1.0}.  The
+children of the document element specify rules. The order of the
+children is the same as the order of the rules.  Here's a complete
+example of a schema locating file:
+
+@example
+<?xml version="1.0"?>
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml.rnc"/>
+  <documentElement localName="book" uri="docbook.rnc"/>
+</locatingRules>
+@end example
+
+@noindent
+This says to use the schema @samp{xhtml.rnc} for a document with
+namespace @samp{http://www.w3.org/1999/xhtml}, and to use the
+schema @samp{docbook.rnc} for a document whose local name is
+@samp{book}.  If the document element had both a namespace URI
+of @samp{http://www.w3.org/1999/xhtml} and a local name of
+@samp{book}, then the matching rule that comes first will be
+used and so the schema @samp{xhtml.rnc} would be used.  There is
+no precedence between different types of rule; the first matching rule
+of any type is used.
+
+As usual with XML-related technologies, resources are identified
+by URIs.  The @samp{uri} attribute identifies the schema by
+specifying the URI.  The URI may be relative.  If so, it is resolved
+relative to the URI of the schema locating file that contains
+attribute. This means that if the value of @samp{uri} attribute
+does not contain a @samp{/}, then it will refer to a filename in
+the same directory as the schema locating file.
+
+@node Using the document's URI to locate a schema
+@subsection Using the document's URI to locate a schema
+
+A @samp{uri} rule locates a schema based on the URI of the
+document.  The @samp{uri} attribute specifies the URI of the
+schema.  The @samp{resource} attribute can be used to specify
+the schema for a particular document.  For example,
+
+@example
+<uri resource="spec.xml" uri="docbook.rnc"/>
+@end example
+
+@noindent
+specifies that that the schema for @samp{spec.xml} is
+@samp{docbook.rnc}.
+
+The @samp{pattern} attribute can be used instead of the
+@samp{resource} attribute to specify the schema for any document
+whose URI matches a pattern.  The pattern has the same syntax as an
+absolute or relative URI except that the path component of the URI can
+use a @samp{*} character to stand for zero or more characters
+within a path segment (i.e. any character other @samp{/}).
+Typically, the URI pattern looks like a relative URI, but, whereas a
+relative URI in the @samp{resource} attribute is resolved into a
+particular absolute URI using the base URI of the schema locating
+file, a relative URI pattern matches if it matches some number of
+complete path segments of the document's URI ending with the last path
+segment of the document's URI. For example,
+
+@example
+<uri pattern="*.xsl" uri="xslt.rnc"/>
+@end example
+
+@noindent
+specifies that the schema for documents with a URI whose path ends
+with @samp{.xsl} is @samp{xslt.rnc}.
+
+A @samp{transformURI} rule locates a schema by
+transforming the URI of the document. The @samp{fromPattern}
+attribute specifies a URI pattern with the same meaning as the
+@samp{pattern} attribute of the @samp{uri} element.  The
+@samp{toPattern} attribute is a URI pattern that is used to
+generate the URI of the schema.  Each @samp{*} in the
+@samp{toPattern} is replaced by the string that matched the
+corresponding @samp{*} in the @samp{fromPattern}.  The
+resulting string is appended to the initial part of the document's URI
+that was not explicitly matched by the @samp{fromPattern}.  The
+rule matches only if the transformed URI identifies an existing
+resource.  For example, the rule
+
+@example
+<transformURI fromPattern="*.xml" toPattern="*.rnc"/>
+@end example
+
+@noindent
+would transform the URI @samp{file:///home/jjc/docs/spec.xml}
+into the URI @samp{file:///home/jjc/docs/spec.rnc}.  Thus, this
+rule specifies that to locate a schema for a document
+@samp{@var{foo}.xml}, Emacs should test whether a file
+@samp{@var{foo}.rnc} exists in the same directory as
+@samp{@var{foo}.xml}, and, if so, should use it as the
+schema.
+
+@node Using the document element to locate a schema
+@subsection Using the document element to locate a schema
+
+A @samp{documentElement} rule locates a schema based on
+the local name and prefix of the document element. For example, a rule
+
+@example
+<documentElement prefix="xsl" localName="stylesheet" uri="xslt.rnc"/>
+@end example
+
+@noindent
+specifies that when the name of the document element is
+@samp{xsl:stylesheet}, then @samp{xslt.rnc} should be used
+as the schema. Either the @samp{prefix} or
+@samp{localName} attribute may be omitted to allow any prefix or
+local name.
+
+A @samp{namespace} rule locates a schema based on the
+namespace URI of the document element. For example, a rule
+
+@example
+<namespace ns="http://www.w3.org/1999/XSL/Transform" uri="xslt.rnc"/>
+@end example
+
+@noindent
+specifies that when the namespace URI of the document is
+@samp{http://www.w3.org/1999/XSL/Transform}, then
+@samp{xslt.rnc} should be used as the schema.
+
+@node Using type identifiers in schema locating files
+@subsection Using type identifiers in schema locating files
+
+Type identifiers allow a level of indirection in locating the
+schema for a document.  Instead of associating the document directly
+with a schema URI, the document is associated with a type identifier,
+which is in turn associated with a schema URI. nXML mode does not
+constrain the format of type identifiers.  They can be simply strings
+without any formal structure or they can be public identifiers or
+URIs.  Note that these type identifiers have nothing to do with the
+DOCTYPE declaration.  When comparing type identifiers, whitespace is
+normalized in the same way as with the @samp{xsd:token}
+datatype: leading and trailing whitespace is stripped; other sequences
+of whitespace are normalized to a single space character.
+
+Each of the rules described in previous sections that uses a
+@samp{uri} attribute to specify a schema, can instead use a
+@samp{typeId} attribute to specify a type identifier.  The type
+identifier can be associated with a URI using a @samp{typeId}
+element. For example,
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <namespace ns="http://www.w3.org/1999/xhtml" typeId="XHTML"/>
+  <typeId id="XHTML" typeId="XHTML Strict"/>
+  <typeId id="XHTML Strict" uri="xhtml-strict.rnc"/>
+  <typeId id="XHTML Transitional" uri="xhtml-transitional.rnc"/>
+</locatingRules>
+@end example
+
+@noindent
+declares three type identifiers @samp{XHTML} (representing the
+default variant of XHTML to be used), @samp{XHTML Strict} and
+@samp{XHTML Transitional}.  Such a schema locating file would
+use @samp{xhtml-strict.rnc} for a document whose namespace is
+@samp{http://www.w3.org/1999/xhtml}.  But it is considerably
+more flexible than a schema locating file that simply specified
+
+@example
+<namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml-strict.rnc"/>
+@end example
+
+@noindent
+A user can easily use @kbd{C-c C-s C-t} to select between XHTML
+Strict and XHTML Transitional. Also, a user can easily add a catalog
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <typeId id="XHTML" typeId="XHTML Transitional"/>
+</locatingRules>
+@end example
+
+@noindent
+that makes the default variant of XHTML be XHTML Transitional.
+
+@node Using multiple schema locating files
+@subsection Using multiple schema locating files
+
+The @samp{include} element includes rules from another
+schema locating file.  The behavior is exactly as if the rules from
+that file were included in place of the @samp{include} element.
+Relative URIs are resolved into absolute URIs before the inclusion is
+performed. For example,
+
+@example
+<include rules="../rules.xml"/>
+@end example
+
+@noindent
+includes the rules from @samp{rules.xml}.
+
+The process of locating a schema takes as input a list of schema
+locating files.  The rules in all these files and in the files they
+include are resolved into a single list of rules, which are applied
+strictly in order.  Sometimes this order is not what is needed.
+For example, suppose you have two schema locating files, a private
+file
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml.rnc"/>
+</locatingRules>
+@end example
+
+@noindent
+followed by a public file
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <transformURI pathSuffix=".xml" replacePathSuffix=".rnc"/>
+  <namespace ns="http://www.w3.org/1999/XSL/Transform" typeId="XSLT"/>
+</locatingRules>
+@end example
+
+@noindent
+The effect of these two files is that the XHTML @samp{namespace}
+rule takes precedence over the @samp{transformURI} rule, which
+is almost certainly not what is needed.  This can be solved by adding
+an @samp{applyFollowingRules} to the private file.
+
+@example
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <applyFollowingRules ruleType="transformURI"/>
+  <namespace ns="http://www.w3.org/1999/xhtml" uri="xhtml.rnc"/>
+</locatingRules>
+@end example
+
+@node DTDs
+@chapter DTDs
+
+nxml-mode is designed to support the creation of standalone XML
+documents that do not depend on a DTD.  Although it is common practice
+to insert a DOCTYPE declaration referencing an external DTD, this has
+undesirable side-effects.  It means that the document is no longer
+self-contained. It also means that different XML parsers may interpret
+the document in different ways, since the XML Recommendation does not
+require XML parsers to read the DTD.  With DTDs, it was impractical to
+get validation without using an external DTD or reference to an
+parameter entity.  With RELAX NG and other schema languages, you can
+simulataneously get the benefits of validation and standalone XML
+documents.  Therefore, I recommend that you do not reference an
+external DOCTYPE in your XML documents.
+
+One problem is entities for characters. Typically, as well as
+providing validation, DTDs also provide a set of character entities
+for documents to use. Schemas cannot provide this functionality,
+because schema validation happens after XML parsing.  The recommended
+solution is to either use the Unicode characters directly, or, if this
+is impractical, use character references.  nXML mode supports this by
+providing commands for entering characters and character references
+using the Unicode names, and can display the glyph corresponding to a
+character reference.
+
+@node Limitations
+@chapter Limitations
+
+nXML mode has some limitations:
+
+@itemize @bullet
+@item
+DTD support is limited.  Internal parsed general entities declared
+in the internal subset are supported provided they do not contain
+elements. Other usage of DTDs is ignored.
+@item
+The restrictions on RELAX NG schemas in section 7 of the RELAX NG
+specification are not enforced.
+@item
+Unicode support has problems. This stems mostly from the fact that
+the XML (and RELAX NG) character model is based squarely on Unicode,
+whereas the Emacs character model is not.  Emacs 22 is slated to have
+full Unicode support, which should improve the situation here.
+@end itemize
+
+@bye
+
+@ignore
+   arch-tag: 3b6e8ac2-ae8d-4f38-bd43-ce9f80be04d6
+@end ignore
index 41d1777bf5a0b4dc736642ba8a3ce1fc08af6b5a..d93774c5850d80b9b9df387a83f2a98fe5d6edc8 100644 (file)
@@ -350,7 +350,6 @@ The text used to begin each remember item.
 @subheading Insinuation
 
 @lisp
-(require 'remember-diary)
 (add-to-list 'remember-handler-functions 'remember-diary-extract-entries)
 @end lisp
 
@@ -358,6 +357,7 @@ The text used to begin each remember item.
 
 @defopt remember-diary-file
 File for extracted diary entries.
+If this is nil, then @code{diary-file} will be used instead."
 @end defopt
 
 @node Mailbox, Org, Diary, Backends
index 591122640fe61c2a9819efe89276e2e66e8f9213..d1acafefa036da69af1ecb3e97f6479a5320bca2 100644 (file)
@@ -327,9 +327,10 @@ host, followed by a newline.
 @value{tramp} now waits for the shell prompt or for a message that the login
 failed.
 
-If @value{tramp} sees neither of them after a certain period of time (a minute,
-say), then it issues an error message saying that it couldn't find the
-remote shell prompt and shows you what the remote host has sent.
+If @value{tramp} sees neither of them after a certain period of time
+(a minute, say), then it issues an error message saying that it
+couldn't find the remote shell prompt and shows you what the remote
+host has sent.
 
 If @value{tramp} sees a @samp{login failed} message, it tells you so,
 aborts the login attempt and allows you to try again.
@@ -1602,6 +1603,19 @@ the connections, like introducing a @option{Host} section in
 @file{~/.ssh/config} (@pxref{Frequently Asked Questions}) or applying
 multiple hops (@pxref{Multi-hops}).
 
+When @value{tramp} detects a changed operating system version on a
+remote host (via the command @command{uname -sr}), it flushes all
+connection related information for this host, quits the execution, and
+displays a message like this:
+
+@example
+Quit: "Connection reset, because remote host changed from `Linux
+2.6.22-13-generic' to `Linux 2.6.22-14-generic'"
+@end example
+
+@noindent
+You can simply open the remote file again in such a case.
+
 
 @node Remote Programs
 @section How @value{tramp} finds and uses programs on the remote machine.
@@ -2253,27 +2267,49 @@ filename completion on the remote host.  This works pretty much like
 for files on the local host, with the exception that minibuffer
 killing via a double-slash works only on the filename part, except
 that filename part starts with @file{//}.
+@ifset emacs
+A triple-slash stands for the default behaviour.
+@end ifset
 @ifinfo
 @xref{Minibuffer File, , , @value{emacsdir}}.
 @end ifinfo
 
+@noindent
+Example:
+
+@example
 @ifset emacs
-As example, @kbd{@trampfn{telnet, , melancholia, /usr/local/bin//etc}
-@key{TAB}} would result in
-@file{@trampfn{telnet, , melancholia, /etc}}, whereas
-@kbd{@trampfn{telnet, , melancholia, //etc} @key{TAB}} reduces the
-minibuffer contents to @file{/etc}.  A triple-slash stands for the
-default behaviour,
-i.e. @kbd{@trampfn{telnet, , melancholia, /usr/local/bin///etc}
-@key{TAB}} expands directly to @file{/etc}.
+@kbd{C-x C-f @trampfn{telnet, , melancholia, /usr/local/bin//etc} @key{TAB}}
+     @print{} @trampfn{telnet, , melancholia, /etc}
+
+@kbd{C-x C-f @trampfn{telnet, , melancholia, //etc} @key{TAB}}
+     @print{} /etc
+
+@kbd{C-x C-f @trampfn{telnet, , melancholia, /usr/local/bin///etc} @key{TAB}}
+     @print{} /etc
 @end ifset
 
 @ifset xemacs
-As example, @kbd{@trampfn{telnet, , melancholia, /usr/local/bin//}}
-would result in @file{@trampfn{telnet, , melancholia, /}}, whereas
-@kbd{@trampfn{telnet, , melancholia, //}} expands the minibuffer
-contents to @file{/}.
+@kbd{C-x C-f @trampfn{telnet, , melancholia, /usr/local/bin//}}
+     @print{} @trampfn{telnet, , melancholia, /}
+
+@kbd{C-x C-f @trampfn{telnet, , melancholia, //}}
+     @print{} /
 @end ifset
+@end example
+
+A remote directory might have changed its contents out of
+@value{emacsname} control, for example by creation or deletion of
+files by other processes.  Therefore, during filename completion the
+remote directory contents is reread regularly in order to detect such
+changes, which would be invisible otherwise (@pxref{Connection caching}).
+
+@defopt tramp-completion-reread-directory-timeout
+This variable defines the number of seconds since last remote command
+before rereading a directory contents.  A value of 0 would require an
+immediate reread during filename completion, @code{nil} means to use
+always cached values for the directory contents.
+@end defopt
 
 
 @node Remote processes
index 589e5365474a97b9c2193d01f3e896b86127e2a5..0cd4f718b1adf94763be6bc7d6db1280778716bc 100644 (file)
@@ -1,3 +1,40 @@
+2007-11-30  Kentaro Ohkouchi  <nanasess@fsm.ne.jp>
+
+       * images/icons/macemacs_16.png, images/icons/macemacs_24.png:
+       * images/icons/macemacs_32.png, images/icons/macemacs_48.png:
+       * images/icons/macemacs_256.png, images/icons/macemacs_512.png:
+       New files.
+
+2007-11-28  Glenn Morris  <rgm@gnu.org>
+
+       * nxml/: New directory, moved here from lisp/nxml/char-name/unicode.
+       * nxml/README: New file.
+
+2007-11-24  Glenn Morris  <rgm@gnu.org>
+
+       * images/gnus/mail_send.xpm: Rename to mail-send.xpm.
+
+2007-11-23  Mark A. Hershberger  <mah@everybody.org>
+
+       * NXML-NEWS: New File.
+
+       * schema: Initial merge of nxml.
+
+2007-11-22  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * NEWS: etags: the --members option is now the default.
+
+2007-11-22  Glenn Morris  <rgm@gnu.org>
+
+       * images/smilies/grayscale/README, images/smilies/medium/README:
+       New files.
+
+2007-11-12  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
+
+       * compilation.txt: Add new entries: compilation-perl--Pod::Checker,
+       compilation-perl--Test, compilation-perl--Test::Harness and
+       compilation-weblint.
+
 2007-11-01  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * MACHINES: Remove Sun windows info.
        * refcards/gnus-refcard.tex: Restore Feb 2007 copyright
        clarifications lost in update to Gnus trunk.
 
+2007-10-28  Adam Sj\e,Ax\e(Bgren  <asjo@koldfront.dk>
+
+       * images/smilies/grayscale/*.xpm: New larger grayscale smileys.
+
+       * images/smilies/medium/*.xpm: New colorful smileys.
+
 2007-10-29  Michael Olson  <mwolson@gnu.org>
 
        * ERC-NEWS: Update for recent change.
index 585f62087d0a6569ac48184d0d6e561df80806ed..f7817bafb6a23934ba68636f0b64b92e25f9b2e3 100644 (file)
@@ -58,7 +58,7 @@ Articles::.
 
 ** International host names (IDNA) can now be decoded inside article bodies
 using `W i' (`gnus-summary-idna-message').  This requires that GNU Libidn
-(`http://www.gnu.org/software/libidn/') has been installed.
+(<http://www.gnu.org/software/libidn/>) has been installed.
 
 ** The non-ASCII group names handling has been much improved.  The back
 ends that fully support non-ASCII group names are now `nntp', `nnml',
@@ -106,7 +106,7 @@ From Newsgroups::.
 
 ** You can replace MIME parts with external bodies.  See
 `gnus-mime-replace-part' and `gnus-article-replace-part'.  *Note MIME
-Commands::, *note Using MIME::.
+Commands::, *Note Using MIME::.
 
 ** The option `mm-fill-flowed' can be used to disable treatment of
 format=flowed messages.  Also, flowed text is disabled when sending
@@ -146,7 +146,7 @@ Variables.
 ** The option `message-citation-line-format' controls the format of the
 "Whomever writes:" line.  You need to set
 `message-citation-line-function' to
-`message-insert-formated-citation-line' as well.
+`message-insert-formatted-citation-line' as well.
 
 \f
 * Changes in back ends
index 581547fe1165deda918578d86c04b52773777c51..5af239c8f4cf177c5287378b80f4b873c5815e7c 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -40,6 +40,8 @@ a GIF library.
 
 ** The `emacstool' utility has been removed.
 
+** The new configuration option "--with-dbus" enables D-Bus language
+bindings for Emacs.
 \f
 * Changes in Emacs 23.1
 
@@ -53,6 +55,7 @@ testing for the `multi-tty' feature.
 OS-X-style icons (an application icon and a relevant document icon)
 were contributed by Kentaro Ohkouchi.
 Source files for these icons can be found in Emacs.app/Contents/Resources.
+PNG versions are available as etc/images/icons/macemacs_*.png.
 
 ** Built-in functions (subr) can now have an interactive specification
 that is not a prompt string.  If the `intspec' parameter of a `DEFUN'
@@ -120,6 +123,11 @@ following arguments.
 \f
 * Incompatible Editing Changes in Emacs 23.1
 
++++
+** In Dired-x, all command guesses for ! are now added to the default
+list accessible by M-n instead of pushing all guesses temporarily into
+the history list.
+
 \f
 * Editing Changes in Emacs 23.1
 
@@ -152,6 +160,17 @@ strings on the kill ring.
 
 ** Minibuffer changes:
 
+*** In C-x d, if you type M-n you get the visited file name of the
+current buffer.
+
+*** In Dired, a list of commands for ! extracted from mailcap according to
+file extensions are added to the default list accessible by M-n.
+
+*** A list of regexp default values is available via M-n for `occur',
+`keep-lines', `flush-lines' and `how-many'.  This list includes the active
+region in transient-mark-mode, the word under the cursor, the last isearch
+regexp, the last isearch string and the last replacement regexp.
+
 *** isearch started in the minibuffer searches in the minibuffer history.
 Reverse isearch commands (C-r, C-M-r) search in previous minibuffer
 history elements, and forward isearch commands (C-s, C-M-s) search in
@@ -163,12 +182,17 @@ history element containing the search string becomes the current.
 \f
 * New Modes and Packages in Emacs 23.1
 
+** FIXME add details of new packages imported from lisp/gnus.
+
 ** The package doc-view.el has been added.  It supports viewing of PDF,
 PostScript and DVI documents inside an Emacs buffer by converting the
 document to a set of PNG images first.  One can also search for a
 regular expression in the document.  The commentary of the file explains
 its usage.
 
+** The nXML package has been added.
+[FIXME someone who uses this, please write a brief description.]
+
 ** A new game called `bubbles' has been added.
 
 ** minibuffer-indicate-depth-mode shows the minibuffer depth in the prompt.
@@ -178,6 +202,10 @@ mode for quickly jotting down things to remember.  Included with
 remember.el is a backend that can save notes to a Diary file.  Please
 consult the Remember Manual for usage details.
 
+** D-Bus language bindings for Elisp are provided by the package
+dbus.el and by extensions to the C modules of Emacs.  D-Bus is an
+inter-process communication mechanism for applications residing on the
+same host, based on messages.  See the manual for further details.
 \f
 * Changes in Specialized Modes and Packages in Emacs 23.1
 
@@ -201,10 +229,10 @@ than `with-output-to-temp-buffer' with `print-help-return-message'.
 *** New option `help-window-select' permits to customize whether help
 window shall be automatically selected when invoking help.
 *** New variable `help-window-point-marker' permits to specify new
-position of point in help window (for example in `view-lossage'). 
+position of point in help window (for example in `view-lossage').
 
 ** view-remove-frame-by-deleting is now by default t
-since users found iconification of view-mode frames distracting. 
+since users found iconification of view-mode frames distracting.
 
 ** isearch can now search through multiple ChangeLog files.
 When running isearch in a ChangeLog file, if the search fails,
@@ -213,11 +241,6 @@ if there is one (e.g. go from ChangeLog to ChangeLog.12).
 
 This is enabled if isearch-buffers-multi is non-nil.
 
-+++
-** In Dired-x, all command guesses for ! are now added to the default
-list accessible by M-n instead of pushing all guesses temporarily into
-the history list.
-
 ** smerge-refine highlights word-level details of changes in conflict.
 It's used automatically as you move through conflicts, see smerge-auto-refine.
 
@@ -242,6 +265,12 @@ with the face `eldoc-highlight-function-argument'.
 ** defcustom accepts new keyword arguments, `:safe' and `:risky', which
 set a variable's `safe-local-variable' and `risky-local-variable' property.
 
+** Etags changes.
+*** The --members option is now the default.
+
+Use --no-members if you want the old default behaviour of not tagging
+struct members in C, members variables in C++ and variables in PHP.
+
 ** VC
 *** Clicking on the VC mode-line entry now pops the VC menu.
 
@@ -254,6 +283,11 @@ version-control systems such as Subversion, GNU Arch, Mercurial, and
 Bzr. VC will now pass a multiple-file commit to these systems
 as a single changeset.
 
+*** In VC Annotate mode, you can type V to toggle the annotation visibility.
+
+** log-edit now has a command bound to C-c C-d to show the diff for
+the files involved.
+
 ** sgml-electric-tag-pair-mode lets you simultaneously edit matched tag pairs.
 
 ** The appearance of superscript and subscript in TeX is more customizable.
@@ -369,6 +403,12 @@ because they clash with commands provided by dirtrack.el.  Use
 \f
 * Lisp Changes in Emacs 23.1
 
+** `beginning-of-defun-function' now takes one argument, the count
+   given to `beginning-of-defun'.
+
+** The variable `inhibit-changing-match-data', if non-nil, prevents the
+search and match primitives from changing the match data.
+
 +++
 ** New function `match-substitute-replacement' returns the result of
 `replace-match' without actually using it in the buffer.
@@ -391,6 +431,11 @@ applies before function-key-map.  Also it is terminal-local contrary to
 key-translation-map.  Terminal-specific key-sequences are generally added to
 this map rather than to function-key-map now.
 
+** The new macro `declare-function' suppresses compiler warnings about
+undefined functions.  The new `check-declare' package verifies that such
+statements are accurate (i.e. the functions are actually defined in
+the specified files).
+
 ** The new function `read-color' reads a color name using the minibuffer.
 
 ** Changes related to multiple tty support.
@@ -486,6 +531,9 @@ but obeys file handlers.  The file handler is chosen based on
 and `process-file-shell-command' are also new; they call internally
 `start-file-process' and `process-file', respectively.
 
+** The new function `process-lines' executes an external program and
+returns its output as a list of lines.
+
 +++
 ** `file-remote-p' has new optional parameters IDENTIFICATION and CONNECTED.
 IDENTIFICATION specifies which part of the remote identifier has to be
index a8e8b3fbb8cb1b9420dc132585e995357382789a..d7368ac6f386d56e62001e843864f78efde6d3c4 100644 (file)
@@ -40,6 +40,8 @@ below.  Emacs tries to warn you about these through `bad-packages-alist'.
 
 ** Emacs is now licensed under the GNU GPL version 3 (or later).
 
+** Support for GNU/kFreeBSD (GNU userland and FreeBSD kernel) was added.
+
 * Changes in Emacs 22.2
 
 ** In Image mode, whenever the displayed image is wider and/or higher
@@ -3136,11 +3138,6 @@ be used (only once) in place of a file name on the command line.  Etags
 reads from standard input and marks the produced tags as belonging to
 the file FILE.
 
-*** The --members option is now the default.
-
-Use --no-members if you want the old default behaviour of not tagging
-struct members in C, members variables in C++ and variables in PHP.
-
 ** Ctags changes.
 
 *** Ctags now allows duplicate tags
diff --git a/etc/NXML-NEWS b/etc/NXML-NEWS
new file mode 100644 (file)
index 0000000..cebbab8
--- /dev/null
@@ -0,0 +1,199 @@
+20041004
+--------
+
+Support for outlining has been added. See the manual for more details.
+
+C-u C-c C-n goes to the first error.
+
+20040910
+--------
+
+C-c RET splits the current element as in PSGML.
+
+20040908
+--------
+
+Indentation has been rewritten.  Indentation of attribute names and
+values should work better.  The default value of
+`nxml-attribute-indent' has been changed to 4.
+
+Syntax highlighting with a dark background should now work.
+
+20040726
+--------
+
+The attribute pathSuffix on the uri element in schema locating files
+has been replaced by a more general pattern attribute. The
+transformURI element now has required fromPattern and toPattern
+attributes.
+
+The schema related bindings have been changed to use C-c C-s as a prefix
+as follows:
+
+  C-c C-s => C-c C-s C-f (f for file)
+  C-c C-a => C-c C-s C-a
+  C-c C-t => C-c C-s C-t
+  C-c C-l => C-c C-s C-l
+  C-c C-w => C-c C-s C-w
+
+There's now an XML menu on the menu-bar.
+
+20031031
+--------
+
+C-c C-d "dynamically" chooses a tag to put around the word before
+point, rather like M-/.
+
+The mechanism for locating the schema has changed completely.  The new
+mechanism is described in the manual.  Any existing customizations of
+`rng-auto-element-alist' or `rng-auto-file-name-alist' will no longer
+be effective.
+
+C-c C-a is now bound to rng-auto-set-schema.
+
+20031018
+--------
+
+Unicode names can be used to insert characters with the new command
+C-c C-u.  Normally, this inserts a character reference.  With a prefix
+arg (i.e. C-u C-c C-u), it inserts the character directly.  You can
+customize `nxml-enabled-unicode-blocks' to control what Unicode blocks
+are used for completing names.
+
+Extra information is displayed for character references.  The Unicode
+name is displayed in a tooltip. A glyph for the referenced character
+is displayed in a distinguished face following the character
+reference; this can be disabled by customizing
+`nxml-char-ref-display-glyph-flag'.  The command
+`nxml-toggle-char-ref-extra-display' dynamically toggles the display
+of extra information for character references for a particular buffer.
+This can be used if the display of extra information is causing
+performance problems. nXML mode tries to figure out which glyphs can
+be displayed. Unfortunately Emacs doesn't provide the primitives
+necessary to do this properly, so nXML mode has to guess and will
+sometimes guess wrong.  The hook `nxml-glyph-set-hook' can be used to
+change nXML mode's guess.
+
+New command C-c C-w says what schema is being used.
+
+C-c C-s now turns on validation if it is not already on.
+
+20030928
+--------
+
+M-q has been implemented so that it works reasonably with XML.  Other
+paragraph-related commands (M-{, M-}, M-h) have also been implemented.
+
+New command M-x rng-auto-set-schema to set the schema based on the
+buffer's current contents and file-name. This is called automatically
+when rng-validate-mode is first enabled.
+
+There's now a C-M-d to go with C-M-u.  C-M-d moves forward down into
+the content of an element.  C-M-n and C-M-p move to the next or
+previous element.
+
+By default, the sexp commands (C-M-f, C-M-b, C-M-k, C-M-SPC) operate
+on tags rather than elements.  To restore the old behaviour,
+customize nxml-sexp-element-flag.
+
+The file TUTORIAL has been replaced by nxml-mode.info; this is in info
+format and can be read using Emacs.  The source is maintained in a
+simple, ad-hoc XML format.
+
+20030915
+--------
+
+XML encodings should now work properly.  When saving a buffer,
+nxml-mode arranges to use the encoding declared in the XML
+declaration.  If there is no encoding declared, then nxml-mode will
+use utf-8 or utf-16 according to the user options
+`nxml-prefer-utf-16-to-utf-8-flag' and
+`nxml-prefer-utf-16-little-to-big-endian-flag'. If the chosen encoding
+cannot encode all the characters in the buffer, nxml-mode will
+complain and give the user an opportunity to use an encoding that can.
+
+A new command C-c C-x inserts an XML declaration.
+
+The option `nxml-auto-insert-xml-declaration-flag' automatically
+inserts an XML declaration in new files.
+
+The `nxml-default-buffer-file-coding-system' option allows a different
+default buffer-file-coding-system for nXML mode buffers.  This affects
+what XML declaration is inserted.
+
+Encoding names in XML declarations are now validated by
+rng-validate-mode.
+
+RDF/XML schema was updated to version in 05 September 2003 WD.
+
+20030912
+--------
+
+The tutorial has a new section on inserting end-tags.
+
+By default </ no longer automatically inserts the rest of the end-tag.
+You can do
+
+  M-x customize-variable RET nxml-slash-auto-complete-flag RET
+
+and then follow the instructions displayed in the buffer to get the
+old behaviour.
+
+Completion after </ will complete the rest of the end-tag. Completion
+after < will include the end-tag in the possibilities if allowed by
+the schema.
+
+You can use C-c C-i instead of > to close the start-tag of an
+inline-level element.  After inserting the >, it will insert the
+end-tag and leave point before the end-tag. The `i' is supposed to be
+mnemonic for `inline'. C-c C-b is similar, but for block elements: the
+start-tag, point and the end-tag will all be on separate lines.
+
+The binding for inserting an end-tag has changed from C-c / to C-c C-f
+to comply with Emacs guidelines about what keys major modes should
+bind.  The `f' is supposed to be mnemonic for `finish'.
+
+Completion always puts point after all the characters it inserts. It
+doesn't insert a `>' after completing a start-tag name.
+
+Completion no longer completes CDATA section and comment delimiters.
+
+The nxml-start-auto-coding command enables auto-detection of a file's
+encoding as specified in the XML Recommendation for files that use
+nxml-mode; rng-auto.el calls this.
+
+20030906
+--------
+
+Validation messages applicable to point are displayed automatically.
+
+Completion can deal with prefixes that haven't yet been declared.
+
+rng-preferred-prefix-alist variable added.
+
+Namespace URIs can be completed.
+
+xmlns and xmlns:* attributes can be completed.
+
+CDATA section and comment delimiters can be completed.
+
+Each kind of completion has its own history.
+
+Completion function moved to nxml-mode; uses a hook to allow
+schema-sensitive completion.  Completion function bound to C-return.
+Also bound to M-TAB as before, unless
+nxml-bind-meta-tab-to-complete-flag is nil.  When there is a window
+system, nxml-bind-meta-tab-to-complete-flag is nil by default, This
+avoid problems with M-TAB, which is not passed through by several
+window systems/managers.
+
+TUTORIAL file added.
+
+NEWS file added.
+
+Bug fixes.
+
+20030901
+--------
+
+Initial release.
index 049c8c8bb6d952466e1ea45a882c5e98d785ec09..45202e7e057409198cdd667d02919b2f66335242 100644 (file)
@@ -2222,7 +2222,11 @@ This combination of keys is a command to change keyboard layout.  If
 you proceed to type another non-modifier key before you let go of Alt
 and Shift, the Alt and Shift act as modifiers in the usual way.  A
 more permanent work around is to change it to another key combination,
-or disable it in the keyboard control panel.
+or disable it in the "Regional and Language Options" applet of the
+Control Panel.  (The exact sequence of mouse clicks in the "Regional
+and Language Options" applet needed to find the key combination that
+changes the keyboard layout depends on your Windows version; for XP,
+in the Languages tab, click "Details" and then "Key Settings".)
 
 ** Cygwin build of Emacs hangs after rebasing Cygwin DLLs
 
index c702f8997c3c296cce489f3966e0ea5c1edee0ab..a1b8659dfa3b9043006883804a3d7a2f0eec6023 100644 (file)
--- a/etc/TODO
+++ b/etc/TODO
@@ -29,10 +29,6 @@ I.e. mouse-set-font should use customize-face.
 the mouse is put to rest or after a delay or both, so that moving over
 a window doesn't select it.
 
-** In C-x d, the default if you type RET should be the directory name,
-but if you type M-n you should get the visited file name of the
-current buffer.
-
 ** Distribute a bar cursor of width > 1 evenly between the two glyphs
    on each side of the bar (what to do at the edges?).
 
@@ -113,6 +109,9 @@ and
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<device>\
 where <device> is the network device found under the first key.
 
+** Check for any included packages that define obsolete bug-reporting commands.
+Change them to use report-emacs-bug.
+
 * Important features:
 
 ** Provide user-friendly ways to list all available font families,
@@ -322,9 +321,7 @@ typically due to pilot errors and should thus be in debug-ignored-errors.
   the whole menu bar.  In the mean time, it should process other messages.
 
 ** Get some major packages installed: W3 (development version needs
-  significant work), PSGML, nXML [Mark Hershberger is looking at this
-  http://lists.gnu.org/archive/html/emacs-devel/2007-09/msg01699.html],
-  _possibly_ Cedet and ECB.
+  significant work), PSGML, _possibly_ Cedet and ECB.
   http://lists.gnu.org/archive/html/emacs-devel/2007-05/msg01493.html
   Check the assignments file for other packages which might go in and
   have been missed.
index 2b30b17abdc4d6a60976fceb39cba587ec0278f6..426cb19ade961eb6e16ce6841ad54e0d9ccba632 100644 (file)
@@ -370,6 +370,36 @@ symbol: gcov-file gcov-bb-file gcov-never-called-line gcov-called-line
         -:   18:} 
 
 
+* Podchecker error messages, per Pod::Checker
+
+symbol: compilation-perl--Pod::Checker
+
+*** ERROR: Spurious text after =cut at line 193 in file foo.pm
+*** ERROR: =over on line 37 without closing =back at line EOF in file bar.pm
+*** ERROR: =over on line 1 without closing =back (at head1) at line 3 in file x.pod
+
+
+* Perl Test module error messages
+
+symbol: compilation-perl--Test
+
+# Failed test 1 in foo.t at line 6
+
+
+* Perl Test::Harness output
+
+symbol: compilation-perl--Test::Harness
+
+NOK 1# Test 1 got: "1234" (t/foo.t at line 46)
+
+
+* Perl HTML::Lint::Error::as_string()
+
+symbol: compilation-weblint
+
+index.html (13:1) Unknown element <fdjsk>
+
+
 * Directory tracking
 
 Directories are matched via `compilation-directory-matcher'.  Files which are
index 09208d3d11d029babf5ea3c3e030ef22a3f58d68..e4e7d523772fe42fa2c04964897afaacac9530d1 100644 (file)
@@ -35,3 +35,4 @@ but distributed and used by Emacs.
 toggle-subscription.xpm       (GNOME stock/document/stock_task-recurring)
 kill-group.pbm and kill-group.xpm are converted from close.xpm
 rot13.pbm and rot13.xpm are converted from lock.xpm
+mail-send.xpm  ?
index ff53516acce131e4e7bc547ce627ea6dab997546..056d6baf57b0f45564bf055113c4477a2e365edd 100644 (file)
@@ -4,3 +4,9 @@ Files: emacs_16.png emacs_24.png emacs_32.png emacs_48.png
 Author: Andrew Zhilin <andrew_zhilin@yahoo.com>
 Copyright (C) 2005, 2006, 2007  Free Software Foundation, Inc.
 License: GNU General Public License version 3 or later (see COPYING)
+
+Files: macemacs_16.png  macemacs_24.png  macemacs_32.png macemacs_48.png
+       macemacs_256.png macemacs_512.png
+Author: Kentaro Ohkouchi <nanasess@fsm.ne.jp>
+Copyright (C) 2007  Free Software Foundation, Inc.
+License: GNU General Public License version 3 or later (see COPYING)
diff --git a/etc/images/icons/macemacs_16.png b/etc/images/icons/macemacs_16.png
new file mode 100644 (file)
index 0000000..0f112d8
Binary files /dev/null and b/etc/images/icons/macemacs_16.png differ
diff --git a/etc/images/icons/macemacs_24.png b/etc/images/icons/macemacs_24.png
new file mode 100644 (file)
index 0000000..7666a1d
Binary files /dev/null and b/etc/images/icons/macemacs_24.png differ
diff --git a/etc/images/icons/macemacs_256.png b/etc/images/icons/macemacs_256.png
new file mode 100644 (file)
index 0000000..5529c75
Binary files /dev/null and b/etc/images/icons/macemacs_256.png differ
diff --git a/etc/images/icons/macemacs_32.png b/etc/images/icons/macemacs_32.png
new file mode 100644 (file)
index 0000000..94bfe88
Binary files /dev/null and b/etc/images/icons/macemacs_32.png differ
diff --git a/etc/images/icons/macemacs_48.png b/etc/images/icons/macemacs_48.png
new file mode 100644 (file)
index 0000000..ac3e703
Binary files /dev/null and b/etc/images/icons/macemacs_48.png differ
diff --git a/etc/images/icons/macemacs_512.png b/etc/images/icons/macemacs_512.png
new file mode 100644 (file)
index 0000000..b817081
Binary files /dev/null and b/etc/images/icons/macemacs_512.png differ
diff --git a/etc/images/smilies/grayscale/README b/etc/images/smilies/grayscale/README
new file mode 100644 (file)
index 0000000..10c3e3c
--- /dev/null
@@ -0,0 +1,6 @@
+Files: blink.xpm braindamaged.xpm cry.xpm dead.xpm evil.xpm forced.xpm
+       frown.xpm grin.xpm indifferent.xpm reverse-smile.xpm sad.xpm
+       smile.xpm wry.xpm 
+Author: Adam Sjøgren
+Copyright (C) 2007 Free Software Foundation, Inc.
+License: GNU General Public License version 3 or later (see COPYING)
diff --git a/etc/images/smilies/medium/README b/etc/images/smilies/medium/README
new file mode 100644 (file)
index 0000000..10c3e3c
--- /dev/null
@@ -0,0 +1,6 @@
+Files: blink.xpm braindamaged.xpm cry.xpm dead.xpm evil.xpm forced.xpm
+       frown.xpm grin.xpm indifferent.xpm reverse-smile.xpm sad.xpm
+       smile.xpm wry.xpm 
+Author: Adam Sjøgren
+Copyright (C) 2007 Free Software Foundation, Inc.
+License: GNU General Public License version 3 or later (see COPYING)
diff --git a/etc/nxml/00000-0007F.el b/etc/nxml/00000-0007F.el
new file mode 100644 (file)
index 0000000..da2be08
--- /dev/null
@@ -0,0 +1,99 @@
+(nxml-define-char-name-set 'basic-latin
+  '(("SPACE" #x0020)
+    ("EXCLAMATION MARK" #x0021)
+    ("QUOTATION MARK" #x0022)
+    ("NUMBER SIGN" #x0023)
+    ("DOLLAR SIGN" #x0024)
+    ("PERCENT SIGN" #x0025)
+    ("AMPERSAND" #x0026)
+    ("APOSTROPHE" #x0027)
+    ("LEFT PARENTHESIS" #x0028)
+    ("RIGHT PARENTHESIS" #x0029)
+    ("ASTERISK" #x002A)
+    ("PLUS SIGN" #x002B)
+    ("COMMA" #x002C)
+    ("HYPHEN-MINUS" #x002D)
+    ("FULL STOP" #x002E)
+    ("SOLIDUS" #x002F)
+    ("DIGIT ZERO" #x0030)
+    ("DIGIT ONE" #x0031)
+    ("DIGIT TWO" #x0032)
+    ("DIGIT THREE" #x0033)
+    ("DIGIT FOUR" #x0034)
+    ("DIGIT FIVE" #x0035)
+    ("DIGIT SIX" #x0036)
+    ("DIGIT SEVEN" #x0037)
+    ("DIGIT EIGHT" #x0038)
+    ("DIGIT NINE" #x0039)
+    ("COLON" #x003A)
+    ("SEMICOLON" #x003B)
+    ("LESS-THAN SIGN" #x003C)
+    ("EQUALS SIGN" #x003D)
+    ("GREATER-THAN SIGN" #x003E)
+    ("QUESTION MARK" #x003F)
+    ("COMMERCIAL AT" #x0040)
+    ("LATIN CAPITAL LETTER A" #x0041)
+    ("LATIN CAPITAL LETTER B" #x0042)
+    ("LATIN CAPITAL LETTER C" #x0043)
+    ("LATIN CAPITAL LETTER D" #x0044)
+    ("LATIN CAPITAL LETTER E" #x0045)
+    ("LATIN CAPITAL LETTER F" #x0046)
+    ("LATIN CAPITAL LETTER G" #x0047)
+    ("LATIN CAPITAL LETTER H" #x0048)
+    ("LATIN CAPITAL LETTER I" #x0049)
+    ("LATIN CAPITAL LETTER J" #x004A)
+    ("LATIN CAPITAL LETTER K" #x004B)
+    ("LATIN CAPITAL LETTER L" #x004C)
+    ("LATIN CAPITAL LETTER M" #x004D)
+    ("LATIN CAPITAL LETTER N" #x004E)
+    ("LATIN CAPITAL LETTER O" #x004F)
+    ("LATIN CAPITAL LETTER P" #x0050)
+    ("LATIN CAPITAL LETTER Q" #x0051)
+    ("LATIN CAPITAL LETTER R" #x0052)
+    ("LATIN CAPITAL LETTER S" #x0053)
+    ("LATIN CAPITAL LETTER T" #x0054)
+    ("LATIN CAPITAL LETTER U" #x0055)
+    ("LATIN CAPITAL LETTER V" #x0056)
+    ("LATIN CAPITAL LETTER W" #x0057)
+    ("LATIN CAPITAL LETTER X" #x0058)
+    ("LATIN CAPITAL LETTER Y" #x0059)
+    ("LATIN CAPITAL LETTER Z" #x005A)
+    ("LEFT SQUARE BRACKET" #x005B)
+    ("REVERSE SOLIDUS" #x005C)
+    ("RIGHT SQUARE BRACKET" #x005D)
+    ("CIRCUMFLEX ACCENT" #x005E)
+    ("LOW LINE" #x005F)
+    ("GRAVE ACCENT" #x0060)
+    ("LATIN SMALL LETTER A" #x0061)
+    ("LATIN SMALL LETTER B" #x0062)
+    ("LATIN SMALL LETTER C" #x0063)
+    ("LATIN SMALL LETTER D" #x0064)
+    ("LATIN SMALL LETTER E" #x0065)
+    ("LATIN SMALL LETTER F" #x0066)
+    ("LATIN SMALL LETTER G" #x0067)
+    ("LATIN SMALL LETTER H" #x0068)
+    ("LATIN SMALL LETTER I" #x0069)
+    ("LATIN SMALL LETTER J" #x006A)
+    ("LATIN SMALL LETTER K" #x006B)
+    ("LATIN SMALL LETTER L" #x006C)
+    ("LATIN SMALL LETTER M" #x006D)
+    ("LATIN SMALL LETTER N" #x006E)
+    ("LATIN SMALL LETTER O" #x006F)
+    ("LATIN SMALL LETTER P" #x0070)
+    ("LATIN SMALL LETTER Q" #x0071)
+    ("LATIN SMALL LETTER R" #x0072)
+    ("LATIN SMALL LETTER S" #x0073)
+    ("LATIN SMALL LETTER T" #x0074)
+    ("LATIN SMALL LETTER U" #x0075)
+    ("LATIN SMALL LETTER V" #x0076)
+    ("LATIN SMALL LETTER W" #x0077)
+    ("LATIN SMALL LETTER X" #x0078)
+    ("LATIN SMALL LETTER Y" #x0079)
+    ("LATIN SMALL LETTER Z" #x007A)
+    ("LEFT CURLY BRACKET" #x007B)
+    ("VERTICAL LINE" #x007C)
+    ("RIGHT CURLY BRACKET" #x007D)
+    ("TILDE" #x007E)
+    ))
+
+;; arch-tag: c46ffe15-ef5b-46f6-837f-d6bcf56db5b2
diff --git a/etc/nxml/00080-000FF.el b/etc/nxml/00080-000FF.el
new file mode 100644 (file)
index 0000000..61fd8e0
--- /dev/null
@@ -0,0 +1,100 @@
+(nxml-define-char-name-set 'latin-1-supplement
+  '(("NO-BREAK SPACE" #x00A0)
+    ("INVERTED EXCLAMATION MARK" #x00A1)
+    ("CENT SIGN" #x00A2)
+    ("POUND SIGN" #x00A3)
+    ("CURRENCY SIGN" #x00A4)
+    ("YEN SIGN" #x00A5)
+    ("BROKEN BAR" #x00A6)
+    ("SECTION SIGN" #x00A7)
+    ("DIAERESIS" #x00A8)
+    ("COPYRIGHT SIGN" #x00A9)
+    ("FEMININE ORDINAL INDICATOR" #x00AA)
+    ("LEFT-POINTING DOUBLE ANGLE QUOTATION MARK" #x00AB)
+    ("NOT SIGN" #x00AC)
+    ("SOFT HYPHEN" #x00AD)
+    ("REGISTERED SIGN" #x00AE)
+    ("MACRON" #x00AF)
+    ("DEGREE SIGN" #x00B0)
+    ("PLUS-MINUS SIGN" #x00B1)
+    ("SUPERSCRIPT TWO" #x00B2)
+    ("SUPERSCRIPT THREE" #x00B3)
+    ("ACUTE ACCENT" #x00B4)
+    ("MICRO SIGN" #x00B5)
+    ("PILCROW SIGN" #x00B6)
+    ("MIDDLE DOT" #x00B7)
+    ("CEDILLA" #x00B8)
+    ("SUPERSCRIPT ONE" #x00B9)
+    ("MASCULINE ORDINAL INDICATOR" #x00BA)
+    ("RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK" #x00BB)
+    ("VULGAR FRACTION ONE QUARTER" #x00BC)
+    ("VULGAR FRACTION ONE HALF" #x00BD)
+    ("VULGAR FRACTION THREE QUARTERS" #x00BE)
+    ("INVERTED QUESTION MARK" #x00BF)
+    ("LATIN CAPITAL LETTER A WITH GRAVE" #x00C0)
+    ("LATIN CAPITAL LETTER A WITH ACUTE" #x00C1)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX" #x00C2)
+    ("LATIN CAPITAL LETTER A WITH TILDE" #x00C3)
+    ("LATIN CAPITAL LETTER A WITH DIAERESIS" #x00C4)
+    ("LATIN CAPITAL LETTER A WITH RING ABOVE" #x00C5)
+    ("LATIN CAPITAL LETTER AE" #x00C6)
+    ("LATIN CAPITAL LETTER C WITH CEDILLA" #x00C7)
+    ("LATIN CAPITAL LETTER E WITH GRAVE" #x00C8)
+    ("LATIN CAPITAL LETTER E WITH ACUTE" #x00C9)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX" #x00CA)
+    ("LATIN CAPITAL LETTER E WITH DIAERESIS" #x00CB)
+    ("LATIN CAPITAL LETTER I WITH GRAVE" #x00CC)
+    ("LATIN CAPITAL LETTER I WITH ACUTE" #x00CD)
+    ("LATIN CAPITAL LETTER I WITH CIRCUMFLEX" #x00CE)
+    ("LATIN CAPITAL LETTER I WITH DIAERESIS" #x00CF)
+    ("LATIN CAPITAL LETTER ETH" #x00D0)
+    ("LATIN CAPITAL LETTER N WITH TILDE" #x00D1)
+    ("LATIN CAPITAL LETTER O WITH GRAVE" #x00D2)
+    ("LATIN CAPITAL LETTER O WITH ACUTE" #x00D3)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX" #x00D4)
+    ("LATIN CAPITAL LETTER O WITH TILDE" #x00D5)
+    ("LATIN CAPITAL LETTER O WITH DIAERESIS" #x00D6)
+    ("MULTIPLICATION SIGN" #x00D7)
+    ("LATIN CAPITAL LETTER O WITH STROKE" #x00D8)
+    ("LATIN CAPITAL LETTER U WITH GRAVE" #x00D9)
+    ("LATIN CAPITAL LETTER U WITH ACUTE" #x00DA)
+    ("LATIN CAPITAL LETTER U WITH CIRCUMFLEX" #x00DB)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS" #x00DC)
+    ("LATIN CAPITAL LETTER Y WITH ACUTE" #x00DD)
+    ("LATIN CAPITAL LETTER THORN" #x00DE)
+    ("LATIN SMALL LETTER SHARP S" #x00DF)
+    ("LATIN SMALL LETTER A WITH GRAVE" #x00E0)
+    ("LATIN SMALL LETTER A WITH ACUTE" #x00E1)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX" #x00E2)
+    ("LATIN SMALL LETTER A WITH TILDE" #x00E3)
+    ("LATIN SMALL LETTER A WITH DIAERESIS" #x00E4)
+    ("LATIN SMALL LETTER A WITH RING ABOVE" #x00E5)
+    ("LATIN SMALL LETTER AE" #x00E6)
+    ("LATIN SMALL LETTER C WITH CEDILLA" #x00E7)
+    ("LATIN SMALL LETTER E WITH GRAVE" #x00E8)
+    ("LATIN SMALL LETTER E WITH ACUTE" #x00E9)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX" #x00EA)
+    ("LATIN SMALL LETTER E WITH DIAERESIS" #x00EB)
+    ("LATIN SMALL LETTER I WITH GRAVE" #x00EC)
+    ("LATIN SMALL LETTER I WITH ACUTE" #x00ED)
+    ("LATIN SMALL LETTER I WITH CIRCUMFLEX" #x00EE)
+    ("LATIN SMALL LETTER I WITH DIAERESIS" #x00EF)
+    ("LATIN SMALL LETTER ETH" #x00F0)
+    ("LATIN SMALL LETTER N WITH TILDE" #x00F1)
+    ("LATIN SMALL LETTER O WITH GRAVE" #x00F2)
+    ("LATIN SMALL LETTER O WITH ACUTE" #x00F3)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX" #x00F4)
+    ("LATIN SMALL LETTER O WITH TILDE" #x00F5)
+    ("LATIN SMALL LETTER O WITH DIAERESIS" #x00F6)
+    ("DIVISION SIGN" #x00F7)
+    ("LATIN SMALL LETTER O WITH STROKE" #x00F8)
+    ("LATIN SMALL LETTER U WITH GRAVE" #x00F9)
+    ("LATIN SMALL LETTER U WITH ACUTE" #x00FA)
+    ("LATIN SMALL LETTER U WITH CIRCUMFLEX" #x00FB)
+    ("LATIN SMALL LETTER U WITH DIAERESIS" #x00FC)
+    ("LATIN SMALL LETTER Y WITH ACUTE" #x00FD)
+    ("LATIN SMALL LETTER THORN" #x00FE)
+    ("LATIN SMALL LETTER Y WITH DIAERESIS" #x00FF)
+    ))
+
+;; arch-tag: f7ca0f06-9eb7-4b7a-b014-795af10f23ac
diff --git a/etc/nxml/00100-0017F.el b/etc/nxml/00100-0017F.el
new file mode 100644 (file)
index 0000000..5c15ef9
--- /dev/null
@@ -0,0 +1,132 @@
+(nxml-define-char-name-set 'latin-extended-a
+  '(("LATIN CAPITAL LETTER A WITH MACRON" #x0100)
+    ("LATIN SMALL LETTER A WITH MACRON" #x0101)
+    ("LATIN CAPITAL LETTER A WITH BREVE" #x0102)
+    ("LATIN SMALL LETTER A WITH BREVE" #x0103)
+    ("LATIN CAPITAL LETTER A WITH OGONEK" #x0104)
+    ("LATIN SMALL LETTER A WITH OGONEK" #x0105)
+    ("LATIN CAPITAL LETTER C WITH ACUTE" #x0106)
+    ("LATIN SMALL LETTER C WITH ACUTE" #x0107)
+    ("LATIN CAPITAL LETTER C WITH CIRCUMFLEX" #x0108)
+    ("LATIN SMALL LETTER C WITH CIRCUMFLEX" #x0109)
+    ("LATIN CAPITAL LETTER C WITH DOT ABOVE" #x010A)
+    ("LATIN SMALL LETTER C WITH DOT ABOVE" #x010B)
+    ("LATIN CAPITAL LETTER C WITH CARON" #x010C)
+    ("LATIN SMALL LETTER C WITH CARON" #x010D)
+    ("LATIN CAPITAL LETTER D WITH CARON" #x010E)
+    ("LATIN SMALL LETTER D WITH CARON" #x010F)
+    ("LATIN CAPITAL LETTER D WITH STROKE" #x0110)
+    ("LATIN SMALL LETTER D WITH STROKE" #x0111)
+    ("LATIN CAPITAL LETTER E WITH MACRON" #x0112)
+    ("LATIN SMALL LETTER E WITH MACRON" #x0113)
+    ("LATIN CAPITAL LETTER E WITH BREVE" #x0114)
+    ("LATIN SMALL LETTER E WITH BREVE" #x0115)
+    ("LATIN CAPITAL LETTER E WITH DOT ABOVE" #x0116)
+    ("LATIN SMALL LETTER E WITH DOT ABOVE" #x0117)
+    ("LATIN CAPITAL LETTER E WITH OGONEK" #x0118)
+    ("LATIN SMALL LETTER E WITH OGONEK" #x0119)
+    ("LATIN CAPITAL LETTER E WITH CARON" #x011A)
+    ("LATIN SMALL LETTER E WITH CARON" #x011B)
+    ("LATIN CAPITAL LETTER G WITH CIRCUMFLEX" #x011C)
+    ("LATIN SMALL LETTER G WITH CIRCUMFLEX" #x011D)
+    ("LATIN CAPITAL LETTER G WITH BREVE" #x011E)
+    ("LATIN SMALL LETTER G WITH BREVE" #x011F)
+    ("LATIN CAPITAL LETTER G WITH DOT ABOVE" #x0120)
+    ("LATIN SMALL LETTER G WITH DOT ABOVE" #x0121)
+    ("LATIN CAPITAL LETTER G WITH CEDILLA" #x0122)
+    ("LATIN SMALL LETTER G WITH CEDILLA" #x0123)
+    ("LATIN CAPITAL LETTER H WITH CIRCUMFLEX" #x0124)
+    ("LATIN SMALL LETTER H WITH CIRCUMFLEX" #x0125)
+    ("LATIN CAPITAL LETTER H WITH STROKE" #x0126)
+    ("LATIN SMALL LETTER H WITH STROKE" #x0127)
+    ("LATIN CAPITAL LETTER I WITH TILDE" #x0128)
+    ("LATIN SMALL LETTER I WITH TILDE" #x0129)
+    ("LATIN CAPITAL LETTER I WITH MACRON" #x012A)
+    ("LATIN SMALL LETTER I WITH MACRON" #x012B)
+    ("LATIN CAPITAL LETTER I WITH BREVE" #x012C)
+    ("LATIN SMALL LETTER I WITH BREVE" #x012D)
+    ("LATIN CAPITAL LETTER I WITH OGONEK" #x012E)
+    ("LATIN SMALL LETTER I WITH OGONEK" #x012F)
+    ("LATIN CAPITAL LETTER I WITH DOT ABOVE" #x0130)
+    ("LATIN SMALL LETTER DOTLESS I" #x0131)
+    ("LATIN CAPITAL LIGATURE IJ" #x0132)
+    ("LATIN SMALL LIGATURE IJ" #x0133)
+    ("LATIN CAPITAL LETTER J WITH CIRCUMFLEX" #x0134)
+    ("LATIN SMALL LETTER J WITH CIRCUMFLEX" #x0135)
+    ("LATIN CAPITAL LETTER K WITH CEDILLA" #x0136)
+    ("LATIN SMALL LETTER K WITH CEDILLA" #x0137)
+    ("LATIN SMALL LETTER KRA" #x0138)
+    ("LATIN CAPITAL LETTER L WITH ACUTE" #x0139)
+    ("LATIN SMALL LETTER L WITH ACUTE" #x013A)
+    ("LATIN CAPITAL LETTER L WITH CEDILLA" #x013B)
+    ("LATIN SMALL LETTER L WITH CEDILLA" #x013C)
+    ("LATIN CAPITAL LETTER L WITH CARON" #x013D)
+    ("LATIN SMALL LETTER L WITH CARON" #x013E)
+    ("LATIN CAPITAL LETTER L WITH MIDDLE DOT" #x013F)
+    ("LATIN SMALL LETTER L WITH MIDDLE DOT" #x0140)
+    ("LATIN CAPITAL LETTER L WITH STROKE" #x0141)
+    ("LATIN SMALL LETTER L WITH STROKE" #x0142)
+    ("LATIN CAPITAL LETTER N WITH ACUTE" #x0143)
+    ("LATIN SMALL LETTER N WITH ACUTE" #x0144)
+    ("LATIN CAPITAL LETTER N WITH CEDILLA" #x0145)
+    ("LATIN SMALL LETTER N WITH CEDILLA" #x0146)
+    ("LATIN CAPITAL LETTER N WITH CARON" #x0147)
+    ("LATIN SMALL LETTER N WITH CARON" #x0148)
+    ("LATIN SMALL LETTER N PRECEDED BY APOSTROPHE" #x0149)
+    ("LATIN CAPITAL LETTER ENG" #x014A)
+    ("LATIN SMALL LETTER ENG" #x014B)
+    ("LATIN CAPITAL LETTER O WITH MACRON" #x014C)
+    ("LATIN SMALL LETTER O WITH MACRON" #x014D)
+    ("LATIN CAPITAL LETTER O WITH BREVE" #x014E)
+    ("LATIN SMALL LETTER O WITH BREVE" #x014F)
+    ("LATIN CAPITAL LETTER O WITH DOUBLE ACUTE" #x0150)
+    ("LATIN SMALL LETTER O WITH DOUBLE ACUTE" #x0151)
+    ("LATIN CAPITAL LIGATURE OE" #x0152)
+    ("LATIN SMALL LIGATURE OE" #x0153)
+    ("LATIN CAPITAL LETTER R WITH ACUTE" #x0154)
+    ("LATIN SMALL LETTER R WITH ACUTE" #x0155)
+    ("LATIN CAPITAL LETTER R WITH CEDILLA" #x0156)
+    ("LATIN SMALL LETTER R WITH CEDILLA" #x0157)
+    ("LATIN CAPITAL LETTER R WITH CARON" #x0158)
+    ("LATIN SMALL LETTER R WITH CARON" #x0159)
+    ("LATIN CAPITAL LETTER S WITH ACUTE" #x015A)
+    ("LATIN SMALL LETTER S WITH ACUTE" #x015B)
+    ("LATIN CAPITAL LETTER S WITH CIRCUMFLEX" #x015C)
+    ("LATIN SMALL LETTER S WITH CIRCUMFLEX" #x015D)
+    ("LATIN CAPITAL LETTER S WITH CEDILLA" #x015E)
+    ("LATIN SMALL LETTER S WITH CEDILLA" #x015F)
+    ("LATIN CAPITAL LETTER S WITH CARON" #x0160)
+    ("LATIN SMALL LETTER S WITH CARON" #x0161)
+    ("LATIN CAPITAL LETTER T WITH CEDILLA" #x0162)
+    ("LATIN SMALL LETTER T WITH CEDILLA" #x0163)
+    ("LATIN CAPITAL LETTER T WITH CARON" #x0164)
+    ("LATIN SMALL LETTER T WITH CARON" #x0165)
+    ("LATIN CAPITAL LETTER T WITH STROKE" #x0166)
+    ("LATIN SMALL LETTER T WITH STROKE" #x0167)
+    ("LATIN CAPITAL LETTER U WITH TILDE" #x0168)
+    ("LATIN SMALL LETTER U WITH TILDE" #x0169)
+    ("LATIN CAPITAL LETTER U WITH MACRON" #x016A)
+    ("LATIN SMALL LETTER U WITH MACRON" #x016B)
+    ("LATIN CAPITAL LETTER U WITH BREVE" #x016C)
+    ("LATIN SMALL LETTER U WITH BREVE" #x016D)
+    ("LATIN CAPITAL LETTER U WITH RING ABOVE" #x016E)
+    ("LATIN SMALL LETTER U WITH RING ABOVE" #x016F)
+    ("LATIN CAPITAL LETTER U WITH DOUBLE ACUTE" #x0170)
+    ("LATIN SMALL LETTER U WITH DOUBLE ACUTE" #x0171)
+    ("LATIN CAPITAL LETTER U WITH OGONEK" #x0172)
+    ("LATIN SMALL LETTER U WITH OGONEK" #x0173)
+    ("LATIN CAPITAL LETTER W WITH CIRCUMFLEX" #x0174)
+    ("LATIN SMALL LETTER W WITH CIRCUMFLEX" #x0175)
+    ("LATIN CAPITAL LETTER Y WITH CIRCUMFLEX" #x0176)
+    ("LATIN SMALL LETTER Y WITH CIRCUMFLEX" #x0177)
+    ("LATIN CAPITAL LETTER Y WITH DIAERESIS" #x0178)
+    ("LATIN CAPITAL LETTER Z WITH ACUTE" #x0179)
+    ("LATIN SMALL LETTER Z WITH ACUTE" #x017A)
+    ("LATIN CAPITAL LETTER Z WITH DOT ABOVE" #x017B)
+    ("LATIN SMALL LETTER Z WITH DOT ABOVE" #x017C)
+    ("LATIN CAPITAL LETTER Z WITH CARON" #x017D)
+    ("LATIN SMALL LETTER Z WITH CARON" #x017E)
+    ("LATIN SMALL LETTER LONG S" #x017F)
+    ))
+
+;; arch-tag: 30e6e868-1bc7-4cd1-b75b-7fd4354cf8fe
diff --git a/etc/nxml/00180-0024F.el b/etc/nxml/00180-0024F.el
new file mode 100644 (file)
index 0000000..5bc138b
--- /dev/null
@@ -0,0 +1,183 @@
+(nxml-define-char-name-set 'latin-extended-b
+  '(("LATIN SMALL LETTER B WITH STROKE" #x0180)
+    ("LATIN CAPITAL LETTER B WITH HOOK" #x0181)
+    ("LATIN CAPITAL LETTER B WITH TOPBAR" #x0182)
+    ("LATIN SMALL LETTER B WITH TOPBAR" #x0183)
+    ("LATIN CAPITAL LETTER TONE SIX" #x0184)
+    ("LATIN SMALL LETTER TONE SIX" #x0185)
+    ("LATIN CAPITAL LETTER OPEN O" #x0186)
+    ("LATIN CAPITAL LETTER C WITH HOOK" #x0187)
+    ("LATIN SMALL LETTER C WITH HOOK" #x0188)
+    ("LATIN CAPITAL LETTER AFRICAN D" #x0189)
+    ("LATIN CAPITAL LETTER D WITH HOOK" #x018A)
+    ("LATIN CAPITAL LETTER D WITH TOPBAR" #x018B)
+    ("LATIN SMALL LETTER D WITH TOPBAR" #x018C)
+    ("LATIN SMALL LETTER TURNED DELTA" #x018D)
+    ("LATIN CAPITAL LETTER REVERSED E" #x018E)
+    ("LATIN CAPITAL LETTER SCHWA" #x018F)
+    ("LATIN CAPITAL LETTER OPEN E" #x0190)
+    ("LATIN CAPITAL LETTER F WITH HOOK" #x0191)
+    ("LATIN SMALL LETTER F WITH HOOK" #x0192)
+    ("LATIN CAPITAL LETTER G WITH HOOK" #x0193)
+    ("LATIN CAPITAL LETTER GAMMA" #x0194)
+    ("LATIN SMALL LETTER HV" #x0195)
+    ("LATIN CAPITAL LETTER IOTA" #x0196)
+    ("LATIN CAPITAL LETTER I WITH STROKE" #x0197)
+    ("LATIN CAPITAL LETTER K WITH HOOK" #x0198)
+    ("LATIN SMALL LETTER K WITH HOOK" #x0199)
+    ("LATIN SMALL LETTER L WITH BAR" #x019A)
+    ("LATIN SMALL LETTER LAMBDA WITH STROKE" #x019B)
+    ("LATIN CAPITAL LETTER TURNED M" #x019C)
+    ("LATIN CAPITAL LETTER N WITH LEFT HOOK" #x019D)
+    ("LATIN SMALL LETTER N WITH LONG RIGHT LEG" #x019E)
+    ("LATIN CAPITAL LETTER O WITH MIDDLE TILDE" #x019F)
+    ("LATIN CAPITAL LETTER O WITH HORN" #x01A0)
+    ("LATIN SMALL LETTER O WITH HORN" #x01A1)
+    ("LATIN CAPITAL LETTER OI" #x01A2)
+    ("LATIN SMALL LETTER OI" #x01A3)
+    ("LATIN CAPITAL LETTER P WITH HOOK" #x01A4)
+    ("LATIN SMALL LETTER P WITH HOOK" #x01A5)
+    ("LATIN LETTER YR" #x01A6)
+    ("LATIN CAPITAL LETTER TONE TWO" #x01A7)
+    ("LATIN SMALL LETTER TONE TWO" #x01A8)
+    ("LATIN CAPITAL LETTER ESH" #x01A9)
+    ("LATIN LETTER REVERSED ESH LOOP" #x01AA)
+    ("LATIN SMALL LETTER T WITH PALATAL HOOK" #x01AB)
+    ("LATIN CAPITAL LETTER T WITH HOOK" #x01AC)
+    ("LATIN SMALL LETTER T WITH HOOK" #x01AD)
+    ("LATIN CAPITAL LETTER T WITH RETROFLEX HOOK" #x01AE)
+    ("LATIN CAPITAL LETTER U WITH HORN" #x01AF)
+    ("LATIN SMALL LETTER U WITH HORN" #x01B0)
+    ("LATIN CAPITAL LETTER UPSILON" #x01B1)
+    ("LATIN CAPITAL LETTER V WITH HOOK" #x01B2)
+    ("LATIN CAPITAL LETTER Y WITH HOOK" #x01B3)
+    ("LATIN SMALL LETTER Y WITH HOOK" #x01B4)
+    ("LATIN CAPITAL LETTER Z WITH STROKE" #x01B5)
+    ("LATIN SMALL LETTER Z WITH STROKE" #x01B6)
+    ("LATIN CAPITAL LETTER EZH" #x01B7)
+    ("LATIN CAPITAL LETTER EZH REVERSED" #x01B8)
+    ("LATIN SMALL LETTER EZH REVERSED" #x01B9)
+    ("LATIN SMALL LETTER EZH WITH TAIL" #x01BA)
+    ("LATIN LETTER TWO WITH STROKE" #x01BB)
+    ("LATIN CAPITAL LETTER TONE FIVE" #x01BC)
+    ("LATIN SMALL LETTER TONE FIVE" #x01BD)
+    ("LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE" #x01BE)
+    ("LATIN LETTER WYNN" #x01BF)
+    ("LATIN LETTER DENTAL CLICK" #x01C0)
+    ("LATIN LETTER LATERAL CLICK" #x01C1)
+    ("LATIN LETTER ALVEOLAR CLICK" #x01C2)
+    ("LATIN LETTER RETROFLEX CLICK" #x01C3)
+    ("LATIN CAPITAL LETTER DZ WITH CARON" #x01C4)
+    ("LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON" #x01C5)
+    ("LATIN SMALL LETTER DZ WITH CARON" #x01C6)
+    ("LATIN CAPITAL LETTER LJ" #x01C7)
+    ("LATIN CAPITAL LETTER L WITH SMALL LETTER J" #x01C8)
+    ("LATIN SMALL LETTER LJ" #x01C9)
+    ("LATIN CAPITAL LETTER NJ" #x01CA)
+    ("LATIN CAPITAL LETTER N WITH SMALL LETTER J" #x01CB)
+    ("LATIN SMALL LETTER NJ" #x01CC)
+    ("LATIN CAPITAL LETTER A WITH CARON" #x01CD)
+    ("LATIN SMALL LETTER A WITH CARON" #x01CE)
+    ("LATIN CAPITAL LETTER I WITH CARON" #x01CF)
+    ("LATIN SMALL LETTER I WITH CARON" #x01D0)
+    ("LATIN CAPITAL LETTER O WITH CARON" #x01D1)
+    ("LATIN SMALL LETTER O WITH CARON" #x01D2)
+    ("LATIN CAPITAL LETTER U WITH CARON" #x01D3)
+    ("LATIN SMALL LETTER U WITH CARON" #x01D4)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON" #x01D5)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND MACRON" #x01D6)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE" #x01D7)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE" #x01D8)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON" #x01D9)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND CARON" #x01DA)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE" #x01DB)
+    ("LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE" #x01DC)
+    ("LATIN SMALL LETTER TURNED E" #x01DD)
+    ("LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON" #x01DE)
+    ("LATIN SMALL LETTER A WITH DIAERESIS AND MACRON" #x01DF)
+    ("LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON" #x01E0)
+    ("LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON" #x01E1)
+    ("LATIN CAPITAL LETTER AE WITH MACRON" #x01E2)
+    ("LATIN SMALL LETTER AE WITH MACRON" #x01E3)
+    ("LATIN CAPITAL LETTER G WITH STROKE" #x01E4)
+    ("LATIN SMALL LETTER G WITH STROKE" #x01E5)
+    ("LATIN CAPITAL LETTER G WITH CARON" #x01E6)
+    ("LATIN SMALL LETTER G WITH CARON" #x01E7)
+    ("LATIN CAPITAL LETTER K WITH CARON" #x01E8)
+    ("LATIN SMALL LETTER K WITH CARON" #x01E9)
+    ("LATIN CAPITAL LETTER O WITH OGONEK" #x01EA)
+    ("LATIN SMALL LETTER O WITH OGONEK" #x01EB)
+    ("LATIN CAPITAL LETTER O WITH OGONEK AND MACRON" #x01EC)
+    ("LATIN SMALL LETTER O WITH OGONEK AND MACRON" #x01ED)
+    ("LATIN CAPITAL LETTER EZH WITH CARON" #x01EE)
+    ("LATIN SMALL LETTER EZH WITH CARON" #x01EF)
+    ("LATIN SMALL LETTER J WITH CARON" #x01F0)
+    ("LATIN CAPITAL LETTER DZ" #x01F1)
+    ("LATIN CAPITAL LETTER D WITH SMALL LETTER Z" #x01F2)
+    ("LATIN SMALL LETTER DZ" #x01F3)
+    ("LATIN CAPITAL LETTER G WITH ACUTE" #x01F4)
+    ("LATIN SMALL LETTER G WITH ACUTE" #x01F5)
+    ("LATIN CAPITAL LETTER HWAIR" #x01F6)
+    ("LATIN CAPITAL LETTER WYNN" #x01F7)
+    ("LATIN CAPITAL LETTER N WITH GRAVE" #x01F8)
+    ("LATIN SMALL LETTER N WITH GRAVE" #x01F9)
+    ("LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE" #x01FA)
+    ("LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE" #x01FB)
+    ("LATIN CAPITAL LETTER AE WITH ACUTE" #x01FC)
+    ("LATIN SMALL LETTER AE WITH ACUTE" #x01FD)
+    ("LATIN CAPITAL LETTER O WITH STROKE AND ACUTE" #x01FE)
+    ("LATIN SMALL LETTER O WITH STROKE AND ACUTE" #x01FF)
+    ("LATIN CAPITAL LETTER A WITH DOUBLE GRAVE" #x0200)
+    ("LATIN SMALL LETTER A WITH DOUBLE GRAVE" #x0201)
+    ("LATIN CAPITAL LETTER A WITH INVERTED BREVE" #x0202)
+    ("LATIN SMALL LETTER A WITH INVERTED BREVE" #x0203)
+    ("LATIN CAPITAL LETTER E WITH DOUBLE GRAVE" #x0204)
+    ("LATIN SMALL LETTER E WITH DOUBLE GRAVE" #x0205)
+    ("LATIN CAPITAL LETTER E WITH INVERTED BREVE" #x0206)
+    ("LATIN SMALL LETTER E WITH INVERTED BREVE" #x0207)
+    ("LATIN CAPITAL LETTER I WITH DOUBLE GRAVE" #x0208)
+    ("LATIN SMALL LETTER I WITH DOUBLE GRAVE" #x0209)
+    ("LATIN CAPITAL LETTER I WITH INVERTED BREVE" #x020A)
+    ("LATIN SMALL LETTER I WITH INVERTED BREVE" #x020B)
+    ("LATIN CAPITAL LETTER O WITH DOUBLE GRAVE" #x020C)
+    ("LATIN SMALL LETTER O WITH DOUBLE GRAVE" #x020D)
+    ("LATIN CAPITAL LETTER O WITH INVERTED BREVE" #x020E)
+    ("LATIN SMALL LETTER O WITH INVERTED BREVE" #x020F)
+    ("LATIN CAPITAL LETTER R WITH DOUBLE GRAVE" #x0210)
+    ("LATIN SMALL LETTER R WITH DOUBLE GRAVE" #x0211)
+    ("LATIN CAPITAL LETTER R WITH INVERTED BREVE" #x0212)
+    ("LATIN SMALL LETTER R WITH INVERTED BREVE" #x0213)
+    ("LATIN CAPITAL LETTER U WITH DOUBLE GRAVE" #x0214)
+    ("LATIN SMALL LETTER U WITH DOUBLE GRAVE" #x0215)
+    ("LATIN CAPITAL LETTER U WITH INVERTED BREVE" #x0216)
+    ("LATIN SMALL LETTER U WITH INVERTED BREVE" #x0217)
+    ("LATIN CAPITAL LETTER S WITH COMMA BELOW" #x0218)
+    ("LATIN SMALL LETTER S WITH COMMA BELOW" #x0219)
+    ("LATIN CAPITAL LETTER T WITH COMMA BELOW" #x021A)
+    ("LATIN SMALL LETTER T WITH COMMA BELOW" #x021B)
+    ("LATIN CAPITAL LETTER YOGH" #x021C)
+    ("LATIN SMALL LETTER YOGH" #x021D)
+    ("LATIN CAPITAL LETTER H WITH CARON" #x021E)
+    ("LATIN SMALL LETTER H WITH CARON" #x021F)
+    ("LATIN CAPITAL LETTER N WITH LONG RIGHT LEG" #x0220)
+    ("LATIN CAPITAL LETTER OU" #x0222)
+    ("LATIN SMALL LETTER OU" #x0223)
+    ("LATIN CAPITAL LETTER Z WITH HOOK" #x0224)
+    ("LATIN SMALL LETTER Z WITH HOOK" #x0225)
+    ("LATIN CAPITAL LETTER A WITH DOT ABOVE" #x0226)
+    ("LATIN SMALL LETTER A WITH DOT ABOVE" #x0227)
+    ("LATIN CAPITAL LETTER E WITH CEDILLA" #x0228)
+    ("LATIN SMALL LETTER E WITH CEDILLA" #x0229)
+    ("LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON" #x022A)
+    ("LATIN SMALL LETTER O WITH DIAERESIS AND MACRON" #x022B)
+    ("LATIN CAPITAL LETTER O WITH TILDE AND MACRON" #x022C)
+    ("LATIN SMALL LETTER O WITH TILDE AND MACRON" #x022D)
+    ("LATIN CAPITAL LETTER O WITH DOT ABOVE" #x022E)
+    ("LATIN SMALL LETTER O WITH DOT ABOVE" #x022F)
+    ("LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON" #x0230)
+    ("LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON" #x0231)
+    ("LATIN CAPITAL LETTER Y WITH MACRON" #x0232)
+    ("LATIN SMALL LETTER Y WITH MACRON" #x0233)
+    ))
+
+;; arch-tag: d2a4e7e0-0d3a-4a29-994e-f5d0ed62cea2
diff --git a/etc/nxml/00250-002AF.el b/etc/nxml/00250-002AF.el
new file mode 100644 (file)
index 0000000..62ffa63
--- /dev/null
@@ -0,0 +1,98 @@
+(nxml-define-char-name-set 'ipa-extensions
+  '(("LATIN SMALL LETTER TURNED A" #x0250)
+    ("LATIN SMALL LETTER ALPHA" #x0251)
+    ("LATIN SMALL LETTER TURNED ALPHA" #x0252)
+    ("LATIN SMALL LETTER B WITH HOOK" #x0253)
+    ("LATIN SMALL LETTER OPEN O" #x0254)
+    ("LATIN SMALL LETTER C WITH CURL" #x0255)
+    ("LATIN SMALL LETTER D WITH TAIL" #x0256)
+    ("LATIN SMALL LETTER D WITH HOOK" #x0257)
+    ("LATIN SMALL LETTER REVERSED E" #x0258)
+    ("LATIN SMALL LETTER SCHWA" #x0259)
+    ("LATIN SMALL LETTER SCHWA WITH HOOK" #x025A)
+    ("LATIN SMALL LETTER OPEN E" #x025B)
+    ("LATIN SMALL LETTER REVERSED OPEN E" #x025C)
+    ("LATIN SMALL LETTER REVERSED OPEN E WITH HOOK" #x025D)
+    ("LATIN SMALL LETTER CLOSED REVERSED OPEN E" #x025E)
+    ("LATIN SMALL LETTER DOTLESS J WITH STROKE" #x025F)
+    ("LATIN SMALL LETTER G WITH HOOK" #x0260)
+    ("LATIN SMALL LETTER SCRIPT G" #x0261)
+    ("LATIN LETTER SMALL CAPITAL G" #x0262)
+    ("LATIN SMALL LETTER GAMMA" #x0263)
+    ("LATIN SMALL LETTER RAMS HORN" #x0264)
+    ("LATIN SMALL LETTER TURNED H" #x0265)
+    ("LATIN SMALL LETTER H WITH HOOK" #x0266)
+    ("LATIN SMALL LETTER HENG WITH HOOK" #x0267)
+    ("LATIN SMALL LETTER I WITH STROKE" #x0268)
+    ("LATIN SMALL LETTER IOTA" #x0269)
+    ("LATIN LETTER SMALL CAPITAL I" #x026A)
+    ("LATIN SMALL LETTER L WITH MIDDLE TILDE" #x026B)
+    ("LATIN SMALL LETTER L WITH BELT" #x026C)
+    ("LATIN SMALL LETTER L WITH RETROFLEX HOOK" #x026D)
+    ("LATIN SMALL LETTER LEZH" #x026E)
+    ("LATIN SMALL LETTER TURNED M" #x026F)
+    ("LATIN SMALL LETTER TURNED M WITH LONG LEG" #x0270)
+    ("LATIN SMALL LETTER M WITH HOOK" #x0271)
+    ("LATIN SMALL LETTER N WITH LEFT HOOK" #x0272)
+    ("LATIN SMALL LETTER N WITH RETROFLEX HOOK" #x0273)
+    ("LATIN LETTER SMALL CAPITAL N" #x0274)
+    ("LATIN SMALL LETTER BARRED O" #x0275)
+    ("LATIN LETTER SMALL CAPITAL OE" #x0276)
+    ("LATIN SMALL LETTER CLOSED OMEGA" #x0277)
+    ("LATIN SMALL LETTER PHI" #x0278)
+    ("LATIN SMALL LETTER TURNED R" #x0279)
+    ("LATIN SMALL LETTER TURNED R WITH LONG LEG" #x027A)
+    ("LATIN SMALL LETTER TURNED R WITH HOOK" #x027B)
+    ("LATIN SMALL LETTER R WITH LONG LEG" #x027C)
+    ("LATIN SMALL LETTER R WITH TAIL" #x027D)
+    ("LATIN SMALL LETTER R WITH FISHHOOK" #x027E)
+    ("LATIN SMALL LETTER REVERSED R WITH FISHHOOK" #x027F)
+    ("LATIN LETTER SMALL CAPITAL R" #x0280)
+    ("LATIN LETTER SMALL CAPITAL INVERTED R" #x0281)
+    ("LATIN SMALL LETTER S WITH HOOK" #x0282)
+    ("LATIN SMALL LETTER ESH" #x0283)
+    ("LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK" #x0284)
+    ("LATIN SMALL LETTER SQUAT REVERSED ESH" #x0285)
+    ("LATIN SMALL LETTER ESH WITH CURL" #x0286)
+    ("LATIN SMALL LETTER TURNED T" #x0287)
+    ("LATIN SMALL LETTER T WITH RETROFLEX HOOK" #x0288)
+    ("LATIN SMALL LETTER U BAR" #x0289)
+    ("LATIN SMALL LETTER UPSILON" #x028A)
+    ("LATIN SMALL LETTER V WITH HOOK" #x028B)
+    ("LATIN SMALL LETTER TURNED V" #x028C)
+    ("LATIN SMALL LETTER TURNED W" #x028D)
+    ("LATIN SMALL LETTER TURNED Y" #x028E)
+    ("LATIN LETTER SMALL CAPITAL Y" #x028F)
+    ("LATIN SMALL LETTER Z WITH RETROFLEX HOOK" #x0290)
+    ("LATIN SMALL LETTER Z WITH CURL" #x0291)
+    ("LATIN SMALL LETTER EZH" #x0292)
+    ("LATIN SMALL LETTER EZH WITH CURL" #x0293)
+    ("LATIN LETTER GLOTTAL STOP" #x0294)
+    ("LATIN LETTER PHARYNGEAL VOICED FRICATIVE" #x0295)
+    ("LATIN LETTER INVERTED GLOTTAL STOP" #x0296)
+    ("LATIN LETTER STRETCHED C" #x0297)
+    ("LATIN LETTER BILABIAL CLICK" #x0298)
+    ("LATIN LETTER SMALL CAPITAL B" #x0299)
+    ("LATIN SMALL LETTER CLOSED OPEN E" #x029A)
+    ("LATIN LETTER SMALL CAPITAL G WITH HOOK" #x029B)
+    ("LATIN LETTER SMALL CAPITAL H" #x029C)
+    ("LATIN SMALL LETTER J WITH CROSSED-TAIL" #x029D)
+    ("LATIN SMALL LETTER TURNED K" #x029E)
+    ("LATIN LETTER SMALL CAPITAL L" #x029F)
+    ("LATIN SMALL LETTER Q WITH HOOK" #x02A0)
+    ("LATIN LETTER GLOTTAL STOP WITH STROKE" #x02A1)
+    ("LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE" #x02A2)
+    ("LATIN SMALL LETTER DZ DIGRAPH" #x02A3)
+    ("LATIN SMALL LETTER DEZH DIGRAPH" #x02A4)
+    ("LATIN SMALL LETTER DZ DIGRAPH WITH CURL" #x02A5)
+    ("LATIN SMALL LETTER TS DIGRAPH" #x02A6)
+    ("LATIN SMALL LETTER TESH DIGRAPH" #x02A7)
+    ("LATIN SMALL LETTER TC DIGRAPH WITH CURL" #x02A8)
+    ("LATIN SMALL LETTER FENG DIGRAPH" #x02A9)
+    ("LATIN SMALL LETTER LS DIGRAPH" #x02AA)
+    ("LATIN SMALL LETTER LZ DIGRAPH" #x02AB)
+    ("LATIN LETTER BILABIAL PERCUSSIVE" #x02AC)
+    ("LATIN LETTER BIDENTAL PERCUSSIVE" #x02AD)
+    ))
+
+;; arch-tag: edc50b43-a94e-48db-91c5-0f9ea113c93c
diff --git a/etc/nxml/002B0-002FF.el b/etc/nxml/002B0-002FF.el
new file mode 100644 (file)
index 0000000..e94f58c
--- /dev/null
@@ -0,0 +1,67 @@
+(nxml-define-char-name-set 'spacing-modifier-letters
+  '(("MODIFIER LETTER SMALL H" #x02B0)
+    ("MODIFIER LETTER SMALL H WITH HOOK" #x02B1)
+    ("MODIFIER LETTER SMALL J" #x02B2)
+    ("MODIFIER LETTER SMALL R" #x02B3)
+    ("MODIFIER LETTER SMALL TURNED R" #x02B4)
+    ("MODIFIER LETTER SMALL TURNED R WITH HOOK" #x02B5)
+    ("MODIFIER LETTER SMALL CAPITAL INVERTED R" #x02B6)
+    ("MODIFIER LETTER SMALL W" #x02B7)
+    ("MODIFIER LETTER SMALL Y" #x02B8)
+    ("MODIFIER LETTER PRIME" #x02B9)
+    ("MODIFIER LETTER DOUBLE PRIME" #x02BA)
+    ("MODIFIER LETTER TURNED COMMA" #x02BB)
+    ("MODIFIER LETTER APOSTROPHE" #x02BC)
+    ("MODIFIER LETTER REVERSED COMMA" #x02BD)
+    ("MODIFIER LETTER RIGHT HALF RING" #x02BE)
+    ("MODIFIER LETTER LEFT HALF RING" #x02BF)
+    ("MODIFIER LETTER GLOTTAL STOP" #x02C0)
+    ("MODIFIER LETTER REVERSED GLOTTAL STOP" #x02C1)
+    ("MODIFIER LETTER LEFT ARROWHEAD" #x02C2)
+    ("MODIFIER LETTER RIGHT ARROWHEAD" #x02C3)
+    ("MODIFIER LETTER UP ARROWHEAD" #x02C4)
+    ("MODIFIER LETTER DOWN ARROWHEAD" #x02C5)
+    ("MODIFIER LETTER CIRCUMFLEX ACCENT" #x02C6)
+    ("CARON" #x02C7)
+    ("MODIFIER LETTER VERTICAL LINE" #x02C8)
+    ("MODIFIER LETTER MACRON" #x02C9)
+    ("MODIFIER LETTER ACUTE ACCENT" #x02CA)
+    ("MODIFIER LETTER GRAVE ACCENT" #x02CB)
+    ("MODIFIER LETTER LOW VERTICAL LINE" #x02CC)
+    ("MODIFIER LETTER LOW MACRON" #x02CD)
+    ("MODIFIER LETTER LOW GRAVE ACCENT" #x02CE)
+    ("MODIFIER LETTER LOW ACUTE ACCENT" #x02CF)
+    ("MODIFIER LETTER TRIANGULAR COLON" #x02D0)
+    ("MODIFIER LETTER HALF TRIANGULAR COLON" #x02D1)
+    ("MODIFIER LETTER CENTRED RIGHT HALF RING" #x02D2)
+    ("MODIFIER LETTER CENTRED LEFT HALF RING" #x02D3)
+    ("MODIFIER LETTER UP TACK" #x02D4)
+    ("MODIFIER LETTER DOWN TACK" #x02D5)
+    ("MODIFIER LETTER PLUS SIGN" #x02D6)
+    ("MODIFIER LETTER MINUS SIGN" #x02D7)
+    ("BREVE" #x02D8)
+    ("DOT ABOVE" #x02D9)
+    ("RING ABOVE" #x02DA)
+    ("OGONEK" #x02DB)
+    ("SMALL TILDE" #x02DC)
+    ("DOUBLE ACUTE ACCENT" #x02DD)
+    ("MODIFIER LETTER RHOTIC HOOK" #x02DE)
+    ("MODIFIER LETTER CROSS ACCENT" #x02DF)
+    ("MODIFIER LETTER SMALL GAMMA" #x02E0)
+    ("MODIFIER LETTER SMALL L" #x02E1)
+    ("MODIFIER LETTER SMALL S" #x02E2)
+    ("MODIFIER LETTER SMALL X" #x02E3)
+    ("MODIFIER LETTER SMALL REVERSED GLOTTAL STOP" #x02E4)
+    ("MODIFIER LETTER EXTRA-HIGH TONE BAR" #x02E5)
+    ("MODIFIER LETTER HIGH TONE BAR" #x02E6)
+    ("MODIFIER LETTER MID TONE BAR" #x02E7)
+    ("MODIFIER LETTER LOW TONE BAR" #x02E8)
+    ("MODIFIER LETTER EXTRA-LOW TONE BAR" #x02E9)
+    ("MODIFIER LETTER YIN DEPARTING TONE MARK" #x02EA)
+    ("MODIFIER LETTER YANG DEPARTING TONE MARK" #x02EB)
+    ("MODIFIER LETTER VOICING" #x02EC)
+    ("MODIFIER LETTER UNASPIRATED" #x02ED)
+    ("MODIFIER LETTER DOUBLE APOSTROPHE" #x02EE)
+    ))
+
+;; arch-tag: 5fa09061-850e-4bbe-ad44-54c57a81a461
diff --git a/etc/nxml/00300-0036F.el b/etc/nxml/00300-0036F.el
new file mode 100644 (file)
index 0000000..d82fa0b
--- /dev/null
@@ -0,0 +1,100 @@
+(nxml-define-char-name-set 'combining-diacritical-marks
+  '(("COMBINING GRAVE ACCENT" #x0300)
+    ("COMBINING ACUTE ACCENT" #x0301)
+    ("COMBINING CIRCUMFLEX ACCENT" #x0302)
+    ("COMBINING TILDE" #x0303)
+    ("COMBINING MACRON" #x0304)
+    ("COMBINING OVERLINE" #x0305)
+    ("COMBINING BREVE" #x0306)
+    ("COMBINING DOT ABOVE" #x0307)
+    ("COMBINING DIAERESIS" #x0308)
+    ("COMBINING HOOK ABOVE" #x0309)
+    ("COMBINING RING ABOVE" #x030A)
+    ("COMBINING DOUBLE ACUTE ACCENT" #x030B)
+    ("COMBINING CARON" #x030C)
+    ("COMBINING VERTICAL LINE ABOVE" #x030D)
+    ("COMBINING DOUBLE VERTICAL LINE ABOVE" #x030E)
+    ("COMBINING DOUBLE GRAVE ACCENT" #x030F)
+    ("COMBINING CANDRABINDU" #x0310)
+    ("COMBINING INVERTED BREVE" #x0311)
+    ("COMBINING TURNED COMMA ABOVE" #x0312)
+    ("COMBINING COMMA ABOVE" #x0313)
+    ("COMBINING REVERSED COMMA ABOVE" #x0314)
+    ("COMBINING COMMA ABOVE RIGHT" #x0315)
+    ("COMBINING GRAVE ACCENT BELOW" #x0316)
+    ("COMBINING ACUTE ACCENT BELOW" #x0317)
+    ("COMBINING LEFT TACK BELOW" #x0318)
+    ("COMBINING RIGHT TACK BELOW" #x0319)
+    ("COMBINING LEFT ANGLE ABOVE" #x031A)
+    ("COMBINING HORN" #x031B)
+    ("COMBINING LEFT HALF RING BELOW" #x031C)
+    ("COMBINING UP TACK BELOW" #x031D)
+    ("COMBINING DOWN TACK BELOW" #x031E)
+    ("COMBINING PLUS SIGN BELOW" #x031F)
+    ("COMBINING MINUS SIGN BELOW" #x0320)
+    ("COMBINING PALATALIZED HOOK BELOW" #x0321)
+    ("COMBINING RETROFLEX HOOK BELOW" #x0322)
+    ("COMBINING DOT BELOW" #x0323)
+    ("COMBINING DIAERESIS BELOW" #x0324)
+    ("COMBINING RING BELOW" #x0325)
+    ("COMBINING COMMA BELOW" #x0326)
+    ("COMBINING CEDILLA" #x0327)
+    ("COMBINING OGONEK" #x0328)
+    ("COMBINING VERTICAL LINE BELOW" #x0329)
+    ("COMBINING BRIDGE BELOW" #x032A)
+    ("COMBINING INVERTED DOUBLE ARCH BELOW" #x032B)
+    ("COMBINING CARON BELOW" #x032C)
+    ("COMBINING CIRCUMFLEX ACCENT BELOW" #x032D)
+    ("COMBINING BREVE BELOW" #x032E)
+    ("COMBINING INVERTED BREVE BELOW" #x032F)
+    ("COMBINING TILDE BELOW" #x0330)
+    ("COMBINING MACRON BELOW" #x0331)
+    ("COMBINING LOW LINE" #x0332)
+    ("COMBINING DOUBLE LOW LINE" #x0333)
+    ("COMBINING TILDE OVERLAY" #x0334)
+    ("COMBINING SHORT STROKE OVERLAY" #x0335)
+    ("COMBINING LONG STROKE OVERLAY" #x0336)
+    ("COMBINING SHORT SOLIDUS OVERLAY" #x0337)
+    ("COMBINING LONG SOLIDUS OVERLAY" #x0338)
+    ("COMBINING RIGHT HALF RING BELOW" #x0339)
+    ("COMBINING INVERTED BRIDGE BELOW" #x033A)
+    ("COMBINING SQUARE BELOW" #x033B)
+    ("COMBINING SEAGULL BELOW" #x033C)
+    ("COMBINING X ABOVE" #x033D)
+    ("COMBINING VERTICAL TILDE" #x033E)
+    ("COMBINING DOUBLE OVERLINE" #x033F)
+    ("COMBINING GRAVE TONE MARK" #x0340)
+    ("COMBINING ACUTE TONE MARK" #x0341)
+    ("COMBINING GREEK PERISPOMENI" #x0342)
+    ("COMBINING GREEK KORONIS" #x0343)
+    ("COMBINING GREEK DIALYTIKA TONOS" #x0344)
+    ("COMBINING GREEK YPOGEGRAMMENI" #x0345)
+    ("COMBINING BRIDGE ABOVE" #x0346)
+    ("COMBINING EQUALS SIGN BELOW" #x0347)
+    ("COMBINING DOUBLE VERTICAL LINE BELOW" #x0348)
+    ("COMBINING LEFT ANGLE BELOW" #x0349)
+    ("COMBINING NOT TILDE ABOVE" #x034A)
+    ("COMBINING HOMOTHETIC ABOVE" #x034B)
+    ("COMBINING ALMOST EQUAL TO ABOVE" #x034C)
+    ("COMBINING LEFT RIGHT ARROW BELOW" #x034D)
+    ("COMBINING UPWARDS ARROW BELOW" #x034E)
+    ("COMBINING GRAPHEME JOINER" #x034F)
+    ("COMBINING DOUBLE TILDE" #x0360)
+    ("COMBINING DOUBLE INVERTED BREVE" #x0361)
+    ("COMBINING DOUBLE RIGHTWARDS ARROW BELOW" #x0362)
+    ("COMBINING LATIN SMALL LETTER A" #x0363)
+    ("COMBINING LATIN SMALL LETTER E" #x0364)
+    ("COMBINING LATIN SMALL LETTER I" #x0365)
+    ("COMBINING LATIN SMALL LETTER O" #x0366)
+    ("COMBINING LATIN SMALL LETTER U" #x0367)
+    ("COMBINING LATIN SMALL LETTER C" #x0368)
+    ("COMBINING LATIN SMALL LETTER D" #x0369)
+    ("COMBINING LATIN SMALL LETTER H" #x036A)
+    ("COMBINING LATIN SMALL LETTER M" #x036B)
+    ("COMBINING LATIN SMALL LETTER R" #x036C)
+    ("COMBINING LATIN SMALL LETTER T" #x036D)
+    ("COMBINING LATIN SMALL LETTER V" #x036E)
+    ("COMBINING LATIN SMALL LETTER X" #x036F)
+    ))
+
+;; arch-tag: a3b46b6e-38fc-4043-b7f5-92a3591e2e47
diff --git a/etc/nxml/00370-003FF.el b/etc/nxml/00370-003FF.el
new file mode 100644 (file)
index 0000000..780653b
--- /dev/null
@@ -0,0 +1,119 @@
+(nxml-define-char-name-set 'greek-and-coptic
+  '(("GREEK NUMERAL SIGN" #x0374)
+    ("GREEK LOWER NUMERAL SIGN" #x0375)
+    ("GREEK YPOGEGRAMMENI" #x037A)
+    ("GREEK QUESTION MARK" #x037E)
+    ("GREEK TONOS" #x0384)
+    ("GREEK DIALYTIKA TONOS" #x0385)
+    ("GREEK CAPITAL LETTER ALPHA WITH TONOS" #x0386)
+    ("GREEK ANO TELEIA" #x0387)
+    ("GREEK CAPITAL LETTER EPSILON WITH TONOS" #x0388)
+    ("GREEK CAPITAL LETTER ETA WITH TONOS" #x0389)
+    ("GREEK CAPITAL LETTER IOTA WITH TONOS" #x038A)
+    ("GREEK CAPITAL LETTER OMICRON WITH TONOS" #x038C)
+    ("GREEK CAPITAL LETTER UPSILON WITH TONOS" #x038E)
+    ("GREEK CAPITAL LETTER OMEGA WITH TONOS" #x038F)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS" #x0390)
+    ("GREEK CAPITAL LETTER ALPHA" #x0391)
+    ("GREEK CAPITAL LETTER BETA" #x0392)
+    ("GREEK CAPITAL LETTER GAMMA" #x0393)
+    ("GREEK CAPITAL LETTER DELTA" #x0394)
+    ("GREEK CAPITAL LETTER EPSILON" #x0395)
+    ("GREEK CAPITAL LETTER ZETA" #x0396)
+    ("GREEK CAPITAL LETTER ETA" #x0397)
+    ("GREEK CAPITAL LETTER THETA" #x0398)
+    ("GREEK CAPITAL LETTER IOTA" #x0399)
+    ("GREEK CAPITAL LETTER KAPPA" #x039A)
+    ("GREEK CAPITAL LETTER LAMDA" #x039B)
+    ("GREEK CAPITAL LETTER MU" #x039C)
+    ("GREEK CAPITAL LETTER NU" #x039D)
+    ("GREEK CAPITAL LETTER XI" #x039E)
+    ("GREEK CAPITAL LETTER OMICRON" #x039F)
+    ("GREEK CAPITAL LETTER PI" #x03A0)
+    ("GREEK CAPITAL LETTER RHO" #x03A1)
+    ("GREEK CAPITAL LETTER SIGMA" #x03A3)
+    ("GREEK CAPITAL LETTER TAU" #x03A4)
+    ("GREEK CAPITAL LETTER UPSILON" #x03A5)
+    ("GREEK CAPITAL LETTER PHI" #x03A6)
+    ("GREEK CAPITAL LETTER CHI" #x03A7)
+    ("GREEK CAPITAL LETTER PSI" #x03A8)
+    ("GREEK CAPITAL LETTER OMEGA" #x03A9)
+    ("GREEK CAPITAL LETTER IOTA WITH DIALYTIKA" #x03AA)
+    ("GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA" #x03AB)
+    ("GREEK SMALL LETTER ALPHA WITH TONOS" #x03AC)
+    ("GREEK SMALL LETTER EPSILON WITH TONOS" #x03AD)
+    ("GREEK SMALL LETTER ETA WITH TONOS" #x03AE)
+    ("GREEK SMALL LETTER IOTA WITH TONOS" #x03AF)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS" #x03B0)
+    ("GREEK SMALL LETTER ALPHA" #x03B1)
+    ("GREEK SMALL LETTER BETA" #x03B2)
+    ("GREEK SMALL LETTER GAMMA" #x03B3)
+    ("GREEK SMALL LETTER DELTA" #x03B4)
+    ("GREEK SMALL LETTER EPSILON" #x03B5)
+    ("GREEK SMALL LETTER ZETA" #x03B6)
+    ("GREEK SMALL LETTER ETA" #x03B7)
+    ("GREEK SMALL LETTER THETA" #x03B8)
+    ("GREEK SMALL LETTER IOTA" #x03B9)
+    ("GREEK SMALL LETTER KAPPA" #x03BA)
+    ("GREEK SMALL LETTER LAMDA" #x03BB)
+    ("GREEK SMALL LETTER MU" #x03BC)
+    ("GREEK SMALL LETTER NU" #x03BD)
+    ("GREEK SMALL LETTER XI" #x03BE)
+    ("GREEK SMALL LETTER OMICRON" #x03BF)
+    ("GREEK SMALL LETTER PI" #x03C0)
+    ("GREEK SMALL LETTER RHO" #x03C1)
+    ("GREEK SMALL LETTER FINAL SIGMA" #x03C2)
+    ("GREEK SMALL LETTER SIGMA" #x03C3)
+    ("GREEK SMALL LETTER TAU" #x03C4)
+    ("GREEK SMALL LETTER UPSILON" #x03C5)
+    ("GREEK SMALL LETTER PHI" #x03C6)
+    ("GREEK SMALL LETTER CHI" #x03C7)
+    ("GREEK SMALL LETTER PSI" #x03C8)
+    ("GREEK SMALL LETTER OMEGA" #x03C9)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA" #x03CA)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA" #x03CB)
+    ("GREEK SMALL LETTER OMICRON WITH TONOS" #x03CC)
+    ("GREEK SMALL LETTER UPSILON WITH TONOS" #x03CD)
+    ("GREEK SMALL LETTER OMEGA WITH TONOS" #x03CE)
+    ("GREEK BETA SYMBOL" #x03D0)
+    ("GREEK THETA SYMBOL" #x03D1)
+    ("GREEK UPSILON WITH HOOK SYMBOL" #x03D2)
+    ("GREEK UPSILON WITH ACUTE AND HOOK SYMBOL" #x03D3)
+    ("GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL" #x03D4)
+    ("GREEK PHI SYMBOL" #x03D5)
+    ("GREEK PI SYMBOL" #x03D6)
+    ("GREEK KAI SYMBOL" #x03D7)
+    ("GREEK LETTER ARCHAIC KOPPA" #x03D8)
+    ("GREEK SMALL LETTER ARCHAIC KOPPA" #x03D9)
+    ("GREEK LETTER STIGMA" #x03DA)
+    ("GREEK SMALL LETTER STIGMA" #x03DB)
+    ("GREEK LETTER DIGAMMA" #x03DC)
+    ("GREEK SMALL LETTER DIGAMMA" #x03DD)
+    ("GREEK LETTER KOPPA" #x03DE)
+    ("GREEK SMALL LETTER KOPPA" #x03DF)
+    ("GREEK LETTER SAMPI" #x03E0)
+    ("GREEK SMALL LETTER SAMPI" #x03E1)
+    ("COPTIC CAPITAL LETTER SHEI" #x03E2)
+    ("COPTIC SMALL LETTER SHEI" #x03E3)
+    ("COPTIC CAPITAL LETTER FEI" #x03E4)
+    ("COPTIC SMALL LETTER FEI" #x03E5)
+    ("COPTIC CAPITAL LETTER KHEI" #x03E6)
+    ("COPTIC SMALL LETTER KHEI" #x03E7)
+    ("COPTIC CAPITAL LETTER HORI" #x03E8)
+    ("COPTIC SMALL LETTER HORI" #x03E9)
+    ("COPTIC CAPITAL LETTER GANGIA" #x03EA)
+    ("COPTIC SMALL LETTER GANGIA" #x03EB)
+    ("COPTIC CAPITAL LETTER SHIMA" #x03EC)
+    ("COPTIC SMALL LETTER SHIMA" #x03ED)
+    ("COPTIC CAPITAL LETTER DEI" #x03EE)
+    ("COPTIC SMALL LETTER DEI" #x03EF)
+    ("GREEK KAPPA SYMBOL" #x03F0)
+    ("GREEK RHO SYMBOL" #x03F1)
+    ("GREEK LUNATE SIGMA SYMBOL" #x03F2)
+    ("GREEK LETTER YOT" #x03F3)
+    ("GREEK CAPITAL THETA SYMBOL" #x03F4)
+    ("GREEK LUNATE EPSILON SYMBOL" #x03F5)
+    ("GREEK REVERSED LUNATE EPSILON SYMBOL" #x03F6)
+    ))
+
+;; arch-tag: 033e25a2-6f9c-4e9f-b517-be5ed38829af
diff --git a/etc/nxml/00400-004FF.el b/etc/nxml/00400-004FF.el
new file mode 100644 (file)
index 0000000..b041b43
--- /dev/null
@@ -0,0 +1,250 @@
+(nxml-define-char-name-set 'cyrillic
+  '(("CYRILLIC CAPITAL LETTER IE WITH GRAVE" #x0400)
+    ("CYRILLIC CAPITAL LETTER IO" #x0401)
+    ("CYRILLIC CAPITAL LETTER DJE" #x0402)
+    ("CYRILLIC CAPITAL LETTER GJE" #x0403)
+    ("CYRILLIC CAPITAL LETTER UKRAINIAN IE" #x0404)
+    ("CYRILLIC CAPITAL LETTER DZE" #x0405)
+    ("CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I" #x0406)
+    ("CYRILLIC CAPITAL LETTER YI" #x0407)
+    ("CYRILLIC CAPITAL LETTER JE" #x0408)
+    ("CYRILLIC CAPITAL LETTER LJE" #x0409)
+    ("CYRILLIC CAPITAL LETTER NJE" #x040A)
+    ("CYRILLIC CAPITAL LETTER TSHE" #x040B)
+    ("CYRILLIC CAPITAL LETTER KJE" #x040C)
+    ("CYRILLIC CAPITAL LETTER I WITH GRAVE" #x040D)
+    ("CYRILLIC CAPITAL LETTER SHORT U" #x040E)
+    ("CYRILLIC CAPITAL LETTER DZHE" #x040F)
+    ("CYRILLIC CAPITAL LETTER A" #x0410)
+    ("CYRILLIC CAPITAL LETTER BE" #x0411)
+    ("CYRILLIC CAPITAL LETTER VE" #x0412)
+    ("CYRILLIC CAPITAL LETTER GHE" #x0413)
+    ("CYRILLIC CAPITAL LETTER DE" #x0414)
+    ("CYRILLIC CAPITAL LETTER IE" #x0415)
+    ("CYRILLIC CAPITAL LETTER ZHE" #x0416)
+    ("CYRILLIC CAPITAL LETTER ZE" #x0417)
+    ("CYRILLIC CAPITAL LETTER I" #x0418)
+    ("CYRILLIC CAPITAL LETTER SHORT I" #x0419)
+    ("CYRILLIC CAPITAL LETTER KA" #x041A)
+    ("CYRILLIC CAPITAL LETTER EL" #x041B)
+    ("CYRILLIC CAPITAL LETTER EM" #x041C)
+    ("CYRILLIC CAPITAL LETTER EN" #x041D)
+    ("CYRILLIC CAPITAL LETTER O" #x041E)
+    ("CYRILLIC CAPITAL LETTER PE" #x041F)
+    ("CYRILLIC CAPITAL LETTER ER" #x0420)
+    ("CYRILLIC CAPITAL LETTER ES" #x0421)
+    ("CYRILLIC CAPITAL LETTER TE" #x0422)
+    ("CYRILLIC CAPITAL LETTER U" #x0423)
+    ("CYRILLIC CAPITAL LETTER EF" #x0424)
+    ("CYRILLIC CAPITAL LETTER HA" #x0425)
+    ("CYRILLIC CAPITAL LETTER TSE" #x0426)
+    ("CYRILLIC CAPITAL LETTER CHE" #x0427)
+    ("CYRILLIC CAPITAL LETTER SHA" #x0428)
+    ("CYRILLIC CAPITAL LETTER SHCHA" #x0429)
+    ("CYRILLIC CAPITAL LETTER HARD SIGN" #x042A)
+    ("CYRILLIC CAPITAL LETTER YERU" #x042B)
+    ("CYRILLIC CAPITAL LETTER SOFT SIGN" #x042C)
+    ("CYRILLIC CAPITAL LETTER E" #x042D)
+    ("CYRILLIC CAPITAL LETTER YU" #x042E)
+    ("CYRILLIC CAPITAL LETTER YA" #x042F)
+    ("CYRILLIC SMALL LETTER A" #x0430)
+    ("CYRILLIC SMALL LETTER BE" #x0431)
+    ("CYRILLIC SMALL LETTER VE" #x0432)
+    ("CYRILLIC SMALL LETTER GHE" #x0433)
+    ("CYRILLIC SMALL LETTER DE" #x0434)
+    ("CYRILLIC SMALL LETTER IE" #x0435)
+    ("CYRILLIC SMALL LETTER ZHE" #x0436)
+    ("CYRILLIC SMALL LETTER ZE" #x0437)
+    ("CYRILLIC SMALL LETTER I" #x0438)
+    ("CYRILLIC SMALL LETTER SHORT I" #x0439)
+    ("CYRILLIC SMALL LETTER KA" #x043A)
+    ("CYRILLIC SMALL LETTER EL" #x043B)
+    ("CYRILLIC SMALL LETTER EM" #x043C)
+    ("CYRILLIC SMALL LETTER EN" #x043D)
+    ("CYRILLIC SMALL LETTER O" #x043E)
+    ("CYRILLIC SMALL LETTER PE" #x043F)
+    ("CYRILLIC SMALL LETTER ER" #x0440)
+    ("CYRILLIC SMALL LETTER ES" #x0441)
+    ("CYRILLIC SMALL LETTER TE" #x0442)
+    ("CYRILLIC SMALL LETTER U" #x0443)
+    ("CYRILLIC SMALL LETTER EF" #x0444)
+    ("CYRILLIC SMALL LETTER HA" #x0445)
+    ("CYRILLIC SMALL LETTER TSE" #x0446)
+    ("CYRILLIC SMALL LETTER CHE" #x0447)
+    ("CYRILLIC SMALL LETTER SHA" #x0448)
+    ("CYRILLIC SMALL LETTER SHCHA" #x0449)
+    ("CYRILLIC SMALL LETTER HARD SIGN" #x044A)
+    ("CYRILLIC SMALL LETTER YERU" #x044B)
+    ("CYRILLIC SMALL LETTER SOFT SIGN" #x044C)
+    ("CYRILLIC SMALL LETTER E" #x044D)
+    ("CYRILLIC SMALL LETTER YU" #x044E)
+    ("CYRILLIC SMALL LETTER YA" #x044F)
+    ("CYRILLIC SMALL LETTER IE WITH GRAVE" #x0450)
+    ("CYRILLIC SMALL LETTER IO" #x0451)
+    ("CYRILLIC SMALL LETTER DJE" #x0452)
+    ("CYRILLIC SMALL LETTER GJE" #x0453)
+    ("CYRILLIC SMALL LETTER UKRAINIAN IE" #x0454)
+    ("CYRILLIC SMALL LETTER DZE" #x0455)
+    ("CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I" #x0456)
+    ("CYRILLIC SMALL LETTER YI" #x0457)
+    ("CYRILLIC SMALL LETTER JE" #x0458)
+    ("CYRILLIC SMALL LETTER LJE" #x0459)
+    ("CYRILLIC SMALL LETTER NJE" #x045A)
+    ("CYRILLIC SMALL LETTER TSHE" #x045B)
+    ("CYRILLIC SMALL LETTER KJE" #x045C)
+    ("CYRILLIC SMALL LETTER I WITH GRAVE" #x045D)
+    ("CYRILLIC SMALL LETTER SHORT U" #x045E)
+    ("CYRILLIC SMALL LETTER DZHE" #x045F)
+    ("CYRILLIC CAPITAL LETTER OMEGA" #x0460)
+    ("CYRILLIC SMALL LETTER OMEGA" #x0461)
+    ("CYRILLIC CAPITAL LETTER YAT" #x0462)
+    ("CYRILLIC SMALL LETTER YAT" #x0463)
+    ("CYRILLIC CAPITAL LETTER IOTIFIED E" #x0464)
+    ("CYRILLIC SMALL LETTER IOTIFIED E" #x0465)
+    ("CYRILLIC CAPITAL LETTER LITTLE YUS" #x0466)
+    ("CYRILLIC SMALL LETTER LITTLE YUS" #x0467)
+    ("CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS" #x0468)
+    ("CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS" #x0469)
+    ("CYRILLIC CAPITAL LETTER BIG YUS" #x046A)
+    ("CYRILLIC SMALL LETTER BIG YUS" #x046B)
+    ("CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS" #x046C)
+    ("CYRILLIC SMALL LETTER IOTIFIED BIG YUS" #x046D)
+    ("CYRILLIC CAPITAL LETTER KSI" #x046E)
+    ("CYRILLIC SMALL LETTER KSI" #x046F)
+    ("CYRILLIC CAPITAL LETTER PSI" #x0470)
+    ("CYRILLIC SMALL LETTER PSI" #x0471)
+    ("CYRILLIC CAPITAL LETTER FITA" #x0472)
+    ("CYRILLIC SMALL LETTER FITA" #x0473)
+    ("CYRILLIC CAPITAL LETTER IZHITSA" #x0474)
+    ("CYRILLIC SMALL LETTER IZHITSA" #x0475)
+    ("CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT" #x0476)
+    ("CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT" #x0477)
+    ("CYRILLIC CAPITAL LETTER UK" #x0478)
+    ("CYRILLIC SMALL LETTER UK" #x0479)
+    ("CYRILLIC CAPITAL LETTER ROUND OMEGA" #x047A)
+    ("CYRILLIC SMALL LETTER ROUND OMEGA" #x047B)
+    ("CYRILLIC CAPITAL LETTER OMEGA WITH TITLO" #x047C)
+    ("CYRILLIC SMALL LETTER OMEGA WITH TITLO" #x047D)
+    ("CYRILLIC CAPITAL LETTER OT" #x047E)
+    ("CYRILLIC SMALL LETTER OT" #x047F)
+    ("CYRILLIC CAPITAL LETTER KOPPA" #x0480)
+    ("CYRILLIC SMALL LETTER KOPPA" #x0481)
+    ("CYRILLIC THOUSANDS SIGN" #x0482)
+    ("COMBINING CYRILLIC TITLO" #x0483)
+    ("COMBINING CYRILLIC PALATALIZATION" #x0484)
+    ("COMBINING CYRILLIC DASIA PNEUMATA" #x0485)
+    ("COMBINING CYRILLIC PSILI PNEUMATA" #x0486)
+    ("COMBINING CYRILLIC HUNDRED THOUSANDS SIGN" #x0488)
+    ("COMBINING CYRILLIC MILLIONS SIGN" #x0489)
+    ("CYRILLIC CAPITAL LETTER SHORT I WITH TAIL" #x048A)
+    ("CYRILLIC SMALL LETTER SHORT I WITH TAIL" #x048B)
+    ("CYRILLIC CAPITAL LETTER SEMISOFT SIGN" #x048C)
+    ("CYRILLIC SMALL LETTER SEMISOFT SIGN" #x048D)
+    ("CYRILLIC CAPITAL LETTER ER WITH TICK" #x048E)
+    ("CYRILLIC SMALL LETTER ER WITH TICK" #x048F)
+    ("CYRILLIC CAPITAL LETTER GHE WITH UPTURN" #x0490)
+    ("CYRILLIC SMALL LETTER GHE WITH UPTURN" #x0491)
+    ("CYRILLIC CAPITAL LETTER GHE WITH STROKE" #x0492)
+    ("CYRILLIC SMALL LETTER GHE WITH STROKE" #x0493)
+    ("CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK" #x0494)
+    ("CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK" #x0495)
+    ("CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER" #x0496)
+    ("CYRILLIC SMALL LETTER ZHE WITH DESCENDER" #x0497)
+    ("CYRILLIC CAPITAL LETTER ZE WITH DESCENDER" #x0498)
+    ("CYRILLIC SMALL LETTER ZE WITH DESCENDER" #x0499)
+    ("CYRILLIC CAPITAL LETTER KA WITH DESCENDER" #x049A)
+    ("CYRILLIC SMALL LETTER KA WITH DESCENDER" #x049B)
+    ("CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE" #x049C)
+    ("CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE" #x049D)
+    ("CYRILLIC CAPITAL LETTER KA WITH STROKE" #x049E)
+    ("CYRILLIC SMALL LETTER KA WITH STROKE" #x049F)
+    ("CYRILLIC CAPITAL LETTER BASHKIR KA" #x04A0)
+    ("CYRILLIC SMALL LETTER BASHKIR KA" #x04A1)
+    ("CYRILLIC CAPITAL LETTER EN WITH DESCENDER" #x04A2)
+    ("CYRILLIC SMALL LETTER EN WITH DESCENDER" #x04A3)
+    ("CYRILLIC CAPITAL LIGATURE EN GHE" #x04A4)
+    ("CYRILLIC SMALL LIGATURE EN GHE" #x04A5)
+    ("CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK" #x04A6)
+    ("CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK" #x04A7)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN HA" #x04A8)
+    ("CYRILLIC SMALL LETTER ABKHASIAN HA" #x04A9)
+    ("CYRILLIC CAPITAL LETTER ES WITH DESCENDER" #x04AA)
+    ("CYRILLIC SMALL LETTER ES WITH DESCENDER" #x04AB)
+    ("CYRILLIC CAPITAL LETTER TE WITH DESCENDER" #x04AC)
+    ("CYRILLIC SMALL LETTER TE WITH DESCENDER" #x04AD)
+    ("CYRILLIC CAPITAL LETTER STRAIGHT U" #x04AE)
+    ("CYRILLIC SMALL LETTER STRAIGHT U" #x04AF)
+    ("CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE" #x04B0)
+    ("CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE" #x04B1)
+    ("CYRILLIC CAPITAL LETTER HA WITH DESCENDER" #x04B2)
+    ("CYRILLIC SMALL LETTER HA WITH DESCENDER" #x04B3)
+    ("CYRILLIC CAPITAL LIGATURE TE TSE" #x04B4)
+    ("CYRILLIC SMALL LIGATURE TE TSE" #x04B5)
+    ("CYRILLIC CAPITAL LETTER CHE WITH DESCENDER" #x04B6)
+    ("CYRILLIC SMALL LETTER CHE WITH DESCENDER" #x04B7)
+    ("CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE" #x04B8)
+    ("CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE" #x04B9)
+    ("CYRILLIC CAPITAL LETTER SHHA" #x04BA)
+    ("CYRILLIC SMALL LETTER SHHA" #x04BB)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN CHE" #x04BC)
+    ("CYRILLIC SMALL LETTER ABKHASIAN CHE" #x04BD)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER" #x04BE)
+    ("CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER" #x04BF)
+    ("CYRILLIC LETTER PALOCHKA" #x04C0)
+    ("CYRILLIC CAPITAL LETTER ZHE WITH BREVE" #x04C1)
+    ("CYRILLIC SMALL LETTER ZHE WITH BREVE" #x04C2)
+    ("CYRILLIC CAPITAL LETTER KA WITH HOOK" #x04C3)
+    ("CYRILLIC SMALL LETTER KA WITH HOOK" #x04C4)
+    ("CYRILLIC CAPITAL LETTER EL WITH TAIL" #x04C5)
+    ("CYRILLIC SMALL LETTER EL WITH TAIL" #x04C6)
+    ("CYRILLIC CAPITAL LETTER EN WITH HOOK" #x04C7)
+    ("CYRILLIC SMALL LETTER EN WITH HOOK" #x04C8)
+    ("CYRILLIC CAPITAL LETTER EN WITH TAIL" #x04C9)
+    ("CYRILLIC SMALL LETTER EN WITH TAIL" #x04CA)
+    ("CYRILLIC CAPITAL LETTER KHAKASSIAN CHE" #x04CB)
+    ("CYRILLIC SMALL LETTER KHAKASSIAN CHE" #x04CC)
+    ("CYRILLIC CAPITAL LETTER EM WITH TAIL" #x04CD)
+    ("CYRILLIC SMALL LETTER EM WITH TAIL" #x04CE)
+    ("CYRILLIC CAPITAL LETTER A WITH BREVE" #x04D0)
+    ("CYRILLIC SMALL LETTER A WITH BREVE" #x04D1)
+    ("CYRILLIC CAPITAL LETTER A WITH DIAERESIS" #x04D2)
+    ("CYRILLIC SMALL LETTER A WITH DIAERESIS" #x04D3)
+    ("CYRILLIC CAPITAL LIGATURE A IE" #x04D4)
+    ("CYRILLIC SMALL LIGATURE A IE" #x04D5)
+    ("CYRILLIC CAPITAL LETTER IE WITH BREVE" #x04D6)
+    ("CYRILLIC SMALL LETTER IE WITH BREVE" #x04D7)
+    ("CYRILLIC CAPITAL LETTER SCHWA" #x04D8)
+    ("CYRILLIC SMALL LETTER SCHWA" #x04D9)
+    ("CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS" #x04DA)
+    ("CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS" #x04DB)
+    ("CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS" #x04DC)
+    ("CYRILLIC SMALL LETTER ZHE WITH DIAERESIS" #x04DD)
+    ("CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS" #x04DE)
+    ("CYRILLIC SMALL LETTER ZE WITH DIAERESIS" #x04DF)
+    ("CYRILLIC CAPITAL LETTER ABKHASIAN DZE" #x04E0)
+    ("CYRILLIC SMALL LETTER ABKHASIAN DZE" #x04E1)
+    ("CYRILLIC CAPITAL LETTER I WITH MACRON" #x04E2)
+    ("CYRILLIC SMALL LETTER I WITH MACRON" #x04E3)
+    ("CYRILLIC CAPITAL LETTER I WITH DIAERESIS" #x04E4)
+    ("CYRILLIC SMALL LETTER I WITH DIAERESIS" #x04E5)
+    ("CYRILLIC CAPITAL LETTER O WITH DIAERESIS" #x04E6)
+    ("CYRILLIC SMALL LETTER O WITH DIAERESIS" #x04E7)
+    ("CYRILLIC CAPITAL LETTER BARRED O" #x04E8)
+    ("CYRILLIC SMALL LETTER BARRED O" #x04E9)
+    ("CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS" #x04EA)
+    ("CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS" #x04EB)
+    ("CYRILLIC CAPITAL LETTER E WITH DIAERESIS" #x04EC)
+    ("CYRILLIC SMALL LETTER E WITH DIAERESIS" #x04ED)
+    ("CYRILLIC CAPITAL LETTER U WITH MACRON" #x04EE)
+    ("CYRILLIC SMALL LETTER U WITH MACRON" #x04EF)
+    ("CYRILLIC CAPITAL LETTER U WITH DIAERESIS" #x04F0)
+    ("CYRILLIC SMALL LETTER U WITH DIAERESIS" #x04F1)
+    ("CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE" #x04F2)
+    ("CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE" #x04F3)
+    ("CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS" #x04F4)
+    ("CYRILLIC SMALL LETTER CHE WITH DIAERESIS" #x04F5)
+    ("CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS" #x04F8)
+    ("CYRILLIC SMALL LETTER YERU WITH DIAERESIS" #x04F9)
+    ))
+
+;; arch-tag: 9cd8c4dd-3386-4c0a-b1dd-984efa12d958
diff --git a/etc/nxml/00500-0052F.el b/etc/nxml/00500-0052F.el
new file mode 100644 (file)
index 0000000..c098c89
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'cyrillic-supplementary
+  '(("CYRILLIC CAPITAL LETTER KOMI DE" #x0500)
+    ("CYRILLIC SMALL LETTER KOMI DE" #x0501)
+    ("CYRILLIC CAPITAL LETTER KOMI DJE" #x0502)
+    ("CYRILLIC SMALL LETTER KOMI DJE" #x0503)
+    ("CYRILLIC CAPITAL LETTER KOMI ZJE" #x0504)
+    ("CYRILLIC SMALL LETTER KOMI ZJE" #x0505)
+    ("CYRILLIC CAPITAL LETTER KOMI DZJE" #x0506)
+    ("CYRILLIC SMALL LETTER KOMI DZJE" #x0507)
+    ("CYRILLIC CAPITAL LETTER KOMI LJE" #x0508)
+    ("CYRILLIC SMALL LETTER KOMI LJE" #x0509)
+    ("CYRILLIC CAPITAL LETTER KOMI NJE" #x050A)
+    ("CYRILLIC SMALL LETTER KOMI NJE" #x050B)
+    ("CYRILLIC CAPITAL LETTER KOMI SJE" #x050C)
+    ("CYRILLIC SMALL LETTER KOMI SJE" #x050D)
+    ("CYRILLIC CAPITAL LETTER KOMI TJE" #x050E)
+    ("CYRILLIC SMALL LETTER KOMI TJE" #x050F)
+    ))
+
+;; arch-tag: 3ae51d36-3921-4ec5-b6be-3e9c895be9f3
diff --git a/etc/nxml/00530-0058F.el b/etc/nxml/00530-0058F.el
new file mode 100644 (file)
index 0000000..2b530a5
--- /dev/null
@@ -0,0 +1,90 @@
+(nxml-define-char-name-set 'armenian
+  '(("ARMENIAN CAPITAL LETTER AYB" #x0531)
+    ("ARMENIAN CAPITAL LETTER BEN" #x0532)
+    ("ARMENIAN CAPITAL LETTER GIM" #x0533)
+    ("ARMENIAN CAPITAL LETTER DA" #x0534)
+    ("ARMENIAN CAPITAL LETTER ECH" #x0535)
+    ("ARMENIAN CAPITAL LETTER ZA" #x0536)
+    ("ARMENIAN CAPITAL LETTER EH" #x0537)
+    ("ARMENIAN CAPITAL LETTER ET" #x0538)
+    ("ARMENIAN CAPITAL LETTER TO" #x0539)
+    ("ARMENIAN CAPITAL LETTER ZHE" #x053A)
+    ("ARMENIAN CAPITAL LETTER INI" #x053B)
+    ("ARMENIAN CAPITAL LETTER LIWN" #x053C)
+    ("ARMENIAN CAPITAL LETTER XEH" #x053D)
+    ("ARMENIAN CAPITAL LETTER CA" #x053E)
+    ("ARMENIAN CAPITAL LETTER KEN" #x053F)
+    ("ARMENIAN CAPITAL LETTER HO" #x0540)
+    ("ARMENIAN CAPITAL LETTER JA" #x0541)
+    ("ARMENIAN CAPITAL LETTER GHAD" #x0542)
+    ("ARMENIAN CAPITAL LETTER CHEH" #x0543)
+    ("ARMENIAN CAPITAL LETTER MEN" #x0544)
+    ("ARMENIAN CAPITAL LETTER YI" #x0545)
+    ("ARMENIAN CAPITAL LETTER NOW" #x0546)
+    ("ARMENIAN CAPITAL LETTER SHA" #x0547)
+    ("ARMENIAN CAPITAL LETTER VO" #x0548)
+    ("ARMENIAN CAPITAL LETTER CHA" #x0549)
+    ("ARMENIAN CAPITAL LETTER PEH" #x054A)
+    ("ARMENIAN CAPITAL LETTER JHEH" #x054B)
+    ("ARMENIAN CAPITAL LETTER RA" #x054C)
+    ("ARMENIAN CAPITAL LETTER SEH" #x054D)
+    ("ARMENIAN CAPITAL LETTER VEW" #x054E)
+    ("ARMENIAN CAPITAL LETTER TIWN" #x054F)
+    ("ARMENIAN CAPITAL LETTER REH" #x0550)
+    ("ARMENIAN CAPITAL LETTER CO" #x0551)
+    ("ARMENIAN CAPITAL LETTER YIWN" #x0552)
+    ("ARMENIAN CAPITAL LETTER PIWR" #x0553)
+    ("ARMENIAN CAPITAL LETTER KEH" #x0554)
+    ("ARMENIAN CAPITAL LETTER OH" #x0555)
+    ("ARMENIAN CAPITAL LETTER FEH" #x0556)
+    ("ARMENIAN MODIFIER LETTER LEFT HALF RING" #x0559)
+    ("ARMENIAN APOSTROPHE" #x055A)
+    ("ARMENIAN EMPHASIS MARK" #x055B)
+    ("ARMENIAN EXCLAMATION MARK" #x055C)
+    ("ARMENIAN COMMA" #x055D)
+    ("ARMENIAN QUESTION MARK" #x055E)
+    ("ARMENIAN ABBREVIATION MARK" #x055F)
+    ("ARMENIAN SMALL LETTER AYB" #x0561)
+    ("ARMENIAN SMALL LETTER BEN" #x0562)
+    ("ARMENIAN SMALL LETTER GIM" #x0563)
+    ("ARMENIAN SMALL LETTER DA" #x0564)
+    ("ARMENIAN SMALL LETTER ECH" #x0565)
+    ("ARMENIAN SMALL LETTER ZA" #x0566)
+    ("ARMENIAN SMALL LETTER EH" #x0567)
+    ("ARMENIAN SMALL LETTER ET" #x0568)
+    ("ARMENIAN SMALL LETTER TO" #x0569)
+    ("ARMENIAN SMALL LETTER ZHE" #x056A)
+    ("ARMENIAN SMALL LETTER INI" #x056B)
+    ("ARMENIAN SMALL LETTER LIWN" #x056C)
+    ("ARMENIAN SMALL LETTER XEH" #x056D)
+    ("ARMENIAN SMALL LETTER CA" #x056E)
+    ("ARMENIAN SMALL LETTER KEN" #x056F)
+    ("ARMENIAN SMALL LETTER HO" #x0570)
+    ("ARMENIAN SMALL LETTER JA" #x0571)
+    ("ARMENIAN SMALL LETTER GHAD" #x0572)
+    ("ARMENIAN SMALL LETTER CHEH" #x0573)
+    ("ARMENIAN SMALL LETTER MEN" #x0574)
+    ("ARMENIAN SMALL LETTER YI" #x0575)
+    ("ARMENIAN SMALL LETTER NOW" #x0576)
+    ("ARMENIAN SMALL LETTER SHA" #x0577)
+    ("ARMENIAN SMALL LETTER VO" #x0578)
+    ("ARMENIAN SMALL LETTER CHA" #x0579)
+    ("ARMENIAN SMALL LETTER PEH" #x057A)
+    ("ARMENIAN SMALL LETTER JHEH" #x057B)
+    ("ARMENIAN SMALL LETTER RA" #x057C)
+    ("ARMENIAN SMALL LETTER SEH" #x057D)
+    ("ARMENIAN SMALL LETTER VEW" #x057E)
+    ("ARMENIAN SMALL LETTER TIWN" #x057F)
+    ("ARMENIAN SMALL LETTER REH" #x0580)
+    ("ARMENIAN SMALL LETTER CO" #x0581)
+    ("ARMENIAN SMALL LETTER YIWN" #x0582)
+    ("ARMENIAN SMALL LETTER PIWR" #x0583)
+    ("ARMENIAN SMALL LETTER KEH" #x0584)
+    ("ARMENIAN SMALL LETTER OH" #x0585)
+    ("ARMENIAN SMALL LETTER FEH" #x0586)
+    ("ARMENIAN SMALL LIGATURE ECH YIWN" #x0587)
+    ("ARMENIAN FULL STOP" #x0589)
+    ("ARMENIAN HYPHEN" #x058A)
+    ))
+
+;; arch-tag: 7b3d705a-d060-42de-a918-ff39dbe5d276
diff --git a/etc/nxml/00590-005FF.el b/etc/nxml/00590-005FF.el
new file mode 100644 (file)
index 0000000..7640229
--- /dev/null
@@ -0,0 +1,86 @@
+(nxml-define-char-name-set 'hebrew
+  '(("HEBREW ACCENT ETNAHTA" #x0591)
+    ("HEBREW ACCENT SEGOL" #x0592)
+    ("HEBREW ACCENT SHALSHELET" #x0593)
+    ("HEBREW ACCENT ZAQEF QATAN" #x0594)
+    ("HEBREW ACCENT ZAQEF GADOL" #x0595)
+    ("HEBREW ACCENT TIPEHA" #x0596)
+    ("HEBREW ACCENT REVIA" #x0597)
+    ("HEBREW ACCENT ZARQA" #x0598)
+    ("HEBREW ACCENT PASHTA" #x0599)
+    ("HEBREW ACCENT YETIV" #x059A)
+    ("HEBREW ACCENT TEVIR" #x059B)
+    ("HEBREW ACCENT GERESH" #x059C)
+    ("HEBREW ACCENT GERESH MUQDAM" #x059D)
+    ("HEBREW ACCENT GERSHAYIM" #x059E)
+    ("HEBREW ACCENT QARNEY PARA" #x059F)
+    ("HEBREW ACCENT TELISHA GEDOLA" #x05A0)
+    ("HEBREW ACCENT PAZER" #x05A1)
+    ("HEBREW ACCENT MUNAH" #x05A3)
+    ("HEBREW ACCENT MAHAPAKH" #x05A4)
+    ("HEBREW ACCENT MERKHA" #x05A5)
+    ("HEBREW ACCENT MERKHA KEFULA" #x05A6)
+    ("HEBREW ACCENT DARGA" #x05A7)
+    ("HEBREW ACCENT QADMA" #x05A8)
+    ("HEBREW ACCENT TELISHA QETANA" #x05A9)
+    ("HEBREW ACCENT YERAH BEN YOMO" #x05AA)
+    ("HEBREW ACCENT OLE" #x05AB)
+    ("HEBREW ACCENT ILUY" #x05AC)
+    ("HEBREW ACCENT DEHI" #x05AD)
+    ("HEBREW ACCENT ZINOR" #x05AE)
+    ("HEBREW MARK MASORA CIRCLE" #x05AF)
+    ("HEBREW POINT SHEVA" #x05B0)
+    ("HEBREW POINT HATAF SEGOL" #x05B1)
+    ("HEBREW POINT HATAF PATAH" #x05B2)
+    ("HEBREW POINT HATAF QAMATS" #x05B3)
+    ("HEBREW POINT HIRIQ" #x05B4)
+    ("HEBREW POINT TSERE" #x05B5)
+    ("HEBREW POINT SEGOL" #x05B6)
+    ("HEBREW POINT PATAH" #x05B7)
+    ("HEBREW POINT QAMATS" #x05B8)
+    ("HEBREW POINT HOLAM" #x05B9)
+    ("HEBREW POINT QUBUTS" #x05BB)
+    ("HEBREW POINT DAGESH OR MAPIQ" #x05BC)
+    ("HEBREW POINT METEG" #x05BD)
+    ("HEBREW PUNCTUATION MAQAF" #x05BE)
+    ("HEBREW POINT RAFE" #x05BF)
+    ("HEBREW PUNCTUATION PASEQ" #x05C0)
+    ("HEBREW POINT SHIN DOT" #x05C1)
+    ("HEBREW POINT SIN DOT" #x05C2)
+    ("HEBREW PUNCTUATION SOF PASUQ" #x05C3)
+    ("HEBREW MARK UPPER DOT" #x05C4)
+    ("HEBREW LETTER ALEF" #x05D0)
+    ("HEBREW LETTER BET" #x05D1)
+    ("HEBREW LETTER GIMEL" #x05D2)
+    ("HEBREW LETTER DALET" #x05D3)
+    ("HEBREW LETTER HE" #x05D4)
+    ("HEBREW LETTER VAV" #x05D5)
+    ("HEBREW LETTER ZAYIN" #x05D6)
+    ("HEBREW LETTER HET" #x05D7)
+    ("HEBREW LETTER TET" #x05D8)
+    ("HEBREW LETTER YOD" #x05D9)
+    ("HEBREW LETTER FINAL KAF" #x05DA)
+    ("HEBREW LETTER KAF" #x05DB)
+    ("HEBREW LETTER LAMED" #x05DC)
+    ("HEBREW LETTER FINAL MEM" #x05DD)
+    ("HEBREW LETTER MEM" #x05DE)
+    ("HEBREW LETTER FINAL NUN" #x05DF)
+    ("HEBREW LETTER NUN" #x05E0)
+    ("HEBREW LETTER SAMEKH" #x05E1)
+    ("HEBREW LETTER AYIN" #x05E2)
+    ("HEBREW LETTER FINAL PE" #x05E3)
+    ("HEBREW LETTER PE" #x05E4)
+    ("HEBREW LETTER FINAL TSADI" #x05E5)
+    ("HEBREW LETTER TSADI" #x05E6)
+    ("HEBREW LETTER QOF" #x05E7)
+    ("HEBREW LETTER RESH" #x05E8)
+    ("HEBREW LETTER SHIN" #x05E9)
+    ("HEBREW LETTER TAV" #x05EA)
+    ("HEBREW LIGATURE YIDDISH DOUBLE VAV" #x05F0)
+    ("HEBREW LIGATURE YIDDISH VAV YOD" #x05F1)
+    ("HEBREW LIGATURE YIDDISH DOUBLE YOD" #x05F2)
+    ("HEBREW PUNCTUATION GERESH" #x05F3)
+    ("HEBREW PUNCTUATION GERSHAYIM" #x05F4)
+    ))
+
+;; arch-tag: 262da37d-1065-4dfd-b6e4-a8259a780caf
diff --git a/etc/nxml/00600-006FF.el b/etc/nxml/00600-006FF.el
new file mode 100644 (file)
index 0000000..c489a70
--- /dev/null
@@ -0,0 +1,212 @@
+(nxml-define-char-name-set 'arabic
+  '(("ARABIC COMMA" #x060C)
+    ("ARABIC SEMICOLON" #x061B)
+    ("ARABIC QUESTION MARK" #x061F)
+    ("ARABIC LETTER HAMZA" #x0621)
+    ("ARABIC LETTER ALEF WITH MADDA ABOVE" #x0622)
+    ("ARABIC LETTER ALEF WITH HAMZA ABOVE" #x0623)
+    ("ARABIC LETTER WAW WITH HAMZA ABOVE" #x0624)
+    ("ARABIC LETTER ALEF WITH HAMZA BELOW" #x0625)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE" #x0626)
+    ("ARABIC LETTER ALEF" #x0627)
+    ("ARABIC LETTER BEH" #x0628)
+    ("ARABIC LETTER TEH MARBUTA" #x0629)
+    ("ARABIC LETTER TEH" #x062A)
+    ("ARABIC LETTER THEH" #x062B)
+    ("ARABIC LETTER JEEM" #x062C)
+    ("ARABIC LETTER HAH" #x062D)
+    ("ARABIC LETTER KHAH" #x062E)
+    ("ARABIC LETTER DAL" #x062F)
+    ("ARABIC LETTER THAL" #x0630)
+    ("ARABIC LETTER REH" #x0631)
+    ("ARABIC LETTER ZAIN" #x0632)
+    ("ARABIC LETTER SEEN" #x0633)
+    ("ARABIC LETTER SHEEN" #x0634)
+    ("ARABIC LETTER SAD" #x0635)
+    ("ARABIC LETTER DAD" #x0636)
+    ("ARABIC LETTER TAH" #x0637)
+    ("ARABIC LETTER ZAH" #x0638)
+    ("ARABIC LETTER AIN" #x0639)
+    ("ARABIC LETTER GHAIN" #x063A)
+    ("ARABIC TATWEEL" #x0640)
+    ("ARABIC LETTER FEH" #x0641)
+    ("ARABIC LETTER QAF" #x0642)
+    ("ARABIC LETTER KAF" #x0643)
+    ("ARABIC LETTER LAM" #x0644)
+    ("ARABIC LETTER MEEM" #x0645)
+    ("ARABIC LETTER NOON" #x0646)
+    ("ARABIC LETTER HEH" #x0647)
+    ("ARABIC LETTER WAW" #x0648)
+    ("ARABIC LETTER ALEF MAKSURA" #x0649)
+    ("ARABIC LETTER YEH" #x064A)
+    ("ARABIC FATHATAN" #x064B)
+    ("ARABIC DAMMATAN" #x064C)
+    ("ARABIC KASRATAN" #x064D)
+    ("ARABIC FATHA" #x064E)
+    ("ARABIC DAMMA" #x064F)
+    ("ARABIC KASRA" #x0650)
+    ("ARABIC SHADDA" #x0651)
+    ("ARABIC SUKUN" #x0652)
+    ("ARABIC MADDAH ABOVE" #x0653)
+    ("ARABIC HAMZA ABOVE" #x0654)
+    ("ARABIC HAMZA BELOW" #x0655)
+    ("ARABIC-INDIC DIGIT ZERO" #x0660)
+    ("ARABIC-INDIC DIGIT ONE" #x0661)
+    ("ARABIC-INDIC DIGIT TWO" #x0662)
+    ("ARABIC-INDIC DIGIT THREE" #x0663)
+    ("ARABIC-INDIC DIGIT FOUR" #x0664)
+    ("ARABIC-INDIC DIGIT FIVE" #x0665)
+    ("ARABIC-INDIC DIGIT SIX" #x0666)
+    ("ARABIC-INDIC DIGIT SEVEN" #x0667)
+    ("ARABIC-INDIC DIGIT EIGHT" #x0668)
+    ("ARABIC-INDIC DIGIT NINE" #x0669)
+    ("ARABIC PERCENT SIGN" #x066A)
+    ("ARABIC DECIMAL SEPARATOR" #x066B)
+    ("ARABIC THOUSANDS SEPARATOR" #x066C)
+    ("ARABIC FIVE POINTED STAR" #x066D)
+    ("ARABIC LETTER DOTLESS BEH" #x066E)
+    ("ARABIC LETTER DOTLESS QAF" #x066F)
+    ("ARABIC LETTER SUPERSCRIPT ALEF" #x0670)
+    ("ARABIC LETTER ALEF WASLA" #x0671)
+    ("ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE" #x0672)
+    ("ARABIC LETTER ALEF WITH WAVY HAMZA BELOW" #x0673)
+    ("ARABIC LETTER HIGH HAMZA" #x0674)
+    ("ARABIC LETTER HIGH HAMZA ALEF" #x0675)
+    ("ARABIC LETTER HIGH HAMZA WAW" #x0676)
+    ("ARABIC LETTER U WITH HAMZA ABOVE" #x0677)
+    ("ARABIC LETTER HIGH HAMZA YEH" #x0678)
+    ("ARABIC LETTER TTEH" #x0679)
+    ("ARABIC LETTER TTEHEH" #x067A)
+    ("ARABIC LETTER BEEH" #x067B)
+    ("ARABIC LETTER TEH WITH RING" #x067C)
+    ("ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS" #x067D)
+    ("ARABIC LETTER PEH" #x067E)
+    ("ARABIC LETTER TEHEH" #x067F)
+    ("ARABIC LETTER BEHEH" #x0680)
+    ("ARABIC LETTER HAH WITH HAMZA ABOVE" #x0681)
+    ("ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE" #x0682)
+    ("ARABIC LETTER NYEH" #x0683)
+    ("ARABIC LETTER DYEH" #x0684)
+    ("ARABIC LETTER HAH WITH THREE DOTS ABOVE" #x0685)
+    ("ARABIC LETTER TCHEH" #x0686)
+    ("ARABIC LETTER TCHEHEH" #x0687)
+    ("ARABIC LETTER DDAL" #x0688)
+    ("ARABIC LETTER DAL WITH RING" #x0689)
+    ("ARABIC LETTER DAL WITH DOT BELOW" #x068A)
+    ("ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH" #x068B)
+    ("ARABIC LETTER DAHAL" #x068C)
+    ("ARABIC LETTER DDAHAL" #x068D)
+    ("ARABIC LETTER DUL" #x068E)
+    ("ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS" #x068F)
+    ("ARABIC LETTER DAL WITH FOUR DOTS ABOVE" #x0690)
+    ("ARABIC LETTER RREH" #x0691)
+    ("ARABIC LETTER REH WITH SMALL V" #x0692)
+    ("ARABIC LETTER REH WITH RING" #x0693)
+    ("ARABIC LETTER REH WITH DOT BELOW" #x0694)
+    ("ARABIC LETTER REH WITH SMALL V BELOW" #x0695)
+    ("ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE" #x0696)
+    ("ARABIC LETTER REH WITH TWO DOTS ABOVE" #x0697)
+    ("ARABIC LETTER JEH" #x0698)
+    ("ARABIC LETTER REH WITH FOUR DOTS ABOVE" #x0699)
+    ("ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE" #x069A)
+    ("ARABIC LETTER SEEN WITH THREE DOTS BELOW" #x069B)
+    ("ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE" #x069C)
+    ("ARABIC LETTER SAD WITH TWO DOTS BELOW" #x069D)
+    ("ARABIC LETTER SAD WITH THREE DOTS ABOVE" #x069E)
+    ("ARABIC LETTER TAH WITH THREE DOTS ABOVE" #x069F)
+    ("ARABIC LETTER AIN WITH THREE DOTS ABOVE" #x06A0)
+    ("ARABIC LETTER DOTLESS FEH" #x06A1)
+    ("ARABIC LETTER FEH WITH DOT MOVED BELOW" #x06A2)
+    ("ARABIC LETTER FEH WITH DOT BELOW" #x06A3)
+    ("ARABIC LETTER VEH" #x06A4)
+    ("ARABIC LETTER FEH WITH THREE DOTS BELOW" #x06A5)
+    ("ARABIC LETTER PEHEH" #x06A6)
+    ("ARABIC LETTER QAF WITH DOT ABOVE" #x06A7)
+    ("ARABIC LETTER QAF WITH THREE DOTS ABOVE" #x06A8)
+    ("ARABIC LETTER KEHEH" #x06A9)
+    ("ARABIC LETTER SWASH KAF" #x06AA)
+    ("ARABIC LETTER KAF WITH RING" #x06AB)
+    ("ARABIC LETTER KAF WITH DOT ABOVE" #x06AC)
+    ("ARABIC LETTER NG" #x06AD)
+    ("ARABIC LETTER KAF WITH THREE DOTS BELOW" #x06AE)
+    ("ARABIC LETTER GAF" #x06AF)
+    ("ARABIC LETTER GAF WITH RING" #x06B0)
+    ("ARABIC LETTER NGOEH" #x06B1)
+    ("ARABIC LETTER GAF WITH TWO DOTS BELOW" #x06B2)
+    ("ARABIC LETTER GUEH" #x06B3)
+    ("ARABIC LETTER GAF WITH THREE DOTS ABOVE" #x06B4)
+    ("ARABIC LETTER LAM WITH SMALL V" #x06B5)
+    ("ARABIC LETTER LAM WITH DOT ABOVE" #x06B6)
+    ("ARABIC LETTER LAM WITH THREE DOTS ABOVE" #x06B7)
+    ("ARABIC LETTER LAM WITH THREE DOTS BELOW" #x06B8)
+    ("ARABIC LETTER NOON WITH DOT BELOW" #x06B9)
+    ("ARABIC LETTER NOON GHUNNA" #x06BA)
+    ("ARABIC LETTER RNOON" #x06BB)
+    ("ARABIC LETTER NOON WITH RING" #x06BC)
+    ("ARABIC LETTER NOON WITH THREE DOTS ABOVE" #x06BD)
+    ("ARABIC LETTER HEH DOACHASHMEE" #x06BE)
+    ("ARABIC LETTER TCHEH WITH DOT ABOVE" #x06BF)
+    ("ARABIC LETTER HEH WITH YEH ABOVE" #x06C0)
+    ("ARABIC LETTER HEH GOAL" #x06C1)
+    ("ARABIC LETTER HEH GOAL WITH HAMZA ABOVE" #x06C2)
+    ("ARABIC LETTER TEH MARBUTA GOAL" #x06C3)
+    ("ARABIC LETTER WAW WITH RING" #x06C4)
+    ("ARABIC LETTER KIRGHIZ OE" #x06C5)
+    ("ARABIC LETTER OE" #x06C6)
+    ("ARABIC LETTER U" #x06C7)
+    ("ARABIC LETTER YU" #x06C8)
+    ("ARABIC LETTER KIRGHIZ YU" #x06C9)
+    ("ARABIC LETTER WAW WITH TWO DOTS ABOVE" #x06CA)
+    ("ARABIC LETTER VE" #x06CB)
+    ("ARABIC LETTER FARSI YEH" #x06CC)
+    ("ARABIC LETTER YEH WITH TAIL" #x06CD)
+    ("ARABIC LETTER YEH WITH SMALL V" #x06CE)
+    ("ARABIC LETTER WAW WITH DOT ABOVE" #x06CF)
+    ("ARABIC LETTER E" #x06D0)
+    ("ARABIC LETTER YEH WITH THREE DOTS BELOW" #x06D1)
+    ("ARABIC LETTER YEH BARREE" #x06D2)
+    ("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE" #x06D3)
+    ("ARABIC FULL STOP" #x06D4)
+    ("ARABIC LETTER AE" #x06D5)
+    ("ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA" #x06D6)
+    ("ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA" #x06D7)
+    ("ARABIC SMALL HIGH MEEM INITIAL FORM" #x06D8)
+    ("ARABIC SMALL HIGH LAM ALEF" #x06D9)
+    ("ARABIC SMALL HIGH JEEM" #x06DA)
+    ("ARABIC SMALL HIGH THREE DOTS" #x06DB)
+    ("ARABIC SMALL HIGH SEEN" #x06DC)
+    ("ARABIC END OF AYAH" #x06DD)
+    ("ARABIC START OF RUB EL HIZB" #x06DE)
+    ("ARABIC SMALL HIGH ROUNDED ZERO" #x06DF)
+    ("ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO" #x06E0)
+    ("ARABIC SMALL HIGH DOTLESS HEAD OF KHAH" #x06E1)
+    ("ARABIC SMALL HIGH MEEM ISOLATED FORM" #x06E2)
+    ("ARABIC SMALL LOW SEEN" #x06E3)
+    ("ARABIC SMALL HIGH MADDA" #x06E4)
+    ("ARABIC SMALL WAW" #x06E5)
+    ("ARABIC SMALL YEH" #x06E6)
+    ("ARABIC SMALL HIGH YEH" #x06E7)
+    ("ARABIC SMALL HIGH NOON" #x06E8)
+    ("ARABIC PLACE OF SAJDAH" #x06E9)
+    ("ARABIC EMPTY CENTRE LOW STOP" #x06EA)
+    ("ARABIC EMPTY CENTRE HIGH STOP" #x06EB)
+    ("ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE" #x06EC)
+    ("ARABIC SMALL LOW MEEM" #x06ED)
+    ("EXTENDED ARABIC-INDIC DIGIT ZERO" #x06F0)
+    ("EXTENDED ARABIC-INDIC DIGIT ONE" #x06F1)
+    ("EXTENDED ARABIC-INDIC DIGIT TWO" #x06F2)
+    ("EXTENDED ARABIC-INDIC DIGIT THREE" #x06F3)
+    ("EXTENDED ARABIC-INDIC DIGIT FOUR" #x06F4)
+    ("EXTENDED ARABIC-INDIC DIGIT FIVE" #x06F5)
+    ("EXTENDED ARABIC-INDIC DIGIT SIX" #x06F6)
+    ("EXTENDED ARABIC-INDIC DIGIT SEVEN" #x06F7)
+    ("EXTENDED ARABIC-INDIC DIGIT EIGHT" #x06F8)
+    ("EXTENDED ARABIC-INDIC DIGIT NINE" #x06F9)
+    ("ARABIC LETTER SHEEN WITH DOT BELOW" #x06FA)
+    ("ARABIC LETTER DAD WITH DOT BELOW" #x06FB)
+    ("ARABIC LETTER GHAIN WITH DOT BELOW" #x06FC)
+    ("ARABIC SIGN SINDHI AMPERSAND" #x06FD)
+    ("ARABIC SIGN SINDHI POSTPOSITION MEN" #x06FE)
+    ))
+
+;; arch-tag: b20189fa-7cdb-4544-a41c-f4e0477d9e5e
diff --git a/etc/nxml/00700-0074F.el b/etc/nxml/00700-0074F.el
new file mode 100644 (file)
index 0000000..549387a
--- /dev/null
@@ -0,0 +1,75 @@
+(nxml-define-char-name-set 'syriac
+  '(("SYRIAC END OF PARAGRAPH" #x0700)
+    ("SYRIAC SUPRALINEAR FULL STOP" #x0701)
+    ("SYRIAC SUBLINEAR FULL STOP" #x0702)
+    ("SYRIAC SUPRALINEAR COLON" #x0703)
+    ("SYRIAC SUBLINEAR COLON" #x0704)
+    ("SYRIAC HORIZONTAL COLON" #x0705)
+    ("SYRIAC COLON SKEWED LEFT" #x0706)
+    ("SYRIAC COLON SKEWED RIGHT" #x0707)
+    ("SYRIAC SUPRALINEAR COLON SKEWED LEFT" #x0708)
+    ("SYRIAC SUBLINEAR COLON SKEWED RIGHT" #x0709)
+    ("SYRIAC CONTRACTION" #x070A)
+    ("SYRIAC HARKLEAN OBELUS" #x070B)
+    ("SYRIAC HARKLEAN METOBELUS" #x070C)
+    ("SYRIAC HARKLEAN ASTERISCUS" #x070D)
+    ("SYRIAC ABBREVIATION MARK" #x070F)
+    ("SYRIAC LETTER ALAPH" #x0710)
+    ("SYRIAC LETTER SUPERSCRIPT ALAPH" #x0711)
+    ("SYRIAC LETTER BETH" #x0712)
+    ("SYRIAC LETTER GAMAL" #x0713)
+    ("SYRIAC LETTER GAMAL GARSHUNI" #x0714)
+    ("SYRIAC LETTER DALATH" #x0715)
+    ("SYRIAC LETTER DOTLESS DALATH RISH" #x0716)
+    ("SYRIAC LETTER HE" #x0717)
+    ("SYRIAC LETTER WAW" #x0718)
+    ("SYRIAC LETTER ZAIN" #x0719)
+    ("SYRIAC LETTER HETH" #x071A)
+    ("SYRIAC LETTER TETH" #x071B)
+    ("SYRIAC LETTER TETH GARSHUNI" #x071C)
+    ("SYRIAC LETTER YUDH" #x071D)
+    ("SYRIAC LETTER YUDH HE" #x071E)
+    ("SYRIAC LETTER KAPH" #x071F)
+    ("SYRIAC LETTER LAMADH" #x0720)
+    ("SYRIAC LETTER MIM" #x0721)
+    ("SYRIAC LETTER NUN" #x0722)
+    ("SYRIAC LETTER SEMKATH" #x0723)
+    ("SYRIAC LETTER FINAL SEMKATH" #x0724)
+    ("SYRIAC LETTER E" #x0725)
+    ("SYRIAC LETTER PE" #x0726)
+    ("SYRIAC LETTER REVERSED PE" #x0727)
+    ("SYRIAC LETTER SADHE" #x0728)
+    ("SYRIAC LETTER QAPH" #x0729)
+    ("SYRIAC LETTER RISH" #x072A)
+    ("SYRIAC LETTER SHIN" #x072B)
+    ("SYRIAC LETTER TAW" #x072C)
+    ("SYRIAC PTHAHA ABOVE" #x0730)
+    ("SYRIAC PTHAHA BELOW" #x0731)
+    ("SYRIAC PTHAHA DOTTED" #x0732)
+    ("SYRIAC ZQAPHA ABOVE" #x0733)
+    ("SYRIAC ZQAPHA BELOW" #x0734)
+    ("SYRIAC ZQAPHA DOTTED" #x0735)
+    ("SYRIAC RBASA ABOVE" #x0736)
+    ("SYRIAC RBASA BELOW" #x0737)
+    ("SYRIAC DOTTED ZLAMA HORIZONTAL" #x0738)
+    ("SYRIAC DOTTED ZLAMA ANGULAR" #x0739)
+    ("SYRIAC HBASA ABOVE" #x073A)
+    ("SYRIAC HBASA BELOW" #x073B)
+    ("SYRIAC HBASA-ESASA DOTTED" #x073C)
+    ("SYRIAC ESASA ABOVE" #x073D)
+    ("SYRIAC ESASA BELOW" #x073E)
+    ("SYRIAC RWAHA" #x073F)
+    ("SYRIAC FEMININE DOT" #x0740)
+    ("SYRIAC QUSHSHAYA" #x0741)
+    ("SYRIAC RUKKAKHA" #x0742)
+    ("SYRIAC TWO VERTICAL DOTS ABOVE" #x0743)
+    ("SYRIAC TWO VERTICAL DOTS BELOW" #x0744)
+    ("SYRIAC THREE DOTS ABOVE" #x0745)
+    ("SYRIAC THREE DOTS BELOW" #x0746)
+    ("SYRIAC OBLIQUE LINE ABOVE" #x0747)
+    ("SYRIAC OBLIQUE LINE BELOW" #x0748)
+    ("SYRIAC MUSIC" #x0749)
+    ("SYRIAC BARREKH" #x074A)
+    ))
+
+;; arch-tag: c008122a-484e-4253-b18f-eb215dbd1ecf
diff --git a/etc/nxml/00780-007BF.el b/etc/nxml/00780-007BF.el
new file mode 100644 (file)
index 0000000..cda860c
--- /dev/null
@@ -0,0 +1,54 @@
+(nxml-define-char-name-set 'thaana
+  '(("THAANA LETTER HAA" #x0780)
+    ("THAANA LETTER SHAVIYANI" #x0781)
+    ("THAANA LETTER NOONU" #x0782)
+    ("THAANA LETTER RAA" #x0783)
+    ("THAANA LETTER BAA" #x0784)
+    ("THAANA LETTER LHAVIYANI" #x0785)
+    ("THAANA LETTER KAAFU" #x0786)
+    ("THAANA LETTER ALIFU" #x0787)
+    ("THAANA LETTER VAAVU" #x0788)
+    ("THAANA LETTER MEEMU" #x0789)
+    ("THAANA LETTER FAAFU" #x078A)
+    ("THAANA LETTER DHAALU" #x078B)
+    ("THAANA LETTER THAA" #x078C)
+    ("THAANA LETTER LAAMU" #x078D)
+    ("THAANA LETTER GAAFU" #x078E)
+    ("THAANA LETTER GNAVIYANI" #x078F)
+    ("THAANA LETTER SEENU" #x0790)
+    ("THAANA LETTER DAVIYANI" #x0791)
+    ("THAANA LETTER ZAVIYANI" #x0792)
+    ("THAANA LETTER TAVIYANI" #x0793)
+    ("THAANA LETTER YAA" #x0794)
+    ("THAANA LETTER PAVIYANI" #x0795)
+    ("THAANA LETTER JAVIYANI" #x0796)
+    ("THAANA LETTER CHAVIYANI" #x0797)
+    ("THAANA LETTER TTAA" #x0798)
+    ("THAANA LETTER HHAA" #x0799)
+    ("THAANA LETTER KHAA" #x079A)
+    ("THAANA LETTER THAALU" #x079B)
+    ("THAANA LETTER ZAA" #x079C)
+    ("THAANA LETTER SHEENU" #x079D)
+    ("THAANA LETTER SAADHU" #x079E)
+    ("THAANA LETTER DAADHU" #x079F)
+    ("THAANA LETTER TO" #x07A0)
+    ("THAANA LETTER ZO" #x07A1)
+    ("THAANA LETTER AINU" #x07A2)
+    ("THAANA LETTER GHAINU" #x07A3)
+    ("THAANA LETTER QAAFU" #x07A4)
+    ("THAANA LETTER WAAVU" #x07A5)
+    ("THAANA ABAFILI" #x07A6)
+    ("THAANA AABAAFILI" #x07A7)
+    ("THAANA IBIFILI" #x07A8)
+    ("THAANA EEBEEFILI" #x07A9)
+    ("THAANA UBUFILI" #x07AA)
+    ("THAANA OOBOOFILI" #x07AB)
+    ("THAANA EBEFILI" #x07AC)
+    ("THAANA EYBEYFILI" #x07AD)
+    ("THAANA OBOFILI" #x07AE)
+    ("THAANA OABOAFILI" #x07AF)
+    ("THAANA SUKUN" #x07B0)
+    ("THAANA LETTER NAA" #x07B1)
+    ))
+
+;; arch-tag: e1974c30-0604-412a-af3d-b6e688e0586c
diff --git a/etc/nxml/00900-0097F.el b/etc/nxml/00900-0097F.el
new file mode 100644 (file)
index 0000000..49bcde8
--- /dev/null
@@ -0,0 +1,108 @@
+(nxml-define-char-name-set 'devanagari
+  '(("DEVANAGARI SIGN CANDRABINDU" #x0901)
+    ("DEVANAGARI SIGN ANUSVARA" #x0902)
+    ("DEVANAGARI SIGN VISARGA" #x0903)
+    ("DEVANAGARI LETTER A" #x0905)
+    ("DEVANAGARI LETTER AA" #x0906)
+    ("DEVANAGARI LETTER I" #x0907)
+    ("DEVANAGARI LETTER II" #x0908)
+    ("DEVANAGARI LETTER U" #x0909)
+    ("DEVANAGARI LETTER UU" #x090A)
+    ("DEVANAGARI LETTER VOCALIC R" #x090B)
+    ("DEVANAGARI LETTER VOCALIC L" #x090C)
+    ("DEVANAGARI LETTER CANDRA E" #x090D)
+    ("DEVANAGARI LETTER SHORT E" #x090E)
+    ("DEVANAGARI LETTER E" #x090F)
+    ("DEVANAGARI LETTER AI" #x0910)
+    ("DEVANAGARI LETTER CANDRA O" #x0911)
+    ("DEVANAGARI LETTER SHORT O" #x0912)
+    ("DEVANAGARI LETTER O" #x0913)
+    ("DEVANAGARI LETTER AU" #x0914)
+    ("DEVANAGARI LETTER KA" #x0915)
+    ("DEVANAGARI LETTER KHA" #x0916)
+    ("DEVANAGARI LETTER GA" #x0917)
+    ("DEVANAGARI LETTER GHA" #x0918)
+    ("DEVANAGARI LETTER NGA" #x0919)
+    ("DEVANAGARI LETTER CA" #x091A)
+    ("DEVANAGARI LETTER CHA" #x091B)
+    ("DEVANAGARI LETTER JA" #x091C)
+    ("DEVANAGARI LETTER JHA" #x091D)
+    ("DEVANAGARI LETTER NYA" #x091E)
+    ("DEVANAGARI LETTER TTA" #x091F)
+    ("DEVANAGARI LETTER TTHA" #x0920)
+    ("DEVANAGARI LETTER DDA" #x0921)
+    ("DEVANAGARI LETTER DDHA" #x0922)
+    ("DEVANAGARI LETTER NNA" #x0923)
+    ("DEVANAGARI LETTER TA" #x0924)
+    ("DEVANAGARI LETTER THA" #x0925)
+    ("DEVANAGARI LETTER DA" #x0926)
+    ("DEVANAGARI LETTER DHA" #x0927)
+    ("DEVANAGARI LETTER NA" #x0928)
+    ("DEVANAGARI LETTER NNNA" #x0929)
+    ("DEVANAGARI LETTER PA" #x092A)
+    ("DEVANAGARI LETTER PHA" #x092B)
+    ("DEVANAGARI LETTER BA" #x092C)
+    ("DEVANAGARI LETTER BHA" #x092D)
+    ("DEVANAGARI LETTER MA" #x092E)
+    ("DEVANAGARI LETTER YA" #x092F)
+    ("DEVANAGARI LETTER RA" #x0930)
+    ("DEVANAGARI LETTER RRA" #x0931)
+    ("DEVANAGARI LETTER LA" #x0932)
+    ("DEVANAGARI LETTER LLA" #x0933)
+    ("DEVANAGARI LETTER LLLA" #x0934)
+    ("DEVANAGARI LETTER VA" #x0935)
+    ("DEVANAGARI LETTER SHA" #x0936)
+    ("DEVANAGARI LETTER SSA" #x0937)
+    ("DEVANAGARI LETTER SA" #x0938)
+    ("DEVANAGARI LETTER HA" #x0939)
+    ("DEVANAGARI SIGN NUKTA" #x093C)
+    ("DEVANAGARI SIGN AVAGRAHA" #x093D)
+    ("DEVANAGARI VOWEL SIGN AA" #x093E)
+    ("DEVANAGARI VOWEL SIGN I" #x093F)
+    ("DEVANAGARI VOWEL SIGN II" #x0940)
+    ("DEVANAGARI VOWEL SIGN U" #x0941)
+    ("DEVANAGARI VOWEL SIGN UU" #x0942)
+    ("DEVANAGARI VOWEL SIGN VOCALIC R" #x0943)
+    ("DEVANAGARI VOWEL SIGN VOCALIC RR" #x0944)
+    ("DEVANAGARI VOWEL SIGN CANDRA E" #x0945)
+    ("DEVANAGARI VOWEL SIGN SHORT E" #x0946)
+    ("DEVANAGARI VOWEL SIGN E" #x0947)
+    ("DEVANAGARI VOWEL SIGN AI" #x0948)
+    ("DEVANAGARI VOWEL SIGN CANDRA O" #x0949)
+    ("DEVANAGARI VOWEL SIGN SHORT O" #x094A)
+    ("DEVANAGARI VOWEL SIGN O" #x094B)
+    ("DEVANAGARI VOWEL SIGN AU" #x094C)
+    ("DEVANAGARI SIGN VIRAMA" #x094D)
+    ("DEVANAGARI OM" #x0950)
+    ("DEVANAGARI STRESS SIGN UDATTA" #x0951)
+    ("DEVANAGARI STRESS SIGN ANUDATTA" #x0952)
+    ("DEVANAGARI GRAVE ACCENT" #x0953)
+    ("DEVANAGARI ACUTE ACCENT" #x0954)
+    ("DEVANAGARI LETTER QA" #x0958)
+    ("DEVANAGARI LETTER KHHA" #x0959)
+    ("DEVANAGARI LETTER GHHA" #x095A)
+    ("DEVANAGARI LETTER ZA" #x095B)
+    ("DEVANAGARI LETTER DDDHA" #x095C)
+    ("DEVANAGARI LETTER RHA" #x095D)
+    ("DEVANAGARI LETTER FA" #x095E)
+    ("DEVANAGARI LETTER YYA" #x095F)
+    ("DEVANAGARI LETTER VOCALIC RR" #x0960)
+    ("DEVANAGARI LETTER VOCALIC LL" #x0961)
+    ("DEVANAGARI VOWEL SIGN VOCALIC L" #x0962)
+    ("DEVANAGARI VOWEL SIGN VOCALIC LL" #x0963)
+    ("DEVANAGARI DANDA" #x0964)
+    ("DEVANAGARI DOUBLE DANDA" #x0965)
+    ("DEVANAGARI DIGIT ZERO" #x0966)
+    ("DEVANAGARI DIGIT ONE" #x0967)
+    ("DEVANAGARI DIGIT TWO" #x0968)
+    ("DEVANAGARI DIGIT THREE" #x0969)
+    ("DEVANAGARI DIGIT FOUR" #x096A)
+    ("DEVANAGARI DIGIT FIVE" #x096B)
+    ("DEVANAGARI DIGIT SIX" #x096C)
+    ("DEVANAGARI DIGIT SEVEN" #x096D)
+    ("DEVANAGARI DIGIT EIGHT" #x096E)
+    ("DEVANAGARI DIGIT NINE" #x096F)
+    ("DEVANAGARI ABBREVIATION SIGN" #x0970)
+    ))
+
+;; arch-tag: c9d655c5-2ec9-4b64-a13f-d4fafe0cbad7
diff --git a/etc/nxml/00980-009FF.el b/etc/nxml/00980-009FF.el
new file mode 100644 (file)
index 0000000..6c6b01e
--- /dev/null
@@ -0,0 +1,93 @@
+(nxml-define-char-name-set 'bengali
+  '(("BENGALI SIGN CANDRABINDU" #x0981)
+    ("BENGALI SIGN ANUSVARA" #x0982)
+    ("BENGALI SIGN VISARGA" #x0983)
+    ("BENGALI LETTER A" #x0985)
+    ("BENGALI LETTER AA" #x0986)
+    ("BENGALI LETTER I" #x0987)
+    ("BENGALI LETTER II" #x0988)
+    ("BENGALI LETTER U" #x0989)
+    ("BENGALI LETTER UU" #x098A)
+    ("BENGALI LETTER VOCALIC R" #x098B)
+    ("BENGALI LETTER VOCALIC L" #x098C)
+    ("BENGALI LETTER E" #x098F)
+    ("BENGALI LETTER AI" #x0990)
+    ("BENGALI LETTER O" #x0993)
+    ("BENGALI LETTER AU" #x0994)
+    ("BENGALI LETTER KA" #x0995)
+    ("BENGALI LETTER KHA" #x0996)
+    ("BENGALI LETTER GA" #x0997)
+    ("BENGALI LETTER GHA" #x0998)
+    ("BENGALI LETTER NGA" #x0999)
+    ("BENGALI LETTER CA" #x099A)
+    ("BENGALI LETTER CHA" #x099B)
+    ("BENGALI LETTER JA" #x099C)
+    ("BENGALI LETTER JHA" #x099D)
+    ("BENGALI LETTER NYA" #x099E)
+    ("BENGALI LETTER TTA" #x099F)
+    ("BENGALI LETTER TTHA" #x09A0)
+    ("BENGALI LETTER DDA" #x09A1)
+    ("BENGALI LETTER DDHA" #x09A2)
+    ("BENGALI LETTER NNA" #x09A3)
+    ("BENGALI LETTER TA" #x09A4)
+    ("BENGALI LETTER THA" #x09A5)
+    ("BENGALI LETTER DA" #x09A6)
+    ("BENGALI LETTER DHA" #x09A7)
+    ("BENGALI LETTER NA" #x09A8)
+    ("BENGALI LETTER PA" #x09AA)
+    ("BENGALI LETTER PHA" #x09AB)
+    ("BENGALI LETTER BA" #x09AC)
+    ("BENGALI LETTER BHA" #x09AD)
+    ("BENGALI LETTER MA" #x09AE)
+    ("BENGALI LETTER YA" #x09AF)
+    ("BENGALI LETTER RA" #x09B0)
+    ("BENGALI LETTER LA" #x09B2)
+    ("BENGALI LETTER SHA" #x09B6)
+    ("BENGALI LETTER SSA" #x09B7)
+    ("BENGALI LETTER SA" #x09B8)
+    ("BENGALI LETTER HA" #x09B9)
+    ("BENGALI SIGN NUKTA" #x09BC)
+    ("BENGALI VOWEL SIGN AA" #x09BE)
+    ("BENGALI VOWEL SIGN I" #x09BF)
+    ("BENGALI VOWEL SIGN II" #x09C0)
+    ("BENGALI VOWEL SIGN U" #x09C1)
+    ("BENGALI VOWEL SIGN UU" #x09C2)
+    ("BENGALI VOWEL SIGN VOCALIC R" #x09C3)
+    ("BENGALI VOWEL SIGN VOCALIC RR" #x09C4)
+    ("BENGALI VOWEL SIGN E" #x09C7)
+    ("BENGALI VOWEL SIGN AI" #x09C8)
+    ("BENGALI VOWEL SIGN O" #x09CB)
+    ("BENGALI VOWEL SIGN AU" #x09CC)
+    ("BENGALI SIGN VIRAMA" #x09CD)
+    ("BENGALI AU LENGTH MARK" #x09D7)
+    ("BENGALI LETTER RRA" #x09DC)
+    ("BENGALI LETTER RHA" #x09DD)
+    ("BENGALI LETTER YYA" #x09DF)
+    ("BENGALI LETTER VOCALIC RR" #x09E0)
+    ("BENGALI LETTER VOCALIC LL" #x09E1)
+    ("BENGALI VOWEL SIGN VOCALIC L" #x09E2)
+    ("BENGALI VOWEL SIGN VOCALIC LL" #x09E3)
+    ("BENGALI DIGIT ZERO" #x09E6)
+    ("BENGALI DIGIT ONE" #x09E7)
+    ("BENGALI DIGIT TWO" #x09E8)
+    ("BENGALI DIGIT THREE" #x09E9)
+    ("BENGALI DIGIT FOUR" #x09EA)
+    ("BENGALI DIGIT FIVE" #x09EB)
+    ("BENGALI DIGIT SIX" #x09EC)
+    ("BENGALI DIGIT SEVEN" #x09ED)
+    ("BENGALI DIGIT EIGHT" #x09EE)
+    ("BENGALI DIGIT NINE" #x09EF)
+    ("BENGALI LETTER RA WITH MIDDLE DIAGONAL" #x09F0)
+    ("BENGALI LETTER RA WITH LOWER DIAGONAL" #x09F1)
+    ("BENGALI RUPEE MARK" #x09F2)
+    ("BENGALI RUPEE SIGN" #x09F3)
+    ("BENGALI CURRENCY NUMERATOR ONE" #x09F4)
+    ("BENGALI CURRENCY NUMERATOR TWO" #x09F5)
+    ("BENGALI CURRENCY NUMERATOR THREE" #x09F6)
+    ("BENGALI CURRENCY NUMERATOR FOUR" #x09F7)
+    ("BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR" #x09F8)
+    ("BENGALI CURRENCY DENOMINATOR SIXTEEN" #x09F9)
+    ("BENGALI ISSHAR" #x09FA)
+    ))
+
+;; arch-tag: 66599f15-c2b7-436a-9737-577d4f041abd
diff --git a/etc/nxml/00A00-00A7F.el b/etc/nxml/00A00-00A7F.el
new file mode 100644 (file)
index 0000000..98f221a
--- /dev/null
@@ -0,0 +1,79 @@
+(nxml-define-char-name-set 'gurmukhi
+  '(("GURMUKHI SIGN BINDI" #x0A02)
+    ("GURMUKHI LETTER A" #x0A05)
+    ("GURMUKHI LETTER AA" #x0A06)
+    ("GURMUKHI LETTER I" #x0A07)
+    ("GURMUKHI LETTER II" #x0A08)
+    ("GURMUKHI LETTER U" #x0A09)
+    ("GURMUKHI LETTER UU" #x0A0A)
+    ("GURMUKHI LETTER EE" #x0A0F)
+    ("GURMUKHI LETTER AI" #x0A10)
+    ("GURMUKHI LETTER OO" #x0A13)
+    ("GURMUKHI LETTER AU" #x0A14)
+    ("GURMUKHI LETTER KA" #x0A15)
+    ("GURMUKHI LETTER KHA" #x0A16)
+    ("GURMUKHI LETTER GA" #x0A17)
+    ("GURMUKHI LETTER GHA" #x0A18)
+    ("GURMUKHI LETTER NGA" #x0A19)
+    ("GURMUKHI LETTER CA" #x0A1A)
+    ("GURMUKHI LETTER CHA" #x0A1B)
+    ("GURMUKHI LETTER JA" #x0A1C)
+    ("GURMUKHI LETTER JHA" #x0A1D)
+    ("GURMUKHI LETTER NYA" #x0A1E)
+    ("GURMUKHI LETTER TTA" #x0A1F)
+    ("GURMUKHI LETTER TTHA" #x0A20)
+    ("GURMUKHI LETTER DDA" #x0A21)
+    ("GURMUKHI LETTER DDHA" #x0A22)
+    ("GURMUKHI LETTER NNA" #x0A23)
+    ("GURMUKHI LETTER TA" #x0A24)
+    ("GURMUKHI LETTER THA" #x0A25)
+    ("GURMUKHI LETTER DA" #x0A26)
+    ("GURMUKHI LETTER DHA" #x0A27)
+    ("GURMUKHI LETTER NA" #x0A28)
+    ("GURMUKHI LETTER PA" #x0A2A)
+    ("GURMUKHI LETTER PHA" #x0A2B)
+    ("GURMUKHI LETTER BA" #x0A2C)
+    ("GURMUKHI LETTER BHA" #x0A2D)
+    ("GURMUKHI LETTER MA" #x0A2E)
+    ("GURMUKHI LETTER YA" #x0A2F)
+    ("GURMUKHI LETTER RA" #x0A30)
+    ("GURMUKHI LETTER LA" #x0A32)
+    ("GURMUKHI LETTER LLA" #x0A33)
+    ("GURMUKHI LETTER VA" #x0A35)
+    ("GURMUKHI LETTER SHA" #x0A36)
+    ("GURMUKHI LETTER SA" #x0A38)
+    ("GURMUKHI LETTER HA" #x0A39)
+    ("GURMUKHI SIGN NUKTA" #x0A3C)
+    ("GURMUKHI VOWEL SIGN AA" #x0A3E)
+    ("GURMUKHI VOWEL SIGN I" #x0A3F)
+    ("GURMUKHI VOWEL SIGN II" #x0A40)
+    ("GURMUKHI VOWEL SIGN U" #x0A41)
+    ("GURMUKHI VOWEL SIGN UU" #x0A42)
+    ("GURMUKHI VOWEL SIGN EE" #x0A47)
+    ("GURMUKHI VOWEL SIGN AI" #x0A48)
+    ("GURMUKHI VOWEL SIGN OO" #x0A4B)
+    ("GURMUKHI VOWEL SIGN AU" #x0A4C)
+    ("GURMUKHI SIGN VIRAMA" #x0A4D)
+    ("GURMUKHI LETTER KHHA" #x0A59)
+    ("GURMUKHI LETTER GHHA" #x0A5A)
+    ("GURMUKHI LETTER ZA" #x0A5B)
+    ("GURMUKHI LETTER RRA" #x0A5C)
+    ("GURMUKHI LETTER FA" #x0A5E)
+    ("GURMUKHI DIGIT ZERO" #x0A66)
+    ("GURMUKHI DIGIT ONE" #x0A67)
+    ("GURMUKHI DIGIT TWO" #x0A68)
+    ("GURMUKHI DIGIT THREE" #x0A69)
+    ("GURMUKHI DIGIT FOUR" #x0A6A)
+    ("GURMUKHI DIGIT FIVE" #x0A6B)
+    ("GURMUKHI DIGIT SIX" #x0A6C)
+    ("GURMUKHI DIGIT SEVEN" #x0A6D)
+    ("GURMUKHI DIGIT EIGHT" #x0A6E)
+    ("GURMUKHI DIGIT NINE" #x0A6F)
+    ("GURMUKHI TIPPI" #x0A70)
+    ("GURMUKHI ADDAK" #x0A71)
+    ("GURMUKHI IRI" #x0A72)
+    ("GURMUKHI URA" #x0A73)
+    ("GURMUKHI EK ONKAR" #x0A74)
+    ))
+
+;; arch-tag: e97fe67c-79ac-48f8-8274-22436eec2f01
diff --git a/etc/nxml/00A80-00AFF.el b/etc/nxml/00A80-00AFF.el
new file mode 100644 (file)
index 0000000..3bbd427
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'gujarati
+  '(("GUJARATI SIGN CANDRABINDU" #x0A81)
+    ("GUJARATI SIGN ANUSVARA" #x0A82)
+    ("GUJARATI SIGN VISARGA" #x0A83)
+    ("GUJARATI LETTER A" #x0A85)
+    ("GUJARATI LETTER AA" #x0A86)
+    ("GUJARATI LETTER I" #x0A87)
+    ("GUJARATI LETTER II" #x0A88)
+    ("GUJARATI LETTER U" #x0A89)
+    ("GUJARATI LETTER UU" #x0A8A)
+    ("GUJARATI LETTER VOCALIC R" #x0A8B)
+    ("GUJARATI VOWEL CANDRA E" #x0A8D)
+    ("GUJARATI LETTER E" #x0A8F)
+    ("GUJARATI LETTER AI" #x0A90)
+    ("GUJARATI VOWEL CANDRA O" #x0A91)
+    ("GUJARATI LETTER O" #x0A93)
+    ("GUJARATI LETTER AU" #x0A94)
+    ("GUJARATI LETTER KA" #x0A95)
+    ("GUJARATI LETTER KHA" #x0A96)
+    ("GUJARATI LETTER GA" #x0A97)
+    ("GUJARATI LETTER GHA" #x0A98)
+    ("GUJARATI LETTER NGA" #x0A99)
+    ("GUJARATI LETTER CA" #x0A9A)
+    ("GUJARATI LETTER CHA" #x0A9B)
+    ("GUJARATI LETTER JA" #x0A9C)
+    ("GUJARATI LETTER JHA" #x0A9D)
+    ("GUJARATI LETTER NYA" #x0A9E)
+    ("GUJARATI LETTER TTA" #x0A9F)
+    ("GUJARATI LETTER TTHA" #x0AA0)
+    ("GUJARATI LETTER DDA" #x0AA1)
+    ("GUJARATI LETTER DDHA" #x0AA2)
+    ("GUJARATI LETTER NNA" #x0AA3)
+    ("GUJARATI LETTER TA" #x0AA4)
+    ("GUJARATI LETTER THA" #x0AA5)
+    ("GUJARATI LETTER DA" #x0AA6)
+    ("GUJARATI LETTER DHA" #x0AA7)
+    ("GUJARATI LETTER NA" #x0AA8)
+    ("GUJARATI LETTER PA" #x0AAA)
+    ("GUJARATI LETTER PHA" #x0AAB)
+    ("GUJARATI LETTER BA" #x0AAC)
+    ("GUJARATI LETTER BHA" #x0AAD)
+    ("GUJARATI LETTER MA" #x0AAE)
+    ("GUJARATI LETTER YA" #x0AAF)
+    ("GUJARATI LETTER RA" #x0AB0)
+    ("GUJARATI LETTER LA" #x0AB2)
+    ("GUJARATI LETTER LLA" #x0AB3)
+    ("GUJARATI LETTER VA" #x0AB5)
+    ("GUJARATI LETTER SHA" #x0AB6)
+    ("GUJARATI LETTER SSA" #x0AB7)
+    ("GUJARATI LETTER SA" #x0AB8)
+    ("GUJARATI LETTER HA" #x0AB9)
+    ("GUJARATI SIGN NUKTA" #x0ABC)
+    ("GUJARATI SIGN AVAGRAHA" #x0ABD)
+    ("GUJARATI VOWEL SIGN AA" #x0ABE)
+    ("GUJARATI VOWEL SIGN I" #x0ABF)
+    ("GUJARATI VOWEL SIGN II" #x0AC0)
+    ("GUJARATI VOWEL SIGN U" #x0AC1)
+    ("GUJARATI VOWEL SIGN UU" #x0AC2)
+    ("GUJARATI VOWEL SIGN VOCALIC R" #x0AC3)
+    ("GUJARATI VOWEL SIGN VOCALIC RR" #x0AC4)
+    ("GUJARATI VOWEL SIGN CANDRA E" #x0AC5)
+    ("GUJARATI VOWEL SIGN E" #x0AC7)
+    ("GUJARATI VOWEL SIGN AI" #x0AC8)
+    ("GUJARATI VOWEL SIGN CANDRA O" #x0AC9)
+    ("GUJARATI VOWEL SIGN O" #x0ACB)
+    ("GUJARATI VOWEL SIGN AU" #x0ACC)
+    ("GUJARATI SIGN VIRAMA" #x0ACD)
+    ("GUJARATI OM" #x0AD0)
+    ("GUJARATI LETTER VOCALIC RR" #x0AE0)
+    ("GUJARATI DIGIT ZERO" #x0AE6)
+    ("GUJARATI DIGIT ONE" #x0AE7)
+    ("GUJARATI DIGIT TWO" #x0AE8)
+    ("GUJARATI DIGIT THREE" #x0AE9)
+    ("GUJARATI DIGIT FOUR" #x0AEA)
+    ("GUJARATI DIGIT FIVE" #x0AEB)
+    ("GUJARATI DIGIT SIX" #x0AEC)
+    ("GUJARATI DIGIT SEVEN" #x0AED)
+    ("GUJARATI DIGIT EIGHT" #x0AEE)
+    ("GUJARATI DIGIT NINE" #x0AEF)
+    ))
+
+;; arch-tag: e11e63c9-1fd7-496b-be1b-4c2bb32bdec4
diff --git a/etc/nxml/00B00-00B7F.el b/etc/nxml/00B00-00B7F.el
new file mode 100644 (file)
index 0000000..033d73b
--- /dev/null
@@ -0,0 +1,83 @@
+(nxml-define-char-name-set 'oriya
+  '(("ORIYA SIGN CANDRABINDU" #x0B01)
+    ("ORIYA SIGN ANUSVARA" #x0B02)
+    ("ORIYA SIGN VISARGA" #x0B03)
+    ("ORIYA LETTER A" #x0B05)
+    ("ORIYA LETTER AA" #x0B06)
+    ("ORIYA LETTER I" #x0B07)
+    ("ORIYA LETTER II" #x0B08)
+    ("ORIYA LETTER U" #x0B09)
+    ("ORIYA LETTER UU" #x0B0A)
+    ("ORIYA LETTER VOCALIC R" #x0B0B)
+    ("ORIYA LETTER VOCALIC L" #x0B0C)
+    ("ORIYA LETTER E" #x0B0F)
+    ("ORIYA LETTER AI" #x0B10)
+    ("ORIYA LETTER O" #x0B13)
+    ("ORIYA LETTER AU" #x0B14)
+    ("ORIYA LETTER KA" #x0B15)
+    ("ORIYA LETTER KHA" #x0B16)
+    ("ORIYA LETTER GA" #x0B17)
+    ("ORIYA LETTER GHA" #x0B18)
+    ("ORIYA LETTER NGA" #x0B19)
+    ("ORIYA LETTER CA" #x0B1A)
+    ("ORIYA LETTER CHA" #x0B1B)
+    ("ORIYA LETTER JA" #x0B1C)
+    ("ORIYA LETTER JHA" #x0B1D)
+    ("ORIYA LETTER NYA" #x0B1E)
+    ("ORIYA LETTER TTA" #x0B1F)
+    ("ORIYA LETTER TTHA" #x0B20)
+    ("ORIYA LETTER DDA" #x0B21)
+    ("ORIYA LETTER DDHA" #x0B22)
+    ("ORIYA LETTER NNA" #x0B23)
+    ("ORIYA LETTER TA" #x0B24)
+    ("ORIYA LETTER THA" #x0B25)
+    ("ORIYA LETTER DA" #x0B26)
+    ("ORIYA LETTER DHA" #x0B27)
+    ("ORIYA LETTER NA" #x0B28)
+    ("ORIYA LETTER PA" #x0B2A)
+    ("ORIYA LETTER PHA" #x0B2B)
+    ("ORIYA LETTER BA" #x0B2C)
+    ("ORIYA LETTER BHA" #x0B2D)
+    ("ORIYA LETTER MA" #x0B2E)
+    ("ORIYA LETTER YA" #x0B2F)
+    ("ORIYA LETTER RA" #x0B30)
+    ("ORIYA LETTER LA" #x0B32)
+    ("ORIYA LETTER LLA" #x0B33)
+    ("ORIYA LETTER SHA" #x0B36)
+    ("ORIYA LETTER SSA" #x0B37)
+    ("ORIYA LETTER SA" #x0B38)
+    ("ORIYA LETTER HA" #x0B39)
+    ("ORIYA SIGN NUKTA" #x0B3C)
+    ("ORIYA SIGN AVAGRAHA" #x0B3D)
+    ("ORIYA VOWEL SIGN AA" #x0B3E)
+    ("ORIYA VOWEL SIGN I" #x0B3F)
+    ("ORIYA VOWEL SIGN II" #x0B40)
+    ("ORIYA VOWEL SIGN U" #x0B41)
+    ("ORIYA VOWEL SIGN UU" #x0B42)
+    ("ORIYA VOWEL SIGN VOCALIC R" #x0B43)
+    ("ORIYA VOWEL SIGN E" #x0B47)
+    ("ORIYA VOWEL SIGN AI" #x0B48)
+    ("ORIYA VOWEL SIGN O" #x0B4B)
+    ("ORIYA VOWEL SIGN AU" #x0B4C)
+    ("ORIYA SIGN VIRAMA" #x0B4D)
+    ("ORIYA AI LENGTH MARK" #x0B56)
+    ("ORIYA AU LENGTH MARK" #x0B57)
+    ("ORIYA LETTER RRA" #x0B5C)
+    ("ORIYA LETTER RHA" #x0B5D)
+    ("ORIYA LETTER YYA" #x0B5F)
+    ("ORIYA LETTER VOCALIC RR" #x0B60)
+    ("ORIYA LETTER VOCALIC LL" #x0B61)
+    ("ORIYA DIGIT ZERO" #x0B66)
+    ("ORIYA DIGIT ONE" #x0B67)
+    ("ORIYA DIGIT TWO" #x0B68)
+    ("ORIYA DIGIT THREE" #x0B69)
+    ("ORIYA DIGIT FOUR" #x0B6A)
+    ("ORIYA DIGIT FIVE" #x0B6B)
+    ("ORIYA DIGIT SIX" #x0B6C)
+    ("ORIYA DIGIT SEVEN" #x0B6D)
+    ("ORIYA DIGIT EIGHT" #x0B6E)
+    ("ORIYA DIGIT NINE" #x0B6F)
+    ("ORIYA ISSHAR" #x0B70)
+    ))
+
+;; arch-tag: 3a780627-f875-450a-b482-6b25f28c6f96
diff --git a/etc/nxml/00B80-00BFF.el b/etc/nxml/00B80-00BFF.el
new file mode 100644 (file)
index 0000000..ab5a34b
--- /dev/null
@@ -0,0 +1,65 @@
+(nxml-define-char-name-set 'tamil
+  '(("TAMIL SIGN ANUSVARA" #x0B82)
+    ("TAMIL SIGN VISARGA" #x0B83)
+    ("TAMIL LETTER A" #x0B85)
+    ("TAMIL LETTER AA" #x0B86)
+    ("TAMIL LETTER I" #x0B87)
+    ("TAMIL LETTER II" #x0B88)
+    ("TAMIL LETTER U" #x0B89)
+    ("TAMIL LETTER UU" #x0B8A)
+    ("TAMIL LETTER E" #x0B8E)
+    ("TAMIL LETTER EE" #x0B8F)
+    ("TAMIL LETTER AI" #x0B90)
+    ("TAMIL LETTER O" #x0B92)
+    ("TAMIL LETTER OO" #x0B93)
+    ("TAMIL LETTER AU" #x0B94)
+    ("TAMIL LETTER KA" #x0B95)
+    ("TAMIL LETTER NGA" #x0B99)
+    ("TAMIL LETTER CA" #x0B9A)
+    ("TAMIL LETTER JA" #x0B9C)
+    ("TAMIL LETTER NYA" #x0B9E)
+    ("TAMIL LETTER TTA" #x0B9F)
+    ("TAMIL LETTER NNA" #x0BA3)
+    ("TAMIL LETTER TA" #x0BA4)
+    ("TAMIL LETTER NA" #x0BA8)
+    ("TAMIL LETTER NNNA" #x0BA9)
+    ("TAMIL LETTER PA" #x0BAA)
+    ("TAMIL LETTER MA" #x0BAE)
+    ("TAMIL LETTER YA" #x0BAF)
+    ("TAMIL LETTER RA" #x0BB0)
+    ("TAMIL LETTER RRA" #x0BB1)
+    ("TAMIL LETTER LA" #x0BB2)
+    ("TAMIL LETTER LLA" #x0BB3)
+    ("TAMIL LETTER LLLA" #x0BB4)
+    ("TAMIL LETTER VA" #x0BB5)
+    ("TAMIL LETTER SSA" #x0BB7)
+    ("TAMIL LETTER SA" #x0BB8)
+    ("TAMIL LETTER HA" #x0BB9)
+    ("TAMIL VOWEL SIGN AA" #x0BBE)
+    ("TAMIL VOWEL SIGN I" #x0BBF)
+    ("TAMIL VOWEL SIGN II" #x0BC0)
+    ("TAMIL VOWEL SIGN U" #x0BC1)
+    ("TAMIL VOWEL SIGN UU" #x0BC2)
+    ("TAMIL VOWEL SIGN E" #x0BC6)
+    ("TAMIL VOWEL SIGN EE" #x0BC7)
+    ("TAMIL VOWEL SIGN AI" #x0BC8)
+    ("TAMIL VOWEL SIGN O" #x0BCA)
+    ("TAMIL VOWEL SIGN OO" #x0BCB)
+    ("TAMIL VOWEL SIGN AU" #x0BCC)
+    ("TAMIL SIGN VIRAMA" #x0BCD)
+    ("TAMIL AU LENGTH MARK" #x0BD7)
+    ("TAMIL DIGIT ONE" #x0BE7)
+    ("TAMIL DIGIT TWO" #x0BE8)
+    ("TAMIL DIGIT THREE" #x0BE9)
+    ("TAMIL DIGIT FOUR" #x0BEA)
+    ("TAMIL DIGIT FIVE" #x0BEB)
+    ("TAMIL DIGIT SIX" #x0BEC)
+    ("TAMIL DIGIT SEVEN" #x0BED)
+    ("TAMIL DIGIT EIGHT" #x0BEE)
+    ("TAMIL DIGIT NINE" #x0BEF)
+    ("TAMIL NUMBER TEN" #x0BF0)
+    ("TAMIL NUMBER ONE HUNDRED" #x0BF1)
+    ("TAMIL NUMBER ONE THOUSAND" #x0BF2)
+    ))
+
+;; arch-tag: a299bfdc-4543-4405-a4a8-202d178a578f
diff --git a/etc/nxml/00C00-00C7F.el b/etc/nxml/00C00-00C7F.el
new file mode 100644 (file)
index 0000000..8ccda98
--- /dev/null
@@ -0,0 +1,84 @@
+(nxml-define-char-name-set 'telugu
+  '(("TELUGU SIGN CANDRABINDU" #x0C01)
+    ("TELUGU SIGN ANUSVARA" #x0C02)
+    ("TELUGU SIGN VISARGA" #x0C03)
+    ("TELUGU LETTER A" #x0C05)
+    ("TELUGU LETTER AA" #x0C06)
+    ("TELUGU LETTER I" #x0C07)
+    ("TELUGU LETTER II" #x0C08)
+    ("TELUGU LETTER U" #x0C09)
+    ("TELUGU LETTER UU" #x0C0A)
+    ("TELUGU LETTER VOCALIC R" #x0C0B)
+    ("TELUGU LETTER VOCALIC L" #x0C0C)
+    ("TELUGU LETTER E" #x0C0E)
+    ("TELUGU LETTER EE" #x0C0F)
+    ("TELUGU LETTER AI" #x0C10)
+    ("TELUGU LETTER O" #x0C12)
+    ("TELUGU LETTER OO" #x0C13)
+    ("TELUGU LETTER AU" #x0C14)
+    ("TELUGU LETTER KA" #x0C15)
+    ("TELUGU LETTER KHA" #x0C16)
+    ("TELUGU LETTER GA" #x0C17)
+    ("TELUGU LETTER GHA" #x0C18)
+    ("TELUGU LETTER NGA" #x0C19)
+    ("TELUGU LETTER CA" #x0C1A)
+    ("TELUGU LETTER CHA" #x0C1B)
+    ("TELUGU LETTER JA" #x0C1C)
+    ("TELUGU LETTER JHA" #x0C1D)
+    ("TELUGU LETTER NYA" #x0C1E)
+    ("TELUGU LETTER TTA" #x0C1F)
+    ("TELUGU LETTER TTHA" #x0C20)
+    ("TELUGU LETTER DDA" #x0C21)
+    ("TELUGU LETTER DDHA" #x0C22)
+    ("TELUGU LETTER NNA" #x0C23)
+    ("TELUGU LETTER TA" #x0C24)
+    ("TELUGU LETTER THA" #x0C25)
+    ("TELUGU LETTER DA" #x0C26)
+    ("TELUGU LETTER DHA" #x0C27)
+    ("TELUGU LETTER NA" #x0C28)
+    ("TELUGU LETTER PA" #x0C2A)
+    ("TELUGU LETTER PHA" #x0C2B)
+    ("TELUGU LETTER BA" #x0C2C)
+    ("TELUGU LETTER BHA" #x0C2D)
+    ("TELUGU LETTER MA" #x0C2E)
+    ("TELUGU LETTER YA" #x0C2F)
+    ("TELUGU LETTER RA" #x0C30)
+    ("TELUGU LETTER RRA" #x0C31)
+    ("TELUGU LETTER LA" #x0C32)
+    ("TELUGU LETTER LLA" #x0C33)
+    ("TELUGU LETTER VA" #x0C35)
+    ("TELUGU LETTER SHA" #x0C36)
+    ("TELUGU LETTER SSA" #x0C37)
+    ("TELUGU LETTER SA" #x0C38)
+    ("TELUGU LETTER HA" #x0C39)
+    ("TELUGU VOWEL SIGN AA" #x0C3E)
+    ("TELUGU VOWEL SIGN I" #x0C3F)
+    ("TELUGU VOWEL SIGN II" #x0C40)
+    ("TELUGU VOWEL SIGN U" #x0C41)
+    ("TELUGU VOWEL SIGN UU" #x0C42)
+    ("TELUGU VOWEL SIGN VOCALIC R" #x0C43)
+    ("TELUGU VOWEL SIGN VOCALIC RR" #x0C44)
+    ("TELUGU VOWEL SIGN E" #x0C46)
+    ("TELUGU VOWEL SIGN EE" #x0C47)
+    ("TELUGU VOWEL SIGN AI" #x0C48)
+    ("TELUGU VOWEL SIGN O" #x0C4A)
+    ("TELUGU VOWEL SIGN OO" #x0C4B)
+    ("TELUGU VOWEL SIGN AU" #x0C4C)
+    ("TELUGU SIGN VIRAMA" #x0C4D)
+    ("TELUGU LENGTH MARK" #x0C55)
+    ("TELUGU AI LENGTH MARK" #x0C56)
+    ("TELUGU LETTER VOCALIC RR" #x0C60)
+    ("TELUGU LETTER VOCALIC LL" #x0C61)
+    ("TELUGU DIGIT ZERO" #x0C66)
+    ("TELUGU DIGIT ONE" #x0C67)
+    ("TELUGU DIGIT TWO" #x0C68)
+    ("TELUGU DIGIT THREE" #x0C69)
+    ("TELUGU DIGIT FOUR" #x0C6A)
+    ("TELUGU DIGIT FIVE" #x0C6B)
+    ("TELUGU DIGIT SIX" #x0C6C)
+    ("TELUGU DIGIT SEVEN" #x0C6D)
+    ("TELUGU DIGIT EIGHT" #x0C6E)
+    ("TELUGU DIGIT NINE" #x0C6F)
+    ))
+
+;; arch-tag: 12e2c9a2-fa3a-400a-9adb-82a89e0a639b
diff --git a/etc/nxml/00C80-00CFF.el b/etc/nxml/00C80-00CFF.el
new file mode 100644 (file)
index 0000000..d5251fa
--- /dev/null
@@ -0,0 +1,84 @@
+(nxml-define-char-name-set 'kannada
+  '(("KANNADA SIGN ANUSVARA" #x0C82)
+    ("KANNADA SIGN VISARGA" #x0C83)
+    ("KANNADA LETTER A" #x0C85)
+    ("KANNADA LETTER AA" #x0C86)
+    ("KANNADA LETTER I" #x0C87)
+    ("KANNADA LETTER II" #x0C88)
+    ("KANNADA LETTER U" #x0C89)
+    ("KANNADA LETTER UU" #x0C8A)
+    ("KANNADA LETTER VOCALIC R" #x0C8B)
+    ("KANNADA LETTER VOCALIC L" #x0C8C)
+    ("KANNADA LETTER E" #x0C8E)
+    ("KANNADA LETTER EE" #x0C8F)
+    ("KANNADA LETTER AI" #x0C90)
+    ("KANNADA LETTER O" #x0C92)
+    ("KANNADA LETTER OO" #x0C93)
+    ("KANNADA LETTER AU" #x0C94)
+    ("KANNADA LETTER KA" #x0C95)
+    ("KANNADA LETTER KHA" #x0C96)
+    ("KANNADA LETTER GA" #x0C97)
+    ("KANNADA LETTER GHA" #x0C98)
+    ("KANNADA LETTER NGA" #x0C99)
+    ("KANNADA LETTER CA" #x0C9A)
+    ("KANNADA LETTER CHA" #x0C9B)
+    ("KANNADA LETTER JA" #x0C9C)
+    ("KANNADA LETTER JHA" #x0C9D)
+    ("KANNADA LETTER NYA" #x0C9E)
+    ("KANNADA LETTER TTA" #x0C9F)
+    ("KANNADA LETTER TTHA" #x0CA0)
+    ("KANNADA LETTER DDA" #x0CA1)
+    ("KANNADA LETTER DDHA" #x0CA2)
+    ("KANNADA LETTER NNA" #x0CA3)
+    ("KANNADA LETTER TA" #x0CA4)
+    ("KANNADA LETTER THA" #x0CA5)
+    ("KANNADA LETTER DA" #x0CA6)
+    ("KANNADA LETTER DHA" #x0CA7)
+    ("KANNADA LETTER NA" #x0CA8)
+    ("KANNADA LETTER PA" #x0CAA)
+    ("KANNADA LETTER PHA" #x0CAB)
+    ("KANNADA LETTER BA" #x0CAC)
+    ("KANNADA LETTER BHA" #x0CAD)
+    ("KANNADA LETTER MA" #x0CAE)
+    ("KANNADA LETTER YA" #x0CAF)
+    ("KANNADA LETTER RA" #x0CB0)
+    ("KANNADA LETTER RRA" #x0CB1)
+    ("KANNADA LETTER LA" #x0CB2)
+    ("KANNADA LETTER LLA" #x0CB3)
+    ("KANNADA LETTER VA" #x0CB5)
+    ("KANNADA LETTER SHA" #x0CB6)
+    ("KANNADA LETTER SSA" #x0CB7)
+    ("KANNADA LETTER SA" #x0CB8)
+    ("KANNADA LETTER HA" #x0CB9)
+    ("KANNADA VOWEL SIGN AA" #x0CBE)
+    ("KANNADA VOWEL SIGN I" #x0CBF)
+    ("KANNADA VOWEL SIGN II" #x0CC0)
+    ("KANNADA VOWEL SIGN U" #x0CC1)
+    ("KANNADA VOWEL SIGN UU" #x0CC2)
+    ("KANNADA VOWEL SIGN VOCALIC R" #x0CC3)
+    ("KANNADA VOWEL SIGN VOCALIC RR" #x0CC4)
+    ("KANNADA VOWEL SIGN E" #x0CC6)
+    ("KANNADA VOWEL SIGN EE" #x0CC7)
+    ("KANNADA VOWEL SIGN AI" #x0CC8)
+    ("KANNADA VOWEL SIGN O" #x0CCA)
+    ("KANNADA VOWEL SIGN OO" #x0CCB)
+    ("KANNADA VOWEL SIGN AU" #x0CCC)
+    ("KANNADA SIGN VIRAMA" #x0CCD)
+    ("KANNADA LENGTH MARK" #x0CD5)
+    ("KANNADA AI LENGTH MARK" #x0CD6)
+    ("KANNADA LETTER FA" #x0CDE)
+    ("KANNADA LETTER VOCALIC RR" #x0CE0)
+    ("KANNADA LETTER VOCALIC LL" #x0CE1)
+    ("KANNADA DIGIT ZERO" #x0CE6)
+    ("KANNADA DIGIT ONE" #x0CE7)
+    ("KANNADA DIGIT TWO" #x0CE8)
+    ("KANNADA DIGIT THREE" #x0CE9)
+    ("KANNADA DIGIT FOUR" #x0CEA)
+    ("KANNADA DIGIT FIVE" #x0CEB)
+    ("KANNADA DIGIT SIX" #x0CEC)
+    ("KANNADA DIGIT SEVEN" #x0CED)
+    ("KANNADA DIGIT EIGHT" #x0CEE)
+    ("KANNADA DIGIT NINE" #x0CEF)
+    ))
+
+;; arch-tag: b17f4e00-00e9-4e2f-8343-37b9c8e29e89
diff --git a/etc/nxml/00D00-00D7F.el b/etc/nxml/00D00-00D7F.el
new file mode 100644 (file)
index 0000000..5d4a728
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'malayalam
+  '(("MALAYALAM SIGN ANUSVARA" #x0D02)
+    ("MALAYALAM SIGN VISARGA" #x0D03)
+    ("MALAYALAM LETTER A" #x0D05)
+    ("MALAYALAM LETTER AA" #x0D06)
+    ("MALAYALAM LETTER I" #x0D07)
+    ("MALAYALAM LETTER II" #x0D08)
+    ("MALAYALAM LETTER U" #x0D09)
+    ("MALAYALAM LETTER UU" #x0D0A)
+    ("MALAYALAM LETTER VOCALIC R" #x0D0B)
+    ("MALAYALAM LETTER VOCALIC L" #x0D0C)
+    ("MALAYALAM LETTER E" #x0D0E)
+    ("MALAYALAM LETTER EE" #x0D0F)
+    ("MALAYALAM LETTER AI" #x0D10)
+    ("MALAYALAM LETTER O" #x0D12)
+    ("MALAYALAM LETTER OO" #x0D13)
+    ("MALAYALAM LETTER AU" #x0D14)
+    ("MALAYALAM LETTER KA" #x0D15)
+    ("MALAYALAM LETTER KHA" #x0D16)
+    ("MALAYALAM LETTER GA" #x0D17)
+    ("MALAYALAM LETTER GHA" #x0D18)
+    ("MALAYALAM LETTER NGA" #x0D19)
+    ("MALAYALAM LETTER CA" #x0D1A)
+    ("MALAYALAM LETTER CHA" #x0D1B)
+    ("MALAYALAM LETTER JA" #x0D1C)
+    ("MALAYALAM LETTER JHA" #x0D1D)
+    ("MALAYALAM LETTER NYA" #x0D1E)
+    ("MALAYALAM LETTER TTA" #x0D1F)
+    ("MALAYALAM LETTER TTHA" #x0D20)
+    ("MALAYALAM LETTER DDA" #x0D21)
+    ("MALAYALAM LETTER DDHA" #x0D22)
+    ("MALAYALAM LETTER NNA" #x0D23)
+    ("MALAYALAM LETTER TA" #x0D24)
+    ("MALAYALAM LETTER THA" #x0D25)
+    ("MALAYALAM LETTER DA" #x0D26)
+    ("MALAYALAM LETTER DHA" #x0D27)
+    ("MALAYALAM LETTER NA" #x0D28)
+    ("MALAYALAM LETTER PA" #x0D2A)
+    ("MALAYALAM LETTER PHA" #x0D2B)
+    ("MALAYALAM LETTER BA" #x0D2C)
+    ("MALAYALAM LETTER BHA" #x0D2D)
+    ("MALAYALAM LETTER MA" #x0D2E)
+    ("MALAYALAM LETTER YA" #x0D2F)
+    ("MALAYALAM LETTER RA" #x0D30)
+    ("MALAYALAM LETTER RRA" #x0D31)
+    ("MALAYALAM LETTER LA" #x0D32)
+    ("MALAYALAM LETTER LLA" #x0D33)
+    ("MALAYALAM LETTER LLLA" #x0D34)
+    ("MALAYALAM LETTER VA" #x0D35)
+    ("MALAYALAM LETTER SHA" #x0D36)
+    ("MALAYALAM LETTER SSA" #x0D37)
+    ("MALAYALAM LETTER SA" #x0D38)
+    ("MALAYALAM LETTER HA" #x0D39)
+    ("MALAYALAM VOWEL SIGN AA" #x0D3E)
+    ("MALAYALAM VOWEL SIGN I" #x0D3F)
+    ("MALAYALAM VOWEL SIGN II" #x0D40)
+    ("MALAYALAM VOWEL SIGN U" #x0D41)
+    ("MALAYALAM VOWEL SIGN UU" #x0D42)
+    ("MALAYALAM VOWEL SIGN VOCALIC R" #x0D43)
+    ("MALAYALAM VOWEL SIGN E" #x0D46)
+    ("MALAYALAM VOWEL SIGN EE" #x0D47)
+    ("MALAYALAM VOWEL SIGN AI" #x0D48)
+    ("MALAYALAM VOWEL SIGN O" #x0D4A)
+    ("MALAYALAM VOWEL SIGN OO" #x0D4B)
+    ("MALAYALAM VOWEL SIGN AU" #x0D4C)
+    ("MALAYALAM SIGN VIRAMA" #x0D4D)
+    ("MALAYALAM AU LENGTH MARK" #x0D57)
+    ("MALAYALAM LETTER VOCALIC RR" #x0D60)
+    ("MALAYALAM LETTER VOCALIC LL" #x0D61)
+    ("MALAYALAM DIGIT ZERO" #x0D66)
+    ("MALAYALAM DIGIT ONE" #x0D67)
+    ("MALAYALAM DIGIT TWO" #x0D68)
+    ("MALAYALAM DIGIT THREE" #x0D69)
+    ("MALAYALAM DIGIT FOUR" #x0D6A)
+    ("MALAYALAM DIGIT FIVE" #x0D6B)
+    ("MALAYALAM DIGIT SIX" #x0D6C)
+    ("MALAYALAM DIGIT SEVEN" #x0D6D)
+    ("MALAYALAM DIGIT EIGHT" #x0D6E)
+    ("MALAYALAM DIGIT NINE" #x0D6F)
+    ))
+
+;; arch-tag: 1bce48f6-bdc3-4ebc-b1f0-1563c32e4926
diff --git a/etc/nxml/00D80-00DFF.el b/etc/nxml/00D80-00DFF.el
new file mode 100644 (file)
index 0000000..3130b1f
--- /dev/null
@@ -0,0 +1,84 @@
+(nxml-define-char-name-set 'sinhala
+  '(("SINHALA SIGN ANUSVARAYA" #x0D82)
+    ("SINHALA SIGN VISARGAYA" #x0D83)
+    ("SINHALA LETTER AYANNA" #x0D85)
+    ("SINHALA LETTER AAYANNA" #x0D86)
+    ("SINHALA LETTER AEYANNA" #x0D87)
+    ("SINHALA LETTER AEEYANNA" #x0D88)
+    ("SINHALA LETTER IYANNA" #x0D89)
+    ("SINHALA LETTER IIYANNA" #x0D8A)
+    ("SINHALA LETTER UYANNA" #x0D8B)
+    ("SINHALA LETTER UUYANNA" #x0D8C)
+    ("SINHALA LETTER IRUYANNA" #x0D8D)
+    ("SINHALA LETTER IRUUYANNA" #x0D8E)
+    ("SINHALA LETTER ILUYANNA" #x0D8F)
+    ("SINHALA LETTER ILUUYANNA" #x0D90)
+    ("SINHALA LETTER EYANNA" #x0D91)
+    ("SINHALA LETTER EEYANNA" #x0D92)
+    ("SINHALA LETTER AIYANNA" #x0D93)
+    ("SINHALA LETTER OYANNA" #x0D94)
+    ("SINHALA LETTER OOYANNA" #x0D95)
+    ("SINHALA LETTER AUYANNA" #x0D96)
+    ("SINHALA LETTER ALPAPRAANA KAYANNA" #x0D9A)
+    ("SINHALA LETTER MAHAAPRAANA KAYANNA" #x0D9B)
+    ("SINHALA LETTER ALPAPRAANA GAYANNA" #x0D9C)
+    ("SINHALA LETTER MAHAAPRAANA GAYANNA" #x0D9D)
+    ("SINHALA LETTER KANTAJA NAASIKYAYA" #x0D9E)
+    ("SINHALA LETTER SANYAKA GAYANNA" #x0D9F)
+    ("SINHALA LETTER ALPAPRAANA CAYANNA" #x0DA0)
+    ("SINHALA LETTER MAHAAPRAANA CAYANNA" #x0DA1)
+    ("SINHALA LETTER ALPAPRAANA JAYANNA" #x0DA2)
+    ("SINHALA LETTER MAHAAPRAANA JAYANNA" #x0DA3)
+    ("SINHALA LETTER TAALUJA NAASIKYAYA" #x0DA4)
+    ("SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA" #x0DA5)
+    ("SINHALA LETTER SANYAKA JAYANNA" #x0DA6)
+    ("SINHALA LETTER ALPAPRAANA TTAYANNA" #x0DA7)
+    ("SINHALA LETTER MAHAAPRAANA TTAYANNA" #x0DA8)
+    ("SINHALA LETTER ALPAPRAANA DDAYANNA" #x0DA9)
+    ("SINHALA LETTER MAHAAPRAANA DDAYANNA" #x0DAA)
+    ("SINHALA LETTER MUURDHAJA NAYANNA" #x0DAB)
+    ("SINHALA LETTER SANYAKA DDAYANNA" #x0DAC)
+    ("SINHALA LETTER ALPAPRAANA TAYANNA" #x0DAD)
+    ("SINHALA LETTER MAHAAPRAANA TAYANNA" #x0DAE)
+    ("SINHALA LETTER ALPAPRAANA DAYANNA" #x0DAF)
+    ("SINHALA LETTER MAHAAPRAANA DAYANNA" #x0DB0)
+    ("SINHALA LETTER DANTAJA NAYANNA" #x0DB1)
+    ("SINHALA LETTER SANYAKA DAYANNA" #x0DB3)
+    ("SINHALA LETTER ALPAPRAANA PAYANNA" #x0DB4)
+    ("SINHALA LETTER MAHAAPRAANA PAYANNA" #x0DB5)
+    ("SINHALA LETTER ALPAPRAANA BAYANNA" #x0DB6)
+    ("SINHALA LETTER MAHAAPRAANA BAYANNA" #x0DB7)
+    ("SINHALA LETTER MAYANNA" #x0DB8)
+    ("SINHALA LETTER AMBA BAYANNA" #x0DB9)
+    ("SINHALA LETTER YAYANNA" #x0DBA)
+    ("SINHALA LETTER RAYANNA" #x0DBB)
+    ("SINHALA LETTER DANTAJA LAYANNA" #x0DBD)
+    ("SINHALA LETTER VAYANNA" #x0DC0)
+    ("SINHALA LETTER TAALUJA SAYANNA" #x0DC1)
+    ("SINHALA LETTER MUURDHAJA SAYANNA" #x0DC2)
+    ("SINHALA LETTER DANTAJA SAYANNA" #x0DC3)
+    ("SINHALA LETTER HAYANNA" #x0DC4)
+    ("SINHALA LETTER MUURDHAJA LAYANNA" #x0DC5)
+    ("SINHALA LETTER FAYANNA" #x0DC6)
+    ("SINHALA SIGN AL-LAKUNA" #x0DCA)
+    ("SINHALA VOWEL SIGN AELA-PILLA" #x0DCF)
+    ("SINHALA VOWEL SIGN KETTI AEDA-PILLA" #x0DD0)
+    ("SINHALA VOWEL SIGN DIGA AEDA-PILLA" #x0DD1)
+    ("SINHALA VOWEL SIGN KETTI IS-PILLA" #x0DD2)
+    ("SINHALA VOWEL SIGN DIGA IS-PILLA" #x0DD3)
+    ("SINHALA VOWEL SIGN KETTI PAA-PILLA" #x0DD4)
+    ("SINHALA VOWEL SIGN DIGA PAA-PILLA" #x0DD6)
+    ("SINHALA VOWEL SIGN GAETTA-PILLA" #x0DD8)
+    ("SINHALA VOWEL SIGN KOMBUVA" #x0DD9)
+    ("SINHALA VOWEL SIGN DIGA KOMBUVA" #x0DDA)
+    ("SINHALA VOWEL SIGN KOMBU DEKA" #x0DDB)
+    ("SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA" #x0DDC)
+    ("SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA" #x0DDD)
+    ("SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA" #x0DDE)
+    ("SINHALA VOWEL SIGN GAYANUKITTA" #x0DDF)
+    ("SINHALA VOWEL SIGN DIGA GAETTA-PILLA" #x0DF2)
+    ("SINHALA VOWEL SIGN DIGA GAYANUKITTA" #x0DF3)
+    ("SINHALA PUNCTUATION KUNDDALIYA" #x0DF4)
+    ))
+
+;; arch-tag: 3dfac4e1-97f5-433a-bd47-8cd364b09075
diff --git a/etc/nxml/00E00-00E7F.el b/etc/nxml/00E00-00E7F.el
new file mode 100644 (file)
index 0000000..f265a06
--- /dev/null
@@ -0,0 +1,91 @@
+(nxml-define-char-name-set 'thai
+  '(("THAI CHARACTER KO KAI" #x0E01)
+    ("THAI CHARACTER KHO KHAI" #x0E02)
+    ("THAI CHARACTER KHO KHUAT" #x0E03)
+    ("THAI CHARACTER KHO KHWAI" #x0E04)
+    ("THAI CHARACTER KHO KHON" #x0E05)
+    ("THAI CHARACTER KHO RAKHANG" #x0E06)
+    ("THAI CHARACTER NGO NGU" #x0E07)
+    ("THAI CHARACTER CHO CHAN" #x0E08)
+    ("THAI CHARACTER CHO CHING" #x0E09)
+    ("THAI CHARACTER CHO CHANG" #x0E0A)
+    ("THAI CHARACTER SO SO" #x0E0B)
+    ("THAI CHARACTER CHO CHOE" #x0E0C)
+    ("THAI CHARACTER YO YING" #x0E0D)
+    ("THAI CHARACTER DO CHADA" #x0E0E)
+    ("THAI CHARACTER TO PATAK" #x0E0F)
+    ("THAI CHARACTER THO THAN" #x0E10)
+    ("THAI CHARACTER THO NANGMONTHO" #x0E11)
+    ("THAI CHARACTER THO PHUTHAO" #x0E12)
+    ("THAI CHARACTER NO NEN" #x0E13)
+    ("THAI CHARACTER DO DEK" #x0E14)
+    ("THAI CHARACTER TO TAO" #x0E15)
+    ("THAI CHARACTER THO THUNG" #x0E16)
+    ("THAI CHARACTER THO THAHAN" #x0E17)
+    ("THAI CHARACTER THO THONG" #x0E18)
+    ("THAI CHARACTER NO NU" #x0E19)
+    ("THAI CHARACTER BO BAIMAI" #x0E1A)
+    ("THAI CHARACTER PO PLA" #x0E1B)
+    ("THAI CHARACTER PHO PHUNG" #x0E1C)
+    ("THAI CHARACTER FO FA" #x0E1D)
+    ("THAI CHARACTER PHO PHAN" #x0E1E)
+    ("THAI CHARACTER FO FAN" #x0E1F)
+    ("THAI CHARACTER PHO SAMPHAO" #x0E20)
+    ("THAI CHARACTER MO MA" #x0E21)
+    ("THAI CHARACTER YO YAK" #x0E22)
+    ("THAI CHARACTER RO RUA" #x0E23)
+    ("THAI CHARACTER RU" #x0E24)
+    ("THAI CHARACTER LO LING" #x0E25)
+    ("THAI CHARACTER LU" #x0E26)
+    ("THAI CHARACTER WO WAEN" #x0E27)
+    ("THAI CHARACTER SO SALA" #x0E28)
+    ("THAI CHARACTER SO RUSI" #x0E29)
+    ("THAI CHARACTER SO SUA" #x0E2A)
+    ("THAI CHARACTER HO HIP" #x0E2B)
+    ("THAI CHARACTER LO CHULA" #x0E2C)
+    ("THAI CHARACTER O ANG" #x0E2D)
+    ("THAI CHARACTER HO NOKHUK" #x0E2E)
+    ("THAI CHARACTER PAIYANNOI" #x0E2F)
+    ("THAI CHARACTER SARA A" #x0E30)
+    ("THAI CHARACTER MAI HAN-AKAT" #x0E31)
+    ("THAI CHARACTER SARA AA" #x0E32)
+    ("THAI CHARACTER SARA AM" #x0E33)
+    ("THAI CHARACTER SARA I" #x0E34)
+    ("THAI CHARACTER SARA II" #x0E35)
+    ("THAI CHARACTER SARA UE" #x0E36)
+    ("THAI CHARACTER SARA UEE" #x0E37)
+    ("THAI CHARACTER SARA U" #x0E38)
+    ("THAI CHARACTER SARA UU" #x0E39)
+    ("THAI CHARACTER PHINTHU" #x0E3A)
+    ("THAI CURRENCY SYMBOL BAHT" #x0E3F)
+    ("THAI CHARACTER SARA E" #x0E40)
+    ("THAI CHARACTER SARA AE" #x0E41)
+    ("THAI CHARACTER SARA O" #x0E42)
+    ("THAI CHARACTER SARA AI MAIMUAN" #x0E43)
+    ("THAI CHARACTER SARA AI MAIMALAI" #x0E44)
+    ("THAI CHARACTER LAKKHANGYAO" #x0E45)
+    ("THAI CHARACTER MAIYAMOK" #x0E46)
+    ("THAI CHARACTER MAITAIKHU" #x0E47)
+    ("THAI CHARACTER MAI EK" #x0E48)
+    ("THAI CHARACTER MAI THO" #x0E49)
+    ("THAI CHARACTER MAI TRI" #x0E4A)
+    ("THAI CHARACTER MAI CHATTAWA" #x0E4B)
+    ("THAI CHARACTER THANTHAKHAT" #x0E4C)
+    ("THAI CHARACTER NIKHAHIT" #x0E4D)
+    ("THAI CHARACTER YAMAKKAN" #x0E4E)
+    ("THAI CHARACTER FONGMAN" #x0E4F)
+    ("THAI DIGIT ZERO" #x0E50)
+    ("THAI DIGIT ONE" #x0E51)
+    ("THAI DIGIT TWO" #x0E52)
+    ("THAI DIGIT THREE" #x0E53)
+    ("THAI DIGIT FOUR" #x0E54)
+    ("THAI DIGIT FIVE" #x0E55)
+    ("THAI DIGIT SIX" #x0E56)
+    ("THAI DIGIT SEVEN" #x0E57)
+    ("THAI DIGIT EIGHT" #x0E58)
+    ("THAI DIGIT NINE" #x0E59)
+    ("THAI CHARACTER ANGKHANKHU" #x0E5A)
+    ("THAI CHARACTER KHOMUT" #x0E5B)
+    ))
+
+;; arch-tag: cf6119b0-ae54-4871-a8a7-10621d74cba8
diff --git a/etc/nxml/00E80-00EFF.el b/etc/nxml/00E80-00EFF.el
new file mode 100644 (file)
index 0000000..29be3e1
--- /dev/null
@@ -0,0 +1,69 @@
+(nxml-define-char-name-set 'lao
+  '(("LAO LETTER KO" #x0E81)
+    ("LAO LETTER KHO SUNG" #x0E82)
+    ("LAO LETTER KHO TAM" #x0E84)
+    ("LAO LETTER NGO" #x0E87)
+    ("LAO LETTER CO" #x0E88)
+    ("LAO LETTER SO TAM" #x0E8A)
+    ("LAO LETTER NYO" #x0E8D)
+    ("LAO LETTER DO" #x0E94)
+    ("LAO LETTER TO" #x0E95)
+    ("LAO LETTER THO SUNG" #x0E96)
+    ("LAO LETTER THO TAM" #x0E97)
+    ("LAO LETTER NO" #x0E99)
+    ("LAO LETTER BO" #x0E9A)
+    ("LAO LETTER PO" #x0E9B)
+    ("LAO LETTER PHO SUNG" #x0E9C)
+    ("LAO LETTER FO TAM" #x0E9D)
+    ("LAO LETTER PHO TAM" #x0E9E)
+    ("LAO LETTER FO SUNG" #x0E9F)
+    ("LAO LETTER MO" #x0EA1)
+    ("LAO LETTER YO" #x0EA2)
+    ("LAO LETTER LO LING" #x0EA3)
+    ("LAO LETTER LO LOOT" #x0EA5)
+    ("LAO LETTER WO" #x0EA7)
+    ("LAO LETTER SO SUNG" #x0EAA)
+    ("LAO LETTER HO SUNG" #x0EAB)
+    ("LAO LETTER O" #x0EAD)
+    ("LAO LETTER HO TAM" #x0EAE)
+    ("LAO ELLIPSIS" #x0EAF)
+    ("LAO VOWEL SIGN A" #x0EB0)
+    ("LAO VOWEL SIGN MAI KAN" #x0EB1)
+    ("LAO VOWEL SIGN AA" #x0EB2)
+    ("LAO VOWEL SIGN AM" #x0EB3)
+    ("LAO VOWEL SIGN I" #x0EB4)
+    ("LAO VOWEL SIGN II" #x0EB5)
+    ("LAO VOWEL SIGN Y" #x0EB6)
+    ("LAO VOWEL SIGN YY" #x0EB7)
+    ("LAO VOWEL SIGN U" #x0EB8)
+    ("LAO VOWEL SIGN UU" #x0EB9)
+    ("LAO VOWEL SIGN MAI KON" #x0EBB)
+    ("LAO SEMIVOWEL SIGN LO" #x0EBC)
+    ("LAO SEMIVOWEL SIGN NYO" #x0EBD)
+    ("LAO VOWEL SIGN E" #x0EC0)
+    ("LAO VOWEL SIGN EI" #x0EC1)
+    ("LAO VOWEL SIGN O" #x0EC2)
+    ("LAO VOWEL SIGN AY" #x0EC3)
+    ("LAO VOWEL SIGN AI" #x0EC4)
+    ("LAO KO LA" #x0EC6)
+    ("LAO TONE MAI EK" #x0EC8)
+    ("LAO TONE MAI THO" #x0EC9)
+    ("LAO TONE MAI TI" #x0ECA)
+    ("LAO TONE MAI CATAWA" #x0ECB)
+    ("LAO CANCELLATION MARK" #x0ECC)
+    ("LAO NIGGAHITA" #x0ECD)
+    ("LAO DIGIT ZERO" #x0ED0)
+    ("LAO DIGIT ONE" #x0ED1)
+    ("LAO DIGIT TWO" #x0ED2)
+    ("LAO DIGIT THREE" #x0ED3)
+    ("LAO DIGIT FOUR" #x0ED4)
+    ("LAO DIGIT FIVE" #x0ED5)
+    ("LAO DIGIT SIX" #x0ED6)
+    ("LAO DIGIT SEVEN" #x0ED7)
+    ("LAO DIGIT EIGHT" #x0ED8)
+    ("LAO DIGIT NINE" #x0ED9)
+    ("LAO HO NO" #x0EDC)
+    ("LAO HO MO" #x0EDD)
+    ))
+
+;; arch-tag: 36f98cb4-447d-49e0-bae5-03a026adabac
diff --git a/etc/nxml/00F00-00FFF.el b/etc/nxml/00F00-00FFF.el
new file mode 100644 (file)
index 0000000..8e8be12
--- /dev/null
@@ -0,0 +1,197 @@
+(nxml-define-char-name-set 'tibetan
+  '(("TIBETAN SYLLABLE OM" #x0F00)
+    ("TIBETAN MARK GTER YIG MGO TRUNCATED A" #x0F01)
+    ("TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA" #x0F02)
+    ("TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA" #x0F03)
+    ("TIBETAN MARK INITIAL YIG MGO MDUN MA" #x0F04)
+    ("TIBETAN MARK CLOSING YIG MGO SGAB MA" #x0F05)
+    ("TIBETAN MARK CARET YIG MGO PHUR SHAD MA" #x0F06)
+    ("TIBETAN MARK YIG MGO TSHEG SHAD MA" #x0F07)
+    ("TIBETAN MARK SBRUL SHAD" #x0F08)
+    ("TIBETAN MARK BSKUR YIG MGO" #x0F09)
+    ("TIBETAN MARK BKA- SHOG YIG MGO" #x0F0A)
+    ("TIBETAN MARK INTERSYLLABIC TSHEG" #x0F0B)
+    ("TIBETAN MARK DELIMITER TSHEG BSTAR" #x0F0C)
+    ("TIBETAN MARK SHAD" #x0F0D)
+    ("TIBETAN MARK NYIS SHAD" #x0F0E)
+    ("TIBETAN MARK TSHEG SHAD" #x0F0F)
+    ("TIBETAN MARK NYIS TSHEG SHAD" #x0F10)
+    ("TIBETAN MARK RIN CHEN SPUNGS SHAD" #x0F11)
+    ("TIBETAN MARK RGYA GRAM SHAD" #x0F12)
+    ("TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN" #x0F13)
+    ("TIBETAN MARK GTER TSHEG" #x0F14)
+    ("TIBETAN LOGOTYPE SIGN CHAD RTAGS" #x0F15)
+    ("TIBETAN LOGOTYPE SIGN LHAG RTAGS" #x0F16)
+    ("TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS" #x0F17)
+    ("TIBETAN ASTROLOGICAL SIGN -KHYUD PA" #x0F18)
+    ("TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS" #x0F19)
+    ("TIBETAN SIGN RDEL DKAR GCIG" #x0F1A)
+    ("TIBETAN SIGN RDEL DKAR GNYIS" #x0F1B)
+    ("TIBETAN SIGN RDEL DKAR GSUM" #x0F1C)
+    ("TIBETAN SIGN RDEL NAG GCIG" #x0F1D)
+    ("TIBETAN SIGN RDEL NAG GNYIS" #x0F1E)
+    ("TIBETAN SIGN RDEL DKAR RDEL NAG" #x0F1F)
+    ("TIBETAN DIGIT ZERO" #x0F20)
+    ("TIBETAN DIGIT ONE" #x0F21)
+    ("TIBETAN DIGIT TWO" #x0F22)
+    ("TIBETAN DIGIT THREE" #x0F23)
+    ("TIBETAN DIGIT FOUR" #x0F24)
+    ("TIBETAN DIGIT FIVE" #x0F25)
+    ("TIBETAN DIGIT SIX" #x0F26)
+    ("TIBETAN DIGIT SEVEN" #x0F27)
+    ("TIBETAN DIGIT EIGHT" #x0F28)
+    ("TIBETAN DIGIT NINE" #x0F29)
+    ("TIBETAN DIGIT HALF ONE" #x0F2A)
+    ("TIBETAN DIGIT HALF TWO" #x0F2B)
+    ("TIBETAN DIGIT HALF THREE" #x0F2C)
+    ("TIBETAN DIGIT HALF FOUR" #x0F2D)
+    ("TIBETAN DIGIT HALF FIVE" #x0F2E)
+    ("TIBETAN DIGIT HALF SIX" #x0F2F)
+    ("TIBETAN DIGIT HALF SEVEN" #x0F30)
+    ("TIBETAN DIGIT HALF EIGHT" #x0F31)
+    ("TIBETAN DIGIT HALF NINE" #x0F32)
+    ("TIBETAN DIGIT HALF ZERO" #x0F33)
+    ("TIBETAN MARK BSDUS RTAGS" #x0F34)
+    ("TIBETAN MARK NGAS BZUNG NYI ZLA" #x0F35)
+    ("TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN" #x0F36)
+    ("TIBETAN MARK NGAS BZUNG SGOR RTAGS" #x0F37)
+    ("TIBETAN MARK CHE MGO" #x0F38)
+    ("TIBETAN MARK TSA -PHRU" #x0F39)
+    ("TIBETAN MARK GUG RTAGS GYON" #x0F3A)
+    ("TIBETAN MARK GUG RTAGS GYAS" #x0F3B)
+    ("TIBETAN MARK ANG KHANG GYON" #x0F3C)
+    ("TIBETAN MARK ANG KHANG GYAS" #x0F3D)
+    ("TIBETAN SIGN YAR TSHES" #x0F3E)
+    ("TIBETAN SIGN MAR TSHES" #x0F3F)
+    ("TIBETAN LETTER KA" #x0F40)
+    ("TIBETAN LETTER KHA" #x0F41)
+    ("TIBETAN LETTER GA" #x0F42)
+    ("TIBETAN LETTER GHA" #x0F43)
+    ("TIBETAN LETTER NGA" #x0F44)
+    ("TIBETAN LETTER CA" #x0F45)
+    ("TIBETAN LETTER CHA" #x0F46)
+    ("TIBETAN LETTER JA" #x0F47)
+    ("TIBETAN LETTER NYA" #x0F49)
+    ("TIBETAN LETTER TTA" #x0F4A)
+    ("TIBETAN LETTER TTHA" #x0F4B)
+    ("TIBETAN LETTER DDA" #x0F4C)
+    ("TIBETAN LETTER DDHA" #x0F4D)
+    ("TIBETAN LETTER NNA" #x0F4E)
+    ("TIBETAN LETTER TA" #x0F4F)
+    ("TIBETAN LETTER THA" #x0F50)
+    ("TIBETAN LETTER DA" #x0F51)
+    ("TIBETAN LETTER DHA" #x0F52)
+    ("TIBETAN LETTER NA" #x0F53)
+    ("TIBETAN LETTER PA" #x0F54)
+    ("TIBETAN LETTER PHA" #x0F55)
+    ("TIBETAN LETTER BA" #x0F56)
+    ("TIBETAN LETTER BHA" #x0F57)
+    ("TIBETAN LETTER MA" #x0F58)
+    ("TIBETAN LETTER TSA" #x0F59)
+    ("TIBETAN LETTER TSHA" #x0F5A)
+    ("TIBETAN LETTER DZA" #x0F5B)
+    ("TIBETAN LETTER DZHA" #x0F5C)
+    ("TIBETAN LETTER WA" #x0F5D)
+    ("TIBETAN LETTER ZHA" #x0F5E)
+    ("TIBETAN LETTER ZA" #x0F5F)
+    ("TIBETAN LETTER -A" #x0F60)
+    ("TIBETAN LETTER YA" #x0F61)
+    ("TIBETAN LETTER RA" #x0F62)
+    ("TIBETAN LETTER LA" #x0F63)
+    ("TIBETAN LETTER SHA" #x0F64)
+    ("TIBETAN LETTER SSA" #x0F65)
+    ("TIBETAN LETTER SA" #x0F66)
+    ("TIBETAN LETTER HA" #x0F67)
+    ("TIBETAN LETTER A" #x0F68)
+    ("TIBETAN LETTER KSSA" #x0F69)
+    ("TIBETAN LETTER FIXED-FORM RA" #x0F6A)
+    ("TIBETAN VOWEL SIGN AA" #x0F71)
+    ("TIBETAN VOWEL SIGN I" #x0F72)
+    ("TIBETAN VOWEL SIGN II" #x0F73)
+    ("TIBETAN VOWEL SIGN U" #x0F74)
+    ("TIBETAN VOWEL SIGN UU" #x0F75)
+    ("TIBETAN VOWEL SIGN VOCALIC R" #x0F76)
+    ("TIBETAN VOWEL SIGN VOCALIC RR" #x0F77)
+    ("TIBETAN VOWEL SIGN VOCALIC L" #x0F78)
+    ("TIBETAN VOWEL SIGN VOCALIC LL" #x0F79)
+    ("TIBETAN VOWEL SIGN E" #x0F7A)
+    ("TIBETAN VOWEL SIGN EE" #x0F7B)
+    ("TIBETAN VOWEL SIGN O" #x0F7C)
+    ("TIBETAN VOWEL SIGN OO" #x0F7D)
+    ("TIBETAN SIGN RJES SU NGA RO" #x0F7E)
+    ("TIBETAN SIGN RNAM BCAD" #x0F7F)
+    ("TIBETAN VOWEL SIGN REVERSED I" #x0F80)
+    ("TIBETAN VOWEL SIGN REVERSED II" #x0F81)
+    ("TIBETAN SIGN NYI ZLA NAA DA" #x0F82)
+    ("TIBETAN SIGN SNA LDAN" #x0F83)
+    ("TIBETAN MARK HALANTA" #x0F84)
+    ("TIBETAN MARK PALUTA" #x0F85)
+    ("TIBETAN SIGN LCI RTAGS" #x0F86)
+    ("TIBETAN SIGN YANG RTAGS" #x0F87)
+    ("TIBETAN SIGN LCE TSA CAN" #x0F88)
+    ("TIBETAN SIGN MCHU CAN" #x0F89)
+    ("TIBETAN SIGN GRU CAN RGYINGS" #x0F8A)
+    ("TIBETAN SIGN GRU MED RGYINGS" #x0F8B)
+    ("TIBETAN SUBJOINED LETTER KA" #x0F90)
+    ("TIBETAN SUBJOINED LETTER KHA" #x0F91)
+    ("TIBETAN SUBJOINED LETTER GA" #x0F92)
+    ("TIBETAN SUBJOINED LETTER GHA" #x0F93)
+    ("TIBETAN SUBJOINED LETTER NGA" #x0F94)
+    ("TIBETAN SUBJOINED LETTER CA" #x0F95)
+    ("TIBETAN SUBJOINED LETTER CHA" #x0F96)
+    ("TIBETAN SUBJOINED LETTER JA" #x0F97)
+    ("TIBETAN SUBJOINED LETTER NYA" #x0F99)
+    ("TIBETAN SUBJOINED LETTER TTA" #x0F9A)
+    ("TIBETAN SUBJOINED LETTER TTHA" #x0F9B)
+    ("TIBETAN SUBJOINED LETTER DDA" #x0F9C)
+    ("TIBETAN SUBJOINED LETTER DDHA" #x0F9D)
+    ("TIBETAN SUBJOINED LETTER NNA" #x0F9E)
+    ("TIBETAN SUBJOINED LETTER TA" #x0F9F)
+    ("TIBETAN SUBJOINED LETTER THA" #x0FA0)
+    ("TIBETAN SUBJOINED LETTER DA" #x0FA1)
+    ("TIBETAN SUBJOINED LETTER DHA" #x0FA2)
+    ("TIBETAN SUBJOINED LETTER NA" #x0FA3)
+    ("TIBETAN SUBJOINED LETTER PA" #x0FA4)
+    ("TIBETAN SUBJOINED LETTER PHA" #x0FA5)
+    ("TIBETAN SUBJOINED LETTER BA" #x0FA6)
+    ("TIBETAN SUBJOINED LETTER BHA" #x0FA7)
+    ("TIBETAN SUBJOINED LETTER MA" #x0FA8)
+    ("TIBETAN SUBJOINED LETTER TSA" #x0FA9)
+    ("TIBETAN SUBJOINED LETTER TSHA" #x0FAA)
+    ("TIBETAN SUBJOINED LETTER DZA" #x0FAB)
+    ("TIBETAN SUBJOINED LETTER DZHA" #x0FAC)
+    ("TIBETAN SUBJOINED LETTER WA" #x0FAD)
+    ("TIBETAN SUBJOINED LETTER ZHA" #x0FAE)
+    ("TIBETAN SUBJOINED LETTER ZA" #x0FAF)
+    ("TIBETAN SUBJOINED LETTER -A" #x0FB0)
+    ("TIBETAN SUBJOINED LETTER YA" #x0FB1)
+    ("TIBETAN SUBJOINED LETTER RA" #x0FB2)
+    ("TIBETAN SUBJOINED LETTER LA" #x0FB3)
+    ("TIBETAN SUBJOINED LETTER SHA" #x0FB4)
+    ("TIBETAN SUBJOINED LETTER SSA" #x0FB5)
+    ("TIBETAN SUBJOINED LETTER SA" #x0FB6)
+    ("TIBETAN SUBJOINED LETTER HA" #x0FB7)
+    ("TIBETAN SUBJOINED LETTER A" #x0FB8)
+    ("TIBETAN SUBJOINED LETTER KSSA" #x0FB9)
+    ("TIBETAN SUBJOINED LETTER FIXED-FORM WA" #x0FBA)
+    ("TIBETAN SUBJOINED LETTER FIXED-FORM YA" #x0FBB)
+    ("TIBETAN SUBJOINED LETTER FIXED-FORM RA" #x0FBC)
+    ("TIBETAN KU RU KHA" #x0FBE)
+    ("TIBETAN KU RU KHA BZHI MIG CAN" #x0FBF)
+    ("TIBETAN CANTILLATION SIGN HEAVY BEAT" #x0FC0)
+    ("TIBETAN CANTILLATION SIGN LIGHT BEAT" #x0FC1)
+    ("TIBETAN CANTILLATION SIGN CANG TE-U" #x0FC2)
+    ("TIBETAN CANTILLATION SIGN SBUB -CHAL" #x0FC3)
+    ("TIBETAN SYMBOL DRIL BU" #x0FC4)
+    ("TIBETAN SYMBOL RDO RJE" #x0FC5)
+    ("TIBETAN SYMBOL PADMA GDAN" #x0FC6)
+    ("TIBETAN SYMBOL RDO RJE RGYA GRAM" #x0FC7)
+    ("TIBETAN SYMBOL PHUR PA" #x0FC8)
+    ("TIBETAN SYMBOL NOR BU" #x0FC9)
+    ("TIBETAN SYMBOL NOR BU NYIS -KHYIL" #x0FCA)
+    ("TIBETAN SYMBOL NOR BU GSUM -KHYIL" #x0FCB)
+    ("TIBETAN SYMBOL NOR BU BZHI -KHYIL" #x0FCC)
+    ("TIBETAN SIGN RDEL NAG GSUM" #x0FCF)
+    ))
+
+;; arch-tag: 547e48c6-3ded-4dc7-be69-4ee324c604c3
diff --git a/etc/nxml/01000-0109F.el b/etc/nxml/01000-0109F.el
new file mode 100644 (file)
index 0000000..56ab646
--- /dev/null
@@ -0,0 +1,82 @@
+(nxml-define-char-name-set 'myanmar
+  '(("MYANMAR LETTER KA" #x1000)
+    ("MYANMAR LETTER KHA" #x1001)
+    ("MYANMAR LETTER GA" #x1002)
+    ("MYANMAR LETTER GHA" #x1003)
+    ("MYANMAR LETTER NGA" #x1004)
+    ("MYANMAR LETTER CA" #x1005)
+    ("MYANMAR LETTER CHA" #x1006)
+    ("MYANMAR LETTER JA" #x1007)
+    ("MYANMAR LETTER JHA" #x1008)
+    ("MYANMAR LETTER NYA" #x1009)
+    ("MYANMAR LETTER NNYA" #x100A)
+    ("MYANMAR LETTER TTA" #x100B)
+    ("MYANMAR LETTER TTHA" #x100C)
+    ("MYANMAR LETTER DDA" #x100D)
+    ("MYANMAR LETTER DDHA" #x100E)
+    ("MYANMAR LETTER NNA" #x100F)
+    ("MYANMAR LETTER TA" #x1010)
+    ("MYANMAR LETTER THA" #x1011)
+    ("MYANMAR LETTER DA" #x1012)
+    ("MYANMAR LETTER DHA" #x1013)
+    ("MYANMAR LETTER NA" #x1014)
+    ("MYANMAR LETTER PA" #x1015)
+    ("MYANMAR LETTER PHA" #x1016)
+    ("MYANMAR LETTER BA" #x1017)
+    ("MYANMAR LETTER BHA" #x1018)
+    ("MYANMAR LETTER MA" #x1019)
+    ("MYANMAR LETTER YA" #x101A)
+    ("MYANMAR LETTER RA" #x101B)
+    ("MYANMAR LETTER LA" #x101C)
+    ("MYANMAR LETTER WA" #x101D)
+    ("MYANMAR LETTER SA" #x101E)
+    ("MYANMAR LETTER HA" #x101F)
+    ("MYANMAR LETTER LLA" #x1020)
+    ("MYANMAR LETTER A" #x1021)
+    ("MYANMAR LETTER I" #x1023)
+    ("MYANMAR LETTER II" #x1024)
+    ("MYANMAR LETTER U" #x1025)
+    ("MYANMAR LETTER UU" #x1026)
+    ("MYANMAR LETTER E" #x1027)
+    ("MYANMAR LETTER O" #x1029)
+    ("MYANMAR LETTER AU" #x102A)
+    ("MYANMAR VOWEL SIGN AA" #x102C)
+    ("MYANMAR VOWEL SIGN I" #x102D)
+    ("MYANMAR VOWEL SIGN II" #x102E)
+    ("MYANMAR VOWEL SIGN U" #x102F)
+    ("MYANMAR VOWEL SIGN UU" #x1030)
+    ("MYANMAR VOWEL SIGN E" #x1031)
+    ("MYANMAR VOWEL SIGN AI" #x1032)
+    ("MYANMAR SIGN ANUSVARA" #x1036)
+    ("MYANMAR SIGN DOT BELOW" #x1037)
+    ("MYANMAR SIGN VISARGA" #x1038)
+    ("MYANMAR SIGN VIRAMA" #x1039)
+    ("MYANMAR DIGIT ZERO" #x1040)
+    ("MYANMAR DIGIT ONE" #x1041)
+    ("MYANMAR DIGIT TWO" #x1042)
+    ("MYANMAR DIGIT THREE" #x1043)
+    ("MYANMAR DIGIT FOUR" #x1044)
+    ("MYANMAR DIGIT FIVE" #x1045)
+    ("MYANMAR DIGIT SIX" #x1046)
+    ("MYANMAR DIGIT SEVEN" #x1047)
+    ("MYANMAR DIGIT EIGHT" #x1048)
+    ("MYANMAR DIGIT NINE" #x1049)
+    ("MYANMAR SIGN LITTLE SECTION" #x104A)
+    ("MYANMAR SIGN SECTION" #x104B)
+    ("MYANMAR SYMBOL LOCATIVE" #x104C)
+    ("MYANMAR SYMBOL COMPLETED" #x104D)
+    ("MYANMAR SYMBOL AFOREMENTIONED" #x104E)
+    ("MYANMAR SYMBOL GENITIVE" #x104F)
+    ("MYANMAR LETTER SHA" #x1050)
+    ("MYANMAR LETTER SSA" #x1051)
+    ("MYANMAR LETTER VOCALIC R" #x1052)
+    ("MYANMAR LETTER VOCALIC RR" #x1053)
+    ("MYANMAR LETTER VOCALIC L" #x1054)
+    ("MYANMAR LETTER VOCALIC LL" #x1055)
+    ("MYANMAR VOWEL SIGN VOCALIC R" #x1056)
+    ("MYANMAR VOWEL SIGN VOCALIC RR" #x1057)
+    ("MYANMAR VOWEL SIGN VOCALIC L" #x1058)
+    ("MYANMAR VOWEL SIGN VOCALIC LL" #x1059)
+    ))
+
+;; arch-tag: 030cc7f0-2667-4504-ae9c-39c00fe146ff
diff --git a/etc/nxml/010A0-010FF.el b/etc/nxml/010A0-010FF.el
new file mode 100644 (file)
index 0000000..d8c3ab7
--- /dev/null
@@ -0,0 +1,84 @@
+(nxml-define-char-name-set 'georgian
+  '(("GEORGIAN CAPITAL LETTER AN" #x10A0)
+    ("GEORGIAN CAPITAL LETTER BAN" #x10A1)
+    ("GEORGIAN CAPITAL LETTER GAN" #x10A2)
+    ("GEORGIAN CAPITAL LETTER DON" #x10A3)
+    ("GEORGIAN CAPITAL LETTER EN" #x10A4)
+    ("GEORGIAN CAPITAL LETTER VIN" #x10A5)
+    ("GEORGIAN CAPITAL LETTER ZEN" #x10A6)
+    ("GEORGIAN CAPITAL LETTER TAN" #x10A7)
+    ("GEORGIAN CAPITAL LETTER IN" #x10A8)
+    ("GEORGIAN CAPITAL LETTER KAN" #x10A9)
+    ("GEORGIAN CAPITAL LETTER LAS" #x10AA)
+    ("GEORGIAN CAPITAL LETTER MAN" #x10AB)
+    ("GEORGIAN CAPITAL LETTER NAR" #x10AC)
+    ("GEORGIAN CAPITAL LETTER ON" #x10AD)
+    ("GEORGIAN CAPITAL LETTER PAR" #x10AE)
+    ("GEORGIAN CAPITAL LETTER ZHAR" #x10AF)
+    ("GEORGIAN CAPITAL LETTER RAE" #x10B0)
+    ("GEORGIAN CAPITAL LETTER SAN" #x10B1)
+    ("GEORGIAN CAPITAL LETTER TAR" #x10B2)
+    ("GEORGIAN CAPITAL LETTER UN" #x10B3)
+    ("GEORGIAN CAPITAL LETTER PHAR" #x10B4)
+    ("GEORGIAN CAPITAL LETTER KHAR" #x10B5)
+    ("GEORGIAN CAPITAL LETTER GHAN" #x10B6)
+    ("GEORGIAN CAPITAL LETTER QAR" #x10B7)
+    ("GEORGIAN CAPITAL LETTER SHIN" #x10B8)
+    ("GEORGIAN CAPITAL LETTER CHIN" #x10B9)
+    ("GEORGIAN CAPITAL LETTER CAN" #x10BA)
+    ("GEORGIAN CAPITAL LETTER JIL" #x10BB)
+    ("GEORGIAN CAPITAL LETTER CIL" #x10BC)
+    ("GEORGIAN CAPITAL LETTER CHAR" #x10BD)
+    ("GEORGIAN CAPITAL LETTER XAN" #x10BE)
+    ("GEORGIAN CAPITAL LETTER JHAN" #x10BF)
+    ("GEORGIAN CAPITAL LETTER HAE" #x10C0)
+    ("GEORGIAN CAPITAL LETTER HE" #x10C1)
+    ("GEORGIAN CAPITAL LETTER HIE" #x10C2)
+    ("GEORGIAN CAPITAL LETTER WE" #x10C3)
+    ("GEORGIAN CAPITAL LETTER HAR" #x10C4)
+    ("GEORGIAN CAPITAL LETTER HOE" #x10C5)
+    ("GEORGIAN LETTER AN" #x10D0)
+    ("GEORGIAN LETTER BAN" #x10D1)
+    ("GEORGIAN LETTER GAN" #x10D2)
+    ("GEORGIAN LETTER DON" #x10D3)
+    ("GEORGIAN LETTER EN" #x10D4)
+    ("GEORGIAN LETTER VIN" #x10D5)
+    ("GEORGIAN LETTER ZEN" #x10D6)
+    ("GEORGIAN LETTER TAN" #x10D7)
+    ("GEORGIAN LETTER IN" #x10D8)
+    ("GEORGIAN LETTER KAN" #x10D9)
+    ("GEORGIAN LETTER LAS" #x10DA)
+    ("GEORGIAN LETTER MAN" #x10DB)
+    ("GEORGIAN LETTER NAR" #x10DC)
+    ("GEORGIAN LETTER ON" #x10DD)
+    ("GEORGIAN LETTER PAR" #x10DE)
+    ("GEORGIAN LETTER ZHAR" #x10DF)
+    ("GEORGIAN LETTER RAE" #x10E0)
+    ("GEORGIAN LETTER SAN" #x10E1)
+    ("GEORGIAN LETTER TAR" #x10E2)
+    ("GEORGIAN LETTER UN" #x10E3)
+    ("GEORGIAN LETTER PHAR" #x10E4)
+    ("GEORGIAN LETTER KHAR" #x10E5)
+    ("GEORGIAN LETTER GHAN" #x10E6)
+    ("GEORGIAN LETTER QAR" #x10E7)
+    ("GEORGIAN LETTER SHIN" #x10E8)
+    ("GEORGIAN LETTER CHIN" #x10E9)
+    ("GEORGIAN LETTER CAN" #x10EA)
+    ("GEORGIAN LETTER JIL" #x10EB)
+    ("GEORGIAN LETTER CIL" #x10EC)
+    ("GEORGIAN LETTER CHAR" #x10ED)
+    ("GEORGIAN LETTER XAN" #x10EE)
+    ("GEORGIAN LETTER JHAN" #x10EF)
+    ("GEORGIAN LETTER HAE" #x10F0)
+    ("GEORGIAN LETTER HE" #x10F1)
+    ("GEORGIAN LETTER HIE" #x10F2)
+    ("GEORGIAN LETTER WE" #x10F3)
+    ("GEORGIAN LETTER HAR" #x10F4)
+    ("GEORGIAN LETTER HOE" #x10F5)
+    ("GEORGIAN LETTER FI" #x10F6)
+    ("GEORGIAN LETTER YN" #x10F7)
+    ("GEORGIAN LETTER ELIFI" #x10F8)
+    ("GEORGIAN PARAGRAPH SEPARATOR" #x10FB)
+    ))
+
+;; arch-tag: 8f5a9cec-8b71-48c9-af68-c8c51112e5b2
diff --git a/etc/nxml/01100-011FF.el b/etc/nxml/01100-011FF.el
new file mode 100644 (file)
index 0000000..7e7619d
--- /dev/null
@@ -0,0 +1,244 @@
+(nxml-define-char-name-set 'hangul-jamo
+  '(("HANGUL CHOSEONG KIYEOK" #x1100)
+    ("HANGUL CHOSEONG SSANGKIYEOK" #x1101)
+    ("HANGUL CHOSEONG NIEUN" #x1102)
+    ("HANGUL CHOSEONG TIKEUT" #x1103)
+    ("HANGUL CHOSEONG SSANGTIKEUT" #x1104)
+    ("HANGUL CHOSEONG RIEUL" #x1105)
+    ("HANGUL CHOSEONG MIEUM" #x1106)
+    ("HANGUL CHOSEONG PIEUP" #x1107)
+    ("HANGUL CHOSEONG SSANGPIEUP" #x1108)
+    ("HANGUL CHOSEONG SIOS" #x1109)
+    ("HANGUL CHOSEONG SSANGSIOS" #x110A)
+    ("HANGUL CHOSEONG IEUNG" #x110B)
+    ("HANGUL CHOSEONG CIEUC" #x110C)
+    ("HANGUL CHOSEONG SSANGCIEUC" #x110D)
+    ("HANGUL CHOSEONG CHIEUCH" #x110E)
+    ("HANGUL CHOSEONG KHIEUKH" #x110F)
+    ("HANGUL CHOSEONG THIEUTH" #x1110)
+    ("HANGUL CHOSEONG PHIEUPH" #x1111)
+    ("HANGUL CHOSEONG HIEUH" #x1112)
+    ("HANGUL CHOSEONG NIEUN-KIYEOK" #x1113)
+    ("HANGUL CHOSEONG SSANGNIEUN" #x1114)
+    ("HANGUL CHOSEONG NIEUN-TIKEUT" #x1115)
+    ("HANGUL CHOSEONG NIEUN-PIEUP" #x1116)
+    ("HANGUL CHOSEONG TIKEUT-KIYEOK" #x1117)
+    ("HANGUL CHOSEONG RIEUL-NIEUN" #x1118)
+    ("HANGUL CHOSEONG SSANGRIEUL" #x1119)
+    ("HANGUL CHOSEONG RIEUL-HIEUH" #x111A)
+    ("HANGUL CHOSEONG KAPYEOUNRIEUL" #x111B)
+    ("HANGUL CHOSEONG MIEUM-PIEUP" #x111C)
+    ("HANGUL CHOSEONG KAPYEOUNMIEUM" #x111D)
+    ("HANGUL CHOSEONG PIEUP-KIYEOK" #x111E)
+    ("HANGUL CHOSEONG PIEUP-NIEUN" #x111F)
+    ("HANGUL CHOSEONG PIEUP-TIKEUT" #x1120)
+    ("HANGUL CHOSEONG PIEUP-SIOS" #x1121)
+    ("HANGUL CHOSEONG PIEUP-SIOS-KIYEOK" #x1122)
+    ("HANGUL CHOSEONG PIEUP-SIOS-TIKEUT" #x1123)
+    ("HANGUL CHOSEONG PIEUP-SIOS-PIEUP" #x1124)
+    ("HANGUL CHOSEONG PIEUP-SSANGSIOS" #x1125)
+    ("HANGUL CHOSEONG PIEUP-SIOS-CIEUC" #x1126)
+    ("HANGUL CHOSEONG PIEUP-CIEUC" #x1127)
+    ("HANGUL CHOSEONG PIEUP-CHIEUCH" #x1128)
+    ("HANGUL CHOSEONG PIEUP-THIEUTH" #x1129)
+    ("HANGUL CHOSEONG PIEUP-PHIEUPH" #x112A)
+    ("HANGUL CHOSEONG KAPYEOUNPIEUP" #x112B)
+    ("HANGUL CHOSEONG KAPYEOUNSSANGPIEUP" #x112C)
+    ("HANGUL CHOSEONG SIOS-KIYEOK" #x112D)
+    ("HANGUL CHOSEONG SIOS-NIEUN" #x112E)
+    ("HANGUL CHOSEONG SIOS-TIKEUT" #x112F)
+    ("HANGUL CHOSEONG SIOS-RIEUL" #x1130)
+    ("HANGUL CHOSEONG SIOS-MIEUM" #x1131)
+    ("HANGUL CHOSEONG SIOS-PIEUP" #x1132)
+    ("HANGUL CHOSEONG SIOS-PIEUP-KIYEOK" #x1133)
+    ("HANGUL CHOSEONG SIOS-SSANGSIOS" #x1134)
+    ("HANGUL CHOSEONG SIOS-IEUNG" #x1135)
+    ("HANGUL CHOSEONG SIOS-CIEUC" #x1136)
+    ("HANGUL CHOSEONG SIOS-CHIEUCH" #x1137)
+    ("HANGUL CHOSEONG SIOS-KHIEUKH" #x1138)
+    ("HANGUL CHOSEONG SIOS-THIEUTH" #x1139)
+    ("HANGUL CHOSEONG SIOS-PHIEUPH" #x113A)
+    ("HANGUL CHOSEONG SIOS-HIEUH" #x113B)
+    ("HANGUL CHOSEONG CHITUEUMSIOS" #x113C)
+    ("HANGUL CHOSEONG CHITUEUMSSANGSIOS" #x113D)
+    ("HANGUL CHOSEONG CEONGCHIEUMSIOS" #x113E)
+    ("HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS" #x113F)
+    ("HANGUL CHOSEONG PANSIOS" #x1140)
+    ("HANGUL CHOSEONG IEUNG-KIYEOK" #x1141)
+    ("HANGUL CHOSEONG IEUNG-TIKEUT" #x1142)
+    ("HANGUL CHOSEONG IEUNG-MIEUM" #x1143)
+    ("HANGUL CHOSEONG IEUNG-PIEUP" #x1144)
+    ("HANGUL CHOSEONG IEUNG-SIOS" #x1145)
+    ("HANGUL CHOSEONG IEUNG-PANSIOS" #x1146)
+    ("HANGUL CHOSEONG SSANGIEUNG" #x1147)
+    ("HANGUL CHOSEONG IEUNG-CIEUC" #x1148)
+    ("HANGUL CHOSEONG IEUNG-CHIEUCH" #x1149)
+    ("HANGUL CHOSEONG IEUNG-THIEUTH" #x114A)
+    ("HANGUL CHOSEONG IEUNG-PHIEUPH" #x114B)
+    ("HANGUL CHOSEONG YESIEUNG" #x114C)
+    ("HANGUL CHOSEONG CIEUC-IEUNG" #x114D)
+    ("HANGUL CHOSEONG CHITUEUMCIEUC" #x114E)
+    ("HANGUL CHOSEONG CHITUEUMSSANGCIEUC" #x114F)
+    ("HANGUL CHOSEONG CEONGCHIEUMCIEUC" #x1150)
+    ("HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC" #x1151)
+    ("HANGUL CHOSEONG CHIEUCH-KHIEUKH" #x1152)
+    ("HANGUL CHOSEONG CHIEUCH-HIEUH" #x1153)
+    ("HANGUL CHOSEONG CHITUEUMCHIEUCH" #x1154)
+    ("HANGUL CHOSEONG CEONGCHIEUMCHIEUCH" #x1155)
+    ("HANGUL CHOSEONG PHIEUPH-PIEUP" #x1156)
+    ("HANGUL CHOSEONG KAPYEOUNPHIEUPH" #x1157)
+    ("HANGUL CHOSEONG SSANGHIEUH" #x1158)
+    ("HANGUL CHOSEONG YEORINHIEUH" #x1159)
+    ("HANGUL CHOSEONG FILLER" #x115F)
+    ("HANGUL JUNGSEONG FILLER" #x1160)
+    ("HANGUL JUNGSEONG A" #x1161)
+    ("HANGUL JUNGSEONG AE" #x1162)
+    ("HANGUL JUNGSEONG YA" #x1163)
+    ("HANGUL JUNGSEONG YAE" #x1164)
+    ("HANGUL JUNGSEONG EO" #x1165)
+    ("HANGUL JUNGSEONG E" #x1166)
+    ("HANGUL JUNGSEONG YEO" #x1167)
+    ("HANGUL JUNGSEONG YE" #x1168)
+    ("HANGUL JUNGSEONG O" #x1169)
+    ("HANGUL JUNGSEONG WA" #x116A)
+    ("HANGUL JUNGSEONG WAE" #x116B)
+    ("HANGUL JUNGSEONG OE" #x116C)
+    ("HANGUL JUNGSEONG YO" #x116D)
+    ("HANGUL JUNGSEONG U" #x116E)
+    ("HANGUL JUNGSEONG WEO" #x116F)
+    ("HANGUL JUNGSEONG WE" #x1170)
+    ("HANGUL JUNGSEONG WI" #x1171)
+    ("HANGUL JUNGSEONG YU" #x1172)
+    ("HANGUL JUNGSEONG EU" #x1173)
+    ("HANGUL JUNGSEONG YI" #x1174)
+    ("HANGUL JUNGSEONG I" #x1175)
+    ("HANGUL JUNGSEONG A-O" #x1176)
+    ("HANGUL JUNGSEONG A-U" #x1177)
+    ("HANGUL JUNGSEONG YA-O" #x1178)
+    ("HANGUL JUNGSEONG YA-YO" #x1179)
+    ("HANGUL JUNGSEONG EO-O" #x117A)
+    ("HANGUL JUNGSEONG EO-U" #x117B)
+    ("HANGUL JUNGSEONG EO-EU" #x117C)
+    ("HANGUL JUNGSEONG YEO-O" #x117D)
+    ("HANGUL JUNGSEONG YEO-U" #x117E)
+    ("HANGUL JUNGSEONG O-EO" #x117F)
+    ("HANGUL JUNGSEONG O-E" #x1180)
+    ("HANGUL JUNGSEONG O-YE" #x1181)
+    ("HANGUL JUNGSEONG O-O" #x1182)
+    ("HANGUL JUNGSEONG O-U" #x1183)
+    ("HANGUL JUNGSEONG YO-YA" #x1184)
+    ("HANGUL JUNGSEONG YO-YAE" #x1185)
+    ("HANGUL JUNGSEONG YO-YEO" #x1186)
+    ("HANGUL JUNGSEONG YO-O" #x1187)
+    ("HANGUL JUNGSEONG YO-I" #x1188)
+    ("HANGUL JUNGSEONG U-A" #x1189)
+    ("HANGUL JUNGSEONG U-AE" #x118A)
+    ("HANGUL JUNGSEONG U-EO-EU" #x118B)
+    ("HANGUL JUNGSEONG U-YE" #x118C)
+    ("HANGUL JUNGSEONG U-U" #x118D)
+    ("HANGUL JUNGSEONG YU-A" #x118E)
+    ("HANGUL JUNGSEONG YU-EO" #x118F)
+    ("HANGUL JUNGSEONG YU-E" #x1190)
+    ("HANGUL JUNGSEONG YU-YEO" #x1191)
+    ("HANGUL JUNGSEONG YU-YE" #x1192)
+    ("HANGUL JUNGSEONG YU-U" #x1193)
+    ("HANGUL JUNGSEONG YU-I" #x1194)
+    ("HANGUL JUNGSEONG EU-U" #x1195)
+    ("HANGUL JUNGSEONG EU-EU" #x1196)
+    ("HANGUL JUNGSEONG YI-U" #x1197)
+    ("HANGUL JUNGSEONG I-A" #x1198)
+    ("HANGUL JUNGSEONG I-YA" #x1199)
+    ("HANGUL JUNGSEONG I-O" #x119A)
+    ("HANGUL JUNGSEONG I-U" #x119B)
+    ("HANGUL JUNGSEONG I-EU" #x119C)
+    ("HANGUL JUNGSEONG I-ARAEA" #x119D)
+    ("HANGUL JUNGSEONG ARAEA" #x119E)
+    ("HANGUL JUNGSEONG ARAEA-EO" #x119F)
+    ("HANGUL JUNGSEONG ARAEA-U" #x11A0)
+    ("HANGUL JUNGSEONG ARAEA-I" #x11A1)
+    ("HANGUL JUNGSEONG SSANGARAEA" #x11A2)
+    ("HANGUL JONGSEONG KIYEOK" #x11A8)
+    ("HANGUL JONGSEONG SSANGKIYEOK" #x11A9)
+    ("HANGUL JONGSEONG KIYEOK-SIOS" #x11AA)
+    ("HANGUL JONGSEONG NIEUN" #x11AB)
+    ("HANGUL JONGSEONG NIEUN-CIEUC" #x11AC)
+    ("HANGUL JONGSEONG NIEUN-HIEUH" #x11AD)
+    ("HANGUL JONGSEONG TIKEUT" #x11AE)
+    ("HANGUL JONGSEONG RIEUL" #x11AF)
+    ("HANGUL JONGSEONG RIEUL-KIYEOK" #x11B0)
+    ("HANGUL JONGSEONG RIEUL-MIEUM" #x11B1)
+    ("HANGUL JONGSEONG RIEUL-PIEUP" #x11B2)
+    ("HANGUL JONGSEONG RIEUL-SIOS" #x11B3)
+    ("HANGUL JONGSEONG RIEUL-THIEUTH" #x11B4)
+    ("HANGUL JONGSEONG RIEUL-PHIEUPH" #x11B5)
+    ("HANGUL JONGSEONG RIEUL-HIEUH" #x11B6)
+    ("HANGUL JONGSEONG MIEUM" #x11B7)
+    ("HANGUL JONGSEONG PIEUP" #x11B8)
+    ("HANGUL JONGSEONG PIEUP-SIOS" #x11B9)
+    ("HANGUL JONGSEONG SIOS" #x11BA)
+    ("HANGUL JONGSEONG SSANGSIOS" #x11BB)
+    ("HANGUL JONGSEONG IEUNG" #x11BC)
+    ("HANGUL JONGSEONG CIEUC" #x11BD)
+    ("HANGUL JONGSEONG CHIEUCH" #x11BE)
+    ("HANGUL JONGSEONG KHIEUKH" #x11BF)
+    ("HANGUL JONGSEONG THIEUTH" #x11C0)
+    ("HANGUL JONGSEONG PHIEUPH" #x11C1)
+    ("HANGUL JONGSEONG HIEUH" #x11C2)
+    ("HANGUL JONGSEONG KIYEOK-RIEUL" #x11C3)
+    ("HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK" #x11C4)
+    ("HANGUL JONGSEONG NIEUN-KIYEOK" #x11C5)
+    ("HANGUL JONGSEONG NIEUN-TIKEUT" #x11C6)
+    ("HANGUL JONGSEONG NIEUN-SIOS" #x11C7)
+    ("HANGUL JONGSEONG NIEUN-PANSIOS" #x11C8)
+    ("HANGUL JONGSEONG NIEUN-THIEUTH" #x11C9)
+    ("HANGUL JONGSEONG TIKEUT-KIYEOK" #x11CA)
+    ("HANGUL JONGSEONG TIKEUT-RIEUL" #x11CB)
+    ("HANGUL JONGSEONG RIEUL-KIYEOK-SIOS" #x11CC)
+    ("HANGUL JONGSEONG RIEUL-NIEUN" #x11CD)
+    ("HANGUL JONGSEONG RIEUL-TIKEUT" #x11CE)
+    ("HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH" #x11CF)
+    ("HANGUL JONGSEONG SSANGRIEUL" #x11D0)
+    ("HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK" #x11D1)
+    ("HANGUL JONGSEONG RIEUL-MIEUM-SIOS" #x11D2)
+    ("HANGUL JONGSEONG RIEUL-PIEUP-SIOS" #x11D3)
+    ("HANGUL JONGSEONG RIEUL-PIEUP-HIEUH" #x11D4)
+    ("HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP" #x11D5)
+    ("HANGUL JONGSEONG RIEUL-SSANGSIOS" #x11D6)
+    ("HANGUL JONGSEONG RIEUL-PANSIOS" #x11D7)
+    ("HANGUL JONGSEONG RIEUL-KHIEUKH" #x11D8)
+    ("HANGUL JONGSEONG RIEUL-YEORINHIEUH" #x11D9)
+    ("HANGUL JONGSEONG MIEUM-KIYEOK" #x11DA)
+    ("HANGUL JONGSEONG MIEUM-RIEUL" #x11DB)
+    ("HANGUL JONGSEONG MIEUM-PIEUP" #x11DC)
+    ("HANGUL JONGSEONG MIEUM-SIOS" #x11DD)
+    ("HANGUL JONGSEONG MIEUM-SSANGSIOS" #x11DE)
+    ("HANGUL JONGSEONG MIEUM-PANSIOS" #x11DF)
+    ("HANGUL JONGSEONG MIEUM-CHIEUCH" #x11E0)
+    ("HANGUL JONGSEONG MIEUM-HIEUH" #x11E1)
+    ("HANGUL JONGSEONG KAPYEOUNMIEUM" #x11E2)
+    ("HANGUL JONGSEONG PIEUP-RIEUL" #x11E3)
+    ("HANGUL JONGSEONG PIEUP-PHIEUPH" #x11E4)
+    ("HANGUL JONGSEONG PIEUP-HIEUH" #x11E5)
+    ("HANGUL JONGSEONG KAPYEOUNPIEUP" #x11E6)
+    ("HANGUL JONGSEONG SIOS-KIYEOK" #x11E7)
+    ("HANGUL JONGSEONG SIOS-TIKEUT" #x11E8)
+    ("HANGUL JONGSEONG SIOS-RIEUL" #x11E9)
+    ("HANGUL JONGSEONG SIOS-PIEUP" #x11EA)
+    ("HANGUL JONGSEONG PANSIOS" #x11EB)
+    ("HANGUL JONGSEONG IEUNG-KIYEOK" #x11EC)
+    ("HANGUL JONGSEONG IEUNG-SSANGKIYEOK" #x11ED)
+    ("HANGUL JONGSEONG SSANGIEUNG" #x11EE)
+    ("HANGUL JONGSEONG IEUNG-KHIEUKH" #x11EF)
+    ("HANGUL JONGSEONG YESIEUNG" #x11F0)
+    ("HANGUL JONGSEONG YESIEUNG-SIOS" #x11F1)
+    ("HANGUL JONGSEONG YESIEUNG-PANSIOS" #x11F2)
+    ("HANGUL JONGSEONG PHIEUPH-PIEUP" #x11F3)
+    ("HANGUL JONGSEONG KAPYEOUNPHIEUPH" #x11F4)
+    ("HANGUL JONGSEONG HIEUH-NIEUN" #x11F5)
+    ("HANGUL JONGSEONG HIEUH-RIEUL" #x11F6)
+    ("HANGUL JONGSEONG HIEUH-MIEUM" #x11F7)
+    ("HANGUL JONGSEONG HIEUH-PIEUP" #x11F8)
+    ("HANGUL JONGSEONG YEORINHIEUH" #x11F9)
+    ))
+
+;; arch-tag: e631a2ad-7d7e-4a86-89f0-e6e4f7db5f39
diff --git a/etc/nxml/01200-0137F.el b/etc/nxml/01200-0137F.el
new file mode 100644 (file)
index 0000000..26a5a3a
--- /dev/null
@@ -0,0 +1,349 @@
+(nxml-define-char-name-set 'ethiopic
+  '(("ETHIOPIC SYLLABLE HA" #x1200)
+    ("ETHIOPIC SYLLABLE HU" #x1201)
+    ("ETHIOPIC SYLLABLE HI" #x1202)
+    ("ETHIOPIC SYLLABLE HAA" #x1203)
+    ("ETHIOPIC SYLLABLE HEE" #x1204)
+    ("ETHIOPIC SYLLABLE HE" #x1205)
+    ("ETHIOPIC SYLLABLE HO" #x1206)
+    ("ETHIOPIC SYLLABLE LA" #x1208)
+    ("ETHIOPIC SYLLABLE LU" #x1209)
+    ("ETHIOPIC SYLLABLE LI" #x120A)
+    ("ETHIOPIC SYLLABLE LAA" #x120B)
+    ("ETHIOPIC SYLLABLE LEE" #x120C)
+    ("ETHIOPIC SYLLABLE LE" #x120D)
+    ("ETHIOPIC SYLLABLE LO" #x120E)
+    ("ETHIOPIC SYLLABLE LWA" #x120F)
+    ("ETHIOPIC SYLLABLE HHA" #x1210)
+    ("ETHIOPIC SYLLABLE HHU" #x1211)
+    ("ETHIOPIC SYLLABLE HHI" #x1212)
+    ("ETHIOPIC SYLLABLE HHAA" #x1213)
+    ("ETHIOPIC SYLLABLE HHEE" #x1214)
+    ("ETHIOPIC SYLLABLE HHE" #x1215)
+    ("ETHIOPIC SYLLABLE HHO" #x1216)
+    ("ETHIOPIC SYLLABLE HHWA" #x1217)
+    ("ETHIOPIC SYLLABLE MA" #x1218)
+    ("ETHIOPIC SYLLABLE MU" #x1219)
+    ("ETHIOPIC SYLLABLE MI" #x121A)
+    ("ETHIOPIC SYLLABLE MAA" #x121B)
+    ("ETHIOPIC SYLLABLE MEE" #x121C)
+    ("ETHIOPIC SYLLABLE ME" #x121D)
+    ("ETHIOPIC SYLLABLE MO" #x121E)
+    ("ETHIOPIC SYLLABLE MWA" #x121F)
+    ("ETHIOPIC SYLLABLE SZA" #x1220)
+    ("ETHIOPIC SYLLABLE SZU" #x1221)
+    ("ETHIOPIC SYLLABLE SZI" #x1222)
+    ("ETHIOPIC SYLLABLE SZAA" #x1223)
+    ("ETHIOPIC SYLLABLE SZEE" #x1224)
+    ("ETHIOPIC SYLLABLE SZE" #x1225)
+    ("ETHIOPIC SYLLABLE SZO" #x1226)
+    ("ETHIOPIC SYLLABLE SZWA" #x1227)
+    ("ETHIOPIC SYLLABLE RA" #x1228)
+    ("ETHIOPIC SYLLABLE RU" #x1229)
+    ("ETHIOPIC SYLLABLE RI" #x122A)
+    ("ETHIOPIC SYLLABLE RAA" #x122B)
+    ("ETHIOPIC SYLLABLE REE" #x122C)
+    ("ETHIOPIC SYLLABLE RE" #x122D)
+    ("ETHIOPIC SYLLABLE RO" #x122E)
+    ("ETHIOPIC SYLLABLE RWA" #x122F)
+    ("ETHIOPIC SYLLABLE SA" #x1230)
+    ("ETHIOPIC SYLLABLE SU" #x1231)
+    ("ETHIOPIC SYLLABLE SI" #x1232)
+    ("ETHIOPIC SYLLABLE SAA" #x1233)
+    ("ETHIOPIC SYLLABLE SEE" #x1234)
+    ("ETHIOPIC SYLLABLE SE" #x1235)
+    ("ETHIOPIC SYLLABLE SO" #x1236)
+    ("ETHIOPIC SYLLABLE SWA" #x1237)
+    ("ETHIOPIC SYLLABLE SHA" #x1238)
+    ("ETHIOPIC SYLLABLE SHU" #x1239)
+    ("ETHIOPIC SYLLABLE SHI" #x123A)
+    ("ETHIOPIC SYLLABLE SHAA" #x123B)
+    ("ETHIOPIC SYLLABLE SHEE" #x123C)
+    ("ETHIOPIC SYLLABLE SHE" #x123D)
+    ("ETHIOPIC SYLLABLE SHO" #x123E)
+    ("ETHIOPIC SYLLABLE SHWA" #x123F)
+    ("ETHIOPIC SYLLABLE QA" #x1240)
+    ("ETHIOPIC SYLLABLE QU" #x1241)
+    ("ETHIOPIC SYLLABLE QI" #x1242)
+    ("ETHIOPIC SYLLABLE QAA" #x1243)
+    ("ETHIOPIC SYLLABLE QEE" #x1244)
+    ("ETHIOPIC SYLLABLE QE" #x1245)
+    ("ETHIOPIC SYLLABLE QO" #x1246)
+    ("ETHIOPIC SYLLABLE QWA" #x1248)
+    ("ETHIOPIC SYLLABLE QWI" #x124A)
+    ("ETHIOPIC SYLLABLE QWAA" #x124B)
+    ("ETHIOPIC SYLLABLE QWEE" #x124C)
+    ("ETHIOPIC SYLLABLE QWE" #x124D)
+    ("ETHIOPIC SYLLABLE QHA" #x1250)
+    ("ETHIOPIC SYLLABLE QHU" #x1251)
+    ("ETHIOPIC SYLLABLE QHI" #x1252)
+    ("ETHIOPIC SYLLABLE QHAA" #x1253)
+    ("ETHIOPIC SYLLABLE QHEE" #x1254)
+    ("ETHIOPIC SYLLABLE QHE" #x1255)
+    ("ETHIOPIC SYLLABLE QHO" #x1256)
+    ("ETHIOPIC SYLLABLE QHWA" #x1258)
+    ("ETHIOPIC SYLLABLE QHWI" #x125A)
+    ("ETHIOPIC SYLLABLE QHWAA" #x125B)
+    ("ETHIOPIC SYLLABLE QHWEE" #x125C)
+    ("ETHIOPIC SYLLABLE QHWE" #x125D)
+    ("ETHIOPIC SYLLABLE BA" #x1260)
+    ("ETHIOPIC SYLLABLE BU" #x1261)
+    ("ETHIOPIC SYLLABLE BI" #x1262)
+    ("ETHIOPIC SYLLABLE BAA" #x1263)
+    ("ETHIOPIC SYLLABLE BEE" #x1264)
+    ("ETHIOPIC SYLLABLE BE" #x1265)
+    ("ETHIOPIC SYLLABLE BO" #x1266)
+    ("ETHIOPIC SYLLABLE BWA" #x1267)
+    ("ETHIOPIC SYLLABLE VA" #x1268)
+    ("ETHIOPIC SYLLABLE VU" #x1269)
+    ("ETHIOPIC SYLLABLE VI" #x126A)
+    ("ETHIOPIC SYLLABLE VAA" #x126B)
+    ("ETHIOPIC SYLLABLE VEE" #x126C)
+    ("ETHIOPIC SYLLABLE VE" #x126D)
+    ("ETHIOPIC SYLLABLE VO" #x126E)
+    ("ETHIOPIC SYLLABLE VWA" #x126F)
+    ("ETHIOPIC SYLLABLE TA" #x1270)
+    ("ETHIOPIC SYLLABLE TU" #x1271)
+    ("ETHIOPIC SYLLABLE TI" #x1272)
+    ("ETHIOPIC SYLLABLE TAA" #x1273)
+    ("ETHIOPIC SYLLABLE TEE" #x1274)
+    ("ETHIOPIC SYLLABLE TE" #x1275)
+    ("ETHIOPIC SYLLABLE TO" #x1276)
+    ("ETHIOPIC SYLLABLE TWA" #x1277)
+    ("ETHIOPIC SYLLABLE CA" #x1278)
+    ("ETHIOPIC SYLLABLE CU" #x1279)
+    ("ETHIOPIC SYLLABLE CI" #x127A)
+    ("ETHIOPIC SYLLABLE CAA" #x127B)
+    ("ETHIOPIC SYLLABLE CEE" #x127C)
+    ("ETHIOPIC SYLLABLE CE" #x127D)
+    ("ETHIOPIC SYLLABLE CO" #x127E)
+    ("ETHIOPIC SYLLABLE CWA" #x127F)
+    ("ETHIOPIC SYLLABLE XA" #x1280)
+    ("ETHIOPIC SYLLABLE XU" #x1281)
+    ("ETHIOPIC SYLLABLE XI" #x1282)
+    ("ETHIOPIC SYLLABLE XAA" #x1283)
+    ("ETHIOPIC SYLLABLE XEE" #x1284)
+    ("ETHIOPIC SYLLABLE XE" #x1285)
+    ("ETHIOPIC SYLLABLE XO" #x1286)
+    ("ETHIOPIC SYLLABLE XWA" #x1288)
+    ("ETHIOPIC SYLLABLE XWI" #x128A)
+    ("ETHIOPIC SYLLABLE XWAA" #x128B)
+    ("ETHIOPIC SYLLABLE XWEE" #x128C)
+    ("ETHIOPIC SYLLABLE XWE" #x128D)
+    ("ETHIOPIC SYLLABLE NA" #x1290)
+    ("ETHIOPIC SYLLABLE NU" #x1291)
+    ("ETHIOPIC SYLLABLE NI" #x1292)
+    ("ETHIOPIC SYLLABLE NAA" #x1293)
+    ("ETHIOPIC SYLLABLE NEE" #x1294)
+    ("ETHIOPIC SYLLABLE NE" #x1295)
+    ("ETHIOPIC SYLLABLE NO" #x1296)
+    ("ETHIOPIC SYLLABLE NWA" #x1297)
+    ("ETHIOPIC SYLLABLE NYA" #x1298)
+    ("ETHIOPIC SYLLABLE NYU" #x1299)
+    ("ETHIOPIC SYLLABLE NYI" #x129A)
+    ("ETHIOPIC SYLLABLE NYAA" #x129B)
+    ("ETHIOPIC SYLLABLE NYEE" #x129C)
+    ("ETHIOPIC SYLLABLE NYE" #x129D)
+    ("ETHIOPIC SYLLABLE NYO" #x129E)
+    ("ETHIOPIC SYLLABLE NYWA" #x129F)
+    ("ETHIOPIC SYLLABLE GLOTTAL A" #x12A0)
+    ("ETHIOPIC SYLLABLE GLOTTAL U" #x12A1)
+    ("ETHIOPIC SYLLABLE GLOTTAL I" #x12A2)
+    ("ETHIOPIC SYLLABLE GLOTTAL AA" #x12A3)
+    ("ETHIOPIC SYLLABLE GLOTTAL EE" #x12A4)
+    ("ETHIOPIC SYLLABLE GLOTTAL E" #x12A5)
+    ("ETHIOPIC SYLLABLE GLOTTAL O" #x12A6)
+    ("ETHIOPIC SYLLABLE GLOTTAL WA" #x12A7)
+    ("ETHIOPIC SYLLABLE KA" #x12A8)
+    ("ETHIOPIC SYLLABLE KU" #x12A9)
+    ("ETHIOPIC SYLLABLE KI" #x12AA)
+    ("ETHIOPIC SYLLABLE KAA" #x12AB)
+    ("ETHIOPIC SYLLABLE KEE" #x12AC)
+    ("ETHIOPIC SYLLABLE KE" #x12AD)
+    ("ETHIOPIC SYLLABLE KO" #x12AE)
+    ("ETHIOPIC SYLLABLE KWA" #x12B0)
+    ("ETHIOPIC SYLLABLE KWI" #x12B2)
+    ("ETHIOPIC SYLLABLE KWAA" #x12B3)
+    ("ETHIOPIC SYLLABLE KWEE" #x12B4)
+    ("ETHIOPIC SYLLABLE KWE" #x12B5)
+    ("ETHIOPIC SYLLABLE KXA" #x12B8)
+    ("ETHIOPIC SYLLABLE KXU" #x12B9)
+    ("ETHIOPIC SYLLABLE KXI" #x12BA)
+    ("ETHIOPIC SYLLABLE KXAA" #x12BB)
+    ("ETHIOPIC SYLLABLE KXEE" #x12BC)
+    ("ETHIOPIC SYLLABLE KXE" #x12BD)
+    ("ETHIOPIC SYLLABLE KXO" #x12BE)
+    ("ETHIOPIC SYLLABLE KXWA" #x12C0)
+    ("ETHIOPIC SYLLABLE KXWI" #x12C2)
+    ("ETHIOPIC SYLLABLE KXWAA" #x12C3)
+    ("ETHIOPIC SYLLABLE KXWEE" #x12C4)
+    ("ETHIOPIC SYLLABLE KXWE" #x12C5)
+    ("ETHIOPIC SYLLABLE WA" #x12C8)
+    ("ETHIOPIC SYLLABLE WU" #x12C9)
+    ("ETHIOPIC SYLLABLE WI" #x12CA)
+    ("ETHIOPIC SYLLABLE WAA" #x12CB)
+    ("ETHIOPIC SYLLABLE WEE" #x12CC)
+    ("ETHIOPIC SYLLABLE WE" #x12CD)
+    ("ETHIOPIC SYLLABLE WO" #x12CE)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL A" #x12D0)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL U" #x12D1)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL I" #x12D2)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL AA" #x12D3)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL EE" #x12D4)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL E" #x12D5)
+    ("ETHIOPIC SYLLABLE PHARYNGEAL O" #x12D6)
+    ("ETHIOPIC SYLLABLE ZA" #x12D8)
+    ("ETHIOPIC SYLLABLE ZU" #x12D9)
+    ("ETHIOPIC SYLLABLE ZI" #x12DA)
+    ("ETHIOPIC SYLLABLE ZAA" #x12DB)
+    ("ETHIOPIC SYLLABLE ZEE" #x12DC)
+    ("ETHIOPIC SYLLABLE ZE" #x12DD)
+    ("ETHIOPIC SYLLABLE ZO" #x12DE)
+    ("ETHIOPIC SYLLABLE ZWA" #x12DF)
+    ("ETHIOPIC SYLLABLE ZHA" #x12E0)
+    ("ETHIOPIC SYLLABLE ZHU" #x12E1)
+    ("ETHIOPIC SYLLABLE ZHI" #x12E2)
+    ("ETHIOPIC SYLLABLE ZHAA" #x12E3)
+    ("ETHIOPIC SYLLABLE ZHEE" #x12E4)
+    ("ETHIOPIC SYLLABLE ZHE" #x12E5)
+    ("ETHIOPIC SYLLABLE ZHO" #x12E6)
+    ("ETHIOPIC SYLLABLE ZHWA" #x12E7)
+    ("ETHIOPIC SYLLABLE YA" #x12E8)
+    ("ETHIOPIC SYLLABLE YU" #x12E9)
+    ("ETHIOPIC SYLLABLE YI" #x12EA)
+    ("ETHIOPIC SYLLABLE YAA" #x12EB)
+    ("ETHIOPIC SYLLABLE YEE" #x12EC)
+    ("ETHIOPIC SYLLABLE YE" #x12ED)
+    ("ETHIOPIC SYLLABLE YO" #x12EE)
+    ("ETHIOPIC SYLLABLE DA" #x12F0)
+    ("ETHIOPIC SYLLABLE DU" #x12F1)
+    ("ETHIOPIC SYLLABLE DI" #x12F2)
+    ("ETHIOPIC SYLLABLE DAA" #x12F3)
+    ("ETHIOPIC SYLLABLE DEE" #x12F4)
+    ("ETHIOPIC SYLLABLE DE" #x12F5)
+    ("ETHIOPIC SYLLABLE DO" #x12F6)
+    ("ETHIOPIC SYLLABLE DWA" #x12F7)
+    ("ETHIOPIC SYLLABLE DDA" #x12F8)
+    ("ETHIOPIC SYLLABLE DDU" #x12F9)
+    ("ETHIOPIC SYLLABLE DDI" #x12FA)
+    ("ETHIOPIC SYLLABLE DDAA" #x12FB)
+    ("ETHIOPIC SYLLABLE DDEE" #x12FC)
+    ("ETHIOPIC SYLLABLE DDE" #x12FD)
+    ("ETHIOPIC SYLLABLE DDO" #x12FE)
+    ("ETHIOPIC SYLLABLE DDWA" #x12FF)
+    ("ETHIOPIC SYLLABLE JA" #x1300)
+    ("ETHIOPIC SYLLABLE JU" #x1301)
+    ("ETHIOPIC SYLLABLE JI" #x1302)
+    ("ETHIOPIC SYLLABLE JAA" #x1303)
+    ("ETHIOPIC SYLLABLE JEE" #x1304)
+    ("ETHIOPIC SYLLABLE JE" #x1305)
+    ("ETHIOPIC SYLLABLE JO" #x1306)
+    ("ETHIOPIC SYLLABLE JWA" #x1307)
+    ("ETHIOPIC SYLLABLE GA" #x1308)
+    ("ETHIOPIC SYLLABLE GU" #x1309)
+    ("ETHIOPIC SYLLABLE GI" #x130A)
+    ("ETHIOPIC SYLLABLE GAA" #x130B)
+    ("ETHIOPIC SYLLABLE GEE" #x130C)
+    ("ETHIOPIC SYLLABLE GE" #x130D)
+    ("ETHIOPIC SYLLABLE GO" #x130E)
+    ("ETHIOPIC SYLLABLE GWA" #x1310)
+    ("ETHIOPIC SYLLABLE GWI" #x1312)
+    ("ETHIOPIC SYLLABLE GWAA" #x1313)
+    ("ETHIOPIC SYLLABLE GWEE" #x1314)
+    ("ETHIOPIC SYLLABLE GWE" #x1315)
+    ("ETHIOPIC SYLLABLE GGA" #x1318)
+    ("ETHIOPIC SYLLABLE GGU" #x1319)
+    ("ETHIOPIC SYLLABLE GGI" #x131A)
+    ("ETHIOPIC SYLLABLE GGAA" #x131B)
+    ("ETHIOPIC SYLLABLE GGEE" #x131C)
+    ("ETHIOPIC SYLLABLE GGE" #x131D)
+    ("ETHIOPIC SYLLABLE GGO" #x131E)
+    ("ETHIOPIC SYLLABLE THA" #x1320)
+    ("ETHIOPIC SYLLABLE THU" #x1321)
+    ("ETHIOPIC SYLLABLE THI" #x1322)
+    ("ETHIOPIC SYLLABLE THAA" #x1323)
+    ("ETHIOPIC SYLLABLE THEE" #x1324)
+    ("ETHIOPIC SYLLABLE THE" #x1325)
+    ("ETHIOPIC SYLLABLE THO" #x1326)
+    ("ETHIOPIC SYLLABLE THWA" #x1327)
+    ("ETHIOPIC SYLLABLE CHA" #x1328)
+    ("ETHIOPIC SYLLABLE CHU" #x1329)
+    ("ETHIOPIC SYLLABLE CHI" #x132A)
+    ("ETHIOPIC SYLLABLE CHAA" #x132B)
+    ("ETHIOPIC SYLLABLE CHEE" #x132C)
+    ("ETHIOPIC SYLLABLE CHE" #x132D)
+    ("ETHIOPIC SYLLABLE CHO" #x132E)
+    ("ETHIOPIC SYLLABLE CHWA" #x132F)
+    ("ETHIOPIC SYLLABLE PHA" #x1330)
+    ("ETHIOPIC SYLLABLE PHU" #x1331)
+    ("ETHIOPIC SYLLABLE PHI" #x1332)
+    ("ETHIOPIC SYLLABLE PHAA" #x1333)
+    ("ETHIOPIC SYLLABLE PHEE" #x1334)
+    ("ETHIOPIC SYLLABLE PHE" #x1335)
+    ("ETHIOPIC SYLLABLE PHO" #x1336)
+    ("ETHIOPIC SYLLABLE PHWA" #x1337)
+    ("ETHIOPIC SYLLABLE TSA" #x1338)
+    ("ETHIOPIC SYLLABLE TSU" #x1339)
+    ("ETHIOPIC SYLLABLE TSI" #x133A)
+    ("ETHIOPIC SYLLABLE TSAA" #x133B)
+    ("ETHIOPIC SYLLABLE TSEE" #x133C)
+    ("ETHIOPIC SYLLABLE TSE" #x133D)
+    ("ETHIOPIC SYLLABLE TSO" #x133E)
+    ("ETHIOPIC SYLLABLE TSWA" #x133F)
+    ("ETHIOPIC SYLLABLE TZA" #x1340)
+    ("ETHIOPIC SYLLABLE TZU" #x1341)
+    ("ETHIOPIC SYLLABLE TZI" #x1342)
+    ("ETHIOPIC SYLLABLE TZAA" #x1343)
+    ("ETHIOPIC SYLLABLE TZEE" #x1344)
+    ("ETHIOPIC SYLLABLE TZE" #x1345)
+    ("ETHIOPIC SYLLABLE TZO" #x1346)
+    ("ETHIOPIC SYLLABLE FA" #x1348)
+    ("ETHIOPIC SYLLABLE FU" #x1349)
+    ("ETHIOPIC SYLLABLE FI" #x134A)
+    ("ETHIOPIC SYLLABLE FAA" #x134B)
+    ("ETHIOPIC SYLLABLE FEE" #x134C)
+    ("ETHIOPIC SYLLABLE FE" #x134D)
+    ("ETHIOPIC SYLLABLE FO" #x134E)
+    ("ETHIOPIC SYLLABLE FWA" #x134F)
+    ("ETHIOPIC SYLLABLE PA" #x1350)
+    ("ETHIOPIC SYLLABLE PU" #x1351)
+    ("ETHIOPIC SYLLABLE PI" #x1352)
+    ("ETHIOPIC SYLLABLE PAA" #x1353)
+    ("ETHIOPIC SYLLABLE PEE" #x1354)
+    ("ETHIOPIC SYLLABLE PE" #x1355)
+    ("ETHIOPIC SYLLABLE PO" #x1356)
+    ("ETHIOPIC SYLLABLE PWA" #x1357)
+    ("ETHIOPIC SYLLABLE RYA" #x1358)
+    ("ETHIOPIC SYLLABLE MYA" #x1359)
+    ("ETHIOPIC SYLLABLE FYA" #x135A)
+    ("ETHIOPIC WORDSPACE" #x1361)
+    ("ETHIOPIC FULL STOP" #x1362)
+    ("ETHIOPIC COMMA" #x1363)
+    ("ETHIOPIC SEMICOLON" #x1364)
+    ("ETHIOPIC COLON" #x1365)
+    ("ETHIOPIC PREFACE COLON" #x1366)
+    ("ETHIOPIC QUESTION MARK" #x1367)
+    ("ETHIOPIC PARAGRAPH SEPARATOR" #x1368)
+    ("ETHIOPIC DIGIT ONE" #x1369)
+    ("ETHIOPIC DIGIT TWO" #x136A)
+    ("ETHIOPIC DIGIT THREE" #x136B)
+    ("ETHIOPIC DIGIT FOUR" #x136C)
+    ("ETHIOPIC DIGIT FIVE" #x136D)
+    ("ETHIOPIC DIGIT SIX" #x136E)
+    ("ETHIOPIC DIGIT SEVEN" #x136F)
+    ("ETHIOPIC DIGIT EIGHT" #x1370)
+    ("ETHIOPIC DIGIT NINE" #x1371)
+    ("ETHIOPIC NUMBER TEN" #x1372)
+    ("ETHIOPIC NUMBER TWENTY" #x1373)
+    ("ETHIOPIC NUMBER THIRTY" #x1374)
+    ("ETHIOPIC NUMBER FORTY" #x1375)
+    ("ETHIOPIC NUMBER FIFTY" #x1376)
+    ("ETHIOPIC NUMBER SIXTY" #x1377)
+    ("ETHIOPIC NUMBER SEVENTY" #x1378)
+    ("ETHIOPIC NUMBER EIGHTY" #x1379)
+    ("ETHIOPIC NUMBER NINETY" #x137A)
+    ("ETHIOPIC NUMBER HUNDRED" #x137B)
+    ("ETHIOPIC NUMBER TEN THOUSAND" #x137C)
+    ))
+
+;; arch-tag: a34092f4-c605-4c01-b619-222a1241853d
diff --git a/etc/nxml/013A0-013FF.el b/etc/nxml/013A0-013FF.el
new file mode 100644 (file)
index 0000000..e3fd669
--- /dev/null
@@ -0,0 +1,89 @@
+(nxml-define-char-name-set 'cherokee
+  '(("CHEROKEE LETTER A" #x13A0)
+    ("CHEROKEE LETTER E" #x13A1)
+    ("CHEROKEE LETTER I" #x13A2)
+    ("CHEROKEE LETTER O" #x13A3)
+    ("CHEROKEE LETTER U" #x13A4)
+    ("CHEROKEE LETTER V" #x13A5)
+    ("CHEROKEE LETTER GA" #x13A6)
+    ("CHEROKEE LETTER KA" #x13A7)
+    ("CHEROKEE LETTER GE" #x13A8)
+    ("CHEROKEE LETTER GI" #x13A9)
+    ("CHEROKEE LETTER GO" #x13AA)
+    ("CHEROKEE LETTER GU" #x13AB)
+    ("CHEROKEE LETTER GV" #x13AC)
+    ("CHEROKEE LETTER HA" #x13AD)
+    ("CHEROKEE LETTER HE" #x13AE)
+    ("CHEROKEE LETTER HI" #x13AF)
+    ("CHEROKEE LETTER HO" #x13B0)
+    ("CHEROKEE LETTER HU" #x13B1)
+    ("CHEROKEE LETTER HV" #x13B2)
+    ("CHEROKEE LETTER LA" #x13B3)
+    ("CHEROKEE LETTER LE" #x13B4)
+    ("CHEROKEE LETTER LI" #x13B5)
+    ("CHEROKEE LETTER LO" #x13B6)
+    ("CHEROKEE LETTER LU" #x13B7)
+    ("CHEROKEE LETTER LV" #x13B8)
+    ("CHEROKEE LETTER MA" #x13B9)
+    ("CHEROKEE LETTER ME" #x13BA)
+    ("CHEROKEE LETTER MI" #x13BB)
+    ("CHEROKEE LETTER MO" #x13BC)
+    ("CHEROKEE LETTER MU" #x13BD)
+    ("CHEROKEE LETTER NA" #x13BE)
+    ("CHEROKEE LETTER HNA" #x13BF)
+    ("CHEROKEE LETTER NAH" #x13C0)
+    ("CHEROKEE LETTER NE" #x13C1)
+    ("CHEROKEE LETTER NI" #x13C2)
+    ("CHEROKEE LETTER NO" #x13C3)
+    ("CHEROKEE LETTER NU" #x13C4)
+    ("CHEROKEE LETTER NV" #x13C5)
+    ("CHEROKEE LETTER QUA" #x13C6)
+    ("CHEROKEE LETTER QUE" #x13C7)
+    ("CHEROKEE LETTER QUI" #x13C8)
+    ("CHEROKEE LETTER QUO" #x13C9)
+    ("CHEROKEE LETTER QUU" #x13CA)
+    ("CHEROKEE LETTER QUV" #x13CB)
+    ("CHEROKEE LETTER SA" #x13CC)
+    ("CHEROKEE LETTER S" #x13CD)
+    ("CHEROKEE LETTER SE" #x13CE)
+    ("CHEROKEE LETTER SI" #x13CF)
+    ("CHEROKEE LETTER SO" #x13D0)
+    ("CHEROKEE LETTER SU" #x13D1)
+    ("CHEROKEE LETTER SV" #x13D2)
+    ("CHEROKEE LETTER DA" #x13D3)
+    ("CHEROKEE LETTER TA" #x13D4)
+    ("CHEROKEE LETTER DE" #x13D5)
+    ("CHEROKEE LETTER TE" #x13D6)
+    ("CHEROKEE LETTER DI" #x13D7)
+    ("CHEROKEE LETTER TI" #x13D8)
+    ("CHEROKEE LETTER DO" #x13D9)
+    ("CHEROKEE LETTER DU" #x13DA)
+    ("CHEROKEE LETTER DV" #x13DB)
+    ("CHEROKEE LETTER DLA" #x13DC)
+    ("CHEROKEE LETTER TLA" #x13DD)
+    ("CHEROKEE LETTER TLE" #x13DE)
+    ("CHEROKEE LETTER TLI" #x13DF)
+    ("CHEROKEE LETTER TLO" #x13E0)
+    ("CHEROKEE LETTER TLU" #x13E1)
+    ("CHEROKEE LETTER TLV" #x13E2)
+    ("CHEROKEE LETTER TSA" #x13E3)
+    ("CHEROKEE LETTER TSE" #x13E4)
+    ("CHEROKEE LETTER TSI" #x13E5)
+    ("CHEROKEE LETTER TSO" #x13E6)
+    ("CHEROKEE LETTER TSU" #x13E7)
+    ("CHEROKEE LETTER TSV" #x13E8)
+    ("CHEROKEE LETTER WA" #x13E9)
+    ("CHEROKEE LETTER WE" #x13EA)
+    ("CHEROKEE LETTER WI" #x13EB)
+    ("CHEROKEE LETTER WO" #x13EC)
+    ("CHEROKEE LETTER WU" #x13ED)
+    ("CHEROKEE LETTER WV" #x13EE)
+    ("CHEROKEE LETTER YA" #x13EF)
+    ("CHEROKEE LETTER YE" #x13F0)
+    ("CHEROKEE LETTER YI" #x13F1)
+    ("CHEROKEE LETTER YO" #x13F2)
+    ("CHEROKEE LETTER YU" #x13F3)
+    ("CHEROKEE LETTER YV" #x13F4)
+    ))
+
+;; arch-tag: 42d669f3-aa0a-4b38-8f60-c1bf05b0d8be
diff --git a/etc/nxml/01400-0167F.el b/etc/nxml/01400-0167F.el
new file mode 100644 (file)
index 0000000..1dfce26
--- /dev/null
@@ -0,0 +1,634 @@
+(nxml-define-char-name-set 'unified-canadian-aboriginal-syllabics
+  '(("CANADIAN SYLLABICS E" #x1401)
+    ("CANADIAN SYLLABICS AAI" #x1402)
+    ("CANADIAN SYLLABICS I" #x1403)
+    ("CANADIAN SYLLABICS II" #x1404)
+    ("CANADIAN SYLLABICS O" #x1405)
+    ("CANADIAN SYLLABICS OO" #x1406)
+    ("CANADIAN SYLLABICS Y-CREE OO" #x1407)
+    ("CANADIAN SYLLABICS CARRIER EE" #x1408)
+    ("CANADIAN SYLLABICS CARRIER I" #x1409)
+    ("CANADIAN SYLLABICS A" #x140A)
+    ("CANADIAN SYLLABICS AA" #x140B)
+    ("CANADIAN SYLLABICS WE" #x140C)
+    ("CANADIAN SYLLABICS WEST-CREE WE" #x140D)
+    ("CANADIAN SYLLABICS WI" #x140E)
+    ("CANADIAN SYLLABICS WEST-CREE WI" #x140F)
+    ("CANADIAN SYLLABICS WII" #x1410)
+    ("CANADIAN SYLLABICS WEST-CREE WII" #x1411)
+    ("CANADIAN SYLLABICS WO" #x1412)
+    ("CANADIAN SYLLABICS WEST-CREE WO" #x1413)
+    ("CANADIAN SYLLABICS WOO" #x1414)
+    ("CANADIAN SYLLABICS WEST-CREE WOO" #x1415)
+    ("CANADIAN SYLLABICS NASKAPI WOO" #x1416)
+    ("CANADIAN SYLLABICS WA" #x1417)
+    ("CANADIAN SYLLABICS WEST-CREE WA" #x1418)
+    ("CANADIAN SYLLABICS WAA" #x1419)
+    ("CANADIAN SYLLABICS WEST-CREE WAA" #x141A)
+    ("CANADIAN SYLLABICS NASKAPI WAA" #x141B)
+    ("CANADIAN SYLLABICS AI" #x141C)
+    ("CANADIAN SYLLABICS Y-CREE W" #x141D)
+    ("CANADIAN SYLLABICS GLOTTAL STOP" #x141E)
+    ("CANADIAN SYLLABICS FINAL ACUTE" #x141F)
+    ("CANADIAN SYLLABICS FINAL GRAVE" #x1420)
+    ("CANADIAN SYLLABICS FINAL BOTTOM HALF RING" #x1421)
+    ("CANADIAN SYLLABICS FINAL TOP HALF RING" #x1422)
+    ("CANADIAN SYLLABICS FINAL RIGHT HALF RING" #x1423)
+    ("CANADIAN SYLLABICS FINAL RING" #x1424)
+    ("CANADIAN SYLLABICS FINAL DOUBLE ACUTE" #x1425)
+    ("CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES" #x1426)
+    ("CANADIAN SYLLABICS FINAL MIDDLE DOT" #x1427)
+    ("CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE" #x1428)
+    ("CANADIAN SYLLABICS FINAL PLUS" #x1429)
+    ("CANADIAN SYLLABICS FINAL DOWN TACK" #x142A)
+    ("CANADIAN SYLLABICS EN" #x142B)
+    ("CANADIAN SYLLABICS IN" #x142C)
+    ("CANADIAN SYLLABICS ON" #x142D)
+    ("CANADIAN SYLLABICS AN" #x142E)
+    ("CANADIAN SYLLABICS PE" #x142F)
+    ("CANADIAN SYLLABICS PAAI" #x1430)
+    ("CANADIAN SYLLABICS PI" #x1431)
+    ("CANADIAN SYLLABICS PII" #x1432)
+    ("CANADIAN SYLLABICS PO" #x1433)
+    ("CANADIAN SYLLABICS POO" #x1434)
+    ("CANADIAN SYLLABICS Y-CREE POO" #x1435)
+    ("CANADIAN SYLLABICS CARRIER HEE" #x1436)
+    ("CANADIAN SYLLABICS CARRIER HI" #x1437)
+    ("CANADIAN SYLLABICS PA" #x1438)
+    ("CANADIAN SYLLABICS PAA" #x1439)
+    ("CANADIAN SYLLABICS PWE" #x143A)
+    ("CANADIAN SYLLABICS WEST-CREE PWE" #x143B)
+    ("CANADIAN SYLLABICS PWI" #x143C)
+    ("CANADIAN SYLLABICS WEST-CREE PWI" #x143D)
+    ("CANADIAN SYLLABICS PWII" #x143E)
+    ("CANADIAN SYLLABICS WEST-CREE PWII" #x143F)
+    ("CANADIAN SYLLABICS PWO" #x1440)
+    ("CANADIAN SYLLABICS WEST-CREE PWO" #x1441)
+    ("CANADIAN SYLLABICS PWOO" #x1442)
+    ("CANADIAN SYLLABICS WEST-CREE PWOO" #x1443)
+    ("CANADIAN SYLLABICS PWA" #x1444)
+    ("CANADIAN SYLLABICS WEST-CREE PWA" #x1445)
+    ("CANADIAN SYLLABICS PWAA" #x1446)
+    ("CANADIAN SYLLABICS WEST-CREE PWAA" #x1447)
+    ("CANADIAN SYLLABICS Y-CREE PWAA" #x1448)
+    ("CANADIAN SYLLABICS P" #x1449)
+    ("CANADIAN SYLLABICS WEST-CREE P" #x144A)
+    ("CANADIAN SYLLABICS CARRIER H" #x144B)
+    ("CANADIAN SYLLABICS TE" #x144C)
+    ("CANADIAN SYLLABICS TAAI" #x144D)
+    ("CANADIAN SYLLABICS TI" #x144E)
+    ("CANADIAN SYLLABICS TII" #x144F)
+    ("CANADIAN SYLLABICS TO" #x1450)
+    ("CANADIAN SYLLABICS TOO" #x1451)
+    ("CANADIAN SYLLABICS Y-CREE TOO" #x1452)
+    ("CANADIAN SYLLABICS CARRIER DEE" #x1453)
+    ("CANADIAN SYLLABICS CARRIER DI" #x1454)
+    ("CANADIAN SYLLABICS TA" #x1455)
+    ("CANADIAN SYLLABICS TAA" #x1456)
+    ("CANADIAN SYLLABICS TWE" #x1457)
+    ("CANADIAN SYLLABICS WEST-CREE TWE" #x1458)
+    ("CANADIAN SYLLABICS TWI" #x1459)
+    ("CANADIAN SYLLABICS WEST-CREE TWI" #x145A)
+    ("CANADIAN SYLLABICS TWII" #x145B)
+    ("CANADIAN SYLLABICS WEST-CREE TWII" #x145C)
+    ("CANADIAN SYLLABICS TWO" #x145D)
+    ("CANADIAN SYLLABICS WEST-CREE TWO" #x145E)
+    ("CANADIAN SYLLABICS TWOO" #x145F)
+    ("CANADIAN SYLLABICS WEST-CREE TWOO" #x1460)
+    ("CANADIAN SYLLABICS TWA" #x1461)
+    ("CANADIAN SYLLABICS WEST-CREE TWA" #x1462)
+    ("CANADIAN SYLLABICS TWAA" #x1463)
+    ("CANADIAN SYLLABICS WEST-CREE TWAA" #x1464)
+    ("CANADIAN SYLLABICS NASKAPI TWAA" #x1465)
+    ("CANADIAN SYLLABICS T" #x1466)
+    ("CANADIAN SYLLABICS TTE" #x1467)
+    ("CANADIAN SYLLABICS TTI" #x1468)
+    ("CANADIAN SYLLABICS TTO" #x1469)
+    ("CANADIAN SYLLABICS TTA" #x146A)
+    ("CANADIAN SYLLABICS KE" #x146B)
+    ("CANADIAN SYLLABICS KAAI" #x146C)
+    ("CANADIAN SYLLABICS KI" #x146D)
+    ("CANADIAN SYLLABICS KII" #x146E)
+    ("CANADIAN SYLLABICS KO" #x146F)
+    ("CANADIAN SYLLABICS KOO" #x1470)
+    ("CANADIAN SYLLABICS Y-CREE KOO" #x1471)
+    ("CANADIAN SYLLABICS KA" #x1472)
+    ("CANADIAN SYLLABICS KAA" #x1473)
+    ("CANADIAN SYLLABICS KWE" #x1474)
+    ("CANADIAN SYLLABICS WEST-CREE KWE" #x1475)
+    ("CANADIAN SYLLABICS KWI" #x1476)
+    ("CANADIAN SYLLABICS WEST-CREE KWI" #x1477)
+    ("CANADIAN SYLLABICS KWII" #x1478)
+    ("CANADIAN SYLLABICS WEST-CREE KWII" #x1479)
+    ("CANADIAN SYLLABICS KWO" #x147A)
+    ("CANADIAN SYLLABICS WEST-CREE KWO" #x147B)
+    ("CANADIAN SYLLABICS KWOO" #x147C)
+    ("CANADIAN SYLLABICS WEST-CREE KWOO" #x147D)
+    ("CANADIAN SYLLABICS KWA" #x147E)
+    ("CANADIAN SYLLABICS WEST-CREE KWA" #x147F)
+    ("CANADIAN SYLLABICS KWAA" #x1480)
+    ("CANADIAN SYLLABICS WEST-CREE KWAA" #x1481)
+    ("CANADIAN SYLLABICS NASKAPI KWAA" #x1482)
+    ("CANADIAN SYLLABICS K" #x1483)
+    ("CANADIAN SYLLABICS KW" #x1484)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KEH" #x1485)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KIH" #x1486)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KOH" #x1487)
+    ("CANADIAN SYLLABICS SOUTH-SLAVEY KAH" #x1488)
+    ("CANADIAN SYLLABICS CE" #x1489)
+    ("CANADIAN SYLLABICS CAAI" #x148A)
+    ("CANADIAN SYLLABICS CI" #x148B)
+    ("CANADIAN SYLLABICS CII" #x148C)
+    ("CANADIAN SYLLABICS CO" #x148D)
+    ("CANADIAN SYLLABICS COO" #x148E)
+    ("CANADIAN SYLLABICS Y-CREE COO" #x148F)
+    ("CANADIAN SYLLABICS CA" #x1490)
+    ("CANADIAN SYLLABICS CAA" #x1491)
+    ("CANADIAN SYLLABICS CWE" #x1492)
+    ("CANADIAN SYLLABICS WEST-CREE CWE" #x1493)
+    ("CANADIAN SYLLABICS CWI" #x1494)
+    ("CANADIAN SYLLABICS WEST-CREE CWI" #x1495)
+    ("CANADIAN SYLLABICS CWII" #x1496)
+    ("CANADIAN SYLLABICS WEST-CREE CWII" #x1497)
+    ("CANADIAN SYLLABICS CWO" #x1498)
+    ("CANADIAN SYLLABICS WEST-CREE CWO" #x1499)
+    ("CANADIAN SYLLABICS CWOO" #x149A)
+    ("CANADIAN SYLLABICS WEST-CREE CWOO" #x149B)
+    ("CANADIAN SYLLABICS CWA" #x149C)
+    ("CANADIAN SYLLABICS WEST-CREE CWA" #x149D)
+    ("CANADIAN SYLLABICS CWAA" #x149E)
+    ("CANADIAN SYLLABICS WEST-CREE CWAA" #x149F)
+    ("CANADIAN SYLLABICS NASKAPI CWAA" #x14A0)
+    ("CANADIAN SYLLABICS C" #x14A1)
+    ("CANADIAN SYLLABICS SAYISI TH" #x14A2)
+    ("CANADIAN SYLLABICS ME" #x14A3)
+    ("CANADIAN SYLLABICS MAAI" #x14A4)
+    ("CANADIAN SYLLABICS MI" #x14A5)
+    ("CANADIAN SYLLABICS MII" #x14A6)
+    ("CANADIAN SYLLABICS MO" #x14A7)
+    ("CANADIAN SYLLABICS MOO" #x14A8)
+    ("CANADIAN SYLLABICS Y-CREE MOO" #x14A9)
+    ("CANADIAN SYLLABICS MA" #x14AA)
+    ("CANADIAN SYLLABICS MAA" #x14AB)
+    ("CANADIAN SYLLABICS MWE" #x14AC)
+    ("CANADIAN SYLLABICS WEST-CREE MWE" #x14AD)
+    ("CANADIAN SYLLABICS MWI" #x14AE)
+    ("CANADIAN SYLLABICS WEST-CREE MWI" #x14AF)
+    ("CANADIAN SYLLABICS MWII" #x14B0)
+    ("CANADIAN SYLLABICS WEST-CREE MWII" #x14B1)
+    ("CANADIAN SYLLABICS MWO" #x14B2)
+    ("CANADIAN SYLLABICS WEST-CREE MWO" #x14B3)
+    ("CANADIAN SYLLABICS MWOO" #x14B4)
+    ("CANADIAN SYLLABICS WEST-CREE MWOO" #x14B5)
+    ("CANADIAN SYLLABICS MWA" #x14B6)
+    ("CANADIAN SYLLABICS WEST-CREE MWA" #x14B7)
+    ("CANADIAN SYLLABICS MWAA" #x14B8)
+    ("CANADIAN SYLLABICS WEST-CREE MWAA" #x14B9)
+    ("CANADIAN SYLLABICS NASKAPI MWAA" #x14BA)
+    ("CANADIAN SYLLABICS M" #x14BB)
+    ("CANADIAN SYLLABICS WEST-CREE M" #x14BC)
+    ("CANADIAN SYLLABICS MH" #x14BD)
+    ("CANADIAN SYLLABICS ATHAPASCAN M" #x14BE)
+    ("CANADIAN SYLLABICS SAYISI M" #x14BF)
+    ("CANADIAN SYLLABICS NE" #x14C0)
+    ("CANADIAN SYLLABICS NAAI" #x14C1)
+    ("CANADIAN SYLLABICS NI" #x14C2)
+    ("CANADIAN SYLLABICS NII" #x14C3)
+    ("CANADIAN SYLLABICS NO" #x14C4)
+    ("CANADIAN SYLLABICS NOO" #x14C5)
+    ("CANADIAN SYLLABICS Y-CREE NOO" #x14C6)
+    ("CANADIAN SYLLABICS NA" #x14C7)
+    ("CANADIAN SYLLABICS NAA" #x14C8)
+    ("CANADIAN SYLLABICS NWE" #x14C9)
+    ("CANADIAN SYLLABICS WEST-CREE NWE" #x14CA)
+    ("CANADIAN SYLLABICS NWA" #x14CB)
+    ("CANADIAN SYLLABICS WEST-CREE NWA" #x14CC)
+    ("CANADIAN SYLLABICS NWAA" #x14CD)
+    ("CANADIAN SYLLABICS WEST-CREE NWAA" #x14CE)
+    ("CANADIAN SYLLABICS NASKAPI NWAA" #x14CF)
+    ("CANADIAN SYLLABICS N" #x14D0)
+    ("CANADIAN SYLLABICS CARRIER NG" #x14D1)
+    ("CANADIAN SYLLABICS NH" #x14D2)
+    ("CANADIAN SYLLABICS LE" #x14D3)
+    ("CANADIAN SYLLABICS LAAI" #x14D4)
+    ("CANADIAN SYLLABICS LI" #x14D5)
+    ("CANADIAN SYLLABICS LII" #x14D6)
+    ("CANADIAN SYLLABICS LO" #x14D7)
+    ("CANADIAN SYLLABICS LOO" #x14D8)
+    ("CANADIAN SYLLABICS Y-CREE LOO" #x14D9)
+    ("CANADIAN SYLLABICS LA" #x14DA)
+    ("CANADIAN SYLLABICS LAA" #x14DB)
+    ("CANADIAN SYLLABICS LWE" #x14DC)
+    ("CANADIAN SYLLABICS WEST-CREE LWE" #x14DD)
+    ("CANADIAN SYLLABICS LWI" #x14DE)
+    ("CANADIAN SYLLABICS WEST-CREE LWI" #x14DF)
+    ("CANADIAN SYLLABICS LWII" #x14E0)
+    ("CANADIAN SYLLABICS WEST-CREE LWII" #x14E1)
+    ("CANADIAN SYLLABICS LWO" #x14E2)
+    ("CANADIAN SYLLABICS WEST-CREE LWO" #x14E3)
+    ("CANADIAN SYLLABICS LWOO" #x14E4)
+    ("CANADIAN SYLLABICS WEST-CREE LWOO" #x14E5)
+    ("CANADIAN SYLLABICS LWA" #x14E6)
+    ("CANADIAN SYLLABICS WEST-CREE LWA" #x14E7)
+    ("CANADIAN SYLLABICS LWAA" #x14E8)
+    ("CANADIAN SYLLABICS WEST-CREE LWAA" #x14E9)
+    ("CANADIAN SYLLABICS L" #x14EA)
+    ("CANADIAN SYLLABICS WEST-CREE L" #x14EB)
+    ("CANADIAN SYLLABICS MEDIAL L" #x14EC)
+    ("CANADIAN SYLLABICS SE" #x14ED)
+    ("CANADIAN SYLLABICS SAAI" #x14EE)
+    ("CANADIAN SYLLABICS SI" #x14EF)
+    ("CANADIAN SYLLABICS SII" #x14F0)
+    ("CANADIAN SYLLABICS SO" #x14F1)
+    ("CANADIAN SYLLABICS SOO" #x14F2)
+    ("CANADIAN SYLLABICS Y-CREE SOO" #x14F3)
+    ("CANADIAN SYLLABICS SA" #x14F4)
+    ("CANADIAN SYLLABICS SAA" #x14F5)
+    ("CANADIAN SYLLABICS SWE" #x14F6)
+    ("CANADIAN SYLLABICS WEST-CREE SWE" #x14F7)
+    ("CANADIAN SYLLABICS SWI" #x14F8)
+    ("CANADIAN SYLLABICS WEST-CREE SWI" #x14F9)
+    ("CANADIAN SYLLABICS SWII" #x14FA)
+    ("CANADIAN SYLLABICS WEST-CREE SWII" #x14FB)
+    ("CANADIAN SYLLABICS SWO" #x14FC)
+    ("CANADIAN SYLLABICS WEST-CREE SWO" #x14FD)
+    ("CANADIAN SYLLABICS SWOO" #x14FE)
+    ("CANADIAN SYLLABICS WEST-CREE SWOO" #x14FF)
+    ("CANADIAN SYLLABICS SWA" #x1500)
+    ("CANADIAN SYLLABICS WEST-CREE SWA" #x1501)
+    ("CANADIAN SYLLABICS SWAA" #x1502)
+    ("CANADIAN SYLLABICS WEST-CREE SWAA" #x1503)
+    ("CANADIAN SYLLABICS NASKAPI SWAA" #x1504)
+    ("CANADIAN SYLLABICS S" #x1505)
+    ("CANADIAN SYLLABICS ATHAPASCAN S" #x1506)
+    ("CANADIAN SYLLABICS SW" #x1507)
+    ("CANADIAN SYLLABICS BLACKFOOT S" #x1508)
+    ("CANADIAN SYLLABICS MOOSE-CREE SK" #x1509)
+    ("CANADIAN SYLLABICS NASKAPI SKW" #x150A)
+    ("CANADIAN SYLLABICS NASKAPI S-W" #x150B)
+    ("CANADIAN SYLLABICS NASKAPI SPWA" #x150C)
+    ("CANADIAN SYLLABICS NASKAPI STWA" #x150D)
+    ("CANADIAN SYLLABICS NASKAPI SKWA" #x150E)
+    ("CANADIAN SYLLABICS NASKAPI SCWA" #x150F)
+    ("CANADIAN SYLLABICS SHE" #x1510)
+    ("CANADIAN SYLLABICS SHI" #x1511)
+    ("CANADIAN SYLLABICS SHII" #x1512)
+    ("CANADIAN SYLLABICS SHO" #x1513)
+    ("CANADIAN SYLLABICS SHOO" #x1514)
+    ("CANADIAN SYLLABICS SHA" #x1515)
+    ("CANADIAN SYLLABICS SHAA" #x1516)
+    ("CANADIAN SYLLABICS SHWE" #x1517)
+    ("CANADIAN SYLLABICS WEST-CREE SHWE" #x1518)
+    ("CANADIAN SYLLABICS SHWI" #x1519)
+    ("CANADIAN SYLLABICS WEST-CREE SHWI" #x151A)
+    ("CANADIAN SYLLABICS SHWII" #x151B)
+    ("CANADIAN SYLLABICS WEST-CREE SHWII" #x151C)
+    ("CANADIAN SYLLABICS SHWO" #x151D)
+    ("CANADIAN SYLLABICS WEST-CREE SHWO" #x151E)
+    ("CANADIAN SYLLABICS SHWOO" #x151F)
+    ("CANADIAN SYLLABICS WEST-CREE SHWOO" #x1520)
+    ("CANADIAN SYLLABICS SHWA" #x1521)
+    ("CANADIAN SYLLABICS WEST-CREE SHWA" #x1522)
+    ("CANADIAN SYLLABICS SHWAA" #x1523)
+    ("CANADIAN SYLLABICS WEST-CREE SHWAA" #x1524)
+    ("CANADIAN SYLLABICS SH" #x1525)
+    ("CANADIAN SYLLABICS YE" #x1526)
+    ("CANADIAN SYLLABICS YAAI" #x1527)
+    ("CANADIAN SYLLABICS YI" #x1528)
+    ("CANADIAN SYLLABICS YII" #x1529)
+    ("CANADIAN SYLLABICS YO" #x152A)
+    ("CANADIAN SYLLABICS YOO" #x152B)
+    ("CANADIAN SYLLABICS Y-CREE YOO" #x152C)
+    ("CANADIAN SYLLABICS YA" #x152D)
+    ("CANADIAN SYLLABICS YAA" #x152E)
+    ("CANADIAN SYLLABICS YWE" #x152F)
+    ("CANADIAN SYLLABICS WEST-CREE YWE" #x1530)
+    ("CANADIAN SYLLABICS YWI" #x1531)
+    ("CANADIAN SYLLABICS WEST-CREE YWI" #x1532)
+    ("CANADIAN SYLLABICS YWII" #x1533)
+    ("CANADIAN SYLLABICS WEST-CREE YWII" #x1534)
+    ("CANADIAN SYLLABICS YWO" #x1535)
+    ("CANADIAN SYLLABICS WEST-CREE YWO" #x1536)
+    ("CANADIAN SYLLABICS YWOO" #x1537)
+    ("CANADIAN SYLLABICS WEST-CREE YWOO" #x1538)
+    ("CANADIAN SYLLABICS YWA" #x1539)
+    ("CANADIAN SYLLABICS WEST-CREE YWA" #x153A)
+    ("CANADIAN SYLLABICS YWAA" #x153B)
+    ("CANADIAN SYLLABICS WEST-CREE YWAA" #x153C)
+    ("CANADIAN SYLLABICS NASKAPI YWAA" #x153D)
+    ("CANADIAN SYLLABICS Y" #x153E)
+    ("CANADIAN SYLLABICS BIBLE-CREE Y" #x153F)
+    ("CANADIAN SYLLABICS WEST-CREE Y" #x1540)
+    ("CANADIAN SYLLABICS SAYISI YI" #x1541)
+    ("CANADIAN SYLLABICS RE" #x1542)
+    ("CANADIAN SYLLABICS R-CREE RE" #x1543)
+    ("CANADIAN SYLLABICS WEST-CREE LE" #x1544)
+    ("CANADIAN SYLLABICS RAAI" #x1545)
+    ("CANADIAN SYLLABICS RI" #x1546)
+    ("CANADIAN SYLLABICS RII" #x1547)
+    ("CANADIAN SYLLABICS RO" #x1548)
+    ("CANADIAN SYLLABICS ROO" #x1549)
+    ("CANADIAN SYLLABICS WEST-CREE LO" #x154A)
+    ("CANADIAN SYLLABICS RA" #x154B)
+    ("CANADIAN SYLLABICS RAA" #x154C)
+    ("CANADIAN SYLLABICS WEST-CREE LA" #x154D)
+    ("CANADIAN SYLLABICS RWAA" #x154E)
+    ("CANADIAN SYLLABICS WEST-CREE RWAA" #x154F)
+    ("CANADIAN SYLLABICS R" #x1550)
+    ("CANADIAN SYLLABICS WEST-CREE R" #x1551)
+    ("CANADIAN SYLLABICS MEDIAL R" #x1552)
+    ("CANADIAN SYLLABICS FE" #x1553)
+    ("CANADIAN SYLLABICS FAAI" #x1554)
+    ("CANADIAN SYLLABICS FI" #x1555)
+    ("CANADIAN SYLLABICS FII" #x1556)
+    ("CANADIAN SYLLABICS FO" #x1557)
+    ("CANADIAN SYLLABICS FOO" #x1558)
+    ("CANADIAN SYLLABICS FA" #x1559)
+    ("CANADIAN SYLLABICS FAA" #x155A)
+    ("CANADIAN SYLLABICS FWAA" #x155B)
+    ("CANADIAN SYLLABICS WEST-CREE FWAA" #x155C)
+    ("CANADIAN SYLLABICS F" #x155D)
+    ("CANADIAN SYLLABICS THE" #x155E)
+    ("CANADIAN SYLLABICS N-CREE THE" #x155F)
+    ("CANADIAN SYLLABICS THI" #x1560)
+    ("CANADIAN SYLLABICS N-CREE THI" #x1561)
+    ("CANADIAN SYLLABICS THII" #x1562)
+    ("CANADIAN SYLLABICS N-CREE THII" #x1563)
+    ("CANADIAN SYLLABICS THO" #x1564)
+    ("CANADIAN SYLLABICS THOO" #x1565)
+    ("CANADIAN SYLLABICS THA" #x1566)
+    ("CANADIAN SYLLABICS THAA" #x1567)
+    ("CANADIAN SYLLABICS THWAA" #x1568)
+    ("CANADIAN SYLLABICS WEST-CREE THWAA" #x1569)
+    ("CANADIAN SYLLABICS TH" #x156A)
+    ("CANADIAN SYLLABICS TTHE" #x156B)
+    ("CANADIAN SYLLABICS TTHI" #x156C)
+    ("CANADIAN SYLLABICS TTHO" #x156D)
+    ("CANADIAN SYLLABICS TTHA" #x156E)
+    ("CANADIAN SYLLABICS TTH" #x156F)
+    ("CANADIAN SYLLABICS TYE" #x1570)
+    ("CANADIAN SYLLABICS TYI" #x1571)
+    ("CANADIAN SYLLABICS TYO" #x1572)
+    ("CANADIAN SYLLABICS TYA" #x1573)
+    ("CANADIAN SYLLABICS NUNAVIK HE" #x1574)
+    ("CANADIAN SYLLABICS NUNAVIK HI" #x1575)
+    ("CANADIAN SYLLABICS NUNAVIK HII" #x1576)
+    ("CANADIAN SYLLABICS NUNAVIK HO" #x1577)
+    ("CANADIAN SYLLABICS NUNAVIK HOO" #x1578)
+    ("CANADIAN SYLLABICS NUNAVIK HA" #x1579)
+    ("CANADIAN SYLLABICS NUNAVIK HAA" #x157A)
+    ("CANADIAN SYLLABICS NUNAVIK H" #x157B)
+    ("CANADIAN SYLLABICS NUNAVUT H" #x157C)
+    ("CANADIAN SYLLABICS HK" #x157D)
+    ("CANADIAN SYLLABICS QAAI" #x157E)
+    ("CANADIAN SYLLABICS QI" #x157F)
+    ("CANADIAN SYLLABICS QII" #x1580)
+    ("CANADIAN SYLLABICS QO" #x1581)
+    ("CANADIAN SYLLABICS QOO" #x1582)
+    ("CANADIAN SYLLABICS QA" #x1583)
+    ("CANADIAN SYLLABICS QAA" #x1584)
+    ("CANADIAN SYLLABICS Q" #x1585)
+    ("CANADIAN SYLLABICS TLHE" #x1586)
+    ("CANADIAN SYLLABICS TLHI" #x1587)
+    ("CANADIAN SYLLABICS TLHO" #x1588)
+    ("CANADIAN SYLLABICS TLHA" #x1589)
+    ("CANADIAN SYLLABICS WEST-CREE RE" #x158A)
+    ("CANADIAN SYLLABICS WEST-CREE RI" #x158B)
+    ("CANADIAN SYLLABICS WEST-CREE RO" #x158C)
+    ("CANADIAN SYLLABICS WEST-CREE RA" #x158D)
+    ("CANADIAN SYLLABICS NGAAI" #x158E)
+    ("CANADIAN SYLLABICS NGI" #x158F)
+    ("CANADIAN SYLLABICS NGII" #x1590)
+    ("CANADIAN SYLLABICS NGO" #x1591)
+    ("CANADIAN SYLLABICS NGOO" #x1592)
+    ("CANADIAN SYLLABICS NGA" #x1593)
+    ("CANADIAN SYLLABICS NGAA" #x1594)
+    ("CANADIAN SYLLABICS NG" #x1595)
+    ("CANADIAN SYLLABICS NNG" #x1596)
+    ("CANADIAN SYLLABICS SAYISI SHE" #x1597)
+    ("CANADIAN SYLLABICS SAYISI SHI" #x1598)
+    ("CANADIAN SYLLABICS SAYISI SHO" #x1599)
+    ("CANADIAN SYLLABICS SAYISI SHA" #x159A)
+    ("CANADIAN SYLLABICS WOODS-CREE THE" #x159B)
+    ("CANADIAN SYLLABICS WOODS-CREE THI" #x159C)
+    ("CANADIAN SYLLABICS WOODS-CREE THO" #x159D)
+    ("CANADIAN SYLLABICS WOODS-CREE THA" #x159E)
+    ("CANADIAN SYLLABICS WOODS-CREE TH" #x159F)
+    ("CANADIAN SYLLABICS LHI" #x15A0)
+    ("CANADIAN SYLLABICS LHII" #x15A1)
+    ("CANADIAN SYLLABICS LHO" #x15A2)
+    ("CANADIAN SYLLABICS LHOO" #x15A3)
+    ("CANADIAN SYLLABICS LHA" #x15A4)
+    ("CANADIAN SYLLABICS LHAA" #x15A5)
+    ("CANADIAN SYLLABICS LH" #x15A6)
+    ("CANADIAN SYLLABICS TH-CREE THE" #x15A7)
+    ("CANADIAN SYLLABICS TH-CREE THI" #x15A8)
+    ("CANADIAN SYLLABICS TH-CREE THII" #x15A9)
+    ("CANADIAN SYLLABICS TH-CREE THO" #x15AA)
+    ("CANADIAN SYLLABICS TH-CREE THOO" #x15AB)
+    ("CANADIAN SYLLABICS TH-CREE THA" #x15AC)
+    ("CANADIAN SYLLABICS TH-CREE THAA" #x15AD)
+    ("CANADIAN SYLLABICS TH-CREE TH" #x15AE)
+    ("CANADIAN SYLLABICS AIVILIK B" #x15AF)
+    ("CANADIAN SYLLABICS BLACKFOOT E" #x15B0)
+    ("CANADIAN SYLLABICS BLACKFOOT I" #x15B1)
+    ("CANADIAN SYLLABICS BLACKFOOT O" #x15B2)
+    ("CANADIAN SYLLABICS BLACKFOOT A" #x15B3)
+    ("CANADIAN SYLLABICS BLACKFOOT WE" #x15B4)
+    ("CANADIAN SYLLABICS BLACKFOOT WI" #x15B5)
+    ("CANADIAN SYLLABICS BLACKFOOT WO" #x15B6)
+    ("CANADIAN SYLLABICS BLACKFOOT WA" #x15B7)
+    ("CANADIAN SYLLABICS BLACKFOOT NE" #x15B8)
+    ("CANADIAN SYLLABICS BLACKFOOT NI" #x15B9)
+    ("CANADIAN SYLLABICS BLACKFOOT NO" #x15BA)
+    ("CANADIAN SYLLABICS BLACKFOOT NA" #x15BB)
+    ("CANADIAN SYLLABICS BLACKFOOT KE" #x15BC)
+    ("CANADIAN SYLLABICS BLACKFOOT KI" #x15BD)
+    ("CANADIAN SYLLABICS BLACKFOOT KO" #x15BE)
+    ("CANADIAN SYLLABICS BLACKFOOT KA" #x15BF)
+    ("CANADIAN SYLLABICS SAYISI HE" #x15C0)
+    ("CANADIAN SYLLABICS SAYISI HI" #x15C1)
+    ("CANADIAN SYLLABICS SAYISI HO" #x15C2)
+    ("CANADIAN SYLLABICS SAYISI HA" #x15C3)
+    ("CANADIAN SYLLABICS CARRIER GHU" #x15C4)
+    ("CANADIAN SYLLABICS CARRIER GHO" #x15C5)
+    ("CANADIAN SYLLABICS CARRIER GHE" #x15C6)
+    ("CANADIAN SYLLABICS CARRIER GHEE" #x15C7)
+    ("CANADIAN SYLLABICS CARRIER GHI" #x15C8)
+    ("CANADIAN SYLLABICS CARRIER GHA" #x15C9)
+    ("CANADIAN SYLLABICS CARRIER RU" #x15CA)
+    ("CANADIAN SYLLABICS CARRIER RO" #x15CB)
+    ("CANADIAN SYLLABICS CARRIER RE" #x15CC)
+    ("CANADIAN SYLLABICS CARRIER REE" #x15CD)
+    ("CANADIAN SYLLABICS CARRIER RI" #x15CE)
+    ("CANADIAN SYLLABICS CARRIER RA" #x15CF)
+    ("CANADIAN SYLLABICS CARRIER WU" #x15D0)
+    ("CANADIAN SYLLABICS CARRIER WO" #x15D1)
+    ("CANADIAN SYLLABICS CARRIER WE" #x15D2)
+    ("CANADIAN SYLLABICS CARRIER WEE" #x15D3)
+    ("CANADIAN SYLLABICS CARRIER WI" #x15D4)
+    ("CANADIAN SYLLABICS CARRIER WA" #x15D5)
+    ("CANADIAN SYLLABICS CARRIER HWU" #x15D6)
+    ("CANADIAN SYLLABICS CARRIER HWO" #x15D7)
+    ("CANADIAN SYLLABICS CARRIER HWE" #x15D8)
+    ("CANADIAN SYLLABICS CARRIER HWEE" #x15D9)
+    ("CANADIAN SYLLABICS CARRIER HWI" #x15DA)
+    ("CANADIAN SYLLABICS CARRIER HWA" #x15DB)
+    ("CANADIAN SYLLABICS CARRIER THU" #x15DC)
+    ("CANADIAN SYLLABICS CARRIER THO" #x15DD)
+    ("CANADIAN SYLLABICS CARRIER THE" #x15DE)
+    ("CANADIAN SYLLABICS CARRIER THEE" #x15DF)
+    ("CANADIAN SYLLABICS CARRIER THI" #x15E0)
+    ("CANADIAN SYLLABICS CARRIER THA" #x15E1)
+    ("CANADIAN SYLLABICS CARRIER TTU" #x15E2)
+    ("CANADIAN SYLLABICS CARRIER TTO" #x15E3)
+    ("CANADIAN SYLLABICS CARRIER TTE" #x15E4)
+    ("CANADIAN SYLLABICS CARRIER TTEE" #x15E5)
+    ("CANADIAN SYLLABICS CARRIER TTI" #x15E6)
+    ("CANADIAN SYLLABICS CARRIER TTA" #x15E7)
+    ("CANADIAN SYLLABICS CARRIER PU" #x15E8)
+    ("CANADIAN SYLLABICS CARRIER PO" #x15E9)
+    ("CANADIAN SYLLABICS CARRIER PE" #x15EA)
+    ("CANADIAN SYLLABICS CARRIER PEE" #x15EB)
+    ("CANADIAN SYLLABICS CARRIER PI" #x15EC)
+    ("CANADIAN SYLLABICS CARRIER PA" #x15ED)
+    ("CANADIAN SYLLABICS CARRIER P" #x15EE)
+    ("CANADIAN SYLLABICS CARRIER GU" #x15EF)
+    ("CANADIAN SYLLABICS CARRIER GO" #x15F0)
+    ("CANADIAN SYLLABICS CARRIER GE" #x15F1)
+    ("CANADIAN SYLLABICS CARRIER GEE" #x15F2)
+    ("CANADIAN SYLLABICS CARRIER GI" #x15F3)
+    ("CANADIAN SYLLABICS CARRIER GA" #x15F4)
+    ("CANADIAN SYLLABICS CARRIER KHU" #x15F5)
+    ("CANADIAN SYLLABICS CARRIER KHO" #x15F6)
+    ("CANADIAN SYLLABICS CARRIER KHE" #x15F7)
+    ("CANADIAN SYLLABICS CARRIER KHEE" #x15F8)
+    ("CANADIAN SYLLABICS CARRIER KHI" #x15F9)
+    ("CANADIAN SYLLABICS CARRIER KHA" #x15FA)
+    ("CANADIAN SYLLABICS CARRIER KKU" #x15FB)
+    ("CANADIAN SYLLABICS CARRIER KKO" #x15FC)
+    ("CANADIAN SYLLABICS CARRIER KKE" #x15FD)
+    ("CANADIAN SYLLABICS CARRIER KKEE" #x15FE)
+    ("CANADIAN SYLLABICS CARRIER KKI" #x15FF)
+    ("CANADIAN SYLLABICS CARRIER KKA" #x1600)
+    ("CANADIAN SYLLABICS CARRIER KK" #x1601)
+    ("CANADIAN SYLLABICS CARRIER NU" #x1602)
+    ("CANADIAN SYLLABICS CARRIER NO" #x1603)
+    ("CANADIAN SYLLABICS CARRIER NE" #x1604)
+    ("CANADIAN SYLLABICS CARRIER NEE" #x1605)
+    ("CANADIAN SYLLABICS CARRIER NI" #x1606)
+    ("CANADIAN SYLLABICS CARRIER NA" #x1607)
+    ("CANADIAN SYLLABICS CARRIER MU" #x1608)
+    ("CANADIAN SYLLABICS CARRIER MO" #x1609)
+    ("CANADIAN SYLLABICS CARRIER ME" #x160A)
+    ("CANADIAN SYLLABICS CARRIER MEE" #x160B)
+    ("CANADIAN SYLLABICS CARRIER MI" #x160C)
+    ("CANADIAN SYLLABICS CARRIER MA" #x160D)
+    ("CANADIAN SYLLABICS CARRIER YU" #x160E)
+    ("CANADIAN SYLLABICS CARRIER YO" #x160F)
+    ("CANADIAN SYLLABICS CARRIER YE" #x1610)
+    ("CANADIAN SYLLABICS CARRIER YEE" #x1611)
+    ("CANADIAN SYLLABICS CARRIER YI" #x1612)
+    ("CANADIAN SYLLABICS CARRIER YA" #x1613)
+    ("CANADIAN SYLLABICS CARRIER JU" #x1614)
+    ("CANADIAN SYLLABICS SAYISI JU" #x1615)
+    ("CANADIAN SYLLABICS CARRIER JO" #x1616)
+    ("CANADIAN SYLLABICS CARRIER JE" #x1617)
+    ("CANADIAN SYLLABICS CARRIER JEE" #x1618)
+    ("CANADIAN SYLLABICS CARRIER JI" #x1619)
+    ("CANADIAN SYLLABICS SAYISI JI" #x161A)
+    ("CANADIAN SYLLABICS CARRIER JA" #x161B)
+    ("CANADIAN SYLLABICS CARRIER JJU" #x161C)
+    ("CANADIAN SYLLABICS CARRIER JJO" #x161D)
+    ("CANADIAN SYLLABICS CARRIER JJE" #x161E)
+    ("CANADIAN SYLLABICS CARRIER JJEE" #x161F)
+    ("CANADIAN SYLLABICS CARRIER JJI" #x1620)
+    ("CANADIAN SYLLABICS CARRIER JJA" #x1621)
+    ("CANADIAN SYLLABICS CARRIER LU" #x1622)
+    ("CANADIAN SYLLABICS CARRIER LO" #x1623)
+    ("CANADIAN SYLLABICS CARRIER LE" #x1624)
+    ("CANADIAN SYLLABICS CARRIER LEE" #x1625)
+    ("CANADIAN SYLLABICS CARRIER LI" #x1626)
+    ("CANADIAN SYLLABICS CARRIER LA" #x1627)
+    ("CANADIAN SYLLABICS CARRIER DLU" #x1628)
+    ("CANADIAN SYLLABICS CARRIER DLO" #x1629)
+    ("CANADIAN SYLLABICS CARRIER DLE" #x162A)
+    ("CANADIAN SYLLABICS CARRIER DLEE" #x162B)
+    ("CANADIAN SYLLABICS CARRIER DLI" #x162C)
+    ("CANADIAN SYLLABICS CARRIER DLA" #x162D)
+    ("CANADIAN SYLLABICS CARRIER LHU" #x162E)
+    ("CANADIAN SYLLABICS CARRIER LHO" #x162F)
+    ("CANADIAN SYLLABICS CARRIER LHE" #x1630)
+    ("CANADIAN SYLLABICS CARRIER LHEE" #x1631)
+    ("CANADIAN SYLLABICS CARRIER LHI" #x1632)
+    ("CANADIAN SYLLABICS CARRIER LHA" #x1633)
+    ("CANADIAN SYLLABICS CARRIER TLHU" #x1634)
+    ("CANADIAN SYLLABICS CARRIER TLHO" #x1635)
+    ("CANADIAN SYLLABICS CARRIER TLHE" #x1636)
+    ("CANADIAN SYLLABICS CARRIER TLHEE" #x1637)
+    ("CANADIAN SYLLABICS CARRIER TLHI" #x1638)
+    ("CANADIAN SYLLABICS CARRIER TLHA" #x1639)
+    ("CANADIAN SYLLABICS CARRIER TLU" #x163A)
+    ("CANADIAN SYLLABICS CARRIER TLO" #x163B)
+    ("CANADIAN SYLLABICS CARRIER TLE" #x163C)
+    ("CANADIAN SYLLABICS CARRIER TLEE" #x163D)
+    ("CANADIAN SYLLABICS CARRIER TLI" #x163E)
+    ("CANADIAN SYLLABICS CARRIER TLA" #x163F)
+    ("CANADIAN SYLLABICS CARRIER ZU" #x1640)
+    ("CANADIAN SYLLABICS CARRIER ZO" #x1641)
+    ("CANADIAN SYLLABICS CARRIER ZE" #x1642)
+    ("CANADIAN SYLLABICS CARRIER ZEE" #x1643)
+    ("CANADIAN SYLLABICS CARRIER ZI" #x1644)
+    ("CANADIAN SYLLABICS CARRIER ZA" #x1645)
+    ("CANADIAN SYLLABICS CARRIER Z" #x1646)
+    ("CANADIAN SYLLABICS CARRIER INITIAL Z" #x1647)
+    ("CANADIAN SYLLABICS CARRIER DZU" #x1648)
+    ("CANADIAN SYLLABICS CARRIER DZO" #x1649)
+    ("CANADIAN SYLLABICS CARRIER DZE" #x164A)
+    ("CANADIAN SYLLABICS CARRIER DZEE" #x164B)
+    ("CANADIAN SYLLABICS CARRIER DZI" #x164C)
+    ("CANADIAN SYLLABICS CARRIER DZA" #x164D)
+    ("CANADIAN SYLLABICS CARRIER SU" #x164E)
+    ("CANADIAN SYLLABICS CARRIER SO" #x164F)
+    ("CANADIAN SYLLABICS CARRIER SE" #x1650)
+    ("CANADIAN SYLLABICS CARRIER SEE" #x1651)
+    ("CANADIAN SYLLABICS CARRIER SI" #x1652)
+    ("CANADIAN SYLLABICS CARRIER SA" #x1653)
+    ("CANADIAN SYLLABICS CARRIER SHU" #x1654)
+    ("CANADIAN SYLLABICS CARRIER SHO" #x1655)
+    ("CANADIAN SYLLABICS CARRIER SHE" #x1656)
+    ("CANADIAN SYLLABICS CARRIER SHEE" #x1657)
+    ("CANADIAN SYLLABICS CARRIER SHI" #x1658)
+    ("CANADIAN SYLLABICS CARRIER SHA" #x1659)
+    ("CANADIAN SYLLABICS CARRIER SH" #x165A)
+    ("CANADIAN SYLLABICS CARRIER TSU" #x165B)
+    ("CANADIAN SYLLABICS CARRIER TSO" #x165C)
+    ("CANADIAN SYLLABICS CARRIER TSE" #x165D)
+    ("CANADIAN SYLLABICS CARRIER TSEE" #x165E)
+    ("CANADIAN SYLLABICS CARRIER TSI" #x165F)
+    ("CANADIAN SYLLABICS CARRIER TSA" #x1660)
+    ("CANADIAN SYLLABICS CARRIER CHU" #x1661)
+    ("CANADIAN SYLLABICS CARRIER CHO" #x1662)
+    ("CANADIAN SYLLABICS CARRIER CHE" #x1663)
+    ("CANADIAN SYLLABICS CARRIER CHEE" #x1664)
+    ("CANADIAN SYLLABICS CARRIER CHI" #x1665)
+    ("CANADIAN SYLLABICS CARRIER CHA" #x1666)
+    ("CANADIAN SYLLABICS CARRIER TTSU" #x1667)
+    ("CANADIAN SYLLABICS CARRIER TTSO" #x1668)
+    ("CANADIAN SYLLABICS CARRIER TTSE" #x1669)
+    ("CANADIAN SYLLABICS CARRIER TTSEE" #x166A)
+    ("CANADIAN SYLLABICS CARRIER TTSI" #x166B)
+    ("CANADIAN SYLLABICS CARRIER TTSA" #x166C)
+    ("CANADIAN SYLLABICS CHI SIGN" #x166D)
+    ("CANADIAN SYLLABICS FULL STOP" #x166E)
+    ("CANADIAN SYLLABICS QAI" #x166F)
+    ("CANADIAN SYLLABICS NGAI" #x1670)
+    ("CANADIAN SYLLABICS NNGI" #x1671)
+    ("CANADIAN SYLLABICS NNGII" #x1672)
+    ("CANADIAN SYLLABICS NNGO" #x1673)
+    ("CANADIAN SYLLABICS NNGOO" #x1674)
+    ("CANADIAN SYLLABICS NNGA" #x1675)
+    ("CANADIAN SYLLABICS NNGAA" #x1676)
+    ))
+
+;; arch-tag: 7b4079a4-dea1-44b9-9699-8826b5919ad7
diff --git a/etc/nxml/01680-0169F.el b/etc/nxml/01680-0169F.el
new file mode 100644 (file)
index 0000000..52c4cce
--- /dev/null
@@ -0,0 +1,33 @@
+(nxml-define-char-name-set 'ogham
+  '(("OGHAM SPACE MARK" #x1680)
+    ("OGHAM LETTER BEITH" #x1681)
+    ("OGHAM LETTER LUIS" #x1682)
+    ("OGHAM LETTER FEARN" #x1683)
+    ("OGHAM LETTER SAIL" #x1684)
+    ("OGHAM LETTER NION" #x1685)
+    ("OGHAM LETTER UATH" #x1686)
+    ("OGHAM LETTER DAIR" #x1687)
+    ("OGHAM LETTER TINNE" #x1688)
+    ("OGHAM LETTER COLL" #x1689)
+    ("OGHAM LETTER CEIRT" #x168A)
+    ("OGHAM LETTER MUIN" #x168B)
+    ("OGHAM LETTER GORT" #x168C)
+    ("OGHAM LETTER NGEADAL" #x168D)
+    ("OGHAM LETTER STRAIF" #x168E)
+    ("OGHAM LETTER RUIS" #x168F)
+    ("OGHAM LETTER AILM" #x1690)
+    ("OGHAM LETTER ONN" #x1691)
+    ("OGHAM LETTER UR" #x1692)
+    ("OGHAM LETTER EADHADH" #x1693)
+    ("OGHAM LETTER IODHADH" #x1694)
+    ("OGHAM LETTER EABHADH" #x1695)
+    ("OGHAM LETTER OR" #x1696)
+    ("OGHAM LETTER UILLEANN" #x1697)
+    ("OGHAM LETTER IFIN" #x1698)
+    ("OGHAM LETTER EAMHANCHOLL" #x1699)
+    ("OGHAM LETTER PEITH" #x169A)
+    ("OGHAM FEATHER MARK" #x169B)
+    ("OGHAM REVERSED FEATHER MARK" #x169C)
+    ))
+
+;; arch-tag: db8ea8fc-61b4-4f83-97f5-d2a952b9d8b6
diff --git a/etc/nxml/016A0-016FF.el b/etc/nxml/016A0-016FF.el
new file mode 100644 (file)
index 0000000..81f1df7
--- /dev/null
@@ -0,0 +1,85 @@
+(nxml-define-char-name-set 'runic
+  '(("RUNIC LETTER FEHU FEOH FE F" #x16A0)
+    ("RUNIC LETTER V" #x16A1)
+    ("RUNIC LETTER URUZ UR U" #x16A2)
+    ("RUNIC LETTER YR" #x16A3)
+    ("RUNIC LETTER Y" #x16A4)
+    ("RUNIC LETTER W" #x16A5)
+    ("RUNIC LETTER THURISAZ THURS THORN" #x16A6)
+    ("RUNIC LETTER ETH" #x16A7)
+    ("RUNIC LETTER ANSUZ A" #x16A8)
+    ("RUNIC LETTER OS O" #x16A9)
+    ("RUNIC LETTER AC A" #x16AA)
+    ("RUNIC LETTER AESC" #x16AB)
+    ("RUNIC LETTER LONG-BRANCH-OSS O" #x16AC)
+    ("RUNIC LETTER SHORT-TWIG-OSS O" #x16AD)
+    ("RUNIC LETTER O" #x16AE)
+    ("RUNIC LETTER OE" #x16AF)
+    ("RUNIC LETTER ON" #x16B0)
+    ("RUNIC LETTER RAIDO RAD REID R" #x16B1)
+    ("RUNIC LETTER KAUNA" #x16B2)
+    ("RUNIC LETTER CEN" #x16B3)
+    ("RUNIC LETTER KAUN K" #x16B4)
+    ("RUNIC LETTER G" #x16B5)
+    ("RUNIC LETTER ENG" #x16B6)
+    ("RUNIC LETTER GEBO GYFU G" #x16B7)
+    ("RUNIC LETTER GAR" #x16B8)
+    ("RUNIC LETTER WUNJO WYNN W" #x16B9)
+    ("RUNIC LETTER HAGLAZ H" #x16BA)
+    ("RUNIC LETTER HAEGL H" #x16BB)
+    ("RUNIC LETTER LONG-BRANCH-HAGALL H" #x16BC)
+    ("RUNIC LETTER SHORT-TWIG-HAGALL H" #x16BD)
+    ("RUNIC LETTER NAUDIZ NYD NAUD N" #x16BE)
+    ("RUNIC LETTER SHORT-TWIG-NAUD N" #x16BF)
+    ("RUNIC LETTER DOTTED-N" #x16C0)
+    ("RUNIC LETTER ISAZ IS ISS I" #x16C1)
+    ("RUNIC LETTER E" #x16C2)
+    ("RUNIC LETTER JERAN J" #x16C3)
+    ("RUNIC LETTER GER" #x16C4)
+    ("RUNIC LETTER LONG-BRANCH-AR AE" #x16C5)
+    ("RUNIC LETTER SHORT-TWIG-AR A" #x16C6)
+    ("RUNIC LETTER IWAZ EOH" #x16C7)
+    ("RUNIC LETTER PERTHO PEORTH P" #x16C8)
+    ("RUNIC LETTER ALGIZ EOLHX" #x16C9)
+    ("RUNIC LETTER SOWILO S" #x16CA)
+    ("RUNIC LETTER SIGEL LONG-BRANCH-SOL S" #x16CB)
+    ("RUNIC LETTER SHORT-TWIG-SOL S" #x16CC)
+    ("RUNIC LETTER C" #x16CD)
+    ("RUNIC LETTER Z" #x16CE)
+    ("RUNIC LETTER TIWAZ TIR TYR T" #x16CF)
+    ("RUNIC LETTER SHORT-TWIG-TYR T" #x16D0)
+    ("RUNIC LETTER D" #x16D1)
+    ("RUNIC LETTER BERKANAN BEORC BJARKAN B" #x16D2)
+    ("RUNIC LETTER SHORT-TWIG-BJARKAN B" #x16D3)
+    ("RUNIC LETTER DOTTED-P" #x16D4)
+    ("RUNIC LETTER OPEN-P" #x16D5)
+    ("RUNIC LETTER EHWAZ EH E" #x16D6)
+    ("RUNIC LETTER MANNAZ MAN M" #x16D7)
+    ("RUNIC LETTER LONG-BRANCH-MADR M" #x16D8)
+    ("RUNIC LETTER SHORT-TWIG-MADR M" #x16D9)
+    ("RUNIC LETTER LAUKAZ LAGU LOGR L" #x16DA)
+    ("RUNIC LETTER DOTTED-L" #x16DB)
+    ("RUNIC LETTER INGWAZ" #x16DC)
+    ("RUNIC LETTER ING" #x16DD)
+    ("RUNIC LETTER DAGAZ DAEG D" #x16DE)
+    ("RUNIC LETTER OTHALAN ETHEL O" #x16DF)
+    ("RUNIC LETTER EAR" #x16E0)
+    ("RUNIC LETTER IOR" #x16E1)
+    ("RUNIC LETTER CWEORTH" #x16E2)
+    ("RUNIC LETTER CALC" #x16E3)
+    ("RUNIC LETTER CEALC" #x16E4)
+    ("RUNIC LETTER STAN" #x16E5)
+    ("RUNIC LETTER LONG-BRANCH-YR" #x16E6)
+    ("RUNIC LETTER SHORT-TWIG-YR" #x16E7)
+    ("RUNIC LETTER ICELANDIC-YR" #x16E8)
+    ("RUNIC LETTER Q" #x16E9)
+    ("RUNIC LETTER X" #x16EA)
+    ("RUNIC SINGLE PUNCTUATION" #x16EB)
+    ("RUNIC MULTIPLE PUNCTUATION" #x16EC)
+    ("RUNIC CROSS PUNCTUATION" #x16ED)
+    ("RUNIC ARLAUG SYMBOL" #x16EE)
+    ("RUNIC TVIMADUR SYMBOL" #x16EF)
+    ("RUNIC BELGTHOR SYMBOL" #x16F0)
+    ))
+
+;; arch-tag: e21b5eb5-adb4-44fa-a453-995bf3c7fdc5
diff --git a/etc/nxml/01700-0171F.el b/etc/nxml/01700-0171F.el
new file mode 100644 (file)
index 0000000..06df506
--- /dev/null
@@ -0,0 +1,24 @@
+(nxml-define-char-name-set 'tagalog
+  '(("TAGALOG LETTER A" #x1700)
+    ("TAGALOG LETTER I" #x1701)
+    ("TAGALOG LETTER U" #x1702)
+    ("TAGALOG LETTER KA" #x1703)
+    ("TAGALOG LETTER GA" #x1704)
+    ("TAGALOG LETTER NGA" #x1705)
+    ("TAGALOG LETTER TA" #x1706)
+    ("TAGALOG LETTER DA" #x1707)
+    ("TAGALOG LETTER NA" #x1708)
+    ("TAGALOG LETTER PA" #x1709)
+    ("TAGALOG LETTER BA" #x170A)
+    ("TAGALOG LETTER MA" #x170B)
+    ("TAGALOG LETTER YA" #x170C)
+    ("TAGALOG LETTER LA" #x170E)
+    ("TAGALOG LETTER WA" #x170F)
+    ("TAGALOG LETTER SA" #x1710)
+    ("TAGALOG LETTER HA" #x1711)
+    ("TAGALOG VOWEL SIGN I" #x1712)
+    ("TAGALOG VOWEL SIGN U" #x1713)
+    ("TAGALOG SIGN VIRAMA" #x1714)
+    ))
+
+;; arch-tag: f30d4825-3942-4534-8671-5fcd71df44ba
diff --git a/etc/nxml/01720-0173F.el b/etc/nxml/01720-0173F.el
new file mode 100644 (file)
index 0000000..a753005
--- /dev/null
@@ -0,0 +1,27 @@
+(nxml-define-char-name-set 'hanunoo
+  '(("HANUNOO LETTER A" #x1720)
+    ("HANUNOO LETTER I" #x1721)
+    ("HANUNOO LETTER U" #x1722)
+    ("HANUNOO LETTER KA" #x1723)
+    ("HANUNOO LETTER GA" #x1724)
+    ("HANUNOO LETTER NGA" #x1725)
+    ("HANUNOO LETTER TA" #x1726)
+    ("HANUNOO LETTER DA" #x1727)
+    ("HANUNOO LETTER NA" #x1728)
+    ("HANUNOO LETTER PA" #x1729)
+    ("HANUNOO LETTER BA" #x172A)
+    ("HANUNOO LETTER MA" #x172B)
+    ("HANUNOO LETTER YA" #x172C)
+    ("HANUNOO LETTER RA" #x172D)
+    ("HANUNOO LETTER LA" #x172E)
+    ("HANUNOO LETTER WA" #x172F)
+    ("HANUNOO LETTER SA" #x1730)
+    ("HANUNOO LETTER HA" #x1731)
+    ("HANUNOO VOWEL SIGN I" #x1732)
+    ("HANUNOO VOWEL SIGN U" #x1733)
+    ("HANUNOO SIGN PAMUDPOD" #x1734)
+    ("PHILIPPINE SINGLE PUNCTUATION" #x1735)
+    ("PHILIPPINE DOUBLE PUNCTUATION" #x1736)
+    ))
+
+;; arch-tag: d577c8e1-70e3-4afc-82f4-b61e4cf0b603
diff --git a/etc/nxml/01740-0175F.el b/etc/nxml/01740-0175F.el
new file mode 100644 (file)
index 0000000..4043bcc
--- /dev/null
@@ -0,0 +1,24 @@
+(nxml-define-char-name-set 'buhid
+  '(("BUHID LETTER A" #x1740)
+    ("BUHID LETTER I" #x1741)
+    ("BUHID LETTER U" #x1742)
+    ("BUHID LETTER KA" #x1743)
+    ("BUHID LETTER GA" #x1744)
+    ("BUHID LETTER NGA" #x1745)
+    ("BUHID LETTER TA" #x1746)
+    ("BUHID LETTER DA" #x1747)
+    ("BUHID LETTER NA" #x1748)
+    ("BUHID LETTER PA" #x1749)
+    ("BUHID LETTER BA" #x174A)
+    ("BUHID LETTER MA" #x174B)
+    ("BUHID LETTER YA" #x174C)
+    ("BUHID LETTER RA" #x174D)
+    ("BUHID LETTER LA" #x174E)
+    ("BUHID LETTER WA" #x174F)
+    ("BUHID LETTER SA" #x1750)
+    ("BUHID LETTER HA" #x1751)
+    ("BUHID VOWEL SIGN I" #x1752)
+    ("BUHID VOWEL SIGN U" #x1753)
+    ))
+
+;; arch-tag: a30b6352-4c93-4908-a5df-0172b643ae23
diff --git a/etc/nxml/01760-0177F.el b/etc/nxml/01760-0177F.el
new file mode 100644 (file)
index 0000000..d6bb109
--- /dev/null
@@ -0,0 +1,22 @@
+(nxml-define-char-name-set 'tagbanwa
+  '(("TAGBANWA LETTER A" #x1760)
+    ("TAGBANWA LETTER I" #x1761)
+    ("TAGBANWA LETTER U" #x1762)
+    ("TAGBANWA LETTER KA" #x1763)
+    ("TAGBANWA LETTER GA" #x1764)
+    ("TAGBANWA LETTER NGA" #x1765)
+    ("TAGBANWA LETTER TA" #x1766)
+    ("TAGBANWA LETTER DA" #x1767)
+    ("TAGBANWA LETTER NA" #x1768)
+    ("TAGBANWA LETTER PA" #x1769)
+    ("TAGBANWA LETTER BA" #x176A)
+    ("TAGBANWA LETTER MA" #x176B)
+    ("TAGBANWA LETTER YA" #x176C)
+    ("TAGBANWA LETTER LA" #x176E)
+    ("TAGBANWA LETTER WA" #x176F)
+    ("TAGBANWA LETTER SA" #x1770)
+    ("TAGBANWA VOWEL SIGN I" #x1772)
+    ("TAGBANWA VOWEL SIGN U" #x1773)
+    ))
+
+;; arch-tag: 7ec84a4f-8077-400f-9b1a-f31b6d75fb65
diff --git a/etc/nxml/01780-017FF.el b/etc/nxml/01780-017FF.el
new file mode 100644 (file)
index 0000000..182440e
--- /dev/null
@@ -0,0 +1,107 @@
+(nxml-define-char-name-set 'khmer
+  '(("KHMER LETTER KA" #x1780)
+    ("KHMER LETTER KHA" #x1781)
+    ("KHMER LETTER KO" #x1782)
+    ("KHMER LETTER KHO" #x1783)
+    ("KHMER LETTER NGO" #x1784)
+    ("KHMER LETTER CA" #x1785)
+    ("KHMER LETTER CHA" #x1786)
+    ("KHMER LETTER CO" #x1787)
+    ("KHMER LETTER CHO" #x1788)
+    ("KHMER LETTER NYO" #x1789)
+    ("KHMER LETTER DA" #x178A)
+    ("KHMER LETTER TTHA" #x178B)
+    ("KHMER LETTER DO" #x178C)
+    ("KHMER LETTER TTHO" #x178D)
+    ("KHMER LETTER NNO" #x178E)
+    ("KHMER LETTER TA" #x178F)
+    ("KHMER LETTER THA" #x1790)
+    ("KHMER LETTER TO" #x1791)
+    ("KHMER LETTER THO" #x1792)
+    ("KHMER LETTER NO" #x1793)
+    ("KHMER LETTER BA" #x1794)
+    ("KHMER LETTER PHA" #x1795)
+    ("KHMER LETTER PO" #x1796)
+    ("KHMER LETTER PHO" #x1797)
+    ("KHMER LETTER MO" #x1798)
+    ("KHMER LETTER YO" #x1799)
+    ("KHMER LETTER RO" #x179A)
+    ("KHMER LETTER LO" #x179B)
+    ("KHMER LETTER VO" #x179C)
+    ("KHMER LETTER SHA" #x179D)
+    ("KHMER LETTER SSO" #x179E)
+    ("KHMER LETTER SA" #x179F)
+    ("KHMER LETTER HA" #x17A0)
+    ("KHMER LETTER LA" #x17A1)
+    ("KHMER LETTER QA" #x17A2)
+    ("KHMER INDEPENDENT VOWEL QAQ" #x17A3)
+    ("KHMER INDEPENDENT VOWEL QAA" #x17A4)
+    ("KHMER INDEPENDENT VOWEL QI" #x17A5)
+    ("KHMER INDEPENDENT VOWEL QII" #x17A6)
+    ("KHMER INDEPENDENT VOWEL QU" #x17A7)
+    ("KHMER INDEPENDENT VOWEL QUK" #x17A8)
+    ("KHMER INDEPENDENT VOWEL QUU" #x17A9)
+    ("KHMER INDEPENDENT VOWEL QUUV" #x17AA)
+    ("KHMER INDEPENDENT VOWEL RY" #x17AB)
+    ("KHMER INDEPENDENT VOWEL RYY" #x17AC)
+    ("KHMER INDEPENDENT VOWEL LY" #x17AD)
+    ("KHMER INDEPENDENT VOWEL LYY" #x17AE)
+    ("KHMER INDEPENDENT VOWEL QE" #x17AF)
+    ("KHMER INDEPENDENT VOWEL QAI" #x17B0)
+    ("KHMER INDEPENDENT VOWEL QOO TYPE ONE" #x17B1)
+    ("KHMER INDEPENDENT VOWEL QOO TYPE TWO" #x17B2)
+    ("KHMER INDEPENDENT VOWEL QAU" #x17B3)
+    ("KHMER VOWEL INHERENT AQ" #x17B4)
+    ("KHMER VOWEL INHERENT AA" #x17B5)
+    ("KHMER VOWEL SIGN AA" #x17B6)
+    ("KHMER VOWEL SIGN I" #x17B7)
+    ("KHMER VOWEL SIGN II" #x17B8)
+    ("KHMER VOWEL SIGN Y" #x17B9)
+    ("KHMER VOWEL SIGN YY" #x17BA)
+    ("KHMER VOWEL SIGN U" #x17BB)
+    ("KHMER VOWEL SIGN UU" #x17BC)
+    ("KHMER VOWEL SIGN UA" #x17BD)
+    ("KHMER VOWEL SIGN OE" #x17BE)
+    ("KHMER VOWEL SIGN YA" #x17BF)
+    ("KHMER VOWEL SIGN IE" #x17C0)
+    ("KHMER VOWEL SIGN E" #x17C1)
+    ("KHMER VOWEL SIGN AE" #x17C2)
+    ("KHMER VOWEL SIGN AI" #x17C3)
+    ("KHMER VOWEL SIGN OO" #x17C4)
+    ("KHMER VOWEL SIGN AU" #x17C5)
+    ("KHMER SIGN NIKAHIT" #x17C6)
+    ("KHMER SIGN REAHMUK" #x17C7)
+    ("KHMER SIGN YUUKALEAPINTU" #x17C8)
+    ("KHMER SIGN MUUSIKATOAN" #x17C9)
+    ("KHMER SIGN TRIISAP" #x17CA)
+    ("KHMER SIGN BANTOC" #x17CB)
+    ("KHMER SIGN ROBAT" #x17CC)
+    ("KHMER SIGN TOANDAKHIAT" #x17CD)
+    ("KHMER SIGN KAKABAT" #x17CE)
+    ("KHMER SIGN AHSDA" #x17CF)
+    ("KHMER SIGN SAMYOK SANNYA" #x17D0)
+    ("KHMER SIGN VIRIAM" #x17D1)
+    ("KHMER SIGN COENG" #x17D2)
+    ("KHMER SIGN BATHAMASAT" #x17D3)
+    ("KHMER SIGN KHAN" #x17D4)
+    ("KHMER SIGN BARIYOOSAN" #x17D5)
+    ("KHMER SIGN CAMNUC PII KUUH" #x17D6)
+    ("KHMER SIGN LEK TOO" #x17D7)
+    ("KHMER SIGN BEYYAL" #x17D8)
+    ("KHMER SIGN PHNAEK MUAN" #x17D9)
+    ("KHMER SIGN KOOMUUT" #x17DA)
+    ("KHMER CURRENCY SYMBOL RIEL" #x17DB)
+    ("KHMER SIGN AVAKRAHASANYA" #x17DC)
+    ("KHMER DIGIT ZERO" #x17E0)
+    ("KHMER DIGIT ONE" #x17E1)
+    ("KHMER DIGIT TWO" #x17E2)
+    ("KHMER DIGIT THREE" #x17E3)
+    ("KHMER DIGIT FOUR" #x17E4)
+    ("KHMER DIGIT FIVE" #x17E5)
+    ("KHMER DIGIT SIX" #x17E6)
+    ("KHMER DIGIT SEVEN" #x17E7)
+    ("KHMER DIGIT EIGHT" #x17E8)
+    ("KHMER DIGIT NINE" #x17E9)
+    ))
+
+;; arch-tag: 2d03b253-c5f2-4595-b346-36e3b87df51c
diff --git a/etc/nxml/01800-018AF.el b/etc/nxml/01800-018AF.el
new file mode 100644 (file)
index 0000000..a24ec71
--- /dev/null
@@ -0,0 +1,159 @@
+(nxml-define-char-name-set 'mongolian
+  '(("MONGOLIAN BIRGA" #x1800)
+    ("MONGOLIAN ELLIPSIS" #x1801)
+    ("MONGOLIAN COMMA" #x1802)
+    ("MONGOLIAN FULL STOP" #x1803)
+    ("MONGOLIAN COLON" #x1804)
+    ("MONGOLIAN FOUR DOTS" #x1805)
+    ("MONGOLIAN TODO SOFT HYPHEN" #x1806)
+    ("MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER" #x1807)
+    ("MONGOLIAN MANCHU COMMA" #x1808)
+    ("MONGOLIAN MANCHU FULL STOP" #x1809)
+    ("MONGOLIAN NIRUGU" #x180A)
+    ("MONGOLIAN FREE VARIATION SELECTOR ONE" #x180B)
+    ("MONGOLIAN FREE VARIATION SELECTOR TWO" #x180C)
+    ("MONGOLIAN FREE VARIATION SELECTOR THREE" #x180D)
+    ("MONGOLIAN VOWEL SEPARATOR" #x180E)
+    ("MONGOLIAN DIGIT ZERO" #x1810)
+    ("MONGOLIAN DIGIT ONE" #x1811)
+    ("MONGOLIAN DIGIT TWO" #x1812)
+    ("MONGOLIAN DIGIT THREE" #x1813)
+    ("MONGOLIAN DIGIT FOUR" #x1814)
+    ("MONGOLIAN DIGIT FIVE" #x1815)
+    ("MONGOLIAN DIGIT SIX" #x1816)
+    ("MONGOLIAN DIGIT SEVEN" #x1817)
+    ("MONGOLIAN DIGIT EIGHT" #x1818)
+    ("MONGOLIAN DIGIT NINE" #x1819)
+    ("MONGOLIAN LETTER A" #x1820)
+    ("MONGOLIAN LETTER E" #x1821)
+    ("MONGOLIAN LETTER I" #x1822)
+    ("MONGOLIAN LETTER O" #x1823)
+    ("MONGOLIAN LETTER U" #x1824)
+    ("MONGOLIAN LETTER OE" #x1825)
+    ("MONGOLIAN LETTER UE" #x1826)
+    ("MONGOLIAN LETTER EE" #x1827)
+    ("MONGOLIAN LETTER NA" #x1828)
+    ("MONGOLIAN LETTER ANG" #x1829)
+    ("MONGOLIAN LETTER BA" #x182A)
+    ("MONGOLIAN LETTER PA" #x182B)
+    ("MONGOLIAN LETTER QA" #x182C)
+    ("MONGOLIAN LETTER GA" #x182D)
+    ("MONGOLIAN LETTER MA" #x182E)
+    ("MONGOLIAN LETTER LA" #x182F)
+    ("MONGOLIAN LETTER SA" #x1830)
+    ("MONGOLIAN LETTER SHA" #x1831)
+    ("MONGOLIAN LETTER TA" #x1832)
+    ("MONGOLIAN LETTER DA" #x1833)
+    ("MONGOLIAN LETTER CHA" #x1834)
+    ("MONGOLIAN LETTER JA" #x1835)
+    ("MONGOLIAN LETTER YA" #x1836)
+    ("MONGOLIAN LETTER RA" #x1837)
+    ("MONGOLIAN LETTER WA" #x1838)
+    ("MONGOLIAN LETTER FA" #x1839)
+    ("MONGOLIAN LETTER KA" #x183A)
+    ("MONGOLIAN LETTER KHA" #x183B)
+    ("MONGOLIAN LETTER TSA" #x183C)
+    ("MONGOLIAN LETTER ZA" #x183D)
+    ("MONGOLIAN LETTER HAA" #x183E)
+    ("MONGOLIAN LETTER ZRA" #x183F)
+    ("MONGOLIAN LETTER LHA" #x1840)
+    ("MONGOLIAN LETTER ZHI" #x1841)
+    ("MONGOLIAN LETTER CHI" #x1842)
+    ("MONGOLIAN LETTER TODO LONG VOWEL SIGN" #x1843)
+    ("MONGOLIAN LETTER TODO E" #x1844)
+    ("MONGOLIAN LETTER TODO I" #x1845)
+    ("MONGOLIAN LETTER TODO O" #x1846)
+    ("MONGOLIAN LETTER TODO U" #x1847)
+    ("MONGOLIAN LETTER TODO OE" #x1848)
+    ("MONGOLIAN LETTER TODO UE" #x1849)
+    ("MONGOLIAN LETTER TODO ANG" #x184A)
+    ("MONGOLIAN LETTER TODO BA" #x184B)
+    ("MONGOLIAN LETTER TODO PA" #x184C)
+    ("MONGOLIAN LETTER TODO QA" #x184D)
+    ("MONGOLIAN LETTER TODO GA" #x184E)
+    ("MONGOLIAN LETTER TODO MA" #x184F)
+    ("MONGOLIAN LETTER TODO TA" #x1850)
+    ("MONGOLIAN LETTER TODO DA" #x1851)
+    ("MONGOLIAN LETTER TODO CHA" #x1852)
+    ("MONGOLIAN LETTER TODO JA" #x1853)
+    ("MONGOLIAN LETTER TODO TSA" #x1854)
+    ("MONGOLIAN LETTER TODO YA" #x1855)
+    ("MONGOLIAN LETTER TODO WA" #x1856)
+    ("MONGOLIAN LETTER TODO KA" #x1857)
+    ("MONGOLIAN LETTER TODO GAA" #x1858)
+    ("MONGOLIAN LETTER TODO HAA" #x1859)
+    ("MONGOLIAN LETTER TODO JIA" #x185A)
+    ("MONGOLIAN LETTER TODO NIA" #x185B)
+    ("MONGOLIAN LETTER TODO DZA" #x185C)
+    ("MONGOLIAN LETTER SIBE E" #x185D)
+    ("MONGOLIAN LETTER SIBE I" #x185E)
+    ("MONGOLIAN LETTER SIBE IY" #x185F)
+    ("MONGOLIAN LETTER SIBE UE" #x1860)
+    ("MONGOLIAN LETTER SIBE U" #x1861)
+    ("MONGOLIAN LETTER SIBE ANG" #x1862)
+    ("MONGOLIAN LETTER SIBE KA" #x1863)
+    ("MONGOLIAN LETTER SIBE GA" #x1864)
+    ("MONGOLIAN LETTER SIBE HA" #x1865)
+    ("MONGOLIAN LETTER SIBE PA" #x1866)
+    ("MONGOLIAN LETTER SIBE SHA" #x1867)
+    ("MONGOLIAN LETTER SIBE TA" #x1868)
+    ("MONGOLIAN LETTER SIBE DA" #x1869)
+    ("MONGOLIAN LETTER SIBE JA" #x186A)
+    ("MONGOLIAN LETTER SIBE FA" #x186B)
+    ("MONGOLIAN LETTER SIBE GAA" #x186C)
+    ("MONGOLIAN LETTER SIBE HAA" #x186D)
+    ("MONGOLIAN LETTER SIBE TSA" #x186E)
+    ("MONGOLIAN LETTER SIBE ZA" #x186F)
+    ("MONGOLIAN LETTER SIBE RAA" #x1870)
+    ("MONGOLIAN LETTER SIBE CHA" #x1871)
+    ("MONGOLIAN LETTER SIBE ZHA" #x1872)
+    ("MONGOLIAN LETTER MANCHU I" #x1873)
+    ("MONGOLIAN LETTER MANCHU KA" #x1874)
+    ("MONGOLIAN LETTER MANCHU RA" #x1875)
+    ("MONGOLIAN LETTER MANCHU FA" #x1876)
+    ("MONGOLIAN LETTER MANCHU ZHA" #x1877)
+    ("MONGOLIAN LETTER ALI GALI ANUSVARA ONE" #x1880)
+    ("MONGOLIAN LETTER ALI GALI VISARGA ONE" #x1881)
+    ("MONGOLIAN LETTER ALI GALI DAMARU" #x1882)
+    ("MONGOLIAN LETTER ALI GALI UBADAMA" #x1883)
+    ("MONGOLIAN LETTER ALI GALI INVERTED UBADAMA" #x1884)
+    ("MONGOLIAN LETTER ALI GALI BALUDA" #x1885)
+    ("MONGOLIAN LETTER ALI GALI THREE BALUDA" #x1886)
+    ("MONGOLIAN LETTER ALI GALI A" #x1887)
+    ("MONGOLIAN LETTER ALI GALI I" #x1888)
+    ("MONGOLIAN LETTER ALI GALI KA" #x1889)
+    ("MONGOLIAN LETTER ALI GALI NGA" #x188A)
+    ("MONGOLIAN LETTER ALI GALI CA" #x188B)
+    ("MONGOLIAN LETTER ALI GALI TTA" #x188C)
+    ("MONGOLIAN LETTER ALI GALI TTHA" #x188D)
+    ("MONGOLIAN LETTER ALI GALI DDA" #x188E)
+    ("MONGOLIAN LETTER ALI GALI NNA" #x188F)
+    ("MONGOLIAN LETTER ALI GALI TA" #x1890)
+    ("MONGOLIAN LETTER ALI GALI DA" #x1891)
+    ("MONGOLIAN LETTER ALI GALI PA" #x1892)
+    ("MONGOLIAN LETTER ALI GALI PHA" #x1893)
+    ("MONGOLIAN LETTER ALI GALI SSA" #x1894)
+    ("MONGOLIAN LETTER ALI GALI ZHA" #x1895)
+    ("MONGOLIAN LETTER ALI GALI ZA" #x1896)
+    ("MONGOLIAN LETTER ALI GALI AH" #x1897)
+    ("MONGOLIAN LETTER TODO ALI GALI TA" #x1898)
+    ("MONGOLIAN LETTER TODO ALI GALI ZHA" #x1899)
+    ("MONGOLIAN LETTER MANCHU ALI GALI GHA" #x189A)
+    ("MONGOLIAN LETTER MANCHU ALI GALI NGA" #x189B)
+    ("MONGOLIAN LETTER MANCHU ALI GALI CA" #x189C)
+    ("MONGOLIAN LETTER MANCHU ALI GALI JHA" #x189D)
+    ("MONGOLIAN LETTER MANCHU ALI GALI TTA" #x189E)
+    ("MONGOLIAN LETTER MANCHU ALI GALI DDHA" #x189F)
+    ("MONGOLIAN LETTER MANCHU ALI GALI TA" #x18A0)
+    ("MONGOLIAN LETTER MANCHU ALI GALI DHA" #x18A1)
+    ("MONGOLIAN LETTER MANCHU ALI GALI SSA" #x18A2)
+    ("MONGOLIAN LETTER MANCHU ALI GALI CYA" #x18A3)
+    ("MONGOLIAN LETTER MANCHU ALI GALI ZHA" #x18A4)
+    ("MONGOLIAN LETTER MANCHU ALI GALI ZA" #x18A5)
+    ("MONGOLIAN LETTER ALI GALI HALF U" #x18A6)
+    ("MONGOLIAN LETTER ALI GALI HALF YA" #x18A7)
+    ("MONGOLIAN LETTER MANCHU ALI GALI BHA" #x18A8)
+    ("MONGOLIAN LETTER ALI GALI DAGALGA" #x18A9)
+    ))
+
+;; arch-tag: 36134d5c-514f-4042-b104-97688d5194b4
diff --git a/etc/nxml/01E00-01EFF.el b/etc/nxml/01E00-01EFF.el
new file mode 100644 (file)
index 0000000..fed5cf3
--- /dev/null
@@ -0,0 +1,250 @@
+(nxml-define-char-name-set 'latin-extended-additional
+  '(("LATIN CAPITAL LETTER A WITH RING BELOW" #x1E00)
+    ("LATIN SMALL LETTER A WITH RING BELOW" #x1E01)
+    ("LATIN CAPITAL LETTER B WITH DOT ABOVE" #x1E02)
+    ("LATIN SMALL LETTER B WITH DOT ABOVE" #x1E03)
+    ("LATIN CAPITAL LETTER B WITH DOT BELOW" #x1E04)
+    ("LATIN SMALL LETTER B WITH DOT BELOW" #x1E05)
+    ("LATIN CAPITAL LETTER B WITH LINE BELOW" #x1E06)
+    ("LATIN SMALL LETTER B WITH LINE BELOW" #x1E07)
+    ("LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE" #x1E08)
+    ("LATIN SMALL LETTER C WITH CEDILLA AND ACUTE" #x1E09)
+    ("LATIN CAPITAL LETTER D WITH DOT ABOVE" #x1E0A)
+    ("LATIN SMALL LETTER D WITH DOT ABOVE" #x1E0B)
+    ("LATIN CAPITAL LETTER D WITH DOT BELOW" #x1E0C)
+    ("LATIN SMALL LETTER D WITH DOT BELOW" #x1E0D)
+    ("LATIN CAPITAL LETTER D WITH LINE BELOW" #x1E0E)
+    ("LATIN SMALL LETTER D WITH LINE BELOW" #x1E0F)
+    ("LATIN CAPITAL LETTER D WITH CEDILLA" #x1E10)
+    ("LATIN SMALL LETTER D WITH CEDILLA" #x1E11)
+    ("LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW" #x1E12)
+    ("LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW" #x1E13)
+    ("LATIN CAPITAL LETTER E WITH MACRON AND GRAVE" #x1E14)
+    ("LATIN SMALL LETTER E WITH MACRON AND GRAVE" #x1E15)
+    ("LATIN CAPITAL LETTER E WITH MACRON AND ACUTE" #x1E16)
+    ("LATIN SMALL LETTER E WITH MACRON AND ACUTE" #x1E17)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW" #x1E18)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW" #x1E19)
+    ("LATIN CAPITAL LETTER E WITH TILDE BELOW" #x1E1A)
+    ("LATIN SMALL LETTER E WITH TILDE BELOW" #x1E1B)
+    ("LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE" #x1E1C)
+    ("LATIN SMALL LETTER E WITH CEDILLA AND BREVE" #x1E1D)
+    ("LATIN CAPITAL LETTER F WITH DOT ABOVE" #x1E1E)
+    ("LATIN SMALL LETTER F WITH DOT ABOVE" #x1E1F)
+    ("LATIN CAPITAL LETTER G WITH MACRON" #x1E20)
+    ("LATIN SMALL LETTER G WITH MACRON" #x1E21)
+    ("LATIN CAPITAL LETTER H WITH DOT ABOVE" #x1E22)
+    ("LATIN SMALL LETTER H WITH DOT ABOVE" #x1E23)
+    ("LATIN CAPITAL LETTER H WITH DOT BELOW" #x1E24)
+    ("LATIN SMALL LETTER H WITH DOT BELOW" #x1E25)
+    ("LATIN CAPITAL LETTER H WITH DIAERESIS" #x1E26)
+    ("LATIN SMALL LETTER H WITH DIAERESIS" #x1E27)
+    ("LATIN CAPITAL LETTER H WITH CEDILLA" #x1E28)
+    ("LATIN SMALL LETTER H WITH CEDILLA" #x1E29)
+    ("LATIN CAPITAL LETTER H WITH BREVE BELOW" #x1E2A)
+    ("LATIN SMALL LETTER H WITH BREVE BELOW" #x1E2B)
+    ("LATIN CAPITAL LETTER I WITH TILDE BELOW" #x1E2C)
+    ("LATIN SMALL LETTER I WITH TILDE BELOW" #x1E2D)
+    ("LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE" #x1E2E)
+    ("LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE" #x1E2F)
+    ("LATIN CAPITAL LETTER K WITH ACUTE" #x1E30)
+    ("LATIN SMALL LETTER K WITH ACUTE" #x1E31)
+    ("LATIN CAPITAL LETTER K WITH DOT BELOW" #x1E32)
+    ("LATIN SMALL LETTER K WITH DOT BELOW" #x1E33)
+    ("LATIN CAPITAL LETTER K WITH LINE BELOW" #x1E34)
+    ("LATIN SMALL LETTER K WITH LINE BELOW" #x1E35)
+    ("LATIN CAPITAL LETTER L WITH DOT BELOW" #x1E36)
+    ("LATIN SMALL LETTER L WITH DOT BELOW" #x1E37)
+    ("LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON" #x1E38)
+    ("LATIN SMALL LETTER L WITH DOT BELOW AND MACRON" #x1E39)
+    ("LATIN CAPITAL LETTER L WITH LINE BELOW" #x1E3A)
+    ("LATIN SMALL LETTER L WITH LINE BELOW" #x1E3B)
+    ("LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW" #x1E3C)
+    ("LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW" #x1E3D)
+    ("LATIN CAPITAL LETTER M WITH ACUTE" #x1E3E)
+    ("LATIN SMALL LETTER M WITH ACUTE" #x1E3F)
+    ("LATIN CAPITAL LETTER M WITH DOT ABOVE" #x1E40)
+    ("LATIN SMALL LETTER M WITH DOT ABOVE" #x1E41)
+    ("LATIN CAPITAL LETTER M WITH DOT BELOW" #x1E42)
+    ("LATIN SMALL LETTER M WITH DOT BELOW" #x1E43)
+    ("LATIN CAPITAL LETTER N WITH DOT ABOVE" #x1E44)
+    ("LATIN SMALL LETTER N WITH DOT ABOVE" #x1E45)
+    ("LATIN CAPITAL LETTER N WITH DOT BELOW" #x1E46)
+    ("LATIN SMALL LETTER N WITH DOT BELOW" #x1E47)
+    ("LATIN CAPITAL LETTER N WITH LINE BELOW" #x1E48)
+    ("LATIN SMALL LETTER N WITH LINE BELOW" #x1E49)
+    ("LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW" #x1E4A)
+    ("LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW" #x1E4B)
+    ("LATIN CAPITAL LETTER O WITH TILDE AND ACUTE" #x1E4C)
+    ("LATIN SMALL LETTER O WITH TILDE AND ACUTE" #x1E4D)
+    ("LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS" #x1E4E)
+    ("LATIN SMALL LETTER O WITH TILDE AND DIAERESIS" #x1E4F)
+    ("LATIN CAPITAL LETTER O WITH MACRON AND GRAVE" #x1E50)
+    ("LATIN SMALL LETTER O WITH MACRON AND GRAVE" #x1E51)
+    ("LATIN CAPITAL LETTER O WITH MACRON AND ACUTE" #x1E52)
+    ("LATIN SMALL LETTER O WITH MACRON AND ACUTE" #x1E53)
+    ("LATIN CAPITAL LETTER P WITH ACUTE" #x1E54)
+    ("LATIN SMALL LETTER P WITH ACUTE" #x1E55)
+    ("LATIN CAPITAL LETTER P WITH DOT ABOVE" #x1E56)
+    ("LATIN SMALL LETTER P WITH DOT ABOVE" #x1E57)
+    ("LATIN CAPITAL LETTER R WITH DOT ABOVE" #x1E58)
+    ("LATIN SMALL LETTER R WITH DOT ABOVE" #x1E59)
+    ("LATIN CAPITAL LETTER R WITH DOT BELOW" #x1E5A)
+    ("LATIN SMALL LETTER R WITH DOT BELOW" #x1E5B)
+    ("LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON" #x1E5C)
+    ("LATIN SMALL LETTER R WITH DOT BELOW AND MACRON" #x1E5D)
+    ("LATIN CAPITAL LETTER R WITH LINE BELOW" #x1E5E)
+    ("LATIN SMALL LETTER R WITH LINE BELOW" #x1E5F)
+    ("LATIN CAPITAL LETTER S WITH DOT ABOVE" #x1E60)
+    ("LATIN SMALL LETTER S WITH DOT ABOVE" #x1E61)
+    ("LATIN CAPITAL LETTER S WITH DOT BELOW" #x1E62)
+    ("LATIN SMALL LETTER S WITH DOT BELOW" #x1E63)
+    ("LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE" #x1E64)
+    ("LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE" #x1E65)
+    ("LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE" #x1E66)
+    ("LATIN SMALL LETTER S WITH CARON AND DOT ABOVE" #x1E67)
+    ("LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE" #x1E68)
+    ("LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE" #x1E69)
+    ("LATIN CAPITAL LETTER T WITH DOT ABOVE" #x1E6A)
+    ("LATIN SMALL LETTER T WITH DOT ABOVE" #x1E6B)
+    ("LATIN CAPITAL LETTER T WITH DOT BELOW" #x1E6C)
+    ("LATIN SMALL LETTER T WITH DOT BELOW" #x1E6D)
+    ("LATIN CAPITAL LETTER T WITH LINE BELOW" #x1E6E)
+    ("LATIN SMALL LETTER T WITH LINE BELOW" #x1E6F)
+    ("LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW" #x1E70)
+    ("LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW" #x1E71)
+    ("LATIN CAPITAL LETTER U WITH DIAERESIS BELOW" #x1E72)
+    ("LATIN SMALL LETTER U WITH DIAERESIS BELOW" #x1E73)
+    ("LATIN CAPITAL LETTER U WITH TILDE BELOW" #x1E74)
+    ("LATIN SMALL LETTER U WITH TILDE BELOW" #x1E75)
+    ("LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW" #x1E76)
+    ("LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW" #x1E77)
+    ("LATIN CAPITAL LETTER U WITH TILDE AND ACUTE" #x1E78)
+    ("LATIN SMALL LETTER U WITH TILDE AND ACUTE" #x1E79)
+    ("LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS" #x1E7A)
+    ("LATIN SMALL LETTER U WITH MACRON AND DIAERESIS" #x1E7B)
+    ("LATIN CAPITAL LETTER V WITH TILDE" #x1E7C)
+    ("LATIN SMALL LETTER V WITH TILDE" #x1E7D)
+    ("LATIN CAPITAL LETTER V WITH DOT BELOW" #x1E7E)
+    ("LATIN SMALL LETTER V WITH DOT BELOW" #x1E7F)
+    ("LATIN CAPITAL LETTER W WITH GRAVE" #x1E80)
+    ("LATIN SMALL LETTER W WITH GRAVE" #x1E81)
+    ("LATIN CAPITAL LETTER W WITH ACUTE" #x1E82)
+    ("LATIN SMALL LETTER W WITH ACUTE" #x1E83)
+    ("LATIN CAPITAL LETTER W WITH DIAERESIS" #x1E84)
+    ("LATIN SMALL LETTER W WITH DIAERESIS" #x1E85)
+    ("LATIN CAPITAL LETTER W WITH DOT ABOVE" #x1E86)
+    ("LATIN SMALL LETTER W WITH DOT ABOVE" #x1E87)
+    ("LATIN CAPITAL LETTER W WITH DOT BELOW" #x1E88)
+    ("LATIN SMALL LETTER W WITH DOT BELOW" #x1E89)
+    ("LATIN CAPITAL LETTER X WITH DOT ABOVE" #x1E8A)
+    ("LATIN SMALL LETTER X WITH DOT ABOVE" #x1E8B)
+    ("LATIN CAPITAL LETTER X WITH DIAERESIS" #x1E8C)
+    ("LATIN SMALL LETTER X WITH DIAERESIS" #x1E8D)
+    ("LATIN CAPITAL LETTER Y WITH DOT ABOVE" #x1E8E)
+    ("LATIN SMALL LETTER Y WITH DOT ABOVE" #x1E8F)
+    ("LATIN CAPITAL LETTER Z WITH CIRCUMFLEX" #x1E90)
+    ("LATIN SMALL LETTER Z WITH CIRCUMFLEX" #x1E91)
+    ("LATIN CAPITAL LETTER Z WITH DOT BELOW" #x1E92)
+    ("LATIN SMALL LETTER Z WITH DOT BELOW" #x1E93)
+    ("LATIN CAPITAL LETTER Z WITH LINE BELOW" #x1E94)
+    ("LATIN SMALL LETTER Z WITH LINE BELOW" #x1E95)
+    ("LATIN SMALL LETTER H WITH LINE BELOW" #x1E96)
+    ("LATIN SMALL LETTER T WITH DIAERESIS" #x1E97)
+    ("LATIN SMALL LETTER W WITH RING ABOVE" #x1E98)
+    ("LATIN SMALL LETTER Y WITH RING ABOVE" #x1E99)
+    ("LATIN SMALL LETTER A WITH RIGHT HALF RING" #x1E9A)
+    ("LATIN SMALL LETTER LONG S WITH DOT ABOVE" #x1E9B)
+    ("LATIN CAPITAL LETTER A WITH DOT BELOW" #x1EA0)
+    ("LATIN SMALL LETTER A WITH DOT BELOW" #x1EA1)
+    ("LATIN CAPITAL LETTER A WITH HOOK ABOVE" #x1EA2)
+    ("LATIN SMALL LETTER A WITH HOOK ABOVE" #x1EA3)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE" #x1EA4)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE" #x1EA5)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE" #x1EA6)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE" #x1EA7)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE" #x1EA8)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE" #x1EA9)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE" #x1EAA)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE" #x1EAB)
+    ("LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW" #x1EAC)
+    ("LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW" #x1EAD)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND ACUTE" #x1EAE)
+    ("LATIN SMALL LETTER A WITH BREVE AND ACUTE" #x1EAF)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND GRAVE" #x1EB0)
+    ("LATIN SMALL LETTER A WITH BREVE AND GRAVE" #x1EB1)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE" #x1EB2)
+    ("LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE" #x1EB3)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND TILDE" #x1EB4)
+    ("LATIN SMALL LETTER A WITH BREVE AND TILDE" #x1EB5)
+    ("LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW" #x1EB6)
+    ("LATIN SMALL LETTER A WITH BREVE AND DOT BELOW" #x1EB7)
+    ("LATIN CAPITAL LETTER E WITH DOT BELOW" #x1EB8)
+    ("LATIN SMALL LETTER E WITH DOT BELOW" #x1EB9)
+    ("LATIN CAPITAL LETTER E WITH HOOK ABOVE" #x1EBA)
+    ("LATIN SMALL LETTER E WITH HOOK ABOVE" #x1EBB)
+    ("LATIN CAPITAL LETTER E WITH TILDE" #x1EBC)
+    ("LATIN SMALL LETTER E WITH TILDE" #x1EBD)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE" #x1EBE)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE" #x1EBF)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE" #x1EC0)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE" #x1EC1)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE" #x1EC2)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE" #x1EC3)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE" #x1EC4)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE" #x1EC5)
+    ("LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW" #x1EC6)
+    ("LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW" #x1EC7)
+    ("LATIN CAPITAL LETTER I WITH HOOK ABOVE" #x1EC8)
+    ("LATIN SMALL LETTER I WITH HOOK ABOVE" #x1EC9)
+    ("LATIN CAPITAL LETTER I WITH DOT BELOW" #x1ECA)
+    ("LATIN SMALL LETTER I WITH DOT BELOW" #x1ECB)
+    ("LATIN CAPITAL LETTER O WITH DOT BELOW" #x1ECC)
+    ("LATIN SMALL LETTER O WITH DOT BELOW" #x1ECD)
+    ("LATIN CAPITAL LETTER O WITH HOOK ABOVE" #x1ECE)
+    ("LATIN SMALL LETTER O WITH HOOK ABOVE" #x1ECF)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE" #x1ED0)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE" #x1ED1)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE" #x1ED2)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE" #x1ED3)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE" #x1ED4)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE" #x1ED5)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE" #x1ED6)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE" #x1ED7)
+    ("LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW" #x1ED8)
+    ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW" #x1ED9)
+    ("LATIN CAPITAL LETTER O WITH HORN AND ACUTE" #x1EDA)
+    ("LATIN SMALL LETTER O WITH HORN AND ACUTE" #x1EDB)
+    ("LATIN CAPITAL LETTER O WITH HORN AND GRAVE" #x1EDC)
+    ("LATIN SMALL LETTER O WITH HORN AND GRAVE" #x1EDD)
+    ("LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE" #x1EDE)
+    ("LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE" #x1EDF)
+    ("LATIN CAPITAL LETTER O WITH HORN AND TILDE" #x1EE0)
+    ("LATIN SMALL LETTER O WITH HORN AND TILDE" #x1EE1)
+    ("LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW" #x1EE2)
+    ("LATIN SMALL LETTER O WITH HORN AND DOT BELOW" #x1EE3)
+    ("LATIN CAPITAL LETTER U WITH DOT BELOW" #x1EE4)
+    ("LATIN SMALL LETTER U WITH DOT BELOW" #x1EE5)
+    ("LATIN CAPITAL LETTER U WITH HOOK ABOVE" #x1EE6)
+    ("LATIN SMALL LETTER U WITH HOOK ABOVE" #x1EE7)
+    ("LATIN CAPITAL LETTER U WITH HORN AND ACUTE" #x1EE8)
+    ("LATIN SMALL LETTER U WITH HORN AND ACUTE" #x1EE9)
+    ("LATIN CAPITAL LETTER U WITH HORN AND GRAVE" #x1EEA)
+    ("LATIN SMALL LETTER U WITH HORN AND GRAVE" #x1EEB)
+    ("LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE" #x1EEC)
+    ("LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE" #x1EED)
+    ("LATIN CAPITAL LETTER U WITH HORN AND TILDE" #x1EEE)
+    ("LATIN SMALL LETTER U WITH HORN AND TILDE" #x1EEF)
+    ("LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW" #x1EF0)
+    ("LATIN SMALL LETTER U WITH HORN AND DOT BELOW" #x1EF1)
+    ("LATIN CAPITAL LETTER Y WITH GRAVE" #x1EF2)
+    ("LATIN SMALL LETTER Y WITH GRAVE" #x1EF3)
+    ("LATIN CAPITAL LETTER Y WITH DOT BELOW" #x1EF4)
+    ("LATIN SMALL LETTER Y WITH DOT BELOW" #x1EF5)
+    ("LATIN CAPITAL LETTER Y WITH HOOK ABOVE" #x1EF6)
+    ("LATIN SMALL LETTER Y WITH HOOK ABOVE" #x1EF7)
+    ("LATIN CAPITAL LETTER Y WITH TILDE" #x1EF8)
+    ("LATIN SMALL LETTER Y WITH TILDE" #x1EF9)
+    ))
+
+;; arch-tag: 67862606-3d2a-4063-b666-45ccd6edff6b
diff --git a/etc/nxml/01F00-01FFF.el b/etc/nxml/01F00-01FFF.el
new file mode 100644 (file)
index 0000000..5da301f
--- /dev/null
@@ -0,0 +1,237 @@
+(nxml-define-char-name-set 'greek-extended
+  '(("GREEK SMALL LETTER ALPHA WITH PSILI" #x1F00)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA" #x1F01)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA" #x1F02)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA" #x1F03)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA" #x1F04)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA" #x1F05)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI" #x1F06)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI" #x1F07)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI" #x1F08)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA" #x1F09)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA" #x1F0A)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA" #x1F0B)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA" #x1F0C)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA" #x1F0D)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI" #x1F0E)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI" #x1F0F)
+    ("GREEK SMALL LETTER EPSILON WITH PSILI" #x1F10)
+    ("GREEK SMALL LETTER EPSILON WITH DASIA" #x1F11)
+    ("GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA" #x1F12)
+    ("GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA" #x1F13)
+    ("GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA" #x1F14)
+    ("GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA" #x1F15)
+    ("GREEK CAPITAL LETTER EPSILON WITH PSILI" #x1F18)
+    ("GREEK CAPITAL LETTER EPSILON WITH DASIA" #x1F19)
+    ("GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA" #x1F1A)
+    ("GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA" #x1F1B)
+    ("GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA" #x1F1C)
+    ("GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA" #x1F1D)
+    ("GREEK SMALL LETTER ETA WITH PSILI" #x1F20)
+    ("GREEK SMALL LETTER ETA WITH DASIA" #x1F21)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND VARIA" #x1F22)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND VARIA" #x1F23)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND OXIA" #x1F24)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND OXIA" #x1F25)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI" #x1F26)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI" #x1F27)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI" #x1F28)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA" #x1F29)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA" #x1F2A)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA" #x1F2B)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA" #x1F2C)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA" #x1F2D)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI" #x1F2E)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI" #x1F2F)
+    ("GREEK SMALL LETTER IOTA WITH PSILI" #x1F30)
+    ("GREEK SMALL LETTER IOTA WITH DASIA" #x1F31)
+    ("GREEK SMALL LETTER IOTA WITH PSILI AND VARIA" #x1F32)
+    ("GREEK SMALL LETTER IOTA WITH DASIA AND VARIA" #x1F33)
+    ("GREEK SMALL LETTER IOTA WITH PSILI AND OXIA" #x1F34)
+    ("GREEK SMALL LETTER IOTA WITH DASIA AND OXIA" #x1F35)
+    ("GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI" #x1F36)
+    ("GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI" #x1F37)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI" #x1F38)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA" #x1F39)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA" #x1F3A)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA" #x1F3B)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA" #x1F3C)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA" #x1F3D)
+    ("GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI" #x1F3E)
+    ("GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI" #x1F3F)
+    ("GREEK SMALL LETTER OMICRON WITH PSILI" #x1F40)
+    ("GREEK SMALL LETTER OMICRON WITH DASIA" #x1F41)
+    ("GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA" #x1F42)
+    ("GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA" #x1F43)
+    ("GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA" #x1F44)
+    ("GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA" #x1F45)
+    ("GREEK CAPITAL LETTER OMICRON WITH PSILI" #x1F48)
+    ("GREEK CAPITAL LETTER OMICRON WITH DASIA" #x1F49)
+    ("GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA" #x1F4A)
+    ("GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA" #x1F4B)
+    ("GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA" #x1F4C)
+    ("GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA" #x1F4D)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI" #x1F50)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA" #x1F51)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA" #x1F52)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA" #x1F53)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA" #x1F54)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA" #x1F55)
+    ("GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI" #x1F56)
+    ("GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI" #x1F57)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA" #x1F59)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA" #x1F5B)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA" #x1F5D)
+    ("GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI" #x1F5F)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI" #x1F60)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA" #x1F61)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA" #x1F62)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA" #x1F63)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA" #x1F64)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA" #x1F65)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI" #x1F66)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI" #x1F67)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI" #x1F68)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA" #x1F69)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA" #x1F6A)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA" #x1F6B)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA" #x1F6C)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA" #x1F6D)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI" #x1F6E)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI" #x1F6F)
+    ("GREEK SMALL LETTER ALPHA WITH VARIA" #x1F70)
+    ("GREEK SMALL LETTER ALPHA WITH OXIA" #x1F71)
+    ("GREEK SMALL LETTER EPSILON WITH VARIA" #x1F72)
+    ("GREEK SMALL LETTER EPSILON WITH OXIA" #x1F73)
+    ("GREEK SMALL LETTER ETA WITH VARIA" #x1F74)
+    ("GREEK SMALL LETTER ETA WITH OXIA" #x1F75)
+    ("GREEK SMALL LETTER IOTA WITH VARIA" #x1F76)
+    ("GREEK SMALL LETTER IOTA WITH OXIA" #x1F77)
+    ("GREEK SMALL LETTER OMICRON WITH VARIA" #x1F78)
+    ("GREEK SMALL LETTER OMICRON WITH OXIA" #x1F79)
+    ("GREEK SMALL LETTER UPSILON WITH VARIA" #x1F7A)
+    ("GREEK SMALL LETTER UPSILON WITH OXIA" #x1F7B)
+    ("GREEK SMALL LETTER OMEGA WITH VARIA" #x1F7C)
+    ("GREEK SMALL LETTER OMEGA WITH OXIA" #x1F7D)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI" #x1F80)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI" #x1F81)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI" #x1F82)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI" #x1F83)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI" #x1F84)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI" #x1F85)
+    ("GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI" #x1F86)
+    ("GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI" #x1F87)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI" #x1F88)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI" #x1F89)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI" #x1F8A)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI" #x1F8B)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI" #x1F8C)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI" #x1F8D)
+    ("GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI" #x1F8E)
+    ("GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI" #x1F8F)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI" #x1F90)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI" #x1F91)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI" #x1F92)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI" #x1F93)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI" #x1F94)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI" #x1F95)
+    ("GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI" #x1F96)
+    ("GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI" #x1F97)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI" #x1F98)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI" #x1F99)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI" #x1F9A)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI" #x1F9B)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI" #x1F9C)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI" #x1F9D)
+    ("GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI" #x1F9E)
+    ("GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI" #x1F9F)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI" #x1FA0)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI" #x1FA1)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI" #x1FA2)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI" #x1FA3)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI" #x1FA4)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI" #x1FA5)
+    ("GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI" #x1FA6)
+    ("GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI" #x1FA7)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI" #x1FA8)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI" #x1FA9)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI" #x1FAA)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI" #x1FAB)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI" #x1FAC)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI" #x1FAD)
+    ("GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI" #x1FAE)
+    ("GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI" #x1FAF)
+    ("GREEK SMALL LETTER ALPHA WITH VRACHY" #x1FB0)
+    ("GREEK SMALL LETTER ALPHA WITH MACRON" #x1FB1)
+    ("GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI" #x1FB2)
+    ("GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI" #x1FB3)
+    ("GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI" #x1FB4)
+    ("GREEK SMALL LETTER ALPHA WITH PERISPOMENI" #x1FB6)
+    ("GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI" #x1FB7)
+    ("GREEK CAPITAL LETTER ALPHA WITH VRACHY" #x1FB8)
+    ("GREEK CAPITAL LETTER ALPHA WITH MACRON" #x1FB9)
+    ("GREEK CAPITAL LETTER ALPHA WITH VARIA" #x1FBA)
+    ("GREEK CAPITAL LETTER ALPHA WITH OXIA" #x1FBB)
+    ("GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI" #x1FBC)
+    ("GREEK KORONIS" #x1FBD)
+    ("GREEK PROSGEGRAMMENI" #x1FBE)
+    ("GREEK PSILI" #x1FBF)
+    ("GREEK PERISPOMENI" #x1FC0)
+    ("GREEK DIALYTIKA AND PERISPOMENI" #x1FC1)
+    ("GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI" #x1FC2)
+    ("GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI" #x1FC3)
+    ("GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI" #x1FC4)
+    ("GREEK SMALL LETTER ETA WITH PERISPOMENI" #x1FC6)
+    ("GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI" #x1FC7)
+    ("GREEK CAPITAL LETTER EPSILON WITH VARIA" #x1FC8)
+    ("GREEK CAPITAL LETTER EPSILON WITH OXIA" #x1FC9)
+    ("GREEK CAPITAL LETTER ETA WITH VARIA" #x1FCA)
+    ("GREEK CAPITAL LETTER ETA WITH OXIA" #x1FCB)
+    ("GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI" #x1FCC)
+    ("GREEK PSILI AND VARIA" #x1FCD)
+    ("GREEK PSILI AND OXIA" #x1FCE)
+    ("GREEK PSILI AND PERISPOMENI" #x1FCF)
+    ("GREEK SMALL LETTER IOTA WITH VRACHY" #x1FD0)
+    ("GREEK SMALL LETTER IOTA WITH MACRON" #x1FD1)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA" #x1FD2)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA" #x1FD3)
+    ("GREEK SMALL LETTER IOTA WITH PERISPOMENI" #x1FD6)
+    ("GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI" #x1FD7)
+    ("GREEK CAPITAL LETTER IOTA WITH VRACHY" #x1FD8)
+    ("GREEK CAPITAL LETTER IOTA WITH MACRON" #x1FD9)
+    ("GREEK CAPITAL LETTER IOTA WITH VARIA" #x1FDA)
+    ("GREEK CAPITAL LETTER IOTA WITH OXIA" #x1FDB)
+    ("GREEK DASIA AND VARIA" #x1FDD)
+    ("GREEK DASIA AND OXIA" #x1FDE)
+    ("GREEK DASIA AND PERISPOMENI" #x1FDF)
+    ("GREEK SMALL LETTER UPSILON WITH VRACHY" #x1FE0)
+    ("GREEK SMALL LETTER UPSILON WITH MACRON" #x1FE1)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA" #x1FE2)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA" #x1FE3)
+    ("GREEK SMALL LETTER RHO WITH PSILI" #x1FE4)
+    ("GREEK SMALL LETTER RHO WITH DASIA" #x1FE5)
+    ("GREEK SMALL LETTER UPSILON WITH PERISPOMENI" #x1FE6)
+    ("GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI" #x1FE7)
+    ("GREEK CAPITAL LETTER UPSILON WITH VRACHY" #x1FE8)
+    ("GREEK CAPITAL LETTER UPSILON WITH MACRON" #x1FE9)
+    ("GREEK CAPITAL LETTER UPSILON WITH VARIA" #x1FEA)
+    ("GREEK CAPITAL LETTER UPSILON WITH OXIA" #x1FEB)
+    ("GREEK CAPITAL LETTER RHO WITH DASIA" #x1FEC)
+    ("GREEK DIALYTIKA AND VARIA" #x1FED)
+    ("GREEK DIALYTIKA AND OXIA" #x1FEE)
+    ("GREEK VARIA" #x1FEF)
+    ("GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI" #x1FF2)
+    ("GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI" #x1FF3)
+    ("GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI" #x1FF4)
+    ("GREEK SMALL LETTER OMEGA WITH PERISPOMENI" #x1FF6)
+    ("GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI" #x1FF7)
+    ("GREEK CAPITAL LETTER OMICRON WITH VARIA" #x1FF8)
+    ("GREEK CAPITAL LETTER OMICRON WITH OXIA" #x1FF9)
+    ("GREEK CAPITAL LETTER OMEGA WITH VARIA" #x1FFA)
+    ("GREEK CAPITAL LETTER OMEGA WITH OXIA" #x1FFB)
+    ("GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI" #x1FFC)
+    ("GREEK OXIA" #x1FFD)
+    ("GREEK DASIA" #x1FFE)
+    ))
+
+;; arch-tag: ace2193e-e5be-4800-898e-efad7ba5d6da
diff --git a/etc/nxml/02000-0206F.el b/etc/nxml/02000-0206F.el
new file mode 100644 (file)
index 0000000..0a367cb
--- /dev/null
@@ -0,0 +1,99 @@
+(nxml-define-char-name-set 'general-punctuation
+  '(("EN QUAD" #x2000)
+    ("EM QUAD" #x2001)
+    ("EN SPACE" #x2002)
+    ("EM SPACE" #x2003)
+    ("THREE-PER-EM SPACE" #x2004)
+    ("FOUR-PER-EM SPACE" #x2005)
+    ("SIX-PER-EM SPACE" #x2006)
+    ("FIGURE SPACE" #x2007)
+    ("PUNCTUATION SPACE" #x2008)
+    ("THIN SPACE" #x2009)
+    ("HAIR SPACE" #x200A)
+    ("ZERO WIDTH SPACE" #x200B)
+    ("ZERO WIDTH NON-JOINER" #x200C)
+    ("ZERO WIDTH JOINER" #x200D)
+    ("LEFT-TO-RIGHT MARK" #x200E)
+    ("RIGHT-TO-LEFT MARK" #x200F)
+    ("HYPHEN" #x2010)
+    ("NON-BREAKING HYPHEN" #x2011)
+    ("FIGURE DASH" #x2012)
+    ("EN DASH" #x2013)
+    ("EM DASH" #x2014)
+    ("HORIZONTAL BAR" #x2015)
+    ("DOUBLE VERTICAL LINE" #x2016)
+    ("DOUBLE LOW LINE" #x2017)
+    ("LEFT SINGLE QUOTATION MARK" #x2018)
+    ("RIGHT SINGLE QUOTATION MARK" #x2019)
+    ("SINGLE LOW-9 QUOTATION MARK" #x201A)
+    ("SINGLE HIGH-REVERSED-9 QUOTATION MARK" #x201B)
+    ("LEFT DOUBLE QUOTATION MARK" #x201C)
+    ("RIGHT DOUBLE QUOTATION MARK" #x201D)
+    ("DOUBLE LOW-9 QUOTATION MARK" #x201E)
+    ("DOUBLE HIGH-REVERSED-9 QUOTATION MARK" #x201F)
+    ("DAGGER" #x2020)
+    ("DOUBLE DAGGER" #x2021)
+    ("BULLET" #x2022)
+    ("TRIANGULAR BULLET" #x2023)
+    ("ONE DOT LEADER" #x2024)
+    ("TWO DOT LEADER" #x2025)
+    ("HORIZONTAL ELLIPSIS" #x2026)
+    ("HYPHENATION POINT" #x2027)
+    ("LINE SEPARATOR" #x2028)
+    ("PARAGRAPH SEPARATOR" #x2029)
+    ("LEFT-TO-RIGHT EMBEDDING" #x202A)
+    ("RIGHT-TO-LEFT EMBEDDING" #x202B)
+    ("POP DIRECTIONAL FORMATTING" #x202C)
+    ("LEFT-TO-RIGHT OVERRIDE" #x202D)
+    ("RIGHT-TO-LEFT OVERRIDE" #x202E)
+    ("NARROW NO-BREAK SPACE" #x202F)
+    ("PER MILLE SIGN" #x2030)
+    ("PER TEN THOUSAND SIGN" #x2031)
+    ("PRIME" #x2032)
+    ("DOUBLE PRIME" #x2033)
+    ("TRIPLE PRIME" #x2034)
+    ("REVERSED PRIME" #x2035)
+    ("REVERSED DOUBLE PRIME" #x2036)
+    ("REVERSED TRIPLE PRIME" #x2037)
+    ("CARET" #x2038)
+    ("SINGLE LEFT-POINTING ANGLE QUOTATION MARK" #x2039)
+    ("SINGLE RIGHT-POINTING ANGLE QUOTATION MARK" #x203A)
+    ("REFERENCE MARK" #x203B)
+    ("DOUBLE EXCLAMATION MARK" #x203C)
+    ("INTERROBANG" #x203D)
+    ("OVERLINE" #x203E)
+    ("UNDERTIE" #x203F)
+    ("CHARACTER TIE" #x2040)
+    ("CARET INSERTION POINT" #x2041)
+    ("ASTERISM" #x2042)
+    ("HYPHEN BULLET" #x2043)
+    ("FRACTION SLASH" #x2044)
+    ("LEFT SQUARE BRACKET WITH QUILL" #x2045)
+    ("RIGHT SQUARE BRACKET WITH QUILL" #x2046)
+    ("DOUBLE QUESTION MARK" #x2047)
+    ("QUESTION EXCLAMATION MARK" #x2048)
+    ("EXCLAMATION QUESTION MARK" #x2049)
+    ("TIRONIAN SIGN ET" #x204A)
+    ("REVERSED PILCROW SIGN" #x204B)
+    ("BLACK LEFTWARDS BULLET" #x204C)
+    ("BLACK RIGHTWARDS BULLET" #x204D)
+    ("LOW ASTERISK" #x204E)
+    ("REVERSED SEMICOLON" #x204F)
+    ("CLOSE UP" #x2050)
+    ("TWO ASTERISKS ALIGNED VERTICALLY" #x2051)
+    ("COMMERCIAL MINUS SIGN" #x2052)
+    ("QUADRUPLE PRIME" #x2057)
+    ("MEDIUM MATHEMATICAL SPACE" #x205F)
+    ("WORD JOINER" #x2060)
+    ("FUNCTION APPLICATION" #x2061)
+    ("INVISIBLE TIMES" #x2062)
+    ("INVISIBLE SEPARATOR" #x2063)
+    ("INHIBIT SYMMETRIC SWAPPING" #x206A)
+    ("ACTIVATE SYMMETRIC SWAPPING" #x206B)
+    ("INHIBIT ARABIC FORM SHAPING" #x206C)
+    ("ACTIVATE ARABIC FORM SHAPING" #x206D)
+    ("NATIONAL DIGIT SHAPES" #x206E)
+    ("NOMINAL DIGIT SHAPES" #x206F)
+    ))
+
+;; arch-tag: 9208787e-c528-416d-a9b1-7261c9cde84e
diff --git a/etc/nxml/02070-0209F.el b/etc/nxml/02070-0209F.el
new file mode 100644 (file)
index 0000000..aad7f33
--- /dev/null
@@ -0,0 +1,33 @@
+(nxml-define-char-name-set 'superscripts-and-subscripts
+  '(("SUPERSCRIPT ZERO" #x2070)
+    ("SUPERSCRIPT LATIN SMALL LETTER I" #x2071)
+    ("SUPERSCRIPT FOUR" #x2074)
+    ("SUPERSCRIPT FIVE" #x2075)
+    ("SUPERSCRIPT SIX" #x2076)
+    ("SUPERSCRIPT SEVEN" #x2077)
+    ("SUPERSCRIPT EIGHT" #x2078)
+    ("SUPERSCRIPT NINE" #x2079)
+    ("SUPERSCRIPT PLUS SIGN" #x207A)
+    ("SUPERSCRIPT MINUS" #x207B)
+    ("SUPERSCRIPT EQUALS SIGN" #x207C)
+    ("SUPERSCRIPT LEFT PARENTHESIS" #x207D)
+    ("SUPERSCRIPT RIGHT PARENTHESIS" #x207E)
+    ("SUPERSCRIPT LATIN SMALL LETTER N" #x207F)
+    ("SUBSCRIPT ZERO" #x2080)
+    ("SUBSCRIPT ONE" #x2081)
+    ("SUBSCRIPT TWO" #x2082)
+    ("SUBSCRIPT THREE" #x2083)
+    ("SUBSCRIPT FOUR" #x2084)
+    ("SUBSCRIPT FIVE" #x2085)
+    ("SUBSCRIPT SIX" #x2086)
+    ("SUBSCRIPT SEVEN" #x2087)
+    ("SUBSCRIPT EIGHT" #x2088)
+    ("SUBSCRIPT NINE" #x2089)
+    ("SUBSCRIPT PLUS SIGN" #x208A)
+    ("SUBSCRIPT MINUS" #x208B)
+    ("SUBSCRIPT EQUALS SIGN" #x208C)
+    ("SUBSCRIPT LEFT PARENTHESIS" #x208D)
+    ("SUBSCRIPT RIGHT PARENTHESIS" #x208E)
+    ))
+
+;; arch-tag: 59e357e5-c021-440d-a923-921b485dcbb8
diff --git a/etc/nxml/020A0-020CF.el b/etc/nxml/020A0-020CF.el
new file mode 100644 (file)
index 0000000..98f3347
--- /dev/null
@@ -0,0 +1,22 @@
+(nxml-define-char-name-set 'currency-symbols
+  '(("EURO-CURRENCY SIGN" #x20A0)
+    ("COLON SIGN" #x20A1)
+    ("CRUZEIRO SIGN" #x20A2)
+    ("FRENCH FRANC SIGN" #x20A3)
+    ("LIRA SIGN" #x20A4)
+    ("MILL SIGN" #x20A5)
+    ("NAIRA SIGN" #x20A6)
+    ("PESETA SIGN" #x20A7)
+    ("RUPEE SIGN" #x20A8)
+    ("WON SIGN" #x20A9)
+    ("NEW SHEQEL SIGN" #x20AA)
+    ("DONG SIGN" #x20AB)
+    ("EURO SIGN" #x20AC)
+    ("KIP SIGN" #x20AD)
+    ("TUGRIK SIGN" #x20AE)
+    ("DRACHMA SIGN" #x20AF)
+    ("GERMAN PENNY SIGN" #x20B0)
+    ("PESO SIGN" #x20B1)
+    ))
+
+;; arch-tag: 2f9ece37-0ae6-4a82-b12e-dc10ac58e6ce
diff --git a/etc/nxml/020D0-020FF.el b/etc/nxml/020D0-020FF.el
new file mode 100644 (file)
index 0000000..c2626c6
--- /dev/null
@@ -0,0 +1,31 @@
+(nxml-define-char-name-set 'combining-diacritical-marks-for-symbols
+  '(("COMBINING LEFT HARPOON ABOVE" #x20D0)
+    ("COMBINING RIGHT HARPOON ABOVE" #x20D1)
+    ("COMBINING LONG VERTICAL LINE OVERLAY" #x20D2)
+    ("COMBINING SHORT VERTICAL LINE OVERLAY" #x20D3)
+    ("COMBINING ANTICLOCKWISE ARROW ABOVE" #x20D4)
+    ("COMBINING CLOCKWISE ARROW ABOVE" #x20D5)
+    ("COMBINING LEFT ARROW ABOVE" #x20D6)
+    ("COMBINING RIGHT ARROW ABOVE" #x20D7)
+    ("COMBINING RING OVERLAY" #x20D8)
+    ("COMBINING CLOCKWISE RING OVERLAY" #x20D9)
+    ("COMBINING ANTICLOCKWISE RING OVERLAY" #x20DA)
+    ("COMBINING THREE DOTS ABOVE" #x20DB)
+    ("COMBINING FOUR DOTS ABOVE" #x20DC)
+    ("COMBINING ENCLOSING CIRCLE" #x20DD)
+    ("COMBINING ENCLOSING SQUARE" #x20DE)
+    ("COMBINING ENCLOSING DIAMOND" #x20DF)
+    ("COMBINING ENCLOSING CIRCLE BACKSLASH" #x20E0)
+    ("COMBINING LEFT RIGHT ARROW ABOVE" #x20E1)
+    ("COMBINING ENCLOSING SCREEN" #x20E2)
+    ("COMBINING ENCLOSING KEYCAP" #x20E3)
+    ("COMBINING ENCLOSING UPWARD POINTING TRIANGLE" #x20E4)
+    ("COMBINING REVERSE SOLIDUS OVERLAY" #x20E5)
+    ("COMBINING DOUBLE VERTICAL STROKE OVERLAY" #x20E6)
+    ("COMBINING ANNUITY SYMBOL" #x20E7)
+    ("COMBINING TRIPLE UNDERDOT" #x20E8)
+    ("COMBINING WIDE BRIDGE ABOVE" #x20E9)
+    ("COMBINING LEFTWARDS ARROW OVERLAY" #x20EA)
+    ))
+
+;; arch-tag: 4b1f7ef0-287b-49a6-a9f2-910752aac517
diff --git a/etc/nxml/02100-0214F.el b/etc/nxml/02100-0214F.el
new file mode 100644 (file)
index 0000000..1c499c0
--- /dev/null
@@ -0,0 +1,78 @@
+(nxml-define-char-name-set 'letterlike-symbols
+  '(("ACCOUNT OF" #x2100)
+    ("ADDRESSED TO THE SUBJECT" #x2101)
+    ("DOUBLE-STRUCK CAPITAL C" #x2102)
+    ("DEGREE CELSIUS" #x2103)
+    ("CENTRE LINE SYMBOL" #x2104)
+    ("CARE OF" #x2105)
+    ("CADA UNA" #x2106)
+    ("EULER CONSTANT" #x2107)
+    ("SCRUPLE" #x2108)
+    ("DEGREE FAHRENHEIT" #x2109)
+    ("SCRIPT SMALL G" #x210A)
+    ("SCRIPT CAPITAL H" #x210B)
+    ("BLACK-LETTER CAPITAL H" #x210C)
+    ("DOUBLE-STRUCK CAPITAL H" #x210D)
+    ("PLANCK CONSTANT" #x210E)
+    ("PLANCK CONSTANT OVER TWO PI" #x210F)
+    ("SCRIPT CAPITAL I" #x2110)
+    ("BLACK-LETTER CAPITAL I" #x2111)
+    ("SCRIPT CAPITAL L" #x2112)
+    ("SCRIPT SMALL L" #x2113)
+    ("L B BAR SYMBOL" #x2114)
+    ("DOUBLE-STRUCK CAPITAL N" #x2115)
+    ("NUMERO SIGN" #x2116)
+    ("SOUND RECORDING COPYRIGHT" #x2117)
+    ("SCRIPT CAPITAL P" #x2118)
+    ("DOUBLE-STRUCK CAPITAL P" #x2119)
+    ("DOUBLE-STRUCK CAPITAL Q" #x211A)
+    ("SCRIPT CAPITAL R" #x211B)
+    ("BLACK-LETTER CAPITAL R" #x211C)
+    ("DOUBLE-STRUCK CAPITAL R" #x211D)
+    ("PRESCRIPTION TAKE" #x211E)
+    ("RESPONSE" #x211F)
+    ("SERVICE MARK" #x2120)
+    ("TELEPHONE SIGN" #x2121)
+    ("TRADE MARK SIGN" #x2122)
+    ("VERSICLE" #x2123)
+    ("DOUBLE-STRUCK CAPITAL Z" #x2124)
+    ("OUNCE SIGN" #x2125)
+    ("OHM SIGN" #x2126)
+    ("INVERTED OHM SIGN" #x2127)
+    ("BLACK-LETTER CAPITAL Z" #x2128)
+    ("TURNED GREEK SMALL LETTER IOTA" #x2129)
+    ("KELVIN SIGN" #x212A)
+    ("ANGSTROM SIGN" #x212B)
+    ("SCRIPT CAPITAL B" #x212C)
+    ("BLACK-LETTER CAPITAL C" #x212D)
+    ("ESTIMATED SYMBOL" #x212E)
+    ("SCRIPT SMALL E" #x212F)
+    ("SCRIPT CAPITAL E" #x2130)
+    ("SCRIPT CAPITAL F" #x2131)
+    ("TURNED CAPITAL F" #x2132)
+    ("SCRIPT CAPITAL M" #x2133)
+    ("SCRIPT SMALL O" #x2134)
+    ("ALEF SYMBOL" #x2135)
+    ("BET SYMBOL" #x2136)
+    ("GIMEL SYMBOL" #x2137)
+    ("DALET SYMBOL" #x2138)
+    ("INFORMATION SOURCE" #x2139)
+    ("ROTATED CAPITAL Q" #x213A)
+    ("DOUBLE-STRUCK SMALL GAMMA" #x213D)
+    ("DOUBLE-STRUCK CAPITAL GAMMA" #x213E)
+    ("DOUBLE-STRUCK CAPITAL PI" #x213F)
+    ("DOUBLE-STRUCK N-ARY SUMMATION" #x2140)
+    ("TURNED SANS-SERIF CAPITAL G" #x2141)
+    ("TURNED SANS-SERIF CAPITAL L" #x2142)
+    ("REVERSED SANS-SERIF CAPITAL L" #x2143)
+    ("TURNED SANS-SERIF CAPITAL Y" #x2144)
+    ("DOUBLE-STRUCK ITALIC CAPITAL D" #x2145)
+    ("DOUBLE-STRUCK ITALIC SMALL D" #x2146)
+    ("DOUBLE-STRUCK ITALIC SMALL E" #x2147)
+    ("DOUBLE-STRUCK ITALIC SMALL I" #x2148)
+    ("DOUBLE-STRUCK ITALIC SMALL J" #x2149)
+    ("PROPERTY LINE" #x214A)
+    ("TURNED AMPERSAND" #x214B)
+    ))
+
+;; arch-tag: 4233f761-f78d-4854-a019-2409f78514fa
diff --git a/etc/nxml/02150-0218F.el b/etc/nxml/02150-0218F.el
new file mode 100644 (file)
index 0000000..ac2e706
--- /dev/null
@@ -0,0 +1,53 @@
+(nxml-define-char-name-set 'number-forms
+  '(("VULGAR FRACTION ONE THIRD" #x2153)
+    ("VULGAR FRACTION TWO THIRDS" #x2154)
+    ("VULGAR FRACTION ONE FIFTH" #x2155)
+    ("VULGAR FRACTION TWO FIFTHS" #x2156)
+    ("VULGAR FRACTION THREE FIFTHS" #x2157)
+    ("VULGAR FRACTION FOUR FIFTHS" #x2158)
+    ("VULGAR FRACTION ONE SIXTH" #x2159)
+    ("VULGAR FRACTION FIVE SIXTHS" #x215A)
+    ("VULGAR FRACTION ONE EIGHTH" #x215B)
+    ("VULGAR FRACTION THREE EIGHTHS" #x215C)
+    ("VULGAR FRACTION FIVE EIGHTHS" #x215D)
+    ("VULGAR FRACTION SEVEN EIGHTHS" #x215E)
+    ("FRACTION NUMERATOR ONE" #x215F)
+    ("ROMAN NUMERAL ONE" #x2160)
+    ("ROMAN NUMERAL TWO" #x2161)
+    ("ROMAN NUMERAL THREE" #x2162)
+    ("ROMAN NUMERAL FOUR" #x2163)
+    ("ROMAN NUMERAL FIVE" #x2164)
+    ("ROMAN NUMERAL SIX" #x2165)
+    ("ROMAN NUMERAL SEVEN" #x2166)
+    ("ROMAN NUMERAL EIGHT" #x2167)
+    ("ROMAN NUMERAL NINE" #x2168)
+    ("ROMAN NUMERAL TEN" #x2169)
+    ("ROMAN NUMERAL ELEVEN" #x216A)
+    ("ROMAN NUMERAL TWELVE" #x216B)
+    ("ROMAN NUMERAL FIFTY" #x216C)
+    ("ROMAN NUMERAL ONE HUNDRED" #x216D)
+    ("ROMAN NUMERAL FIVE HUNDRED" #x216E)
+    ("ROMAN NUMERAL ONE THOUSAND" #x216F)
+    ("SMALL ROMAN NUMERAL ONE" #x2170)
+    ("SMALL ROMAN NUMERAL TWO" #x2171)
+    ("SMALL ROMAN NUMERAL THREE" #x2172)
+    ("SMALL ROMAN NUMERAL FOUR" #x2173)
+    ("SMALL ROMAN NUMERAL FIVE" #x2174)
+    ("SMALL ROMAN NUMERAL SIX" #x2175)
+    ("SMALL ROMAN NUMERAL SEVEN" #x2176)
+    ("SMALL ROMAN NUMERAL EIGHT" #x2177)
+    ("SMALL ROMAN NUMERAL NINE" #x2178)
+    ("SMALL ROMAN NUMERAL TEN" #x2179)
+    ("SMALL ROMAN NUMERAL ELEVEN" #x217A)
+    ("SMALL ROMAN NUMERAL TWELVE" #x217B)
+    ("SMALL ROMAN NUMERAL FIFTY" #x217C)
+    ("SMALL ROMAN NUMERAL ONE HUNDRED" #x217D)
+    ("SMALL ROMAN NUMERAL FIVE HUNDRED" #x217E)
+    ("SMALL ROMAN NUMERAL ONE THOUSAND" #x217F)
+    ("ROMAN NUMERAL ONE THOUSAND C D" #x2180)
+    ("ROMAN NUMERAL FIVE THOUSAND" #x2181)
+    ("ROMAN NUMERAL TEN THOUSAND" #x2182)
+    ("ROMAN NUMERAL REVERSED ONE HUNDRED" #x2183)
+    ))
+
+;; arch-tag: 9931b436-670d-471f-8214-f4c4454ae841
diff --git a/etc/nxml/02190-021FF.el b/etc/nxml/02190-021FF.el
new file mode 100644 (file)
index 0000000..4a2851a
--- /dev/null
@@ -0,0 +1,116 @@
+(nxml-define-char-name-set 'arrows
+  '(("LEFTWARDS ARROW" #x2190)
+    ("UPWARDS ARROW" #x2191)
+    ("RIGHTWARDS ARROW" #x2192)
+    ("DOWNWARDS ARROW" #x2193)
+    ("LEFT RIGHT ARROW" #x2194)
+    ("UP DOWN ARROW" #x2195)
+    ("NORTH WEST ARROW" #x2196)
+    ("NORTH EAST ARROW" #x2197)
+    ("SOUTH EAST ARROW" #x2198)
+    ("SOUTH WEST ARROW" #x2199)
+    ("LEFTWARDS ARROW WITH STROKE" #x219A)
+    ("RIGHTWARDS ARROW WITH STROKE" #x219B)
+    ("LEFTWARDS WAVE ARROW" #x219C)
+    ("RIGHTWARDS WAVE ARROW" #x219D)
+    ("LEFTWARDS TWO HEADED ARROW" #x219E)
+    ("UPWARDS TWO HEADED ARROW" #x219F)
+    ("RIGHTWARDS TWO HEADED ARROW" #x21A0)
+    ("DOWNWARDS TWO HEADED ARROW" #x21A1)
+    ("LEFTWARDS ARROW WITH TAIL" #x21A2)
+    ("RIGHTWARDS ARROW WITH TAIL" #x21A3)
+    ("LEFTWARDS ARROW FROM BAR" #x21A4)
+    ("UPWARDS ARROW FROM BAR" #x21A5)
+    ("RIGHTWARDS ARROW FROM BAR" #x21A6)
+    ("DOWNWARDS ARROW FROM BAR" #x21A7)
+    ("UP DOWN ARROW WITH BASE" #x21A8)
+    ("LEFTWARDS ARROW WITH HOOK" #x21A9)
+    ("RIGHTWARDS ARROW WITH HOOK" #x21AA)
+    ("LEFTWARDS ARROW WITH LOOP" #x21AB)
+    ("RIGHTWARDS ARROW WITH LOOP" #x21AC)
+    ("LEFT RIGHT WAVE ARROW" #x21AD)
+    ("LEFT RIGHT ARROW WITH STROKE" #x21AE)
+    ("DOWNWARDS ZIGZAG ARROW" #x21AF)
+    ("UPWARDS ARROW WITH TIP LEFTWARDS" #x21B0)
+    ("UPWARDS ARROW WITH TIP RIGHTWARDS" #x21B1)
+    ("DOWNWARDS ARROW WITH TIP LEFTWARDS" #x21B2)
+    ("DOWNWARDS ARROW WITH TIP RIGHTWARDS" #x21B3)
+    ("RIGHTWARDS ARROW WITH CORNER DOWNWARDS" #x21B4)
+    ("DOWNWARDS ARROW WITH CORNER LEFTWARDS" #x21B5)
+    ("ANTICLOCKWISE TOP SEMICIRCLE ARROW" #x21B6)
+    ("CLOCKWISE TOP SEMICIRCLE ARROW" #x21B7)
+    ("NORTH WEST ARROW TO LONG BAR" #x21B8)
+    ("LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR" #x21B9)
+    ("ANTICLOCKWISE OPEN CIRCLE ARROW" #x21BA)
+    ("CLOCKWISE OPEN CIRCLE ARROW" #x21BB)
+    ("LEFTWARDS HARPOON WITH BARB UPWARDS" #x21BC)
+    ("LEFTWARDS HARPOON WITH BARB DOWNWARDS" #x21BD)
+    ("UPWARDS HARPOON WITH BARB RIGHTWARDS" #x21BE)
+    ("UPWARDS HARPOON WITH BARB LEFTWARDS" #x21BF)
+    ("RIGHTWARDS HARPOON WITH BARB UPWARDS" #x21C0)
+    ("RIGHTWARDS HARPOON WITH BARB DOWNWARDS" #x21C1)
+    ("DOWNWARDS HARPOON WITH BARB RIGHTWARDS" #x21C2)
+    ("DOWNWARDS HARPOON WITH BARB LEFTWARDS" #x21C3)
+    ("RIGHTWARDS ARROW OVER LEFTWARDS ARROW" #x21C4)
+    ("UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW" #x21C5)
+    ("LEFTWARDS ARROW OVER RIGHTWARDS ARROW" #x21C6)
+    ("LEFTWARDS PAIRED ARROWS" #x21C7)
+    ("UPWARDS PAIRED ARROWS" #x21C8)
+    ("RIGHTWARDS PAIRED ARROWS" #x21C9)
+    ("DOWNWARDS PAIRED ARROWS" #x21CA)
+    ("LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON" #x21CB)
+    ("RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON" #x21CC)
+    ("LEFTWARDS DOUBLE ARROW WITH STROKE" #x21CD)
+    ("LEFT RIGHT DOUBLE ARROW WITH STROKE" #x21CE)
+    ("RIGHTWARDS DOUBLE ARROW WITH STROKE" #x21CF)
+    ("LEFTWARDS DOUBLE ARROW" #x21D0)
+    ("UPWARDS DOUBLE ARROW" #x21D1)
+    ("RIGHTWARDS DOUBLE ARROW" #x21D2)
+    ("DOWNWARDS DOUBLE ARROW" #x21D3)
+    ("LEFT RIGHT DOUBLE ARROW" #x21D4)
+    ("UP DOWN DOUBLE ARROW" #x21D5)
+    ("NORTH WEST DOUBLE ARROW" #x21D6)
+    ("NORTH EAST DOUBLE ARROW" #x21D7)
+    ("SOUTH EAST DOUBLE ARROW" #x21D8)
+    ("SOUTH WEST DOUBLE ARROW" #x21D9)
+    ("LEFTWARDS TRIPLE ARROW" #x21DA)
+    ("RIGHTWARDS TRIPLE ARROW" #x21DB)
+    ("LEFTWARDS SQUIGGLE ARROW" #x21DC)
+    ("RIGHTWARDS SQUIGGLE ARROW" #x21DD)
+    ("UPWARDS ARROW WITH DOUBLE STROKE" #x21DE)
+    ("DOWNWARDS ARROW WITH DOUBLE STROKE" #x21DF)
+    ("LEFTWARDS DASHED ARROW" #x21E0)
+    ("UPWARDS DASHED ARROW" #x21E1)
+    ("RIGHTWARDS DASHED ARROW" #x21E2)
+    ("DOWNWARDS DASHED ARROW" #x21E3)
+    ("LEFTWARDS ARROW TO BAR" #x21E4)
+    ("RIGHTWARDS ARROW TO BAR" #x21E5)
+    ("LEFTWARDS WHITE ARROW" #x21E6)
+    ("UPWARDS WHITE ARROW" #x21E7)
+    ("RIGHTWARDS WHITE ARROW" #x21E8)
+    ("DOWNWARDS WHITE ARROW" #x21E9)
+    ("UPWARDS WHITE ARROW FROM BAR" #x21EA)
+    ("UPWARDS WHITE ARROW ON PEDESTAL" #x21EB)
+    ("UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR" #x21EC)
+    ("UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR" #x21ED)
+    ("UPWARDS WHITE DOUBLE ARROW" #x21EE)
+    ("UPWARDS WHITE DOUBLE ARROW ON PEDESTAL" #x21EF)
+    ("RIGHTWARDS WHITE ARROW FROM WALL" #x21F0)
+    ("NORTH WEST ARROW TO CORNER" #x21F1)
+    ("SOUTH EAST ARROW TO CORNER" #x21F2)
+    ("UP DOWN WHITE ARROW" #x21F3)
+    ("RIGHT ARROW WITH SMALL CIRCLE" #x21F4)
+    ("DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW" #x21F5)
+    ("THREE RIGHTWARDS ARROWS" #x21F6)
+    ("LEFTWARDS ARROW WITH VERTICAL STROKE" #x21F7)
+    ("RIGHTWARDS ARROW WITH VERTICAL STROKE" #x21F8)
+    ("LEFT RIGHT ARROW WITH VERTICAL STROKE" #x21F9)
+    ("LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE" #x21FA)
+    ("RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE" #x21FB)
+    ("LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE" #x21FC)
+    ("LEFTWARDS OPEN-HEADED ARROW" #x21FD)
+    ("RIGHTWARDS OPEN-HEADED ARROW" #x21FE)
+    ("LEFT RIGHT OPEN-HEADED ARROW" #x21FF)
+    ))
+
+;; arch-tag: de5679de-82b6-4d64-9b7c-79c35e12521d
diff --git a/etc/nxml/02200-022FF.el b/etc/nxml/02200-022FF.el
new file mode 100644 (file)
index 0000000..be82783
--- /dev/null
@@ -0,0 +1,260 @@
+(nxml-define-char-name-set 'mathematical-operators
+  '(("FOR ALL" #x2200)
+    ("COMPLEMENT" #x2201)
+    ("PARTIAL DIFFERENTIAL" #x2202)
+    ("THERE EXISTS" #x2203)
+    ("THERE DOES NOT EXIST" #x2204)
+    ("EMPTY SET" #x2205)
+    ("INCREMENT" #x2206)
+    ("NABLA" #x2207)
+    ("ELEMENT OF" #x2208)
+    ("NOT AN ELEMENT OF" #x2209)
+    ("SMALL ELEMENT OF" #x220A)
+    ("CONTAINS AS MEMBER" #x220B)
+    ("DOES NOT CONTAIN AS MEMBER" #x220C)
+    ("SMALL CONTAINS AS MEMBER" #x220D)
+    ("END OF PROOF" #x220E)
+    ("N-ARY PRODUCT" #x220F)
+    ("N-ARY COPRODUCT" #x2210)
+    ("N-ARY SUMMATION" #x2211)
+    ("MINUS SIGN" #x2212)
+    ("MINUS-OR-PLUS SIGN" #x2213)
+    ("DOT PLUS" #x2214)
+    ("DIVISION SLASH" #x2215)
+    ("SET MINUS" #x2216)
+    ("ASTERISK OPERATOR" #x2217)
+    ("RING OPERATOR" #x2218)
+    ("BULLET OPERATOR" #x2219)
+    ("SQUARE ROOT" #x221A)
+    ("CUBE ROOT" #x221B)
+    ("FOURTH ROOT" #x221C)
+    ("PROPORTIONAL TO" #x221D)
+    ("INFINITY" #x221E)
+    ("RIGHT ANGLE" #x221F)
+    ("ANGLE" #x2220)
+    ("MEASURED ANGLE" #x2221)
+    ("SPHERICAL ANGLE" #x2222)
+    ("DIVIDES" #x2223)
+    ("DOES NOT DIVIDE" #x2224)
+    ("PARALLEL TO" #x2225)
+    ("NOT PARALLEL TO" #x2226)
+    ("LOGICAL AND" #x2227)
+    ("LOGICAL OR" #x2228)
+    ("INTERSECTION" #x2229)
+    ("UNION" #x222A)
+    ("INTEGRAL" #x222B)
+    ("DOUBLE INTEGRAL" #x222C)
+    ("TRIPLE INTEGRAL" #x222D)
+    ("CONTOUR INTEGRAL" #x222E)
+    ("SURFACE INTEGRAL" #x222F)
+    ("VOLUME INTEGRAL" #x2230)
+    ("CLOCKWISE INTEGRAL" #x2231)
+    ("CLOCKWISE CONTOUR INTEGRAL" #x2232)
+    ("ANTICLOCKWISE CONTOUR INTEGRAL" #x2233)
+    ("THEREFORE" #x2234)
+    ("BECAUSE" #x2235)
+    ("RATIO" #x2236)
+    ("PROPORTION" #x2237)
+    ("DOT MINUS" #x2238)
+    ("EXCESS" #x2239)
+    ("GEOMETRIC PROPORTION" #x223A)
+    ("HOMOTHETIC" #x223B)
+    ("TILDE OPERATOR" #x223C)
+    ("REVERSED TILDE" #x223D)
+    ("INVERTED LAZY S" #x223E)
+    ("SINE WAVE" #x223F)
+    ("WREATH PRODUCT" #x2240)
+    ("NOT TILDE" #x2241)
+    ("MINUS TILDE" #x2242)
+    ("ASYMPTOTICALLY EQUAL TO" #x2243)
+    ("NOT ASYMPTOTICALLY EQUAL TO" #x2244)
+    ("APPROXIMATELY EQUAL TO" #x2245)
+    ("APPROXIMATELY BUT NOT ACTUALLY EQUAL TO" #x2246)
+    ("NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO" #x2247)
+    ("ALMOST EQUAL TO" #x2248)
+    ("NOT ALMOST EQUAL TO" #x2249)
+    ("ALMOST EQUAL OR EQUAL TO" #x224A)
+    ("TRIPLE TILDE" #x224B)
+    ("ALL EQUAL TO" #x224C)
+    ("EQUIVALENT TO" #x224D)
+    ("GEOMETRICALLY EQUIVALENT TO" #x224E)
+    ("DIFFERENCE BETWEEN" #x224F)
+    ("APPROACHES THE LIMIT" #x2250)
+    ("GEOMETRICALLY EQUAL TO" #x2251)
+    ("APPROXIMATELY EQUAL TO OR THE IMAGE OF" #x2252)
+    ("IMAGE OF OR APPROXIMATELY EQUAL TO" #x2253)
+    ("COLON EQUALS" #x2254)
+    ("EQUALS COLON" #x2255)
+    ("RING IN EQUAL TO" #x2256)
+    ("RING EQUAL TO" #x2257)
+    ("CORRESPONDS TO" #x2258)
+    ("ESTIMATES" #x2259)
+    ("EQUIANGULAR TO" #x225A)
+    ("STAR EQUALS" #x225B)
+    ("DELTA EQUAL TO" #x225C)
+    ("EQUAL TO BY DEFINITION" #x225D)
+    ("MEASURED BY" #x225E)
+    ("QUESTIONED EQUAL TO" #x225F)
+    ("NOT EQUAL TO" #x2260)
+    ("IDENTICAL TO" #x2261)
+    ("NOT IDENTICAL TO" #x2262)
+    ("STRICTLY EQUIVALENT TO" #x2263)
+    ("LESS-THAN OR EQUAL TO" #x2264)
+    ("GREATER-THAN OR EQUAL TO" #x2265)
+    ("LESS-THAN OVER EQUAL TO" #x2266)
+    ("GREATER-THAN OVER EQUAL TO" #x2267)
+    ("LESS-THAN BUT NOT EQUAL TO" #x2268)
+    ("GREATER-THAN BUT NOT EQUAL TO" #x2269)
+    ("MUCH LESS-THAN" #x226A)
+    ("MUCH GREATER-THAN" #x226B)
+    ("BETWEEN" #x226C)
+    ("NOT EQUIVALENT TO" #x226D)
+    ("NOT LESS-THAN" #x226E)
+    ("NOT GREATER-THAN" #x226F)
+    ("NEITHER LESS-THAN NOR EQUAL TO" #x2270)
+    ("NEITHER GREATER-THAN NOR EQUAL TO" #x2271)
+    ("LESS-THAN OR EQUIVALENT TO" #x2272)
+    ("GREATER-THAN OR EQUIVALENT TO" #x2273)
+    ("NEITHER LESS-THAN NOR EQUIVALENT TO" #x2274)
+    ("NEITHER GREATER-THAN NOR EQUIVALENT TO" #x2275)
+    ("LESS-THAN OR GREATER-THAN" #x2276)
+    ("GREATER-THAN OR LESS-THAN" #x2277)
+    ("NEITHER LESS-THAN NOR GREATER-THAN" #x2278)
+    ("NEITHER GREATER-THAN NOR LESS-THAN" #x2279)
+    ("PRECEDES" #x227A)
+    ("SUCCEEDS" #x227B)
+    ("PRECEDES OR EQUAL TO" #x227C)
+    ("SUCCEEDS OR EQUAL TO" #x227D)
+    ("PRECEDES OR EQUIVALENT TO" #x227E)
+    ("SUCCEEDS OR EQUIVALENT TO" #x227F)
+    ("DOES NOT PRECEDE" #x2280)
+    ("DOES NOT SUCCEED" #x2281)
+    ("SUBSET OF" #x2282)
+    ("SUPERSET OF" #x2283)
+    ("NOT A SUBSET OF" #x2284)
+    ("NOT A SUPERSET OF" #x2285)
+    ("SUBSET OF OR EQUAL TO" #x2286)
+    ("SUPERSET OF OR EQUAL TO" #x2287)
+    ("NEITHER A SUBSET OF NOR EQUAL TO" #x2288)
+    ("NEITHER A SUPERSET OF NOR EQUAL TO" #x2289)
+    ("SUBSET OF WITH NOT EQUAL TO" #x228A)
+    ("SUPERSET OF WITH NOT EQUAL TO" #x228B)
+    ("MULTISET" #x228C)
+    ("MULTISET MULTIPLICATION" #x228D)
+    ("MULTISET UNION" #x228E)
+    ("SQUARE IMAGE OF" #x228F)
+    ("SQUARE ORIGINAL OF" #x2290)
+    ("SQUARE IMAGE OF OR EQUAL TO" #x2291)
+    ("SQUARE ORIGINAL OF OR EQUAL TO" #x2292)
+    ("SQUARE CAP" #x2293)
+    ("SQUARE CUP" #x2294)
+    ("CIRCLED PLUS" #x2295)
+    ("CIRCLED MINUS" #x2296)
+    ("CIRCLED TIMES" #x2297)
+    ("CIRCLED DIVISION SLASH" #x2298)
+    ("CIRCLED DOT OPERATOR" #x2299)
+    ("CIRCLED RING OPERATOR" #x229A)
+    ("CIRCLED ASTERISK OPERATOR" #x229B)
+    ("CIRCLED EQUALS" #x229C)
+    ("CIRCLED DASH" #x229D)
+    ("SQUARED PLUS" #x229E)
+    ("SQUARED MINUS" #x229F)
+    ("SQUARED TIMES" #x22A0)
+    ("SQUARED DOT OPERATOR" #x22A1)
+    ("RIGHT TACK" #x22A2)
+    ("LEFT TACK" #x22A3)
+    ("DOWN TACK" #x22A4)
+    ("UP TACK" #x22A5)
+    ("ASSERTION" #x22A6)
+    ("MODELS" #x22A7)
+    ("TRUE" #x22A8)
+    ("FORCES" #x22A9)
+    ("TRIPLE VERTICAL BAR RIGHT TURNSTILE" #x22AA)
+    ("DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE" #x22AB)
+    ("DOES NOT PROVE" #x22AC)
+    ("NOT TRUE" #x22AD)
+    ("DOES NOT FORCE" #x22AE)
+    ("NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE" #x22AF)
+    ("PRECEDES UNDER RELATION" #x22B0)
+    ("SUCCEEDS UNDER RELATION" #x22B1)
+    ("NORMAL SUBGROUP OF" #x22B2)
+    ("CONTAINS AS NORMAL SUBGROUP" #x22B3)
+    ("NORMAL SUBGROUP OF OR EQUAL TO" #x22B4)
+    ("CONTAINS AS NORMAL SUBGROUP OR EQUAL TO" #x22B5)
+    ("ORIGINAL OF" #x22B6)
+    ("IMAGE OF" #x22B7)
+    ("MULTIMAP" #x22B8)
+    ("HERMITIAN CONJUGATE MATRIX" #x22B9)
+    ("INTERCALATE" #x22BA)
+    ("XOR" #x22BB)
+    ("NAND" #x22BC)
+    ("NOR" #x22BD)
+    ("RIGHT ANGLE WITH ARC" #x22BE)
+    ("RIGHT TRIANGLE" #x22BF)
+    ("N-ARY LOGICAL AND" #x22C0)
+    ("N-ARY LOGICAL OR" #x22C1)
+    ("N-ARY INTERSECTION" #x22C2)
+    ("N-ARY UNION" #x22C3)
+    ("DIAMOND OPERATOR" #x22C4)
+    ("DOT OPERATOR" #x22C5)
+    ("STAR OPERATOR" #x22C6)
+    ("DIVISION TIMES" #x22C7)
+    ("BOWTIE" #x22C8)
+    ("LEFT NORMAL FACTOR SEMIDIRECT PRODUCT" #x22C9)
+    ("RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT" #x22CA)
+    ("LEFT SEMIDIRECT PRODUCT" #x22CB)
+    ("RIGHT SEMIDIRECT PRODUCT" #x22CC)
+    ("REVERSED TILDE EQUALS" #x22CD)
+    ("CURLY LOGICAL OR" #x22CE)
+    ("CURLY LOGICAL AND" #x22CF)
+    ("DOUBLE SUBSET" #x22D0)
+    ("DOUBLE SUPERSET" #x22D1)
+    ("DOUBLE INTERSECTION" #x22D2)
+    ("DOUBLE UNION" #x22D3)
+    ("PITCHFORK" #x22D4)
+    ("EQUAL AND PARALLEL TO" #x22D5)
+    ("LESS-THAN WITH DOT" #x22D6)
+    ("GREATER-THAN WITH DOT" #x22D7)
+    ("VERY MUCH LESS-THAN" #x22D8)
+    ("VERY MUCH GREATER-THAN" #x22D9)
+    ("LESS-THAN EQUAL TO OR GREATER-THAN" #x22DA)
+    ("GREATER-THAN EQUAL TO OR LESS-THAN" #x22DB)
+    ("EQUAL TO OR LESS-THAN" #x22DC)
+    ("EQUAL TO OR GREATER-THAN" #x22DD)
+    ("EQUAL TO OR PRECEDES" #x22DE)
+    ("EQUAL TO OR SUCCEEDS" #x22DF)
+    ("DOES NOT PRECEDE OR EQUAL" #x22E0)
+    ("DOES NOT SUCCEED OR EQUAL" #x22E1)
+    ("NOT SQUARE IMAGE OF OR EQUAL TO" #x22E2)
+    ("NOT SQUARE ORIGINAL OF OR EQUAL TO" #x22E3)
+    ("SQUARE IMAGE OF OR NOT EQUAL TO" #x22E4)
+    ("SQUARE ORIGINAL OF OR NOT EQUAL TO" #x22E5)
+    ("LESS-THAN BUT NOT EQUIVALENT TO" #x22E6)
+    ("GREATER-THAN BUT NOT EQUIVALENT TO" #x22E7)
+    ("PRECEDES BUT NOT EQUIVALENT TO" #x22E8)
+    ("SUCCEEDS BUT NOT EQUIVALENT TO" #x22E9)
+    ("NOT NORMAL SUBGROUP OF" #x22EA)
+    ("DOES NOT CONTAIN AS NORMAL SUBGROUP" #x22EB)
+    ("NOT NORMAL SUBGROUP OF OR EQUAL TO" #x22EC)
+    ("DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL" #x22ED)
+    ("VERTICAL ELLIPSIS" #x22EE)
+    ("MIDLINE HORIZONTAL ELLIPSIS" #x22EF)
+    ("UP RIGHT DIAGONAL ELLIPSIS" #x22F0)
+    ("DOWN RIGHT DIAGONAL ELLIPSIS" #x22F1)
+    ("ELEMENT OF WITH LONG HORIZONTAL STROKE" #x22F2)
+    ("ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22F3)
+    ("SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22F4)
+    ("ELEMENT OF WITH DOT ABOVE" #x22F5)
+    ("ELEMENT OF WITH OVERBAR" #x22F6)
+    ("SMALL ELEMENT OF WITH OVERBAR" #x22F7)
+    ("ELEMENT OF WITH UNDERBAR" #x22F8)
+    ("ELEMENT OF WITH TWO HORIZONTAL STROKES" #x22F9)
+    ("CONTAINS WITH LONG HORIZONTAL STROKE" #x22FA)
+    ("CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22FB)
+    ("SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE" #x22FC)
+    ("CONTAINS WITH OVERBAR" #x22FD)
+    ("SMALL CONTAINS WITH OVERBAR" #x22FE)
+    ("Z NOTATION BAG MEMBERSHIP" #x22FF)
+    ))
+
+;; arch-tag: 12911bcf-5cc6-4b8a-9f0e-48c0b6f85566
diff --git a/etc/nxml/02300-023FF.el b/etc/nxml/02300-023FF.el
new file mode 100644 (file)
index 0000000..58526bd
--- /dev/null
@@ -0,0 +1,211 @@
+(nxml-define-char-name-set 'miscellaneous-technical
+  '(("DIAMETER SIGN" #x2300)
+    ("ELECTRIC ARROW" #x2301)
+    ("HOUSE" #x2302)
+    ("UP ARROWHEAD" #x2303)
+    ("DOWN ARROWHEAD" #x2304)
+    ("PROJECTIVE" #x2305)
+    ("PERSPECTIVE" #x2306)
+    ("WAVY LINE" #x2307)
+    ("LEFT CEILING" #x2308)
+    ("RIGHT CEILING" #x2309)
+    ("LEFT FLOOR" #x230A)
+    ("RIGHT FLOOR" #x230B)
+    ("BOTTOM RIGHT CROP" #x230C)
+    ("BOTTOM LEFT CROP" #x230D)
+    ("TOP RIGHT CROP" #x230E)
+    ("TOP LEFT CROP" #x230F)
+    ("REVERSED NOT SIGN" #x2310)
+    ("SQUARE LOZENGE" #x2311)
+    ("ARC" #x2312)
+    ("SEGMENT" #x2313)
+    ("SECTOR" #x2314)
+    ("TELEPHONE RECORDER" #x2315)
+    ("POSITION INDICATOR" #x2316)
+    ("VIEWDATA SQUARE" #x2317)
+    ("PLACE OF INTEREST SIGN" #x2318)
+    ("TURNED NOT SIGN" #x2319)
+    ("WATCH" #x231A)
+    ("HOURGLASS" #x231B)
+    ("TOP LEFT CORNER" #x231C)
+    ("TOP RIGHT CORNER" #x231D)
+    ("BOTTOM LEFT CORNER" #x231E)
+    ("BOTTOM RIGHT CORNER" #x231F)
+    ("TOP HALF INTEGRAL" #x2320)
+    ("BOTTOM HALF INTEGRAL" #x2321)
+    ("FROWN" #x2322)
+    ("SMILE" #x2323)
+    ("UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS" #x2324)
+    ("OPTION KEY" #x2325)
+    ("ERASE TO THE RIGHT" #x2326)
+    ("X IN A RECTANGLE BOX" #x2327)
+    ("KEYBOARD" #x2328)
+    ("LEFT-POINTING ANGLE BRACKET" #x2329)
+    ("RIGHT-POINTING ANGLE BRACKET" #x232A)
+    ("ERASE TO THE LEFT" #x232B)
+    ("BENZENE RING" #x232C)
+    ("CYLINDRICITY" #x232D)
+    ("ALL AROUND-PROFILE" #x232E)
+    ("SYMMETRY" #x232F)
+    ("TOTAL RUNOUT" #x2330)
+    ("DIMENSION ORIGIN" #x2331)
+    ("CONICAL TAPER" #x2332)
+    ("SLOPE" #x2333)
+    ("COUNTERBORE" #x2334)
+    ("COUNTERSINK" #x2335)
+    ("APL FUNCTIONAL SYMBOL I-BEAM" #x2336)
+    ("APL FUNCTIONAL SYMBOL SQUISH QUAD" #x2337)
+    ("APL FUNCTIONAL SYMBOL QUAD EQUAL" #x2338)
+    ("APL FUNCTIONAL SYMBOL QUAD DIVIDE" #x2339)
+    ("APL FUNCTIONAL SYMBOL QUAD DIAMOND" #x233A)
+    ("APL FUNCTIONAL SYMBOL QUAD JOT" #x233B)
+    ("APL FUNCTIONAL SYMBOL QUAD CIRCLE" #x233C)
+    ("APL FUNCTIONAL SYMBOL CIRCLE STILE" #x233D)
+    ("APL FUNCTIONAL SYMBOL CIRCLE JOT" #x233E)
+    ("APL FUNCTIONAL SYMBOL SLASH BAR" #x233F)
+    ("APL FUNCTIONAL SYMBOL BACKSLASH BAR" #x2340)
+    ("APL FUNCTIONAL SYMBOL QUAD SLASH" #x2341)
+    ("APL FUNCTIONAL SYMBOL QUAD BACKSLASH" #x2342)
+    ("APL FUNCTIONAL SYMBOL QUAD LESS-THAN" #x2343)
+    ("APL FUNCTIONAL SYMBOL QUAD GREATER-THAN" #x2344)
+    ("APL FUNCTIONAL SYMBOL LEFTWARDS VANE" #x2345)
+    ("APL FUNCTIONAL SYMBOL RIGHTWARDS VANE" #x2346)
+    ("APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW" #x2347)
+    ("APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW" #x2348)
+    ("APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH" #x2349)
+    ("APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR" #x234A)
+    ("APL FUNCTIONAL SYMBOL DELTA STILE" #x234B)
+    ("APL FUNCTIONAL SYMBOL QUAD DOWN CARET" #x234C)
+    ("APL FUNCTIONAL SYMBOL QUAD DELTA" #x234D)
+    ("APL FUNCTIONAL SYMBOL DOWN TACK JOT" #x234E)
+    ("APL FUNCTIONAL SYMBOL UPWARDS VANE" #x234F)
+    ("APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW" #x2350)
+    ("APL FUNCTIONAL SYMBOL UP TACK OVERBAR" #x2351)
+    ("APL FUNCTIONAL SYMBOL DEL STILE" #x2352)
+    ("APL FUNCTIONAL SYMBOL QUAD UP CARET" #x2353)
+    ("APL FUNCTIONAL SYMBOL QUAD DEL" #x2354)
+    ("APL FUNCTIONAL SYMBOL UP TACK JOT" #x2355)
+    ("APL FUNCTIONAL SYMBOL DOWNWARDS VANE" #x2356)
+    ("APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW" #x2357)
+    ("APL FUNCTIONAL SYMBOL QUOTE UNDERBAR" #x2358)
+    ("APL FUNCTIONAL SYMBOL DELTA UNDERBAR" #x2359)
+    ("APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR" #x235A)
+    ("APL FUNCTIONAL SYMBOL JOT UNDERBAR" #x235B)
+    ("APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR" #x235C)
+    ("APL FUNCTIONAL SYMBOL UP SHOE JOT" #x235D)
+    ("APL FUNCTIONAL SYMBOL QUOTE QUAD" #x235E)
+    ("APL FUNCTIONAL SYMBOL CIRCLE STAR" #x235F)
+    ("APL FUNCTIONAL SYMBOL QUAD COLON" #x2360)
+    ("APL FUNCTIONAL SYMBOL UP TACK DIAERESIS" #x2361)
+    ("APL FUNCTIONAL SYMBOL DEL DIAERESIS" #x2362)
+    ("APL FUNCTIONAL SYMBOL STAR DIAERESIS" #x2363)
+    ("APL FUNCTIONAL SYMBOL JOT DIAERESIS" #x2364)
+    ("APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS" #x2365)
+    ("APL FUNCTIONAL SYMBOL DOWN SHOE STILE" #x2366)
+    ("APL FUNCTIONAL SYMBOL LEFT SHOE STILE" #x2367)
+    ("APL FUNCTIONAL SYMBOL TILDE DIAERESIS" #x2368)
+    ("APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS" #x2369)
+    ("APL FUNCTIONAL SYMBOL COMMA BAR" #x236A)
+    ("APL FUNCTIONAL SYMBOL DEL TILDE" #x236B)
+    ("APL FUNCTIONAL SYMBOL ZILDE" #x236C)
+    ("APL FUNCTIONAL SYMBOL STILE TILDE" #x236D)
+    ("APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR" #x236E)
+    ("APL FUNCTIONAL SYMBOL QUAD NOT EQUAL" #x236F)
+    ("APL FUNCTIONAL SYMBOL QUAD QUESTION" #x2370)
+    ("APL FUNCTIONAL SYMBOL DOWN CARET TILDE" #x2371)
+    ("APL FUNCTIONAL SYMBOL UP CARET TILDE" #x2372)
+    ("APL FUNCTIONAL SYMBOL IOTA" #x2373)
+    ("APL FUNCTIONAL SYMBOL RHO" #x2374)
+    ("APL FUNCTIONAL SYMBOL OMEGA" #x2375)
+    ("APL FUNCTIONAL SYMBOL ALPHA UNDERBAR" #x2376)
+    ("APL FUNCTIONAL SYMBOL EPSILON UNDERBAR" #x2377)
+    ("APL FUNCTIONAL SYMBOL IOTA UNDERBAR" #x2378)
+    ("APL FUNCTIONAL SYMBOL OMEGA UNDERBAR" #x2379)
+    ("APL FUNCTIONAL SYMBOL ALPHA" #x237A)
+    ("NOT CHECK MARK" #x237B)
+    ("RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW" #x237C)
+    ("SHOULDERED OPEN BOX" #x237D)
+    ("BELL SYMBOL" #x237E)
+    ("VERTICAL LINE WITH MIDDLE DOT" #x237F)
+    ("INSERTION SYMBOL" #x2380)
+    ("CONTINUOUS UNDERLINE SYMBOL" #x2381)
+    ("DISCONTINUOUS UNDERLINE SYMBOL" #x2382)
+    ("EMPHASIS SYMBOL" #x2383)
+    ("COMPOSITION SYMBOL" #x2384)
+    ("WHITE SQUARE WITH CENTRE VERTICAL LINE" #x2385)
+    ("ENTER SYMBOL" #x2386)
+    ("ALTERNATIVE KEY SYMBOL" #x2387)
+    ("HELM SYMBOL" #x2388)
+    ("CIRCLED HORIZONTAL BAR WITH NOTCH" #x2389)
+    ("CIRCLED TRIANGLE DOWN" #x238A)
+    ("BROKEN CIRCLE WITH NORTHWEST ARROW" #x238B)
+    ("UNDO SYMBOL" #x238C)
+    ("MONOSTABLE SYMBOL" #x238D)
+    ("HYSTERESIS SYMBOL" #x238E)
+    ("OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL" #x238F)
+    ("OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL" #x2390)
+    ("PASSIVE-PULL-DOWN-OUTPUT SYMBOL" #x2391)
+    ("PASSIVE-PULL-UP-OUTPUT SYMBOL" #x2392)
+    ("DIRECT CURRENT SYMBOL FORM TWO" #x2393)
+    ("SOFTWARE-FUNCTION SYMBOL" #x2394)
+    ("APL FUNCTIONAL SYMBOL QUAD" #x2395)
+    ("DECIMAL SEPARATOR KEY SYMBOL" #x2396)
+    ("PREVIOUS PAGE" #x2397)
+    ("NEXT PAGE" #x2398)
+    ("PRINT SCREEN SYMBOL" #x2399)
+    ("CLEAR SCREEN SYMBOL" #x239A)
+    ("LEFT PARENTHESIS UPPER HOOK" #x239B)
+    ("LEFT PARENTHESIS EXTENSION" #x239C)
+    ("LEFT PARENTHESIS LOWER HOOK" #x239D)
+    ("RIGHT PARENTHESIS UPPER HOOK" #x239E)
+    ("RIGHT PARENTHESIS EXTENSION" #x239F)
+    ("RIGHT PARENTHESIS LOWER HOOK" #x23A0)
+    ("LEFT SQUARE BRACKET UPPER CORNER" #x23A1)
+    ("LEFT SQUARE BRACKET EXTENSION" #x23A2)
+    ("LEFT SQUARE BRACKET LOWER CORNER" #x23A3)
+    ("RIGHT SQUARE BRACKET UPPER CORNER" #x23A4)
+    ("RIGHT SQUARE BRACKET EXTENSION" #x23A5)
+    ("RIGHT SQUARE BRACKET LOWER CORNER" #x23A6)
+    ("LEFT CURLY BRACKET UPPER HOOK" #x23A7)
+    ("LEFT CURLY BRACKET MIDDLE PIECE" #x23A8)
+    ("LEFT CURLY BRACKET LOWER HOOK" #x23A9)
+    ("CURLY BRACKET EXTENSION" #x23AA)
+    ("RIGHT CURLY BRACKET UPPER HOOK" #x23AB)
+    ("RIGHT CURLY BRACKET MIDDLE PIECE" #x23AC)
+    ("RIGHT CURLY BRACKET LOWER HOOK" #x23AD)
+    ("INTEGRAL EXTENSION" #x23AE)
+    ("HORIZONTAL LINE EXTENSION" #x23AF)
+    ("UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION" #x23B0)
+    ("UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION" #x23B1)
+    ("SUMMATION TOP" #x23B2)
+    ("SUMMATION BOTTOM" #x23B3)
+    ("TOP SQUARE BRACKET" #x23B4)
+    ("BOTTOM SQUARE BRACKET" #x23B5)
+    ("BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET" #x23B6)
+    ("RADICAL SYMBOL BOTTOM" #x23B7)
+    ("LEFT VERTICAL BOX LINE" #x23B8)
+    ("RIGHT VERTICAL BOX LINE" #x23B9)
+    ("HORIZONTAL SCAN LINE-1" #x23BA)
+    ("HORIZONTAL SCAN LINE-3" #x23BB)
+    ("HORIZONTAL SCAN LINE-7" #x23BC)
+    ("HORIZONTAL SCAN LINE-9" #x23BD)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT" #x23BE)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT" #x23BF)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE" #x23C0)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE" #x23C1)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE" #x23C2)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE" #x23C3)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE" #x23C4)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE" #x23C5)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE" #x23C6)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE" #x23C7)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE" #x23C8)
+    ("DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL" #x23C9)
+    ("DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL" #x23CA)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT" #x23CB)
+    ("DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT" #x23CC)
+    ("SQUARE FOOT" #x23CD)
+    ("RETURN SYMBOL" #x23CE)
+    ))
+
+;; arch-tag: ee70bee5-f22f-4c0e-bed6-2606b27d94cf
diff --git a/etc/nxml/02400-0243F.el b/etc/nxml/02400-0243F.el
new file mode 100644 (file)
index 0000000..ff6bdce
--- /dev/null
@@ -0,0 +1,43 @@
+(nxml-define-char-name-set 'control-pictures
+  '(("SYMBOL FOR NULL" #x2400)
+    ("SYMBOL FOR START OF HEADING" #x2401)
+    ("SYMBOL FOR START OF TEXT" #x2402)
+    ("SYMBOL FOR END OF TEXT" #x2403)
+    ("SYMBOL FOR END OF TRANSMISSION" #x2404)
+    ("SYMBOL FOR ENQUIRY" #x2405)
+    ("SYMBOL FOR ACKNOWLEDGE" #x2406)
+    ("SYMBOL FOR BELL" #x2407)
+    ("SYMBOL FOR BACKSPACE" #x2408)
+    ("SYMBOL FOR HORIZONTAL TABULATION" #x2409)
+    ("SYMBOL FOR LINE FEED" #x240A)
+    ("SYMBOL FOR VERTICAL TABULATION" #x240B)
+    ("SYMBOL FOR FORM FEED" #x240C)
+    ("SYMBOL FOR CARRIAGE RETURN" #x240D)
+    ("SYMBOL FOR SHIFT OUT" #x240E)
+    ("SYMBOL FOR SHIFT IN" #x240F)
+    ("SYMBOL FOR DATA LINK ESCAPE" #x2410)
+    ("SYMBOL FOR DEVICE CONTROL ONE" #x2411)
+    ("SYMBOL FOR DEVICE CONTROL TWO" #x2412)
+    ("SYMBOL FOR DEVICE CONTROL THREE" #x2413)
+    ("SYMBOL FOR DEVICE CONTROL FOUR" #x2414)
+    ("SYMBOL FOR NEGATIVE ACKNOWLEDGE" #x2415)
+    ("SYMBOL FOR SYNCHRONOUS IDLE" #x2416)
+    ("SYMBOL FOR END OF TRANSMISSION BLOCK" #x2417)
+    ("SYMBOL FOR CANCEL" #x2418)
+    ("SYMBOL FOR END OF MEDIUM" #x2419)
+    ("SYMBOL FOR SUBSTITUTE" #x241A)
+    ("SYMBOL FOR ESCAPE" #x241B)
+    ("SYMBOL FOR FILE SEPARATOR" #x241C)
+    ("SYMBOL FOR GROUP SEPARATOR" #x241D)
+    ("SYMBOL FOR RECORD SEPARATOR" #x241E)
+    ("SYMBOL FOR UNIT SEPARATOR" #x241F)
+    ("SYMBOL FOR SPACE" #x2420)
+    ("SYMBOL FOR DELETE" #x2421)
+    ("BLANK SYMBOL" #x2422)
+    ("OPEN BOX" #x2423)
+    ("SYMBOL FOR NEWLINE" #x2424)
+    ("SYMBOL FOR DELETE FORM TWO" #x2425)
+    ("SYMBOL FOR SUBSTITUTE FORM TWO" #x2426)
+    ))
+
+;; arch-tag: efc349c9-065d-4033-b261-7cb961c54072
diff --git a/etc/nxml/02440-0245F.el b/etc/nxml/02440-0245F.el
new file mode 100644 (file)
index 0000000..3a484ce
--- /dev/null
@@ -0,0 +1,15 @@
+(nxml-define-char-name-set 'optical-character-recognition
+  '(("OCR HOOK" #x2440)
+    ("OCR CHAIR" #x2441)
+    ("OCR FORK" #x2442)
+    ("OCR INVERTED FORK" #x2443)
+    ("OCR BELT BUCKLE" #x2444)
+    ("OCR BOW TIE" #x2445)
+    ("OCR BRANCH BANK IDENTIFICATION" #x2446)
+    ("OCR AMOUNT OF CHECK" #x2447)
+    ("OCR DASH" #x2448)
+    ("OCR CUSTOMER ACCOUNT NUMBER" #x2449)
+    ("OCR DOUBLE BACKSLASH" #x244A)
+    ))
+
+;; arch-tag: e532db31-38fd-4eee-8e47-974316fb6dd5
diff --git a/etc/nxml/02460-024FF.el b/etc/nxml/02460-024FF.el
new file mode 100644 (file)
index 0000000..4cbea4a
--- /dev/null
@@ -0,0 +1,163 @@
+(nxml-define-char-name-set 'enclosed-alphanumerics
+  '(("CIRCLED DIGIT ONE" #x2460)
+    ("CIRCLED DIGIT TWO" #x2461)
+    ("CIRCLED DIGIT THREE" #x2462)
+    ("CIRCLED DIGIT FOUR" #x2463)
+    ("CIRCLED DIGIT FIVE" #x2464)
+    ("CIRCLED DIGIT SIX" #x2465)
+    ("CIRCLED DIGIT SEVEN" #x2466)
+    ("CIRCLED DIGIT EIGHT" #x2467)
+    ("CIRCLED DIGIT NINE" #x2468)
+    ("CIRCLED NUMBER TEN" #x2469)
+    ("CIRCLED NUMBER ELEVEN" #x246A)
+    ("CIRCLED NUMBER TWELVE" #x246B)
+    ("CIRCLED NUMBER THIRTEEN" #x246C)
+    ("CIRCLED NUMBER FOURTEEN" #x246D)
+    ("CIRCLED NUMBER FIFTEEN" #x246E)
+    ("CIRCLED NUMBER SIXTEEN" #x246F)
+    ("CIRCLED NUMBER SEVENTEEN" #x2470)
+    ("CIRCLED NUMBER EIGHTEEN" #x2471)
+    ("CIRCLED NUMBER NINETEEN" #x2472)
+    ("CIRCLED NUMBER TWENTY" #x2473)
+    ("PARENTHESIZED DIGIT ONE" #x2474)
+    ("PARENTHESIZED DIGIT TWO" #x2475)
+    ("PARENTHESIZED DIGIT THREE" #x2476)
+    ("PARENTHESIZED DIGIT FOUR" #x2477)
+    ("PARENTHESIZED DIGIT FIVE" #x2478)
+    ("PARENTHESIZED DIGIT SIX" #x2479)
+    ("PARENTHESIZED DIGIT SEVEN" #x247A)
+    ("PARENTHESIZED DIGIT EIGHT" #x247B)
+    ("PARENTHESIZED DIGIT NINE" #x247C)
+    ("PARENTHESIZED NUMBER TEN" #x247D)
+    ("PARENTHESIZED NUMBER ELEVEN" #x247E)
+    ("PARENTHESIZED NUMBER TWELVE" #x247F)
+    ("PARENTHESIZED NUMBER THIRTEEN" #x2480)
+    ("PARENTHESIZED NUMBER FOURTEEN" #x2481)
+    ("PARENTHESIZED NUMBER FIFTEEN" #x2482)
+    ("PARENTHESIZED NUMBER SIXTEEN" #x2483)
+    ("PARENTHESIZED NUMBER SEVENTEEN" #x2484)
+    ("PARENTHESIZED NUMBER EIGHTEEN" #x2485)
+    ("PARENTHESIZED NUMBER NINETEEN" #x2486)
+    ("PARENTHESIZED NUMBER TWENTY" #x2487)
+    ("DIGIT ONE FULL STOP" #x2488)
+    ("DIGIT TWO FULL STOP" #x2489)
+    ("DIGIT THREE FULL STOP" #x248A)
+    ("DIGIT FOUR FULL STOP" #x248B)
+    ("DIGIT FIVE FULL STOP" #x248C)
+    ("DIGIT SIX FULL STOP" #x248D)
+    ("DIGIT SEVEN FULL STOP" #x248E)
+    ("DIGIT EIGHT FULL STOP" #x248F)
+    ("DIGIT NINE FULL STOP" #x2490)
+    ("NUMBER TEN FULL STOP" #x2491)
+    ("NUMBER ELEVEN FULL STOP" #x2492)
+    ("NUMBER TWELVE FULL STOP" #x2493)
+    ("NUMBER THIRTEEN FULL STOP" #x2494)
+    ("NUMBER FOURTEEN FULL STOP" #x2495)
+    ("NUMBER FIFTEEN FULL STOP" #x2496)
+    ("NUMBER SIXTEEN FULL STOP" #x2497)
+    ("NUMBER SEVENTEEN FULL STOP" #x2498)
+    ("NUMBER EIGHTEEN FULL STOP" #x2499)
+    ("NUMBER NINETEEN FULL STOP" #x249A)
+    ("NUMBER TWENTY FULL STOP" #x249B)
+    ("PARENTHESIZED LATIN SMALL LETTER A" #x249C)
+    ("PARENTHESIZED LATIN SMALL LETTER B" #x249D)
+    ("PARENTHESIZED LATIN SMALL LETTER C" #x249E)
+    ("PARENTHESIZED LATIN SMALL LETTER D" #x249F)
+    ("PARENTHESIZED LATIN SMALL LETTER E" #x24A0)
+    ("PARENTHESIZED LATIN SMALL LETTER F" #x24A1)
+    ("PARENTHESIZED LATIN SMALL LETTER G" #x24A2)
+    ("PARENTHESIZED LATIN SMALL LETTER H" #x24A3)
+    ("PARENTHESIZED LATIN SMALL LETTER I" #x24A4)
+    ("PARENTHESIZED LATIN SMALL LETTER J" #x24A5)
+    ("PARENTHESIZED LATIN SMALL LETTER K" #x24A6)
+    ("PARENTHESIZED LATIN SMALL LETTER L" #x24A7)
+    ("PARENTHESIZED LATIN SMALL LETTER M" #x24A8)
+    ("PARENTHESIZED LATIN SMALL LETTER N" #x24A9)
+    ("PARENTHESIZED LATIN SMALL LETTER O" #x24AA)
+    ("PARENTHESIZED LATIN SMALL LETTER P" #x24AB)
+    ("PARENTHESIZED LATIN SMALL LETTER Q" #x24AC)
+    ("PARENTHESIZED LATIN SMALL LETTER R" #x24AD)
+    ("PARENTHESIZED LATIN SMALL LETTER S" #x24AE)
+    ("PARENTHESIZED LATIN SMALL LETTER T" #x24AF)
+    ("PARENTHESIZED LATIN SMALL LETTER U" #x24B0)
+    ("PARENTHESIZED LATIN SMALL LETTER V" #x24B1)
+    ("PARENTHESIZED LATIN SMALL LETTER W" #x24B2)
+    ("PARENTHESIZED LATIN SMALL LETTER X" #x24B3)
+    ("PARENTHESIZED LATIN SMALL LETTER Y" #x24B4)
+    ("PARENTHESIZED LATIN SMALL LETTER Z" #x24B5)
+    ("CIRCLED LATIN CAPITAL LETTER A" #x24B6)
+    ("CIRCLED LATIN CAPITAL LETTER B" #x24B7)
+    ("CIRCLED LATIN CAPITAL LETTER C" #x24B8)
+    ("CIRCLED LATIN CAPITAL LETTER D" #x24B9)
+    ("CIRCLED LATIN CAPITAL LETTER E" #x24BA)
+    ("CIRCLED LATIN CAPITAL LETTER F" #x24BB)
+    ("CIRCLED LATIN CAPITAL LETTER G" #x24BC)
+    ("CIRCLED LATIN CAPITAL LETTER H" #x24BD)
+    ("CIRCLED LATIN CAPITAL LETTER I" #x24BE)
+    ("CIRCLED LATIN CAPITAL LETTER J" #x24BF)
+    ("CIRCLED LATIN CAPITAL LETTER K" #x24C0)
+    ("CIRCLED LATIN CAPITAL LETTER L" #x24C1)
+    ("CIRCLED LATIN CAPITAL LETTER M" #x24C2)
+    ("CIRCLED LATIN CAPITAL LETTER N" #x24C3)
+    ("CIRCLED LATIN CAPITAL LETTER O" #x24C4)
+    ("CIRCLED LATIN CAPITAL LETTER P" #x24C5)
+    ("CIRCLED LATIN CAPITAL LETTER Q" #x24C6)
+    ("CIRCLED LATIN CAPITAL LETTER R" #x24C7)
+    ("CIRCLED LATIN CAPITAL LETTER S" #x24C8)
+    ("CIRCLED LATIN CAPITAL LETTER T" #x24C9)
+    ("CIRCLED LATIN CAPITAL LETTER U" #x24CA)
+    ("CIRCLED LATIN CAPITAL LETTER V" #x24CB)
+    ("CIRCLED LATIN CAPITAL LETTER W" #x24CC)
+    ("CIRCLED LATIN CAPITAL LETTER X" #x24CD)
+    ("CIRCLED LATIN CAPITAL LETTER Y" #x24CE)
+    ("CIRCLED LATIN CAPITAL LETTER Z" #x24CF)
+    ("CIRCLED LATIN SMALL LETTER A" #x24D0)
+    ("CIRCLED LATIN SMALL LETTER B" #x24D1)
+    ("CIRCLED LATIN SMALL LETTER C" #x24D2)
+    ("CIRCLED LATIN SMALL LETTER D" #x24D3)
+    ("CIRCLED LATIN SMALL LETTER E" #x24D4)
+    ("CIRCLED LATIN SMALL LETTER F" #x24D5)
+    ("CIRCLED LATIN SMALL LETTER G" #x24D6)
+    ("CIRCLED LATIN SMALL LETTER H" #x24D7)
+    ("CIRCLED LATIN SMALL LETTER I" #x24D8)
+    ("CIRCLED LATIN SMALL LETTER J" #x24D9)
+    ("CIRCLED LATIN SMALL LETTER K" #x24DA)
+    ("CIRCLED LATIN SMALL LETTER L" #x24DB)
+    ("CIRCLED LATIN SMALL LETTER M" #x24DC)
+    ("CIRCLED LATIN SMALL LETTER N" #x24DD)
+    ("CIRCLED LATIN SMALL LETTER O" #x24DE)
+    ("CIRCLED LATIN SMALL LETTER P" #x24DF)
+    ("CIRCLED LATIN SMALL LETTER Q" #x24E0)
+    ("CIRCLED LATIN SMALL LETTER R" #x24E1)
+    ("CIRCLED LATIN SMALL LETTER S" #x24E2)
+    ("CIRCLED LATIN SMALL LETTER T" #x24E3)
+    ("CIRCLED LATIN SMALL LETTER U" #x24E4)
+    ("CIRCLED LATIN SMALL LETTER V" #x24E5)
+    ("CIRCLED LATIN SMALL LETTER W" #x24E6)
+    ("CIRCLED LATIN SMALL LETTER X" #x24E7)
+    ("CIRCLED LATIN SMALL LETTER Y" #x24E8)
+    ("CIRCLED LATIN SMALL LETTER Z" #x24E9)
+    ("CIRCLED DIGIT ZERO" #x24EA)
+    ("NEGATIVE CIRCLED NUMBER ELEVEN" #x24EB)
+    ("NEGATIVE CIRCLED NUMBER TWELVE" #x24EC)
+    ("NEGATIVE CIRCLED NUMBER THIRTEEN" #x24ED)
+    ("NEGATIVE CIRCLED NUMBER FOURTEEN" #x24EE)
+    ("NEGATIVE CIRCLED NUMBER FIFTEEN" #x24EF)
+    ("NEGATIVE CIRCLED NUMBER SIXTEEN" #x24F0)
+    ("NEGATIVE CIRCLED NUMBER SEVENTEEN" #x24F1)
+    ("NEGATIVE CIRCLED NUMBER EIGHTEEN" #x24F2)
+    ("NEGATIVE CIRCLED NUMBER NINETEEN" #x24F3)
+    ("NEGATIVE CIRCLED NUMBER TWENTY" #x24F4)
+    ("DOUBLE CIRCLED DIGIT ONE" #x24F5)
+    ("DOUBLE CIRCLED DIGIT TWO" #x24F6)
+    ("DOUBLE CIRCLED DIGIT THREE" #x24F7)
+    ("DOUBLE CIRCLED DIGIT FOUR" #x24F8)
+    ("DOUBLE CIRCLED DIGIT FIVE" #x24F9)
+    ("DOUBLE CIRCLED DIGIT SIX" #x24FA)
+    ("DOUBLE CIRCLED DIGIT SEVEN" #x24FB)
+    ("DOUBLE CIRCLED DIGIT EIGHT" #x24FC)
+    ("DOUBLE CIRCLED DIGIT NINE" #x24FD)
+    ("DOUBLE CIRCLED NUMBER TEN" #x24FE)
+    ))
+
+;; arch-tag: 2ec7ede5-ce9d-48b5-a725-dd3f177060f4
diff --git a/etc/nxml/02500-0257F.el b/etc/nxml/02500-0257F.el
new file mode 100644 (file)
index 0000000..97e63df
--- /dev/null
@@ -0,0 +1,132 @@
+(nxml-define-char-name-set 'box-drawing
+  '(("BOX DRAWINGS LIGHT HORIZONTAL" #x2500)
+    ("BOX DRAWINGS HEAVY HORIZONTAL" #x2501)
+    ("BOX DRAWINGS LIGHT VERTICAL" #x2502)
+    ("BOX DRAWINGS HEAVY VERTICAL" #x2503)
+    ("BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL" #x2504)
+    ("BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL" #x2505)
+    ("BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL" #x2506)
+    ("BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL" #x2507)
+    ("BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL" #x2508)
+    ("BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL" #x2509)
+    ("BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL" #x250A)
+    ("BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL" #x250B)
+    ("BOX DRAWINGS LIGHT DOWN AND RIGHT" #x250C)
+    ("BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY" #x250D)
+    ("BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT" #x250E)
+    ("BOX DRAWINGS HEAVY DOWN AND RIGHT" #x250F)
+    ("BOX DRAWINGS LIGHT DOWN AND LEFT" #x2510)
+    ("BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY" #x2511)
+    ("BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT" #x2512)
+    ("BOX DRAWINGS HEAVY DOWN AND LEFT" #x2513)
+    ("BOX DRAWINGS LIGHT UP AND RIGHT" #x2514)
+    ("BOX DRAWINGS UP LIGHT AND RIGHT HEAVY" #x2515)
+    ("BOX DRAWINGS UP HEAVY AND RIGHT LIGHT" #x2516)
+    ("BOX DRAWINGS HEAVY UP AND RIGHT" #x2517)
+    ("BOX DRAWINGS LIGHT UP AND LEFT" #x2518)
+    ("BOX DRAWINGS UP LIGHT AND LEFT HEAVY" #x2519)
+    ("BOX DRAWINGS UP HEAVY AND LEFT LIGHT" #x251A)
+    ("BOX DRAWINGS HEAVY UP AND LEFT" #x251B)
+    ("BOX DRAWINGS LIGHT VERTICAL AND RIGHT" #x251C)
+    ("BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY" #x251D)
+    ("BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT" #x251E)
+    ("BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT" #x251F)
+    ("BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT" #x2520)
+    ("BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY" #x2521)
+    ("BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY" #x2522)
+    ("BOX DRAWINGS HEAVY VERTICAL AND RIGHT" #x2523)
+    ("BOX DRAWINGS LIGHT VERTICAL AND LEFT" #x2524)
+    ("BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY" #x2525)
+    ("BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT" #x2526)
+    ("BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT" #x2527)
+    ("BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT" #x2528)
+    ("BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY" #x2529)
+    ("BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY" #x252A)
+    ("BOX DRAWINGS HEAVY VERTICAL AND LEFT" #x252B)
+    ("BOX DRAWINGS LIGHT DOWN AND HORIZONTAL" #x252C)
+    ("BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT" #x252D)
+    ("BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT" #x252E)
+    ("BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY" #x252F)
+    ("BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT" #x2530)
+    ("BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY" #x2531)
+    ("BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY" #x2532)
+    ("BOX DRAWINGS HEAVY DOWN AND HORIZONTAL" #x2533)
+    ("BOX DRAWINGS LIGHT UP AND HORIZONTAL" #x2534)
+    ("BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT" #x2535)
+    ("BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT" #x2536)
+    ("BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY" #x2537)
+    ("BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT" #x2538)
+    ("BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY" #x2539)
+    ("BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY" #x253A)
+    ("BOX DRAWINGS HEAVY UP AND HORIZONTAL" #x253B)
+    ("BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL" #x253C)
+    ("BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT" #x253D)
+    ("BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT" #x253E)
+    ("BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY" #x253F)
+    ("BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT" #x2540)
+    ("BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT" #x2541)
+    ("BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT" #x2542)
+    ("BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT" #x2543)
+    ("BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT" #x2544)
+    ("BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT" #x2545)
+    ("BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT" #x2546)
+    ("BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY" #x2547)
+    ("BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY" #x2548)
+    ("BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY" #x2549)
+    ("BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY" #x254A)
+    ("BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL" #x254B)
+    ("BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL" #x254C)
+    ("BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL" #x254D)
+    ("BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL" #x254E)
+    ("BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL" #x254F)
+    ("BOX DRAWINGS DOUBLE HORIZONTAL" #x2550)
+    ("BOX DRAWINGS DOUBLE VERTICAL" #x2551)
+    ("BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE" #x2552)
+    ("BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE" #x2553)
+    ("BOX DRAWINGS DOUBLE DOWN AND RIGHT" #x2554)
+    ("BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE" #x2555)
+    ("BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE" #x2556)
+    ("BOX DRAWINGS DOUBLE DOWN AND LEFT" #x2557)
+    ("BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE" #x2558)
+    ("BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE" #x2559)
+    ("BOX DRAWINGS DOUBLE UP AND RIGHT" #x255A)
+    ("BOX DRAWINGS UP SINGLE AND LEFT DOUBLE" #x255B)
+    ("BOX DRAWINGS UP DOUBLE AND LEFT SINGLE" #x255C)
+    ("BOX DRAWINGS DOUBLE UP AND LEFT" #x255D)
+    ("BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE" #x255E)
+    ("BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE" #x255F)
+    ("BOX DRAWINGS DOUBLE VERTICAL AND RIGHT" #x2560)
+    ("BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE" #x2561)
+    ("BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE" #x2562)
+    ("BOX DRAWINGS DOUBLE VERTICAL AND LEFT" #x2563)
+    ("BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE" #x2564)
+    ("BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE" #x2565)
+    ("BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL" #x2566)
+    ("BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE" #x2567)
+    ("BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE" #x2568)
+    ("BOX DRAWINGS DOUBLE UP AND HORIZONTAL" #x2569)
+    ("BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE" #x256A)
+    ("BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE" #x256B)
+    ("BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL" #x256C)
+    ("BOX DRAWINGS LIGHT ARC DOWN AND RIGHT" #x256D)
+    ("BOX DRAWINGS LIGHT ARC DOWN AND LEFT" #x256E)
+    ("BOX DRAWINGS LIGHT ARC UP AND LEFT" #x256F)
+    ("BOX DRAWINGS LIGHT ARC UP AND RIGHT" #x2570)
+    ("BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT" #x2571)
+    ("BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT" #x2572)
+    ("BOX DRAWINGS LIGHT DIAGONAL CROSS" #x2573)
+    ("BOX DRAWINGS LIGHT LEFT" #x2574)
+    ("BOX DRAWINGS LIGHT UP" #x2575)
+    ("BOX DRAWINGS LIGHT RIGHT" #x2576)
+    ("BOX DRAWINGS LIGHT DOWN" #x2577)
+    ("BOX DRAWINGS HEAVY LEFT" #x2578)
+    ("BOX DRAWINGS HEAVY UP" #x2579)
+    ("BOX DRAWINGS HEAVY RIGHT" #x257A)
+    ("BOX DRAWINGS HEAVY DOWN" #x257B)
+    ("BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT" #x257C)
+    ("BOX DRAWINGS LIGHT UP AND HEAVY DOWN" #x257D)
+    ("BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT" #x257E)
+    ("BOX DRAWINGS HEAVY UP AND LIGHT DOWN" #x257F)
+    ))
+
+;; arch-tag: 6870ad7c-84cf-42a0-82ce-f6863da1c7ad
diff --git a/etc/nxml/02580-0259F.el b/etc/nxml/02580-0259F.el
new file mode 100644 (file)
index 0000000..bc4d6a1
--- /dev/null
@@ -0,0 +1,36 @@
+(nxml-define-char-name-set 'block-elements
+  '(("UPPER HALF BLOCK" #x2580)
+    ("LOWER ONE EIGHTH BLOCK" #x2581)
+    ("LOWER ONE QUARTER BLOCK" #x2582)
+    ("LOWER THREE EIGHTHS BLOCK" #x2583)
+    ("LOWER HALF BLOCK" #x2584)
+    ("LOWER FIVE EIGHTHS BLOCK" #x2585)
+    ("LOWER THREE QUARTERS BLOCK" #x2586)
+    ("LOWER SEVEN EIGHTHS BLOCK" #x2587)
+    ("FULL BLOCK" #x2588)
+    ("LEFT SEVEN EIGHTHS BLOCK" #x2589)
+    ("LEFT THREE QUARTERS BLOCK" #x258A)
+    ("LEFT FIVE EIGHTHS BLOCK" #x258B)
+    ("LEFT HALF BLOCK" #x258C)
+    ("LEFT THREE EIGHTHS BLOCK" #x258D)
+    ("LEFT ONE QUARTER BLOCK" #x258E)
+    ("LEFT ONE EIGHTH BLOCK" #x258F)
+    ("RIGHT HALF BLOCK" #x2590)
+    ("LIGHT SHADE" #x2591)
+    ("MEDIUM SHADE" #x2592)
+    ("DARK SHADE" #x2593)
+    ("UPPER ONE EIGHTH BLOCK" #x2594)
+    ("RIGHT ONE EIGHTH BLOCK" #x2595)
+    ("QUADRANT LOWER LEFT" #x2596)
+    ("QUADRANT LOWER RIGHT" #x2597)
+    ("QUADRANT UPPER LEFT" #x2598)
+    ("QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT" #x2599)
+    ("QUADRANT UPPER LEFT AND LOWER RIGHT" #x259A)
+    ("QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT" #x259B)
+    ("QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT" #x259C)
+    ("QUADRANT UPPER RIGHT" #x259D)
+    ("QUADRANT UPPER RIGHT AND LOWER LEFT" #x259E)
+    ("QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT" #x259F)
+    ))
+
+;; arch-tag: 51c971a7-cd90-42a5-bf18-dd9683bcab41
diff --git a/etc/nxml/025A0-025FF.el b/etc/nxml/025A0-025FF.el
new file mode 100644 (file)
index 0000000..47284d4
--- /dev/null
@@ -0,0 +1,100 @@
+(nxml-define-char-name-set 'geometric-shapes
+  '(("BLACK SQUARE" #x25A0)
+    ("WHITE SQUARE" #x25A1)
+    ("WHITE SQUARE WITH ROUNDED CORNERS" #x25A2)
+    ("WHITE SQUARE CONTAINING BLACK SMALL SQUARE" #x25A3)
+    ("SQUARE WITH HORIZONTAL FILL" #x25A4)
+    ("SQUARE WITH VERTICAL FILL" #x25A5)
+    ("SQUARE WITH ORTHOGONAL CROSSHATCH FILL" #x25A6)
+    ("SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL" #x25A7)
+    ("SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL" #x25A8)
+    ("SQUARE WITH DIAGONAL CROSSHATCH FILL" #x25A9)
+    ("BLACK SMALL SQUARE" #x25AA)
+    ("WHITE SMALL SQUARE" #x25AB)
+    ("BLACK RECTANGLE" #x25AC)
+    ("WHITE RECTANGLE" #x25AD)
+    ("BLACK VERTICAL RECTANGLE" #x25AE)
+    ("WHITE VERTICAL RECTANGLE" #x25AF)
+    ("BLACK PARALLELOGRAM" #x25B0)
+    ("WHITE PARALLELOGRAM" #x25B1)
+    ("BLACK UP-POINTING TRIANGLE" #x25B2)
+    ("WHITE UP-POINTING TRIANGLE" #x25B3)
+    ("BLACK UP-POINTING SMALL TRIANGLE" #x25B4)
+    ("WHITE UP-POINTING SMALL TRIANGLE" #x25B5)
+    ("BLACK RIGHT-POINTING TRIANGLE" #x25B6)
+    ("WHITE RIGHT-POINTING TRIANGLE" #x25B7)
+    ("BLACK RIGHT-POINTING SMALL TRIANGLE" #x25B8)
+    ("WHITE RIGHT-POINTING SMALL TRIANGLE" #x25B9)
+    ("BLACK RIGHT-POINTING POINTER" #x25BA)
+    ("WHITE RIGHT-POINTING POINTER" #x25BB)
+    ("BLACK DOWN-POINTING TRIANGLE" #x25BC)
+    ("WHITE DOWN-POINTING TRIANGLE" #x25BD)
+    ("BLACK DOWN-POINTING SMALL TRIANGLE" #x25BE)
+    ("WHITE DOWN-POINTING SMALL TRIANGLE" #x25BF)
+    ("BLACK LEFT-POINTING TRIANGLE" #x25C0)
+    ("WHITE LEFT-POINTING TRIANGLE" #x25C1)
+    ("BLACK LEFT-POINTING SMALL TRIANGLE" #x25C2)
+    ("WHITE LEFT-POINTING SMALL TRIANGLE" #x25C3)
+    ("BLACK LEFT-POINTING POINTER" #x25C4)
+    ("WHITE LEFT-POINTING POINTER" #x25C5)
+    ("BLACK DIAMOND" #x25C6)
+    ("WHITE DIAMOND" #x25C7)
+    ("WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND" #x25C8)
+    ("FISHEYE" #x25C9)
+    ("LOZENGE" #x25CA)
+    ("WHITE CIRCLE" #x25CB)
+    ("DOTTED CIRCLE" #x25CC)
+    ("CIRCLE WITH VERTICAL FILL" #x25CD)
+    ("BULLSEYE" #x25CE)
+    ("BLACK CIRCLE" #x25CF)
+    ("CIRCLE WITH LEFT HALF BLACK" #x25D0)
+    ("CIRCLE WITH RIGHT HALF BLACK" #x25D1)
+    ("CIRCLE WITH LOWER HALF BLACK" #x25D2)
+    ("CIRCLE WITH UPPER HALF BLACK" #x25D3)
+    ("CIRCLE WITH UPPER RIGHT QUADRANT BLACK" #x25D4)
+    ("CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK" #x25D5)
+    ("LEFT HALF BLACK CIRCLE" #x25D6)
+    ("RIGHT HALF BLACK CIRCLE" #x25D7)
+    ("INVERSE BULLET" #x25D8)
+    ("INVERSE WHITE CIRCLE" #x25D9)
+    ("UPPER HALF INVERSE WHITE CIRCLE" #x25DA)
+    ("LOWER HALF INVERSE WHITE CIRCLE" #x25DB)
+    ("UPPER LEFT QUADRANT CIRCULAR ARC" #x25DC)
+    ("UPPER RIGHT QUADRANT CIRCULAR ARC" #x25DD)
+    ("LOWER RIGHT QUADRANT CIRCULAR ARC" #x25DE)
+    ("LOWER LEFT QUADRANT CIRCULAR ARC" #x25DF)
+    ("UPPER HALF CIRCLE" #x25E0)
+    ("LOWER HALF CIRCLE" #x25E1)
+    ("BLACK LOWER RIGHT TRIANGLE" #x25E2)
+    ("BLACK LOWER LEFT TRIANGLE" #x25E3)
+    ("BLACK UPPER LEFT TRIANGLE" #x25E4)
+    ("BLACK UPPER RIGHT TRIANGLE" #x25E5)
+    ("WHITE BULLET" #x25E6)
+    ("SQUARE WITH LEFT HALF BLACK" #x25E7)
+    ("SQUARE WITH RIGHT HALF BLACK" #x25E8)
+    ("SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK" #x25E9)
+    ("SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK" #x25EA)
+    ("WHITE SQUARE WITH VERTICAL BISECTING LINE" #x25EB)
+    ("WHITE UP-POINTING TRIANGLE WITH DOT" #x25EC)
+    ("UP-POINTING TRIANGLE WITH LEFT HALF BLACK" #x25ED)
+    ("UP-POINTING TRIANGLE WITH RIGHT HALF BLACK" #x25EE)
+    ("LARGE CIRCLE" #x25EF)
+    ("WHITE SQUARE WITH UPPER LEFT QUADRANT" #x25F0)
+    ("WHITE SQUARE WITH LOWER LEFT QUADRANT" #x25F1)
+    ("WHITE SQUARE WITH LOWER RIGHT QUADRANT" #x25F2)
+    ("WHITE SQUARE WITH UPPER RIGHT QUADRANT" #x25F3)
+    ("WHITE CIRCLE WITH UPPER LEFT QUADRANT" #x25F4)
+    ("WHITE CIRCLE WITH LOWER LEFT QUADRANT" #x25F5)
+    ("WHITE CIRCLE WITH LOWER RIGHT QUADRANT" #x25F6)
+    ("WHITE CIRCLE WITH UPPER RIGHT QUADRANT" #x25F7)
+    ("UPPER LEFT TRIANGLE" #x25F8)
+    ("UPPER RIGHT TRIANGLE" #x25F9)
+    ("LOWER LEFT TRIANGLE" #x25FA)
+    ("WHITE MEDIUM SQUARE" #x25FB)
+    ("BLACK MEDIUM SQUARE" #x25FC)
+    ("WHITE MEDIUM SMALL SQUARE" #x25FD)
+    ("BLACK MEDIUM SMALL SQUARE" #x25FE)
+    ("LOWER RIGHT TRIANGLE" #x25FF)
+    ))
+
+;; arch-tag: ac97acd5-57a6-4521-bee4-8c2d0a9bd06a
diff --git a/etc/nxml/02600-026FF.el b/etc/nxml/02600-026FF.el
new file mode 100644 (file)
index 0000000..c0d0a06
--- /dev/null
@@ -0,0 +1,137 @@
+(nxml-define-char-name-set 'miscellaneous-symbols
+  '(("BLACK SUN WITH RAYS" #x2600)
+    ("CLOUD" #x2601)
+    ("UMBRELLA" #x2602)
+    ("SNOWMAN" #x2603)
+    ("COMET" #x2604)
+    ("BLACK STAR" #x2605)
+    ("WHITE STAR" #x2606)
+    ("LIGHTNING" #x2607)
+    ("THUNDERSTORM" #x2608)
+    ("SUN" #x2609)
+    ("ASCENDING NODE" #x260A)
+    ("DESCENDING NODE" #x260B)
+    ("CONJUNCTION" #x260C)
+    ("OPPOSITION" #x260D)
+    ("BLACK TELEPHONE" #x260E)
+    ("WHITE TELEPHONE" #x260F)
+    ("BALLOT BOX" #x2610)
+    ("BALLOT BOX WITH CHECK" #x2611)
+    ("BALLOT BOX WITH X" #x2612)
+    ("SALTIRE" #x2613)
+    ("WHITE SHOGI PIECE" #x2616)
+    ("BLACK SHOGI PIECE" #x2617)
+    ("REVERSED ROTATED FLORAL HEART BULLET" #x2619)
+    ("BLACK LEFT POINTING INDEX" #x261A)
+    ("BLACK RIGHT POINTING INDEX" #x261B)
+    ("WHITE LEFT POINTING INDEX" #x261C)
+    ("WHITE UP POINTING INDEX" #x261D)
+    ("WHITE RIGHT POINTING INDEX" #x261E)
+    ("WHITE DOWN POINTING INDEX" #x261F)
+    ("SKULL AND CROSSBONES" #x2620)
+    ("CAUTION SIGN" #x2621)
+    ("RADIOACTIVE SIGN" #x2622)
+    ("BIOHAZARD SIGN" #x2623)
+    ("CADUCEUS" #x2624)
+    ("ANKH" #x2625)
+    ("ORTHODOX CROSS" #x2626)
+    ("CHI RHO" #x2627)
+    ("CROSS OF LORRAINE" #x2628)
+    ("CROSS OF JERUSALEM" #x2629)
+    ("STAR AND CRESCENT" #x262A)
+    ("FARSI SYMBOL" #x262B)
+    ("ADI SHAKTI" #x262C)
+    ("HAMMER AND SICKLE" #x262D)
+    ("PEACE SYMBOL" #x262E)
+    ("YIN YANG" #x262F)
+    ("TRIGRAM FOR HEAVEN" #x2630)
+    ("TRIGRAM FOR LAKE" #x2631)
+    ("TRIGRAM FOR FIRE" #x2632)
+    ("TRIGRAM FOR THUNDER" #x2633)
+    ("TRIGRAM FOR WIND" #x2634)
+    ("TRIGRAM FOR WATER" #x2635)
+    ("TRIGRAM FOR MOUNTAIN" #x2636)
+    ("TRIGRAM FOR EARTH" #x2637)
+    ("WHEEL OF DHARMA" #x2638)
+    ("WHITE FROWNING FACE" #x2639)
+    ("WHITE SMILING FACE" #x263A)
+    ("BLACK SMILING FACE" #x263B)
+    ("WHITE SUN WITH RAYS" #x263C)
+    ("FIRST QUARTER MOON" #x263D)
+    ("LAST QUARTER MOON" #x263E)
+    ("MERCURY" #x263F)
+    ("FEMALE SIGN" #x2640)
+    ("EARTH" #x2641)
+    ("MALE SIGN" #x2642)
+    ("JUPITER" #x2643)
+    ("SATURN" #x2644)
+    ("URANUS" #x2645)
+    ("NEPTUNE" #x2646)
+    ("PLUTO" #x2647)
+    ("ARIES" #x2648)
+    ("TAURUS" #x2649)
+    ("GEMINI" #x264A)
+    ("CANCER" #x264B)
+    ("LEO" #x264C)
+    ("VIRGO" #x264D)
+    ("LIBRA" #x264E)
+    ("SCORPIUS" #x264F)
+    ("SAGITTARIUS" #x2650)
+    ("CAPRICORN" #x2651)
+    ("AQUARIUS" #x2652)
+    ("PISCES" #x2653)
+    ("WHITE CHESS KING" #x2654)
+    ("WHITE CHESS QUEEN" #x2655)
+    ("WHITE CHESS ROOK" #x2656)
+    ("WHITE CHESS BISHOP" #x2657)
+    ("WHITE CHESS KNIGHT" #x2658)
+    ("WHITE CHESS PAWN" #x2659)
+    ("BLACK CHESS KING" #x265A)
+    ("BLACK CHESS QUEEN" #x265B)
+    ("BLACK CHESS ROOK" #x265C)
+    ("BLACK CHESS BISHOP" #x265D)
+    ("BLACK CHESS KNIGHT" #x265E)
+    ("BLACK CHESS PAWN" #x265F)
+    ("BLACK SPADE SUIT" #x2660)
+    ("WHITE HEART SUIT" #x2661)
+    ("WHITE DIAMOND SUIT" #x2662)
+    ("BLACK CLUB SUIT" #x2663)
+    ("WHITE SPADE SUIT" #x2664)
+    ("BLACK HEART SUIT" #x2665)
+    ("BLACK DIAMOND SUIT" #x2666)
+    ("WHITE CLUB SUIT" #x2667)
+    ("HOT SPRINGS" #x2668)
+    ("QUARTER NOTE" #x2669)
+    ("EIGHTH NOTE" #x266A)
+    ("BEAMED EIGHTH NOTES" #x266B)
+    ("BEAMED SIXTEENTH NOTES" #x266C)
+    ("MUSIC FLAT SIGN" #x266D)
+    ("MUSIC NATURAL SIGN" #x266E)
+    ("MUSIC SHARP SIGN" #x266F)
+    ("WEST SYRIAC CROSS" #x2670)
+    ("EAST SYRIAC CROSS" #x2671)
+    ("UNIVERSAL RECYCLING SYMBOL" #x2672)
+    ("RECYCLING SYMBOL FOR TYPE-1 PLASTICS" #x2673)
+    ("RECYCLING SYMBOL FOR TYPE-2 PLASTICS" #x2674)
+    ("RECYCLING SYMBOL FOR TYPE-3 PLASTICS" #x2675)
+    ("RECYCLING SYMBOL FOR TYPE-4 PLASTICS" #x2676)
+    ("RECYCLING SYMBOL FOR TYPE-5 PLASTICS" #x2677)
+    ("RECYCLING SYMBOL FOR TYPE-6 PLASTICS" #x2678)
+    ("RECYCLING SYMBOL FOR TYPE-7 PLASTICS" #x2679)
+    ("RECYCLING SYMBOL FOR GENERIC MATERIALS" #x267A)
+    ("BLACK UNIVERSAL RECYCLING SYMBOL" #x267B)
+    ("RECYCLED PAPER SYMBOL" #x267C)
+    ("PARTIALLY-RECYCLED PAPER SYMBOL" #x267D)
+    ("DIE FACE-1" #x2680)
+    ("DIE FACE-2" #x2681)
+    ("DIE FACE-3" #x2682)
+    ("DIE FACE-4" #x2683)
+    ("DIE FACE-5" #x2684)
+    ("DIE FACE-6" #x2685)
+    ("WHITE CIRCLE WITH DOT RIGHT" #x2686)
+    ("WHITE CIRCLE WITH TWO DOTS" #x2687)
+    ("BLACK CIRCLE WITH WHITE DOT RIGHT" #x2688)
+    ("BLACK CIRCLE WITH TWO WHITE DOTS" #x2689)
+    ))
+
+;; arch-tag: b976b52e-eefc-4aa3-b96c-7f4998429f77
diff --git a/etc/nxml/02700-027BF.el b/etc/nxml/02700-027BF.el
new file mode 100644 (file)
index 0000000..4759925
--- /dev/null
@@ -0,0 +1,178 @@
+(nxml-define-char-name-set 'dingbats
+  '(("UPPER BLADE SCISSORS" #x2701)
+    ("BLACK SCISSORS" #x2702)
+    ("LOWER BLADE SCISSORS" #x2703)
+    ("WHITE SCISSORS" #x2704)
+    ("TELEPHONE LOCATION SIGN" #x2706)
+    ("TAPE DRIVE" #x2707)
+    ("AIRPLANE" #x2708)
+    ("ENVELOPE" #x2709)
+    ("VICTORY HAND" #x270C)
+    ("WRITING HAND" #x270D)
+    ("LOWER RIGHT PENCIL" #x270E)
+    ("PENCIL" #x270F)
+    ("UPPER RIGHT PENCIL" #x2710)
+    ("WHITE NIB" #x2711)
+    ("BLACK NIB" #x2712)
+    ("CHECK MARK" #x2713)
+    ("HEAVY CHECK MARK" #x2714)
+    ("MULTIPLICATION X" #x2715)
+    ("HEAVY MULTIPLICATION X" #x2716)
+    ("BALLOT X" #x2717)
+    ("HEAVY BALLOT X" #x2718)
+    ("OUTLINED GREEK CROSS" #x2719)
+    ("HEAVY GREEK CROSS" #x271A)
+    ("OPEN CENTRE CROSS" #x271B)
+    ("HEAVY OPEN CENTRE CROSS" #x271C)
+    ("LATIN CROSS" #x271D)
+    ("SHADOWED WHITE LATIN CROSS" #x271E)
+    ("OUTLINED LATIN CROSS" #x271F)
+    ("MALTESE CROSS" #x2720)
+    ("STAR OF DAVID" #x2721)
+    ("FOUR TEARDROP-SPOKED ASTERISK" #x2722)
+    ("FOUR BALLOON-SPOKED ASTERISK" #x2723)
+    ("HEAVY FOUR BALLOON-SPOKED ASTERISK" #x2724)
+    ("FOUR CLUB-SPOKED ASTERISK" #x2725)
+    ("BLACK FOUR POINTED STAR" #x2726)
+    ("WHITE FOUR POINTED STAR" #x2727)
+    ("STRESS OUTLINED WHITE STAR" #x2729)
+    ("CIRCLED WHITE STAR" #x272A)
+    ("OPEN CENTRE BLACK STAR" #x272B)
+    ("BLACK CENTRE WHITE STAR" #x272C)
+    ("OUTLINED BLACK STAR" #x272D)
+    ("HEAVY OUTLINED BLACK STAR" #x272E)
+    ("PINWHEEL STAR" #x272F)
+    ("SHADOWED WHITE STAR" #x2730)
+    ("HEAVY ASTERISK" #x2731)
+    ("OPEN CENTRE ASTERISK" #x2732)
+    ("EIGHT SPOKED ASTERISK" #x2733)
+    ("EIGHT POINTED BLACK STAR" #x2734)
+    ("EIGHT POINTED PINWHEEL STAR" #x2735)
+    ("SIX POINTED BLACK STAR" #x2736)
+    ("EIGHT POINTED RECTILINEAR BLACK STAR" #x2737)
+    ("HEAVY EIGHT POINTED RECTILINEAR BLACK STAR" #x2738)
+    ("TWELVE POINTED BLACK STAR" #x2739)
+    ("SIXTEEN POINTED ASTERISK" #x273A)
+    ("TEARDROP-SPOKED ASTERISK" #x273B)
+    ("OPEN CENTRE TEARDROP-SPOKED ASTERISK" #x273C)
+    ("HEAVY TEARDROP-SPOKED ASTERISK" #x273D)
+    ("SIX PETALLED BLACK AND WHITE FLORETTE" #x273E)
+    ("BLACK FLORETTE" #x273F)
+    ("WHITE FLORETTE" #x2740)
+    ("EIGHT PETALLED OUTLINED BLACK FLORETTE" #x2741)
+    ("CIRCLED OPEN CENTRE EIGHT POINTED STAR" #x2742)
+    ("HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK" #x2743)
+    ("SNOWFLAKE" #x2744)
+    ("TIGHT TRIFOLIATE SNOWFLAKE" #x2745)
+    ("HEAVY CHEVRON SNOWFLAKE" #x2746)
+    ("SPARKLE" #x2747)
+    ("HEAVY SPARKLE" #x2748)
+    ("BALLOON-SPOKED ASTERISK" #x2749)
+    ("EIGHT TEARDROP-SPOKED PROPELLER ASTERISK" #x274A)
+    ("HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK" #x274B)
+    ("SHADOWED WHITE CIRCLE" #x274D)
+    ("LOWER RIGHT DROP-SHADOWED WHITE SQUARE" #x274F)
+    ("UPPER RIGHT DROP-SHADOWED WHITE SQUARE" #x2750)
+    ("LOWER RIGHT SHADOWED WHITE SQUARE" #x2751)
+    ("UPPER RIGHT SHADOWED WHITE SQUARE" #x2752)
+    ("BLACK DIAMOND MINUS WHITE X" #x2756)
+    ("LIGHT VERTICAL BAR" #x2758)
+    ("MEDIUM VERTICAL BAR" #x2759)
+    ("HEAVY VERTICAL BAR" #x275A)
+    ("HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT" #x275B)
+    ("HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT" #x275C)
+    ("HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT" #x275D)
+    ("HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT" #x275E)
+    ("CURVED STEM PARAGRAPH SIGN ORNAMENT" #x2761)
+    ("HEAVY EXCLAMATION MARK ORNAMENT" #x2762)
+    ("HEAVY HEART EXCLAMATION MARK ORNAMENT" #x2763)
+    ("HEAVY BLACK HEART" #x2764)
+    ("ROTATED HEAVY BLACK HEART BULLET" #x2765)
+    ("FLORAL HEART" #x2766)
+    ("ROTATED FLORAL HEART BULLET" #x2767)
+    ("MEDIUM LEFT PARENTHESIS ORNAMENT" #x2768)
+    ("MEDIUM RIGHT PARENTHESIS ORNAMENT" #x2769)
+    ("MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT" #x276A)
+    ("MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT" #x276B)
+    ("MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT" #x276C)
+    ("MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT" #x276D)
+    ("HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT" #x276E)
+    ("HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT" #x276F)
+    ("HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT" #x2770)
+    ("HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT" #x2771)
+    ("LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT" #x2772)
+    ("LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT" #x2773)
+    ("MEDIUM LEFT CURLY BRACKET ORNAMENT" #x2774)
+    ("MEDIUM RIGHT CURLY BRACKET ORNAMENT" #x2775)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT ONE" #x2776)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT TWO" #x2777)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT THREE" #x2778)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT FOUR" #x2779)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT FIVE" #x277A)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT SIX" #x277B)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT SEVEN" #x277C)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT EIGHT" #x277D)
+    ("DINGBAT NEGATIVE CIRCLED DIGIT NINE" #x277E)
+    ("DINGBAT NEGATIVE CIRCLED NUMBER TEN" #x277F)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT ONE" #x2780)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT TWO" #x2781)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT THREE" #x2782)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT FOUR" #x2783)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT FIVE" #x2784)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT SIX" #x2785)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN" #x2786)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT" #x2787)
+    ("DINGBAT CIRCLED SANS-SERIF DIGIT NINE" #x2788)
+    ("DINGBAT CIRCLED SANS-SERIF NUMBER TEN" #x2789)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE" #x278A)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO" #x278B)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE" #x278C)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR" #x278D)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE" #x278E)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX" #x278F)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN" #x2790)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT" #x2791)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE" #x2792)
+    ("DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN" #x2793)
+    ("HEAVY WIDE-HEADED RIGHTWARDS ARROW" #x2794)
+    ("HEAVY SOUTH EAST ARROW" #x2798)
+    ("HEAVY RIGHTWARDS ARROW" #x2799)
+    ("HEAVY NORTH EAST ARROW" #x279A)
+    ("DRAFTING POINT RIGHTWARDS ARROW" #x279B)
+    ("HEAVY ROUND-TIPPED RIGHTWARDS ARROW" #x279C)
+    ("TRIANGLE-HEADED RIGHTWARDS ARROW" #x279D)
+    ("HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW" #x279E)
+    ("DASHED TRIANGLE-HEADED RIGHTWARDS ARROW" #x279F)
+    ("HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW" #x27A0)
+    ("BLACK RIGHTWARDS ARROW" #x27A1)
+    ("THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD" #x27A2)
+    ("THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD" #x27A3)
+    ("BLACK RIGHTWARDS ARROWHEAD" #x27A4)
+    ("HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW" #x27A5)
+    ("HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW" #x27A6)
+    ("SQUAT BLACK RIGHTWARDS ARROW" #x27A7)
+    ("HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW" #x27A8)
+    ("RIGHT-SHADED WHITE RIGHTWARDS ARROW" #x27A9)
+    ("LEFT-SHADED WHITE RIGHTWARDS ARROW" #x27AA)
+    ("BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW" #x27AB)
+    ("FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW" #x27AC)
+    ("HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27AD)
+    ("HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27AE)
+    ("NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27AF)
+    ("NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW" #x27B1)
+    ("CIRCLED HEAVY WHITE RIGHTWARDS ARROW" #x27B2)
+    ("WHITE-FEATHERED RIGHTWARDS ARROW" #x27B3)
+    ("BLACK-FEATHERED SOUTH EAST ARROW" #x27B4)
+    ("BLACK-FEATHERED RIGHTWARDS ARROW" #x27B5)
+    ("BLACK-FEATHERED NORTH EAST ARROW" #x27B6)
+    ("HEAVY BLACK-FEATHERED SOUTH EAST ARROW" #x27B7)
+    ("HEAVY BLACK-FEATHERED RIGHTWARDS ARROW" #x27B8)
+    ("HEAVY BLACK-FEATHERED NORTH EAST ARROW" #x27B9)
+    ("TEARDROP-BARBED RIGHTWARDS ARROW" #x27BA)
+    ("HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW" #x27BB)
+    ("WEDGE-TAILED RIGHTWARDS ARROW" #x27BC)
+    ("HEAVY WEDGE-TAILED RIGHTWARDS ARROW" #x27BD)
+    ("OPEN-OUTLINED RIGHTWARDS ARROW" #x27BE)
+    ))
+
+;; arch-tag: 183adc05-e931-4f1b-8a89-abd760a8fcd5
diff --git a/etc/nxml/027C0-027EF.el b/etc/nxml/027C0-027EF.el
new file mode 100644 (file)
index 0000000..e017157
--- /dev/null
@@ -0,0 +1,32 @@
+(nxml-define-char-name-set 'miscellaneous-mathematical-symbols-a
+  '(("WHITE DIAMOND WITH CENTRED DOT" #x27D0)
+    ("AND WITH DOT" #x27D1)
+    ("ELEMENT OF OPENING UPWARDS" #x27D2)
+    ("LOWER RIGHT CORNER WITH DOT" #x27D3)
+    ("UPPER LEFT CORNER WITH DOT" #x27D4)
+    ("LEFT OUTER JOIN" #x27D5)
+    ("RIGHT OUTER JOIN" #x27D6)
+    ("FULL OUTER JOIN" #x27D7)
+    ("LARGE UP TACK" #x27D8)
+    ("LARGE DOWN TACK" #x27D9)
+    ("LEFT AND RIGHT DOUBLE TURNSTILE" #x27DA)
+    ("LEFT AND RIGHT TACK" #x27DB)
+    ("LEFT MULTIMAP" #x27DC)
+    ("LONG RIGHT TACK" #x27DD)
+    ("LONG LEFT TACK" #x27DE)
+    ("UP TACK WITH CIRCLE ABOVE" #x27DF)
+    ("LOZENGE DIVIDED BY HORIZONTAL RULE" #x27E0)
+    ("WHITE CONCAVE-SIDED DIAMOND" #x27E1)
+    ("WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK" #x27E2)
+    ("WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK" #x27E3)
+    ("WHITE SQUARE WITH LEFTWARDS TICK" #x27E4)
+    ("WHITE SQUARE WITH RIGHTWARDS TICK" #x27E5)
+    ("MATHEMATICAL LEFT WHITE SQUARE BRACKET" #x27E6)
+    ("MATHEMATICAL RIGHT WHITE SQUARE BRACKET" #x27E7)
+    ("MATHEMATICAL LEFT ANGLE BRACKET" #x27E8)
+    ("MATHEMATICAL RIGHT ANGLE BRACKET" #x27E9)
+    ("MATHEMATICAL LEFT DOUBLE ANGLE BRACKET" #x27EA)
+    ("MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET" #x27EB)
+    ))
+
+;; arch-tag: f66b9857-6560-4ad9-9adb-1f3b5fb079de
diff --git a/etc/nxml/027F0-027FF.el b/etc/nxml/027F0-027FF.el
new file mode 100644 (file)
index 0000000..5da2bc2
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'supplemental-arrows-a
+  '(("UPWARDS QUADRUPLE ARROW" #x27F0)
+    ("DOWNWARDS QUADRUPLE ARROW" #x27F1)
+    ("ANTICLOCKWISE GAPPED CIRCLE ARROW" #x27F2)
+    ("CLOCKWISE GAPPED CIRCLE ARROW" #x27F3)
+    ("RIGHT ARROW WITH CIRCLED PLUS" #x27F4)
+    ("LONG LEFTWARDS ARROW" #x27F5)
+    ("LONG RIGHTWARDS ARROW" #x27F6)
+    ("LONG LEFT RIGHT ARROW" #x27F7)
+    ("LONG LEFTWARDS DOUBLE ARROW" #x27F8)
+    ("LONG RIGHTWARDS DOUBLE ARROW" #x27F9)
+    ("LONG LEFT RIGHT DOUBLE ARROW" #x27FA)
+    ("LONG LEFTWARDS ARROW FROM BAR" #x27FB)
+    ("LONG RIGHTWARDS ARROW FROM BAR" #x27FC)
+    ("LONG LEFTWARDS DOUBLE ARROW FROM BAR" #x27FD)
+    ("LONG RIGHTWARDS DOUBLE ARROW FROM BAR" #x27FE)
+    ("LONG RIGHTWARDS SQUIGGLE ARROW" #x27FF)
+    ))
+
+;; arch-tag: 64623112-13d2-4bd6-8768-5508e3a7f8a9
diff --git a/etc/nxml/02800-028FF.el b/etc/nxml/02800-028FF.el
new file mode 100644 (file)
index 0000000..d936481
--- /dev/null
@@ -0,0 +1,260 @@
+(nxml-define-char-name-set 'braille-patterns
+  '(("BRAILLE PATTERN BLANK" #x2800)
+    ("BRAILLE PATTERN DOTS-1" #x2801)
+    ("BRAILLE PATTERN DOTS-2" #x2802)
+    ("BRAILLE PATTERN DOTS-12" #x2803)
+    ("BRAILLE PATTERN DOTS-3" #x2804)
+    ("BRAILLE PATTERN DOTS-13" #x2805)
+    ("BRAILLE PATTERN DOTS-23" #x2806)
+    ("BRAILLE PATTERN DOTS-123" #x2807)
+    ("BRAILLE PATTERN DOTS-4" #x2808)
+    ("BRAILLE PATTERN DOTS-14" #x2809)
+    ("BRAILLE PATTERN DOTS-24" #x280A)
+    ("BRAILLE PATTERN DOTS-124" #x280B)
+    ("BRAILLE PATTERN DOTS-34" #x280C)
+    ("BRAILLE PATTERN DOTS-134" #x280D)
+    ("BRAILLE PATTERN DOTS-234" #x280E)
+    ("BRAILLE PATTERN DOTS-1234" #x280F)
+    ("BRAILLE PATTERN DOTS-5" #x2810)
+    ("BRAILLE PATTERN DOTS-15" #x2811)
+    ("BRAILLE PATTERN DOTS-25" #x2812)
+    ("BRAILLE PATTERN DOTS-125" #x2813)
+    ("BRAILLE PATTERN DOTS-35" #x2814)
+    ("BRAILLE PATTERN DOTS-135" #x2815)
+    ("BRAILLE PATTERN DOTS-235" #x2816)
+    ("BRAILLE PATTERN DOTS-1235" #x2817)
+    ("BRAILLE PATTERN DOTS-45" #x2818)
+    ("BRAILLE PATTERN DOTS-145" #x2819)
+    ("BRAILLE PATTERN DOTS-245" #x281A)
+    ("BRAILLE PATTERN DOTS-1245" #x281B)
+    ("BRAILLE PATTERN DOTS-345" #x281C)
+    ("BRAILLE PATTERN DOTS-1345" #x281D)
+    ("BRAILLE PATTERN DOTS-2345" #x281E)
+    ("BRAILLE PATTERN DOTS-12345" #x281F)
+    ("BRAILLE PATTERN DOTS-6" #x2820)
+    ("BRAILLE PATTERN DOTS-16" #x2821)
+    ("BRAILLE PATTERN DOTS-26" #x2822)
+    ("BRAILLE PATTERN DOTS-126" #x2823)
+    ("BRAILLE PATTERN DOTS-36" #x2824)
+    ("BRAILLE PATTERN DOTS-136" #x2825)
+    ("BRAILLE PATTERN DOTS-236" #x2826)
+    ("BRAILLE PATTERN DOTS-1236" #x2827)
+    ("BRAILLE PATTERN DOTS-46" #x2828)
+    ("BRAILLE PATTERN DOTS-146" #x2829)
+    ("BRAILLE PATTERN DOTS-246" #x282A)
+    ("BRAILLE PATTERN DOTS-1246" #x282B)
+    ("BRAILLE PATTERN DOTS-346" #x282C)
+    ("BRAILLE PATTERN DOTS-1346" #x282D)
+    ("BRAILLE PATTERN DOTS-2346" #x282E)
+    ("BRAILLE PATTERN DOTS-12346" #x282F)
+    ("BRAILLE PATTERN DOTS-56" #x2830)
+    ("BRAILLE PATTERN DOTS-156" #x2831)
+    ("BRAILLE PATTERN DOTS-256" #x2832)
+    ("BRAILLE PATTERN DOTS-1256" #x2833)
+    ("BRAILLE PATTERN DOTS-356" #x2834)
+    ("BRAILLE PATTERN DOTS-1356" #x2835)
+    ("BRAILLE PATTERN DOTS-2356" #x2836)
+    ("BRAILLE PATTERN DOTS-12356" #x2837)
+    ("BRAILLE PATTERN DOTS-456" #x2838)
+    ("BRAILLE PATTERN DOTS-1456" #x2839)
+    ("BRAILLE PATTERN DOTS-2456" #x283A)
+    ("BRAILLE PATTERN DOTS-12456" #x283B)
+    ("BRAILLE PATTERN DOTS-3456" #x283C)
+    ("BRAILLE PATTERN DOTS-13456" #x283D)
+    ("BRAILLE PATTERN DOTS-23456" #x283E)
+    ("BRAILLE PATTERN DOTS-123456" #x283F)
+    ("BRAILLE PATTERN DOTS-7" #x2840)
+    ("BRAILLE PATTERN DOTS-17" #x2841)
+    ("BRAILLE PATTERN DOTS-27" #x2842)
+    ("BRAILLE PATTERN DOTS-127" #x2843)
+    ("BRAILLE PATTERN DOTS-37" #x2844)
+    ("BRAILLE PATTERN DOTS-137" #x2845)
+    ("BRAILLE PATTERN DOTS-237" #x2846)
+    ("BRAILLE PATTERN DOTS-1237" #x2847)
+    ("BRAILLE PATTERN DOTS-47" #x2848)
+    ("BRAILLE PATTERN DOTS-147" #x2849)
+    ("BRAILLE PATTERN DOTS-247" #x284A)
+    ("BRAILLE PATTERN DOTS-1247" #x284B)
+    ("BRAILLE PATTERN DOTS-347" #x284C)
+    ("BRAILLE PATTERN DOTS-1347" #x284D)
+    ("BRAILLE PATTERN DOTS-2347" #x284E)
+    ("BRAILLE PATTERN DOTS-12347" #x284F)
+    ("BRAILLE PATTERN DOTS-57" #x2850)
+    ("BRAILLE PATTERN DOTS-157" #x2851)
+    ("BRAILLE PATTERN DOTS-257" #x2852)
+    ("BRAILLE PATTERN DOTS-1257" #x2853)
+    ("BRAILLE PATTERN DOTS-357" #x2854)
+    ("BRAILLE PATTERN DOTS-1357" #x2855)
+    ("BRAILLE PATTERN DOTS-2357" #x2856)
+    ("BRAILLE PATTERN DOTS-12357" #x2857)
+    ("BRAILLE PATTERN DOTS-457" #x2858)
+    ("BRAILLE PATTERN DOTS-1457" #x2859)
+    ("BRAILLE PATTERN DOTS-2457" #x285A)
+    ("BRAILLE PATTERN DOTS-12457" #x285B)
+    ("BRAILLE PATTERN DOTS-3457" #x285C)
+    ("BRAILLE PATTERN DOTS-13457" #x285D)
+    ("BRAILLE PATTERN DOTS-23457" #x285E)
+    ("BRAILLE PATTERN DOTS-123457" #x285F)
+    ("BRAILLE PATTERN DOTS-67" #x2860)
+    ("BRAILLE PATTERN DOTS-167" #x2861)
+    ("BRAILLE PATTERN DOTS-267" #x2862)
+    ("BRAILLE PATTERN DOTS-1267" #x2863)
+    ("BRAILLE PATTERN DOTS-367" #x2864)
+    ("BRAILLE PATTERN DOTS-1367" #x2865)
+    ("BRAILLE PATTERN DOTS-2367" #x2866)
+    ("BRAILLE PATTERN DOTS-12367" #x2867)
+    ("BRAILLE PATTERN DOTS-467" #x2868)
+    ("BRAILLE PATTERN DOTS-1467" #x2869)
+    ("BRAILLE PATTERN DOTS-2467" #x286A)
+    ("BRAILLE PATTERN DOTS-12467" #x286B)
+    ("BRAILLE PATTERN DOTS-3467" #x286C)
+    ("BRAILLE PATTERN DOTS-13467" #x286D)
+    ("BRAILLE PATTERN DOTS-23467" #x286E)
+    ("BRAILLE PATTERN DOTS-123467" #x286F)
+    ("BRAILLE PATTERN DOTS-567" #x2870)
+    ("BRAILLE PATTERN DOTS-1567" #x2871)
+    ("BRAILLE PATTERN DOTS-2567" #x2872)
+    ("BRAILLE PATTERN DOTS-12567" #x2873)
+    ("BRAILLE PATTERN DOTS-3567" #x2874)
+    ("BRAILLE PATTERN DOTS-13567" #x2875)
+    ("BRAILLE PATTERN DOTS-23567" #x2876)
+    ("BRAILLE PATTERN DOTS-123567" #x2877)
+    ("BRAILLE PATTERN DOTS-4567" #x2878)
+    ("BRAILLE PATTERN DOTS-14567" #x2879)
+    ("BRAILLE PATTERN DOTS-24567" #x287A)
+    ("BRAILLE PATTERN DOTS-124567" #x287B)
+    ("BRAILLE PATTERN DOTS-34567" #x287C)
+    ("BRAILLE PATTERN DOTS-134567" #x287D)
+    ("BRAILLE PATTERN DOTS-234567" #x287E)
+    ("BRAILLE PATTERN DOTS-1234567" #x287F)
+    ("BRAILLE PATTERN DOTS-8" #x2880)
+    ("BRAILLE PATTERN DOTS-18" #x2881)
+    ("BRAILLE PATTERN DOTS-28" #x2882)
+    ("BRAILLE PATTERN DOTS-128" #x2883)
+    ("BRAILLE PATTERN DOTS-38" #x2884)
+    ("BRAILLE PATTERN DOTS-138" #x2885)
+    ("BRAILLE PATTERN DOTS-238" #x2886)
+    ("BRAILLE PATTERN DOTS-1238" #x2887)
+    ("BRAILLE PATTERN DOTS-48" #x2888)
+    ("BRAILLE PATTERN DOTS-148" #x2889)
+    ("BRAILLE PATTERN DOTS-248" #x288A)
+    ("BRAILLE PATTERN DOTS-1248" #x288B)
+    ("BRAILLE PATTERN DOTS-348" #x288C)
+    ("BRAILLE PATTERN DOTS-1348" #x288D)
+    ("BRAILLE PATTERN DOTS-2348" #x288E)
+    ("BRAILLE PATTERN DOTS-12348" #x288F)
+    ("BRAILLE PATTERN DOTS-58" #x2890)
+    ("BRAILLE PATTERN DOTS-158" #x2891)
+    ("BRAILLE PATTERN DOTS-258" #x2892)
+    ("BRAILLE PATTERN DOTS-1258" #x2893)
+    ("BRAILLE PATTERN DOTS-358" #x2894)
+    ("BRAILLE PATTERN DOTS-1358" #x2895)
+    ("BRAILLE PATTERN DOTS-2358" #x2896)
+    ("BRAILLE PATTERN DOTS-12358" #x2897)
+    ("BRAILLE PATTERN DOTS-458" #x2898)
+    ("BRAILLE PATTERN DOTS-1458" #x2899)
+    ("BRAILLE PATTERN DOTS-2458" #x289A)
+    ("BRAILLE PATTERN DOTS-12458" #x289B)
+    ("BRAILLE PATTERN DOTS-3458" #x289C)
+    ("BRAILLE PATTERN DOTS-13458" #x289D)
+    ("BRAILLE PATTERN DOTS-23458" #x289E)
+    ("BRAILLE PATTERN DOTS-123458" #x289F)
+    ("BRAILLE PATTERN DOTS-68" #x28A0)
+    ("BRAILLE PATTERN DOTS-168" #x28A1)
+    ("BRAILLE PATTERN DOTS-268" #x28A2)
+    ("BRAILLE PATTERN DOTS-1268" #x28A3)
+    ("BRAILLE PATTERN DOTS-368" #x28A4)
+    ("BRAILLE PATTERN DOTS-1368" #x28A5)
+    ("BRAILLE PATTERN DOTS-2368" #x28A6)
+    ("BRAILLE PATTERN DOTS-12368" #x28A7)
+    ("BRAILLE PATTERN DOTS-468" #x28A8)
+    ("BRAILLE PATTERN DOTS-1468" #x28A9)
+    ("BRAILLE PATTERN DOTS-2468" #x28AA)
+    ("BRAILLE PATTERN DOTS-12468" #x28AB)
+    ("BRAILLE PATTERN DOTS-3468" #x28AC)
+    ("BRAILLE PATTERN DOTS-13468" #x28AD)
+    ("BRAILLE PATTERN DOTS-23468" #x28AE)
+    ("BRAILLE PATTERN DOTS-123468" #x28AF)
+    ("BRAILLE PATTERN DOTS-568" #x28B0)
+    ("BRAILLE PATTERN DOTS-1568" #x28B1)
+    ("BRAILLE PATTERN DOTS-2568" #x28B2)
+    ("BRAILLE PATTERN DOTS-12568" #x28B3)
+    ("BRAILLE PATTERN DOTS-3568" #x28B4)
+    ("BRAILLE PATTERN DOTS-13568" #x28B5)
+    ("BRAILLE PATTERN DOTS-23568" #x28B6)
+    ("BRAILLE PATTERN DOTS-123568" #x28B7)
+    ("BRAILLE PATTERN DOTS-4568" #x28B8)
+    ("BRAILLE PATTERN DOTS-14568" #x28B9)
+    ("BRAILLE PATTERN DOTS-24568" #x28BA)
+    ("BRAILLE PATTERN DOTS-124568" #x28BB)
+    ("BRAILLE PATTERN DOTS-34568" #x28BC)
+    ("BRAILLE PATTERN DOTS-134568" #x28BD)
+    ("BRAILLE PATTERN DOTS-234568" #x28BE)
+    ("BRAILLE PATTERN DOTS-1234568" #x28BF)
+    ("BRAILLE PATTERN DOTS-78" #x28C0)
+    ("BRAILLE PATTERN DOTS-178" #x28C1)
+    ("BRAILLE PATTERN DOTS-278" #x28C2)
+    ("BRAILLE PATTERN DOTS-1278" #x28C3)
+    ("BRAILLE PATTERN DOTS-378" #x28C4)
+    ("BRAILLE PATTERN DOTS-1378" #x28C5)
+    ("BRAILLE PATTERN DOTS-2378" #x28C6)
+    ("BRAILLE PATTERN DOTS-12378" #x28C7)
+    ("BRAILLE PATTERN DOTS-478" #x28C8)
+    ("BRAILLE PATTERN DOTS-1478" #x28C9)
+    ("BRAILLE PATTERN DOTS-2478" #x28CA)
+    ("BRAILLE PATTERN DOTS-12478" #x28CB)
+    ("BRAILLE PATTERN DOTS-3478" #x28CC)
+    ("BRAILLE PATTERN DOTS-13478" #x28CD)
+    ("BRAILLE PATTERN DOTS-23478" #x28CE)
+    ("BRAILLE PATTERN DOTS-123478" #x28CF)
+    ("BRAILLE PATTERN DOTS-578" #x28D0)
+    ("BRAILLE PATTERN DOTS-1578" #x28D1)
+    ("BRAILLE PATTERN DOTS-2578" #x28D2)
+    ("BRAILLE PATTERN DOTS-12578" #x28D3)
+    ("BRAILLE PATTERN DOTS-3578" #x28D4)
+    ("BRAILLE PATTERN DOTS-13578" #x28D5)
+    ("BRAILLE PATTERN DOTS-23578" #x28D6)
+    ("BRAILLE PATTERN DOTS-123578" #x28D7)
+    ("BRAILLE PATTERN DOTS-4578" #x28D8)
+    ("BRAILLE PATTERN DOTS-14578" #x28D9)
+    ("BRAILLE PATTERN DOTS-24578" #x28DA)
+    ("BRAILLE PATTERN DOTS-124578" #x28DB)
+    ("BRAILLE PATTERN DOTS-34578" #x28DC)
+    ("BRAILLE PATTERN DOTS-134578" #x28DD)
+    ("BRAILLE PATTERN DOTS-234578" #x28DE)
+    ("BRAILLE PATTERN DOTS-1234578" #x28DF)
+    ("BRAILLE PATTERN DOTS-678" #x28E0)
+    ("BRAILLE PATTERN DOTS-1678" #x28E1)
+    ("BRAILLE PATTERN DOTS-2678" #x28E2)
+    ("BRAILLE PATTERN DOTS-12678" #x28E3)
+    ("BRAILLE PATTERN DOTS-3678" #x28E4)
+    ("BRAILLE PATTERN DOTS-13678" #x28E5)
+    ("BRAILLE PATTERN DOTS-23678" #x28E6)
+    ("BRAILLE PATTERN DOTS-123678" #x28E7)
+    ("BRAILLE PATTERN DOTS-4678" #x28E8)
+    ("BRAILLE PATTERN DOTS-14678" #x28E9)
+    ("BRAILLE PATTERN DOTS-24678" #x28EA)
+    ("BRAILLE PATTERN DOTS-124678" #x28EB)
+    ("BRAILLE PATTERN DOTS-34678" #x28EC)
+    ("BRAILLE PATTERN DOTS-134678" #x28ED)
+    ("BRAILLE PATTERN DOTS-234678" #x28EE)
+    ("BRAILLE PATTERN DOTS-1234678" #x28EF)
+    ("BRAILLE PATTERN DOTS-5678" #x28F0)
+    ("BRAILLE PATTERN DOTS-15678" #x28F1)
+    ("BRAILLE PATTERN DOTS-25678" #x28F2)
+    ("BRAILLE PATTERN DOTS-125678" #x28F3)
+    ("BRAILLE PATTERN DOTS-35678" #x28F4)
+    ("BRAILLE PATTERN DOTS-135678" #x28F5)
+    ("BRAILLE PATTERN DOTS-235678" #x28F6)
+    ("BRAILLE PATTERN DOTS-1235678" #x28F7)
+    ("BRAILLE PATTERN DOTS-45678" #x28F8)
+    ("BRAILLE PATTERN DOTS-145678" #x28F9)
+    ("BRAILLE PATTERN DOTS-245678" #x28FA)
+    ("BRAILLE PATTERN DOTS-1245678" #x28FB)
+    ("BRAILLE PATTERN DOTS-345678" #x28FC)
+    ("BRAILLE PATTERN DOTS-1345678" #x28FD)
+    ("BRAILLE PATTERN DOTS-2345678" #x28FE)
+    ("BRAILLE PATTERN DOTS-12345678" #x28FF)
+    ))
+
+;; arch-tag: 461f6d3c-a4fb-404c-a107-ec8afd212bd2
diff --git a/etc/nxml/02900-0297F.el b/etc/nxml/02900-0297F.el
new file mode 100644 (file)
index 0000000..d1c217b
--- /dev/null
@@ -0,0 +1,132 @@
+(nxml-define-char-name-set 'supplemental-arrows-b
+  '(("RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE" #x2900)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE" #x2901)
+    ("LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE" #x2902)
+    ("RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE" #x2903)
+    ("LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE" #x2904)
+    ("RIGHTWARDS TWO-HEADED ARROW FROM BAR" #x2905)
+    ("LEFTWARDS DOUBLE ARROW FROM BAR" #x2906)
+    ("RIGHTWARDS DOUBLE ARROW FROM BAR" #x2907)
+    ("DOWNWARDS ARROW WITH HORIZONTAL STROKE" #x2908)
+    ("UPWARDS ARROW WITH HORIZONTAL STROKE" #x2909)
+    ("UPWARDS TRIPLE ARROW" #x290A)
+    ("DOWNWARDS TRIPLE ARROW" #x290B)
+    ("LEFTWARDS DOUBLE DASH ARROW" #x290C)
+    ("RIGHTWARDS DOUBLE DASH ARROW" #x290D)
+    ("LEFTWARDS TRIPLE DASH ARROW" #x290E)
+    ("RIGHTWARDS TRIPLE DASH ARROW" #x290F)
+    ("RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW" #x2910)
+    ("RIGHTWARDS ARROW WITH DOTTED STEM" #x2911)
+    ("UPWARDS ARROW TO BAR" #x2912)
+    ("DOWNWARDS ARROW TO BAR" #x2913)
+    ("RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE" #x2914)
+    ("RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE" #x2915)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH TAIL" #x2916)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE" #x2917)
+    ("RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE" #x2918)
+    ("LEFTWARDS ARROW-TAIL" #x2919)
+    ("RIGHTWARDS ARROW-TAIL" #x291A)
+    ("LEFTWARDS DOUBLE ARROW-TAIL" #x291B)
+    ("RIGHTWARDS DOUBLE ARROW-TAIL" #x291C)
+    ("LEFTWARDS ARROW TO BLACK DIAMOND" #x291D)
+    ("RIGHTWARDS ARROW TO BLACK DIAMOND" #x291E)
+    ("LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND" #x291F)
+    ("RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND" #x2920)
+    ("NORTH WEST AND SOUTH EAST ARROW" #x2921)
+    ("NORTH EAST AND SOUTH WEST ARROW" #x2922)
+    ("NORTH WEST ARROW WITH HOOK" #x2923)
+    ("NORTH EAST ARROW WITH HOOK" #x2924)
+    ("SOUTH EAST ARROW WITH HOOK" #x2925)
+    ("SOUTH WEST ARROW WITH HOOK" #x2926)
+    ("NORTH WEST ARROW AND NORTH EAST ARROW" #x2927)
+    ("NORTH EAST ARROW AND SOUTH EAST ARROW" #x2928)
+    ("SOUTH EAST ARROW AND SOUTH WEST ARROW" #x2929)
+    ("SOUTH WEST ARROW AND NORTH WEST ARROW" #x292A)
+    ("RISING DIAGONAL CROSSING FALLING DIAGONAL" #x292B)
+    ("FALLING DIAGONAL CROSSING RISING DIAGONAL" #x292C)
+    ("SOUTH EAST ARROW CROSSING NORTH EAST ARROW" #x292D)
+    ("NORTH EAST ARROW CROSSING SOUTH EAST ARROW" #x292E)
+    ("FALLING DIAGONAL CROSSING NORTH EAST ARROW" #x292F)
+    ("RISING DIAGONAL CROSSING SOUTH EAST ARROW" #x2930)
+    ("NORTH EAST ARROW CROSSING NORTH WEST ARROW" #x2931)
+    ("NORTH WEST ARROW CROSSING NORTH EAST ARROW" #x2932)
+    ("WAVE ARROW POINTING DIRECTLY RIGHT" #x2933)
+    ("ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS" #x2934)
+    ("ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS" #x2935)
+    ("ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS" #x2936)
+    ("ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS" #x2937)
+    ("RIGHT-SIDE ARC CLOCKWISE ARROW" #x2938)
+    ("LEFT-SIDE ARC ANTICLOCKWISE ARROW" #x2939)
+    ("TOP ARC ANTICLOCKWISE ARROW" #x293A)
+    ("BOTTOM ARC ANTICLOCKWISE ARROW" #x293B)
+    ("TOP ARC CLOCKWISE ARROW WITH MINUS" #x293C)
+    ("TOP ARC ANTICLOCKWISE ARROW WITH PLUS" #x293D)
+    ("LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW" #x293E)
+    ("LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW" #x293F)
+    ("ANTICLOCKWISE CLOSED CIRCLE ARROW" #x2940)
+    ("CLOCKWISE CLOSED CIRCLE ARROW" #x2941)
+    ("RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW" #x2942)
+    ("LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW" #x2943)
+    ("SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW" #x2944)
+    ("RIGHTWARDS ARROW WITH PLUS BELOW" #x2945)
+    ("LEFTWARDS ARROW WITH PLUS BELOW" #x2946)
+    ("RIGHTWARDS ARROW THROUGH X" #x2947)
+    ("LEFT RIGHT ARROW THROUGH SMALL CIRCLE" #x2948)
+    ("UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE" #x2949)
+    ("LEFT BARB UP RIGHT BARB DOWN HARPOON" #x294A)
+    ("LEFT BARB DOWN RIGHT BARB UP HARPOON" #x294B)
+    ("UP BARB RIGHT DOWN BARB LEFT HARPOON" #x294C)
+    ("UP BARB LEFT DOWN BARB RIGHT HARPOON" #x294D)
+    ("LEFT BARB UP RIGHT BARB UP HARPOON" #x294E)
+    ("UP BARB RIGHT DOWN BARB RIGHT HARPOON" #x294F)
+    ("LEFT BARB DOWN RIGHT BARB DOWN HARPOON" #x2950)
+    ("UP BARB LEFT DOWN BARB LEFT HARPOON" #x2951)
+    ("LEFTWARDS HARPOON WITH BARB UP TO BAR" #x2952)
+    ("RIGHTWARDS HARPOON WITH BARB UP TO BAR" #x2953)
+    ("UPWARDS HARPOON WITH BARB RIGHT TO BAR" #x2954)
+    ("DOWNWARDS HARPOON WITH BARB RIGHT TO BAR" #x2955)
+    ("LEFTWARDS HARPOON WITH BARB DOWN TO BAR" #x2956)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN TO BAR" #x2957)
+    ("UPWARDS HARPOON WITH BARB LEFT TO BAR" #x2958)
+    ("DOWNWARDS HARPOON WITH BARB LEFT TO BAR" #x2959)
+    ("LEFTWARDS HARPOON WITH BARB UP FROM BAR" #x295A)
+    ("RIGHTWARDS HARPOON WITH BARB UP FROM BAR" #x295B)
+    ("UPWARDS HARPOON WITH BARB RIGHT FROM BAR" #x295C)
+    ("DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR" #x295D)
+    ("LEFTWARDS HARPOON WITH BARB DOWN FROM BAR" #x295E)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR" #x295F)
+    ("UPWARDS HARPOON WITH BARB LEFT FROM BAR" #x2960)
+    ("DOWNWARDS HARPOON WITH BARB LEFT FROM BAR" #x2961)
+    ("LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN" #x2962)
+    ("UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT" #x2963)
+    ("RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN" #x2964)
+    ("DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT" #x2965)
+    ("LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP" #x2966)
+    ("LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN" #x2967)
+    ("RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP" #x2968)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN" #x2969)
+    ("LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH" #x296A)
+    ("LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH" #x296B)
+    ("RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH" #x296C)
+    ("RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH" #x296D)
+    ("UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT" #x296E)
+    ("DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT" #x296F)
+    ("RIGHT DOUBLE ARROW WITH ROUNDED HEAD" #x2970)
+    ("EQUALS SIGN ABOVE RIGHTWARDS ARROW" #x2971)
+    ("TILDE OPERATOR ABOVE RIGHTWARDS ARROW" #x2972)
+    ("LEFTWARDS ARROW ABOVE TILDE OPERATOR" #x2973)
+    ("RIGHTWARDS ARROW ABOVE TILDE OPERATOR" #x2974)
+    ("RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO" #x2975)
+    ("LESS-THAN ABOVE LEFTWARDS ARROW" #x2976)
+    ("LEFTWARDS ARROW THROUGH LESS-THAN" #x2977)
+    ("GREATER-THAN ABOVE RIGHTWARDS ARROW" #x2978)
+    ("SUBSET ABOVE RIGHTWARDS ARROW" #x2979)
+    ("LEFTWARDS ARROW THROUGH SUBSET" #x297A)
+    ("SUPERSET ABOVE LEFTWARDS ARROW" #x297B)
+    ("LEFT FISH TAIL" #x297C)
+    ("RIGHT FISH TAIL" #x297D)
+    ("UP FISH TAIL" #x297E)
+    ("DOWN FISH TAIL" #x297F)
+    ))
+
+;; arch-tag: 57fdeec3-1003-4f3e-ac93-1d698f6eacd8
diff --git a/etc/nxml/02980-029FF.el b/etc/nxml/02980-029FF.el
new file mode 100644 (file)
index 0000000..11197e3
--- /dev/null
@@ -0,0 +1,132 @@
+(nxml-define-char-name-set 'miscellaneous-mathematical-symbols-b
+  '(("TRIPLE VERTICAL BAR DELIMITER" #x2980)
+    ("Z NOTATION SPOT" #x2981)
+    ("Z NOTATION TYPE COLON" #x2982)
+    ("LEFT WHITE CURLY BRACKET" #x2983)
+    ("RIGHT WHITE CURLY BRACKET" #x2984)
+    ("LEFT WHITE PARENTHESIS" #x2985)
+    ("RIGHT WHITE PARENTHESIS" #x2986)
+    ("Z NOTATION LEFT IMAGE BRACKET" #x2987)
+    ("Z NOTATION RIGHT IMAGE BRACKET" #x2988)
+    ("Z NOTATION LEFT BINDING BRACKET" #x2989)
+    ("Z NOTATION RIGHT BINDING BRACKET" #x298A)
+    ("LEFT SQUARE BRACKET WITH UNDERBAR" #x298B)
+    ("RIGHT SQUARE BRACKET WITH UNDERBAR" #x298C)
+    ("LEFT SQUARE BRACKET WITH TICK IN TOP CORNER" #x298D)
+    ("RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER" #x298E)
+    ("LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER" #x298F)
+    ("RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER" #x2990)
+    ("LEFT ANGLE BRACKET WITH DOT" #x2991)
+    ("RIGHT ANGLE BRACKET WITH DOT" #x2992)
+    ("LEFT ARC LESS-THAN BRACKET" #x2993)
+    ("RIGHT ARC GREATER-THAN BRACKET" #x2994)
+    ("DOUBLE LEFT ARC GREATER-THAN BRACKET" #x2995)
+    ("DOUBLE RIGHT ARC LESS-THAN BRACKET" #x2996)
+    ("LEFT BLACK TORTOISE SHELL BRACKET" #x2997)
+    ("RIGHT BLACK TORTOISE SHELL BRACKET" #x2998)
+    ("DOTTED FENCE" #x2999)
+    ("VERTICAL ZIGZAG LINE" #x299A)
+    ("MEASURED ANGLE OPENING LEFT" #x299B)
+    ("RIGHT ANGLE VARIANT WITH SQUARE" #x299C)
+    ("MEASURED RIGHT ANGLE WITH DOT" #x299D)
+    ("ANGLE WITH S INSIDE" #x299E)
+    ("ACUTE ANGLE" #x299F)
+    ("SPHERICAL ANGLE OPENING LEFT" #x29A0)
+    ("SPHERICAL ANGLE OPENING UP" #x29A1)
+    ("TURNED ANGLE" #x29A2)
+    ("REVERSED ANGLE" #x29A3)
+    ("ANGLE WITH UNDERBAR" #x29A4)
+    ("REVERSED ANGLE WITH UNDERBAR" #x29A5)
+    ("OBLIQUE ANGLE OPENING UP" #x29A6)
+    ("OBLIQUE ANGLE OPENING DOWN" #x29A7)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT" #x29A8)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT" #x29A9)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT" #x29AA)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT" #x29AB)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP" #x29AC)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP" #x29AD)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN" #x29AE)
+    ("MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN" #x29AF)
+    ("REVERSED EMPTY SET" #x29B0)
+    ("EMPTY SET WITH OVERBAR" #x29B1)
+    ("EMPTY SET WITH SMALL CIRCLE ABOVE" #x29B2)
+    ("EMPTY SET WITH RIGHT ARROW ABOVE" #x29B3)
+    ("EMPTY SET WITH LEFT ARROW ABOVE" #x29B4)
+    ("CIRCLE WITH HORIZONTAL BAR" #x29B5)
+    ("CIRCLED VERTICAL BAR" #x29B6)
+    ("CIRCLED PARALLEL" #x29B7)
+    ("CIRCLED REVERSE SOLIDUS" #x29B8)
+    ("CIRCLED PERPENDICULAR" #x29B9)
+    ("CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR" #x29BA)
+    ("CIRCLE WITH SUPERIMPOSED X" #x29BB)
+    ("CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN" #x29BC)
+    ("UP ARROW THROUGH CIRCLE" #x29BD)
+    ("CIRCLED WHITE BULLET" #x29BE)
+    ("CIRCLED BULLET" #x29BF)
+    ("CIRCLED LESS-THAN" #x29C0)
+    ("CIRCLED GREATER-THAN" #x29C1)
+    ("CIRCLE WITH SMALL CIRCLE TO THE RIGHT" #x29C2)
+    ("CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT" #x29C3)
+    ("SQUARED RISING DIAGONAL SLASH" #x29C4)
+    ("SQUARED FALLING DIAGONAL SLASH" #x29C5)
+    ("SQUARED ASTERISK" #x29C6)
+    ("SQUARED SMALL CIRCLE" #x29C7)
+    ("SQUARED SQUARE" #x29C8)
+    ("TWO JOINED SQUARES" #x29C9)
+    ("TRIANGLE WITH DOT ABOVE" #x29CA)
+    ("TRIANGLE WITH UNDERBAR" #x29CB)
+    ("S IN TRIANGLE" #x29CC)
+    ("TRIANGLE WITH SERIFS AT BOTTOM" #x29CD)
+    ("RIGHT TRIANGLE ABOVE LEFT TRIANGLE" #x29CE)
+    ("LEFT TRIANGLE BESIDE VERTICAL BAR" #x29CF)
+    ("VERTICAL BAR BESIDE RIGHT TRIANGLE" #x29D0)
+    ("BOWTIE WITH LEFT HALF BLACK" #x29D1)
+    ("BOWTIE WITH RIGHT HALF BLACK" #x29D2)
+    ("BLACK BOWTIE" #x29D3)
+    ("TIMES WITH LEFT HALF BLACK" #x29D4)
+    ("TIMES WITH RIGHT HALF BLACK" #x29D5)
+    ("WHITE HOURGLASS" #x29D6)
+    ("BLACK HOURGLASS" #x29D7)
+    ("LEFT WIGGLY FENCE" #x29D8)
+    ("RIGHT WIGGLY FENCE" #x29D9)
+    ("LEFT DOUBLE WIGGLY FENCE" #x29DA)
+    ("RIGHT DOUBLE WIGGLY FENCE" #x29DB)
+    ("INCOMPLETE INFINITY" #x29DC)
+    ("TIE OVER INFINITY" #x29DD)
+    ("INFINITY NEGATED WITH VERTICAL BAR" #x29DE)
+    ("DOUBLE-ENDED MULTIMAP" #x29DF)
+    ("SQUARE WITH CONTOURED OUTLINE" #x29E0)
+    ("INCREASES AS" #x29E1)
+    ("SHUFFLE PRODUCT" #x29E2)
+    ("EQUALS SIGN AND SLANTED PARALLEL" #x29E3)
+    ("EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE" #x29E4)
+    ("IDENTICAL TO AND SLANTED PARALLEL" #x29E5)
+    ("GLEICH STARK" #x29E6)
+    ("THERMODYNAMIC" #x29E7)
+    ("DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK" #x29E8)
+    ("DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK" #x29E9)
+    ("BLACK DIAMOND WITH DOWN ARROW" #x29EA)
+    ("BLACK LOZENGE" #x29EB)
+    ("WHITE CIRCLE WITH DOWN ARROW" #x29EC)
+    ("BLACK CIRCLE WITH DOWN ARROW" #x29ED)
+    ("ERROR-BARRED WHITE SQUARE" #x29EE)
+    ("ERROR-BARRED BLACK SQUARE" #x29EF)
+    ("ERROR-BARRED WHITE DIAMOND" #x29F0)
+    ("ERROR-BARRED BLACK DIAMOND" #x29F1)
+    ("ERROR-BARRED WHITE CIRCLE" #x29F2)
+    ("ERROR-BARRED BLACK CIRCLE" #x29F3)
+    ("RULE-DELAYED" #x29F4)
+    ("REVERSE SOLIDUS OPERATOR" #x29F5)
+    ("SOLIDUS WITH OVERBAR" #x29F6)
+    ("REVERSE SOLIDUS WITH HORIZONTAL STROKE" #x29F7)
+    ("BIG SOLIDUS" #x29F8)
+    ("BIG REVERSE SOLIDUS" #x29F9)
+    ("DOUBLE PLUS" #x29FA)
+    ("TRIPLE PLUS" #x29FB)
+    ("LEFT-POINTING CURVED ANGLE BRACKET" #x29FC)
+    ("RIGHT-POINTING CURVED ANGLE BRACKET" #x29FD)
+    ("TINY" #x29FE)
+    ("MINY" #x29FF)
+    ))
+
+;; arch-tag: 4ae3dcff-8f56-4f7e-b9f3-07108e543969
diff --git a/etc/nxml/02A00-02AFF.el b/etc/nxml/02A00-02AFF.el
new file mode 100644 (file)
index 0000000..3cdaa5d
--- /dev/null
@@ -0,0 +1,260 @@
+(nxml-define-char-name-set 'supplemental-mathematical-operators
+  '(("N-ARY CIRCLED DOT OPERATOR" #x2A00)
+    ("N-ARY CIRCLED PLUS OPERATOR" #x2A01)
+    ("N-ARY CIRCLED TIMES OPERATOR" #x2A02)
+    ("N-ARY UNION OPERATOR WITH DOT" #x2A03)
+    ("N-ARY UNION OPERATOR WITH PLUS" #x2A04)
+    ("N-ARY SQUARE INTERSECTION OPERATOR" #x2A05)
+    ("N-ARY SQUARE UNION OPERATOR" #x2A06)
+    ("TWO LOGICAL AND OPERATOR" #x2A07)
+    ("TWO LOGICAL OR OPERATOR" #x2A08)
+    ("N-ARY TIMES OPERATOR" #x2A09)
+    ("MODULO TWO SUM" #x2A0A)
+    ("SUMMATION WITH INTEGRAL" #x2A0B)
+    ("QUADRUPLE INTEGRAL OPERATOR" #x2A0C)
+    ("FINITE PART INTEGRAL" #x2A0D)
+    ("INTEGRAL WITH DOUBLE STROKE" #x2A0E)
+    ("INTEGRAL AVERAGE WITH SLASH" #x2A0F)
+    ("CIRCULATION FUNCTION" #x2A10)
+    ("ANTICLOCKWISE INTEGRATION" #x2A11)
+    ("LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE" #x2A12)
+    ("LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE" #x2A13)
+    ("LINE INTEGRATION NOT INCLUDING THE POLE" #x2A14)
+    ("INTEGRAL AROUND A POINT OPERATOR" #x2A15)
+    ("QUATERNION INTEGRAL OPERATOR" #x2A16)
+    ("INTEGRAL WITH LEFTWARDS ARROW WITH HOOK" #x2A17)
+    ("INTEGRAL WITH TIMES SIGN" #x2A18)
+    ("INTEGRAL WITH INTERSECTION" #x2A19)
+    ("INTEGRAL WITH UNION" #x2A1A)
+    ("INTEGRAL WITH OVERBAR" #x2A1B)
+    ("INTEGRAL WITH UNDERBAR" #x2A1C)
+    ("JOIN" #x2A1D)
+    ("LARGE LEFT TRIANGLE OPERATOR" #x2A1E)
+    ("Z NOTATION SCHEMA COMPOSITION" #x2A1F)
+    ("Z NOTATION SCHEMA PIPING" #x2A20)
+    ("Z NOTATION SCHEMA PROJECTION" #x2A21)
+    ("PLUS SIGN WITH SMALL CIRCLE ABOVE" #x2A22)
+    ("PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE" #x2A23)
+    ("PLUS SIGN WITH TILDE ABOVE" #x2A24)
+    ("PLUS SIGN WITH DOT BELOW" #x2A25)
+    ("PLUS SIGN WITH TILDE BELOW" #x2A26)
+    ("PLUS SIGN WITH SUBSCRIPT TWO" #x2A27)
+    ("PLUS SIGN WITH BLACK TRIANGLE" #x2A28)
+    ("MINUS SIGN WITH COMMA ABOVE" #x2A29)
+    ("MINUS SIGN WITH DOT BELOW" #x2A2A)
+    ("MINUS SIGN WITH FALLING DOTS" #x2A2B)
+    ("MINUS SIGN WITH RISING DOTS" #x2A2C)
+    ("PLUS SIGN IN LEFT HALF CIRCLE" #x2A2D)
+    ("PLUS SIGN IN RIGHT HALF CIRCLE" #x2A2E)
+    ("VECTOR OR CROSS PRODUCT" #x2A2F)
+    ("MULTIPLICATION SIGN WITH DOT ABOVE" #x2A30)
+    ("MULTIPLICATION SIGN WITH UNDERBAR" #x2A31)
+    ("SEMIDIRECT PRODUCT WITH BOTTOM CLOSED" #x2A32)
+    ("SMASH PRODUCT" #x2A33)
+    ("MULTIPLICATION SIGN IN LEFT HALF CIRCLE" #x2A34)
+    ("MULTIPLICATION SIGN IN RIGHT HALF CIRCLE" #x2A35)
+    ("CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT" #x2A36)
+    ("MULTIPLICATION SIGN IN DOUBLE CIRCLE" #x2A37)
+    ("CIRCLED DIVISION SIGN" #x2A38)
+    ("PLUS SIGN IN TRIANGLE" #x2A39)
+    ("MINUS SIGN IN TRIANGLE" #x2A3A)
+    ("MULTIPLICATION SIGN IN TRIANGLE" #x2A3B)
+    ("INTERIOR PRODUCT" #x2A3C)
+    ("RIGHTHAND INTERIOR PRODUCT" #x2A3D)
+    ("Z NOTATION RELATIONAL COMPOSITION" #x2A3E)
+    ("AMALGAMATION OR COPRODUCT" #x2A3F)
+    ("INTERSECTION WITH DOT" #x2A40)
+    ("UNION WITH MINUS SIGN" #x2A41)
+    ("UNION WITH OVERBAR" #x2A42)
+    ("INTERSECTION WITH OVERBAR" #x2A43)
+    ("INTERSECTION WITH LOGICAL AND" #x2A44)
+    ("UNION WITH LOGICAL OR" #x2A45)
+    ("UNION ABOVE INTERSECTION" #x2A46)
+    ("INTERSECTION ABOVE UNION" #x2A47)
+    ("UNION ABOVE BAR ABOVE INTERSECTION" #x2A48)
+    ("INTERSECTION ABOVE BAR ABOVE UNION" #x2A49)
+    ("UNION BESIDE AND JOINED WITH UNION" #x2A4A)
+    ("INTERSECTION BESIDE AND JOINED WITH INTERSECTION" #x2A4B)
+    ("CLOSED UNION WITH SERIFS" #x2A4C)
+    ("CLOSED INTERSECTION WITH SERIFS" #x2A4D)
+    ("DOUBLE SQUARE INTERSECTION" #x2A4E)
+    ("DOUBLE SQUARE UNION" #x2A4F)
+    ("CLOSED UNION WITH SERIFS AND SMASH PRODUCT" #x2A50)
+    ("LOGICAL AND WITH DOT ABOVE" #x2A51)
+    ("LOGICAL OR WITH DOT ABOVE" #x2A52)
+    ("DOUBLE LOGICAL AND" #x2A53)
+    ("DOUBLE LOGICAL OR" #x2A54)
+    ("TWO INTERSECTING LOGICAL AND" #x2A55)
+    ("TWO INTERSECTING LOGICAL OR" #x2A56)
+    ("SLOPING LARGE OR" #x2A57)
+    ("SLOPING LARGE AND" #x2A58)
+    ("LOGICAL OR OVERLAPPING LOGICAL AND" #x2A59)
+    ("LOGICAL AND WITH MIDDLE STEM" #x2A5A)
+    ("LOGICAL OR WITH MIDDLE STEM" #x2A5B)
+    ("LOGICAL AND WITH HORIZONTAL DASH" #x2A5C)
+    ("LOGICAL OR WITH HORIZONTAL DASH" #x2A5D)
+    ("LOGICAL AND WITH DOUBLE OVERBAR" #x2A5E)
+    ("LOGICAL AND WITH UNDERBAR" #x2A5F)
+    ("LOGICAL AND WITH DOUBLE UNDERBAR" #x2A60)
+    ("SMALL VEE WITH UNDERBAR" #x2A61)
+    ("LOGICAL OR WITH DOUBLE OVERBAR" #x2A62)
+    ("LOGICAL OR WITH DOUBLE UNDERBAR" #x2A63)
+    ("Z NOTATION DOMAIN ANTIRESTRICTION" #x2A64)
+    ("Z NOTATION RANGE ANTIRESTRICTION" #x2A65)
+    ("EQUALS SIGN WITH DOT BELOW" #x2A66)
+    ("IDENTICAL WITH DOT ABOVE" #x2A67)
+    ("TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE" #x2A68)
+    ("TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE" #x2A69)
+    ("TILDE OPERATOR WITH DOT ABOVE" #x2A6A)
+    ("TILDE OPERATOR WITH RISING DOTS" #x2A6B)
+    ("SIMILAR MINUS SIMILAR" #x2A6C)
+    ("CONGRUENT WITH DOT ABOVE" #x2A6D)
+    ("EQUALS WITH ASTERISK" #x2A6E)
+    ("ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT" #x2A6F)
+    ("APPROXIMATELY EQUAL OR EQUAL TO" #x2A70)
+    ("EQUALS SIGN ABOVE PLUS SIGN" #x2A71)
+    ("PLUS SIGN ABOVE EQUALS SIGN" #x2A72)
+    ("EQUALS SIGN ABOVE TILDE OPERATOR" #x2A73)
+    ("DOUBLE COLON EQUAL" #x2A74)
+    ("TWO CONSECUTIVE EQUALS SIGNS" #x2A75)
+    ("THREE CONSECUTIVE EQUALS SIGNS" #x2A76)
+    ("EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW" #x2A77)
+    ("EQUIVALENT WITH FOUR DOTS ABOVE" #x2A78)
+    ("LESS-THAN WITH CIRCLE INSIDE" #x2A79)
+    ("GREATER-THAN WITH CIRCLE INSIDE" #x2A7A)
+    ("LESS-THAN WITH QUESTION MARK ABOVE" #x2A7B)
+    ("GREATER-THAN WITH QUESTION MARK ABOVE" #x2A7C)
+    ("LESS-THAN OR SLANTED EQUAL TO" #x2A7D)
+    ("GREATER-THAN OR SLANTED EQUAL TO" #x2A7E)
+    ("LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE" #x2A7F)
+    ("GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE" #x2A80)
+    ("LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE" #x2A81)
+    ("GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE" #x2A82)
+    ("LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT" #x2A83)
+    ("GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT" #x2A84)
+    ("LESS-THAN OR APPROXIMATE" #x2A85)
+    ("GREATER-THAN OR APPROXIMATE" #x2A86)
+    ("LESS-THAN AND SINGLE-LINE NOT EQUAL TO" #x2A87)
+    ("GREATER-THAN AND SINGLE-LINE NOT EQUAL TO" #x2A88)
+    ("LESS-THAN AND NOT APPROXIMATE" #x2A89)
+    ("GREATER-THAN AND NOT APPROXIMATE" #x2A8A)
+    ("LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN" #x2A8B)
+    ("GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN" #x2A8C)
+    ("LESS-THAN ABOVE SIMILAR OR EQUAL" #x2A8D)
+    ("GREATER-THAN ABOVE SIMILAR OR EQUAL" #x2A8E)
+    ("LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN" #x2A8F)
+    ("GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN" #x2A90)
+    ("LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL" #x2A91)
+    ("GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL" #x2A92)
+    ("LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL" #x2A93)
+    ("GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL" #x2A94)
+    ("SLANTED EQUAL TO OR LESS-THAN" #x2A95)
+    ("SLANTED EQUAL TO OR GREATER-THAN" #x2A96)
+    ("SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE" #x2A97)
+    ("SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE" #x2A98)
+    ("DOUBLE-LINE EQUAL TO OR LESS-THAN" #x2A99)
+    ("DOUBLE-LINE EQUAL TO OR GREATER-THAN" #x2A9A)
+    ("DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN" #x2A9B)
+    ("DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN" #x2A9C)
+    ("SIMILAR OR LESS-THAN" #x2A9D)
+    ("SIMILAR OR GREATER-THAN" #x2A9E)
+    ("SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN" #x2A9F)
+    ("SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN" #x2AA0)
+    ("DOUBLE NESTED LESS-THAN" #x2AA1)
+    ("DOUBLE NESTED GREATER-THAN" #x2AA2)
+    ("DOUBLE NESTED LESS-THAN WITH UNDERBAR" #x2AA3)
+    ("GREATER-THAN OVERLAPPING LESS-THAN" #x2AA4)
+    ("GREATER-THAN BESIDE LESS-THAN" #x2AA5)
+    ("LESS-THAN CLOSED BY CURVE" #x2AA6)
+    ("GREATER-THAN CLOSED BY CURVE" #x2AA7)
+    ("LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL" #x2AA8)
+    ("GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL" #x2AA9)
+    ("SMALLER THAN" #x2AAA)
+    ("LARGER THAN" #x2AAB)
+    ("SMALLER THAN OR EQUAL TO" #x2AAC)
+    ("LARGER THAN OR EQUAL TO" #x2AAD)
+    ("EQUALS SIGN WITH BUMPY ABOVE" #x2AAE)
+    ("PRECEDES ABOVE SINGLE-LINE EQUALS SIGN" #x2AAF)
+    ("SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN" #x2AB0)
+    ("PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO" #x2AB1)
+    ("SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO" #x2AB2)
+    ("PRECEDES ABOVE EQUALS SIGN" #x2AB3)
+    ("SUCCEEDS ABOVE EQUALS SIGN" #x2AB4)
+    ("PRECEDES ABOVE NOT EQUAL TO" #x2AB5)
+    ("SUCCEEDS ABOVE NOT EQUAL TO" #x2AB6)
+    ("PRECEDES ABOVE ALMOST EQUAL TO" #x2AB7)
+    ("SUCCEEDS ABOVE ALMOST EQUAL TO" #x2AB8)
+    ("PRECEDES ABOVE NOT ALMOST EQUAL TO" #x2AB9)
+    ("SUCCEEDS ABOVE NOT ALMOST EQUAL TO" #x2ABA)
+    ("DOUBLE PRECEDES" #x2ABB)
+    ("DOUBLE SUCCEEDS" #x2ABC)
+    ("SUBSET WITH DOT" #x2ABD)
+    ("SUPERSET WITH DOT" #x2ABE)
+    ("SUBSET WITH PLUS SIGN BELOW" #x2ABF)
+    ("SUPERSET WITH PLUS SIGN BELOW" #x2AC0)
+    ("SUBSET WITH MULTIPLICATION SIGN BELOW" #x2AC1)
+    ("SUPERSET WITH MULTIPLICATION SIGN BELOW" #x2AC2)
+    ("SUBSET OF OR EQUAL TO WITH DOT ABOVE" #x2AC3)
+    ("SUPERSET OF OR EQUAL TO WITH DOT ABOVE" #x2AC4)
+    ("SUBSET OF ABOVE EQUALS SIGN" #x2AC5)
+    ("SUPERSET OF ABOVE EQUALS SIGN" #x2AC6)
+    ("SUBSET OF ABOVE TILDE OPERATOR" #x2AC7)
+    ("SUPERSET OF ABOVE TILDE OPERATOR" #x2AC8)
+    ("SUBSET OF ABOVE ALMOST EQUAL TO" #x2AC9)
+    ("SUPERSET OF ABOVE ALMOST EQUAL TO" #x2ACA)
+    ("SUBSET OF ABOVE NOT EQUAL TO" #x2ACB)
+    ("SUPERSET OF ABOVE NOT EQUAL TO" #x2ACC)
+    ("SQUARE LEFT OPEN BOX OPERATOR" #x2ACD)
+    ("SQUARE RIGHT OPEN BOX OPERATOR" #x2ACE)
+    ("CLOSED SUBSET" #x2ACF)
+    ("CLOSED SUPERSET" #x2AD0)
+    ("CLOSED SUBSET OR EQUAL TO" #x2AD1)
+    ("CLOSED SUPERSET OR EQUAL TO" #x2AD2)
+    ("SUBSET ABOVE SUPERSET" #x2AD3)
+    ("SUPERSET ABOVE SUBSET" #x2AD4)
+    ("SUBSET ABOVE SUBSET" #x2AD5)
+    ("SUPERSET ABOVE SUPERSET" #x2AD6)
+    ("SUPERSET BESIDE SUBSET" #x2AD7)
+    ("SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET" #x2AD8)
+    ("ELEMENT OF OPENING DOWNWARDS" #x2AD9)
+    ("PITCHFORK WITH TEE TOP" #x2ADA)
+    ("TRANSVERSAL INTERSECTION" #x2ADB)
+    ("FORKING" #x2ADC)
+    ("NONFORKING" #x2ADD)
+    ("SHORT LEFT TACK" #x2ADE)
+    ("SHORT DOWN TACK" #x2ADF)
+    ("SHORT UP TACK" #x2AE0)
+    ("PERPENDICULAR WITH S" #x2AE1)
+    ("VERTICAL BAR TRIPLE RIGHT TURNSTILE" #x2AE2)
+    ("DOUBLE VERTICAL BAR LEFT TURNSTILE" #x2AE3)
+    ("VERTICAL BAR DOUBLE LEFT TURNSTILE" #x2AE4)
+    ("DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE" #x2AE5)
+    ("LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL" #x2AE6)
+    ("SHORT DOWN TACK WITH OVERBAR" #x2AE7)
+    ("SHORT UP TACK WITH UNDERBAR" #x2AE8)
+    ("SHORT UP TACK ABOVE SHORT DOWN TACK" #x2AE9)
+    ("DOUBLE DOWN TACK" #x2AEA)
+    ("DOUBLE UP TACK" #x2AEB)
+    ("DOUBLE STROKE NOT SIGN" #x2AEC)
+    ("REVERSED DOUBLE STROKE NOT SIGN" #x2AED)
+    ("DOES NOT DIVIDE WITH REVERSED NEGATION SLASH" #x2AEE)
+    ("VERTICAL LINE WITH CIRCLE ABOVE" #x2AEF)
+    ("VERTICAL LINE WITH CIRCLE BELOW" #x2AF0)
+    ("DOWN TACK WITH CIRCLE BELOW" #x2AF1)
+    ("PARALLEL WITH HORIZONTAL STROKE" #x2AF2)
+    ("PARALLEL WITH TILDE OPERATOR" #x2AF3)
+    ("TRIPLE VERTICAL BAR BINARY RELATION" #x2AF4)
+    ("TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE" #x2AF5)
+    ("TRIPLE COLON OPERATOR" #x2AF6)
+    ("TRIPLE NESTED LESS-THAN" #x2AF7)
+    ("TRIPLE NESTED GREATER-THAN" #x2AF8)
+    ("DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO" #x2AF9)
+    ("DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO" #x2AFA)
+    ("TRIPLE SOLIDUS BINARY RELATION" #x2AFB)
+    ("LARGE TRIPLE VERTICAL BAR OPERATOR" #x2AFC)
+    ("DOUBLE SOLIDUS OPERATOR" #x2AFD)
+    ("WHITE VERTICAL BAR" #x2AFE)
+    ("N-ARY WHITE VERTICAL BAR" #x2AFF)
+    ))
+
+;; arch-tag: 672a8fbf-fb4a-4862-8b8e-2379b799484c
diff --git a/etc/nxml/02E80-02EFF.el b/etc/nxml/02E80-02EFF.el
new file mode 100644 (file)
index 0000000..deb8110
--- /dev/null
@@ -0,0 +1,119 @@
+(nxml-define-char-name-set 'cjk-radicals-supplement
+  '(("CJK RADICAL REPEAT" #x2E80)
+    ("CJK RADICAL CLIFF" #x2E81)
+    ("CJK RADICAL SECOND ONE" #x2E82)
+    ("CJK RADICAL SECOND TWO" #x2E83)
+    ("CJK RADICAL SECOND THREE" #x2E84)
+    ("CJK RADICAL PERSON" #x2E85)
+    ("CJK RADICAL BOX" #x2E86)
+    ("CJK RADICAL TABLE" #x2E87)
+    ("CJK RADICAL KNIFE ONE" #x2E88)
+    ("CJK RADICAL KNIFE TWO" #x2E89)
+    ("CJK RADICAL DIVINATION" #x2E8A)
+    ("CJK RADICAL SEAL" #x2E8B)
+    ("CJK RADICAL SMALL ONE" #x2E8C)
+    ("CJK RADICAL SMALL TWO" #x2E8D)
+    ("CJK RADICAL LAME ONE" #x2E8E)
+    ("CJK RADICAL LAME TWO" #x2E8F)
+    ("CJK RADICAL LAME THREE" #x2E90)
+    ("CJK RADICAL LAME FOUR" #x2E91)
+    ("CJK RADICAL SNAKE" #x2E92)
+    ("CJK RADICAL THREAD" #x2E93)
+    ("CJK RADICAL SNOUT ONE" #x2E94)
+    ("CJK RADICAL SNOUT TWO" #x2E95)
+    ("CJK RADICAL HEART ONE" #x2E96)
+    ("CJK RADICAL HEART TWO" #x2E97)
+    ("CJK RADICAL HAND" #x2E98)
+    ("CJK RADICAL RAP" #x2E99)
+    ("CJK RADICAL CHOKE" #x2E9B)
+    ("CJK RADICAL SUN" #x2E9C)
+    ("CJK RADICAL MOON" #x2E9D)
+    ("CJK RADICAL DEATH" #x2E9E)
+    ("CJK RADICAL MOTHER" #x2E9F)
+    ("CJK RADICAL CIVILIAN" #x2EA0)
+    ("CJK RADICAL WATER ONE" #x2EA1)
+    ("CJK RADICAL WATER TWO" #x2EA2)
+    ("CJK RADICAL FIRE" #x2EA3)
+    ("CJK RADICAL PAW ONE" #x2EA4)
+    ("CJK RADICAL PAW TWO" #x2EA5)
+    ("CJK RADICAL SIMPLIFIED HALF TREE TRUNK" #x2EA6)
+    ("CJK RADICAL COW" #x2EA7)
+    ("CJK RADICAL DOG" #x2EA8)
+    ("CJK RADICAL JADE" #x2EA9)
+    ("CJK RADICAL BOLT OF CLOTH" #x2EAA)
+    ("CJK RADICAL EYE" #x2EAB)
+    ("CJK RADICAL SPIRIT ONE" #x2EAC)
+    ("CJK RADICAL SPIRIT TWO" #x2EAD)
+    ("CJK RADICAL BAMBOO" #x2EAE)
+    ("CJK RADICAL SILK" #x2EAF)
+    ("CJK RADICAL C-SIMPLIFIED SILK" #x2EB0)
+    ("CJK RADICAL NET ONE" #x2EB1)
+    ("CJK RADICAL NET TWO" #x2EB2)
+    ("CJK RADICAL NET THREE" #x2EB3)
+    ("CJK RADICAL NET FOUR" #x2EB4)
+    ("CJK RADICAL MESH" #x2EB5)
+    ("CJK RADICAL SHEEP" #x2EB6)
+    ("CJK RADICAL RAM" #x2EB7)
+    ("CJK RADICAL EWE" #x2EB8)
+    ("CJK RADICAL OLD" #x2EB9)
+    ("CJK RADICAL BRUSH ONE" #x2EBA)
+    ("CJK RADICAL BRUSH TWO" #x2EBB)
+    ("CJK RADICAL MEAT" #x2EBC)
+    ("CJK RADICAL MORTAR" #x2EBD)
+    ("CJK RADICAL GRASS ONE" #x2EBE)
+    ("CJK RADICAL GRASS TWO" #x2EBF)
+    ("CJK RADICAL GRASS THREE" #x2EC0)
+    ("CJK RADICAL TIGER" #x2EC1)
+    ("CJK RADICAL CLOTHES" #x2EC2)
+    ("CJK RADICAL WEST ONE" #x2EC3)
+    ("CJK RADICAL WEST TWO" #x2EC4)
+    ("CJK RADICAL C-SIMPLIFIED SEE" #x2EC5)
+    ("CJK RADICAL SIMPLIFIED HORN" #x2EC6)
+    ("CJK RADICAL HORN" #x2EC7)
+    ("CJK RADICAL C-SIMPLIFIED SPEECH" #x2EC8)
+    ("CJK RADICAL C-SIMPLIFIED SHELL" #x2EC9)
+    ("CJK RADICAL FOOT" #x2ECA)
+    ("CJK RADICAL C-SIMPLIFIED CART" #x2ECB)
+    ("CJK RADICAL SIMPLIFIED WALK" #x2ECC)
+    ("CJK RADICAL WALK ONE" #x2ECD)
+    ("CJK RADICAL WALK TWO" #x2ECE)
+    ("CJK RADICAL CITY" #x2ECF)
+    ("CJK RADICAL C-SIMPLIFIED GOLD" #x2ED0)
+    ("CJK RADICAL LONG ONE" #x2ED1)
+    ("CJK RADICAL LONG TWO" #x2ED2)
+    ("CJK RADICAL C-SIMPLIFIED LONG" #x2ED3)
+    ("CJK RADICAL C-SIMPLIFIED GATE" #x2ED4)
+    ("CJK RADICAL MOUND ONE" #x2ED5)
+    ("CJK RADICAL MOUND TWO" #x2ED6)
+    ("CJK RADICAL RAIN" #x2ED7)
+    ("CJK RADICAL BLUE" #x2ED8)
+    ("CJK RADICAL C-SIMPLIFIED TANNED LEATHER" #x2ED9)
+    ("CJK RADICAL C-SIMPLIFIED LEAF" #x2EDA)
+    ("CJK RADICAL C-SIMPLIFIED WIND" #x2EDB)
+    ("CJK RADICAL C-SIMPLIFIED FLY" #x2EDC)
+    ("CJK RADICAL EAT ONE" #x2EDD)
+    ("CJK RADICAL EAT TWO" #x2EDE)
+    ("CJK RADICAL EAT THREE" #x2EDF)
+    ("CJK RADICAL C-SIMPLIFIED EAT" #x2EE0)
+    ("CJK RADICAL HEAD" #x2EE1)
+    ("CJK RADICAL C-SIMPLIFIED HORSE" #x2EE2)
+    ("CJK RADICAL BONE" #x2EE3)
+    ("CJK RADICAL GHOST" #x2EE4)
+    ("CJK RADICAL C-SIMPLIFIED FISH" #x2EE5)
+    ("CJK RADICAL C-SIMPLIFIED BIRD" #x2EE6)
+    ("CJK RADICAL C-SIMPLIFIED SALT" #x2EE7)
+    ("CJK RADICAL SIMPLIFIED WHEAT" #x2EE8)
+    ("CJK RADICAL SIMPLIFIED YELLOW" #x2EE9)
+    ("CJK RADICAL C-SIMPLIFIED FROG" #x2EEA)
+    ("CJK RADICAL J-SIMPLIFIED EVEN" #x2EEB)
+    ("CJK RADICAL C-SIMPLIFIED EVEN" #x2EEC)
+    ("CJK RADICAL J-SIMPLIFIED TOOTH" #x2EED)
+    ("CJK RADICAL C-SIMPLIFIED TOOTH" #x2EEE)
+    ("CJK RADICAL J-SIMPLIFIED DRAGON" #x2EEF)
+    ("CJK RADICAL C-SIMPLIFIED DRAGON" #x2EF0)
+    ("CJK RADICAL TURTLE" #x2EF1)
+    ("CJK RADICAL J-SIMPLIFIED TURTLE" #x2EF2)
+    ("CJK RADICAL C-SIMPLIFIED TURTLE" #x2EF3)
+    ))
+
+;; arch-tag: 59a2c3dd-63ee-4cba-b427-1e8eb782634f
diff --git a/etc/nxml/02F00-02FDF.el b/etc/nxml/02F00-02FDF.el
new file mode 100644 (file)
index 0000000..1a2448a
--- /dev/null
@@ -0,0 +1,218 @@
+(nxml-define-char-name-set 'kangxi-radicals
+  '(("KANGXI RADICAL ONE" #x2F00)
+    ("KANGXI RADICAL LINE" #x2F01)
+    ("KANGXI RADICAL DOT" #x2F02)
+    ("KANGXI RADICAL SLASH" #x2F03)
+    ("KANGXI RADICAL SECOND" #x2F04)
+    ("KANGXI RADICAL HOOK" #x2F05)
+    ("KANGXI RADICAL TWO" #x2F06)
+    ("KANGXI RADICAL LID" #x2F07)
+    ("KANGXI RADICAL MAN" #x2F08)
+    ("KANGXI RADICAL LEGS" #x2F09)
+    ("KANGXI RADICAL ENTER" #x2F0A)
+    ("KANGXI RADICAL EIGHT" #x2F0B)
+    ("KANGXI RADICAL DOWN BOX" #x2F0C)
+    ("KANGXI RADICAL COVER" #x2F0D)
+    ("KANGXI RADICAL ICE" #x2F0E)
+    ("KANGXI RADICAL TABLE" #x2F0F)
+    ("KANGXI RADICAL OPEN BOX" #x2F10)
+    ("KANGXI RADICAL KNIFE" #x2F11)
+    ("KANGXI RADICAL POWER" #x2F12)
+    ("KANGXI RADICAL WRAP" #x2F13)
+    ("KANGXI RADICAL SPOON" #x2F14)
+    ("KANGXI RADICAL RIGHT OPEN BOX" #x2F15)
+    ("KANGXI RADICAL HIDING ENCLOSURE" #x2F16)
+    ("KANGXI RADICAL TEN" #x2F17)
+    ("KANGXI RADICAL DIVINATION" #x2F18)
+    ("KANGXI RADICAL SEAL" #x2F19)
+    ("KANGXI RADICAL CLIFF" #x2F1A)
+    ("KANGXI RADICAL PRIVATE" #x2F1B)
+    ("KANGXI RADICAL AGAIN" #x2F1C)
+    ("KANGXI RADICAL MOUTH" #x2F1D)
+    ("KANGXI RADICAL ENCLOSURE" #x2F1E)
+    ("KANGXI RADICAL EARTH" #x2F1F)
+    ("KANGXI RADICAL SCHOLAR" #x2F20)
+    ("KANGXI RADICAL GO" #x2F21)
+    ("KANGXI RADICAL GO SLOWLY" #x2F22)
+    ("KANGXI RADICAL EVENING" #x2F23)
+    ("KANGXI RADICAL BIG" #x2F24)
+    ("KANGXI RADICAL WOMAN" #x2F25)
+    ("KANGXI RADICAL CHILD" #x2F26)
+    ("KANGXI RADICAL ROOF" #x2F27)
+    ("KANGXI RADICAL INCH" #x2F28)
+    ("KANGXI RADICAL SMALL" #x2F29)
+    ("KANGXI RADICAL LAME" #x2F2A)
+    ("KANGXI RADICAL CORPSE" #x2F2B)
+    ("KANGXI RADICAL SPROUT" #x2F2C)
+    ("KANGXI RADICAL MOUNTAIN" #x2F2D)
+    ("KANGXI RADICAL RIVER" #x2F2E)
+    ("KANGXI RADICAL WORK" #x2F2F)
+    ("KANGXI RADICAL ONESELF" #x2F30)
+    ("KANGXI RADICAL TURBAN" #x2F31)
+    ("KANGXI RADICAL DRY" #x2F32)
+    ("KANGXI RADICAL SHORT THREAD" #x2F33)
+    ("KANGXI RADICAL DOTTED CLIFF" #x2F34)
+    ("KANGXI RADICAL LONG STRIDE" #x2F35)
+    ("KANGXI RADICAL TWO HANDS" #x2F36)
+    ("KANGXI RADICAL SHOOT" #x2F37)
+    ("KANGXI RADICAL BOW" #x2F38)
+    ("KANGXI RADICAL SNOUT" #x2F39)
+    ("KANGXI RADICAL BRISTLE" #x2F3A)
+    ("KANGXI RADICAL STEP" #x2F3B)
+    ("KANGXI RADICAL HEART" #x2F3C)
+    ("KANGXI RADICAL HALBERD" #x2F3D)
+    ("KANGXI RADICAL DOOR" #x2F3E)
+    ("KANGXI RADICAL HAND" #x2F3F)
+    ("KANGXI RADICAL BRANCH" #x2F40)
+    ("KANGXI RADICAL RAP" #x2F41)
+    ("KANGXI RADICAL SCRIPT" #x2F42)
+    ("KANGXI RADICAL DIPPER" #x2F43)
+    ("KANGXI RADICAL AXE" #x2F44)
+    ("KANGXI RADICAL SQUARE" #x2F45)
+    ("KANGXI RADICAL NOT" #x2F46)
+    ("KANGXI RADICAL SUN" #x2F47)
+    ("KANGXI RADICAL SAY" #x2F48)
+    ("KANGXI RADICAL MOON" #x2F49)
+    ("KANGXI RADICAL TREE" #x2F4A)
+    ("KANGXI RADICAL LACK" #x2F4B)
+    ("KANGXI RADICAL STOP" #x2F4C)
+    ("KANGXI RADICAL DEATH" #x2F4D)
+    ("KANGXI RADICAL WEAPON" #x2F4E)
+    ("KANGXI RADICAL DO NOT" #x2F4F)
+    ("KANGXI RADICAL COMPARE" #x2F50)
+    ("KANGXI RADICAL FUR" #x2F51)
+    ("KANGXI RADICAL CLAN" #x2F52)
+    ("KANGXI RADICAL STEAM" #x2F53)
+    ("KANGXI RADICAL WATER" #x2F54)
+    ("KANGXI RADICAL FIRE" #x2F55)
+    ("KANGXI RADICAL CLAW" #x2F56)
+    ("KANGXI RADICAL FATHER" #x2F57)
+    ("KANGXI RADICAL DOUBLE X" #x2F58)
+    ("KANGXI RADICAL HALF TREE TRUNK" #x2F59)
+    ("KANGXI RADICAL SLICE" #x2F5A)
+    ("KANGXI RADICAL FANG" #x2F5B)
+    ("KANGXI RADICAL COW" #x2F5C)
+    ("KANGXI RADICAL DOG" #x2F5D)
+    ("KANGXI RADICAL PROFOUND" #x2F5E)
+    ("KANGXI RADICAL JADE" #x2F5F)
+    ("KANGXI RADICAL MELON" #x2F60)
+    ("KANGXI RADICAL TILE" #x2F61)
+    ("KANGXI RADICAL SWEET" #x2F62)
+    ("KANGXI RADICAL LIFE" #x2F63)
+    ("KANGXI RADICAL USE" #x2F64)
+    ("KANGXI RADICAL FIELD" #x2F65)
+    ("KANGXI RADICAL BOLT OF CLOTH" #x2F66)
+    ("KANGXI RADICAL SICKNESS" #x2F67)
+    ("KANGXI RADICAL DOTTED TENT" #x2F68)
+    ("KANGXI RADICAL WHITE" #x2F69)
+    ("KANGXI RADICAL SKIN" #x2F6A)
+    ("KANGXI RADICAL DISH" #x2F6B)
+    ("KANGXI RADICAL EYE" #x2F6C)
+    ("KANGXI RADICAL SPEAR" #x2F6D)
+    ("KANGXI RADICAL ARROW" #x2F6E)
+    ("KANGXI RADICAL STONE" #x2F6F)
+    ("KANGXI RADICAL SPIRIT" #x2F70)
+    ("KANGXI RADICAL TRACK" #x2F71)
+    ("KANGXI RADICAL GRAIN" #x2F72)
+    ("KANGXI RADICAL CAVE" #x2F73)
+    ("KANGXI RADICAL STAND" #x2F74)
+    ("KANGXI RADICAL BAMBOO" #x2F75)
+    ("KANGXI RADICAL RICE" #x2F76)
+    ("KANGXI RADICAL SILK" #x2F77)
+    ("KANGXI RADICAL JAR" #x2F78)
+    ("KANGXI RADICAL NET" #x2F79)
+    ("KANGXI RADICAL SHEEP" #x2F7A)
+    ("KANGXI RADICAL FEATHER" #x2F7B)
+    ("KANGXI RADICAL OLD" #x2F7C)
+    ("KANGXI RADICAL AND" #x2F7D)
+    ("KANGXI RADICAL PLOW" #x2F7E)
+    ("KANGXI RADICAL EAR" #x2F7F)
+    ("KANGXI RADICAL BRUSH" #x2F80)
+    ("KANGXI RADICAL MEAT" #x2F81)
+    ("KANGXI RADICAL MINISTER" #x2F82)
+    ("KANGXI RADICAL SELF" #x2F83)
+    ("KANGXI RADICAL ARRIVE" #x2F84)
+    ("KANGXI RADICAL MORTAR" #x2F85)
+    ("KANGXI RADICAL TONGUE" #x2F86)
+    ("KANGXI RADICAL OPPOSE" #x2F87)
+    ("KANGXI RADICAL BOAT" #x2F88)
+    ("KANGXI RADICAL STOPPING" #x2F89)
+    ("KANGXI RADICAL COLOR" #x2F8A)
+    ("KANGXI RADICAL GRASS" #x2F8B)
+    ("KANGXI RADICAL TIGER" #x2F8C)
+    ("KANGXI RADICAL INSECT" #x2F8D)
+    ("KANGXI RADICAL BLOOD" #x2F8E)
+    ("KANGXI RADICAL WALK ENCLOSURE" #x2F8F)
+    ("KANGXI RADICAL CLOTHES" #x2F90)
+    ("KANGXI RADICAL WEST" #x2F91)
+    ("KANGXI RADICAL SEE" #x2F92)
+    ("KANGXI RADICAL HORN" #x2F93)
+    ("KANGXI RADICAL SPEECH" #x2F94)
+    ("KANGXI RADICAL VALLEY" #x2F95)
+    ("KANGXI RADICAL BEAN" #x2F96)
+    ("KANGXI RADICAL PIG" #x2F97)
+    ("KANGXI RADICAL BADGER" #x2F98)
+    ("KANGXI RADICAL SHELL" #x2F99)
+    ("KANGXI RADICAL RED" #x2F9A)
+    ("KANGXI RADICAL RUN" #x2F9B)
+    ("KANGXI RADICAL FOOT" #x2F9C)
+    ("KANGXI RADICAL BODY" #x2F9D)
+    ("KANGXI RADICAL CART" #x2F9E)
+    ("KANGXI RADICAL BITTER" #x2F9F)
+    ("KANGXI RADICAL MORNING" #x2FA0)
+    ("KANGXI RADICAL WALK" #x2FA1)
+    ("KANGXI RADICAL CITY" #x2FA2)
+    ("KANGXI RADICAL WINE" #x2FA3)
+    ("KANGXI RADICAL DISTINGUISH" #x2FA4)
+    ("KANGXI RADICAL VILLAGE" #x2FA5)
+    ("KANGXI RADICAL GOLD" #x2FA6)
+    ("KANGXI RADICAL LONG" #x2FA7)
+    ("KANGXI RADICAL GATE" #x2FA8)
+    ("KANGXI RADICAL MOUND" #x2FA9)
+    ("KANGXI RADICAL SLAVE" #x2FAA)
+    ("KANGXI RADICAL SHORT TAILED BIRD" #x2FAB)
+    ("KANGXI RADICAL RAIN" #x2FAC)
+    ("KANGXI RADICAL BLUE" #x2FAD)
+    ("KANGXI RADICAL WRONG" #x2FAE)
+    ("KANGXI RADICAL FACE" #x2FAF)
+    ("KANGXI RADICAL LEATHER" #x2FB0)
+    ("KANGXI RADICAL TANNED LEATHER" #x2FB1)
+    ("KANGXI RADICAL LEEK" #x2FB2)
+    ("KANGXI RADICAL SOUND" #x2FB3)
+    ("KANGXI RADICAL LEAF" #x2FB4)
+    ("KANGXI RADICAL WIND" #x2FB5)
+    ("KANGXI RADICAL FLY" #x2FB6)
+    ("KANGXI RADICAL EAT" #x2FB7)
+    ("KANGXI RADICAL HEAD" #x2FB8)
+    ("KANGXI RADICAL FRAGRANT" #x2FB9)
+    ("KANGXI RADICAL HORSE" #x2FBA)
+    ("KANGXI RADICAL BONE" #x2FBB)
+    ("KANGXI RADICAL TALL" #x2FBC)
+    ("KANGXI RADICAL HAIR" #x2FBD)
+    ("KANGXI RADICAL FIGHT" #x2FBE)
+    ("KANGXI RADICAL SACRIFICIAL WINE" #x2FBF)
+    ("KANGXI RADICAL CAULDRON" #x2FC0)
+    ("KANGXI RADICAL GHOST" #x2FC1)
+    ("KANGXI RADICAL FISH" #x2FC2)
+    ("KANGXI RADICAL BIRD" #x2FC3)
+    ("KANGXI RADICAL SALT" #x2FC4)
+    ("KANGXI RADICAL DEER" #x2FC5)
+    ("KANGXI RADICAL WHEAT" #x2FC6)
+    ("KANGXI RADICAL HEMP" #x2FC7)
+    ("KANGXI RADICAL YELLOW" #x2FC8)
+    ("KANGXI RADICAL MILLET" #x2FC9)
+    ("KANGXI RADICAL BLACK" #x2FCA)
+    ("KANGXI RADICAL EMBROIDERY" #x2FCB)
+    ("KANGXI RADICAL FROG" #x2FCC)
+    ("KANGXI RADICAL TRIPOD" #x2FCD)
+    ("KANGXI RADICAL DRUM" #x2FCE)
+    ("KANGXI RADICAL RAT" #x2FCF)
+    ("KANGXI RADICAL NOSE" #x2FD0)
+    ("KANGXI RADICAL EVEN" #x2FD1)
+    ("KANGXI RADICAL TOOTH" #x2FD2)
+    ("KANGXI RADICAL DRAGON" #x2FD3)
+    ("KANGXI RADICAL TURTLE" #x2FD4)
+    ("KANGXI RADICAL FLUTE" #x2FD5)
+    ))
+
+;; arch-tag: e7210935-b74b-4a42-88c6-de146c755742
diff --git a/etc/nxml/02FF0-02FFF.el b/etc/nxml/02FF0-02FFF.el
new file mode 100644 (file)
index 0000000..f94bd1f
--- /dev/null
@@ -0,0 +1,16 @@
+(nxml-define-char-name-set 'ideographic-description-characters
+  '(("IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT" #x2FF0)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW" #x2FF1)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT" #x2FF2)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW" #x2FF3)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND" #x2FF4)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE" #x2FF5)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW" #x2FF6)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT" #x2FF7)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT" #x2FF8)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT" #x2FF9)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT" #x2FFA)
+    ("IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID" #x2FFB)
+    ))
+
+;; arch-tag: dd6d1436-4620-4994-8da5-9140a8a6ec5b
diff --git a/etc/nxml/03000-0303F.el b/etc/nxml/03000-0303F.el
new file mode 100644 (file)
index 0000000..997795f
--- /dev/null
@@ -0,0 +1,68 @@
+(nxml-define-char-name-set 'cjk-symbols-and-punctuation
+  '(("IDEOGRAPHIC SPACE" #x3000)
+    ("IDEOGRAPHIC COMMA" #x3001)
+    ("IDEOGRAPHIC FULL STOP" #x3002)
+    ("DITTO MARK" #x3003)
+    ("JAPANESE INDUSTRIAL STANDARD SYMBOL" #x3004)
+    ("IDEOGRAPHIC ITERATION MARK" #x3005)
+    ("IDEOGRAPHIC CLOSING MARK" #x3006)
+    ("IDEOGRAPHIC NUMBER ZERO" #x3007)
+    ("LEFT ANGLE BRACKET" #x3008)
+    ("RIGHT ANGLE BRACKET" #x3009)
+    ("LEFT DOUBLE ANGLE BRACKET" #x300A)
+    ("RIGHT DOUBLE ANGLE BRACKET" #x300B)
+    ("LEFT CORNER BRACKET" #x300C)
+    ("RIGHT CORNER BRACKET" #x300D)
+    ("LEFT WHITE CORNER BRACKET" #x300E)
+    ("RIGHT WHITE CORNER BRACKET" #x300F)
+    ("LEFT BLACK LENTICULAR BRACKET" #x3010)
+    ("RIGHT BLACK LENTICULAR BRACKET" #x3011)
+    ("POSTAL MARK" #x3012)
+    ("GETA MARK" #x3013)
+    ("LEFT TORTOISE SHELL BRACKET" #x3014)
+    ("RIGHT TORTOISE SHELL BRACKET" #x3015)
+    ("LEFT WHITE LENTICULAR BRACKET" #x3016)
+    ("RIGHT WHITE LENTICULAR BRACKET" #x3017)
+    ("LEFT WHITE TORTOISE SHELL BRACKET" #x3018)
+    ("RIGHT WHITE TORTOISE SHELL BRACKET" #x3019)
+    ("LEFT WHITE SQUARE BRACKET" #x301A)
+    ("RIGHT WHITE SQUARE BRACKET" #x301B)
+    ("WAVE DASH" #x301C)
+    ("REVERSED DOUBLE PRIME QUOTATION MARK" #x301D)
+    ("DOUBLE PRIME QUOTATION MARK" #x301E)
+    ("LOW DOUBLE PRIME QUOTATION MARK" #x301F)
+    ("POSTAL MARK FACE" #x3020)
+    ("HANGZHOU NUMERAL ONE" #x3021)
+    ("HANGZHOU NUMERAL TWO" #x3022)
+    ("HANGZHOU NUMERAL THREE" #x3023)
+    ("HANGZHOU NUMERAL FOUR" #x3024)
+    ("HANGZHOU NUMERAL FIVE" #x3025)
+    ("HANGZHOU NUMERAL SIX" #x3026)
+    ("HANGZHOU NUMERAL SEVEN" #x3027)
+    ("HANGZHOU NUMERAL EIGHT" #x3028)
+    ("HANGZHOU NUMERAL NINE" #x3029)
+    ("IDEOGRAPHIC LEVEL TONE MARK" #x302A)
+    ("IDEOGRAPHIC RISING TONE MARK" #x302B)
+    ("IDEOGRAPHIC DEPARTING TONE MARK" #x302C)
+    ("IDEOGRAPHIC ENTERING TONE MARK" #x302D)
+    ("HANGUL SINGLE DOT TONE MARK" #x302E)
+    ("HANGUL DOUBLE DOT TONE MARK" #x302F)
+    ("WAVY DASH" #x3030)
+    ("VERTICAL KANA REPEAT MARK" #x3031)
+    ("VERTICAL KANA REPEAT WITH VOICED SOUND MARK" #x3032)
+    ("VERTICAL KANA REPEAT MARK UPPER HALF" #x3033)
+    ("VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF" #x3034)
+    ("VERTICAL KANA REPEAT MARK LOWER HALF" #x3035)
+    ("CIRCLED POSTAL MARK" #x3036)
+    ("IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL" #x3037)
+    ("HANGZHOU NUMERAL TEN" #x3038)
+    ("HANGZHOU NUMERAL TWENTY" #x3039)
+    ("HANGZHOU NUMERAL THIRTY" #x303A)
+    ("VERTICAL IDEOGRAPHIC ITERATION MARK" #x303B)
+    ("MASU MARK" #x303C)
+    ("PART ALTERNATION MARK" #x303D)
+    ("IDEOGRAPHIC VARIATION INDICATOR" #x303E)
+    ("IDEOGRAPHIC HALF FILL SPACE" #x303F)
+    ))
+
+;; arch-tag: 05689acc-1d48-4a36-9b60-75d5abf8a065
diff --git a/etc/nxml/03040-0309F.el b/etc/nxml/03040-0309F.el
new file mode 100644 (file)
index 0000000..18cdaa0
--- /dev/null
@@ -0,0 +1,97 @@
+(nxml-define-char-name-set 'hiragana
+  '(("HIRAGANA LETTER SMALL A" #x3041)
+    ("HIRAGANA LETTER A" #x3042)
+    ("HIRAGANA LETTER SMALL I" #x3043)
+    ("HIRAGANA LETTER I" #x3044)
+    ("HIRAGANA LETTER SMALL U" #x3045)
+    ("HIRAGANA LETTER U" #x3046)
+    ("HIRAGANA LETTER SMALL E" #x3047)
+    ("HIRAGANA LETTER E" #x3048)
+    ("HIRAGANA LETTER SMALL O" #x3049)
+    ("HIRAGANA LETTER O" #x304A)
+    ("HIRAGANA LETTER KA" #x304B)
+    ("HIRAGANA LETTER GA" #x304C)
+    ("HIRAGANA LETTER KI" #x304D)
+    ("HIRAGANA LETTER GI" #x304E)
+    ("HIRAGANA LETTER KU" #x304F)
+    ("HIRAGANA LETTER GU" #x3050)
+    ("HIRAGANA LETTER KE" #x3051)
+    ("HIRAGANA LETTER GE" #x3052)
+    ("HIRAGANA LETTER KO" #x3053)
+    ("HIRAGANA LETTER GO" #x3054)
+    ("HIRAGANA LETTER SA" #x3055)
+    ("HIRAGANA LETTER ZA" #x3056)
+    ("HIRAGANA LETTER SI" #x3057)
+    ("HIRAGANA LETTER ZI" #x3058)
+    ("HIRAGANA LETTER SU" #x3059)
+    ("HIRAGANA LETTER ZU" #x305A)
+    ("HIRAGANA LETTER SE" #x305B)
+    ("HIRAGANA LETTER ZE" #x305C)
+    ("HIRAGANA LETTER SO" #x305D)
+    ("HIRAGANA LETTER ZO" #x305E)
+    ("HIRAGANA LETTER TA" #x305F)
+    ("HIRAGANA LETTER DA" #x3060)
+    ("HIRAGANA LETTER TI" #x3061)
+    ("HIRAGANA LETTER DI" #x3062)
+    ("HIRAGANA LETTER SMALL TU" #x3063)
+    ("HIRAGANA LETTER TU" #x3064)
+    ("HIRAGANA LETTER DU" #x3065)
+    ("HIRAGANA LETTER TE" #x3066)
+    ("HIRAGANA LETTER DE" #x3067)
+    ("HIRAGANA LETTER TO" #x3068)
+    ("HIRAGANA LETTER DO" #x3069)
+    ("HIRAGANA LETTER NA" #x306A)
+    ("HIRAGANA LETTER NI" #x306B)
+    ("HIRAGANA LETTER NU" #x306C)
+    ("HIRAGANA LETTER NE" #x306D)
+    ("HIRAGANA LETTER NO" #x306E)
+    ("HIRAGANA LETTER HA" #x306F)
+    ("HIRAGANA LETTER BA" #x3070)
+    ("HIRAGANA LETTER PA" #x3071)
+    ("HIRAGANA LETTER HI" #x3072)
+    ("HIRAGANA LETTER BI" #x3073)
+    ("HIRAGANA LETTER PI" #x3074)
+    ("HIRAGANA LETTER HU" #x3075)
+    ("HIRAGANA LETTER BU" #x3076)
+    ("HIRAGANA LETTER PU" #x3077)
+    ("HIRAGANA LETTER HE" #x3078)
+    ("HIRAGANA LETTER BE" #x3079)
+    ("HIRAGANA LETTER PE" #x307A)
+    ("HIRAGANA LETTER HO" #x307B)
+    ("HIRAGANA LETTER BO" #x307C)
+    ("HIRAGANA LETTER PO" #x307D)
+    ("HIRAGANA LETTER MA" #x307E)
+    ("HIRAGANA LETTER MI" #x307F)
+    ("HIRAGANA LETTER MU" #x3080)
+    ("HIRAGANA LETTER ME" #x3081)
+    ("HIRAGANA LETTER MO" #x3082)
+    ("HIRAGANA LETTER SMALL YA" #x3083)
+    ("HIRAGANA LETTER YA" #x3084)
+    ("HIRAGANA LETTER SMALL YU" #x3085)
+    ("HIRAGANA LETTER YU" #x3086)
+    ("HIRAGANA LETTER SMALL YO" #x3087)
+    ("HIRAGANA LETTER YO" #x3088)
+    ("HIRAGANA LETTER RA" #x3089)
+    ("HIRAGANA LETTER RI" #x308A)
+    ("HIRAGANA LETTER RU" #x308B)
+    ("HIRAGANA LETTER RE" #x308C)
+    ("HIRAGANA LETTER RO" #x308D)
+    ("HIRAGANA LETTER SMALL WA" #x308E)
+    ("HIRAGANA LETTER WA" #x308F)
+    ("HIRAGANA LETTER WI" #x3090)
+    ("HIRAGANA LETTER WE" #x3091)
+    ("HIRAGANA LETTER WO" #x3092)
+    ("HIRAGANA LETTER N" #x3093)
+    ("HIRAGANA LETTER VU" #x3094)
+    ("HIRAGANA LETTER SMALL KA" #x3095)
+    ("HIRAGANA LETTER SMALL KE" #x3096)
+    ("COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK" #x3099)
+    ("COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK" #x309A)
+    ("KATAKANA-HIRAGANA VOICED SOUND MARK" #x309B)
+    ("KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK" #x309C)
+    ("HIRAGANA ITERATION MARK" #x309D)
+    ("HIRAGANA VOICED ITERATION MARK" #x309E)
+    ("HIRAGANA DIGRAPH YORI" #x309F)
+    ))
+
+;; arch-tag: dc96b2bf-74f6-4885-adbb-4a81bd2884be
diff --git a/etc/nxml/030A0-030FF.el b/etc/nxml/030A0-030FF.el
new file mode 100644 (file)
index 0000000..2407060
--- /dev/null
@@ -0,0 +1,100 @@
+(nxml-define-char-name-set 'katakana
+  '(("KATAKANA-HIRAGANA DOUBLE HYPHEN" #x30A0)
+    ("KATAKANA LETTER SMALL A" #x30A1)
+    ("KATAKANA LETTER A" #x30A2)
+    ("KATAKANA LETTER SMALL I" #x30A3)
+    ("KATAKANA LETTER I" #x30A4)
+    ("KATAKANA LETTER SMALL U" #x30A5)
+    ("KATAKANA LETTER U" #x30A6)
+    ("KATAKANA LETTER SMALL E" #x30A7)
+    ("KATAKANA LETTER E" #x30A8)
+    ("KATAKANA LETTER SMALL O" #x30A9)
+    ("KATAKANA LETTER O" #x30AA)
+    ("KATAKANA LETTER KA" #x30AB)
+    ("KATAKANA LETTER GA" #x30AC)
+    ("KATAKANA LETTER KI" #x30AD)
+    ("KATAKANA LETTER GI" #x30AE)
+    ("KATAKANA LETTER KU" #x30AF)
+    ("KATAKANA LETTER GU" #x30B0)
+    ("KATAKANA LETTER KE" #x30B1)
+    ("KATAKANA LETTER GE" #x30B2)
+    ("KATAKANA LETTER KO" #x30B3)
+    ("KATAKANA LETTER GO" #x30B4)
+    ("KATAKANA LETTER SA" #x30B5)
+    ("KATAKANA LETTER ZA" #x30B6)
+    ("KATAKANA LETTER SI" #x30B7)
+    ("KATAKANA LETTER ZI" #x30B8)
+    ("KATAKANA LETTER SU" #x30B9)
+    ("KATAKANA LETTER ZU" #x30BA)
+    ("KATAKANA LETTER SE" #x30BB)
+    ("KATAKANA LETTER ZE" #x30BC)
+    ("KATAKANA LETTER SO" #x30BD)
+    ("KATAKANA LETTER ZO" #x30BE)
+    ("KATAKANA LETTER TA" #x30BF)
+    ("KATAKANA LETTER DA" #x30C0)
+    ("KATAKANA LETTER TI" #x30C1)
+    ("KATAKANA LETTER DI" #x30C2)
+    ("KATAKANA LETTER SMALL TU" #x30C3)
+    ("KATAKANA LETTER TU" #x30C4)
+    ("KATAKANA LETTER DU" #x30C5)
+    ("KATAKANA LETTER TE" #x30C6)
+    ("KATAKANA LETTER DE" #x30C7)
+    ("KATAKANA LETTER TO" #x30C8)
+    ("KATAKANA LETTER DO" #x30C9)
+    ("KATAKANA LETTER NA" #x30CA)
+    ("KATAKANA LETTER NI" #x30CB)
+    ("KATAKANA LETTER NU" #x30CC)
+    ("KATAKANA LETTER NE" #x30CD)
+    ("KATAKANA LETTER NO" #x30CE)
+    ("KATAKANA LETTER HA" #x30CF)
+    ("KATAKANA LETTER BA" #x30D0)
+    ("KATAKANA LETTER PA" #x30D1)
+    ("KATAKANA LETTER HI" #x30D2)
+    ("KATAKANA LETTER BI" #x30D3)
+    ("KATAKANA LETTER PI" #x30D4)
+    ("KATAKANA LETTER HU" #x30D5)
+    ("KATAKANA LETTER BU" #x30D6)
+    ("KATAKANA LETTER PU" #x30D7)
+    ("KATAKANA LETTER HE" #x30D8)
+    ("KATAKANA LETTER BE" #x30D9)
+    ("KATAKANA LETTER PE" #x30DA)
+    ("KATAKANA LETTER HO" #x30DB)
+    ("KATAKANA LETTER BO" #x30DC)
+    ("KATAKANA LETTER PO" #x30DD)
+    ("KATAKANA LETTER MA" #x30DE)
+    ("KATAKANA LETTER MI" #x30DF)
+    ("KATAKANA LETTER MU" #x30E0)
+    ("KATAKANA LETTER ME" #x30E1)
+    ("KATAKANA LETTER MO" #x30E2)
+    ("KATAKANA LETTER SMALL YA" #x30E3)
+    ("KATAKANA LETTER YA" #x30E4)
+    ("KATAKANA LETTER SMALL YU" #x30E5)
+    ("KATAKANA LETTER YU" #x30E6)
+    ("KATAKANA LETTER SMALL YO" #x30E7)
+    ("KATAKANA LETTER YO" #x30E8)
+    ("KATAKANA LETTER RA" #x30E9)
+    ("KATAKANA LETTER RI" #x30EA)
+    ("KATAKANA LETTER RU" #x30EB)
+    ("KATAKANA LETTER RE" #x30EC)
+    ("KATAKANA LETTER RO" #x30ED)
+    ("KATAKANA LETTER SMALL WA" #x30EE)
+    ("KATAKANA LETTER WA" #x30EF)
+    ("KATAKANA LETTER WI" #x30F0)
+    ("KATAKANA LETTER WE" #x30F1)
+    ("KATAKANA LETTER WO" #x30F2)
+    ("KATAKANA LETTER N" #x30F3)
+    ("KATAKANA LETTER VU" #x30F4)
+    ("KATAKANA LETTER SMALL KA" #x30F5)
+    ("KATAKANA LETTER SMALL KE" #x30F6)
+    ("KATAKANA LETTER VA" #x30F7)
+    ("KATAKANA LETTER VI" #x30F8)
+    ("KATAKANA LETTER VE" #x30F9)
+    ("KATAKANA LETTER VO" #x30FA)
+    ("KATAKANA MIDDLE DOT" #x30FB)
+    ("KATAKANA-HIRAGANA PROLONGED SOUND MARK" #x30FC)
+    ("KATAKANA ITERATION MARK" #x30FD)
+    ("KATAKANA VOICED ITERATION MARK" #x30FE)
+    ("KATAKANA DIGRAPH KOTO" #x30FF)
+    ))
+
+;; arch-tag: 58c48b02-037a-43f3-b225-9e9bf37a7fbd
diff --git a/etc/nxml/03100-0312F.el b/etc/nxml/03100-0312F.el
new file mode 100644 (file)
index 0000000..f7fa151
--- /dev/null
@@ -0,0 +1,44 @@
+(nxml-define-char-name-set 'bopomofo
+  '(("BOPOMOFO LETTER B" #x3105)
+    ("BOPOMOFO LETTER P" #x3106)
+    ("BOPOMOFO LETTER M" #x3107)
+    ("BOPOMOFO LETTER F" #x3108)
+    ("BOPOMOFO LETTER D" #x3109)
+    ("BOPOMOFO LETTER T" #x310A)
+    ("BOPOMOFO LETTER N" #x310B)
+    ("BOPOMOFO LETTER L" #x310C)
+    ("BOPOMOFO LETTER G" #x310D)
+    ("BOPOMOFO LETTER K" #x310E)
+    ("BOPOMOFO LETTER H" #x310F)
+    ("BOPOMOFO LETTER J" #x3110)
+    ("BOPOMOFO LETTER Q" #x3111)
+    ("BOPOMOFO LETTER X" #x3112)
+    ("BOPOMOFO LETTER ZH" #x3113)
+    ("BOPOMOFO LETTER CH" #x3114)
+    ("BOPOMOFO LETTER SH" #x3115)
+    ("BOPOMOFO LETTER R" #x3116)
+    ("BOPOMOFO LETTER Z" #x3117)
+    ("BOPOMOFO LETTER C" #x3118)
+    ("BOPOMOFO LETTER S" #x3119)
+    ("BOPOMOFO LETTER A" #x311A)
+    ("BOPOMOFO LETTER O" #x311B)
+    ("BOPOMOFO LETTER E" #x311C)
+    ("BOPOMOFO LETTER EH" #x311D)
+    ("BOPOMOFO LETTER AI" #x311E)
+    ("BOPOMOFO LETTER EI" #x311F)
+    ("BOPOMOFO LETTER AU" #x3120)
+    ("BOPOMOFO LETTER OU" #x3121)
+    ("BOPOMOFO LETTER AN" #x3122)
+    ("BOPOMOFO LETTER EN" #x3123)
+    ("BOPOMOFO LETTER ANG" #x3124)
+    ("BOPOMOFO LETTER ENG" #x3125)
+    ("BOPOMOFO LETTER ER" #x3126)
+    ("BOPOMOFO LETTER I" #x3127)
+    ("BOPOMOFO LETTER U" #x3128)
+    ("BOPOMOFO LETTER IU" #x3129)
+    ("BOPOMOFO LETTER V" #x312A)
+    ("BOPOMOFO LETTER NG" #x312B)
+    ("BOPOMOFO LETTER GN" #x312C)
+    ))
+
+;; arch-tag: 0aeb6bb4-ac93-4014-a836-eb793636a168
diff --git a/etc/nxml/03130-0318F.el b/etc/nxml/03130-0318F.el
new file mode 100644 (file)
index 0000000..8bf3334
--- /dev/null
@@ -0,0 +1,98 @@
+(nxml-define-char-name-set 'hangul-compatibility-jamo
+  '(("HANGUL LETTER KIYEOK" #x3131)
+    ("HANGUL LETTER SSANGKIYEOK" #x3132)
+    ("HANGUL LETTER KIYEOK-SIOS" #x3133)
+    ("HANGUL LETTER NIEUN" #x3134)
+    ("HANGUL LETTER NIEUN-CIEUC" #x3135)
+    ("HANGUL LETTER NIEUN-HIEUH" #x3136)
+    ("HANGUL LETTER TIKEUT" #x3137)
+    ("HANGUL LETTER SSANGTIKEUT" #x3138)
+    ("HANGUL LETTER RIEUL" #x3139)
+    ("HANGUL LETTER RIEUL-KIYEOK" #x313A)
+    ("HANGUL LETTER RIEUL-MIEUM" #x313B)
+    ("HANGUL LETTER RIEUL-PIEUP" #x313C)
+    ("HANGUL LETTER RIEUL-SIOS" #x313D)
+    ("HANGUL LETTER RIEUL-THIEUTH" #x313E)
+    ("HANGUL LETTER RIEUL-PHIEUPH" #x313F)
+    ("HANGUL LETTER RIEUL-HIEUH" #x3140)
+    ("HANGUL LETTER MIEUM" #x3141)
+    ("HANGUL LETTER PIEUP" #x3142)
+    ("HANGUL LETTER SSANGPIEUP" #x3143)
+    ("HANGUL LETTER PIEUP-SIOS" #x3144)
+    ("HANGUL LETTER SIOS" #x3145)
+    ("HANGUL LETTER SSANGSIOS" #x3146)
+    ("HANGUL LETTER IEUNG" #x3147)
+    ("HANGUL LETTER CIEUC" #x3148)
+    ("HANGUL LETTER SSANGCIEUC" #x3149)
+    ("HANGUL LETTER CHIEUCH" #x314A)
+    ("HANGUL LETTER KHIEUKH" #x314B)
+    ("HANGUL LETTER THIEUTH" #x314C)
+    ("HANGUL LETTER PHIEUPH" #x314D)
+    ("HANGUL LETTER HIEUH" #x314E)
+    ("HANGUL LETTER A" #x314F)
+    ("HANGUL LETTER AE" #x3150)
+    ("HANGUL LETTER YA" #x3151)
+    ("HANGUL LETTER YAE" #x3152)
+    ("HANGUL LETTER EO" #x3153)
+    ("HANGUL LETTER E" #x3154)
+    ("HANGUL LETTER YEO" #x3155)
+    ("HANGUL LETTER YE" #x3156)
+    ("HANGUL LETTER O" #x3157)
+    ("HANGUL LETTER WA" #x3158)
+    ("HANGUL LETTER WAE" #x3159)
+    ("HANGUL LETTER OE" #x315A)
+    ("HANGUL LETTER YO" #x315B)
+    ("HANGUL LETTER U" #x315C)
+    ("HANGUL LETTER WEO" #x315D)
+    ("HANGUL LETTER WE" #x315E)
+    ("HANGUL LETTER WI" #x315F)
+    ("HANGUL LETTER YU" #x3160)
+    ("HANGUL LETTER EU" #x3161)
+    ("HANGUL LETTER YI" #x3162)
+    ("HANGUL LETTER I" #x3163)
+    ("HANGUL FILLER" #x3164)
+    ("HANGUL LETTER SSANGNIEUN" #x3165)
+    ("HANGUL LETTER NIEUN-TIKEUT" #x3166)
+    ("HANGUL LETTER NIEUN-SIOS" #x3167)
+    ("HANGUL LETTER NIEUN-PANSIOS" #x3168)
+    ("HANGUL LETTER RIEUL-KIYEOK-SIOS" #x3169)
+    ("HANGUL LETTER RIEUL-TIKEUT" #x316A)
+    ("HANGUL LETTER RIEUL-PIEUP-SIOS" #x316B)
+    ("HANGUL LETTER RIEUL-PANSIOS" #x316C)
+    ("HANGUL LETTER RIEUL-YEORINHIEUH" #x316D)
+    ("HANGUL LETTER MIEUM-PIEUP" #x316E)
+    ("HANGUL LETTER MIEUM-SIOS" #x316F)
+    ("HANGUL LETTER MIEUM-PANSIOS" #x3170)
+    ("HANGUL LETTER KAPYEOUNMIEUM" #x3171)
+    ("HANGUL LETTER PIEUP-KIYEOK" #x3172)
+    ("HANGUL LETTER PIEUP-TIKEUT" #x3173)
+    ("HANGUL LETTER PIEUP-SIOS-KIYEOK" #x3174)
+    ("HANGUL LETTER PIEUP-SIOS-TIKEUT" #x3175)
+    ("HANGUL LETTER PIEUP-CIEUC" #x3176)
+    ("HANGUL LETTER PIEUP-THIEUTH" #x3177)
+    ("HANGUL LETTER KAPYEOUNPIEUP" #x3178)
+    ("HANGUL LETTER KAPYEOUNSSANGPIEUP" #x3179)
+    ("HANGUL LETTER SIOS-KIYEOK" #x317A)
+    ("HANGUL LETTER SIOS-NIEUN" #x317B)
+    ("HANGUL LETTER SIOS-TIKEUT" #x317C)
+    ("HANGUL LETTER SIOS-PIEUP" #x317D)
+    ("HANGUL LETTER SIOS-CIEUC" #x317E)
+    ("HANGUL LETTER PANSIOS" #x317F)
+    ("HANGUL LETTER SSANGIEUNG" #x3180)
+    ("HANGUL LETTER YESIEUNG" #x3181)
+    ("HANGUL LETTER YESIEUNG-SIOS" #x3182)
+    ("HANGUL LETTER YESIEUNG-PANSIOS" #x3183)
+    ("HANGUL LETTER KAPYEOUNPHIEUPH" #x3184)
+    ("HANGUL LETTER SSANGHIEUH" #x3185)
+    ("HANGUL LETTER YEORINHIEUH" #x3186)
+    ("HANGUL LETTER YO-YA" #x3187)
+    ("HANGUL LETTER YO-YAE" #x3188)
+    ("HANGUL LETTER YO-I" #x3189)
+    ("HANGUL LETTER YU-YEO" #x318A)
+    ("HANGUL LETTER YU-YE" #x318B)
+    ("HANGUL LETTER YU-I" #x318C)
+    ("HANGUL LETTER ARAEA" #x318D)
+    ("HANGUL LETTER ARAEAE" #x318E)
+    ))
+
+;; arch-tag: 3ea3aa1e-8551-433b-8506-9591ed150673
diff --git a/etc/nxml/03190-0319F.el b/etc/nxml/03190-0319F.el
new file mode 100644 (file)
index 0000000..1fe8f16
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'kanbun
+  '(("IDEOGRAPHIC ANNOTATION LINKING MARK" #x3190)
+    ("IDEOGRAPHIC ANNOTATION REVERSE MARK" #x3191)
+    ("IDEOGRAPHIC ANNOTATION ONE MARK" #x3192)
+    ("IDEOGRAPHIC ANNOTATION TWO MARK" #x3193)
+    ("IDEOGRAPHIC ANNOTATION THREE MARK" #x3194)
+    ("IDEOGRAPHIC ANNOTATION FOUR MARK" #x3195)
+    ("IDEOGRAPHIC ANNOTATION TOP MARK" #x3196)
+    ("IDEOGRAPHIC ANNOTATION MIDDLE MARK" #x3197)
+    ("IDEOGRAPHIC ANNOTATION BOTTOM MARK" #x3198)
+    ("IDEOGRAPHIC ANNOTATION FIRST MARK" #x3199)
+    ("IDEOGRAPHIC ANNOTATION SECOND MARK" #x319A)
+    ("IDEOGRAPHIC ANNOTATION THIRD MARK" #x319B)
+    ("IDEOGRAPHIC ANNOTATION FOURTH MARK" #x319C)
+    ("IDEOGRAPHIC ANNOTATION HEAVEN MARK" #x319D)
+    ("IDEOGRAPHIC ANNOTATION EARTH MARK" #x319E)
+    ("IDEOGRAPHIC ANNOTATION MAN MARK" #x319F)
+    ))
+
+;; arch-tag: e25f7331-0993-4daf-a193-0fe56332f9fa
diff --git a/etc/nxml/031A0-031BF.el b/etc/nxml/031A0-031BF.el
new file mode 100644 (file)
index 0000000..0119b7e
--- /dev/null
@@ -0,0 +1,28 @@
+(nxml-define-char-name-set 'bopomofo-extended
+  '(("BOPOMOFO LETTER BU" #x31A0)
+    ("BOPOMOFO LETTER ZI" #x31A1)
+    ("BOPOMOFO LETTER JI" #x31A2)
+    ("BOPOMOFO LETTER GU" #x31A3)
+    ("BOPOMOFO LETTER EE" #x31A4)
+    ("BOPOMOFO LETTER ENN" #x31A5)
+    ("BOPOMOFO LETTER OO" #x31A6)
+    ("BOPOMOFO LETTER ONN" #x31A7)
+    ("BOPOMOFO LETTER IR" #x31A8)
+    ("BOPOMOFO LETTER ANN" #x31A9)
+    ("BOPOMOFO LETTER INN" #x31AA)
+    ("BOPOMOFO LETTER UNN" #x31AB)
+    ("BOPOMOFO LETTER IM" #x31AC)
+    ("BOPOMOFO LETTER NGG" #x31AD)
+    ("BOPOMOFO LETTER AINN" #x31AE)
+    ("BOPOMOFO LETTER AUNN" #x31AF)
+    ("BOPOMOFO LETTER AM" #x31B0)
+    ("BOPOMOFO LETTER OM" #x31B1)
+    ("BOPOMOFO LETTER ONG" #x31B2)
+    ("BOPOMOFO LETTER INNN" #x31B3)
+    ("BOPOMOFO FINAL LETTER P" #x31B4)
+    ("BOPOMOFO FINAL LETTER T" #x31B5)
+    ("BOPOMOFO FINAL LETTER K" #x31B6)
+    ("BOPOMOFO FINAL LETTER H" #x31B7)
+    ))
+
+;; arch-tag: 1821baca-d463-4e8e-bf3d-97a35af58fd4
diff --git a/etc/nxml/031F0-031FF.el b/etc/nxml/031F0-031FF.el
new file mode 100644 (file)
index 0000000..125d12d
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'katakana-phonetic-extensions
+  '(("KATAKANA LETTER SMALL KU" #x31F0)
+    ("KATAKANA LETTER SMALL SI" #x31F1)
+    ("KATAKANA LETTER SMALL SU" #x31F2)
+    ("KATAKANA LETTER SMALL TO" #x31F3)
+    ("KATAKANA LETTER SMALL NU" #x31F4)
+    ("KATAKANA LETTER SMALL HA" #x31F5)
+    ("KATAKANA LETTER SMALL HI" #x31F6)
+    ("KATAKANA LETTER SMALL HU" #x31F7)
+    ("KATAKANA LETTER SMALL HE" #x31F8)
+    ("KATAKANA LETTER SMALL HO" #x31F9)
+    ("KATAKANA LETTER SMALL MU" #x31FA)
+    ("KATAKANA LETTER SMALL RA" #x31FB)
+    ("KATAKANA LETTER SMALL RI" #x31FC)
+    ("KATAKANA LETTER SMALL RU" #x31FD)
+    ("KATAKANA LETTER SMALL RE" #x31FE)
+    ("KATAKANA LETTER SMALL RO" #x31FF)
+    ))
+
+;; arch-tag: 090acfb7-1a46-4b05-bebb-573bbc0d8a82
diff --git a/etc/nxml/03200-032FF.el b/etc/nxml/03200-032FF.el
new file mode 100644 (file)
index 0000000..8b8c84e
--- /dev/null
@@ -0,0 +1,236 @@
+(nxml-define-char-name-set 'enclosed-cjk-letters-and-months
+  '(("PARENTHESIZED HANGUL KIYEOK" #x3200)
+    ("PARENTHESIZED HANGUL NIEUN" #x3201)
+    ("PARENTHESIZED HANGUL TIKEUT" #x3202)
+    ("PARENTHESIZED HANGUL RIEUL" #x3203)
+    ("PARENTHESIZED HANGUL MIEUM" #x3204)
+    ("PARENTHESIZED HANGUL PIEUP" #x3205)
+    ("PARENTHESIZED HANGUL SIOS" #x3206)
+    ("PARENTHESIZED HANGUL IEUNG" #x3207)
+    ("PARENTHESIZED HANGUL CIEUC" #x3208)
+    ("PARENTHESIZED HANGUL CHIEUCH" #x3209)
+    ("PARENTHESIZED HANGUL KHIEUKH" #x320A)
+    ("PARENTHESIZED HANGUL THIEUTH" #x320B)
+    ("PARENTHESIZED HANGUL PHIEUPH" #x320C)
+    ("PARENTHESIZED HANGUL HIEUH" #x320D)
+    ("PARENTHESIZED HANGUL KIYEOK A" #x320E)
+    ("PARENTHESIZED HANGUL NIEUN A" #x320F)
+    ("PARENTHESIZED HANGUL TIKEUT A" #x3210)
+    ("PARENTHESIZED HANGUL RIEUL A" #x3211)
+    ("PARENTHESIZED HANGUL MIEUM A" #x3212)
+    ("PARENTHESIZED HANGUL PIEUP A" #x3213)
+    ("PARENTHESIZED HANGUL SIOS A" #x3214)
+    ("PARENTHESIZED HANGUL IEUNG A" #x3215)
+    ("PARENTHESIZED HANGUL CIEUC A" #x3216)
+    ("PARENTHESIZED HANGUL CHIEUCH A" #x3217)
+    ("PARENTHESIZED HANGUL KHIEUKH A" #x3218)
+    ("PARENTHESIZED HANGUL THIEUTH A" #x3219)
+    ("PARENTHESIZED HANGUL PHIEUPH A" #x321A)
+    ("PARENTHESIZED HANGUL HIEUH A" #x321B)
+    ("PARENTHESIZED HANGUL CIEUC U" #x321C)
+    ("PARENTHESIZED IDEOGRAPH ONE" #x3220)
+    ("PARENTHESIZED IDEOGRAPH TWO" #x3221)
+    ("PARENTHESIZED IDEOGRAPH THREE" #x3222)
+    ("PARENTHESIZED IDEOGRAPH FOUR" #x3223)
+    ("PARENTHESIZED IDEOGRAPH FIVE" #x3224)
+    ("PARENTHESIZED IDEOGRAPH SIX" #x3225)
+    ("PARENTHESIZED IDEOGRAPH SEVEN" #x3226)
+    ("PARENTHESIZED IDEOGRAPH EIGHT" #x3227)
+    ("PARENTHESIZED IDEOGRAPH NINE" #x3228)
+    ("PARENTHESIZED IDEOGRAPH TEN" #x3229)
+    ("PARENTHESIZED IDEOGRAPH MOON" #x322A)
+    ("PARENTHESIZED IDEOGRAPH FIRE" #x322B)
+    ("PARENTHESIZED IDEOGRAPH WATER" #x322C)
+    ("PARENTHESIZED IDEOGRAPH WOOD" #x322D)
+    ("PARENTHESIZED IDEOGRAPH METAL" #x322E)
+    ("PARENTHESIZED IDEOGRAPH EARTH" #x322F)
+    ("PARENTHESIZED IDEOGRAPH SUN" #x3230)
+    ("PARENTHESIZED IDEOGRAPH STOCK" #x3231)
+    ("PARENTHESIZED IDEOGRAPH HAVE" #x3232)
+    ("PARENTHESIZED IDEOGRAPH SOCIETY" #x3233)
+    ("PARENTHESIZED IDEOGRAPH NAME" #x3234)
+    ("PARENTHESIZED IDEOGRAPH SPECIAL" #x3235)
+    ("PARENTHESIZED IDEOGRAPH FINANCIAL" #x3236)
+    ("PARENTHESIZED IDEOGRAPH CONGRATULATION" #x3237)
+    ("PARENTHESIZED IDEOGRAPH LABOR" #x3238)
+    ("PARENTHESIZED IDEOGRAPH REPRESENT" #x3239)
+    ("PARENTHESIZED IDEOGRAPH CALL" #x323A)
+    ("PARENTHESIZED IDEOGRAPH STUDY" #x323B)
+    ("PARENTHESIZED IDEOGRAPH SUPERVISE" #x323C)
+    ("PARENTHESIZED IDEOGRAPH ENTERPRISE" #x323D)
+    ("PARENTHESIZED IDEOGRAPH RESOURCE" #x323E)
+    ("PARENTHESIZED IDEOGRAPH ALLIANCE" #x323F)
+    ("PARENTHESIZED IDEOGRAPH FESTIVAL" #x3240)
+    ("PARENTHESIZED IDEOGRAPH REST" #x3241)
+    ("PARENTHESIZED IDEOGRAPH SELF" #x3242)
+    ("PARENTHESIZED IDEOGRAPH REACH" #x3243)
+    ("CIRCLED NUMBER TWENTY ONE" #x3251)
+    ("CIRCLED NUMBER TWENTY TWO" #x3252)
+    ("CIRCLED NUMBER TWENTY THREE" #x3253)
+    ("CIRCLED NUMBER TWENTY FOUR" #x3254)
+    ("CIRCLED NUMBER TWENTY FIVE" #x3255)
+    ("CIRCLED NUMBER TWENTY SIX" #x3256)
+    ("CIRCLED NUMBER TWENTY SEVEN" #x3257)
+    ("CIRCLED NUMBER TWENTY EIGHT" #x3258)
+    ("CIRCLED NUMBER TWENTY NINE" #x3259)
+    ("CIRCLED NUMBER THIRTY" #x325A)
+    ("CIRCLED NUMBER THIRTY ONE" #x325B)
+    ("CIRCLED NUMBER THIRTY TWO" #x325C)
+    ("CIRCLED NUMBER THIRTY THREE" #x325D)
+    ("CIRCLED NUMBER THIRTY FOUR" #x325E)
+    ("CIRCLED NUMBER THIRTY FIVE" #x325F)
+    ("CIRCLED HANGUL KIYEOK" #x3260)
+    ("CIRCLED HANGUL NIEUN" #x3261)
+    ("CIRCLED HANGUL TIKEUT" #x3262)
+    ("CIRCLED HANGUL RIEUL" #x3263)
+    ("CIRCLED HANGUL MIEUM" #x3264)
+    ("CIRCLED HANGUL PIEUP" #x3265)
+    ("CIRCLED HANGUL SIOS" #x3266)
+    ("CIRCLED HANGUL IEUNG" #x3267)
+    ("CIRCLED HANGUL CIEUC" #x3268)
+    ("CIRCLED HANGUL CHIEUCH" #x3269)
+    ("CIRCLED HANGUL KHIEUKH" #x326A)
+    ("CIRCLED HANGUL THIEUTH" #x326B)
+    ("CIRCLED HANGUL PHIEUPH" #x326C)
+    ("CIRCLED HANGUL HIEUH" #x326D)
+    ("CIRCLED HANGUL KIYEOK A" #x326E)
+    ("CIRCLED HANGUL NIEUN A" #x326F)
+    ("CIRCLED HANGUL TIKEUT A" #x3270)
+    ("CIRCLED HANGUL RIEUL A" #x3271)
+    ("CIRCLED HANGUL MIEUM A" #x3272)
+    ("CIRCLED HANGUL PIEUP A" #x3273)
+    ("CIRCLED HANGUL SIOS A" #x3274)
+    ("CIRCLED HANGUL IEUNG A" #x3275)
+    ("CIRCLED HANGUL CIEUC A" #x3276)
+    ("CIRCLED HANGUL CHIEUCH A" #x3277)
+    ("CIRCLED HANGUL KHIEUKH A" #x3278)
+    ("CIRCLED HANGUL THIEUTH A" #x3279)
+    ("CIRCLED HANGUL PHIEUPH A" #x327A)
+    ("CIRCLED HANGUL HIEUH A" #x327B)
+    ("KOREAN STANDARD SYMBOL" #x327F)
+    ("CIRCLED IDEOGRAPH ONE" #x3280)
+    ("CIRCLED IDEOGRAPH TWO" #x3281)
+    ("CIRCLED IDEOGRAPH THREE" #x3282)
+    ("CIRCLED IDEOGRAPH FOUR" #x3283)
+    ("CIRCLED IDEOGRAPH FIVE" #x3284)
+    ("CIRCLED IDEOGRAPH SIX" #x3285)
+    ("CIRCLED IDEOGRAPH SEVEN" #x3286)
+    ("CIRCLED IDEOGRAPH EIGHT" #x3287)
+    ("CIRCLED IDEOGRAPH NINE" #x3288)
+    ("CIRCLED IDEOGRAPH TEN" #x3289)
+    ("CIRCLED IDEOGRAPH MOON" #x328A)
+    ("CIRCLED IDEOGRAPH FIRE" #x328B)
+    ("CIRCLED IDEOGRAPH WATER" #x328C)
+    ("CIRCLED IDEOGRAPH WOOD" #x328D)
+    ("CIRCLED IDEOGRAPH METAL" #x328E)
+    ("CIRCLED IDEOGRAPH EARTH" #x328F)
+    ("CIRCLED IDEOGRAPH SUN" #x3290)
+    ("CIRCLED IDEOGRAPH STOCK" #x3291)
+    ("CIRCLED IDEOGRAPH HAVE" #x3292)
+    ("CIRCLED IDEOGRAPH SOCIETY" #x3293)
+    ("CIRCLED IDEOGRAPH NAME" #x3294)
+    ("CIRCLED IDEOGRAPH SPECIAL" #x3295)
+    ("CIRCLED IDEOGRAPH FINANCIAL" #x3296)
+    ("CIRCLED IDEOGRAPH CONGRATULATION" #x3297)
+    ("CIRCLED IDEOGRAPH LABOR" #x3298)
+    ("CIRCLED IDEOGRAPH SECRET" #x3299)
+    ("CIRCLED IDEOGRAPH MALE" #x329A)
+    ("CIRCLED IDEOGRAPH FEMALE" #x329B)
+    ("CIRCLED IDEOGRAPH SUITABLE" #x329C)
+    ("CIRCLED IDEOGRAPH EXCELLENT" #x329D)
+    ("CIRCLED IDEOGRAPH PRINT" #x329E)
+    ("CIRCLED IDEOGRAPH ATTENTION" #x329F)
+    ("CIRCLED IDEOGRAPH ITEM" #x32A0)
+    ("CIRCLED IDEOGRAPH REST" #x32A1)
+    ("CIRCLED IDEOGRAPH COPY" #x32A2)
+    ("CIRCLED IDEOGRAPH CORRECT" #x32A3)
+    ("CIRCLED IDEOGRAPH HIGH" #x32A4)
+    ("CIRCLED IDEOGRAPH CENTRE" #x32A5)
+    ("CIRCLED IDEOGRAPH LOW" #x32A6)
+    ("CIRCLED IDEOGRAPH LEFT" #x32A7)
+    ("CIRCLED IDEOGRAPH RIGHT" #x32A8)
+    ("CIRCLED IDEOGRAPH MEDICINE" #x32A9)
+    ("CIRCLED IDEOGRAPH RELIGION" #x32AA)
+    ("CIRCLED IDEOGRAPH STUDY" #x32AB)
+    ("CIRCLED IDEOGRAPH SUPERVISE" #x32AC)
+    ("CIRCLED IDEOGRAPH ENTERPRISE" #x32AD)
+    ("CIRCLED IDEOGRAPH RESOURCE" #x32AE)
+    ("CIRCLED IDEOGRAPH ALLIANCE" #x32AF)
+    ("CIRCLED IDEOGRAPH NIGHT" #x32B0)
+    ("CIRCLED NUMBER THIRTY SIX" #x32B1)
+    ("CIRCLED NUMBER THIRTY SEVEN" #x32B2)
+    ("CIRCLED NUMBER THIRTY EIGHT" #x32B3)
+    ("CIRCLED NUMBER THIRTY NINE" #x32B4)
+    ("CIRCLED NUMBER FORTY" #x32B5)
+    ("CIRCLED NUMBER FORTY ONE" #x32B6)
+    ("CIRCLED NUMBER FORTY TWO" #x32B7)
+    ("CIRCLED NUMBER FORTY THREE" #x32B8)
+    ("CIRCLED NUMBER FORTY FOUR" #x32B9)
+    ("CIRCLED NUMBER FORTY FIVE" #x32BA)
+    ("CIRCLED NUMBER FORTY SIX" #x32BB)
+    ("CIRCLED NUMBER FORTY SEVEN" #x32BC)
+    ("CIRCLED NUMBER FORTY EIGHT" #x32BD)
+    ("CIRCLED NUMBER FORTY NINE" #x32BE)
+    ("CIRCLED NUMBER FIFTY" #x32BF)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY" #x32C0)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY" #x32C1)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH" #x32C2)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL" #x32C3)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY" #x32C4)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE" #x32C5)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY" #x32C6)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST" #x32C7)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER" #x32C8)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER" #x32C9)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER" #x32CA)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER" #x32CB)
+    ("CIRCLED KATAKANA A" #x32D0)
+    ("CIRCLED KATAKANA I" #x32D1)
+    ("CIRCLED KATAKANA U" #x32D2)
+    ("CIRCLED KATAKANA E" #x32D3)
+    ("CIRCLED KATAKANA O" #x32D4)
+    ("CIRCLED KATAKANA KA" #x32D5)
+    ("CIRCLED KATAKANA KI" #x32D6)
+    ("CIRCLED KATAKANA KU" #x32D7)
+    ("CIRCLED KATAKANA KE" #x32D8)
+    ("CIRCLED KATAKANA KO" #x32D9)
+    ("CIRCLED KATAKANA SA" #x32DA)
+    ("CIRCLED KATAKANA SI" #x32DB)
+    ("CIRCLED KATAKANA SU" #x32DC)
+    ("CIRCLED KATAKANA SE" #x32DD)
+    ("CIRCLED KATAKANA SO" #x32DE)
+    ("CIRCLED KATAKANA TA" #x32DF)
+    ("CIRCLED KATAKANA TI" #x32E0)
+    ("CIRCLED KATAKANA TU" #x32E1)
+    ("CIRCLED KATAKANA TE" #x32E2)
+    ("CIRCLED KATAKANA TO" #x32E3)
+    ("CIRCLED KATAKANA NA" #x32E4)
+    ("CIRCLED KATAKANA NI" #x32E5)
+    ("CIRCLED KATAKANA NU" #x32E6)
+    ("CIRCLED KATAKANA NE" #x32E7)
+    ("CIRCLED KATAKANA NO" #x32E8)
+    ("CIRCLED KATAKANA HA" #x32E9)
+    ("CIRCLED KATAKANA HI" #x32EA)
+    ("CIRCLED KATAKANA HU" #x32EB)
+    ("CIRCLED KATAKANA HE" #x32EC)
+    ("CIRCLED KATAKANA HO" #x32ED)
+    ("CIRCLED KATAKANA MA" #x32EE)
+    ("CIRCLED KATAKANA MI" #x32EF)
+    ("CIRCLED KATAKANA MU" #x32F0)
+    ("CIRCLED KATAKANA ME" #x32F1)
+    ("CIRCLED KATAKANA MO" #x32F2)
+    ("CIRCLED KATAKANA YA" #x32F3)
+    ("CIRCLED KATAKANA YU" #x32F4)
+    ("CIRCLED KATAKANA YO" #x32F5)
+    ("CIRCLED KATAKANA RA" #x32F6)
+    ("CIRCLED KATAKANA RI" #x32F7)
+    ("CIRCLED KATAKANA RU" #x32F8)
+    ("CIRCLED KATAKANA RE" #x32F9)
+    ("CIRCLED KATAKANA RO" #x32FA)
+    ("CIRCLED KATAKANA WA" #x32FB)
+    ("CIRCLED KATAKANA WI" #x32FC)
+    ("CIRCLED KATAKANA WE" #x32FD)
+    ("CIRCLED KATAKANA WO" #x32FE)
+    ))
+
+;; arch-tag: 56d35bfa-c41b-4779-be54-3999fbe11265
diff --git a/etc/nxml/03300-033FF.el b/etc/nxml/03300-033FF.el
new file mode 100644 (file)
index 0000000..acf2b68
--- /dev/null
@@ -0,0 +1,253 @@
+(nxml-define-char-name-set 'cjk-compatibility
+  '(("SQUARE APAATO" #x3300)
+    ("SQUARE ARUHUA" #x3301)
+    ("SQUARE ANPEA" #x3302)
+    ("SQUARE AARU" #x3303)
+    ("SQUARE ININGU" #x3304)
+    ("SQUARE INTI" #x3305)
+    ("SQUARE UON" #x3306)
+    ("SQUARE ESUKUUDO" #x3307)
+    ("SQUARE EEKAA" #x3308)
+    ("SQUARE ONSU" #x3309)
+    ("SQUARE OOMU" #x330A)
+    ("SQUARE KAIRI" #x330B)
+    ("SQUARE KARATTO" #x330C)
+    ("SQUARE KARORII" #x330D)
+    ("SQUARE GARON" #x330E)
+    ("SQUARE GANMA" #x330F)
+    ("SQUARE GIGA" #x3310)
+    ("SQUARE GINII" #x3311)
+    ("SQUARE KYURII" #x3312)
+    ("SQUARE GIRUDAA" #x3313)
+    ("SQUARE KIRO" #x3314)
+    ("SQUARE KIROGURAMU" #x3315)
+    ("SQUARE KIROMEETORU" #x3316)
+    ("SQUARE KIROWATTO" #x3317)
+    ("SQUARE GURAMU" #x3318)
+    ("SQUARE GURAMUTON" #x3319)
+    ("SQUARE KURUZEIRO" #x331A)
+    ("SQUARE KUROONE" #x331B)
+    ("SQUARE KEESU" #x331C)
+    ("SQUARE KORUNA" #x331D)
+    ("SQUARE KOOPO" #x331E)
+    ("SQUARE SAIKURU" #x331F)
+    ("SQUARE SANTIIMU" #x3320)
+    ("SQUARE SIRINGU" #x3321)
+    ("SQUARE SENTI" #x3322)
+    ("SQUARE SENTO" #x3323)
+    ("SQUARE DAASU" #x3324)
+    ("SQUARE DESI" #x3325)
+    ("SQUARE DORU" #x3326)
+    ("SQUARE TON" #x3327)
+    ("SQUARE NANO" #x3328)
+    ("SQUARE NOTTO" #x3329)
+    ("SQUARE HAITU" #x332A)
+    ("SQUARE PAASENTO" #x332B)
+    ("SQUARE PAATU" #x332C)
+    ("SQUARE BAARERU" #x332D)
+    ("SQUARE PIASUTORU" #x332E)
+    ("SQUARE PIKURU" #x332F)
+    ("SQUARE PIKO" #x3330)
+    ("SQUARE BIRU" #x3331)
+    ("SQUARE HUARADDO" #x3332)
+    ("SQUARE HUIITO" #x3333)
+    ("SQUARE BUSSYERU" #x3334)
+    ("SQUARE HURAN" #x3335)
+    ("SQUARE HEKUTAARU" #x3336)
+    ("SQUARE PESO" #x3337)
+    ("SQUARE PENIHI" #x3338)
+    ("SQUARE HERUTU" #x3339)
+    ("SQUARE PENSU" #x333A)
+    ("SQUARE PEEZI" #x333B)
+    ("SQUARE BEETA" #x333C)
+    ("SQUARE POINTO" #x333D)
+    ("SQUARE BORUTO" #x333E)
+    ("SQUARE HON" #x333F)
+    ("SQUARE PONDO" #x3340)
+    ("SQUARE HOORU" #x3341)
+    ("SQUARE HOON" #x3342)
+    ("SQUARE MAIKURO" #x3343)
+    ("SQUARE MAIRU" #x3344)
+    ("SQUARE MAHHA" #x3345)
+    ("SQUARE MARUKU" #x3346)
+    ("SQUARE MANSYON" #x3347)
+    ("SQUARE MIKURON" #x3348)
+    ("SQUARE MIRI" #x3349)
+    ("SQUARE MIRIBAARU" #x334A)
+    ("SQUARE MEGA" #x334B)
+    ("SQUARE MEGATON" #x334C)
+    ("SQUARE MEETORU" #x334D)
+    ("SQUARE YAADO" #x334E)
+    ("SQUARE YAARU" #x334F)
+    ("SQUARE YUAN" #x3350)
+    ("SQUARE RITTORU" #x3351)
+    ("SQUARE RIRA" #x3352)
+    ("SQUARE RUPII" #x3353)
+    ("SQUARE RUUBURU" #x3354)
+    ("SQUARE REMU" #x3355)
+    ("SQUARE RENTOGEN" #x3356)
+    ("SQUARE WATTO" #x3357)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO" #x3358)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE" #x3359)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO" #x335A)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE" #x335B)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR" #x335C)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE" #x335D)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX" #x335E)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN" #x335F)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT" #x3360)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE" #x3361)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN" #x3362)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN" #x3363)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE" #x3364)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN" #x3365)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN" #x3366)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN" #x3367)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN" #x3368)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN" #x3369)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN" #x336A)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN" #x336B)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY" #x336C)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE" #x336D)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO" #x336E)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE" #x336F)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR" #x3370)
+    ("SQUARE HPA" #x3371)
+    ("SQUARE DA" #x3372)
+    ("SQUARE AU" #x3373)
+    ("SQUARE BAR" #x3374)
+    ("SQUARE OV" #x3375)
+    ("SQUARE PC" #x3376)
+    ("SQUARE ERA NAME HEISEI" #x337B)
+    ("SQUARE ERA NAME SYOUWA" #x337C)
+    ("SQUARE ERA NAME TAISYOU" #x337D)
+    ("SQUARE ERA NAME MEIZI" #x337E)
+    ("SQUARE CORPORATION" #x337F)
+    ("SQUARE PA AMPS" #x3380)
+    ("SQUARE NA" #x3381)
+    ("SQUARE MU A" #x3382)
+    ("SQUARE MA" #x3383)
+    ("SQUARE KA" #x3384)
+    ("SQUARE KB" #x3385)
+    ("SQUARE MB" #x3386)
+    ("SQUARE GB" #x3387)
+    ("SQUARE CAL" #x3388)
+    ("SQUARE KCAL" #x3389)
+    ("SQUARE PF" #x338A)
+    ("SQUARE NF" #x338B)
+    ("SQUARE MU F" #x338C)
+    ("SQUARE MU G" #x338D)
+    ("SQUARE MG" #x338E)
+    ("SQUARE KG" #x338F)
+    ("SQUARE HZ" #x3390)
+    ("SQUARE KHZ" #x3391)
+    ("SQUARE MHZ" #x3392)
+    ("SQUARE GHZ" #x3393)
+    ("SQUARE THZ" #x3394)
+    ("SQUARE MU L" #x3395)
+    ("SQUARE ML" #x3396)
+    ("SQUARE DL" #x3397)
+    ("SQUARE KL" #x3398)
+    ("SQUARE FM" #x3399)
+    ("SQUARE NM" #x339A)
+    ("SQUARE MU M" #x339B)
+    ("SQUARE MM" #x339C)
+    ("SQUARE CM" #x339D)
+    ("SQUARE KM" #x339E)
+    ("SQUARE MM SQUARED" #x339F)
+    ("SQUARE CM SQUARED" #x33A0)
+    ("SQUARE M SQUARED" #x33A1)
+    ("SQUARE KM SQUARED" #x33A2)
+    ("SQUARE MM CUBED" #x33A3)
+    ("SQUARE CM CUBED" #x33A4)
+    ("SQUARE M CUBED" #x33A5)
+    ("SQUARE KM CUBED" #x33A6)
+    ("SQUARE M OVER S" #x33A7)
+    ("SQUARE M OVER S SQUARED" #x33A8)
+    ("SQUARE PA" #x33A9)
+    ("SQUARE KPA" #x33AA)
+    ("SQUARE MPA" #x33AB)
+    ("SQUARE GPA" #x33AC)
+    ("SQUARE RAD" #x33AD)
+    ("SQUARE RAD OVER S" #x33AE)
+    ("SQUARE RAD OVER S SQUARED" #x33AF)
+    ("SQUARE PS" #x33B0)
+    ("SQUARE NS" #x33B1)
+    ("SQUARE MU S" #x33B2)
+    ("SQUARE MS" #x33B3)
+    ("SQUARE PV" #x33B4)
+    ("SQUARE NV" #x33B5)
+    ("SQUARE MU V" #x33B6)
+    ("SQUARE MV" #x33B7)
+    ("SQUARE KV" #x33B8)
+    ("SQUARE MV MEGA" #x33B9)
+    ("SQUARE PW" #x33BA)
+    ("SQUARE NW" #x33BB)
+    ("SQUARE MU W" #x33BC)
+    ("SQUARE MW" #x33BD)
+    ("SQUARE KW" #x33BE)
+    ("SQUARE MW MEGA" #x33BF)
+    ("SQUARE K OHM" #x33C0)
+    ("SQUARE M OHM" #x33C1)
+    ("SQUARE AM" #x33C2)
+    ("SQUARE BQ" #x33C3)
+    ("SQUARE CC" #x33C4)
+    ("SQUARE CD" #x33C5)
+    ("SQUARE C OVER KG" #x33C6)
+    ("SQUARE CO" #x33C7)
+    ("SQUARE DB" #x33C8)
+    ("SQUARE GY" #x33C9)
+    ("SQUARE HA" #x33CA)
+    ("SQUARE HP" #x33CB)
+    ("SQUARE IN" #x33CC)
+    ("SQUARE KK" #x33CD)
+    ("SQUARE KM CAPITAL" #x33CE)
+    ("SQUARE KT" #x33CF)
+    ("SQUARE LM" #x33D0)
+    ("SQUARE LN" #x33D1)
+    ("SQUARE LOG" #x33D2)
+    ("SQUARE LX" #x33D3)
+    ("SQUARE MB SMALL" #x33D4)
+    ("SQUARE MIL" #x33D5)
+    ("SQUARE MOL" #x33D6)
+    ("SQUARE PH" #x33D7)
+    ("SQUARE PM" #x33D8)
+    ("SQUARE PPM" #x33D9)
+    ("SQUARE PR" #x33DA)
+    ("SQUARE SR" #x33DB)
+    ("SQUARE SV" #x33DC)
+    ("SQUARE WB" #x33DD)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE" #x33E0)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO" #x33E1)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE" #x33E2)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR" #x33E3)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE" #x33E4)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX" #x33E5)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN" #x33E6)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT" #x33E7)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE" #x33E8)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN" #x33E9)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN" #x33EA)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE" #x33EB)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN" #x33EC)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN" #x33ED)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN" #x33EE)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN" #x33EF)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN" #x33F0)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN" #x33F1)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN" #x33F2)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY" #x33F3)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE" #x33F4)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO" #x33F5)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE" #x33F6)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR" #x33F7)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE" #x33F8)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX" #x33F9)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN" #x33FA)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT" #x33FB)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE" #x33FC)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY" #x33FD)
+    ("IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE" #x33FE)
+    ))
+
+;; arch-tag: 818090a1-7854-485f-80bc-97e89f733e75
diff --git a/etc/nxml/03400-04DBF.el b/etc/nxml/03400-04DBF.el
new file mode 100644 (file)
index 0000000..45d6911
--- /dev/null
@@ -0,0 +1,4 @@
+(nxml-define-char-name-set 'cjk-unified-ideographs-extension-a
+  '())
+
+;; arch-tag: 571a41a5-7cc5-47c4-b98c-e98a415723bb
diff --git a/etc/nxml/0A000-0A48F.el b/etc/nxml/0A000-0A48F.el
new file mode 100644 (file)
index 0000000..9c54d94
--- /dev/null
@@ -0,0 +1,1169 @@
+(nxml-define-char-name-set 'yi-syllables
+  '(("YI SYLLABLE IT" #xA000)
+    ("YI SYLLABLE IX" #xA001)
+    ("YI SYLLABLE I" #xA002)
+    ("YI SYLLABLE IP" #xA003)
+    ("YI SYLLABLE IET" #xA004)
+    ("YI SYLLABLE IEX" #xA005)
+    ("YI SYLLABLE IE" #xA006)
+    ("YI SYLLABLE IEP" #xA007)
+    ("YI SYLLABLE AT" #xA008)
+    ("YI SYLLABLE AX" #xA009)
+    ("YI SYLLABLE A" #xA00A)
+    ("YI SYLLABLE AP" #xA00B)
+    ("YI SYLLABLE UOX" #xA00C)
+    ("YI SYLLABLE UO" #xA00D)
+    ("YI SYLLABLE UOP" #xA00E)
+    ("YI SYLLABLE OT" #xA00F)
+    ("YI SYLLABLE OX" #xA010)
+    ("YI SYLLABLE O" #xA011)
+    ("YI SYLLABLE OP" #xA012)
+    ("YI SYLLABLE EX" #xA013)
+    ("YI SYLLABLE E" #xA014)
+    ("YI SYLLABLE WU" #xA015)
+    ("YI SYLLABLE BIT" #xA016)
+    ("YI SYLLABLE BIX" #xA017)
+    ("YI SYLLABLE BI" #xA018)
+    ("YI SYLLABLE BIP" #xA019)
+    ("YI SYLLABLE BIET" #xA01A)
+    ("YI SYLLABLE BIEX" #xA01B)
+    ("YI SYLLABLE BIE" #xA01C)
+    ("YI SYLLABLE BIEP" #xA01D)
+    ("YI SYLLABLE BAT" #xA01E)
+    ("YI SYLLABLE BAX" #xA01F)
+    ("YI SYLLABLE BA" #xA020)
+    ("YI SYLLABLE BAP" #xA021)
+    ("YI SYLLABLE BUOX" #xA022)
+    ("YI SYLLABLE BUO" #xA023)
+    ("YI SYLLABLE BUOP" #xA024)
+    ("YI SYLLABLE BOT" #xA025)
+    ("YI SYLLABLE BOX" #xA026)
+    ("YI SYLLABLE BO" #xA027)
+    ("YI SYLLABLE BOP" #xA028)
+    ("YI SYLLABLE BEX" #xA029)
+    ("YI SYLLABLE BE" #xA02A)
+    ("YI SYLLABLE BEP" #xA02B)
+    ("YI SYLLABLE BUT" #xA02C)
+    ("YI SYLLABLE BUX" #xA02D)
+    ("YI SYLLABLE BU" #xA02E)
+    ("YI SYLLABLE BUP" #xA02F)
+    ("YI SYLLABLE BURX" #xA030)
+    ("YI SYLLABLE BUR" #xA031)
+    ("YI SYLLABLE BYT" #xA032)
+    ("YI SYLLABLE BYX" #xA033)
+    ("YI SYLLABLE BY" #xA034)
+    ("YI SYLLABLE BYP" #xA035)
+    ("YI SYLLABLE BYRX" #xA036)
+    ("YI SYLLABLE BYR" #xA037)
+    ("YI SYLLABLE PIT" #xA038)
+    ("YI SYLLABLE PIX" #xA039)
+    ("YI SYLLABLE PI" #xA03A)
+    ("YI SYLLABLE PIP" #xA03B)
+    ("YI SYLLABLE PIEX" #xA03C)
+    ("YI SYLLABLE PIE" #xA03D)
+    ("YI SYLLABLE PIEP" #xA03E)
+    ("YI SYLLABLE PAT" #xA03F)
+    ("YI SYLLABLE PAX" #xA040)
+    ("YI SYLLABLE PA" #xA041)
+    ("YI SYLLABLE PAP" #xA042)
+    ("YI SYLLABLE PUOX" #xA043)
+    ("YI SYLLABLE PUO" #xA044)
+    ("YI SYLLABLE PUOP" #xA045)
+    ("YI SYLLABLE POT" #xA046)
+    ("YI SYLLABLE POX" #xA047)
+    ("YI SYLLABLE PO" #xA048)
+    ("YI SYLLABLE POP" #xA049)
+    ("YI SYLLABLE PUT" #xA04A)
+    ("YI SYLLABLE PUX" #xA04B)
+    ("YI SYLLABLE PU" #xA04C)
+    ("YI SYLLABLE PUP" #xA04D)
+    ("YI SYLLABLE PURX" #xA04E)
+    ("YI SYLLABLE PUR" #xA04F)
+    ("YI SYLLABLE PYT" #xA050)
+    ("YI SYLLABLE PYX" #xA051)
+    ("YI SYLLABLE PY" #xA052)
+    ("YI SYLLABLE PYP" #xA053)
+    ("YI SYLLABLE PYRX" #xA054)
+    ("YI SYLLABLE PYR" #xA055)
+    ("YI SYLLABLE BBIT" #xA056)
+    ("YI SYLLABLE BBIX" #xA057)
+    ("YI SYLLABLE BBI" #xA058)
+    ("YI SYLLABLE BBIP" #xA059)
+    ("YI SYLLABLE BBIET" #xA05A)
+    ("YI SYLLABLE BBIEX" #xA05B)
+    ("YI SYLLABLE BBIE" #xA05C)
+    ("YI SYLLABLE BBIEP" #xA05D)
+    ("YI SYLLABLE BBAT" #xA05E)
+    ("YI SYLLABLE BBAX" #xA05F)
+    ("YI SYLLABLE BBA" #xA060)
+    ("YI SYLLABLE BBAP" #xA061)
+    ("YI SYLLABLE BBUOX" #xA062)
+    ("YI SYLLABLE BBUO" #xA063)
+    ("YI SYLLABLE BBUOP" #xA064)
+    ("YI SYLLABLE BBOT" #xA065)
+    ("YI SYLLABLE BBOX" #xA066)
+    ("YI SYLLABLE BBO" #xA067)
+    ("YI SYLLABLE BBOP" #xA068)
+    ("YI SYLLABLE BBEX" #xA069)
+    ("YI SYLLABLE BBE" #xA06A)
+    ("YI SYLLABLE BBEP" #xA06B)
+    ("YI SYLLABLE BBUT" #xA06C)
+    ("YI SYLLABLE BBUX" #xA06D)
+    ("YI SYLLABLE BBU" #xA06E)
+    ("YI SYLLABLE BBUP" #xA06F)
+    ("YI SYLLABLE BBURX" #xA070)
+    ("YI SYLLABLE BBUR" #xA071)
+    ("YI SYLLABLE BBYT" #xA072)
+    ("YI SYLLABLE BBYX" #xA073)
+    ("YI SYLLABLE BBY" #xA074)
+    ("YI SYLLABLE BBYP" #xA075)
+    ("YI SYLLABLE NBIT" #xA076)
+    ("YI SYLLABLE NBIX" #xA077)
+    ("YI SYLLABLE NBI" #xA078)
+    ("YI SYLLABLE NBIP" #xA079)
+    ("YI SYLLABLE NBIEX" #xA07A)
+    ("YI SYLLABLE NBIE" #xA07B)
+    ("YI SYLLABLE NBIEP" #xA07C)
+    ("YI SYLLABLE NBAT" #xA07D)
+    ("YI SYLLABLE NBAX" #xA07E)
+    ("YI SYLLABLE NBA" #xA07F)
+    ("YI SYLLABLE NBAP" #xA080)
+    ("YI SYLLABLE NBOT" #xA081)
+    ("YI SYLLABLE NBOX" #xA082)
+    ("YI SYLLABLE NBO" #xA083)
+    ("YI SYLLABLE NBOP" #xA084)
+    ("YI SYLLABLE NBUT" #xA085)
+    ("YI SYLLABLE NBUX" #xA086)
+    ("YI SYLLABLE NBU" #xA087)
+    ("YI SYLLABLE NBUP" #xA088)
+    ("YI SYLLABLE NBURX" #xA089)
+    ("YI SYLLABLE NBUR" #xA08A)
+    ("YI SYLLABLE NBYT" #xA08B)
+    ("YI SYLLABLE NBYX" #xA08C)
+    ("YI SYLLABLE NBY" #xA08D)
+    ("YI SYLLABLE NBYP" #xA08E)
+    ("YI SYLLABLE NBYRX" #xA08F)
+    ("YI SYLLABLE NBYR" #xA090)
+    ("YI SYLLABLE HMIT" #xA091)
+    ("YI SYLLABLE HMIX" #xA092)
+    ("YI SYLLABLE HMI" #xA093)
+    ("YI SYLLABLE HMIP" #xA094)
+    ("YI SYLLABLE HMIEX" #xA095)
+    ("YI SYLLABLE HMIE" #xA096)
+    ("YI SYLLABLE HMIEP" #xA097)
+    ("YI SYLLABLE HMAT" #xA098)
+    ("YI SYLLABLE HMAX" #xA099)
+    ("YI SYLLABLE HMA" #xA09A)
+    ("YI SYLLABLE HMAP" #xA09B)
+    ("YI SYLLABLE HMUOX" #xA09C)
+    ("YI SYLLABLE HMUO" #xA09D)
+    ("YI SYLLABLE HMUOP" #xA09E)
+    ("YI SYLLABLE HMOT" #xA09F)
+    ("YI SYLLABLE HMOX" #xA0A0)
+    ("YI SYLLABLE HMO" #xA0A1)
+    ("YI SYLLABLE HMOP" #xA0A2)
+    ("YI SYLLABLE HMUT" #xA0A3)
+    ("YI SYLLABLE HMUX" #xA0A4)
+    ("YI SYLLABLE HMU" #xA0A5)
+    ("YI SYLLABLE HMUP" #xA0A6)
+    ("YI SYLLABLE HMURX" #xA0A7)
+    ("YI SYLLABLE HMUR" #xA0A8)
+    ("YI SYLLABLE HMYX" #xA0A9)
+    ("YI SYLLABLE HMY" #xA0AA)
+    ("YI SYLLABLE HMYP" #xA0AB)
+    ("YI SYLLABLE HMYRX" #xA0AC)
+    ("YI SYLLABLE HMYR" #xA0AD)
+    ("YI SYLLABLE MIT" #xA0AE)
+    ("YI SYLLABLE MIX" #xA0AF)
+    ("YI SYLLABLE MI" #xA0B0)
+    ("YI SYLLABLE MIP" #xA0B1)
+    ("YI SYLLABLE MIEX" #xA0B2)
+    ("YI SYLLABLE MIE" #xA0B3)
+    ("YI SYLLABLE MIEP" #xA0B4)
+    ("YI SYLLABLE MAT" #xA0B5)
+    ("YI SYLLABLE MAX" #xA0B6)
+    ("YI SYLLABLE MA" #xA0B7)
+    ("YI SYLLABLE MAP" #xA0B8)
+    ("YI SYLLABLE MUOT" #xA0B9)
+    ("YI SYLLABLE MUOX" #xA0BA)
+    ("YI SYLLABLE MUO" #xA0BB)
+    ("YI SYLLABLE MUOP" #xA0BC)
+    ("YI SYLLABLE MOT" #xA0BD)
+    ("YI SYLLABLE MOX" #xA0BE)
+    ("YI SYLLABLE MO" #xA0BF)
+    ("YI SYLLABLE MOP" #xA0C0)
+    ("YI SYLLABLE MEX" #xA0C1)
+    ("YI SYLLABLE ME" #xA0C2)
+    ("YI SYLLABLE MUT" #xA0C3)
+    ("YI SYLLABLE MUX" #xA0C4)
+    ("YI SYLLABLE MU" #xA0C5)
+    ("YI SYLLABLE MUP" #xA0C6)
+    ("YI SYLLABLE MURX" #xA0C7)
+    ("YI SYLLABLE MUR" #xA0C8)
+    ("YI SYLLABLE MYT" #xA0C9)
+    ("YI SYLLABLE MYX" #xA0CA)
+    ("YI SYLLABLE MY" #xA0CB)
+    ("YI SYLLABLE MYP" #xA0CC)
+    ("YI SYLLABLE FIT" #xA0CD)
+    ("YI SYLLABLE FIX" #xA0CE)
+    ("YI SYLLABLE FI" #xA0CF)
+    ("YI SYLLABLE FIP" #xA0D0)
+    ("YI SYLLABLE FAT" #xA0D1)
+    ("YI SYLLABLE FAX" #xA0D2)
+    ("YI SYLLABLE FA" #xA0D3)
+    ("YI SYLLABLE FAP" #xA0D4)
+    ("YI SYLLABLE FOX" #xA0D5)
+    ("YI SYLLABLE FO" #xA0D6)
+    ("YI SYLLABLE FOP" #xA0D7)
+    ("YI SYLLABLE FUT" #xA0D8)
+    ("YI SYLLABLE FUX" #xA0D9)
+    ("YI SYLLABLE FU" #xA0DA)
+    ("YI SYLLABLE FUP" #xA0DB)
+    ("YI SYLLABLE FURX" #xA0DC)
+    ("YI SYLLABLE FUR" #xA0DD)
+    ("YI SYLLABLE FYT" #xA0DE)
+    ("YI SYLLABLE FYX" #xA0DF)
+    ("YI SYLLABLE FY" #xA0E0)
+    ("YI SYLLABLE FYP" #xA0E1)
+    ("YI SYLLABLE VIT" #xA0E2)
+    ("YI SYLLABLE VIX" #xA0E3)
+    ("YI SYLLABLE VI" #xA0E4)
+    ("YI SYLLABLE VIP" #xA0E5)
+    ("YI SYLLABLE VIET" #xA0E6)
+    ("YI SYLLABLE VIEX" #xA0E7)
+    ("YI SYLLABLE VIE" #xA0E8)
+    ("YI SYLLABLE VIEP" #xA0E9)
+    ("YI SYLLABLE VAT" #xA0EA)
+    ("YI SYLLABLE VAX" #xA0EB)
+    ("YI SYLLABLE VA" #xA0EC)
+    ("YI SYLLABLE VAP" #xA0ED)
+    ("YI SYLLABLE VOT" #xA0EE)
+    ("YI SYLLABLE VOX" #xA0EF)
+    ("YI SYLLABLE VO" #xA0F0)
+    ("YI SYLLABLE VOP" #xA0F1)
+    ("YI SYLLABLE VEX" #xA0F2)
+    ("YI SYLLABLE VEP" #xA0F3)
+    ("YI SYLLABLE VUT" #xA0F4)
+    ("YI SYLLABLE VUX" #xA0F5)
+    ("YI SYLLABLE VU" #xA0F6)
+    ("YI SYLLABLE VUP" #xA0F7)
+    ("YI SYLLABLE VURX" #xA0F8)
+    ("YI SYLLABLE VUR" #xA0F9)
+    ("YI SYLLABLE VYT" #xA0FA)
+    ("YI SYLLABLE VYX" #xA0FB)
+    ("YI SYLLABLE VY" #xA0FC)
+    ("YI SYLLABLE VYP" #xA0FD)
+    ("YI SYLLABLE VYRX" #xA0FE)
+    ("YI SYLLABLE VYR" #xA0FF)
+    ("YI SYLLABLE DIT" #xA100)
+    ("YI SYLLABLE DIX" #xA101)
+    ("YI SYLLABLE DI" #xA102)
+    ("YI SYLLABLE DIP" #xA103)
+    ("YI SYLLABLE DIEX" #xA104)
+    ("YI SYLLABLE DIE" #xA105)
+    ("YI SYLLABLE DIEP" #xA106)
+    ("YI SYLLABLE DAT" #xA107)
+    ("YI SYLLABLE DAX" #xA108)
+    ("YI SYLLABLE DA" #xA109)
+    ("YI SYLLABLE DAP" #xA10A)
+    ("YI SYLLABLE DUOX" #xA10B)
+    ("YI SYLLABLE DUO" #xA10C)
+    ("YI SYLLABLE DOT" #xA10D)
+    ("YI SYLLABLE DOX" #xA10E)
+    ("YI SYLLABLE DO" #xA10F)
+    ("YI SYLLABLE DOP" #xA110)
+    ("YI SYLLABLE DEX" #xA111)
+    ("YI SYLLABLE DE" #xA112)
+    ("YI SYLLABLE DEP" #xA113)
+    ("YI SYLLABLE DUT" #xA114)
+    ("YI SYLLABLE DUX" #xA115)
+    ("YI SYLLABLE DU" #xA116)
+    ("YI SYLLABLE DUP" #xA117)
+    ("YI SYLLABLE DURX" #xA118)
+    ("YI SYLLABLE DUR" #xA119)
+    ("YI SYLLABLE TIT" #xA11A)
+    ("YI SYLLABLE TIX" #xA11B)
+    ("YI SYLLABLE TI" #xA11C)
+    ("YI SYLLABLE TIP" #xA11D)
+    ("YI SYLLABLE TIEX" #xA11E)
+    ("YI SYLLABLE TIE" #xA11F)
+    ("YI SYLLABLE TIEP" #xA120)
+    ("YI SYLLABLE TAT" #xA121)
+    ("YI SYLLABLE TAX" #xA122)
+    ("YI SYLLABLE TA" #xA123)
+    ("YI SYLLABLE TAP" #xA124)
+    ("YI SYLLABLE TUOT" #xA125)
+    ("YI SYLLABLE TUOX" #xA126)
+    ("YI SYLLABLE TUO" #xA127)
+    ("YI SYLLABLE TUOP" #xA128)
+    ("YI SYLLABLE TOT" #xA129)
+    ("YI SYLLABLE TOX" #xA12A)
+    ("YI SYLLABLE TO" #xA12B)
+    ("YI SYLLABLE TOP" #xA12C)
+    ("YI SYLLABLE TEX" #xA12D)
+    ("YI SYLLABLE TE" #xA12E)
+    ("YI SYLLABLE TEP" #xA12F)
+    ("YI SYLLABLE TUT" #xA130)
+    ("YI SYLLABLE TUX" #xA131)
+    ("YI SYLLABLE TU" #xA132)
+    ("YI SYLLABLE TUP" #xA133)
+    ("YI SYLLABLE TURX" #xA134)
+    ("YI SYLLABLE TUR" #xA135)
+    ("YI SYLLABLE DDIT" #xA136)
+    ("YI SYLLABLE DDIX" #xA137)
+    ("YI SYLLABLE DDI" #xA138)
+    ("YI SYLLABLE DDIP" #xA139)
+    ("YI SYLLABLE DDIEX" #xA13A)
+    ("YI SYLLABLE DDIE" #xA13B)
+    ("YI SYLLABLE DDIEP" #xA13C)
+    ("YI SYLLABLE DDAT" #xA13D)
+    ("YI SYLLABLE DDAX" #xA13E)
+    ("YI SYLLABLE DDA" #xA13F)
+    ("YI SYLLABLE DDAP" #xA140)
+    ("YI SYLLABLE DDUOX" #xA141)
+    ("YI SYLLABLE DDUO" #xA142)
+    ("YI SYLLABLE DDUOP" #xA143)
+    ("YI SYLLABLE DDOT" #xA144)
+    ("YI SYLLABLE DDOX" #xA145)
+    ("YI SYLLABLE DDO" #xA146)
+    ("YI SYLLABLE DDOP" #xA147)
+    ("YI SYLLABLE DDEX" #xA148)
+    ("YI SYLLABLE DDE" #xA149)
+    ("YI SYLLABLE DDEP" #xA14A)
+    ("YI SYLLABLE DDUT" #xA14B)
+    ("YI SYLLABLE DDUX" #xA14C)
+    ("YI SYLLABLE DDU" #xA14D)
+    ("YI SYLLABLE DDUP" #xA14E)
+    ("YI SYLLABLE DDURX" #xA14F)
+    ("YI SYLLABLE DDUR" #xA150)
+    ("YI SYLLABLE NDIT" #xA151)
+    ("YI SYLLABLE NDIX" #xA152)
+    ("YI SYLLABLE NDI" #xA153)
+    ("YI SYLLABLE NDIP" #xA154)
+    ("YI SYLLABLE NDIEX" #xA155)
+    ("YI SYLLABLE NDIE" #xA156)
+    ("YI SYLLABLE NDAT" #xA157)
+    ("YI SYLLABLE NDAX" #xA158)
+    ("YI SYLLABLE NDA" #xA159)
+    ("YI SYLLABLE NDAP" #xA15A)
+    ("YI SYLLABLE NDOT" #xA15B)
+    ("YI SYLLABLE NDOX" #xA15C)
+    ("YI SYLLABLE NDO" #xA15D)
+    ("YI SYLLABLE NDOP" #xA15E)
+    ("YI SYLLABLE NDEX" #xA15F)
+    ("YI SYLLABLE NDE" #xA160)
+    ("YI SYLLABLE NDEP" #xA161)
+    ("YI SYLLABLE NDUT" #xA162)
+    ("YI SYLLABLE NDUX" #xA163)
+    ("YI SYLLABLE NDU" #xA164)
+    ("YI SYLLABLE NDUP" #xA165)
+    ("YI SYLLABLE NDURX" #xA166)
+    ("YI SYLLABLE NDUR" #xA167)
+    ("YI SYLLABLE HNIT" #xA168)
+    ("YI SYLLABLE HNIX" #xA169)
+    ("YI SYLLABLE HNI" #xA16A)
+    ("YI SYLLABLE HNIP" #xA16B)
+    ("YI SYLLABLE HNIET" #xA16C)
+    ("YI SYLLABLE HNIEX" #xA16D)
+    ("YI SYLLABLE HNIE" #xA16E)
+    ("YI SYLLABLE HNIEP" #xA16F)
+    ("YI SYLLABLE HNAT" #xA170)
+    ("YI SYLLABLE HNAX" #xA171)
+    ("YI SYLLABLE HNA" #xA172)
+    ("YI SYLLABLE HNAP" #xA173)
+    ("YI SYLLABLE HNUOX" #xA174)
+    ("YI SYLLABLE HNUO" #xA175)
+    ("YI SYLLABLE HNOT" #xA176)
+    ("YI SYLLABLE HNOX" #xA177)
+    ("YI SYLLABLE HNOP" #xA178)
+    ("YI SYLLABLE HNEX" #xA179)
+    ("YI SYLLABLE HNE" #xA17A)
+    ("YI SYLLABLE HNEP" #xA17B)
+    ("YI SYLLABLE HNUT" #xA17C)
+    ("YI SYLLABLE NIT" #xA17D)
+    ("YI SYLLABLE NIX" #xA17E)
+    ("YI SYLLABLE NI" #xA17F)
+    ("YI SYLLABLE NIP" #xA180)
+    ("YI SYLLABLE NIEX" #xA181)
+    ("YI SYLLABLE NIE" #xA182)
+    ("YI SYLLABLE NIEP" #xA183)
+    ("YI SYLLABLE NAX" #xA184)
+    ("YI SYLLABLE NA" #xA185)
+    ("YI SYLLABLE NAP" #xA186)
+    ("YI SYLLABLE NUOX" #xA187)
+    ("YI SYLLABLE NUO" #xA188)
+    ("YI SYLLABLE NUOP" #xA189)
+    ("YI SYLLABLE NOT" #xA18A)
+    ("YI SYLLABLE NOX" #xA18B)
+    ("YI SYLLABLE NO" #xA18C)
+    ("YI SYLLABLE NOP" #xA18D)
+    ("YI SYLLABLE NEX" #xA18E)
+    ("YI SYLLABLE NE" #xA18F)
+    ("YI SYLLABLE NEP" #xA190)
+    ("YI SYLLABLE NUT" #xA191)
+    ("YI SYLLABLE NUX" #xA192)
+    ("YI SYLLABLE NU" #xA193)
+    ("YI SYLLABLE NUP" #xA194)
+    ("YI SYLLABLE NURX" #xA195)
+    ("YI SYLLABLE NUR" #xA196)
+    ("YI SYLLABLE HLIT" #xA197)
+    ("YI SYLLABLE HLIX" #xA198)
+    ("YI SYLLABLE HLI" #xA199)
+    ("YI SYLLABLE HLIP" #xA19A)
+    ("YI SYLLABLE HLIEX" #xA19B)
+    ("YI SYLLABLE HLIE" #xA19C)
+    ("YI SYLLABLE HLIEP" #xA19D)
+    ("YI SYLLABLE HLAT" #xA19E)
+    ("YI SYLLABLE HLAX" #xA19F)
+    ("YI SYLLABLE HLA" #xA1A0)
+    ("YI SYLLABLE HLAP" #xA1A1)
+    ("YI SYLLABLE HLUOX" #xA1A2)
+    ("YI SYLLABLE HLUO" #xA1A3)
+    ("YI SYLLABLE HLUOP" #xA1A4)
+    ("YI SYLLABLE HLOX" #xA1A5)
+    ("YI SYLLABLE HLO" #xA1A6)
+    ("YI SYLLABLE HLOP" #xA1A7)
+    ("YI SYLLABLE HLEX" #xA1A8)
+    ("YI SYLLABLE HLE" #xA1A9)
+    ("YI SYLLABLE HLEP" #xA1AA)
+    ("YI SYLLABLE HLUT" #xA1AB)
+    ("YI SYLLABLE HLUX" #xA1AC)
+    ("YI SYLLABLE HLU" #xA1AD)
+    ("YI SYLLABLE HLUP" #xA1AE)
+    ("YI SYLLABLE HLURX" #xA1AF)
+    ("YI SYLLABLE HLUR" #xA1B0)
+    ("YI SYLLABLE HLYT" #xA1B1)
+    ("YI SYLLABLE HLYX" #xA1B2)
+    ("YI SYLLABLE HLY" #xA1B3)
+    ("YI SYLLABLE HLYP" #xA1B4)
+    ("YI SYLLABLE HLYRX" #xA1B5)
+    ("YI SYLLABLE HLYR" #xA1B6)
+    ("YI SYLLABLE LIT" #xA1B7)
+    ("YI SYLLABLE LIX" #xA1B8)
+    ("YI SYLLABLE LI" #xA1B9)
+    ("YI SYLLABLE LIP" #xA1BA)
+    ("YI SYLLABLE LIET" #xA1BB)
+    ("YI SYLLABLE LIEX" #xA1BC)
+    ("YI SYLLABLE LIE" #xA1BD)
+    ("YI SYLLABLE LIEP" #xA1BE)
+    ("YI SYLLABLE LAT" #xA1BF)
+    ("YI SYLLABLE LAX" #xA1C0)
+    ("YI SYLLABLE LA" #xA1C1)
+    ("YI SYLLABLE LAP" #xA1C2)
+    ("YI SYLLABLE LUOT" #xA1C3)
+    ("YI SYLLABLE LUOX" #xA1C4)
+    ("YI SYLLABLE LUO" #xA1C5)
+    ("YI SYLLABLE LUOP" #xA1C6)
+    ("YI SYLLABLE LOT" #xA1C7)
+    ("YI SYLLABLE LOX" #xA1C8)
+    ("YI SYLLABLE LO" #xA1C9)
+    ("YI SYLLABLE LOP" #xA1CA)
+    ("YI SYLLABLE LEX" #xA1CB)
+    ("YI SYLLABLE LE" #xA1CC)
+    ("YI SYLLABLE LEP" #xA1CD)
+    ("YI SYLLABLE LUT" #xA1CE)
+    ("YI SYLLABLE LUX" #xA1CF)
+    ("YI SYLLABLE LU" #xA1D0)
+    ("YI SYLLABLE LUP" #xA1D1)
+    ("YI SYLLABLE LURX" #xA1D2)
+    ("YI SYLLABLE LUR" #xA1D3)
+    ("YI SYLLABLE LYT" #xA1D4)
+    ("YI SYLLABLE LYX" #xA1D5)
+    ("YI SYLLABLE LY" #xA1D6)
+    ("YI SYLLABLE LYP" #xA1D7)
+    ("YI SYLLABLE LYRX" #xA1D8)
+    ("YI SYLLABLE LYR" #xA1D9)
+    ("YI SYLLABLE GIT" #xA1DA)
+    ("YI SYLLABLE GIX" #xA1DB)
+    ("YI SYLLABLE GI" #xA1DC)
+    ("YI SYLLABLE GIP" #xA1DD)
+    ("YI SYLLABLE GIET" #xA1DE)
+    ("YI SYLLABLE GIEX" #xA1DF)
+    ("YI SYLLABLE GIE" #xA1E0)
+    ("YI SYLLABLE GIEP" #xA1E1)
+    ("YI SYLLABLE GAT" #xA1E2)
+    ("YI SYLLABLE GAX" #xA1E3)
+    ("YI SYLLABLE GA" #xA1E4)
+    ("YI SYLLABLE GAP" #xA1E5)
+    ("YI SYLLABLE GUOT" #xA1E6)
+    ("YI SYLLABLE GUOX" #xA1E7)
+    ("YI SYLLABLE GUO" #xA1E8)
+    ("YI SYLLABLE GUOP" #xA1E9)
+    ("YI SYLLABLE GOT" #xA1EA)
+    ("YI SYLLABLE GOX" #xA1EB)
+    ("YI SYLLABLE GO" #xA1EC)
+    ("YI SYLLABLE GOP" #xA1ED)
+    ("YI SYLLABLE GET" #xA1EE)
+    ("YI SYLLABLE GEX" #xA1EF)
+    ("YI SYLLABLE GE" #xA1F0)
+    ("YI SYLLABLE GEP" #xA1F1)
+    ("YI SYLLABLE GUT" #xA1F2)
+    ("YI SYLLABLE GUX" #xA1F3)
+    ("YI SYLLABLE GU" #xA1F4)
+    ("YI SYLLABLE GUP" #xA1F5)
+    ("YI SYLLABLE GURX" #xA1F6)
+    ("YI SYLLABLE GUR" #xA1F7)
+    ("YI SYLLABLE KIT" #xA1F8)
+    ("YI SYLLABLE KIX" #xA1F9)
+    ("YI SYLLABLE KI" #xA1FA)
+    ("YI SYLLABLE KIP" #xA1FB)
+    ("YI SYLLABLE KIEX" #xA1FC)
+    ("YI SYLLABLE KIE" #xA1FD)
+    ("YI SYLLABLE KIEP" #xA1FE)
+    ("YI SYLLABLE KAT" #xA1FF)
+    ("YI SYLLABLE KAX" #xA200)
+    ("YI SYLLABLE KA" #xA201)
+    ("YI SYLLABLE KAP" #xA202)
+    ("YI SYLLABLE KUOX" #xA203)
+    ("YI SYLLABLE KUO" #xA204)
+    ("YI SYLLABLE KUOP" #xA205)
+    ("YI SYLLABLE KOT" #xA206)
+    ("YI SYLLABLE KOX" #xA207)
+    ("YI SYLLABLE KO" #xA208)
+    ("YI SYLLABLE KOP" #xA209)
+    ("YI SYLLABLE KET" #xA20A)
+    ("YI SYLLABLE KEX" #xA20B)
+    ("YI SYLLABLE KE" #xA20C)
+    ("YI SYLLABLE KEP" #xA20D)
+    ("YI SYLLABLE KUT" #xA20E)
+    ("YI SYLLABLE KUX" #xA20F)
+    ("YI SYLLABLE KU" #xA210)
+    ("YI SYLLABLE KUP" #xA211)
+    ("YI SYLLABLE KURX" #xA212)
+    ("YI SYLLABLE KUR" #xA213)
+    ("YI SYLLABLE GGIT" #xA214)
+    ("YI SYLLABLE GGIX" #xA215)
+    ("YI SYLLABLE GGI" #xA216)
+    ("YI SYLLABLE GGIEX" #xA217)
+    ("YI SYLLABLE GGIE" #xA218)
+    ("YI SYLLABLE GGIEP" #xA219)
+    ("YI SYLLABLE GGAT" #xA21A)
+    ("YI SYLLABLE GGAX" #xA21B)
+    ("YI SYLLABLE GGA" #xA21C)
+    ("YI SYLLABLE GGAP" #xA21D)
+    ("YI SYLLABLE GGUOT" #xA21E)
+    ("YI SYLLABLE GGUOX" #xA21F)
+    ("YI SYLLABLE GGUO" #xA220)
+    ("YI SYLLABLE GGUOP" #xA221)
+    ("YI SYLLABLE GGOT" #xA222)
+    ("YI SYLLABLE GGOX" #xA223)
+    ("YI SYLLABLE GGO" #xA224)
+    ("YI SYLLABLE GGOP" #xA225)
+    ("YI SYLLABLE GGET" #xA226)
+    ("YI SYLLABLE GGEX" #xA227)
+    ("YI SYLLABLE GGE" #xA228)
+    ("YI SYLLABLE GGEP" #xA229)
+    ("YI SYLLABLE GGUT" #xA22A)
+    ("YI SYLLABLE GGUX" #xA22B)
+    ("YI SYLLABLE GGU" #xA22C)
+    ("YI SYLLABLE GGUP" #xA22D)
+    ("YI SYLLABLE GGURX" #xA22E)
+    ("YI SYLLABLE GGUR" #xA22F)
+    ("YI SYLLABLE MGIEX" #xA230)
+    ("YI SYLLABLE MGIE" #xA231)
+    ("YI SYLLABLE MGAT" #xA232)
+    ("YI SYLLABLE MGAX" #xA233)
+    ("YI SYLLABLE MGA" #xA234)
+    ("YI SYLLABLE MGAP" #xA235)
+    ("YI SYLLABLE MGUOX" #xA236)
+    ("YI SYLLABLE MGUO" #xA237)
+    ("YI SYLLABLE MGUOP" #xA238)
+    ("YI SYLLABLE MGOT" #xA239)
+    ("YI SYLLABLE MGOX" #xA23A)
+    ("YI SYLLABLE MGO" #xA23B)
+    ("YI SYLLABLE MGOP" #xA23C)
+    ("YI SYLLABLE MGEX" #xA23D)
+    ("YI SYLLABLE MGE" #xA23E)
+    ("YI SYLLABLE MGEP" #xA23F)
+    ("YI SYLLABLE MGUT" #xA240)
+    ("YI SYLLABLE MGUX" #xA241)
+    ("YI SYLLABLE MGU" #xA242)
+    ("YI SYLLABLE MGUP" #xA243)
+    ("YI SYLLABLE MGURX" #xA244)
+    ("YI SYLLABLE MGUR" #xA245)
+    ("YI SYLLABLE HXIT" #xA246)
+    ("YI SYLLABLE HXIX" #xA247)
+    ("YI SYLLABLE HXI" #xA248)
+    ("YI SYLLABLE HXIP" #xA249)
+    ("YI SYLLABLE HXIET" #xA24A)
+    ("YI SYLLABLE HXIEX" #xA24B)
+    ("YI SYLLABLE HXIE" #xA24C)
+    ("YI SYLLABLE HXIEP" #xA24D)
+    ("YI SYLLABLE HXAT" #xA24E)
+    ("YI SYLLABLE HXAX" #xA24F)
+    ("YI SYLLABLE HXA" #xA250)
+    ("YI SYLLABLE HXAP" #xA251)
+    ("YI SYLLABLE HXUOT" #xA252)
+    ("YI SYLLABLE HXUOX" #xA253)
+    ("YI SYLLABLE HXUO" #xA254)
+    ("YI SYLLABLE HXUOP" #xA255)
+    ("YI SYLLABLE HXOT" #xA256)
+    ("YI SYLLABLE HXOX" #xA257)
+    ("YI SYLLABLE HXO" #xA258)
+    ("YI SYLLABLE HXOP" #xA259)
+    ("YI SYLLABLE HXEX" #xA25A)
+    ("YI SYLLABLE HXE" #xA25B)
+    ("YI SYLLABLE HXEP" #xA25C)
+    ("YI SYLLABLE NGIEX" #xA25D)
+    ("YI SYLLABLE NGIE" #xA25E)
+    ("YI SYLLABLE NGIEP" #xA25F)
+    ("YI SYLLABLE NGAT" #xA260)
+    ("YI SYLLABLE NGAX" #xA261)
+    ("YI SYLLABLE NGA" #xA262)
+    ("YI SYLLABLE NGAP" #xA263)
+    ("YI SYLLABLE NGUOT" #xA264)
+    ("YI SYLLABLE NGUOX" #xA265)
+    ("YI SYLLABLE NGUO" #xA266)
+    ("YI SYLLABLE NGOT" #xA267)
+    ("YI SYLLABLE NGOX" #xA268)
+    ("YI SYLLABLE NGO" #xA269)
+    ("YI SYLLABLE NGOP" #xA26A)
+    ("YI SYLLABLE NGEX" #xA26B)
+    ("YI SYLLABLE NGE" #xA26C)
+    ("YI SYLLABLE NGEP" #xA26D)
+    ("YI SYLLABLE HIT" #xA26E)
+    ("YI SYLLABLE HIEX" #xA26F)
+    ("YI SYLLABLE HIE" #xA270)
+    ("YI SYLLABLE HAT" #xA271)
+    ("YI SYLLABLE HAX" #xA272)
+    ("YI SYLLABLE HA" #xA273)
+    ("YI SYLLABLE HAP" #xA274)
+    ("YI SYLLABLE HUOT" #xA275)
+    ("YI SYLLABLE HUOX" #xA276)
+    ("YI SYLLABLE HUO" #xA277)
+    ("YI SYLLABLE HUOP" #xA278)
+    ("YI SYLLABLE HOT" #xA279)
+    ("YI SYLLABLE HOX" #xA27A)
+    ("YI SYLLABLE HO" #xA27B)
+    ("YI SYLLABLE HOP" #xA27C)
+    ("YI SYLLABLE HEX" #xA27D)
+    ("YI SYLLABLE HE" #xA27E)
+    ("YI SYLLABLE HEP" #xA27F)
+    ("YI SYLLABLE WAT" #xA280)
+    ("YI SYLLABLE WAX" #xA281)
+    ("YI SYLLABLE WA" #xA282)
+    ("YI SYLLABLE WAP" #xA283)
+    ("YI SYLLABLE WUOX" #xA284)
+    ("YI SYLLABLE WUO" #xA285)
+    ("YI SYLLABLE WUOP" #xA286)
+    ("YI SYLLABLE WOX" #xA287)
+    ("YI SYLLABLE WO" #xA288)
+    ("YI SYLLABLE WOP" #xA289)
+    ("YI SYLLABLE WEX" #xA28A)
+    ("YI SYLLABLE WE" #xA28B)
+    ("YI SYLLABLE WEP" #xA28C)
+    ("YI SYLLABLE ZIT" #xA28D)
+    ("YI SYLLABLE ZIX" #xA28E)
+    ("YI SYLLABLE ZI" #xA28F)
+    ("YI SYLLABLE ZIP" #xA290)
+    ("YI SYLLABLE ZIEX" #xA291)
+    ("YI SYLLABLE ZIE" #xA292)
+    ("YI SYLLABLE ZIEP" #xA293)
+    ("YI SYLLABLE ZAT" #xA294)
+    ("YI SYLLABLE ZAX" #xA295)
+    ("YI SYLLABLE ZA" #xA296)
+    ("YI SYLLABLE ZAP" #xA297)
+    ("YI SYLLABLE ZUOX" #xA298)
+    ("YI SYLLABLE ZUO" #xA299)
+    ("YI SYLLABLE ZUOP" #xA29A)
+    ("YI SYLLABLE ZOT" #xA29B)
+    ("YI SYLLABLE ZOX" #xA29C)
+    ("YI SYLLABLE ZO" #xA29D)
+    ("YI SYLLABLE ZOP" #xA29E)
+    ("YI SYLLABLE ZEX" #xA29F)
+    ("YI SYLLABLE ZE" #xA2A0)
+    ("YI SYLLABLE ZEP" #xA2A1)
+    ("YI SYLLABLE ZUT" #xA2A2)
+    ("YI SYLLABLE ZUX" #xA2A3)
+    ("YI SYLLABLE ZU" #xA2A4)
+    ("YI SYLLABLE ZUP" #xA2A5)
+    ("YI SYLLABLE ZURX" #xA2A6)
+    ("YI SYLLABLE ZUR" #xA2A7)
+    ("YI SYLLABLE ZYT" #xA2A8)
+    ("YI SYLLABLE ZYX" #xA2A9)
+    ("YI SYLLABLE ZY" #xA2AA)
+    ("YI SYLLABLE ZYP" #xA2AB)
+    ("YI SYLLABLE ZYRX" #xA2AC)
+    ("YI SYLLABLE ZYR" #xA2AD)
+    ("YI SYLLABLE CIT" #xA2AE)
+    ("YI SYLLABLE CIX" #xA2AF)
+    ("YI SYLLABLE CI" #xA2B0)
+    ("YI SYLLABLE CIP" #xA2B1)
+    ("YI SYLLABLE CIET" #xA2B2)
+    ("YI SYLLABLE CIEX" #xA2B3)
+    ("YI SYLLABLE CIE" #xA2B4)
+    ("YI SYLLABLE CIEP" #xA2B5)
+    ("YI SYLLABLE CAT" #xA2B6)
+    ("YI SYLLABLE CAX" #xA2B7)
+    ("YI SYLLABLE CA" #xA2B8)
+    ("YI SYLLABLE CAP" #xA2B9)
+    ("YI SYLLABLE CUOX" #xA2BA)
+    ("YI SYLLABLE CUO" #xA2BB)
+    ("YI SYLLABLE CUOP" #xA2BC)
+    ("YI SYLLABLE COT" #xA2BD)
+    ("YI SYLLABLE COX" #xA2BE)
+    ("YI SYLLABLE CO" #xA2BF)
+    ("YI SYLLABLE COP" #xA2C0)
+    ("YI SYLLABLE CEX" #xA2C1)
+    ("YI SYLLABLE CE" #xA2C2)
+    ("YI SYLLABLE CEP" #xA2C3)
+    ("YI SYLLABLE CUT" #xA2C4)
+    ("YI SYLLABLE CUX" #xA2C5)
+    ("YI SYLLABLE CU" #xA2C6)
+    ("YI SYLLABLE CUP" #xA2C7)
+    ("YI SYLLABLE CURX" #xA2C8)
+    ("YI SYLLABLE CUR" #xA2C9)
+    ("YI SYLLABLE CYT" #xA2CA)
+    ("YI SYLLABLE CYX" #xA2CB)
+    ("YI SYLLABLE CY" #xA2CC)
+    ("YI SYLLABLE CYP" #xA2CD)
+    ("YI SYLLABLE CYRX" #xA2CE)
+    ("YI SYLLABLE CYR" #xA2CF)
+    ("YI SYLLABLE ZZIT" #xA2D0)
+    ("YI SYLLABLE ZZIX" #xA2D1)
+    ("YI SYLLABLE ZZI" #xA2D2)
+    ("YI SYLLABLE ZZIP" #xA2D3)
+    ("YI SYLLABLE ZZIET" #xA2D4)
+    ("YI SYLLABLE ZZIEX" #xA2D5)
+    ("YI SYLLABLE ZZIE" #xA2D6)
+    ("YI SYLLABLE ZZIEP" #xA2D7)
+    ("YI SYLLABLE ZZAT" #xA2D8)
+    ("YI SYLLABLE ZZAX" #xA2D9)
+    ("YI SYLLABLE ZZA" #xA2DA)
+    ("YI SYLLABLE ZZAP" #xA2DB)
+    ("YI SYLLABLE ZZOX" #xA2DC)
+    ("YI SYLLABLE ZZO" #xA2DD)
+    ("YI SYLLABLE ZZOP" #xA2DE)
+    ("YI SYLLABLE ZZEX" #xA2DF)
+    ("YI SYLLABLE ZZE" #xA2E0)
+    ("YI SYLLABLE ZZEP" #xA2E1)
+    ("YI SYLLABLE ZZUX" #xA2E2)
+    ("YI SYLLABLE ZZU" #xA2E3)
+    ("YI SYLLABLE ZZUP" #xA2E4)
+    ("YI SYLLABLE ZZURX" #xA2E5)
+    ("YI SYLLABLE ZZUR" #xA2E6)
+    ("YI SYLLABLE ZZYT" #xA2E7)
+    ("YI SYLLABLE ZZYX" #xA2E8)
+    ("YI SYLLABLE ZZY" #xA2E9)
+    ("YI SYLLABLE ZZYP" #xA2EA)
+    ("YI SYLLABLE ZZYRX" #xA2EB)
+    ("YI SYLLABLE ZZYR" #xA2EC)
+    ("YI SYLLABLE NZIT" #xA2ED)
+    ("YI SYLLABLE NZIX" #xA2EE)
+    ("YI SYLLABLE NZI" #xA2EF)
+    ("YI SYLLABLE NZIP" #xA2F0)
+    ("YI SYLLABLE NZIEX" #xA2F1)
+    ("YI SYLLABLE NZIE" #xA2F2)
+    ("YI SYLLABLE NZIEP" #xA2F3)
+    ("YI SYLLABLE NZAT" #xA2F4)
+    ("YI SYLLABLE NZAX" #xA2F5)
+    ("YI SYLLABLE NZA" #xA2F6)
+    ("YI SYLLABLE NZAP" #xA2F7)
+    ("YI SYLLABLE NZUOX" #xA2F8)
+    ("YI SYLLABLE NZUO" #xA2F9)
+    ("YI SYLLABLE NZOX" #xA2FA)
+    ("YI SYLLABLE NZOP" #xA2FB)
+    ("YI SYLLABLE NZEX" #xA2FC)
+    ("YI SYLLABLE NZE" #xA2FD)
+    ("YI SYLLABLE NZUX" #xA2FE)
+    ("YI SYLLABLE NZU" #xA2FF)
+    ("YI SYLLABLE NZUP" #xA300)
+    ("YI SYLLABLE NZURX" #xA301)
+    ("YI SYLLABLE NZUR" #xA302)
+    ("YI SYLLABLE NZYT" #xA303)
+    ("YI SYLLABLE NZYX" #xA304)
+    ("YI SYLLABLE NZY" #xA305)
+    ("YI SYLLABLE NZYP" #xA306)
+    ("YI SYLLABLE NZYRX" #xA307)
+    ("YI SYLLABLE NZYR" #xA308)
+    ("YI SYLLABLE SIT" #xA309)
+    ("YI SYLLABLE SIX" #xA30A)
+    ("YI SYLLABLE SI" #xA30B)
+    ("YI SYLLABLE SIP" #xA30C)
+    ("YI SYLLABLE SIEX" #xA30D)
+    ("YI SYLLABLE SIE" #xA30E)
+    ("YI SYLLABLE SIEP" #xA30F)
+    ("YI SYLLABLE SAT" #xA310)
+    ("YI SYLLABLE SAX" #xA311)
+    ("YI SYLLABLE SA" #xA312)
+    ("YI SYLLABLE SAP" #xA313)
+    ("YI SYLLABLE SUOX" #xA314)
+    ("YI SYLLABLE SUO" #xA315)
+    ("YI SYLLABLE SUOP" #xA316)
+    ("YI SYLLABLE SOT" #xA317)
+    ("YI SYLLABLE SOX" #xA318)
+    ("YI SYLLABLE SO" #xA319)
+    ("YI SYLLABLE SOP" #xA31A)
+    ("YI SYLLABLE SEX" #xA31B)
+    ("YI SYLLABLE SE" #xA31C)
+    ("YI SYLLABLE SEP" #xA31D)
+    ("YI SYLLABLE SUT" #xA31E)
+    ("YI SYLLABLE SUX" #xA31F)
+    ("YI SYLLABLE SU" #xA320)
+    ("YI SYLLABLE SUP" #xA321)
+    ("YI SYLLABLE SURX" #xA322)
+    ("YI SYLLABLE SUR" #xA323)
+    ("YI SYLLABLE SYT" #xA324)
+    ("YI SYLLABLE SYX" #xA325)
+    ("YI SYLLABLE SY" #xA326)
+    ("YI SYLLABLE SYP" #xA327)
+    ("YI SYLLABLE SYRX" #xA328)
+    ("YI SYLLABLE SYR" #xA329)
+    ("YI SYLLABLE SSIT" #xA32A)
+    ("YI SYLLABLE SSIX" #xA32B)
+    ("YI SYLLABLE SSI" #xA32C)
+    ("YI SYLLABLE SSIP" #xA32D)
+    ("YI SYLLABLE SSIEX" #xA32E)
+    ("YI SYLLABLE SSIE" #xA32F)
+    ("YI SYLLABLE SSIEP" #xA330)
+    ("YI SYLLABLE SSAT" #xA331)
+    ("YI SYLLABLE SSAX" #xA332)
+    ("YI SYLLABLE SSA" #xA333)
+    ("YI SYLLABLE SSAP" #xA334)
+    ("YI SYLLABLE SSOT" #xA335)
+    ("YI SYLLABLE SSOX" #xA336)
+    ("YI SYLLABLE SSO" #xA337)
+    ("YI SYLLABLE SSOP" #xA338)
+    ("YI SYLLABLE SSEX" #xA339)
+    ("YI SYLLABLE SSE" #xA33A)
+    ("YI SYLLABLE SSEP" #xA33B)
+    ("YI SYLLABLE SSUT" #xA33C)
+    ("YI SYLLABLE SSUX" #xA33D)
+    ("YI SYLLABLE SSU" #xA33E)
+    ("YI SYLLABLE SSUP" #xA33F)
+    ("YI SYLLABLE SSYT" #xA340)
+    ("YI SYLLABLE SSYX" #xA341)
+    ("YI SYLLABLE SSY" #xA342)
+    ("YI SYLLABLE SSYP" #xA343)
+    ("YI SYLLABLE SSYRX" #xA344)
+    ("YI SYLLABLE SSYR" #xA345)
+    ("YI SYLLABLE ZHAT" #xA346)
+    ("YI SYLLABLE ZHAX" #xA347)
+    ("YI SYLLABLE ZHA" #xA348)
+    ("YI SYLLABLE ZHAP" #xA349)
+    ("YI SYLLABLE ZHUOX" #xA34A)
+    ("YI SYLLABLE ZHUO" #xA34B)
+    ("YI SYLLABLE ZHUOP" #xA34C)
+    ("YI SYLLABLE ZHOT" #xA34D)
+    ("YI SYLLABLE ZHOX" #xA34E)
+    ("YI SYLLABLE ZHO" #xA34F)
+    ("YI SYLLABLE ZHOP" #xA350)
+    ("YI SYLLABLE ZHET" #xA351)
+    ("YI SYLLABLE ZHEX" #xA352)
+    ("YI SYLLABLE ZHE" #xA353)
+    ("YI SYLLABLE ZHEP" #xA354)
+    ("YI SYLLABLE ZHUT" #xA355)
+    ("YI SYLLABLE ZHUX" #xA356)
+    ("YI SYLLABLE ZHU" #xA357)
+    ("YI SYLLABLE ZHUP" #xA358)
+    ("YI SYLLABLE ZHURX" #xA359)
+    ("YI SYLLABLE ZHUR" #xA35A)
+    ("YI SYLLABLE ZHYT" #xA35B)
+    ("YI SYLLABLE ZHYX" #xA35C)
+    ("YI SYLLABLE ZHY" #xA35D)
+    ("YI SYLLABLE ZHYP" #xA35E)
+    ("YI SYLLABLE ZHYRX" #xA35F)
+    ("YI SYLLABLE ZHYR" #xA360)
+    ("YI SYLLABLE CHAT" #xA361)
+    ("YI SYLLABLE CHAX" #xA362)
+    ("YI SYLLABLE CHA" #xA363)
+    ("YI SYLLABLE CHAP" #xA364)
+    ("YI SYLLABLE CHUOT" #xA365)
+    ("YI SYLLABLE CHUOX" #xA366)
+    ("YI SYLLABLE CHUO" #xA367)
+    ("YI SYLLABLE CHUOP" #xA368)
+    ("YI SYLLABLE CHOT" #xA369)
+    ("YI SYLLABLE CHOX" #xA36A)
+    ("YI SYLLABLE CHO" #xA36B)
+    ("YI SYLLABLE CHOP" #xA36C)
+    ("YI SYLLABLE CHET" #xA36D)
+    ("YI SYLLABLE CHEX" #xA36E)
+    ("YI SYLLABLE CHE" #xA36F)
+    ("YI SYLLABLE CHEP" #xA370)
+    ("YI SYLLABLE CHUX" #xA371)
+    ("YI SYLLABLE CHU" #xA372)
+    ("YI SYLLABLE CHUP" #xA373)
+    ("YI SYLLABLE CHURX" #xA374)
+    ("YI SYLLABLE CHUR" #xA375)
+    ("YI SYLLABLE CHYT" #xA376)
+    ("YI SYLLABLE CHYX" #xA377)
+    ("YI SYLLABLE CHY" #xA378)
+    ("YI SYLLABLE CHYP" #xA379)
+    ("YI SYLLABLE CHYRX" #xA37A)
+    ("YI SYLLABLE CHYR" #xA37B)
+    ("YI SYLLABLE RRAX" #xA37C)
+    ("YI SYLLABLE RRA" #xA37D)
+    ("YI SYLLABLE RRUOX" #xA37E)
+    ("YI SYLLABLE RRUO" #xA37F)
+    ("YI SYLLABLE RROT" #xA380)
+    ("YI SYLLABLE RROX" #xA381)
+    ("YI SYLLABLE RRO" #xA382)
+    ("YI SYLLABLE RROP" #xA383)
+    ("YI SYLLABLE RRET" #xA384)
+    ("YI SYLLABLE RREX" #xA385)
+    ("YI SYLLABLE RRE" #xA386)
+    ("YI SYLLABLE RREP" #xA387)
+    ("YI SYLLABLE RRUT" #xA388)
+    ("YI SYLLABLE RRUX" #xA389)
+    ("YI SYLLABLE RRU" #xA38A)
+    ("YI SYLLABLE RRUP" #xA38B)
+    ("YI SYLLABLE RRURX" #xA38C)
+    ("YI SYLLABLE RRUR" #xA38D)
+    ("YI SYLLABLE RRYT" #xA38E)
+    ("YI SYLLABLE RRYX" #xA38F)
+    ("YI SYLLABLE RRY" #xA390)
+    ("YI SYLLABLE RRYP" #xA391)
+    ("YI SYLLABLE RRYRX" #xA392)
+    ("YI SYLLABLE RRYR" #xA393)
+    ("YI SYLLABLE NRAT" #xA394)
+    ("YI SYLLABLE NRAX" #xA395)
+    ("YI SYLLABLE NRA" #xA396)
+    ("YI SYLLABLE NRAP" #xA397)
+    ("YI SYLLABLE NROX" #xA398)
+    ("YI SYLLABLE NRO" #xA399)
+    ("YI SYLLABLE NROP" #xA39A)
+    ("YI SYLLABLE NRET" #xA39B)
+    ("YI SYLLABLE NREX" #xA39C)
+    ("YI SYLLABLE NRE" #xA39D)
+    ("YI SYLLABLE NREP" #xA39E)
+    ("YI SYLLABLE NRUT" #xA39F)
+    ("YI SYLLABLE NRUX" #xA3A0)
+    ("YI SYLLABLE NRU" #xA3A1)
+    ("YI SYLLABLE NRUP" #xA3A2)
+    ("YI SYLLABLE NRURX" #xA3A3)
+    ("YI SYLLABLE NRUR" #xA3A4)
+    ("YI SYLLABLE NRYT" #xA3A5)
+    ("YI SYLLABLE NRYX" #xA3A6)
+    ("YI SYLLABLE NRY" #xA3A7)
+    ("YI SYLLABLE NRYP" #xA3A8)
+    ("YI SYLLABLE NRYRX" #xA3A9)
+    ("YI SYLLABLE NRYR" #xA3AA)
+    ("YI SYLLABLE SHAT" #xA3AB)
+    ("YI SYLLABLE SHAX" #xA3AC)
+    ("YI SYLLABLE SHA" #xA3AD)
+    ("YI SYLLABLE SHAP" #xA3AE)
+    ("YI SYLLABLE SHUOX" #xA3AF)
+    ("YI SYLLABLE SHUO" #xA3B0)
+    ("YI SYLLABLE SHUOP" #xA3B1)
+    ("YI SYLLABLE SHOT" #xA3B2)
+    ("YI SYLLABLE SHOX" #xA3B3)
+    ("YI SYLLABLE SHO" #xA3B4)
+    ("YI SYLLABLE SHOP" #xA3B5)
+    ("YI SYLLABLE SHET" #xA3B6)
+    ("YI SYLLABLE SHEX" #xA3B7)
+    ("YI SYLLABLE SHE" #xA3B8)
+    ("YI SYLLABLE SHEP" #xA3B9)
+    ("YI SYLLABLE SHUT" #xA3BA)
+    ("YI SYLLABLE SHUX" #xA3BB)
+    ("YI SYLLABLE SHU" #xA3BC)
+    ("YI SYLLABLE SHUP" #xA3BD)
+    ("YI SYLLABLE SHURX" #xA3BE)
+    ("YI SYLLABLE SHUR" #xA3BF)
+    ("YI SYLLABLE SHYT" #xA3C0)
+    ("YI SYLLABLE SHYX" #xA3C1)
+    ("YI SYLLABLE SHY" #xA3C2)
+    ("YI SYLLABLE SHYP" #xA3C3)
+    ("YI SYLLABLE SHYRX" #xA3C4)
+    ("YI SYLLABLE SHYR" #xA3C5)
+    ("YI SYLLABLE RAT" #xA3C6)
+    ("YI SYLLABLE RAX" #xA3C7)
+    ("YI SYLLABLE RA" #xA3C8)
+    ("YI SYLLABLE RAP" #xA3C9)
+    ("YI SYLLABLE RUOX" #xA3CA)
+    ("YI SYLLABLE RUO" #xA3CB)
+    ("YI SYLLABLE RUOP" #xA3CC)
+    ("YI SYLLABLE ROT" #xA3CD)
+    ("YI SYLLABLE ROX" #xA3CE)
+    ("YI SYLLABLE RO" #xA3CF)
+    ("YI SYLLABLE ROP" #xA3D0)
+    ("YI SYLLABLE REX" #xA3D1)
+    ("YI SYLLABLE RE" #xA3D2)
+    ("YI SYLLABLE REP" #xA3D3)
+    ("YI SYLLABLE RUT" #xA3D4)
+    ("YI SYLLABLE RUX" #xA3D5)
+    ("YI SYLLABLE RU" #xA3D6)
+    ("YI SYLLABLE RUP" #xA3D7)
+    ("YI SYLLABLE RURX" #xA3D8)
+    ("YI SYLLABLE RUR" #xA3D9)
+    ("YI SYLLABLE RYT" #xA3DA)
+    ("YI SYLLABLE RYX" #xA3DB)
+    ("YI SYLLABLE RY" #xA3DC)
+    ("YI SYLLABLE RYP" #xA3DD)
+    ("YI SYLLABLE RYRX" #xA3DE)
+    ("YI SYLLABLE RYR" #xA3DF)
+    ("YI SYLLABLE JIT" #xA3E0)
+    ("YI SYLLABLE JIX" #xA3E1)
+    ("YI SYLLABLE JI" #xA3E2)
+    ("YI SYLLABLE JIP" #xA3E3)
+    ("YI SYLLABLE JIET" #xA3E4)
+    ("YI SYLLABLE JIEX" #xA3E5)
+    ("YI SYLLABLE JIE" #xA3E6)
+    ("YI SYLLABLE JIEP" #xA3E7)
+    ("YI SYLLABLE JUOT" #xA3E8)
+    ("YI SYLLABLE JUOX" #xA3E9)
+    ("YI SYLLABLE JUO" #xA3EA)
+    ("YI SYLLABLE JUOP" #xA3EB)
+    ("YI SYLLABLE JOT" #xA3EC)
+    ("YI SYLLABLE JOX" #xA3ED)
+    ("YI SYLLABLE JO" #xA3EE)
+    ("YI SYLLABLE JOP" #xA3EF)
+    ("YI SYLLABLE JUT" #xA3F0)
+    ("YI SYLLABLE JUX" #xA3F1)
+    ("YI SYLLABLE JU" #xA3F2)
+    ("YI SYLLABLE JUP" #xA3F3)
+    ("YI SYLLABLE JURX" #xA3F4)
+    ("YI SYLLABLE JUR" #xA3F5)
+    ("YI SYLLABLE JYT" #xA3F6)
+    ("YI SYLLABLE JYX" #xA3F7)
+    ("YI SYLLABLE JY" #xA3F8)
+    ("YI SYLLABLE JYP" #xA3F9)
+    ("YI SYLLABLE JYRX" #xA3FA)
+    ("YI SYLLABLE JYR" #xA3FB)
+    ("YI SYLLABLE QIT" #xA3FC)
+    ("YI SYLLABLE QIX" #xA3FD)
+    ("YI SYLLABLE QI" #xA3FE)
+    ("YI SYLLABLE QIP" #xA3FF)
+    ("YI SYLLABLE QIET" #xA400)
+    ("YI SYLLABLE QIEX" #xA401)
+    ("YI SYLLABLE QIE" #xA402)
+    ("YI SYLLABLE QIEP" #xA403)
+    ("YI SYLLABLE QUOT" #xA404)
+    ("YI SYLLABLE QUOX" #xA405)
+    ("YI SYLLABLE QUO" #xA406)
+    ("YI SYLLABLE QUOP" #xA407)
+    ("YI SYLLABLE QOT" #xA408)
+    ("YI SYLLABLE QOX" #xA409)
+    ("YI SYLLABLE QO" #xA40A)
+    ("YI SYLLABLE QOP" #xA40B)
+    ("YI SYLLABLE QUT" #xA40C)
+    ("YI SYLLABLE QUX" #xA40D)
+    ("YI SYLLABLE QU" #xA40E)
+    ("YI SYLLABLE QUP" #xA40F)
+    ("YI SYLLABLE QURX" #xA410)
+    ("YI SYLLABLE QUR" #xA411)
+    ("YI SYLLABLE QYT" #xA412)
+    ("YI SYLLABLE QYX" #xA413)
+    ("YI SYLLABLE QY" #xA414)
+    ("YI SYLLABLE QYP" #xA415)
+    ("YI SYLLABLE QYRX" #xA416)
+    ("YI SYLLABLE QYR" #xA417)
+    ("YI SYLLABLE JJIT" #xA418)
+    ("YI SYLLABLE JJIX" #xA419)
+    ("YI SYLLABLE JJI" #xA41A)
+    ("YI SYLLABLE JJIP" #xA41B)
+    ("YI SYLLABLE JJIET" #xA41C)
+    ("YI SYLLABLE JJIEX" #xA41D)
+    ("YI SYLLABLE JJIE" #xA41E)
+    ("YI SYLLABLE JJIEP" #xA41F)
+    ("YI SYLLABLE JJUOX" #xA420)
+    ("YI SYLLABLE JJUO" #xA421)
+    ("YI SYLLABLE JJUOP" #xA422)
+    ("YI SYLLABLE JJOT" #xA423)
+    ("YI SYLLABLE JJOX" #xA424)
+    ("YI SYLLABLE JJO" #xA425)
+    ("YI SYLLABLE JJOP" #xA426)
+    ("YI SYLLABLE JJUT" #xA427)
+    ("YI SYLLABLE JJUX" #xA428)
+    ("YI SYLLABLE JJU" #xA429)
+    ("YI SYLLABLE JJUP" #xA42A)
+    ("YI SYLLABLE JJURX" #xA42B)
+    ("YI SYLLABLE JJUR" #xA42C)
+    ("YI SYLLABLE JJYT" #xA42D)
+    ("YI SYLLABLE JJYX" #xA42E)
+    ("YI SYLLABLE JJY" #xA42F)
+    ("YI SYLLABLE JJYP" #xA430)
+    ("YI SYLLABLE NJIT" #xA431)
+    ("YI SYLLABLE NJIX" #xA432)
+    ("YI SYLLABLE NJI" #xA433)
+    ("YI SYLLABLE NJIP" #xA434)
+    ("YI SYLLABLE NJIET" #xA435)
+    ("YI SYLLABLE NJIEX" #xA436)
+    ("YI SYLLABLE NJIE" #xA437)
+    ("YI SYLLABLE NJIEP" #xA438)
+    ("YI SYLLABLE NJUOX" #xA439)
+    ("YI SYLLABLE NJUO" #xA43A)
+    ("YI SYLLABLE NJOT" #xA43B)
+    ("YI SYLLABLE NJOX" #xA43C)
+    ("YI SYLLABLE NJO" #xA43D)
+    ("YI SYLLABLE NJOP" #xA43E)
+    ("YI SYLLABLE NJUX" #xA43F)
+    ("YI SYLLABLE NJU" #xA440)
+    ("YI SYLLABLE NJUP" #xA441)
+    ("YI SYLLABLE NJURX" #xA442)
+    ("YI SYLLABLE NJUR" #xA443)
+    ("YI SYLLABLE NJYT" #xA444)
+    ("YI SYLLABLE NJYX" #xA445)
+    ("YI SYLLABLE NJY" #xA446)
+    ("YI SYLLABLE NJYP" #xA447)
+    ("YI SYLLABLE NJYRX" #xA448)
+    ("YI SYLLABLE NJYR" #xA449)
+    ("YI SYLLABLE NYIT" #xA44A)
+    ("YI SYLLABLE NYIX" #xA44B)
+    ("YI SYLLABLE NYI" #xA44C)
+    ("YI SYLLABLE NYIP" #xA44D)
+    ("YI SYLLABLE NYIET" #xA44E)
+    ("YI SYLLABLE NYIEX" #xA44F)
+    ("YI SYLLABLE NYIE" #xA450)
+    ("YI SYLLABLE NYIEP" #xA451)
+    ("YI SYLLABLE NYUOX" #xA452)
+    ("YI SYLLABLE NYUO" #xA453)
+    ("YI SYLLABLE NYUOP" #xA454)
+    ("YI SYLLABLE NYOT" #xA455)
+    ("YI SYLLABLE NYOX" #xA456)
+    ("YI SYLLABLE NYO" #xA457)
+    ("YI SYLLABLE NYOP" #xA458)
+    ("YI SYLLABLE NYUT" #xA459)
+    ("YI SYLLABLE NYUX" #xA45A)
+    ("YI SYLLABLE NYU" #xA45B)
+    ("YI SYLLABLE NYUP" #xA45C)
+    ("YI SYLLABLE XIT" #xA45D)
+    ("YI SYLLABLE XIX" #xA45E)
+    ("YI SYLLABLE XI" #xA45F)
+    ("YI SYLLABLE XIP" #xA460)
+    ("YI SYLLABLE XIET" #xA461)
+    ("YI SYLLABLE XIEX" #xA462)
+    ("YI SYLLABLE XIE" #xA463)
+    ("YI SYLLABLE XIEP" #xA464)
+    ("YI SYLLABLE XUOX" #xA465)
+    ("YI SYLLABLE XUO" #xA466)
+    ("YI SYLLABLE XOT" #xA467)
+    ("YI SYLLABLE XOX" #xA468)
+    ("YI SYLLABLE XO" #xA469)
+    ("YI SYLLABLE XOP" #xA46A)
+    ("YI SYLLABLE XYT" #xA46B)
+    ("YI SYLLABLE XYX" #xA46C)
+    ("YI SYLLABLE XY" #xA46D)
+    ("YI SYLLABLE XYP" #xA46E)
+    ("YI SYLLABLE XYRX" #xA46F)
+    ("YI SYLLABLE XYR" #xA470)
+    ("YI SYLLABLE YIT" #xA471)
+    ("YI SYLLABLE YIX" #xA472)
+    ("YI SYLLABLE YI" #xA473)
+    ("YI SYLLABLE YIP" #xA474)
+    ("YI SYLLABLE YIET" #xA475)
+    ("YI SYLLABLE YIEX" #xA476)
+    ("YI SYLLABLE YIE" #xA477)
+    ("YI SYLLABLE YIEP" #xA478)
+    ("YI SYLLABLE YUOT" #xA479)
+    ("YI SYLLABLE YUOX" #xA47A)
+    ("YI SYLLABLE YUO" #xA47B)
+    ("YI SYLLABLE YUOP" #xA47C)
+    ("YI SYLLABLE YOT" #xA47D)
+    ("YI SYLLABLE YOX" #xA47E)
+    ("YI SYLLABLE YO" #xA47F)
+    ("YI SYLLABLE YOP" #xA480)
+    ("YI SYLLABLE YUT" #xA481)
+    ("YI SYLLABLE YUX" #xA482)
+    ("YI SYLLABLE YU" #xA483)
+    ("YI SYLLABLE YUP" #xA484)
+    ("YI SYLLABLE YURX" #xA485)
+    ("YI SYLLABLE YUR" #xA486)
+    ("YI SYLLABLE YYT" #xA487)
+    ("YI SYLLABLE YYX" #xA488)
+    ("YI SYLLABLE YY" #xA489)
+    ("YI SYLLABLE YYP" #xA48A)
+    ("YI SYLLABLE YYRX" #xA48B)
+    ("YI SYLLABLE YYR" #xA48C)
+    ))
+
+;; arch-tag: 4c900a8b-cd84-4c41-86f4-dcb47efac01b
diff --git a/etc/nxml/0A490-0A4CF.el b/etc/nxml/0A490-0A4CF.el
new file mode 100644 (file)
index 0000000..57e731e
--- /dev/null
@@ -0,0 +1,59 @@
+(nxml-define-char-name-set 'yi-radicals
+  '(("YI RADICAL QOT" #xA490)
+    ("YI RADICAL LI" #xA491)
+    ("YI RADICAL KIT" #xA492)
+    ("YI RADICAL NYIP" #xA493)
+    ("YI RADICAL CYP" #xA494)
+    ("YI RADICAL SSI" #xA495)
+    ("YI RADICAL GGOP" #xA496)
+    ("YI RADICAL GEP" #xA497)
+    ("YI RADICAL MI" #xA498)
+    ("YI RADICAL HXIT" #xA499)
+    ("YI RADICAL LYR" #xA49A)
+    ("YI RADICAL BBUT" #xA49B)
+    ("YI RADICAL MOP" #xA49C)
+    ("YI RADICAL YO" #xA49D)
+    ("YI RADICAL PUT" #xA49E)
+    ("YI RADICAL HXUO" #xA49F)
+    ("YI RADICAL TAT" #xA4A0)
+    ("YI RADICAL GA" #xA4A1)
+    ("YI RADICAL ZUP" #xA4A2)
+    ("YI RADICAL CYT" #xA4A3)
+    ("YI RADICAL DDUR" #xA4A4)
+    ("YI RADICAL BUR" #xA4A5)
+    ("YI RADICAL GGUO" #xA4A6)
+    ("YI RADICAL NYOP" #xA4A7)
+    ("YI RADICAL TU" #xA4A8)
+    ("YI RADICAL OP" #xA4A9)
+    ("YI RADICAL JJUT" #xA4AA)
+    ("YI RADICAL ZOT" #xA4AB)
+    ("YI RADICAL PYT" #xA4AC)
+    ("YI RADICAL HMO" #xA4AD)
+    ("YI RADICAL YIT" #xA4AE)
+    ("YI RADICAL VUR" #xA4AF)
+    ("YI RADICAL SHY" #xA4B0)
+    ("YI RADICAL VEP" #xA4B1)
+    ("YI RADICAL ZA" #xA4B2)
+    ("YI RADICAL JO" #xA4B3)
+    ("YI RADICAL NZUP" #xA4B4)
+    ("YI RADICAL JJY" #xA4B5)
+    ("YI RADICAL GOT" #xA4B6)
+    ("YI RADICAL JJIE" #xA4B7)
+    ("YI RADICAL WO" #xA4B8)
+    ("YI RADICAL DU" #xA4B9)
+    ("YI RADICAL SHUR" #xA4BA)
+    ("YI RADICAL LIE" #xA4BB)
+    ("YI RADICAL CY" #xA4BC)
+    ("YI RADICAL CUOP" #xA4BD)
+    ("YI RADICAL CIP" #xA4BE)
+    ("YI RADICAL HXOP" #xA4BF)
+    ("YI RADICAL SHAT" #xA4C0)
+    ("YI RADICAL ZUR" #xA4C1)
+    ("YI RADICAL SHOP" #xA4C2)
+    ("YI RADICAL CHE" #xA4C3)
+    ("YI RADICAL ZZIET" #xA4C4)
+    ("YI RADICAL NBIE" #xA4C5)
+    ("YI RADICAL KE" #xA4C6)
+    ))
+
+;; arch-tag: 2c93cdf1-e6f2-4a91-a798-3e1d7c094cf4
diff --git a/etc/nxml/0FB00-0FB4F.el b/etc/nxml/0FB00-0FB4F.el
new file mode 100644 (file)
index 0000000..52d47dd
--- /dev/null
@@ -0,0 +1,62 @@
+(nxml-define-char-name-set 'alphabetic-presentation-forms
+  '(("LATIN SMALL LIGATURE FF" #xFB00)
+    ("LATIN SMALL LIGATURE FI" #xFB01)
+    ("LATIN SMALL LIGATURE FL" #xFB02)
+    ("LATIN SMALL LIGATURE FFI" #xFB03)
+    ("LATIN SMALL LIGATURE FFL" #xFB04)
+    ("LATIN SMALL LIGATURE LONG S T" #xFB05)
+    ("LATIN SMALL LIGATURE ST" #xFB06)
+    ("ARMENIAN SMALL LIGATURE MEN NOW" #xFB13)
+    ("ARMENIAN SMALL LIGATURE MEN ECH" #xFB14)
+    ("ARMENIAN SMALL LIGATURE MEN INI" #xFB15)
+    ("ARMENIAN SMALL LIGATURE VEW NOW" #xFB16)
+    ("ARMENIAN SMALL LIGATURE MEN XEH" #xFB17)
+    ("HEBREW LETTER YOD WITH HIRIQ" #xFB1D)
+    ("HEBREW POINT JUDEO-SPANISH VARIKA" #xFB1E)
+    ("HEBREW LIGATURE YIDDISH YOD YOD PATAH" #xFB1F)
+    ("HEBREW LETTER ALTERNATIVE AYIN" #xFB20)
+    ("HEBREW LETTER WIDE ALEF" #xFB21)
+    ("HEBREW LETTER WIDE DALET" #xFB22)
+    ("HEBREW LETTER WIDE HE" #xFB23)
+    ("HEBREW LETTER WIDE KAF" #xFB24)
+    ("HEBREW LETTER WIDE LAMED" #xFB25)
+    ("HEBREW LETTER WIDE FINAL MEM" #xFB26)
+    ("HEBREW LETTER WIDE RESH" #xFB27)
+    ("HEBREW LETTER WIDE TAV" #xFB28)
+    ("HEBREW LETTER ALTERNATIVE PLUS SIGN" #xFB29)
+    ("HEBREW LETTER SHIN WITH SHIN DOT" #xFB2A)
+    ("HEBREW LETTER SHIN WITH SIN DOT" #xFB2B)
+    ("HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT" #xFB2C)
+    ("HEBREW LETTER SHIN WITH DAGESH AND SIN DOT" #xFB2D)
+    ("HEBREW LETTER ALEF WITH PATAH" #xFB2E)
+    ("HEBREW LETTER ALEF WITH QAMATS" #xFB2F)
+    ("HEBREW LETTER ALEF WITH MAPIQ" #xFB30)
+    ("HEBREW LETTER BET WITH DAGESH" #xFB31)
+    ("HEBREW LETTER GIMEL WITH DAGESH" #xFB32)
+    ("HEBREW LETTER DALET WITH DAGESH" #xFB33)
+    ("HEBREW LETTER HE WITH MAPIQ" #xFB34)
+    ("HEBREW LETTER VAV WITH DAGESH" #xFB35)
+    ("HEBREW LETTER ZAYIN WITH DAGESH" #xFB36)
+    ("HEBREW LETTER TET WITH DAGESH" #xFB38)
+    ("HEBREW LETTER YOD WITH DAGESH" #xFB39)
+    ("HEBREW LETTER FINAL KAF WITH DAGESH" #xFB3A)
+    ("HEBREW LETTER KAF WITH DAGESH" #xFB3B)
+    ("HEBREW LETTER LAMED WITH DAGESH" #xFB3C)
+    ("HEBREW LETTER MEM WITH DAGESH" #xFB3E)
+    ("HEBREW LETTER NUN WITH DAGESH" #xFB40)
+    ("HEBREW LETTER SAMEKH WITH DAGESH" #xFB41)
+    ("HEBREW LETTER FINAL PE WITH DAGESH" #xFB43)
+    ("HEBREW LETTER PE WITH DAGESH" #xFB44)
+    ("HEBREW LETTER TSADI WITH DAGESH" #xFB46)
+    ("HEBREW LETTER QOF WITH DAGESH" #xFB47)
+    ("HEBREW LETTER RESH WITH DAGESH" #xFB48)
+    ("HEBREW LETTER SHIN WITH DAGESH" #xFB49)
+    ("HEBREW LETTER TAV WITH DAGESH" #xFB4A)
+    ("HEBREW LETTER VAV WITH HOLAM" #xFB4B)
+    ("HEBREW LETTER BET WITH RAFE" #xFB4C)
+    ("HEBREW LETTER KAF WITH RAFE" #xFB4D)
+    ("HEBREW LETTER PE WITH RAFE" #xFB4E)
+    ("HEBREW LIGATURE ALEF LAMED" #xFB4F)
+    ))
+
+;; arch-tag: 06519b44-408f-43f4-89e6-3e5c1d2afe4d
diff --git a/etc/nxml/0FB50-0FDFF.el b/etc/nxml/0FB50-0FDFF.el
new file mode 100644 (file)
index 0000000..87b83cf
--- /dev/null
@@ -0,0 +1,598 @@
+(nxml-define-char-name-set 'arabic-presentation-forms-a
+  '(("ARABIC LETTER ALEF WASLA ISOLATED FORM" #xFB50)
+    ("ARABIC LETTER ALEF WASLA FINAL FORM" #xFB51)
+    ("ARABIC LETTER BEEH ISOLATED FORM" #xFB52)
+    ("ARABIC LETTER BEEH FINAL FORM" #xFB53)
+    ("ARABIC LETTER BEEH INITIAL FORM" #xFB54)
+    ("ARABIC LETTER BEEH MEDIAL FORM" #xFB55)
+    ("ARABIC LETTER PEH ISOLATED FORM" #xFB56)
+    ("ARABIC LETTER PEH FINAL FORM" #xFB57)
+    ("ARABIC LETTER PEH INITIAL FORM" #xFB58)
+    ("ARABIC LETTER PEH MEDIAL FORM" #xFB59)
+    ("ARABIC LETTER BEHEH ISOLATED FORM" #xFB5A)
+    ("ARABIC LETTER BEHEH FINAL FORM" #xFB5B)
+    ("ARABIC LETTER BEHEH INITIAL FORM" #xFB5C)
+    ("ARABIC LETTER BEHEH MEDIAL FORM" #xFB5D)
+    ("ARABIC LETTER TTEHEH ISOLATED FORM" #xFB5E)
+    ("ARABIC LETTER TTEHEH FINAL FORM" #xFB5F)
+    ("ARABIC LETTER TTEHEH INITIAL FORM" #xFB60)
+    ("ARABIC LETTER TTEHEH MEDIAL FORM" #xFB61)
+    ("ARABIC LETTER TEHEH ISOLATED FORM" #xFB62)
+    ("ARABIC LETTER TEHEH FINAL FORM" #xFB63)
+    ("ARABIC LETTER TEHEH INITIAL FORM" #xFB64)
+    ("ARABIC LETTER TEHEH MEDIAL FORM" #xFB65)
+    ("ARABIC LETTER TTEH ISOLATED FORM" #xFB66)
+    ("ARABIC LETTER TTEH FINAL FORM" #xFB67)
+    ("ARABIC LETTER TTEH INITIAL FORM" #xFB68)
+    ("ARABIC LETTER TTEH MEDIAL FORM" #xFB69)
+    ("ARABIC LETTER VEH ISOLATED FORM" #xFB6A)
+    ("ARABIC LETTER VEH FINAL FORM" #xFB6B)
+    ("ARABIC LETTER VEH INITIAL FORM" #xFB6C)
+    ("ARABIC LETTER VEH MEDIAL FORM" #xFB6D)
+    ("ARABIC LETTER PEHEH ISOLATED FORM" #xFB6E)
+    ("ARABIC LETTER PEHEH FINAL FORM" #xFB6F)
+    ("ARABIC LETTER PEHEH INITIAL FORM" #xFB70)
+    ("ARABIC LETTER PEHEH MEDIAL FORM" #xFB71)
+    ("ARABIC LETTER DYEH ISOLATED FORM" #xFB72)
+    ("ARABIC LETTER DYEH FINAL FORM" #xFB73)
+    ("ARABIC LETTER DYEH INITIAL FORM" #xFB74)
+    ("ARABIC LETTER DYEH MEDIAL FORM" #xFB75)
+    ("ARABIC LETTER NYEH ISOLATED FORM" #xFB76)
+    ("ARABIC LETTER NYEH FINAL FORM" #xFB77)
+    ("ARABIC LETTER NYEH INITIAL FORM" #xFB78)
+    ("ARABIC LETTER NYEH MEDIAL FORM" #xFB79)
+    ("ARABIC LETTER TCHEH ISOLATED FORM" #xFB7A)
+    ("ARABIC LETTER TCHEH FINAL FORM" #xFB7B)
+    ("ARABIC LETTER TCHEH INITIAL FORM" #xFB7C)
+    ("ARABIC LETTER TCHEH MEDIAL FORM" #xFB7D)
+    ("ARABIC LETTER TCHEHEH ISOLATED FORM" #xFB7E)
+    ("ARABIC LETTER TCHEHEH FINAL FORM" #xFB7F)
+    ("ARABIC LETTER TCHEHEH INITIAL FORM" #xFB80)
+    ("ARABIC LETTER TCHEHEH MEDIAL FORM" #xFB81)
+    ("ARABIC LETTER DDAHAL ISOLATED FORM" #xFB82)
+    ("ARABIC LETTER DDAHAL FINAL FORM" #xFB83)
+    ("ARABIC LETTER DAHAL ISOLATED FORM" #xFB84)
+    ("ARABIC LETTER DAHAL FINAL FORM" #xFB85)
+    ("ARABIC LETTER DUL ISOLATED FORM" #xFB86)
+    ("ARABIC LETTER DUL FINAL FORM" #xFB87)
+    ("ARABIC LETTER DDAL ISOLATED FORM" #xFB88)
+    ("ARABIC LETTER DDAL FINAL FORM" #xFB89)
+    ("ARABIC LETTER JEH ISOLATED FORM" #xFB8A)
+    ("ARABIC LETTER JEH FINAL FORM" #xFB8B)
+    ("ARABIC LETTER RREH ISOLATED FORM" #xFB8C)
+    ("ARABIC LETTER RREH FINAL FORM" #xFB8D)
+    ("ARABIC LETTER KEHEH ISOLATED FORM" #xFB8E)
+    ("ARABIC LETTER KEHEH FINAL FORM" #xFB8F)
+    ("ARABIC LETTER KEHEH INITIAL FORM" #xFB90)
+    ("ARABIC LETTER KEHEH MEDIAL FORM" #xFB91)
+    ("ARABIC LETTER GAF ISOLATED FORM" #xFB92)
+    ("ARABIC LETTER GAF FINAL FORM" #xFB93)
+    ("ARABIC LETTER GAF INITIAL FORM" #xFB94)
+    ("ARABIC LETTER GAF MEDIAL FORM" #xFB95)
+    ("ARABIC LETTER GUEH ISOLATED FORM" #xFB96)
+    ("ARABIC LETTER GUEH FINAL FORM" #xFB97)
+    ("ARABIC LETTER GUEH INITIAL FORM" #xFB98)
+    ("ARABIC LETTER GUEH MEDIAL FORM" #xFB99)
+    ("ARABIC LETTER NGOEH ISOLATED FORM" #xFB9A)
+    ("ARABIC LETTER NGOEH FINAL FORM" #xFB9B)
+    ("ARABIC LETTER NGOEH INITIAL FORM" #xFB9C)
+    ("ARABIC LETTER NGOEH MEDIAL FORM" #xFB9D)
+    ("ARABIC LETTER NOON GHUNNA ISOLATED FORM" #xFB9E)
+    ("ARABIC LETTER NOON GHUNNA FINAL FORM" #xFB9F)
+    ("ARABIC LETTER RNOON ISOLATED FORM" #xFBA0)
+    ("ARABIC LETTER RNOON FINAL FORM" #xFBA1)
+    ("ARABIC LETTER RNOON INITIAL FORM" #xFBA2)
+    ("ARABIC LETTER RNOON MEDIAL FORM" #xFBA3)
+    ("ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM" #xFBA4)
+    ("ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM" #xFBA5)
+    ("ARABIC LETTER HEH GOAL ISOLATED FORM" #xFBA6)
+    ("ARABIC LETTER HEH GOAL FINAL FORM" #xFBA7)
+    ("ARABIC LETTER HEH GOAL INITIAL FORM" #xFBA8)
+    ("ARABIC LETTER HEH GOAL MEDIAL FORM" #xFBA9)
+    ("ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM" #xFBAA)
+    ("ARABIC LETTER HEH DOACHASHMEE FINAL FORM" #xFBAB)
+    ("ARABIC LETTER HEH DOACHASHMEE INITIAL FORM" #xFBAC)
+    ("ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM" #xFBAD)
+    ("ARABIC LETTER YEH BARREE ISOLATED FORM" #xFBAE)
+    ("ARABIC LETTER YEH BARREE FINAL FORM" #xFBAF)
+    ("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM" #xFBB0)
+    ("ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM" #xFBB1)
+    ("ARABIC LETTER NG ISOLATED FORM" #xFBD3)
+    ("ARABIC LETTER NG FINAL FORM" #xFBD4)
+    ("ARABIC LETTER NG INITIAL FORM" #xFBD5)
+    ("ARABIC LETTER NG MEDIAL FORM" #xFBD6)
+    ("ARABIC LETTER U ISOLATED FORM" #xFBD7)
+    ("ARABIC LETTER U FINAL FORM" #xFBD8)
+    ("ARABIC LETTER OE ISOLATED FORM" #xFBD9)
+    ("ARABIC LETTER OE FINAL FORM" #xFBDA)
+    ("ARABIC LETTER YU ISOLATED FORM" #xFBDB)
+    ("ARABIC LETTER YU FINAL FORM" #xFBDC)
+    ("ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM" #xFBDD)
+    ("ARABIC LETTER VE ISOLATED FORM" #xFBDE)
+    ("ARABIC LETTER VE FINAL FORM" #xFBDF)
+    ("ARABIC LETTER KIRGHIZ OE ISOLATED FORM" #xFBE0)
+    ("ARABIC LETTER KIRGHIZ OE FINAL FORM" #xFBE1)
+    ("ARABIC LETTER KIRGHIZ YU ISOLATED FORM" #xFBE2)
+    ("ARABIC LETTER KIRGHIZ YU FINAL FORM" #xFBE3)
+    ("ARABIC LETTER E ISOLATED FORM" #xFBE4)
+    ("ARABIC LETTER E FINAL FORM" #xFBE5)
+    ("ARABIC LETTER E INITIAL FORM" #xFBE6)
+    ("ARABIC LETTER E MEDIAL FORM" #xFBE7)
+    ("ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM" #xFBE8)
+    ("ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM" #xFBE9)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM" #xFBEA)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM" #xFBEB)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM" #xFBEC)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM" #xFBED)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM" #xFBEE)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM" #xFBEF)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM" #xFBF0)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM" #xFBF1)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM" #xFBF2)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM" #xFBF3)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM" #xFBF4)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM" #xFBF5)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM" #xFBF6)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM" #xFBF7)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM" #xFBF8)
+    ("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM" #xFBF9)
+    ("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM" #xFBFA)
+    ("ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM" #xFBFB)
+    ("ARABIC LETTER FARSI YEH ISOLATED FORM" #xFBFC)
+    ("ARABIC LETTER FARSI YEH FINAL FORM" #xFBFD)
+    ("ARABIC LETTER FARSI YEH INITIAL FORM" #xFBFE)
+    ("ARABIC LETTER FARSI YEH MEDIAL FORM" #xFBFF)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM" #xFC00)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM" #xFC01)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM" #xFC02)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM" #xFC03)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM" #xFC04)
+    ("ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM" #xFC05)
+    ("ARABIC LIGATURE BEH WITH HAH ISOLATED FORM" #xFC06)
+    ("ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM" #xFC07)
+    ("ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM" #xFC08)
+    ("ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM" #xFC09)
+    ("ARABIC LIGATURE BEH WITH YEH ISOLATED FORM" #xFC0A)
+    ("ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM" #xFC0B)
+    ("ARABIC LIGATURE TEH WITH HAH ISOLATED FORM" #xFC0C)
+    ("ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM" #xFC0D)
+    ("ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM" #xFC0E)
+    ("ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM" #xFC0F)
+    ("ARABIC LIGATURE TEH WITH YEH ISOLATED FORM" #xFC10)
+    ("ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM" #xFC11)
+    ("ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM" #xFC12)
+    ("ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM" #xFC13)
+    ("ARABIC LIGATURE THEH WITH YEH ISOLATED FORM" #xFC14)
+    ("ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM" #xFC15)
+    ("ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM" #xFC16)
+    ("ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM" #xFC17)
+    ("ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM" #xFC18)
+    ("ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM" #xFC19)
+    ("ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM" #xFC1A)
+    ("ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM" #xFC1B)
+    ("ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM" #xFC1C)
+    ("ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM" #xFC1D)
+    ("ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM" #xFC1E)
+    ("ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM" #xFC1F)
+    ("ARABIC LIGATURE SAD WITH HAH ISOLATED FORM" #xFC20)
+    ("ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM" #xFC21)
+    ("ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM" #xFC22)
+    ("ARABIC LIGATURE DAD WITH HAH ISOLATED FORM" #xFC23)
+    ("ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM" #xFC24)
+    ("ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM" #xFC25)
+    ("ARABIC LIGATURE TAH WITH HAH ISOLATED FORM" #xFC26)
+    ("ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM" #xFC27)
+    ("ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM" #xFC28)
+    ("ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM" #xFC29)
+    ("ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM" #xFC2A)
+    ("ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM" #xFC2B)
+    ("ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM" #xFC2C)
+    ("ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM" #xFC2D)
+    ("ARABIC LIGATURE FEH WITH HAH ISOLATED FORM" #xFC2E)
+    ("ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM" #xFC2F)
+    ("ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM" #xFC30)
+    ("ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM" #xFC31)
+    ("ARABIC LIGATURE FEH WITH YEH ISOLATED FORM" #xFC32)
+    ("ARABIC LIGATURE QAF WITH HAH ISOLATED FORM" #xFC33)
+    ("ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM" #xFC34)
+    ("ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM" #xFC35)
+    ("ARABIC LIGATURE QAF WITH YEH ISOLATED FORM" #xFC36)
+    ("ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM" #xFC37)
+    ("ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM" #xFC38)
+    ("ARABIC LIGATURE KAF WITH HAH ISOLATED FORM" #xFC39)
+    ("ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM" #xFC3A)
+    ("ARABIC LIGATURE KAF WITH LAM ISOLATED FORM" #xFC3B)
+    ("ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM" #xFC3C)
+    ("ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM" #xFC3D)
+    ("ARABIC LIGATURE KAF WITH YEH ISOLATED FORM" #xFC3E)
+    ("ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM" #xFC3F)
+    ("ARABIC LIGATURE LAM WITH HAH ISOLATED FORM" #xFC40)
+    ("ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM" #xFC41)
+    ("ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM" #xFC42)
+    ("ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM" #xFC43)
+    ("ARABIC LIGATURE LAM WITH YEH ISOLATED FORM" #xFC44)
+    ("ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM" #xFC45)
+    ("ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM" #xFC46)
+    ("ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM" #xFC47)
+    ("ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM" #xFC48)
+    ("ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM" #xFC49)
+    ("ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM" #xFC4A)
+    ("ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM" #xFC4B)
+    ("ARABIC LIGATURE NOON WITH HAH ISOLATED FORM" #xFC4C)
+    ("ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM" #xFC4D)
+    ("ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM" #xFC4E)
+    ("ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM" #xFC4F)
+    ("ARABIC LIGATURE NOON WITH YEH ISOLATED FORM" #xFC50)
+    ("ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM" #xFC51)
+    ("ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM" #xFC52)
+    ("ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM" #xFC53)
+    ("ARABIC LIGATURE HEH WITH YEH ISOLATED FORM" #xFC54)
+    ("ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM" #xFC55)
+    ("ARABIC LIGATURE YEH WITH HAH ISOLATED FORM" #xFC56)
+    ("ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM" #xFC57)
+    ("ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM" #xFC58)
+    ("ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM" #xFC59)
+    ("ARABIC LIGATURE YEH WITH YEH ISOLATED FORM" #xFC5A)
+    ("ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC5B)
+    ("ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC5C)
+    ("ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC5D)
+    ("ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM" #xFC5E)
+    ("ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM" #xFC5F)
+    ("ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM" #xFC60)
+    ("ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM" #xFC61)
+    ("ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM" #xFC62)
+    ("ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM" #xFC63)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM" #xFC64)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM" #xFC65)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM" #xFC66)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM" #xFC67)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM" #xFC68)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM" #xFC69)
+    ("ARABIC LIGATURE BEH WITH REH FINAL FORM" #xFC6A)
+    ("ARABIC LIGATURE BEH WITH ZAIN FINAL FORM" #xFC6B)
+    ("ARABIC LIGATURE BEH WITH MEEM FINAL FORM" #xFC6C)
+    ("ARABIC LIGATURE BEH WITH NOON FINAL FORM" #xFC6D)
+    ("ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM" #xFC6E)
+    ("ARABIC LIGATURE BEH WITH YEH FINAL FORM" #xFC6F)
+    ("ARABIC LIGATURE TEH WITH REH FINAL FORM" #xFC70)
+    ("ARABIC LIGATURE TEH WITH ZAIN FINAL FORM" #xFC71)
+    ("ARABIC LIGATURE TEH WITH MEEM FINAL FORM" #xFC72)
+    ("ARABIC LIGATURE TEH WITH NOON FINAL FORM" #xFC73)
+    ("ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM" #xFC74)
+    ("ARABIC LIGATURE TEH WITH YEH FINAL FORM" #xFC75)
+    ("ARABIC LIGATURE THEH WITH REH FINAL FORM" #xFC76)
+    ("ARABIC LIGATURE THEH WITH ZAIN FINAL FORM" #xFC77)
+    ("ARABIC LIGATURE THEH WITH MEEM FINAL FORM" #xFC78)
+    ("ARABIC LIGATURE THEH WITH NOON FINAL FORM" #xFC79)
+    ("ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM" #xFC7A)
+    ("ARABIC LIGATURE THEH WITH YEH FINAL FORM" #xFC7B)
+    ("ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM" #xFC7C)
+    ("ARABIC LIGATURE FEH WITH YEH FINAL FORM" #xFC7D)
+    ("ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM" #xFC7E)
+    ("ARABIC LIGATURE QAF WITH YEH FINAL FORM" #xFC7F)
+    ("ARABIC LIGATURE KAF WITH ALEF FINAL FORM" #xFC80)
+    ("ARABIC LIGATURE KAF WITH LAM FINAL FORM" #xFC81)
+    ("ARABIC LIGATURE KAF WITH MEEM FINAL FORM" #xFC82)
+    ("ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM" #xFC83)
+    ("ARABIC LIGATURE KAF WITH YEH FINAL FORM" #xFC84)
+    ("ARABIC LIGATURE LAM WITH MEEM FINAL FORM" #xFC85)
+    ("ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM" #xFC86)
+    ("ARABIC LIGATURE LAM WITH YEH FINAL FORM" #xFC87)
+    ("ARABIC LIGATURE MEEM WITH ALEF FINAL FORM" #xFC88)
+    ("ARABIC LIGATURE MEEM WITH MEEM FINAL FORM" #xFC89)
+    ("ARABIC LIGATURE NOON WITH REH FINAL FORM" #xFC8A)
+    ("ARABIC LIGATURE NOON WITH ZAIN FINAL FORM" #xFC8B)
+    ("ARABIC LIGATURE NOON WITH MEEM FINAL FORM" #xFC8C)
+    ("ARABIC LIGATURE NOON WITH NOON FINAL FORM" #xFC8D)
+    ("ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM" #xFC8E)
+    ("ARABIC LIGATURE NOON WITH YEH FINAL FORM" #xFC8F)
+    ("ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM" #xFC90)
+    ("ARABIC LIGATURE YEH WITH REH FINAL FORM" #xFC91)
+    ("ARABIC LIGATURE YEH WITH ZAIN FINAL FORM" #xFC92)
+    ("ARABIC LIGATURE YEH WITH MEEM FINAL FORM" #xFC93)
+    ("ARABIC LIGATURE YEH WITH NOON FINAL FORM" #xFC94)
+    ("ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM" #xFC95)
+    ("ARABIC LIGATURE YEH WITH YEH FINAL FORM" #xFC96)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM" #xFC97)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM" #xFC98)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM" #xFC99)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM" #xFC9A)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM" #xFC9B)
+    ("ARABIC LIGATURE BEH WITH JEEM INITIAL FORM" #xFC9C)
+    ("ARABIC LIGATURE BEH WITH HAH INITIAL FORM" #xFC9D)
+    ("ARABIC LIGATURE BEH WITH KHAH INITIAL FORM" #xFC9E)
+    ("ARABIC LIGATURE BEH WITH MEEM INITIAL FORM" #xFC9F)
+    ("ARABIC LIGATURE BEH WITH HEH INITIAL FORM" #xFCA0)
+    ("ARABIC LIGATURE TEH WITH JEEM INITIAL FORM" #xFCA1)
+    ("ARABIC LIGATURE TEH WITH HAH INITIAL FORM" #xFCA2)
+    ("ARABIC LIGATURE TEH WITH KHAH INITIAL FORM" #xFCA3)
+    ("ARABIC LIGATURE TEH WITH MEEM INITIAL FORM" #xFCA4)
+    ("ARABIC LIGATURE TEH WITH HEH INITIAL FORM" #xFCA5)
+    ("ARABIC LIGATURE THEH WITH MEEM INITIAL FORM" #xFCA6)
+    ("ARABIC LIGATURE JEEM WITH HAH INITIAL FORM" #xFCA7)
+    ("ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM" #xFCA8)
+    ("ARABIC LIGATURE HAH WITH JEEM INITIAL FORM" #xFCA9)
+    ("ARABIC LIGATURE HAH WITH MEEM INITIAL FORM" #xFCAA)
+    ("ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM" #xFCAB)
+    ("ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM" #xFCAC)
+    ("ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM" #xFCAD)
+    ("ARABIC LIGATURE SEEN WITH HAH INITIAL FORM" #xFCAE)
+    ("ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM" #xFCAF)
+    ("ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM" #xFCB0)
+    ("ARABIC LIGATURE SAD WITH HAH INITIAL FORM" #xFCB1)
+    ("ARABIC LIGATURE SAD WITH KHAH INITIAL FORM" #xFCB2)
+    ("ARABIC LIGATURE SAD WITH MEEM INITIAL FORM" #xFCB3)
+    ("ARABIC LIGATURE DAD WITH JEEM INITIAL FORM" #xFCB4)
+    ("ARABIC LIGATURE DAD WITH HAH INITIAL FORM" #xFCB5)
+    ("ARABIC LIGATURE DAD WITH KHAH INITIAL FORM" #xFCB6)
+    ("ARABIC LIGATURE DAD WITH MEEM INITIAL FORM" #xFCB7)
+    ("ARABIC LIGATURE TAH WITH HAH INITIAL FORM" #xFCB8)
+    ("ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM" #xFCB9)
+    ("ARABIC LIGATURE AIN WITH JEEM INITIAL FORM" #xFCBA)
+    ("ARABIC LIGATURE AIN WITH MEEM INITIAL FORM" #xFCBB)
+    ("ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM" #xFCBC)
+    ("ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM" #xFCBD)
+    ("ARABIC LIGATURE FEH WITH JEEM INITIAL FORM" #xFCBE)
+    ("ARABIC LIGATURE FEH WITH HAH INITIAL FORM" #xFCBF)
+    ("ARABIC LIGATURE FEH WITH KHAH INITIAL FORM" #xFCC0)
+    ("ARABIC LIGATURE FEH WITH MEEM INITIAL FORM" #xFCC1)
+    ("ARABIC LIGATURE QAF WITH HAH INITIAL FORM" #xFCC2)
+    ("ARABIC LIGATURE QAF WITH MEEM INITIAL FORM" #xFCC3)
+    ("ARABIC LIGATURE KAF WITH JEEM INITIAL FORM" #xFCC4)
+    ("ARABIC LIGATURE KAF WITH HAH INITIAL FORM" #xFCC5)
+    ("ARABIC LIGATURE KAF WITH KHAH INITIAL FORM" #xFCC6)
+    ("ARABIC LIGATURE KAF WITH LAM INITIAL FORM" #xFCC7)
+    ("ARABIC LIGATURE KAF WITH MEEM INITIAL FORM" #xFCC8)
+    ("ARABIC LIGATURE LAM WITH JEEM INITIAL FORM" #xFCC9)
+    ("ARABIC LIGATURE LAM WITH HAH INITIAL FORM" #xFCCA)
+    ("ARABIC LIGATURE LAM WITH KHAH INITIAL FORM" #xFCCB)
+    ("ARABIC LIGATURE LAM WITH MEEM INITIAL FORM" #xFCCC)
+    ("ARABIC LIGATURE LAM WITH HEH INITIAL FORM" #xFCCD)
+    ("ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM" #xFCCE)
+    ("ARABIC LIGATURE MEEM WITH HAH INITIAL FORM" #xFCCF)
+    ("ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM" #xFCD0)
+    ("ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM" #xFCD1)
+    ("ARABIC LIGATURE NOON WITH JEEM INITIAL FORM" #xFCD2)
+    ("ARABIC LIGATURE NOON WITH HAH INITIAL FORM" #xFCD3)
+    ("ARABIC LIGATURE NOON WITH KHAH INITIAL FORM" #xFCD4)
+    ("ARABIC LIGATURE NOON WITH MEEM INITIAL FORM" #xFCD5)
+    ("ARABIC LIGATURE NOON WITH HEH INITIAL FORM" #xFCD6)
+    ("ARABIC LIGATURE HEH WITH JEEM INITIAL FORM" #xFCD7)
+    ("ARABIC LIGATURE HEH WITH MEEM INITIAL FORM" #xFCD8)
+    ("ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM" #xFCD9)
+    ("ARABIC LIGATURE YEH WITH JEEM INITIAL FORM" #xFCDA)
+    ("ARABIC LIGATURE YEH WITH HAH INITIAL FORM" #xFCDB)
+    ("ARABIC LIGATURE YEH WITH KHAH INITIAL FORM" #xFCDC)
+    ("ARABIC LIGATURE YEH WITH MEEM INITIAL FORM" #xFCDD)
+    ("ARABIC LIGATURE YEH WITH HEH INITIAL FORM" #xFCDE)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM" #xFCDF)
+    ("ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM" #xFCE0)
+    ("ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM" #xFCE1)
+    ("ARABIC LIGATURE BEH WITH HEH MEDIAL FORM" #xFCE2)
+    ("ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM" #xFCE3)
+    ("ARABIC LIGATURE TEH WITH HEH MEDIAL FORM" #xFCE4)
+    ("ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM" #xFCE5)
+    ("ARABIC LIGATURE THEH WITH HEH MEDIAL FORM" #xFCE6)
+    ("ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM" #xFCE7)
+    ("ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM" #xFCE8)
+    ("ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM" #xFCE9)
+    ("ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM" #xFCEA)
+    ("ARABIC LIGATURE KAF WITH LAM MEDIAL FORM" #xFCEB)
+    ("ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM" #xFCEC)
+    ("ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM" #xFCED)
+    ("ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM" #xFCEE)
+    ("ARABIC LIGATURE NOON WITH HEH MEDIAL FORM" #xFCEF)
+    ("ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM" #xFCF0)
+    ("ARABIC LIGATURE YEH WITH HEH MEDIAL FORM" #xFCF1)
+    ("ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM" #xFCF2)
+    ("ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM" #xFCF3)
+    ("ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM" #xFCF4)
+    ("ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM" #xFCF5)
+    ("ARABIC LIGATURE TAH WITH YEH ISOLATED FORM" #xFCF6)
+    ("ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM" #xFCF7)
+    ("ARABIC LIGATURE AIN WITH YEH ISOLATED FORM" #xFCF8)
+    ("ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM" #xFCF9)
+    ("ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM" #xFCFA)
+    ("ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM" #xFCFB)
+    ("ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM" #xFCFC)
+    ("ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM" #xFCFD)
+    ("ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM" #xFCFE)
+    ("ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM" #xFCFF)
+    ("ARABIC LIGATURE HAH WITH YEH ISOLATED FORM" #xFD00)
+    ("ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM" #xFD01)
+    ("ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM" #xFD02)
+    ("ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM" #xFD03)
+    ("ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM" #xFD04)
+    ("ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM" #xFD05)
+    ("ARABIC LIGATURE SAD WITH YEH ISOLATED FORM" #xFD06)
+    ("ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM" #xFD07)
+    ("ARABIC LIGATURE DAD WITH YEH ISOLATED FORM" #xFD08)
+    ("ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM" #xFD09)
+    ("ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM" #xFD0A)
+    ("ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM" #xFD0B)
+    ("ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM" #xFD0C)
+    ("ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM" #xFD0D)
+    ("ARABIC LIGATURE SEEN WITH REH ISOLATED FORM" #xFD0E)
+    ("ARABIC LIGATURE SAD WITH REH ISOLATED FORM" #xFD0F)
+    ("ARABIC LIGATURE DAD WITH REH ISOLATED FORM" #xFD10)
+    ("ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM" #xFD11)
+    ("ARABIC LIGATURE TAH WITH YEH FINAL FORM" #xFD12)
+    ("ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM" #xFD13)
+    ("ARABIC LIGATURE AIN WITH YEH FINAL FORM" #xFD14)
+    ("ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM" #xFD15)
+    ("ARABIC LIGATURE GHAIN WITH YEH FINAL FORM" #xFD16)
+    ("ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM" #xFD17)
+    ("ARABIC LIGATURE SEEN WITH YEH FINAL FORM" #xFD18)
+    ("ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM" #xFD19)
+    ("ARABIC LIGATURE SHEEN WITH YEH FINAL FORM" #xFD1A)
+    ("ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM" #xFD1B)
+    ("ARABIC LIGATURE HAH WITH YEH FINAL FORM" #xFD1C)
+    ("ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM" #xFD1D)
+    ("ARABIC LIGATURE JEEM WITH YEH FINAL FORM" #xFD1E)
+    ("ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM" #xFD1F)
+    ("ARABIC LIGATURE KHAH WITH YEH FINAL FORM" #xFD20)
+    ("ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM" #xFD21)
+    ("ARABIC LIGATURE SAD WITH YEH FINAL FORM" #xFD22)
+    ("ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM" #xFD23)
+    ("ARABIC LIGATURE DAD WITH YEH FINAL FORM" #xFD24)
+    ("ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM" #xFD25)
+    ("ARABIC LIGATURE SHEEN WITH HAH FINAL FORM" #xFD26)
+    ("ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM" #xFD27)
+    ("ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM" #xFD28)
+    ("ARABIC LIGATURE SHEEN WITH REH FINAL FORM" #xFD29)
+    ("ARABIC LIGATURE SEEN WITH REH FINAL FORM" #xFD2A)
+    ("ARABIC LIGATURE SAD WITH REH FINAL FORM" #xFD2B)
+    ("ARABIC LIGATURE DAD WITH REH FINAL FORM" #xFD2C)
+    ("ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM" #xFD2D)
+    ("ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM" #xFD2E)
+    ("ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM" #xFD2F)
+    ("ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM" #xFD30)
+    ("ARABIC LIGATURE SEEN WITH HEH INITIAL FORM" #xFD31)
+    ("ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM" #xFD32)
+    ("ARABIC LIGATURE TAH WITH MEEM INITIAL FORM" #xFD33)
+    ("ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM" #xFD34)
+    ("ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM" #xFD35)
+    ("ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM" #xFD36)
+    ("ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM" #xFD37)
+    ("ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM" #xFD38)
+    ("ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM" #xFD39)
+    ("ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM" #xFD3A)
+    ("ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM" #xFD3B)
+    ("ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM" #xFD3C)
+    ("ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM" #xFD3D)
+    ("ORNATE LEFT PARENTHESIS" #xFD3E)
+    ("ORNATE RIGHT PARENTHESIS" #xFD3F)
+    ("ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM" #xFD50)
+    ("ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM" #xFD51)
+    ("ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM" #xFD52)
+    ("ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM" #xFD53)
+    ("ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM" #xFD54)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM" #xFD55)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM" #xFD56)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM" #xFD57)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM" #xFD58)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM" #xFD59)
+    ("ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM" #xFD5A)
+    ("ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD5B)
+    ("ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM" #xFD5C)
+    ("ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM" #xFD5D)
+    ("ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM" #xFD5E)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM" #xFD5F)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM" #xFD60)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM" #xFD61)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM" #xFD62)
+    ("ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM" #xFD63)
+    ("ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM" #xFD64)
+    ("ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM" #xFD65)
+    ("ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM" #xFD66)
+    ("ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM" #xFD67)
+    ("ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM" #xFD68)
+    ("ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM" #xFD69)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM" #xFD6A)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM" #xFD6B)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM" #xFD6C)
+    ("ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM" #xFD6D)
+    ("ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFD6E)
+    ("ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM" #xFD6F)
+    ("ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM" #xFD70)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM" #xFD71)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM" #xFD72)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM" #xFD73)
+    ("ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM" #xFD74)
+    ("ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM" #xFD75)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM" #xFD76)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM" #xFD77)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD78)
+    ("ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM" #xFD79)
+    ("ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM" #xFD7A)
+    ("ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD7B)
+    ("ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM" #xFD7C)
+    ("ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM" #xFD7D)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM" #xFD7E)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM" #xFD7F)
+    ("ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM" #xFD80)
+    ("ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM" #xFD81)
+    ("ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFD82)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM" #xFD83)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM" #xFD84)
+    ("ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM" #xFD85)
+    ("ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM" #xFD86)
+    ("ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM" #xFD87)
+    ("ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM" #xFD88)
+    ("ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM" #xFD89)
+    ("ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM" #xFD8A)
+    ("ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM" #xFD8B)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM" #xFD8C)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM" #xFD8D)
+    ("ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM" #xFD8E)
+    ("ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM" #xFD8F)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM" #xFD92)
+    ("ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM" #xFD93)
+    ("ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM" #xFD94)
+    ("ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM" #xFD95)
+    ("ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFD96)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM" #xFD97)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM" #xFD98)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM" #xFD99)
+    ("ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM" #xFD9A)
+    ("ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFD9B)
+    ("ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM" #xFD9C)
+    ("ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM" #xFD9D)
+    ("ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM" #xFD9E)
+    ("ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM" #xFD9F)
+    ("ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM" #xFDA0)
+    ("ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM" #xFDA1)
+    ("ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM" #xFDA2)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM" #xFDA3)
+    ("ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFDA4)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM" #xFDA5)
+    ("ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM" #xFDA6)
+    ("ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM" #xFDA7)
+    ("ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM" #xFDA8)
+    ("ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM" #xFDA9)
+    ("ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM" #xFDAA)
+    ("ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM" #xFDAB)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM" #xFDAC)
+    ("ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM" #xFDAD)
+    ("ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM" #xFDAE)
+    ("ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM" #xFDAF)
+    ("ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM" #xFDB0)
+    ("ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM" #xFDB1)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM" #xFDB2)
+    ("ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM" #xFDB3)
+    ("ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM" #xFDB4)
+    ("ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM" #xFDB5)
+    ("ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM" #xFDB6)
+    ("ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM" #xFDB7)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM" #xFDB8)
+    ("ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM" #xFDB9)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM" #xFDBA)
+    ("ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM" #xFDBB)
+    ("ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM" #xFDBC)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM" #xFDBD)
+    ("ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM" #xFDBE)
+    ("ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM" #xFDBF)
+    ("ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM" #xFDC0)
+    ("ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM" #xFDC1)
+    ("ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM" #xFDC2)
+    ("ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM" #xFDC3)
+    ("ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM" #xFDC4)
+    ("ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM" #xFDC5)
+    ("ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM" #xFDC6)
+    ("ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM" #xFDC7)
+    ("ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM" #xFDF0)
+    ("ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM" #xFDF1)
+    ("ARABIC LIGATURE ALLAH ISOLATED FORM" #xFDF2)
+    ("ARABIC LIGATURE AKBAR ISOLATED FORM" #xFDF3)
+    ("ARABIC LIGATURE MOHAMMAD ISOLATED FORM" #xFDF4)
+    ("ARABIC LIGATURE SALAM ISOLATED FORM" #xFDF5)
+    ("ARABIC LIGATURE RASOUL ISOLATED FORM" #xFDF6)
+    ("ARABIC LIGATURE ALAYHE ISOLATED FORM" #xFDF7)
+    ("ARABIC LIGATURE WASALLAM ISOLATED FORM" #xFDF8)
+    ("ARABIC LIGATURE SALLA ISOLATED FORM" #xFDF9)
+    ("ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM" #xFDFA)
+    ("ARABIC LIGATURE JALLAJALALOUHOU" #xFDFB)
+    ("RIAL SIGN" #xFDFC)
+    ))
+
+;; arch-tag: 1fbfd997-096a-43c8-88a1-9d438ddabb57
diff --git a/etc/nxml/0FE00-0FE0F.el b/etc/nxml/0FE00-0FE0F.el
new file mode 100644 (file)
index 0000000..187b58d
--- /dev/null
@@ -0,0 +1,20 @@
+(nxml-define-char-name-set 'variation-selectors
+  '(("VARIATION SELECTOR-1" #xFE00)
+    ("VARIATION SELECTOR-2" #xFE01)
+    ("VARIATION SELECTOR-3" #xFE02)
+    ("VARIATION SELECTOR-4" #xFE03)
+    ("VARIATION SELECTOR-5" #xFE04)
+    ("VARIATION SELECTOR-6" #xFE05)
+    ("VARIATION SELECTOR-7" #xFE06)
+    ("VARIATION SELECTOR-8" #xFE07)
+    ("VARIATION SELECTOR-9" #xFE08)
+    ("VARIATION SELECTOR-10" #xFE09)
+    ("VARIATION SELECTOR-11" #xFE0A)
+    ("VARIATION SELECTOR-12" #xFE0B)
+    ("VARIATION SELECTOR-13" #xFE0C)
+    ("VARIATION SELECTOR-14" #xFE0D)
+    ("VARIATION SELECTOR-15" #xFE0E)
+    ("VARIATION SELECTOR-16" #xFE0F)
+    ))
+
+;; arch-tag: 591c3457-10c0-4036-8bfb-6cccd23f44dd
diff --git a/etc/nxml/0FE20-0FE2F.el b/etc/nxml/0FE20-0FE2F.el
new file mode 100644 (file)
index 0000000..358dccd
--- /dev/null
@@ -0,0 +1,8 @@
+(nxml-define-char-name-set 'combining-half-marks
+  '(("COMBINING LIGATURE LEFT HALF" #xFE20)
+    ("COMBINING LIGATURE RIGHT HALF" #xFE21)
+    ("COMBINING DOUBLE TILDE LEFT HALF" #xFE22)
+    ("COMBINING DOUBLE TILDE RIGHT HALF" #xFE23)
+    ))
+
+;; arch-tag: de291a34-737a-4bbb-8d97-94f878921d05
diff --git a/etc/nxml/0FE30-0FE4F.el b/etc/nxml/0FE30-0FE4F.el
new file mode 100644 (file)
index 0000000..b7fe8c0
--- /dev/null
@@ -0,0 +1,34 @@
+(nxml-define-char-name-set 'cjk-compatibility-forms
+  '(("PRESENTATION FORM FOR VERTICAL TWO DOT LEADER" #xFE30)
+    ("PRESENTATION FORM FOR VERTICAL EM DASH" #xFE31)
+    ("PRESENTATION FORM FOR VERTICAL EN DASH" #xFE32)
+    ("PRESENTATION FORM FOR VERTICAL LOW LINE" #xFE33)
+    ("PRESENTATION FORM FOR VERTICAL WAVY LOW LINE" #xFE34)
+    ("PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS" #xFE35)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS" #xFE36)
+    ("PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET" #xFE37)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET" #xFE38)
+    ("PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET" #xFE39)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET" #xFE3A)
+    ("PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET" #xFE3B)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET" #xFE3C)
+    ("PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET" #xFE3D)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET" #xFE3E)
+    ("PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET" #xFE3F)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET" #xFE40)
+    ("PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET" #xFE41)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET" #xFE42)
+    ("PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET" #xFE43)
+    ("PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET" #xFE44)
+    ("SESAME DOT" #xFE45)
+    ("WHITE SESAME DOT" #xFE46)
+    ("DASHED OVERLINE" #xFE49)
+    ("CENTRELINE OVERLINE" #xFE4A)
+    ("WAVY OVERLINE" #xFE4B)
+    ("DOUBLE WAVY OVERLINE" #xFE4C)
+    ("DASHED LOW LINE" #xFE4D)
+    ("CENTRELINE LOW LINE" #xFE4E)
+    ("WAVY LOW LINE" #xFE4F)
+    ))
+
+;; arch-tag: 6d8f4c10-304f-4d0b-b830-1e37a8386015
diff --git a/etc/nxml/0FE50-0FE6F.el b/etc/nxml/0FE50-0FE6F.el
new file mode 100644 (file)
index 0000000..966d5a2
--- /dev/null
@@ -0,0 +1,30 @@
+(nxml-define-char-name-set 'small-form-variants
+  '(("SMALL COMMA" #xFE50)
+    ("SMALL IDEOGRAPHIC COMMA" #xFE51)
+    ("SMALL FULL STOP" #xFE52)
+    ("SMALL SEMICOLON" #xFE54)
+    ("SMALL COLON" #xFE55)
+    ("SMALL QUESTION MARK" #xFE56)
+    ("SMALL EXCLAMATION MARK" #xFE57)
+    ("SMALL EM DASH" #xFE58)
+    ("SMALL LEFT PARENTHESIS" #xFE59)
+    ("SMALL RIGHT PARENTHESIS" #xFE5A)
+    ("SMALL LEFT CURLY BRACKET" #xFE5B)
+    ("SMALL RIGHT CURLY BRACKET" #xFE5C)
+    ("SMALL LEFT TORTOISE SHELL BRACKET" #xFE5D)
+    ("SMALL RIGHT TORTOISE SHELL BRACKET" #xFE5E)
+    ("SMALL NUMBER SIGN" #xFE5F)
+    ("SMALL AMPERSAND" #xFE60)
+    ("SMALL ASTERISK" #xFE61)
+    ("SMALL PLUS SIGN" #xFE62)
+    ("SMALL HYPHEN-MINUS" #xFE63)
+    ("SMALL LESS-THAN SIGN" #xFE64)
+    ("SMALL GREATER-THAN SIGN" #xFE65)
+    ("SMALL EQUALS SIGN" #xFE66)
+    ("SMALL REVERSE SOLIDUS" #xFE68)
+    ("SMALL DOLLAR SIGN" #xFE69)
+    ("SMALL PERCENT SIGN" #xFE6A)
+    ("SMALL COMMERCIAL AT" #xFE6B)
+    ))
+
+;; arch-tag: 4facf8e4-cea2-4194-bc17-f0959c358f7f
diff --git a/etc/nxml/0FE70-0FEFF.el b/etc/nxml/0FE70-0FEFF.el
new file mode 100644 (file)
index 0000000..07b03da
--- /dev/null
@@ -0,0 +1,145 @@
+(nxml-define-char-name-set 'arabic-presentation-forms-b
+  '(("ARABIC FATHATAN ISOLATED FORM" #xFE70)
+    ("ARABIC TATWEEL WITH FATHATAN ABOVE" #xFE71)
+    ("ARABIC DAMMATAN ISOLATED FORM" #xFE72)
+    ("ARABIC TAIL FRAGMENT" #xFE73)
+    ("ARABIC KASRATAN ISOLATED FORM" #xFE74)
+    ("ARABIC FATHA ISOLATED FORM" #xFE76)
+    ("ARABIC FATHA MEDIAL FORM" #xFE77)
+    ("ARABIC DAMMA ISOLATED FORM" #xFE78)
+    ("ARABIC DAMMA MEDIAL FORM" #xFE79)
+    ("ARABIC KASRA ISOLATED FORM" #xFE7A)
+    ("ARABIC KASRA MEDIAL FORM" #xFE7B)
+    ("ARABIC SHADDA ISOLATED FORM" #xFE7C)
+    ("ARABIC SHADDA MEDIAL FORM" #xFE7D)
+    ("ARABIC SUKUN ISOLATED FORM" #xFE7E)
+    ("ARABIC SUKUN MEDIAL FORM" #xFE7F)
+    ("ARABIC LETTER HAMZA ISOLATED FORM" #xFE80)
+    ("ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM" #xFE81)
+    ("ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM" #xFE82)
+    ("ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM" #xFE83)
+    ("ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM" #xFE84)
+    ("ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM" #xFE85)
+    ("ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM" #xFE86)
+    ("ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM" #xFE87)
+    ("ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM" #xFE88)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM" #xFE89)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM" #xFE8A)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM" #xFE8B)
+    ("ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM" #xFE8C)
+    ("ARABIC LETTER ALEF ISOLATED FORM" #xFE8D)
+    ("ARABIC LETTER ALEF FINAL FORM" #xFE8E)
+    ("ARABIC LETTER BEH ISOLATED FORM" #xFE8F)
+    ("ARABIC LETTER BEH FINAL FORM" #xFE90)
+    ("ARABIC LETTER BEH INITIAL FORM" #xFE91)
+    ("ARABIC LETTER BEH MEDIAL FORM" #xFE92)
+    ("ARABIC LETTER TEH MARBUTA ISOLATED FORM" #xFE93)
+    ("ARABIC LETTER TEH MARBUTA FINAL FORM" #xFE94)
+    ("ARABIC LETTER TEH ISOLATED FORM" #xFE95)
+    ("ARABIC LETTER TEH FINAL FORM" #xFE96)
+    ("ARABIC LETTER TEH INITIAL FORM" #xFE97)
+    ("ARABIC LETTER TEH MEDIAL FORM" #xFE98)
+    ("ARABIC LETTER THEH ISOLATED FORM" #xFE99)
+    ("ARABIC LETTER THEH FINAL FORM" #xFE9A)
+    ("ARABIC LETTER THEH INITIAL FORM" #xFE9B)
+    ("ARABIC LETTER THEH MEDIAL FORM" #xFE9C)
+    ("ARABIC LETTER JEEM ISOLATED FORM" #xFE9D)
+    ("ARABIC LETTER JEEM FINAL FORM" #xFE9E)
+    ("ARABIC LETTER JEEM INITIAL FORM" #xFE9F)
+    ("ARABIC LETTER JEEM MEDIAL FORM" #xFEA0)
+    ("ARABIC LETTER HAH ISOLATED FORM" #xFEA1)
+    ("ARABIC LETTER HAH FINAL FORM" #xFEA2)
+    ("ARABIC LETTER HAH INITIAL FORM" #xFEA3)
+    ("ARABIC LETTER HAH MEDIAL FORM" #xFEA4)
+    ("ARABIC LETTER KHAH ISOLATED FORM" #xFEA5)
+    ("ARABIC LETTER KHAH FINAL FORM" #xFEA6)
+    ("ARABIC LETTER KHAH INITIAL FORM" #xFEA7)
+    ("ARABIC LETTER KHAH MEDIAL FORM" #xFEA8)
+    ("ARABIC LETTER DAL ISOLATED FORM" #xFEA9)
+    ("ARABIC LETTER DAL FINAL FORM" #xFEAA)
+    ("ARABIC LETTER THAL ISOLATED FORM" #xFEAB)
+    ("ARABIC LETTER THAL FINAL FORM" #xFEAC)
+    ("ARABIC LETTER REH ISOLATED FORM" #xFEAD)
+    ("ARABIC LETTER REH FINAL FORM" #xFEAE)
+    ("ARABIC LETTER ZAIN ISOLATED FORM" #xFEAF)
+    ("ARABIC LETTER ZAIN FINAL FORM" #xFEB0)
+    ("ARABIC LETTER SEEN ISOLATED FORM" #xFEB1)
+    ("ARABIC LETTER SEEN FINAL FORM" #xFEB2)
+    ("ARABIC LETTER SEEN INITIAL FORM" #xFEB3)
+    ("ARABIC LETTER SEEN MEDIAL FORM" #xFEB4)
+    ("ARABIC LETTER SHEEN ISOLATED FORM" #xFEB5)
+    ("ARABIC LETTER SHEEN FINAL FORM" #xFEB6)
+    ("ARABIC LETTER SHEEN INITIAL FORM" #xFEB7)
+    ("ARABIC LETTER SHEEN MEDIAL FORM" #xFEB8)
+    ("ARABIC LETTER SAD ISOLATED FORM" #xFEB9)
+    ("ARABIC LETTER SAD FINAL FORM" #xFEBA)
+    ("ARABIC LETTER SAD INITIAL FORM" #xFEBB)
+    ("ARABIC LETTER SAD MEDIAL FORM" #xFEBC)
+    ("ARABIC LETTER DAD ISOLATED FORM" #xFEBD)
+    ("ARABIC LETTER DAD FINAL FORM" #xFEBE)
+    ("ARABIC LETTER DAD INITIAL FORM" #xFEBF)
+    ("ARABIC LETTER DAD MEDIAL FORM" #xFEC0)
+    ("ARABIC LETTER TAH ISOLATED FORM" #xFEC1)
+    ("ARABIC LETTER TAH FINAL FORM" #xFEC2)
+    ("ARABIC LETTER TAH INITIAL FORM" #xFEC3)
+    ("ARABIC LETTER TAH MEDIAL FORM" #xFEC4)
+    ("ARABIC LETTER ZAH ISOLATED FORM" #xFEC5)
+    ("ARABIC LETTER ZAH FINAL FORM" #xFEC6)
+    ("ARABIC LETTER ZAH INITIAL FORM" #xFEC7)
+    ("ARABIC LETTER ZAH MEDIAL FORM" #xFEC8)
+    ("ARABIC LETTER AIN ISOLATED FORM" #xFEC9)
+    ("ARABIC LETTER AIN FINAL FORM" #xFECA)
+    ("ARABIC LETTER AIN INITIAL FORM" #xFECB)
+    ("ARABIC LETTER AIN MEDIAL FORM" #xFECC)
+    ("ARABIC LETTER GHAIN ISOLATED FORM" #xFECD)
+    ("ARABIC LETTER GHAIN FINAL FORM" #xFECE)
+    ("ARABIC LETTER GHAIN INITIAL FORM" #xFECF)
+    ("ARABIC LETTER GHAIN MEDIAL FORM" #xFED0)
+    ("ARABIC LETTER FEH ISOLATED FORM" #xFED1)
+    ("ARABIC LETTER FEH FINAL FORM" #xFED2)
+    ("ARABIC LETTER FEH INITIAL FORM" #xFED3)
+    ("ARABIC LETTER FEH MEDIAL FORM" #xFED4)
+    ("ARABIC LETTER QAF ISOLATED FORM" #xFED5)
+    ("ARABIC LETTER QAF FINAL FORM" #xFED6)
+    ("ARABIC LETTER QAF INITIAL FORM" #xFED7)
+    ("ARABIC LETTER QAF MEDIAL FORM" #xFED8)
+    ("ARABIC LETTER KAF ISOLATED FORM" #xFED9)
+    ("ARABIC LETTER KAF FINAL FORM" #xFEDA)
+    ("ARABIC LETTER KAF INITIAL FORM" #xFEDB)
+    ("ARABIC LETTER KAF MEDIAL FORM" #xFEDC)
+    ("ARABIC LETTER LAM ISOLATED FORM" #xFEDD)
+    ("ARABIC LETTER LAM FINAL FORM" #xFEDE)
+    ("ARABIC LETTER LAM INITIAL FORM" #xFEDF)
+    ("ARABIC LETTER LAM MEDIAL FORM" #xFEE0)
+    ("ARABIC LETTER MEEM ISOLATED FORM" #xFEE1)
+    ("ARABIC LETTER MEEM FINAL FORM" #xFEE2)
+    ("ARABIC LETTER MEEM INITIAL FORM" #xFEE3)
+    ("ARABIC LETTER MEEM MEDIAL FORM" #xFEE4)
+    ("ARABIC LETTER NOON ISOLATED FORM" #xFEE5)
+    ("ARABIC LETTER NOON FINAL FORM" #xFEE6)
+    ("ARABIC LETTER NOON INITIAL FORM" #xFEE7)
+    ("ARABIC LETTER NOON MEDIAL FORM" #xFEE8)
+    ("ARABIC LETTER HEH ISOLATED FORM" #xFEE9)
+    ("ARABIC LETTER HEH FINAL FORM" #xFEEA)
+    ("ARABIC LETTER HEH INITIAL FORM" #xFEEB)
+    ("ARABIC LETTER HEH MEDIAL FORM" #xFEEC)
+    ("ARABIC LETTER WAW ISOLATED FORM" #xFEED)
+    ("ARABIC LETTER WAW FINAL FORM" #xFEEE)
+    ("ARABIC LETTER ALEF MAKSURA ISOLATED FORM" #xFEEF)
+    ("ARABIC LETTER ALEF MAKSURA FINAL FORM" #xFEF0)
+    ("ARABIC LETTER YEH ISOLATED FORM" #xFEF1)
+    ("ARABIC LETTER YEH FINAL FORM" #xFEF2)
+    ("ARABIC LETTER YEH INITIAL FORM" #xFEF3)
+    ("ARABIC LETTER YEH MEDIAL FORM" #xFEF4)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM" #xFEF5)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM" #xFEF6)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM" #xFEF7)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM" #xFEF8)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM" #xFEF9)
+    ("ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM" #xFEFA)
+    ("ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM" #xFEFB)
+    ("ARABIC LIGATURE LAM WITH ALEF FINAL FORM" #xFEFC)
+    ("ZERO WIDTH NO-BREAK SPACE" #xFEFF)
+    ))
+
+;; arch-tag: cdc72129-3cd8-4568-8366-c0deee767c17
diff --git a/etc/nxml/0FF00-0FFEF.el b/etc/nxml/0FF00-0FFEF.el
new file mode 100644 (file)
index 0000000..fb8dd89
--- /dev/null
@@ -0,0 +1,229 @@
+(nxml-define-char-name-set 'halfwidth-and-fullwidth-forms
+  '(("FULLWIDTH EXCLAMATION MARK" #xFF01)
+    ("FULLWIDTH QUOTATION MARK" #xFF02)
+    ("FULLWIDTH NUMBER SIGN" #xFF03)
+    ("FULLWIDTH DOLLAR SIGN" #xFF04)
+    ("FULLWIDTH PERCENT SIGN" #xFF05)
+    ("FULLWIDTH AMPERSAND" #xFF06)
+    ("FULLWIDTH APOSTROPHE" #xFF07)
+    ("FULLWIDTH LEFT PARENTHESIS" #xFF08)
+    ("FULLWIDTH RIGHT PARENTHESIS" #xFF09)
+    ("FULLWIDTH ASTERISK" #xFF0A)
+    ("FULLWIDTH PLUS SIGN" #xFF0B)
+    ("FULLWIDTH COMMA" #xFF0C)
+    ("FULLWIDTH HYPHEN-MINUS" #xFF0D)
+    ("FULLWIDTH FULL STOP" #xFF0E)
+    ("FULLWIDTH SOLIDUS" #xFF0F)
+    ("FULLWIDTH DIGIT ZERO" #xFF10)
+    ("FULLWIDTH DIGIT ONE" #xFF11)
+    ("FULLWIDTH DIGIT TWO" #xFF12)
+    ("FULLWIDTH DIGIT THREE" #xFF13)
+    ("FULLWIDTH DIGIT FOUR" #xFF14)
+    ("FULLWIDTH DIGIT FIVE" #xFF15)
+    ("FULLWIDTH DIGIT SIX" #xFF16)
+    ("FULLWIDTH DIGIT SEVEN" #xFF17)
+    ("FULLWIDTH DIGIT EIGHT" #xFF18)
+    ("FULLWIDTH DIGIT NINE" #xFF19)
+    ("FULLWIDTH COLON" #xFF1A)
+    ("FULLWIDTH SEMICOLON" #xFF1B)
+    ("FULLWIDTH LESS-THAN SIGN" #xFF1C)
+    ("FULLWIDTH EQUALS SIGN" #xFF1D)
+    ("FULLWIDTH GREATER-THAN SIGN" #xFF1E)
+    ("FULLWIDTH QUESTION MARK" #xFF1F)
+    ("FULLWIDTH COMMERCIAL AT" #xFF20)
+    ("FULLWIDTH LATIN CAPITAL LETTER A" #xFF21)
+    ("FULLWIDTH LATIN CAPITAL LETTER B" #xFF22)
+    ("FULLWIDTH LATIN CAPITAL LETTER C" #xFF23)
+    ("FULLWIDTH LATIN CAPITAL LETTER D" #xFF24)
+    ("FULLWIDTH LATIN CAPITAL LETTER E" #xFF25)
+    ("FULLWIDTH LATIN CAPITAL LETTER F" #xFF26)
+    ("FULLWIDTH LATIN CAPITAL LETTER G" #xFF27)
+    ("FULLWIDTH LATIN CAPITAL LETTER H" #xFF28)
+    ("FULLWIDTH LATIN CAPITAL LETTER I" #xFF29)
+    ("FULLWIDTH LATIN CAPITAL LETTER J" #xFF2A)
+    ("FULLWIDTH LATIN CAPITAL LETTER K" #xFF2B)
+    ("FULLWIDTH LATIN CAPITAL LETTER L" #xFF2C)
+    ("FULLWIDTH LATIN CAPITAL LETTER M" #xFF2D)
+    ("FULLWIDTH LATIN CAPITAL LETTER N" #xFF2E)
+    ("FULLWIDTH LATIN CAPITAL LETTER O" #xFF2F)
+    ("FULLWIDTH LATIN CAPITAL LETTER P" #xFF30)
+    ("FULLWIDTH LATIN CAPITAL LETTER Q" #xFF31)
+    ("FULLWIDTH LATIN CAPITAL LETTER R" #xFF32)
+    ("FULLWIDTH LATIN CAPITAL LETTER S" #xFF33)
+    ("FULLWIDTH LATIN CAPITAL LETTER T" #xFF34)
+    ("FULLWIDTH LATIN CAPITAL LETTER U" #xFF35)
+    ("FULLWIDTH LATIN CAPITAL LETTER V" #xFF36)
+    ("FULLWIDTH LATIN CAPITAL LETTER W" #xFF37)
+    ("FULLWIDTH LATIN CAPITAL LETTER X" #xFF38)
+    ("FULLWIDTH LATIN CAPITAL LETTER Y" #xFF39)
+    ("FULLWIDTH LATIN CAPITAL LETTER Z" #xFF3A)
+    ("FULLWIDTH LEFT SQUARE BRACKET" #xFF3B)
+    ("FULLWIDTH REVERSE SOLIDUS" #xFF3C)
+    ("FULLWIDTH RIGHT SQUARE BRACKET" #xFF3D)
+    ("FULLWIDTH CIRCUMFLEX ACCENT" #xFF3E)
+    ("FULLWIDTH LOW LINE" #xFF3F)
+    ("FULLWIDTH GRAVE ACCENT" #xFF40)
+    ("FULLWIDTH LATIN SMALL LETTER A" #xFF41)
+    ("FULLWIDTH LATIN SMALL LETTER B" #xFF42)
+    ("FULLWIDTH LATIN SMALL LETTER C" #xFF43)
+    ("FULLWIDTH LATIN SMALL LETTER D" #xFF44)
+    ("FULLWIDTH LATIN SMALL LETTER E" #xFF45)
+    ("FULLWIDTH LATIN SMALL LETTER F" #xFF46)
+    ("FULLWIDTH LATIN SMALL LETTER G" #xFF47)
+    ("FULLWIDTH LATIN SMALL LETTER H" #xFF48)
+    ("FULLWIDTH LATIN SMALL LETTER I" #xFF49)
+    ("FULLWIDTH LATIN SMALL LETTER J" #xFF4A)
+    ("FULLWIDTH LATIN SMALL LETTER K" #xFF4B)
+    ("FULLWIDTH LATIN SMALL LETTER L" #xFF4C)
+    ("FULLWIDTH LATIN SMALL LETTER M" #xFF4D)
+    ("FULLWIDTH LATIN SMALL LETTER N" #xFF4E)
+    ("FULLWIDTH LATIN SMALL LETTER O" #xFF4F)
+    ("FULLWIDTH LATIN SMALL LETTER P" #xFF50)
+    ("FULLWIDTH LATIN SMALL LETTER Q" #xFF51)
+    ("FULLWIDTH LATIN SMALL LETTER R" #xFF52)
+    ("FULLWIDTH LATIN SMALL LETTER S" #xFF53)
+    ("FULLWIDTH LATIN SMALL LETTER T" #xFF54)
+    ("FULLWIDTH LATIN SMALL LETTER U" #xFF55)
+    ("FULLWIDTH LATIN SMALL LETTER V" #xFF56)
+    ("FULLWIDTH LATIN SMALL LETTER W" #xFF57)
+    ("FULLWIDTH LATIN SMALL LETTER X" #xFF58)
+    ("FULLWIDTH LATIN SMALL LETTER Y" #xFF59)
+    ("FULLWIDTH LATIN SMALL LETTER Z" #xFF5A)
+    ("FULLWIDTH LEFT CURLY BRACKET" #xFF5B)
+    ("FULLWIDTH VERTICAL LINE" #xFF5C)
+    ("FULLWIDTH RIGHT CURLY BRACKET" #xFF5D)
+    ("FULLWIDTH TILDE" #xFF5E)
+    ("FULLWIDTH LEFT WHITE PARENTHESIS" #xFF5F)
+    ("FULLWIDTH RIGHT WHITE PARENTHESIS" #xFF60)
+    ("HALFWIDTH IDEOGRAPHIC FULL STOP" #xFF61)
+    ("HALFWIDTH LEFT CORNER BRACKET" #xFF62)
+    ("HALFWIDTH RIGHT CORNER BRACKET" #xFF63)
+    ("HALFWIDTH IDEOGRAPHIC COMMA" #xFF64)
+    ("HALFWIDTH KATAKANA MIDDLE DOT" #xFF65)
+    ("HALFWIDTH KATAKANA LETTER WO" #xFF66)
+    ("HALFWIDTH KATAKANA LETTER SMALL A" #xFF67)
+    ("HALFWIDTH KATAKANA LETTER SMALL I" #xFF68)
+    ("HALFWIDTH KATAKANA LETTER SMALL U" #xFF69)
+    ("HALFWIDTH KATAKANA LETTER SMALL E" #xFF6A)
+    ("HALFWIDTH KATAKANA LETTER SMALL O" #xFF6B)
+    ("HALFWIDTH KATAKANA LETTER SMALL YA" #xFF6C)
+    ("HALFWIDTH KATAKANA LETTER SMALL YU" #xFF6D)
+    ("HALFWIDTH KATAKANA LETTER SMALL YO" #xFF6E)
+    ("HALFWIDTH KATAKANA LETTER SMALL TU" #xFF6F)
+    ("HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK" #xFF70)
+    ("HALFWIDTH KATAKANA LETTER A" #xFF71)
+    ("HALFWIDTH KATAKANA LETTER I" #xFF72)
+    ("HALFWIDTH KATAKANA LETTER U" #xFF73)
+    ("HALFWIDTH KATAKANA LETTER E" #xFF74)
+    ("HALFWIDTH KATAKANA LETTER O" #xFF75)
+    ("HALFWIDTH KATAKANA LETTER KA" #xFF76)
+    ("HALFWIDTH KATAKANA LETTER KI" #xFF77)
+    ("HALFWIDTH KATAKANA LETTER KU" #xFF78)
+    ("HALFWIDTH KATAKANA LETTER KE" #xFF79)
+    ("HALFWIDTH KATAKANA LETTER KO" #xFF7A)
+    ("HALFWIDTH KATAKANA LETTER SA" #xFF7B)
+    ("HALFWIDTH KATAKANA LETTER SI" #xFF7C)
+    ("HALFWIDTH KATAKANA LETTER SU" #xFF7D)
+    ("HALFWIDTH KATAKANA LETTER SE" #xFF7E)
+    ("HALFWIDTH KATAKANA LETTER SO" #xFF7F)
+    ("HALFWIDTH KATAKANA LETTER TA" #xFF80)
+    ("HALFWIDTH KATAKANA LETTER TI" #xFF81)
+    ("HALFWIDTH KATAKANA LETTER TU" #xFF82)
+    ("HALFWIDTH KATAKANA LETTER TE" #xFF83)
+    ("HALFWIDTH KATAKANA LETTER TO" #xFF84)
+    ("HALFWIDTH KATAKANA LETTER NA" #xFF85)
+    ("HALFWIDTH KATAKANA LETTER NI" #xFF86)
+    ("HALFWIDTH KATAKANA LETTER NU" #xFF87)
+    ("HALFWIDTH KATAKANA LETTER NE" #xFF88)
+    ("HALFWIDTH KATAKANA LETTER NO" #xFF89)
+    ("HALFWIDTH KATAKANA LETTER HA" #xFF8A)
+    ("HALFWIDTH KATAKANA LETTER HI" #xFF8B)
+    ("HALFWIDTH KATAKANA LETTER HU" #xFF8C)
+    ("HALFWIDTH KATAKANA LETTER HE" #xFF8D)
+    ("HALFWIDTH KATAKANA LETTER HO" #xFF8E)
+    ("HALFWIDTH KATAKANA LETTER MA" #xFF8F)
+    ("HALFWIDTH KATAKANA LETTER MI" #xFF90)
+    ("HALFWIDTH KATAKANA LETTER MU" #xFF91)
+    ("HALFWIDTH KATAKANA LETTER ME" #xFF92)
+    ("HALFWIDTH KATAKANA LETTER MO" #xFF93)
+    ("HALFWIDTH KATAKANA LETTER YA" #xFF94)
+    ("HALFWIDTH KATAKANA LETTER YU" #xFF95)
+    ("HALFWIDTH KATAKANA LETTER YO" #xFF96)
+    ("HALFWIDTH KATAKANA LETTER RA" #xFF97)
+    ("HALFWIDTH KATAKANA LETTER RI" #xFF98)
+    ("HALFWIDTH KATAKANA LETTER RU" #xFF99)
+    ("HALFWIDTH KATAKANA LETTER RE" #xFF9A)
+    ("HALFWIDTH KATAKANA LETTER RO" #xFF9B)
+    ("HALFWIDTH KATAKANA LETTER WA" #xFF9C)
+    ("HALFWIDTH KATAKANA LETTER N" #xFF9D)
+    ("HALFWIDTH KATAKANA VOICED SOUND MARK" #xFF9E)
+    ("HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK" #xFF9F)
+    ("HALFWIDTH HANGUL FILLER" #xFFA0)
+    ("HALFWIDTH HANGUL LETTER KIYEOK" #xFFA1)
+    ("HALFWIDTH HANGUL LETTER SSANGKIYEOK" #xFFA2)
+    ("HALFWIDTH HANGUL LETTER KIYEOK-SIOS" #xFFA3)
+    ("HALFWIDTH HANGUL LETTER NIEUN" #xFFA4)
+    ("HALFWIDTH HANGUL LETTER NIEUN-CIEUC" #xFFA5)
+    ("HALFWIDTH HANGUL LETTER NIEUN-HIEUH" #xFFA6)
+    ("HALFWIDTH HANGUL LETTER TIKEUT" #xFFA7)
+    ("HALFWIDTH HANGUL LETTER SSANGTIKEUT" #xFFA8)
+    ("HALFWIDTH HANGUL LETTER RIEUL" #xFFA9)
+    ("HALFWIDTH HANGUL LETTER RIEUL-KIYEOK" #xFFAA)
+    ("HALFWIDTH HANGUL LETTER RIEUL-MIEUM" #xFFAB)
+    ("HALFWIDTH HANGUL LETTER RIEUL-PIEUP" #xFFAC)
+    ("HALFWIDTH HANGUL LETTER RIEUL-SIOS" #xFFAD)
+    ("HALFWIDTH HANGUL LETTER RIEUL-THIEUTH" #xFFAE)
+    ("HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH" #xFFAF)
+    ("HALFWIDTH HANGUL LETTER RIEUL-HIEUH" #xFFB0)
+    ("HALFWIDTH HANGUL LETTER MIEUM" #xFFB1)
+    ("HALFWIDTH HANGUL LETTER PIEUP" #xFFB2)
+    ("HALFWIDTH HANGUL LETTER SSANGPIEUP" #xFFB3)
+    ("HALFWIDTH HANGUL LETTER PIEUP-SIOS" #xFFB4)
+    ("HALFWIDTH HANGUL LETTER SIOS" #xFFB5)
+    ("HALFWIDTH HANGUL LETTER SSANGSIOS" #xFFB6)
+    ("HALFWIDTH HANGUL LETTER IEUNG" #xFFB7)
+    ("HALFWIDTH HANGUL LETTER CIEUC" #xFFB8)
+    ("HALFWIDTH HANGUL LETTER SSANGCIEUC" #xFFB9)
+    ("HALFWIDTH HANGUL LETTER CHIEUCH" #xFFBA)
+    ("HALFWIDTH HANGUL LETTER KHIEUKH" #xFFBB)
+    ("HALFWIDTH HANGUL LETTER THIEUTH" #xFFBC)
+    ("HALFWIDTH HANGUL LETTER PHIEUPH" #xFFBD)
+    ("HALFWIDTH HANGUL LETTER HIEUH" #xFFBE)
+    ("HALFWIDTH HANGUL LETTER A" #xFFC2)
+    ("HALFWIDTH HANGUL LETTER AE" #xFFC3)
+    ("HALFWIDTH HANGUL LETTER YA" #xFFC4)
+    ("HALFWIDTH HANGUL LETTER YAE" #xFFC5)
+    ("HALFWIDTH HANGUL LETTER EO" #xFFC6)
+    ("HALFWIDTH HANGUL LETTER E" #xFFC7)
+    ("HALFWIDTH HANGUL LETTER YEO" #xFFCA)
+    ("HALFWIDTH HANGUL LETTER YE" #xFFCB)
+    ("HALFWIDTH HANGUL LETTER O" #xFFCC)
+    ("HALFWIDTH HANGUL LETTER WA" #xFFCD)
+    ("HALFWIDTH HANGUL LETTER WAE" #xFFCE)
+    ("HALFWIDTH HANGUL LETTER OE" #xFFCF)
+    ("HALFWIDTH HANGUL LETTER YO" #xFFD2)
+    ("HALFWIDTH HANGUL LETTER U" #xFFD3)
+    ("HALFWIDTH HANGUL LETTER WEO" #xFFD4)
+    ("HALFWIDTH HANGUL LETTER WE" #xFFD5)
+    ("HALFWIDTH HANGUL LETTER WI" #xFFD6)
+    ("HALFWIDTH HANGUL LETTER YU" #xFFD7)
+    ("HALFWIDTH HANGUL LETTER EU" #xFFDA)
+    ("HALFWIDTH HANGUL LETTER YI" #xFFDB)
+    ("HALFWIDTH HANGUL LETTER I" #xFFDC)
+    ("FULLWIDTH CENT SIGN" #xFFE0)
+    ("FULLWIDTH POUND SIGN" #xFFE1)
+    ("FULLWIDTH NOT SIGN" #xFFE2)
+    ("FULLWIDTH MACRON" #xFFE3)
+    ("FULLWIDTH BROKEN BAR" #xFFE4)
+    ("FULLWIDTH YEN SIGN" #xFFE5)
+    ("FULLWIDTH WON SIGN" #xFFE6)
+    ("HALFWIDTH FORMS LIGHT VERTICAL" #xFFE8)
+    ("HALFWIDTH LEFTWARDS ARROW" #xFFE9)
+    ("HALFWIDTH UPWARDS ARROW" #xFFEA)
+    ("HALFWIDTH RIGHTWARDS ARROW" #xFFEB)
+    ("HALFWIDTH DOWNWARDS ARROW" #xFFEC)
+    ("HALFWIDTH BLACK SQUARE" #xFFED)
+    ("HALFWIDTH WHITE CIRCLE" #xFFEE)
+    ))
+
+;; arch-tag: 8af7a95d-6e71-47da-9679-b516b6e2f01a
diff --git a/etc/nxml/0FFF0-0FFFF.el b/etc/nxml/0FFF0-0FFFF.el
new file mode 100644 (file)
index 0000000..392312b
--- /dev/null
@@ -0,0 +1,9 @@
+(nxml-define-char-name-set 'specials
+  '(("INTERLINEAR ANNOTATION ANCHOR" #xFFF9)
+    ("INTERLINEAR ANNOTATION SEPARATOR" #xFFFA)
+    ("INTERLINEAR ANNOTATION TERMINATOR" #xFFFB)
+    ("OBJECT REPLACEMENT CHARACTER" #xFFFC)
+    ("REPLACEMENT CHARACTER" #xFFFD)
+    ))
+
+;; arch-tag: 0bef6e81-4857-4032-a18a-18784233cc81
diff --git a/etc/nxml/10300-1032F.el b/etc/nxml/10300-1032F.el
new file mode 100644 (file)
index 0000000..95d2600
--- /dev/null
@@ -0,0 +1,39 @@
+(nxml-define-char-name-set 'old-italic
+  '(("OLD ITALIC LETTER A" #x10300)
+    ("OLD ITALIC LETTER BE" #x10301)
+    ("OLD ITALIC LETTER KE" #x10302)
+    ("OLD ITALIC LETTER DE" #x10303)
+    ("OLD ITALIC LETTER E" #x10304)
+    ("OLD ITALIC LETTER VE" #x10305)
+    ("OLD ITALIC LETTER ZE" #x10306)
+    ("OLD ITALIC LETTER HE" #x10307)
+    ("OLD ITALIC LETTER THE" #x10308)
+    ("OLD ITALIC LETTER I" #x10309)
+    ("OLD ITALIC LETTER KA" #x1030A)
+    ("OLD ITALIC LETTER EL" #x1030B)
+    ("OLD ITALIC LETTER EM" #x1030C)
+    ("OLD ITALIC LETTER EN" #x1030D)
+    ("OLD ITALIC LETTER ESH" #x1030E)
+    ("OLD ITALIC LETTER O" #x1030F)
+    ("OLD ITALIC LETTER PE" #x10310)
+    ("OLD ITALIC LETTER SHE" #x10311)
+    ("OLD ITALIC LETTER KU" #x10312)
+    ("OLD ITALIC LETTER ER" #x10313)
+    ("OLD ITALIC LETTER ES" #x10314)
+    ("OLD ITALIC LETTER TE" #x10315)
+    ("OLD ITALIC LETTER U" #x10316)
+    ("OLD ITALIC LETTER EKS" #x10317)
+    ("OLD ITALIC LETTER PHE" #x10318)
+    ("OLD ITALIC LETTER KHE" #x10319)
+    ("OLD ITALIC LETTER EF" #x1031A)
+    ("OLD ITALIC LETTER ERS" #x1031B)
+    ("OLD ITALIC LETTER CHE" #x1031C)
+    ("OLD ITALIC LETTER II" #x1031D)
+    ("OLD ITALIC LETTER UU" #x1031E)
+    ("OLD ITALIC NUMERAL ONE" #x10320)
+    ("OLD ITALIC NUMERAL FIVE" #x10321)
+    ("OLD ITALIC NUMERAL TEN" #x10322)
+    ("OLD ITALIC NUMERAL FIFTY" #x10323)
+    ))
+
+;; arch-tag: 823cbcc4-a815-4f82-a1e9-348c2f5d237e
diff --git a/etc/nxml/10330-1034F.el b/etc/nxml/10330-1034F.el
new file mode 100644 (file)
index 0000000..edd9de4
--- /dev/null
@@ -0,0 +1,31 @@
+(nxml-define-char-name-set 'gothic
+  '(("GOTHIC LETTER AHSA" #x10330)
+    ("GOTHIC LETTER BAIRKAN" #x10331)
+    ("GOTHIC LETTER GIBA" #x10332)
+    ("GOTHIC LETTER DAGS" #x10333)
+    ("GOTHIC LETTER AIHVUS" #x10334)
+    ("GOTHIC LETTER QAIRTHRA" #x10335)
+    ("GOTHIC LETTER IUJA" #x10336)
+    ("GOTHIC LETTER HAGL" #x10337)
+    ("GOTHIC LETTER THIUTH" #x10338)
+    ("GOTHIC LETTER EIS" #x10339)
+    ("GOTHIC LETTER KUSMA" #x1033A)
+    ("GOTHIC LETTER LAGUS" #x1033B)
+    ("GOTHIC LETTER MANNA" #x1033C)
+    ("GOTHIC LETTER NAUTHS" #x1033D)
+    ("GOTHIC LETTER JER" #x1033E)
+    ("GOTHIC LETTER URUS" #x1033F)
+    ("GOTHIC LETTER PAIRTHRA" #x10340)
+    ("GOTHIC LETTER NINETY" #x10341)
+    ("GOTHIC LETTER RAIDA" #x10342)
+    ("GOTHIC LETTER SAUIL" #x10343)
+    ("GOTHIC LETTER TEIWS" #x10344)
+    ("GOTHIC LETTER WINJA" #x10345)
+    ("GOTHIC LETTER FAIHU" #x10346)
+    ("GOTHIC LETTER IGGWS" #x10347)
+    ("GOTHIC LETTER HWAIR" #x10348)
+    ("GOTHIC LETTER OTHAL" #x10349)
+    ("GOTHIC LETTER NINE HUNDRED" #x1034A)
+    ))
+
+;; arch-tag: 29caddb6-76f0-44bc-83f9-6cef55c20600
diff --git a/etc/nxml/10400-1044F.el b/etc/nxml/10400-1044F.el
new file mode 100644 (file)
index 0000000..a26005a
--- /dev/null
@@ -0,0 +1,80 @@
+(nxml-define-char-name-set 'deseret
+  '(("DESERET CAPITAL LETTER LONG I" #x10400)
+    ("DESERET CAPITAL LETTER LONG E" #x10401)
+    ("DESERET CAPITAL LETTER LONG A" #x10402)
+    ("DESERET CAPITAL LETTER LONG AH" #x10403)
+    ("DESERET CAPITAL LETTER LONG O" #x10404)
+    ("DESERET CAPITAL LETTER LONG OO" #x10405)
+    ("DESERET CAPITAL LETTER SHORT I" #x10406)
+    ("DESERET CAPITAL LETTER SHORT E" #x10407)
+    ("DESERET CAPITAL LETTER SHORT A" #x10408)
+    ("DESERET CAPITAL LETTER SHORT AH" #x10409)
+    ("DESERET CAPITAL LETTER SHORT O" #x1040A)
+    ("DESERET CAPITAL LETTER SHORT OO" #x1040B)
+    ("DESERET CAPITAL LETTER AY" #x1040C)
+    ("DESERET CAPITAL LETTER OW" #x1040D)
+    ("DESERET CAPITAL LETTER WU" #x1040E)
+    ("DESERET CAPITAL LETTER YEE" #x1040F)
+    ("DESERET CAPITAL LETTER H" #x10410)
+    ("DESERET CAPITAL LETTER PEE" #x10411)
+    ("DESERET CAPITAL LETTER BEE" #x10412)
+    ("DESERET CAPITAL LETTER TEE" #x10413)
+    ("DESERET CAPITAL LETTER DEE" #x10414)
+    ("DESERET CAPITAL LETTER CHEE" #x10415)
+    ("DESERET CAPITAL LETTER JEE" #x10416)
+    ("DESERET CAPITAL LETTER KAY" #x10417)
+    ("DESERET CAPITAL LETTER GAY" #x10418)
+    ("DESERET CAPITAL LETTER EF" #x10419)
+    ("DESERET CAPITAL LETTER VEE" #x1041A)
+    ("DESERET CAPITAL LETTER ETH" #x1041B)
+    ("DESERET CAPITAL LETTER THEE" #x1041C)
+    ("DESERET CAPITAL LETTER ES" #x1041D)
+    ("DESERET CAPITAL LETTER ZEE" #x1041E)
+    ("DESERET CAPITAL LETTER ESH" #x1041F)
+    ("DESERET CAPITAL LETTER ZHEE" #x10420)
+    ("DESERET CAPITAL LETTER ER" #x10421)
+    ("DESERET CAPITAL LETTER EL" #x10422)
+    ("DESERET CAPITAL LETTER EM" #x10423)
+    ("DESERET CAPITAL LETTER EN" #x10424)
+    ("DESERET CAPITAL LETTER ENG" #x10425)
+    ("DESERET SMALL LETTER LONG I" #x10428)
+    ("DESERET SMALL LETTER LONG E" #x10429)
+    ("DESERET SMALL LETTER LONG A" #x1042A)
+    ("DESERET SMALL LETTER LONG AH" #x1042B)
+    ("DESERET SMALL LETTER LONG O" #x1042C)
+    ("DESERET SMALL LETTER LONG OO" #x1042D)
+    ("DESERET SMALL LETTER SHORT I" #x1042E)
+    ("DESERET SMALL LETTER SHORT E" #x1042F)
+    ("DESERET SMALL LETTER SHORT A" #x10430)
+    ("DESERET SMALL LETTER SHORT AH" #x10431)
+    ("DESERET SMALL LETTER SHORT O" #x10432)
+    ("DESERET SMALL LETTER SHORT OO" #x10433)
+    ("DESERET SMALL LETTER AY" #x10434)
+    ("DESERET SMALL LETTER OW" #x10435)
+    ("DESERET SMALL LETTER WU" #x10436)
+    ("DESERET SMALL LETTER YEE" #x10437)
+    ("DESERET SMALL LETTER H" #x10438)
+    ("DESERET SMALL LETTER PEE" #x10439)
+    ("DESERET SMALL LETTER BEE" #x1043A)
+    ("DESERET SMALL LETTER TEE" #x1043B)
+    ("DESERET SMALL LETTER DEE" #x1043C)
+    ("DESERET SMALL LETTER CHEE" #x1043D)
+    ("DESERET SMALL LETTER JEE" #x1043E)
+    ("DESERET SMALL LETTER KAY" #x1043F)
+    ("DESERET SMALL LETTER GAY" #x10440)
+    ("DESERET SMALL LETTER EF" #x10441)
+    ("DESERET SMALL LETTER VEE" #x10442)
+    ("DESERET SMALL LETTER ETH" #x10443)
+    ("DESERET SMALL LETTER THEE" #x10444)
+    ("DESERET SMALL LETTER ES" #x10445)
+    ("DESERET SMALL LETTER ZEE" #x10446)
+    ("DESERET SMALL LETTER ESH" #x10447)
+    ("DESERET SMALL LETTER ZHEE" #x10448)
+    ("DESERET SMALL LETTER ER" #x10449)
+    ("DESERET SMALL LETTER EL" #x1044A)
+    ("DESERET SMALL LETTER EM" #x1044B)
+    ("DESERET SMALL LETTER EN" #x1044C)
+    ("DESERET SMALL LETTER ENG" #x1044D)
+    ))
+
+;; arch-tag: 0fbf6586-41cf-41b2-88e9-d113db5d933e
diff --git a/etc/nxml/1D000-1D0FF.el b/etc/nxml/1D000-1D0FF.el
new file mode 100644 (file)
index 0000000..1c76fd0
--- /dev/null
@@ -0,0 +1,250 @@
+(nxml-define-char-name-set 'byzantine-musical-symbols
+  '(("BYZANTINE MUSICAL SYMBOL PSILI" #x1D000)
+    ("BYZANTINE MUSICAL SYMBOL DASEIA" #x1D001)
+    ("BYZANTINE MUSICAL SYMBOL PERISPOMENI" #x1D002)
+    ("BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON" #x1D003)
+    ("BYZANTINE MUSICAL SYMBOL OXEIA DIPLI" #x1D004)
+    ("BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON" #x1D005)
+    ("BYZANTINE MUSICAL SYMBOL VAREIA DIPLI" #x1D006)
+    ("BYZANTINE MUSICAL SYMBOL KATHISTI" #x1D007)
+    ("BYZANTINE MUSICAL SYMBOL SYRMATIKI" #x1D008)
+    ("BYZANTINE MUSICAL SYMBOL PARAKLITIKI" #x1D009)
+    ("BYZANTINE MUSICAL SYMBOL YPOKRISIS" #x1D00A)
+    ("BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI" #x1D00B)
+    ("BYZANTINE MUSICAL SYMBOL KREMASTI" #x1D00C)
+    ("BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON" #x1D00D)
+    ("BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON" #x1D00E)
+    ("BYZANTINE MUSICAL SYMBOL TELEIA" #x1D00F)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA" #x1D010)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOS" #x1D011)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI" #x1D012)
+    ("BYZANTINE MUSICAL SYMBOL SYNEVMA" #x1D013)
+    ("BYZANTINE MUSICAL SYMBOL THITA" #x1D014)
+    ("BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION" #x1D015)
+    ("BYZANTINE MUSICAL SYMBOL GORGON ARCHAION" #x1D016)
+    ("BYZANTINE MUSICAL SYMBOL PSILON" #x1D017)
+    ("BYZANTINE MUSICAL SYMBOL CHAMILON" #x1D018)
+    ("BYZANTINE MUSICAL SYMBOL VATHY" #x1D019)
+    ("BYZANTINE MUSICAL SYMBOL ISON ARCHAION" #x1D01A)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION" #x1D01B)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION" #x1D01C)
+    ("BYZANTINE MUSICAL SYMBOL SAXIMATA" #x1D01D)
+    ("BYZANTINE MUSICAL SYMBOL PARICHON" #x1D01E)
+    ("BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA" #x1D01F)
+    ("BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION" #x1D020)
+    ("BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION" #x1D021)
+    ("BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION" #x1D022)
+    ("BYZANTINE MUSICAL SYMBOL APOTHEMA" #x1D023)
+    ("BYZANTINE MUSICAL SYMBOL KLASMA" #x1D024)
+    ("BYZANTINE MUSICAL SYMBOL REVMA" #x1D025)
+    ("BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION" #x1D026)
+    ("BYZANTINE MUSICAL SYMBOL TINAGMA" #x1D027)
+    ("BYZANTINE MUSICAL SYMBOL ANATRICHISMA" #x1D028)
+    ("BYZANTINE MUSICAL SYMBOL SEISMA" #x1D029)
+    ("BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION" #x1D02A)
+    ("BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU" #x1D02B)
+    ("BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION" #x1D02C)
+    ("BYZANTINE MUSICAL SYMBOL THEMA" #x1D02D)
+    ("BYZANTINE MUSICAL SYMBOL LEMOI" #x1D02E)
+    ("BYZANTINE MUSICAL SYMBOL DYO" #x1D02F)
+    ("BYZANTINE MUSICAL SYMBOL TRIA" #x1D030)
+    ("BYZANTINE MUSICAL SYMBOL TESSERA" #x1D031)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMATA" #x1D032)
+    ("BYZANTINE MUSICAL SYMBOL APESO EXO NEO" #x1D033)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION" #x1D034)
+    ("BYZANTINE MUSICAL SYMBOL IMIFTHORA" #x1D035)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION" #x1D036)
+    ("BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON" #x1D037)
+    ("BYZANTINE MUSICAL SYMBOL PELASTON" #x1D038)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTON" #x1D039)
+    ("BYZANTINE MUSICAL SYMBOL KONTEVMA" #x1D03A)
+    ("BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION" #x1D03B)
+    ("BYZANTINE MUSICAL SYMBOL RAPISMA" #x1D03C)
+    ("BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION" #x1D03D)
+    ("BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION" #x1D03E)
+    ("BYZANTINE MUSICAL SYMBOL ICHADIN" #x1D03F)
+    ("BYZANTINE MUSICAL SYMBOL NANA" #x1D040)
+    ("BYZANTINE MUSICAL SYMBOL PETASMA" #x1D041)
+    ("BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO" #x1D042)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKON ALLO" #x1D043)
+    ("BYZANTINE MUSICAL SYMBOL STRAGGISMATA" #x1D044)
+    ("BYZANTINE MUSICAL SYMBOL GRONTHISMATA" #x1D045)
+    ("BYZANTINE MUSICAL SYMBOL ISON NEO" #x1D046)
+    ("BYZANTINE MUSICAL SYMBOL OLIGON NEO" #x1D047)
+    ("BYZANTINE MUSICAL SYMBOL OXEIA NEO" #x1D048)
+    ("BYZANTINE MUSICAL SYMBOL PETASTI" #x1D049)
+    ("BYZANTINE MUSICAL SYMBOL KOUFISMA" #x1D04A)
+    ("BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA" #x1D04B)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA" #x1D04C)
+    ("BYZANTINE MUSICAL SYMBOL PELASTON NEO" #x1D04D)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO" #x1D04E)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO" #x1D04F)
+    ("BYZANTINE MUSICAL SYMBOL YPSILI" #x1D050)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO" #x1D051)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO" #x1D052)
+    ("BYZANTINE MUSICAL SYMBOL YPORROI" #x1D053)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON" #x1D054)
+    ("BYZANTINE MUSICAL SYMBOL ELAFRON" #x1D055)
+    ("BYZANTINE MUSICAL SYMBOL CHAMILI" #x1D056)
+    ("BYZANTINE MUSICAL SYMBOL MIKRON ISON" #x1D057)
+    ("BYZANTINE MUSICAL SYMBOL VAREIA NEO" #x1D058)
+    ("BYZANTINE MUSICAL SYMBOL PIASMA NEO" #x1D059)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTON NEO" #x1D05A)
+    ("BYZANTINE MUSICAL SYMBOL OMALON" #x1D05B)
+    ("BYZANTINE MUSICAL SYMBOL ANTIKENOMA" #x1D05C)
+    ("BYZANTINE MUSICAL SYMBOL LYGISMA" #x1D05D)
+    ("BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO" #x1D05E)
+    ("BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO" #x1D05F)
+    ("BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA" #x1D060)
+    ("BYZANTINE MUSICAL SYMBOL KYLISMA" #x1D061)
+    ("BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA" #x1D062)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKON NEO" #x1D063)
+    ("BYZANTINE MUSICAL SYMBOL EKSTREPTON" #x1D064)
+    ("BYZANTINE MUSICAL SYMBOL SYNAGMA NEO" #x1D065)
+    ("BYZANTINE MUSICAL SYMBOL SYRMA" #x1D066)
+    ("BYZANTINE MUSICAL SYMBOL CHOREVMA NEO" #x1D067)
+    ("BYZANTINE MUSICAL SYMBOL EPEGERMA" #x1D068)
+    ("BYZANTINE MUSICAL SYMBOL SEISMA NEO" #x1D069)
+    ("BYZANTINE MUSICAL SYMBOL XIRON KLASMA" #x1D06A)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON" #x1D06B)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA" #x1D06C)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA" #x1D06D)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA" #x1D06E)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA" #x1D06F)
+    ("BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA" #x1D070)
+    ("BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA" #x1D071)
+    ("BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON" #x1D072)
+    ("BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON" #x1D073)
+    ("BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON" #x1D074)
+    ("BYZANTINE MUSICAL SYMBOL OYRANISMA NEO" #x1D075)
+    ("BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO" #x1D076)
+    ("BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO" #x1D077)
+    ("BYZANTINE MUSICAL SYMBOL THEMA APLOUN" #x1D078)
+    ("BYZANTINE MUSICAL SYMBOL THES KAI APOTHES" #x1D079)
+    ("BYZANTINE MUSICAL SYMBOL KATAVASMA" #x1D07A)
+    ("BYZANTINE MUSICAL SYMBOL ENDOFONON" #x1D07B)
+    ("BYZANTINE MUSICAL SYMBOL YFEN KATO" #x1D07C)
+    ("BYZANTINE MUSICAL SYMBOL YFEN ANO" #x1D07D)
+    ("BYZANTINE MUSICAL SYMBOL STAVROS" #x1D07E)
+    ("BYZANTINE MUSICAL SYMBOL KLASMA ANO" #x1D07F)
+    ("BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION" #x1D080)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION" #x1D081)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMA ALLO" #x1D082)
+    ("BYZANTINE MUSICAL SYMBOL KRATIMA NEO" #x1D083)
+    ("BYZANTINE MUSICAL SYMBOL APODERMA NEO" #x1D084)
+    ("BYZANTINE MUSICAL SYMBOL APLI" #x1D085)
+    ("BYZANTINE MUSICAL SYMBOL DIPLI" #x1D086)
+    ("BYZANTINE MUSICAL SYMBOL TRIPLI" #x1D087)
+    ("BYZANTINE MUSICAL SYMBOL TETRAPLI" #x1D088)
+    ("BYZANTINE MUSICAL SYMBOL KORONIS" #x1D089)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU" #x1D08A)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON" #x1D08B)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON" #x1D08C)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON" #x1D08D)
+    ("BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU" #x1D08E)
+    ("BYZANTINE MUSICAL SYMBOL GORGON NEO ANO" #x1D08F)
+    ("BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA" #x1D090)
+    ("BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA" #x1D091)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON" #x1D092)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO" #x1D093)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO" #x1D094)
+    ("BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA" #x1D095)
+    ("BYZANTINE MUSICAL SYMBOL TRIGORGON" #x1D096)
+    ("BYZANTINE MUSICAL SYMBOL ARGON" #x1D097)
+    ("BYZANTINE MUSICAL SYMBOL IMIDIARGON" #x1D098)
+    ("BYZANTINE MUSICAL SYMBOL DIARGON" #x1D099)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI" #x1D09A)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI" #x1D09B)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI ARGI" #x1D09C)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI METRIA" #x1D09D)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI MESI" #x1D09E)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI GORGI" #x1D09F)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI" #x1D0A0)
+    ("BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI" #x1D0A1)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS" #x1D0A2)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS" #x1D0A3)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS" #x1D0A4)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS" #x1D0A5)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS" #x1D0A6)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS" #x1D0A7)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS" #x1D0A8)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS" #x1D0A9)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS" #x1D0AA)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS" #x1D0AB)
+    ("BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS" #x1D0AC)
+    ("BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS" #x1D0AD)
+    ("BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS" #x1D0AE)
+    ("BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS" #x1D0AF)
+    ("BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS" #x1D0B0)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS" #x1D0B1)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS" #x1D0B2)
+    ("BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS" #x1D0B3)
+    ("BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN" #x1D0B4)
+    ("BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN" #x1D0B5)
+    ("BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU" #x1D0B6)
+    ("BYZANTINE MUSICAL SYMBOL IMIFONON" #x1D0B7)
+    ("BYZANTINE MUSICAL SYMBOL IMIFTHORON" #x1D0B8)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU" #x1D0B9)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA" #x1D0BA)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA" #x1D0BB)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS" #x1D0BC)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI" #x1D0BD)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI" #x1D0BE)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE" #x1D0BF)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO" #x1D0C0)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO" #x1D0C1)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO" #x1D0C2)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS" #x1D0C3)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS" #x1D0C4)
+    ("BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS" #x1D0C5)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI" #x1D0C6)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA NENANO" #x1D0C7)
+    ("BYZANTINE MUSICAL SYMBOL CHROA ZYGOS" #x1D0C8)
+    ("BYZANTINE MUSICAL SYMBOL CHROA KLITON" #x1D0C9)
+    ("BYZANTINE MUSICAL SYMBOL CHROA SPATHI" #x1D0CA)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION" #x1D0CB)
+    ("BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA" #x1D0CC)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION" #x1D0CD)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION" #x1D0CE)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION" #x1D0CF)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA" #x1D0D0)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA" #x1D0D1)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA" #x1D0D2)
+    ("BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA" #x1D0D3)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA" #x1D0D4)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA" #x1D0D5)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA" #x1D0D6)
+    ("BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA" #x1D0D7)
+    ("BYZANTINE MUSICAL SYMBOL GENIKI DIESIS" #x1D0D8)
+    ("BYZANTINE MUSICAL SYMBOL GENIKI YFESIS" #x1D0D9)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI" #x1D0DA)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI" #x1D0DB)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI" #x1D0DC)
+    ("BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS" #x1D0DD)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS" #x1D0DE)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU" #x1D0DF)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU" #x1D0E0)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU" #x1D0E1)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS" #x1D0E2)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU" #x1D0E3)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU" #x1D0E4)
+    ("BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU" #x1D0E5)
+    ("BYZANTINE MUSICAL SYMBOL DIGRAMMA GG" #x1D0E6)
+    ("BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU" #x1D0E7)
+    ("BYZANTINE MUSICAL SYMBOL STIGMA" #x1D0E8)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO PA" #x1D0E9)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO VOU" #x1D0EA)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO GA" #x1D0EB)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO DI" #x1D0EC)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO KE" #x1D0ED)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO ZO" #x1D0EE)
+    ("BYZANTINE MUSICAL SYMBOL ARKTIKO NI" #x1D0EF)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO" #x1D0F0)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO" #x1D0F1)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO" #x1D0F2)
+    ("BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO" #x1D0F3)
+    ("BYZANTINE MUSICAL SYMBOL KLASMA KATO" #x1D0F4)
+    ("BYZANTINE MUSICAL SYMBOL GORGON NEO KATO" #x1D0F5)
+    ))
+
+;; arch-tag: 2b360fc3-2760-43c9-9d3e-2ef3fd8452b5
diff --git a/etc/nxml/1D100-1D1FF.el b/etc/nxml/1D100-1D1FF.el
new file mode 100644 (file)
index 0000000..1bfbf26
--- /dev/null
@@ -0,0 +1,223 @@
+(nxml-define-char-name-set 'musical-symbols
+  '(("MUSICAL SYMBOL SINGLE BARLINE" #x1D100)
+    ("MUSICAL SYMBOL DOUBLE BARLINE" #x1D101)
+    ("MUSICAL SYMBOL FINAL BARLINE" #x1D102)
+    ("MUSICAL SYMBOL REVERSE FINAL BARLINE" #x1D103)
+    ("MUSICAL SYMBOL DASHED BARLINE" #x1D104)
+    ("MUSICAL SYMBOL SHORT BARLINE" #x1D105)
+    ("MUSICAL SYMBOL LEFT REPEAT SIGN" #x1D106)
+    ("MUSICAL SYMBOL RIGHT REPEAT SIGN" #x1D107)
+    ("MUSICAL SYMBOL REPEAT DOTS" #x1D108)
+    ("MUSICAL SYMBOL DAL SEGNO" #x1D109)
+    ("MUSICAL SYMBOL DA CAPO" #x1D10A)
+    ("MUSICAL SYMBOL SEGNO" #x1D10B)
+    ("MUSICAL SYMBOL CODA" #x1D10C)
+    ("MUSICAL SYMBOL REPEATED FIGURE-1" #x1D10D)
+    ("MUSICAL SYMBOL REPEATED FIGURE-2" #x1D10E)
+    ("MUSICAL SYMBOL REPEATED FIGURE-3" #x1D10F)
+    ("MUSICAL SYMBOL FERMATA" #x1D110)
+    ("MUSICAL SYMBOL FERMATA BELOW" #x1D111)
+    ("MUSICAL SYMBOL BREATH MARK" #x1D112)
+    ("MUSICAL SYMBOL CAESURA" #x1D113)
+    ("MUSICAL SYMBOL BRACE" #x1D114)
+    ("MUSICAL SYMBOL BRACKET" #x1D115)
+    ("MUSICAL SYMBOL ONE-LINE STAFF" #x1D116)
+    ("MUSICAL SYMBOL TWO-LINE STAFF" #x1D117)
+    ("MUSICAL SYMBOL THREE-LINE STAFF" #x1D118)
+    ("MUSICAL SYMBOL FOUR-LINE STAFF" #x1D119)
+    ("MUSICAL SYMBOL FIVE-LINE STAFF" #x1D11A)
+    ("MUSICAL SYMBOL SIX-LINE STAFF" #x1D11B)
+    ("MUSICAL SYMBOL SIX-STRING FRETBOARD" #x1D11C)
+    ("MUSICAL SYMBOL FOUR-STRING FRETBOARD" #x1D11D)
+    ("MUSICAL SYMBOL G CLEF" #x1D11E)
+    ("MUSICAL SYMBOL G CLEF OTTAVA ALTA" #x1D11F)
+    ("MUSICAL SYMBOL G CLEF OTTAVA BASSA" #x1D120)
+    ("MUSICAL SYMBOL C CLEF" #x1D121)
+    ("MUSICAL SYMBOL F CLEF" #x1D122)
+    ("MUSICAL SYMBOL F CLEF OTTAVA ALTA" #x1D123)
+    ("MUSICAL SYMBOL F CLEF OTTAVA BASSA" #x1D124)
+    ("MUSICAL SYMBOL DRUM CLEF-1" #x1D125)
+    ("MUSICAL SYMBOL DRUM CLEF-2" #x1D126)
+    ("MUSICAL SYMBOL DOUBLE SHARP" #x1D12A)
+    ("MUSICAL SYMBOL DOUBLE FLAT" #x1D12B)
+    ("MUSICAL SYMBOL FLAT UP" #x1D12C)
+    ("MUSICAL SYMBOL FLAT DOWN" #x1D12D)
+    ("MUSICAL SYMBOL NATURAL UP" #x1D12E)
+    ("MUSICAL SYMBOL NATURAL DOWN" #x1D12F)
+    ("MUSICAL SYMBOL SHARP UP" #x1D130)
+    ("MUSICAL SYMBOL SHARP DOWN" #x1D131)
+    ("MUSICAL SYMBOL QUARTER TONE SHARP" #x1D132)
+    ("MUSICAL SYMBOL QUARTER TONE FLAT" #x1D133)
+    ("MUSICAL SYMBOL COMMON TIME" #x1D134)
+    ("MUSICAL SYMBOL CUT TIME" #x1D135)
+    ("MUSICAL SYMBOL OTTAVA ALTA" #x1D136)
+    ("MUSICAL SYMBOL OTTAVA BASSA" #x1D137)
+    ("MUSICAL SYMBOL QUINDICESIMA ALTA" #x1D138)
+    ("MUSICAL SYMBOL QUINDICESIMA BASSA" #x1D139)
+    ("MUSICAL SYMBOL MULTI REST" #x1D13A)
+    ("MUSICAL SYMBOL WHOLE REST" #x1D13B)
+    ("MUSICAL SYMBOL HALF REST" #x1D13C)
+    ("MUSICAL SYMBOL QUARTER REST" #x1D13D)
+    ("MUSICAL SYMBOL EIGHTH REST" #x1D13E)
+    ("MUSICAL SYMBOL SIXTEENTH REST" #x1D13F)
+    ("MUSICAL SYMBOL THIRTY-SECOND REST" #x1D140)
+    ("MUSICAL SYMBOL SIXTY-FOURTH REST" #x1D141)
+    ("MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST" #x1D142)
+    ("MUSICAL SYMBOL X NOTEHEAD" #x1D143)
+    ("MUSICAL SYMBOL PLUS NOTEHEAD" #x1D144)
+    ("MUSICAL SYMBOL CIRCLE X NOTEHEAD" #x1D145)
+    ("MUSICAL SYMBOL SQUARE NOTEHEAD WHITE" #x1D146)
+    ("MUSICAL SYMBOL SQUARE NOTEHEAD BLACK" #x1D147)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE" #x1D148)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK" #x1D149)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE" #x1D14A)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK" #x1D14B)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE" #x1D14C)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK" #x1D14D)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE" #x1D14E)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK" #x1D14F)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE" #x1D150)
+    ("MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK" #x1D151)
+    ("MUSICAL SYMBOL MOON NOTEHEAD WHITE" #x1D152)
+    ("MUSICAL SYMBOL MOON NOTEHEAD BLACK" #x1D153)
+    ("MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE" #x1D154)
+    ("MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK" #x1D155)
+    ("MUSICAL SYMBOL PARENTHESIS NOTEHEAD" #x1D156)
+    ("MUSICAL SYMBOL VOID NOTEHEAD" #x1D157)
+    ("MUSICAL SYMBOL NOTEHEAD BLACK" #x1D158)
+    ("MUSICAL SYMBOL NULL NOTEHEAD" #x1D159)
+    ("MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE" #x1D15A)
+    ("MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK" #x1D15B)
+    ("MUSICAL SYMBOL BREVE" #x1D15C)
+    ("MUSICAL SYMBOL WHOLE NOTE" #x1D15D)
+    ("MUSICAL SYMBOL HALF NOTE" #x1D15E)
+    ("MUSICAL SYMBOL QUARTER NOTE" #x1D15F)
+    ("MUSICAL SYMBOL EIGHTH NOTE" #x1D160)
+    ("MUSICAL SYMBOL SIXTEENTH NOTE" #x1D161)
+    ("MUSICAL SYMBOL THIRTY-SECOND NOTE" #x1D162)
+    ("MUSICAL SYMBOL SIXTY-FOURTH NOTE" #x1D163)
+    ("MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE" #x1D164)
+    ("MUSICAL SYMBOL COMBINING STEM" #x1D165)
+    ("MUSICAL SYMBOL COMBINING SPRECHGESANG STEM" #x1D166)
+    ("MUSICAL SYMBOL COMBINING TREMOLO-1" #x1D167)
+    ("MUSICAL SYMBOL COMBINING TREMOLO-2" #x1D168)
+    ("MUSICAL SYMBOL COMBINING TREMOLO-3" #x1D169)
+    ("MUSICAL SYMBOL FINGERED TREMOLO-1" #x1D16A)
+    ("MUSICAL SYMBOL FINGERED TREMOLO-2" #x1D16B)
+    ("MUSICAL SYMBOL FINGERED TREMOLO-3" #x1D16C)
+    ("MUSICAL SYMBOL COMBINING AUGMENTATION DOT" #x1D16D)
+    ("MUSICAL SYMBOL COMBINING FLAG-1" #x1D16E)
+    ("MUSICAL SYMBOL COMBINING FLAG-2" #x1D16F)
+    ("MUSICAL SYMBOL COMBINING FLAG-3" #x1D170)
+    ("MUSICAL SYMBOL COMBINING FLAG-4" #x1D171)
+    ("MUSICAL SYMBOL COMBINING FLAG-5" #x1D172)
+    ("MUSICAL SYMBOL BEGIN BEAM" #x1D173)
+    ("MUSICAL SYMBOL END BEAM" #x1D174)
+    ("MUSICAL SYMBOL BEGIN TIE" #x1D175)
+    ("MUSICAL SYMBOL END TIE" #x1D176)
+    ("MUSICAL SYMBOL BEGIN SLUR" #x1D177)
+    ("MUSICAL SYMBOL END SLUR" #x1D178)
+    ("MUSICAL SYMBOL BEGIN PHRASE" #x1D179)
+    ("MUSICAL SYMBOL END PHRASE" #x1D17A)
+    ("MUSICAL SYMBOL COMBINING ACCENT" #x1D17B)
+    ("MUSICAL SYMBOL COMBINING STACCATO" #x1D17C)
+    ("MUSICAL SYMBOL COMBINING TENUTO" #x1D17D)
+    ("MUSICAL SYMBOL COMBINING STACCATISSIMO" #x1D17E)
+    ("MUSICAL SYMBOL COMBINING MARCATO" #x1D17F)
+    ("MUSICAL SYMBOL COMBINING MARCATO-STACCATO" #x1D180)
+    ("MUSICAL SYMBOL COMBINING ACCENT-STACCATO" #x1D181)
+    ("MUSICAL SYMBOL COMBINING LOURE" #x1D182)
+    ("MUSICAL SYMBOL ARPEGGIATO UP" #x1D183)
+    ("MUSICAL SYMBOL ARPEGGIATO DOWN" #x1D184)
+    ("MUSICAL SYMBOL COMBINING DOIT" #x1D185)
+    ("MUSICAL SYMBOL COMBINING RIP" #x1D186)
+    ("MUSICAL SYMBOL COMBINING FLIP" #x1D187)
+    ("MUSICAL SYMBOL COMBINING SMEAR" #x1D188)
+    ("MUSICAL SYMBOL COMBINING BEND" #x1D189)
+    ("MUSICAL SYMBOL COMBINING DOUBLE TONGUE" #x1D18A)
+    ("MUSICAL SYMBOL COMBINING TRIPLE TONGUE" #x1D18B)
+    ("MUSICAL SYMBOL RINFORZANDO" #x1D18C)
+    ("MUSICAL SYMBOL SUBITO" #x1D18D)
+    ("MUSICAL SYMBOL Z" #x1D18E)
+    ("MUSICAL SYMBOL PIANO" #x1D18F)
+    ("MUSICAL SYMBOL MEZZO" #x1D190)
+    ("MUSICAL SYMBOL FORTE" #x1D191)
+    ("MUSICAL SYMBOL CRESCENDO" #x1D192)
+    ("MUSICAL SYMBOL DECRESCENDO" #x1D193)
+    ("MUSICAL SYMBOL GRACE NOTE SLASH" #x1D194)
+    ("MUSICAL SYMBOL GRACE NOTE NO SLASH" #x1D195)
+    ("MUSICAL SYMBOL TR" #x1D196)
+    ("MUSICAL SYMBOL TURN" #x1D197)
+    ("MUSICAL SYMBOL INVERTED TURN" #x1D198)
+    ("MUSICAL SYMBOL TURN SLASH" #x1D199)
+    ("MUSICAL SYMBOL TURN UP" #x1D19A)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-1" #x1D19B)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-2" #x1D19C)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-3" #x1D19D)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-4" #x1D19E)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-5" #x1D19F)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-6" #x1D1A0)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-7" #x1D1A1)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-8" #x1D1A2)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-9" #x1D1A3)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-10" #x1D1A4)
+    ("MUSICAL SYMBOL ORNAMENT STROKE-11" #x1D1A5)
+    ("MUSICAL SYMBOL HAUPTSTIMME" #x1D1A6)
+    ("MUSICAL SYMBOL NEBENSTIMME" #x1D1A7)
+    ("MUSICAL SYMBOL END OF STIMME" #x1D1A8)
+    ("MUSICAL SYMBOL DEGREE SLASH" #x1D1A9)
+    ("MUSICAL SYMBOL COMBINING DOWN BOW" #x1D1AA)
+    ("MUSICAL SYMBOL COMBINING UP BOW" #x1D1AB)
+    ("MUSICAL SYMBOL COMBINING HARMONIC" #x1D1AC)
+    ("MUSICAL SYMBOL COMBINING SNAP PIZZICATO" #x1D1AD)
+    ("MUSICAL SYMBOL PEDAL MARK" #x1D1AE)
+    ("MUSICAL SYMBOL PEDAL UP MARK" #x1D1AF)
+    ("MUSICAL SYMBOL HALF PEDAL MARK" #x1D1B0)
+    ("MUSICAL SYMBOL GLISSANDO UP" #x1D1B1)
+    ("MUSICAL SYMBOL GLISSANDO DOWN" #x1D1B2)
+    ("MUSICAL SYMBOL WITH FINGERNAILS" #x1D1B3)
+    ("MUSICAL SYMBOL DAMP" #x1D1B4)
+    ("MUSICAL SYMBOL DAMP ALL" #x1D1B5)
+    ("MUSICAL SYMBOL MAXIMA" #x1D1B6)
+    ("MUSICAL SYMBOL LONGA" #x1D1B7)
+    ("MUSICAL SYMBOL BREVIS" #x1D1B8)
+    ("MUSICAL SYMBOL SEMIBREVIS WHITE" #x1D1B9)
+    ("MUSICAL SYMBOL SEMIBREVIS BLACK" #x1D1BA)
+    ("MUSICAL SYMBOL MINIMA" #x1D1BB)
+    ("MUSICAL SYMBOL MINIMA BLACK" #x1D1BC)
+    ("MUSICAL SYMBOL SEMIMINIMA WHITE" #x1D1BD)
+    ("MUSICAL SYMBOL SEMIMINIMA BLACK" #x1D1BE)
+    ("MUSICAL SYMBOL FUSA WHITE" #x1D1BF)
+    ("MUSICAL SYMBOL FUSA BLACK" #x1D1C0)
+    ("MUSICAL SYMBOL LONGA PERFECTA REST" #x1D1C1)
+    ("MUSICAL SYMBOL LONGA IMPERFECTA REST" #x1D1C2)
+    ("MUSICAL SYMBOL BREVIS REST" #x1D1C3)
+    ("MUSICAL SYMBOL SEMIBREVIS REST" #x1D1C4)
+    ("MUSICAL SYMBOL MINIMA REST" #x1D1C5)
+    ("MUSICAL SYMBOL SEMIMINIMA REST" #x1D1C6)
+    ("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA" #x1D1C7)
+    ("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA" #x1D1C8)
+    ("MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1" #x1D1C9)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA" #x1D1CA)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA" #x1D1CB)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1" #x1D1CC)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2" #x1D1CD)
+    ("MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3" #x1D1CE)
+    ("MUSICAL SYMBOL CROIX" #x1D1CF)
+    ("MUSICAL SYMBOL GREGORIAN C CLEF" #x1D1D0)
+    ("MUSICAL SYMBOL GREGORIAN F CLEF" #x1D1D1)
+    ("MUSICAL SYMBOL SQUARE B" #x1D1D2)
+    ("MUSICAL SYMBOL VIRGA" #x1D1D3)
+    ("MUSICAL SYMBOL PODATUS" #x1D1D4)
+    ("MUSICAL SYMBOL CLIVIS" #x1D1D5)
+    ("MUSICAL SYMBOL SCANDICUS" #x1D1D6)
+    ("MUSICAL SYMBOL CLIMACUS" #x1D1D7)
+    ("MUSICAL SYMBOL TORCULUS" #x1D1D8)
+    ("MUSICAL SYMBOL PORRECTUS" #x1D1D9)
+    ("MUSICAL SYMBOL PORRECTUS FLEXUS" #x1D1DA)
+    ("MUSICAL SYMBOL SCANDICUS FLEXUS" #x1D1DB)
+    ("MUSICAL SYMBOL TORCULUS RESUPINUS" #x1D1DC)
+    ("MUSICAL SYMBOL PES SUBPUNCTIS" #x1D1DD)
+    ))
+
+;; arch-tag: 4e6bd082-bedb-46a2-81be-06f86fbb74f4
diff --git a/etc/nxml/1D400-1D7FF.el b/etc/nxml/1D400-1D7FF.el
new file mode 100644 (file)
index 0000000..f702765
--- /dev/null
@@ -0,0 +1,995 @@
+(nxml-define-char-name-set 'mathematical-alphanumeric-symbols
+  '(("MATHEMATICAL BOLD CAPITAL A" #x1D400)
+    ("MATHEMATICAL BOLD CAPITAL B" #x1D401)
+    ("MATHEMATICAL BOLD CAPITAL C" #x1D402)
+    ("MATHEMATICAL BOLD CAPITAL D" #x1D403)
+    ("MATHEMATICAL BOLD CAPITAL E" #x1D404)
+    ("MATHEMATICAL BOLD CAPITAL F" #x1D405)
+    ("MATHEMATICAL BOLD CAPITAL G" #x1D406)
+    ("MATHEMATICAL BOLD CAPITAL H" #x1D407)
+    ("MATHEMATICAL BOLD CAPITAL I" #x1D408)
+    ("MATHEMATICAL BOLD CAPITAL J" #x1D409)
+    ("MATHEMATICAL BOLD CAPITAL K" #x1D40A)
+    ("MATHEMATICAL BOLD CAPITAL L" #x1D40B)
+    ("MATHEMATICAL BOLD CAPITAL M" #x1D40C)
+    ("MATHEMATICAL BOLD CAPITAL N" #x1D40D)
+    ("MATHEMATICAL BOLD CAPITAL O" #x1D40E)
+    ("MATHEMATICAL BOLD CAPITAL P" #x1D40F)
+    ("MATHEMATICAL BOLD CAPITAL Q" #x1D410)
+    ("MATHEMATICAL BOLD CAPITAL R" #x1D411)
+    ("MATHEMATICAL BOLD CAPITAL S" #x1D412)
+    ("MATHEMATICAL BOLD CAPITAL T" #x1D413)
+    ("MATHEMATICAL BOLD CAPITAL U" #x1D414)
+    ("MATHEMATICAL BOLD CAPITAL V" #x1D415)
+    ("MATHEMATICAL BOLD CAPITAL W" #x1D416)
+    ("MATHEMATICAL BOLD CAPITAL X" #x1D417)
+    ("MATHEMATICAL BOLD CAPITAL Y" #x1D418)
+    ("MATHEMATICAL BOLD CAPITAL Z" #x1D419)
+    ("MATHEMATICAL BOLD SMALL A" #x1D41A)
+    ("MATHEMATICAL BOLD SMALL B" #x1D41B)
+    ("MATHEMATICAL BOLD SMALL C" #x1D41C)
+    ("MATHEMATICAL BOLD SMALL D" #x1D41D)
+    ("MATHEMATICAL BOLD SMALL E" #x1D41E)
+    ("MATHEMATICAL BOLD SMALL F" #x1D41F)
+    ("MATHEMATICAL BOLD SMALL G" #x1D420)
+    ("MATHEMATICAL BOLD SMALL H" #x1D421)
+    ("MATHEMATICAL BOLD SMALL I" #x1D422)
+    ("MATHEMATICAL BOLD SMALL J" #x1D423)
+    ("MATHEMATICAL BOLD SMALL K" #x1D424)
+    ("MATHEMATICAL BOLD SMALL L" #x1D425)
+    ("MATHEMATICAL BOLD SMALL M" #x1D426)
+    ("MATHEMATICAL BOLD SMALL N" #x1D427)
+    ("MATHEMATICAL BOLD SMALL O" #x1D428)
+    ("MATHEMATICAL BOLD SMALL P" #x1D429)
+    ("MATHEMATICAL BOLD SMALL Q" #x1D42A)
+    ("MATHEMATICAL BOLD SMALL R" #x1D42B)
+    ("MATHEMATICAL BOLD SMALL S" #x1D42C)
+    ("MATHEMATICAL BOLD SMALL T" #x1D42D)
+    ("MATHEMATICAL BOLD SMALL U" #x1D42E)
+    ("MATHEMATICAL BOLD SMALL V" #x1D42F)
+    ("MATHEMATICAL BOLD SMALL W" #x1D430)
+    ("MATHEMATICAL BOLD SMALL X" #x1D431)
+    ("MATHEMATICAL BOLD SMALL Y" #x1D432)
+    ("MATHEMATICAL BOLD SMALL Z" #x1D433)
+    ("MATHEMATICAL ITALIC CAPITAL A" #x1D434)
+    ("MATHEMATICAL ITALIC CAPITAL B" #x1D435)
+    ("MATHEMATICAL ITALIC CAPITAL C" #x1D436)
+    ("MATHEMATICAL ITALIC CAPITAL D" #x1D437)
+    ("MATHEMATICAL ITALIC CAPITAL E" #x1D438)
+    ("MATHEMATICAL ITALIC CAPITAL F" #x1D439)
+    ("MATHEMATICAL ITALIC CAPITAL G" #x1D43A)
+    ("MATHEMATICAL ITALIC CAPITAL H" #x1D43B)
+    ("MATHEMATICAL ITALIC CAPITAL I" #x1D43C)
+    ("MATHEMATICAL ITALIC CAPITAL J" #x1D43D)
+    ("MATHEMATICAL ITALIC CAPITAL K" #x1D43E)
+    ("MATHEMATICAL ITALIC CAPITAL L" #x1D43F)
+    ("MATHEMATICAL ITALIC CAPITAL M" #x1D440)
+    ("MATHEMATICAL ITALIC CAPITAL N" #x1D441)
+    ("MATHEMATICAL ITALIC CAPITAL O" #x1D442)
+    ("MATHEMATICAL ITALIC CAPITAL P" #x1D443)
+    ("MATHEMATICAL ITALIC CAPITAL Q" #x1D444)
+    ("MATHEMATICAL ITALIC CAPITAL R" #x1D445)
+    ("MATHEMATICAL ITALIC CAPITAL S" #x1D446)
+    ("MATHEMATICAL ITALIC CAPITAL T" #x1D447)
+    ("MATHEMATICAL ITALIC CAPITAL U" #x1D448)
+    ("MATHEMATICAL ITALIC CAPITAL V" #x1D449)
+    ("MATHEMATICAL ITALIC CAPITAL W" #x1D44A)
+    ("MATHEMATICAL ITALIC CAPITAL X" #x1D44B)
+    ("MATHEMATICAL ITALIC CAPITAL Y" #x1D44C)
+    ("MATHEMATICAL ITALIC CAPITAL Z" #x1D44D)
+    ("MATHEMATICAL ITALIC SMALL A" #x1D44E)
+    ("MATHEMATICAL ITALIC SMALL B" #x1D44F)
+    ("MATHEMATICAL ITALIC SMALL C" #x1D450)
+    ("MATHEMATICAL ITALIC SMALL D" #x1D451)
+    ("MATHEMATICAL ITALIC SMALL E" #x1D452)
+    ("MATHEMATICAL ITALIC SMALL F" #x1D453)
+    ("MATHEMATICAL ITALIC SMALL G" #x1D454)
+    ("MATHEMATICAL ITALIC SMALL I" #x1D456)
+    ("MATHEMATICAL ITALIC SMALL J" #x1D457)
+    ("MATHEMATICAL ITALIC SMALL K" #x1D458)
+    ("MATHEMATICAL ITALIC SMALL L" #x1D459)
+    ("MATHEMATICAL ITALIC SMALL M" #x1D45A)
+    ("MATHEMATICAL ITALIC SMALL N" #x1D45B)
+    ("MATHEMATICAL ITALIC SMALL O" #x1D45C)
+    ("MATHEMATICAL ITALIC SMALL P" #x1D45D)
+    ("MATHEMATICAL ITALIC SMALL Q" #x1D45E)
+    ("MATHEMATICAL ITALIC SMALL R" #x1D45F)
+    ("MATHEMATICAL ITALIC SMALL S" #x1D460)
+    ("MATHEMATICAL ITALIC SMALL T" #x1D461)
+    ("MATHEMATICAL ITALIC SMALL U" #x1D462)
+    ("MATHEMATICAL ITALIC SMALL V" #x1D463)
+    ("MATHEMATICAL ITALIC SMALL W" #x1D464)
+    ("MATHEMATICAL ITALIC SMALL X" #x1D465)
+    ("MATHEMATICAL ITALIC SMALL Y" #x1D466)
+    ("MATHEMATICAL ITALIC SMALL Z" #x1D467)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL A" #x1D468)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL B" #x1D469)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL C" #x1D46A)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL D" #x1D46B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL E" #x1D46C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL F" #x1D46D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL G" #x1D46E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL H" #x1D46F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL I" #x1D470)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL J" #x1D471)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL K" #x1D472)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL L" #x1D473)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL M" #x1D474)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL N" #x1D475)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL O" #x1D476)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL P" #x1D477)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL Q" #x1D478)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL R" #x1D479)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL S" #x1D47A)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL T" #x1D47B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL U" #x1D47C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL V" #x1D47D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL W" #x1D47E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL X" #x1D47F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL Y" #x1D480)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL Z" #x1D481)
+    ("MATHEMATICAL BOLD ITALIC SMALL A" #x1D482)
+    ("MATHEMATICAL BOLD ITALIC SMALL B" #x1D483)
+    ("MATHEMATICAL BOLD ITALIC SMALL C" #x1D484)
+    ("MATHEMATICAL BOLD ITALIC SMALL D" #x1D485)
+    ("MATHEMATICAL BOLD ITALIC SMALL E" #x1D486)
+    ("MATHEMATICAL BOLD ITALIC SMALL F" #x1D487)
+    ("MATHEMATICAL BOLD ITALIC SMALL G" #x1D488)
+    ("MATHEMATICAL BOLD ITALIC SMALL H" #x1D489)
+    ("MATHEMATICAL BOLD ITALIC SMALL I" #x1D48A)
+    ("MATHEMATICAL BOLD ITALIC SMALL J" #x1D48B)
+    ("MATHEMATICAL BOLD ITALIC SMALL K" #x1D48C)
+    ("MATHEMATICAL BOLD ITALIC SMALL L" #x1D48D)
+    ("MATHEMATICAL BOLD ITALIC SMALL M" #x1D48E)
+    ("MATHEMATICAL BOLD ITALIC SMALL N" #x1D48F)
+    ("MATHEMATICAL BOLD ITALIC SMALL O" #x1D490)
+    ("MATHEMATICAL BOLD ITALIC SMALL P" #x1D491)
+    ("MATHEMATICAL BOLD ITALIC SMALL Q" #x1D492)
+    ("MATHEMATICAL BOLD ITALIC SMALL R" #x1D493)
+    ("MATHEMATICAL BOLD ITALIC SMALL S" #x1D494)
+    ("MATHEMATICAL BOLD ITALIC SMALL T" #x1D495)
+    ("MATHEMATICAL BOLD ITALIC SMALL U" #x1D496)
+    ("MATHEMATICAL BOLD ITALIC SMALL V" #x1D497)
+    ("MATHEMATICAL BOLD ITALIC SMALL W" #x1D498)
+    ("MATHEMATICAL BOLD ITALIC SMALL X" #x1D499)
+    ("MATHEMATICAL BOLD ITALIC SMALL Y" #x1D49A)
+    ("MATHEMATICAL BOLD ITALIC SMALL Z" #x1D49B)
+    ("MATHEMATICAL SCRIPT CAPITAL A" #x1D49C)
+    ("MATHEMATICAL SCRIPT CAPITAL C" #x1D49E)
+    ("MATHEMATICAL SCRIPT CAPITAL D" #x1D49F)
+    ("MATHEMATICAL SCRIPT CAPITAL G" #x1D4A2)
+    ("MATHEMATICAL SCRIPT CAPITAL J" #x1D4A5)
+    ("MATHEMATICAL SCRIPT CAPITAL K" #x1D4A6)
+    ("MATHEMATICAL SCRIPT CAPITAL N" #x1D4A9)
+    ("MATHEMATICAL SCRIPT CAPITAL O" #x1D4AA)
+    ("MATHEMATICAL SCRIPT CAPITAL P" #x1D4AB)
+    ("MATHEMATICAL SCRIPT CAPITAL Q" #x1D4AC)
+    ("MATHEMATICAL SCRIPT CAPITAL S" #x1D4AE)
+    ("MATHEMATICAL SCRIPT CAPITAL T" #x1D4AF)
+    ("MATHEMATICAL SCRIPT CAPITAL U" #x1D4B0)
+    ("MATHEMATICAL SCRIPT CAPITAL V" #x1D4B1)
+    ("MATHEMATICAL SCRIPT CAPITAL W" #x1D4B2)
+    ("MATHEMATICAL SCRIPT CAPITAL X" #x1D4B3)
+    ("MATHEMATICAL SCRIPT CAPITAL Y" #x1D4B4)
+    ("MATHEMATICAL SCRIPT CAPITAL Z" #x1D4B5)
+    ("MATHEMATICAL SCRIPT SMALL A" #x1D4B6)
+    ("MATHEMATICAL SCRIPT SMALL B" #x1D4B7)
+    ("MATHEMATICAL SCRIPT SMALL C" #x1D4B8)
+    ("MATHEMATICAL SCRIPT SMALL D" #x1D4B9)
+    ("MATHEMATICAL SCRIPT SMALL F" #x1D4BB)
+    ("MATHEMATICAL SCRIPT SMALL H" #x1D4BD)
+    ("MATHEMATICAL SCRIPT SMALL I" #x1D4BE)
+    ("MATHEMATICAL SCRIPT SMALL J" #x1D4BF)
+    ("MATHEMATICAL SCRIPT SMALL K" #x1D4C0)
+    ("MATHEMATICAL SCRIPT SMALL M" #x1D4C2)
+    ("MATHEMATICAL SCRIPT SMALL N" #x1D4C3)
+    ("MATHEMATICAL SCRIPT SMALL P" #x1D4C5)
+    ("MATHEMATICAL SCRIPT SMALL Q" #x1D4C6)
+    ("MATHEMATICAL SCRIPT SMALL R" #x1D4C7)
+    ("MATHEMATICAL SCRIPT SMALL S" #x1D4C8)
+    ("MATHEMATICAL SCRIPT SMALL T" #x1D4C9)
+    ("MATHEMATICAL SCRIPT SMALL U" #x1D4CA)
+    ("MATHEMATICAL SCRIPT SMALL V" #x1D4CB)
+    ("MATHEMATICAL SCRIPT SMALL W" #x1D4CC)
+    ("MATHEMATICAL SCRIPT SMALL X" #x1D4CD)
+    ("MATHEMATICAL SCRIPT SMALL Y" #x1D4CE)
+    ("MATHEMATICAL SCRIPT SMALL Z" #x1D4CF)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL A" #x1D4D0)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL B" #x1D4D1)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL C" #x1D4D2)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL D" #x1D4D3)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL E" #x1D4D4)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL F" #x1D4D5)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL G" #x1D4D6)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL H" #x1D4D7)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL I" #x1D4D8)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL J" #x1D4D9)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL K" #x1D4DA)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL L" #x1D4DB)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL M" #x1D4DC)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL N" #x1D4DD)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL O" #x1D4DE)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL P" #x1D4DF)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL Q" #x1D4E0)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL R" #x1D4E1)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL S" #x1D4E2)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL T" #x1D4E3)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL U" #x1D4E4)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL V" #x1D4E5)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL W" #x1D4E6)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL X" #x1D4E7)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL Y" #x1D4E8)
+    ("MATHEMATICAL BOLD SCRIPT CAPITAL Z" #x1D4E9)
+    ("MATHEMATICAL BOLD SCRIPT SMALL A" #x1D4EA)
+    ("MATHEMATICAL BOLD SCRIPT SMALL B" #x1D4EB)
+    ("MATHEMATICAL BOLD SCRIPT SMALL C" #x1D4EC)
+    ("MATHEMATICAL BOLD SCRIPT SMALL D" #x1D4ED)
+    ("MATHEMATICAL BOLD SCRIPT SMALL E" #x1D4EE)
+    ("MATHEMATICAL BOLD SCRIPT SMALL F" #x1D4EF)
+    ("MATHEMATICAL BOLD SCRIPT SMALL G" #x1D4F0)
+    ("MATHEMATICAL BOLD SCRIPT SMALL H" #x1D4F1)
+    ("MATHEMATICAL BOLD SCRIPT SMALL I" #x1D4F2)
+    ("MATHEMATICAL BOLD SCRIPT SMALL J" #x1D4F3)
+    ("MATHEMATICAL BOLD SCRIPT SMALL K" #x1D4F4)
+    ("MATHEMATICAL BOLD SCRIPT SMALL L" #x1D4F5)
+    ("MATHEMATICAL BOLD SCRIPT SMALL M" #x1D4F6)
+    ("MATHEMATICAL BOLD SCRIPT SMALL N" #x1D4F7)
+    ("MATHEMATICAL BOLD SCRIPT SMALL O" #x1D4F8)
+    ("MATHEMATICAL BOLD SCRIPT SMALL P" #x1D4F9)
+    ("MATHEMATICAL BOLD SCRIPT SMALL Q" #x1D4FA)
+    ("MATHEMATICAL BOLD SCRIPT SMALL R" #x1D4FB)
+    ("MATHEMATICAL BOLD SCRIPT SMALL S" #x1D4FC)
+    ("MATHEMATICAL BOLD SCRIPT SMALL T" #x1D4FD)
+    ("MATHEMATICAL BOLD SCRIPT SMALL U" #x1D4FE)
+    ("MATHEMATICAL BOLD SCRIPT SMALL V" #x1D4FF)
+    ("MATHEMATICAL BOLD SCRIPT SMALL W" #x1D500)
+    ("MATHEMATICAL BOLD SCRIPT SMALL X" #x1D501)
+    ("MATHEMATICAL BOLD SCRIPT SMALL Y" #x1D502)
+    ("MATHEMATICAL BOLD SCRIPT SMALL Z" #x1D503)
+    ("MATHEMATICAL FRAKTUR CAPITAL A" #x1D504)
+    ("MATHEMATICAL FRAKTUR CAPITAL B" #x1D505)
+    ("MATHEMATICAL FRAKTUR CAPITAL D" #x1D507)
+    ("MATHEMATICAL FRAKTUR CAPITAL E" #x1D508)
+    ("MATHEMATICAL FRAKTUR CAPITAL F" #x1D509)
+    ("MATHEMATICAL FRAKTUR CAPITAL G" #x1D50A)
+    ("MATHEMATICAL FRAKTUR CAPITAL J" #x1D50D)
+    ("MATHEMATICAL FRAKTUR CAPITAL K" #x1D50E)
+    ("MATHEMATICAL FRAKTUR CAPITAL L" #x1D50F)
+    ("MATHEMATICAL FRAKTUR CAPITAL M" #x1D510)
+    ("MATHEMATICAL FRAKTUR CAPITAL N" #x1D511)
+    ("MATHEMATICAL FRAKTUR CAPITAL O" #x1D512)
+    ("MATHEMATICAL FRAKTUR CAPITAL P" #x1D513)
+    ("MATHEMATICAL FRAKTUR CAPITAL Q" #x1D514)
+    ("MATHEMATICAL FRAKTUR CAPITAL S" #x1D516)
+    ("MATHEMATICAL FRAKTUR CAPITAL T" #x1D517)
+    ("MATHEMATICAL FRAKTUR CAPITAL U" #x1D518)
+    ("MATHEMATICAL FRAKTUR CAPITAL V" #x1D519)
+    ("MATHEMATICAL FRAKTUR CAPITAL W" #x1D51A)
+    ("MATHEMATICAL FRAKTUR CAPITAL X" #x1D51B)
+    ("MATHEMATICAL FRAKTUR CAPITAL Y" #x1D51C)
+    ("MATHEMATICAL FRAKTUR SMALL A" #x1D51E)
+    ("MATHEMATICAL FRAKTUR SMALL B" #x1D51F)
+    ("MATHEMATICAL FRAKTUR SMALL C" #x1D520)
+    ("MATHEMATICAL FRAKTUR SMALL D" #x1D521)
+    ("MATHEMATICAL FRAKTUR SMALL E" #x1D522)
+    ("MATHEMATICAL FRAKTUR SMALL F" #x1D523)
+    ("MATHEMATICAL FRAKTUR SMALL G" #x1D524)
+    ("MATHEMATICAL FRAKTUR SMALL H" #x1D525)
+    ("MATHEMATICAL FRAKTUR SMALL I" #x1D526)
+    ("MATHEMATICAL FRAKTUR SMALL J" #x1D527)
+    ("MATHEMATICAL FRAKTUR SMALL K" #x1D528)
+    ("MATHEMATICAL FRAKTUR SMALL L" #x1D529)
+    ("MATHEMATICAL FRAKTUR SMALL M" #x1D52A)
+    ("MATHEMATICAL FRAKTUR SMALL N" #x1D52B)
+    ("MATHEMATICAL FRAKTUR SMALL O" #x1D52C)
+    ("MATHEMATICAL FRAKTUR SMALL P" #x1D52D)
+    ("MATHEMATICAL FRAKTUR SMALL Q" #x1D52E)
+    ("MATHEMATICAL FRAKTUR SMALL R" #x1D52F)
+    ("MATHEMATICAL FRAKTUR SMALL S" #x1D530)
+    ("MATHEMATICAL FRAKTUR SMALL T" #x1D531)
+    ("MATHEMATICAL FRAKTUR SMALL U" #x1D532)
+    ("MATHEMATICAL FRAKTUR SMALL V" #x1D533)
+    ("MATHEMATICAL FRAKTUR SMALL W" #x1D534)
+    ("MATHEMATICAL FRAKTUR SMALL X" #x1D535)
+    ("MATHEMATICAL FRAKTUR SMALL Y" #x1D536)
+    ("MATHEMATICAL FRAKTUR SMALL Z" #x1D537)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL A" #x1D538)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL B" #x1D539)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL D" #x1D53B)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL E" #x1D53C)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL F" #x1D53D)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL G" #x1D53E)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL I" #x1D540)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL J" #x1D541)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL K" #x1D542)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL L" #x1D543)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL M" #x1D544)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL O" #x1D546)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL S" #x1D54A)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL T" #x1D54B)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL U" #x1D54C)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL V" #x1D54D)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL W" #x1D54E)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL X" #x1D54F)
+    ("MATHEMATICAL DOUBLE-STRUCK CAPITAL Y" #x1D550)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL A" #x1D552)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL B" #x1D553)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL C" #x1D554)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL D" #x1D555)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL E" #x1D556)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL F" #x1D557)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL G" #x1D558)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL H" #x1D559)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL I" #x1D55A)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL J" #x1D55B)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL K" #x1D55C)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL L" #x1D55D)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL M" #x1D55E)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL N" #x1D55F)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL O" #x1D560)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL P" #x1D561)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL Q" #x1D562)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL R" #x1D563)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL S" #x1D564)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL T" #x1D565)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL U" #x1D566)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL V" #x1D567)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL W" #x1D568)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL X" #x1D569)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL Y" #x1D56A)
+    ("MATHEMATICAL DOUBLE-STRUCK SMALL Z" #x1D56B)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL A" #x1D56C)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL B" #x1D56D)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL C" #x1D56E)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL D" #x1D56F)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL E" #x1D570)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL F" #x1D571)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL G" #x1D572)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL H" #x1D573)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL I" #x1D574)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL J" #x1D575)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL K" #x1D576)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL L" #x1D577)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL M" #x1D578)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL N" #x1D579)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL O" #x1D57A)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL P" #x1D57B)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL Q" #x1D57C)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL R" #x1D57D)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL S" #x1D57E)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL T" #x1D57F)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL U" #x1D580)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL V" #x1D581)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL W" #x1D582)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL X" #x1D583)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL Y" #x1D584)
+    ("MATHEMATICAL BOLD FRAKTUR CAPITAL Z" #x1D585)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL A" #x1D586)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL B" #x1D587)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL C" #x1D588)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL D" #x1D589)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL E" #x1D58A)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL F" #x1D58B)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL G" #x1D58C)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL H" #x1D58D)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL I" #x1D58E)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL J" #x1D58F)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL K" #x1D590)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL L" #x1D591)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL M" #x1D592)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL N" #x1D593)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL O" #x1D594)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL P" #x1D595)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL Q" #x1D596)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL R" #x1D597)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL S" #x1D598)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL T" #x1D599)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL U" #x1D59A)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL V" #x1D59B)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL W" #x1D59C)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL X" #x1D59D)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL Y" #x1D59E)
+    ("MATHEMATICAL BOLD FRAKTUR SMALL Z" #x1D59F)
+    ("MATHEMATICAL SANS-SERIF CAPITAL A" #x1D5A0)
+    ("MATHEMATICAL SANS-SERIF CAPITAL B" #x1D5A1)
+    ("MATHEMATICAL SANS-SERIF CAPITAL C" #x1D5A2)
+    ("MATHEMATICAL SANS-SERIF CAPITAL D" #x1D5A3)
+    ("MATHEMATICAL SANS-SERIF CAPITAL E" #x1D5A4)
+    ("MATHEMATICAL SANS-SERIF CAPITAL F" #x1D5A5)
+    ("MATHEMATICAL SANS-SERIF CAPITAL G" #x1D5A6)
+    ("MATHEMATICAL SANS-SERIF CAPITAL H" #x1D5A7)
+    ("MATHEMATICAL SANS-SERIF CAPITAL I" #x1D5A8)
+    ("MATHEMATICAL SANS-SERIF CAPITAL J" #x1D5A9)
+    ("MATHEMATICAL SANS-SERIF CAPITAL K" #x1D5AA)
+    ("MATHEMATICAL SANS-SERIF CAPITAL L" #x1D5AB)
+    ("MATHEMATICAL SANS-SERIF CAPITAL M" #x1D5AC)
+    ("MATHEMATICAL SANS-SERIF CAPITAL N" #x1D5AD)
+    ("MATHEMATICAL SANS-SERIF CAPITAL O" #x1D5AE)
+    ("MATHEMATICAL SANS-SERIF CAPITAL P" #x1D5AF)
+    ("MATHEMATICAL SANS-SERIF CAPITAL Q" #x1D5B0)
+    ("MATHEMATICAL SANS-SERIF CAPITAL R" #x1D5B1)
+    ("MATHEMATICAL SANS-SERIF CAPITAL S" #x1D5B2)
+    ("MATHEMATICAL SANS-SERIF CAPITAL T" #x1D5B3)
+    ("MATHEMATICAL SANS-SERIF CAPITAL U" #x1D5B4)
+    ("MATHEMATICAL SANS-SERIF CAPITAL V" #x1D5B5)
+    ("MATHEMATICAL SANS-SERIF CAPITAL W" #x1D5B6)
+    ("MATHEMATICAL SANS-SERIF CAPITAL X" #x1D5B7)
+    ("MATHEMATICAL SANS-SERIF CAPITAL Y" #x1D5B8)
+    ("MATHEMATICAL SANS-SERIF CAPITAL Z" #x1D5B9)
+    ("MATHEMATICAL SANS-SERIF SMALL A" #x1D5BA)
+    ("MATHEMATICAL SANS-SERIF SMALL B" #x1D5BB)
+    ("MATHEMATICAL SANS-SERIF SMALL C" #x1D5BC)
+    ("MATHEMATICAL SANS-SERIF SMALL D" #x1D5BD)
+    ("MATHEMATICAL SANS-SERIF SMALL E" #x1D5BE)
+    ("MATHEMATICAL SANS-SERIF SMALL F" #x1D5BF)
+    ("MATHEMATICAL SANS-SERIF SMALL G" #x1D5C0)
+    ("MATHEMATICAL SANS-SERIF SMALL H" #x1D5C1)
+    ("MATHEMATICAL SANS-SERIF SMALL I" #x1D5C2)
+    ("MATHEMATICAL SANS-SERIF SMALL J" #x1D5C3)
+    ("MATHEMATICAL SANS-SERIF SMALL K" #x1D5C4)
+    ("MATHEMATICAL SANS-SERIF SMALL L" #x1D5C5)
+    ("MATHEMATICAL SANS-SERIF SMALL M" #x1D5C6)
+    ("MATHEMATICAL SANS-SERIF SMALL N" #x1D5C7)
+    ("MATHEMATICAL SANS-SERIF SMALL O" #x1D5C8)
+    ("MATHEMATICAL SANS-SERIF SMALL P" #x1D5C9)
+    ("MATHEMATICAL SANS-SERIF SMALL Q" #x1D5CA)
+    ("MATHEMATICAL SANS-SERIF SMALL R" #x1D5CB)
+    ("MATHEMATICAL SANS-SERIF SMALL S" #x1D5CC)
+    ("MATHEMATICAL SANS-SERIF SMALL T" #x1D5CD)
+    ("MATHEMATICAL SANS-SERIF SMALL U" #x1D5CE)
+    ("MATHEMATICAL SANS-SERIF SMALL V" #x1D5CF)
+    ("MATHEMATICAL SANS-SERIF SMALL W" #x1D5D0)
+    ("MATHEMATICAL SANS-SERIF SMALL X" #x1D5D1)
+    ("MATHEMATICAL SANS-SERIF SMALL Y" #x1D5D2)
+    ("MATHEMATICAL SANS-SERIF SMALL Z" #x1D5D3)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL A" #x1D5D4)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL B" #x1D5D5)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL C" #x1D5D6)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL D" #x1D5D7)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL E" #x1D5D8)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL F" #x1D5D9)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL G" #x1D5DA)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL H" #x1D5DB)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL I" #x1D5DC)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL J" #x1D5DD)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL K" #x1D5DE)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL L" #x1D5DF)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL M" #x1D5E0)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL N" #x1D5E1)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL O" #x1D5E2)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL P" #x1D5E3)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL Q" #x1D5E4)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL R" #x1D5E5)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL S" #x1D5E6)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL T" #x1D5E7)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL U" #x1D5E8)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL V" #x1D5E9)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL W" #x1D5EA)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL X" #x1D5EB)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL Y" #x1D5EC)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL Z" #x1D5ED)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL A" #x1D5EE)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL B" #x1D5EF)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL C" #x1D5F0)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL D" #x1D5F1)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL E" #x1D5F2)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL F" #x1D5F3)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL G" #x1D5F4)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL H" #x1D5F5)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL I" #x1D5F6)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL J" #x1D5F7)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL K" #x1D5F8)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL L" #x1D5F9)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL M" #x1D5FA)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL N" #x1D5FB)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL O" #x1D5FC)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL P" #x1D5FD)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL Q" #x1D5FE)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL R" #x1D5FF)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL S" #x1D600)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL T" #x1D601)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL U" #x1D602)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL V" #x1D603)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL W" #x1D604)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL X" #x1D605)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL Y" #x1D606)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL Z" #x1D607)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL A" #x1D608)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL B" #x1D609)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL C" #x1D60A)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL D" #x1D60B)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL E" #x1D60C)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL F" #x1D60D)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL G" #x1D60E)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL H" #x1D60F)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL I" #x1D610)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL J" #x1D611)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL K" #x1D612)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL L" #x1D613)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL M" #x1D614)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL N" #x1D615)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL O" #x1D616)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL P" #x1D617)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q" #x1D618)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL R" #x1D619)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL S" #x1D61A)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL T" #x1D61B)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL U" #x1D61C)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL V" #x1D61D)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL W" #x1D61E)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL X" #x1D61F)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y" #x1D620)
+    ("MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z" #x1D621)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL A" #x1D622)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL B" #x1D623)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL C" #x1D624)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL D" #x1D625)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL E" #x1D626)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL F" #x1D627)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL G" #x1D628)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL H" #x1D629)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL I" #x1D62A)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL J" #x1D62B)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL K" #x1D62C)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL L" #x1D62D)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL M" #x1D62E)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL N" #x1D62F)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL O" #x1D630)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL P" #x1D631)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL Q" #x1D632)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL R" #x1D633)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL S" #x1D634)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL T" #x1D635)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL U" #x1D636)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL V" #x1D637)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL W" #x1D638)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL X" #x1D639)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL Y" #x1D63A)
+    ("MATHEMATICAL SANS-SERIF ITALIC SMALL Z" #x1D63B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A" #x1D63C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B" #x1D63D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C" #x1D63E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D" #x1D63F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E" #x1D640)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F" #x1D641)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G" #x1D642)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H" #x1D643)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I" #x1D644)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J" #x1D645)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K" #x1D646)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L" #x1D647)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M" #x1D648)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N" #x1D649)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O" #x1D64A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P" #x1D64B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q" #x1D64C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R" #x1D64D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S" #x1D64E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T" #x1D64F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U" #x1D650)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V" #x1D651)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W" #x1D652)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X" #x1D653)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y" #x1D654)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z" #x1D655)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A" #x1D656)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B" #x1D657)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C" #x1D658)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D" #x1D659)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E" #x1D65A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F" #x1D65B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G" #x1D65C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H" #x1D65D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I" #x1D65E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J" #x1D65F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K" #x1D660)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L" #x1D661)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M" #x1D662)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N" #x1D663)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O" #x1D664)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P" #x1D665)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q" #x1D666)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R" #x1D667)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S" #x1D668)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T" #x1D669)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U" #x1D66A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V" #x1D66B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W" #x1D66C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X" #x1D66D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y" #x1D66E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z" #x1D66F)
+    ("MATHEMATICAL MONOSPACE CAPITAL A" #x1D670)
+    ("MATHEMATICAL MONOSPACE CAPITAL B" #x1D671)
+    ("MATHEMATICAL MONOSPACE CAPITAL C" #x1D672)
+    ("MATHEMATICAL MONOSPACE CAPITAL D" #x1D673)
+    ("MATHEMATICAL MONOSPACE CAPITAL E" #x1D674)
+    ("MATHEMATICAL MONOSPACE CAPITAL F" #x1D675)
+    ("MATHEMATICAL MONOSPACE CAPITAL G" #x1D676)
+    ("MATHEMATICAL MONOSPACE CAPITAL H" #x1D677)
+    ("MATHEMATICAL MONOSPACE CAPITAL I" #x1D678)
+    ("MATHEMATICAL MONOSPACE CAPITAL J" #x1D679)
+    ("MATHEMATICAL MONOSPACE CAPITAL K" #x1D67A)
+    ("MATHEMATICAL MONOSPACE CAPITAL L" #x1D67B)
+    ("MATHEMATICAL MONOSPACE CAPITAL M" #x1D67C)
+    ("MATHEMATICAL MONOSPACE CAPITAL N" #x1D67D)
+    ("MATHEMATICAL MONOSPACE CAPITAL O" #x1D67E)
+    ("MATHEMATICAL MONOSPACE CAPITAL P" #x1D67F)
+    ("MATHEMATICAL MONOSPACE CAPITAL Q" #x1D680)
+    ("MATHEMATICAL MONOSPACE CAPITAL R" #x1D681)
+    ("MATHEMATICAL MONOSPACE CAPITAL S" #x1D682)
+    ("MATHEMATICAL MONOSPACE CAPITAL T" #x1D683)
+    ("MATHEMATICAL MONOSPACE CAPITAL U" #x1D684)
+    ("MATHEMATICAL MONOSPACE CAPITAL V" #x1D685)
+    ("MATHEMATICAL MONOSPACE CAPITAL W" #x1D686)
+    ("MATHEMATICAL MONOSPACE CAPITAL X" #x1D687)
+    ("MATHEMATICAL MONOSPACE CAPITAL Y" #x1D688)
+    ("MATHEMATICAL MONOSPACE CAPITAL Z" #x1D689)
+    ("MATHEMATICAL MONOSPACE SMALL A" #x1D68A)
+    ("MATHEMATICAL MONOSPACE SMALL B" #x1D68B)
+    ("MATHEMATICAL MONOSPACE SMALL C" #x1D68C)
+    ("MATHEMATICAL MONOSPACE SMALL D" #x1D68D)
+    ("MATHEMATICAL MONOSPACE SMALL E" #x1D68E)
+    ("MATHEMATICAL MONOSPACE SMALL F" #x1D68F)
+    ("MATHEMATICAL MONOSPACE SMALL G" #x1D690)
+    ("MATHEMATICAL MONOSPACE SMALL H" #x1D691)
+    ("MATHEMATICAL MONOSPACE SMALL I" #x1D692)
+    ("MATHEMATICAL MONOSPACE SMALL J" #x1D693)
+    ("MATHEMATICAL MONOSPACE SMALL K" #x1D694)
+    ("MATHEMATICAL MONOSPACE SMALL L" #x1D695)
+    ("MATHEMATICAL MONOSPACE SMALL M" #x1D696)
+    ("MATHEMATICAL MONOSPACE SMALL N" #x1D697)
+    ("MATHEMATICAL MONOSPACE SMALL O" #x1D698)
+    ("MATHEMATICAL MONOSPACE SMALL P" #x1D699)
+    ("MATHEMATICAL MONOSPACE SMALL Q" #x1D69A)
+    ("MATHEMATICAL MONOSPACE SMALL R" #x1D69B)
+    ("MATHEMATICAL MONOSPACE SMALL S" #x1D69C)
+    ("MATHEMATICAL MONOSPACE SMALL T" #x1D69D)
+    ("MATHEMATICAL MONOSPACE SMALL U" #x1D69E)
+    ("MATHEMATICAL MONOSPACE SMALL V" #x1D69F)
+    ("MATHEMATICAL MONOSPACE SMALL W" #x1D6A0)
+    ("MATHEMATICAL MONOSPACE SMALL X" #x1D6A1)
+    ("MATHEMATICAL MONOSPACE SMALL Y" #x1D6A2)
+    ("MATHEMATICAL MONOSPACE SMALL Z" #x1D6A3)
+    ("MATHEMATICAL BOLD CAPITAL ALPHA" #x1D6A8)
+    ("MATHEMATICAL BOLD CAPITAL BETA" #x1D6A9)
+    ("MATHEMATICAL BOLD CAPITAL GAMMA" #x1D6AA)
+    ("MATHEMATICAL BOLD CAPITAL DELTA" #x1D6AB)
+    ("MATHEMATICAL BOLD CAPITAL EPSILON" #x1D6AC)
+    ("MATHEMATICAL BOLD CAPITAL ZETA" #x1D6AD)
+    ("MATHEMATICAL BOLD CAPITAL ETA" #x1D6AE)
+    ("MATHEMATICAL BOLD CAPITAL THETA" #x1D6AF)
+    ("MATHEMATICAL BOLD CAPITAL IOTA" #x1D6B0)
+    ("MATHEMATICAL BOLD CAPITAL KAPPA" #x1D6B1)
+    ("MATHEMATICAL BOLD CAPITAL LAMDA" #x1D6B2)
+    ("MATHEMATICAL BOLD CAPITAL MU" #x1D6B3)
+    ("MATHEMATICAL BOLD CAPITAL NU" #x1D6B4)
+    ("MATHEMATICAL BOLD CAPITAL XI" #x1D6B5)
+    ("MATHEMATICAL BOLD CAPITAL OMICRON" #x1D6B6)
+    ("MATHEMATICAL BOLD CAPITAL PI" #x1D6B7)
+    ("MATHEMATICAL BOLD CAPITAL RHO" #x1D6B8)
+    ("MATHEMATICAL BOLD CAPITAL THETA SYMBOL" #x1D6B9)
+    ("MATHEMATICAL BOLD CAPITAL SIGMA" #x1D6BA)
+    ("MATHEMATICAL BOLD CAPITAL TAU" #x1D6BB)
+    ("MATHEMATICAL BOLD CAPITAL UPSILON" #x1D6BC)
+    ("MATHEMATICAL BOLD CAPITAL PHI" #x1D6BD)
+    ("MATHEMATICAL BOLD CAPITAL CHI" #x1D6BE)
+    ("MATHEMATICAL BOLD CAPITAL PSI" #x1D6BF)
+    ("MATHEMATICAL BOLD CAPITAL OMEGA" #x1D6C0)
+    ("MATHEMATICAL BOLD NABLA" #x1D6C1)
+    ("MATHEMATICAL BOLD SMALL ALPHA" #x1D6C2)
+    ("MATHEMATICAL BOLD SMALL BETA" #x1D6C3)
+    ("MATHEMATICAL BOLD SMALL GAMMA" #x1D6C4)
+    ("MATHEMATICAL BOLD SMALL DELTA" #x1D6C5)
+    ("MATHEMATICAL BOLD SMALL EPSILON" #x1D6C6)
+    ("MATHEMATICAL BOLD SMALL ZETA" #x1D6C7)
+    ("MATHEMATICAL BOLD SMALL ETA" #x1D6C8)
+    ("MATHEMATICAL BOLD SMALL THETA" #x1D6C9)
+    ("MATHEMATICAL BOLD SMALL IOTA" #x1D6CA)
+    ("MATHEMATICAL BOLD SMALL KAPPA" #x1D6CB)
+    ("MATHEMATICAL BOLD SMALL LAMDA" #x1D6CC)
+    ("MATHEMATICAL BOLD SMALL MU" #x1D6CD)
+    ("MATHEMATICAL BOLD SMALL NU" #x1D6CE)
+    ("MATHEMATICAL BOLD SMALL XI" #x1D6CF)
+    ("MATHEMATICAL BOLD SMALL OMICRON" #x1D6D0)
+    ("MATHEMATICAL BOLD SMALL PI" #x1D6D1)
+    ("MATHEMATICAL BOLD SMALL RHO" #x1D6D2)
+    ("MATHEMATICAL BOLD SMALL FINAL SIGMA" #x1D6D3)
+    ("MATHEMATICAL BOLD SMALL SIGMA" #x1D6D4)
+    ("MATHEMATICAL BOLD SMALL TAU" #x1D6D5)
+    ("MATHEMATICAL BOLD SMALL UPSILON" #x1D6D6)
+    ("MATHEMATICAL BOLD SMALL PHI" #x1D6D7)
+    ("MATHEMATICAL BOLD SMALL CHI" #x1D6D8)
+    ("MATHEMATICAL BOLD SMALL PSI" #x1D6D9)
+    ("MATHEMATICAL BOLD SMALL OMEGA" #x1D6DA)
+    ("MATHEMATICAL BOLD PARTIAL DIFFERENTIAL" #x1D6DB)
+    ("MATHEMATICAL BOLD EPSILON SYMBOL" #x1D6DC)
+    ("MATHEMATICAL BOLD THETA SYMBOL" #x1D6DD)
+    ("MATHEMATICAL BOLD KAPPA SYMBOL" #x1D6DE)
+    ("MATHEMATICAL BOLD PHI SYMBOL" #x1D6DF)
+    ("MATHEMATICAL BOLD RHO SYMBOL" #x1D6E0)
+    ("MATHEMATICAL BOLD PI SYMBOL" #x1D6E1)
+    ("MATHEMATICAL ITALIC CAPITAL ALPHA" #x1D6E2)
+    ("MATHEMATICAL ITALIC CAPITAL BETA" #x1D6E3)
+    ("MATHEMATICAL ITALIC CAPITAL GAMMA" #x1D6E4)
+    ("MATHEMATICAL ITALIC CAPITAL DELTA" #x1D6E5)
+    ("MATHEMATICAL ITALIC CAPITAL EPSILON" #x1D6E6)
+    ("MATHEMATICAL ITALIC CAPITAL ZETA" #x1D6E7)
+    ("MATHEMATICAL ITALIC CAPITAL ETA" #x1D6E8)
+    ("MATHEMATICAL ITALIC CAPITAL THETA" #x1D6E9)
+    ("MATHEMATICAL ITALIC CAPITAL IOTA" #x1D6EA)
+    ("MATHEMATICAL ITALIC CAPITAL KAPPA" #x1D6EB)
+    ("MATHEMATICAL ITALIC CAPITAL LAMDA" #x1D6EC)
+    ("MATHEMATICAL ITALIC CAPITAL MU" #x1D6ED)
+    ("MATHEMATICAL ITALIC CAPITAL NU" #x1D6EE)
+    ("MATHEMATICAL ITALIC CAPITAL XI" #x1D6EF)
+    ("MATHEMATICAL ITALIC CAPITAL OMICRON" #x1D6F0)
+    ("MATHEMATICAL ITALIC CAPITAL PI" #x1D6F1)
+    ("MATHEMATICAL ITALIC CAPITAL RHO" #x1D6F2)
+    ("MATHEMATICAL ITALIC CAPITAL THETA SYMBOL" #x1D6F3)
+    ("MATHEMATICAL ITALIC CAPITAL SIGMA" #x1D6F4)
+    ("MATHEMATICAL ITALIC CAPITAL TAU" #x1D6F5)
+    ("MATHEMATICAL ITALIC CAPITAL UPSILON" #x1D6F6)
+    ("MATHEMATICAL ITALIC CAPITAL PHI" #x1D6F7)
+    ("MATHEMATICAL ITALIC CAPITAL CHI" #x1D6F8)
+    ("MATHEMATICAL ITALIC CAPITAL PSI" #x1D6F9)
+    ("MATHEMATICAL ITALIC CAPITAL OMEGA" #x1D6FA)
+    ("MATHEMATICAL ITALIC NABLA" #x1D6FB)
+    ("MATHEMATICAL ITALIC SMALL ALPHA" #x1D6FC)
+    ("MATHEMATICAL ITALIC SMALL BETA" #x1D6FD)
+    ("MATHEMATICAL ITALIC SMALL GAMMA" #x1D6FE)
+    ("MATHEMATICAL ITALIC SMALL DELTA" #x1D6FF)
+    ("MATHEMATICAL ITALIC SMALL EPSILON" #x1D700)
+    ("MATHEMATICAL ITALIC SMALL ZETA" #x1D701)
+    ("MATHEMATICAL ITALIC SMALL ETA" #x1D702)
+    ("MATHEMATICAL ITALIC SMALL THETA" #x1D703)
+    ("MATHEMATICAL ITALIC SMALL IOTA" #x1D704)
+    ("MATHEMATICAL ITALIC SMALL KAPPA" #x1D705)
+    ("MATHEMATICAL ITALIC SMALL LAMDA" #x1D706)
+    ("MATHEMATICAL ITALIC SMALL MU" #x1D707)
+    ("MATHEMATICAL ITALIC SMALL NU" #x1D708)
+    ("MATHEMATICAL ITALIC SMALL XI" #x1D709)
+    ("MATHEMATICAL ITALIC SMALL OMICRON" #x1D70A)
+    ("MATHEMATICAL ITALIC SMALL PI" #x1D70B)
+    ("MATHEMATICAL ITALIC SMALL RHO" #x1D70C)
+    ("MATHEMATICAL ITALIC SMALL FINAL SIGMA" #x1D70D)
+    ("MATHEMATICAL ITALIC SMALL SIGMA" #x1D70E)
+    ("MATHEMATICAL ITALIC SMALL TAU" #x1D70F)
+    ("MATHEMATICAL ITALIC SMALL UPSILON" #x1D710)
+    ("MATHEMATICAL ITALIC SMALL PHI" #x1D711)
+    ("MATHEMATICAL ITALIC SMALL CHI" #x1D712)
+    ("MATHEMATICAL ITALIC SMALL PSI" #x1D713)
+    ("MATHEMATICAL ITALIC SMALL OMEGA" #x1D714)
+    ("MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL" #x1D715)
+    ("MATHEMATICAL ITALIC EPSILON SYMBOL" #x1D716)
+    ("MATHEMATICAL ITALIC THETA SYMBOL" #x1D717)
+    ("MATHEMATICAL ITALIC KAPPA SYMBOL" #x1D718)
+    ("MATHEMATICAL ITALIC PHI SYMBOL" #x1D719)
+    ("MATHEMATICAL ITALIC RHO SYMBOL" #x1D71A)
+    ("MATHEMATICAL ITALIC PI SYMBOL" #x1D71B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL ALPHA" #x1D71C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL BETA" #x1D71D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL GAMMA" #x1D71E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL DELTA" #x1D71F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL EPSILON" #x1D720)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL ZETA" #x1D721)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL ETA" #x1D722)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL THETA" #x1D723)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL IOTA" #x1D724)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL KAPPA" #x1D725)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL LAMDA" #x1D726)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL MU" #x1D727)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL NU" #x1D728)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL XI" #x1D729)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL OMICRON" #x1D72A)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL PI" #x1D72B)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL RHO" #x1D72C)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL" #x1D72D)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL SIGMA" #x1D72E)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL TAU" #x1D72F)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL UPSILON" #x1D730)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL PHI" #x1D731)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL CHI" #x1D732)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL PSI" #x1D733)
+    ("MATHEMATICAL BOLD ITALIC CAPITAL OMEGA" #x1D734)
+    ("MATHEMATICAL BOLD ITALIC NABLA" #x1D735)
+    ("MATHEMATICAL BOLD ITALIC SMALL ALPHA" #x1D736)
+    ("MATHEMATICAL BOLD ITALIC SMALL BETA" #x1D737)
+    ("MATHEMATICAL BOLD ITALIC SMALL GAMMA" #x1D738)
+    ("MATHEMATICAL BOLD ITALIC SMALL DELTA" #x1D739)
+    ("MATHEMATICAL BOLD ITALIC SMALL EPSILON" #x1D73A)
+    ("MATHEMATICAL BOLD ITALIC SMALL ZETA" #x1D73B)
+    ("MATHEMATICAL BOLD ITALIC SMALL ETA" #x1D73C)
+    ("MATHEMATICAL BOLD ITALIC SMALL THETA" #x1D73D)
+    ("MATHEMATICAL BOLD ITALIC SMALL IOTA" #x1D73E)
+    ("MATHEMATICAL BOLD ITALIC SMALL KAPPA" #x1D73F)
+    ("MATHEMATICAL BOLD ITALIC SMALL LAMDA" #x1D740)
+    ("MATHEMATICAL BOLD ITALIC SMALL MU" #x1D741)
+    ("MATHEMATICAL BOLD ITALIC SMALL NU" #x1D742)
+    ("MATHEMATICAL BOLD ITALIC SMALL XI" #x1D743)
+    ("MATHEMATICAL BOLD ITALIC SMALL OMICRON" #x1D744)
+    ("MATHEMATICAL BOLD ITALIC SMALL PI" #x1D745)
+    ("MATHEMATICAL BOLD ITALIC SMALL RHO" #x1D746)
+    ("MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA" #x1D747)
+    ("MATHEMATICAL BOLD ITALIC SMALL SIGMA" #x1D748)
+    ("MATHEMATICAL BOLD ITALIC SMALL TAU" #x1D749)
+    ("MATHEMATICAL BOLD ITALIC SMALL UPSILON" #x1D74A)
+    ("MATHEMATICAL BOLD ITALIC SMALL PHI" #x1D74B)
+    ("MATHEMATICAL BOLD ITALIC SMALL CHI" #x1D74C)
+    ("MATHEMATICAL BOLD ITALIC SMALL PSI" #x1D74D)
+    ("MATHEMATICAL BOLD ITALIC SMALL OMEGA" #x1D74E)
+    ("MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL" #x1D74F)
+    ("MATHEMATICAL BOLD ITALIC EPSILON SYMBOL" #x1D750)
+    ("MATHEMATICAL BOLD ITALIC THETA SYMBOL" #x1D751)
+    ("MATHEMATICAL BOLD ITALIC KAPPA SYMBOL" #x1D752)
+    ("MATHEMATICAL BOLD ITALIC PHI SYMBOL" #x1D753)
+    ("MATHEMATICAL BOLD ITALIC RHO SYMBOL" #x1D754)
+    ("MATHEMATICAL BOLD ITALIC PI SYMBOL" #x1D755)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA" #x1D756)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA" #x1D757)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA" #x1D758)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA" #x1D759)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON" #x1D75A)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA" #x1D75B)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA" #x1D75C)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA" #x1D75D)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA" #x1D75E)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA" #x1D75F)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA" #x1D760)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL MU" #x1D761)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL NU" #x1D762)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL XI" #x1D763)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON" #x1D764)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL PI" #x1D765)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO" #x1D766)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL" #x1D767)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA" #x1D768)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU" #x1D769)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON" #x1D76A)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI" #x1D76B)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI" #x1D76C)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI" #x1D76D)
+    ("MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA" #x1D76E)
+    ("MATHEMATICAL SANS-SERIF BOLD NABLA" #x1D76F)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA" #x1D770)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL BETA" #x1D771)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA" #x1D772)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL DELTA" #x1D773)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON" #x1D774)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL ZETA" #x1D775)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL ETA" #x1D776)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL THETA" #x1D777)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL IOTA" #x1D778)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA" #x1D779)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA" #x1D77A)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL MU" #x1D77B)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL NU" #x1D77C)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL XI" #x1D77D)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON" #x1D77E)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL PI" #x1D77F)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL RHO" #x1D780)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA" #x1D781)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA" #x1D782)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL TAU" #x1D783)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON" #x1D784)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL PHI" #x1D785)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL CHI" #x1D786)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL PSI" #x1D787)
+    ("MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA" #x1D788)
+    ("MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL" #x1D789)
+    ("MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL" #x1D78A)
+    ("MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL" #x1D78B)
+    ("MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL" #x1D78C)
+    ("MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL" #x1D78D)
+    ("MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL" #x1D78E)
+    ("MATHEMATICAL SANS-SERIF BOLD PI SYMBOL" #x1D78F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA" #x1D790)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA" #x1D791)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA" #x1D792)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA" #x1D793)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON" #x1D794)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA" #x1D795)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA" #x1D796)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA" #x1D797)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA" #x1D798)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA" #x1D799)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA" #x1D79A)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU" #x1D79B)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU" #x1D79C)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI" #x1D79D)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON" #x1D79E)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI" #x1D79F)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO" #x1D7A0)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL" #x1D7A1)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA" #x1D7A2)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU" #x1D7A3)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON" #x1D7A4)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI" #x1D7A5)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI" #x1D7A6)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI" #x1D7A7)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA" #x1D7A8)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA" #x1D7A9)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA" #x1D7AA)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA" #x1D7AB)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA" #x1D7AC)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA" #x1D7AD)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON" #x1D7AE)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA" #x1D7AF)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA" #x1D7B0)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA" #x1D7B1)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA" #x1D7B2)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA" #x1D7B3)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA" #x1D7B4)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU" #x1D7B5)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU" #x1D7B6)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI" #x1D7B7)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON" #x1D7B8)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI" #x1D7B9)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO" #x1D7BA)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA" #x1D7BB)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA" #x1D7BC)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU" #x1D7BD)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON" #x1D7BE)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI" #x1D7BF)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI" #x1D7C0)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI" #x1D7C1)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA" #x1D7C2)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL" #x1D7C3)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL" #x1D7C4)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL" #x1D7C5)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL" #x1D7C6)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL" #x1D7C7)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL" #x1D7C8)
+    ("MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL" #x1D7C9)
+    ("MATHEMATICAL BOLD DIGIT ZERO" #x1D7CE)
+    ("MATHEMATICAL BOLD DIGIT ONE" #x1D7CF)
+    ("MATHEMATICAL BOLD DIGIT TWO" #x1D7D0)
+    ("MATHEMATICAL BOLD DIGIT THREE" #x1D7D1)
+    ("MATHEMATICAL BOLD DIGIT FOUR" #x1D7D2)
+    ("MATHEMATICAL BOLD DIGIT FIVE" #x1D7D3)
+    ("MATHEMATICAL BOLD DIGIT SIX" #x1D7D4)
+    ("MATHEMATICAL BOLD DIGIT SEVEN" #x1D7D5)
+    ("MATHEMATICAL BOLD DIGIT EIGHT" #x1D7D6)
+    ("MATHEMATICAL BOLD DIGIT NINE" #x1D7D7)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO" #x1D7D8)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT ONE" #x1D7D9)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT TWO" #x1D7DA)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT THREE" #x1D7DB)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR" #x1D7DC)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE" #x1D7DD)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT SIX" #x1D7DE)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN" #x1D7DF)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT" #x1D7E0)
+    ("MATHEMATICAL DOUBLE-STRUCK DIGIT NINE" #x1D7E1)
+    ("MATHEMATICAL SANS-SERIF DIGIT ZERO" #x1D7E2)
+    ("MATHEMATICAL SANS-SERIF DIGIT ONE" #x1D7E3)
+    ("MATHEMATICAL SANS-SERIF DIGIT TWO" #x1D7E4)
+    ("MATHEMATICAL SANS-SERIF DIGIT THREE" #x1D7E5)
+    ("MATHEMATICAL SANS-SERIF DIGIT FOUR" #x1D7E6)
+    ("MATHEMATICAL SANS-SERIF DIGIT FIVE" #x1D7E7)
+    ("MATHEMATICAL SANS-SERIF DIGIT SIX" #x1D7E8)
+    ("MATHEMATICAL SANS-SERIF DIGIT SEVEN" #x1D7E9)
+    ("MATHEMATICAL SANS-SERIF DIGIT EIGHT" #x1D7EA)
+    ("MATHEMATICAL SANS-SERIF DIGIT NINE" #x1D7EB)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO" #x1D7EC)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT ONE" #x1D7ED)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT TWO" #x1D7EE)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT THREE" #x1D7EF)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR" #x1D7F0)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE" #x1D7F1)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT SIX" #x1D7F2)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN" #x1D7F3)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT" #x1D7F4)
+    ("MATHEMATICAL SANS-SERIF BOLD DIGIT NINE" #x1D7F5)
+    ("MATHEMATICAL MONOSPACE DIGIT ZERO" #x1D7F6)
+    ("MATHEMATICAL MONOSPACE DIGIT ONE" #x1D7F7)
+    ("MATHEMATICAL MONOSPACE DIGIT TWO" #x1D7F8)
+    ("MATHEMATICAL MONOSPACE DIGIT THREE" #x1D7F9)
+    ("MATHEMATICAL MONOSPACE DIGIT FOUR" #x1D7FA)
+    ("MATHEMATICAL MONOSPACE DIGIT FIVE" #x1D7FB)
+    ("MATHEMATICAL MONOSPACE DIGIT SIX" #x1D7FC)
+    ("MATHEMATICAL MONOSPACE DIGIT SEVEN" #x1D7FD)
+    ("MATHEMATICAL MONOSPACE DIGIT EIGHT" #x1D7FE)
+    ("MATHEMATICAL MONOSPACE DIGIT NINE" #x1D7FF)
+    ))
+
+;; arch-tag: af730f58-d05e-4cd5-8a94-f914444a5351
diff --git a/etc/nxml/E0000-E007F.el b/etc/nxml/E0000-E007F.el
new file mode 100644 (file)
index 0000000..1f4da35
--- /dev/null
@@ -0,0 +1,101 @@
+(nxml-define-char-name-set 'tags
+  '(("LANGUAGE TAG" #xE0001)
+    ("TAG SPACE" #xE0020)
+    ("TAG EXCLAMATION MARK" #xE0021)
+    ("TAG QUOTATION MARK" #xE0022)
+    ("TAG NUMBER SIGN" #xE0023)
+    ("TAG DOLLAR SIGN" #xE0024)
+    ("TAG PERCENT SIGN" #xE0025)
+    ("TAG AMPERSAND" #xE0026)
+    ("TAG APOSTROPHE" #xE0027)
+    ("TAG LEFT PARENTHESIS" #xE0028)
+    ("TAG RIGHT PARENTHESIS" #xE0029)
+    ("TAG ASTERISK" #xE002A)
+    ("TAG PLUS SIGN" #xE002B)
+    ("TAG COMMA" #xE002C)
+    ("TAG HYPHEN-MINUS" #xE002D)
+    ("TAG FULL STOP" #xE002E)
+    ("TAG SOLIDUS" #xE002F)
+    ("TAG DIGIT ZERO" #xE0030)
+    ("TAG DIGIT ONE" #xE0031)
+    ("TAG DIGIT TWO" #xE0032)
+    ("TAG DIGIT THREE" #xE0033)
+    ("TAG DIGIT FOUR" #xE0034)
+    ("TAG DIGIT FIVE" #xE0035)
+    ("TAG DIGIT SIX" #xE0036)
+    ("TAG DIGIT SEVEN" #xE0037)
+    ("TAG DIGIT EIGHT" #xE0038)
+    ("TAG DIGIT NINE" #xE0039)
+    ("TAG COLON" #xE003A)
+    ("TAG SEMICOLON" #xE003B)
+    ("TAG LESS-THAN SIGN" #xE003C)
+    ("TAG EQUALS SIGN" #xE003D)
+    ("TAG GREATER-THAN SIGN" #xE003E)
+    ("TAG QUESTION MARK" #xE003F)
+    ("TAG COMMERCIAL AT" #xE0040)
+    ("TAG LATIN CAPITAL LETTER A" #xE0041)
+    ("TAG LATIN CAPITAL LETTER B" #xE0042)
+    ("TAG LATIN CAPITAL LETTER C" #xE0043)
+    ("TAG LATIN CAPITAL LETTER D" #xE0044)
+    ("TAG LATIN CAPITAL LETTER E" #xE0045)
+    ("TAG LATIN CAPITAL LETTER F" #xE0046)
+    ("TAG LATIN CAPITAL LETTER G" #xE0047)
+    ("TAG LATIN CAPITAL LETTER H" #xE0048)
+    ("TAG LATIN CAPITAL LETTER I" #xE0049)
+    ("TAG LATIN CAPITAL LETTER J" #xE004A)
+    ("TAG LATIN CAPITAL LETTER K" #xE004B)
+    ("TAG LATIN CAPITAL LETTER L" #xE004C)
+    ("TAG LATIN CAPITAL LETTER M" #xE004D)
+    ("TAG LATIN CAPITAL LETTER N" #xE004E)
+    ("TAG LATIN CAPITAL LETTER O" #xE004F)
+    ("TAG LATIN CAPITAL LETTER P" #xE0050)
+    ("TAG LATIN CAPITAL LETTER Q" #xE0051)
+    ("TAG LATIN CAPITAL LETTER R" #xE0052)
+    ("TAG LATIN CAPITAL LETTER S" #xE0053)
+    ("TAG LATIN CAPITAL LETTER T" #xE0054)
+    ("TAG LATIN CAPITAL LETTER U" #xE0055)
+    ("TAG LATIN CAPITAL LETTER V" #xE0056)
+    ("TAG LATIN CAPITAL LETTER W" #xE0057)
+    ("TAG LATIN CAPITAL LETTER X" #xE0058)
+    ("TAG LATIN CAPITAL LETTER Y" #xE0059)
+    ("TAG LATIN CAPITAL LETTER Z" #xE005A)
+    ("TAG LEFT SQUARE BRACKET" #xE005B)
+    ("TAG REVERSE SOLIDUS" #xE005C)
+    ("TAG RIGHT SQUARE BRACKET" #xE005D)
+    ("TAG CIRCUMFLEX ACCENT" #xE005E)
+    ("TAG LOW LINE" #xE005F)
+    ("TAG GRAVE ACCENT" #xE0060)
+    ("TAG LATIN SMALL LETTER A" #xE0061)
+    ("TAG LATIN SMALL LETTER B" #xE0062)
+    ("TAG LATIN SMALL LETTER C" #xE0063)
+    ("TAG LATIN SMALL LETTER D" #xE0064)
+    ("TAG LATIN SMALL LETTER E" #xE0065)
+    ("TAG LATIN SMALL LETTER F" #xE0066)
+    ("TAG LATIN SMALL LETTER G" #xE0067)
+    ("TAG LATIN SMALL LETTER H" #xE0068)
+    ("TAG LATIN SMALL LETTER I" #xE0069)
+    ("TAG LATIN SMALL LETTER J" #xE006A)
+    ("TAG LATIN SMALL LETTER K" #xE006B)
+    ("TAG LATIN SMALL LETTER L" #xE006C)
+    ("TAG LATIN SMALL LETTER M" #xE006D)
+    ("TAG LATIN SMALL LETTER N" #xE006E)
+    ("TAG LATIN SMALL LETTER O" #xE006F)
+    ("TAG LATIN SMALL LETTER P" #xE0070)
+    ("TAG LATIN SMALL LETTER Q" #xE0071)
+    ("TAG LATIN SMALL LETTER R" #xE0072)
+    ("TAG LATIN SMALL LETTER S" #xE0073)
+    ("TAG LATIN SMALL LETTER T" #xE0074)
+    ("TAG LATIN SMALL LETTER U" #xE0075)
+    ("TAG LATIN SMALL LETTER V" #xE0076)
+    ("TAG LATIN SMALL LETTER W" #xE0077)
+    ("TAG LATIN SMALL LETTER X" #xE0078)
+    ("TAG LATIN SMALL LETTER Y" #xE0079)
+    ("TAG LATIN SMALL LETTER Z" #xE007A)
+    ("TAG LEFT CURLY BRACKET" #xE007B)
+    ("TAG VERTICAL LINE" #xE007C)
+    ("TAG RIGHT CURLY BRACKET" #xE007D)
+    ("TAG TILDE" #xE007E)
+    ("CANCEL TAG" #xE007F)
+    ))
+
+;; arch-tag: e79cd51a-999f-4f8c-8f11-a5eeb5c2de4c
diff --git a/etc/nxml/README b/etc/nxml/README
new file mode 100644 (file)
index 0000000..2710121
--- /dev/null
@@ -0,0 +1 @@
+These data files are used by the nxml package.
diff --git a/etc/schema/calstbl.rnc b/etc/schema/calstbl.rnc
new file mode 100644 (file)
index 0000000..df71a7c
--- /dev/null
@@ -0,0 +1,184 @@
+# This file was generated automatically by Trang, and then manually
+# edited to add back definitions for overridden parameter entities and
+# undefined elements, specifically: bodyatt, secur, paracon,
+# tbl.table.mdl, tbl.entry.mdl, caution, graphic, legend, note, para,
+# title, warning.  This makes the semantics of this module as close as
+# possible to the original DTD and also allows this schema to be used
+# independently of DocBook.
+
+# ......................................................................
+
+# DocBook CALS Table Model V4.2 ........................................
+
+# File calstblx.mod ....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# This DTD is based on the CALS Table Model
+# PUBLIC "-//USA-DOD//DTD Table Model 951010//EN"
+# 
+# $Id: calstbl.rnc,v 1.1 2007/11/23 06:57:43 hexmode Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the definitions for the CALS Table Model
+# converted to XML.
+
+# These definitions are not directly related to the table model, but are
+# used in the default CALS table model and are usually defined elsewhere
+# (and prior to the inclusion of this table module) in a CALS DTD.
+
+bodyatt = empty
+secur = empty
+
+# no if zero(s),
+# yes if any other digits value
+
+yesorno = string
+titles = title?
+# default for use in entry content
+paracon = text
+
+# The parameter entities as defined below provide the CALS table model
+# as published (as part of the Example DTD) in MIL-HDBK-28001.
+# 
+# These following declarations provide the CALS-compliant default definitions
+# for these entities.  However, these entities can and should be redefined
+# (by giving the appropriate parameter entity declaration(s) prior to the
+# reference to this Table Model declaration set entity) to fit the needs
+# of the current application.
+tbl.table-titles.mdl = titles
+tbl.table-main.mdl = tgroup+ | graphic+
+tbl.table.mdl = tbl.table-titles.mdl | tbl.table-main.mdl
+tbl.table.att =
+  attribute tabstyle { text }?,
+  attribute tocentry { yesorno }?,
+  attribute shortentry { yesorno }?,
+  attribute orient { "port" | "land" }?,
+  attribute pgwide { yesorno }?
+tbl.tgroup.mdl = colspec*, spanspec*, thead?, tfoot?, tbody
+tbl.tgroup.att = attribute tgroupstyle { text }?
+tbl.hdft.mdl = colspec*, row+
+tbl.row.mdl = (entry | entrytbl)+
+tbl.entrytbl.mdl = colspec*, spanspec*, thead?, tbody
+tbl.entry.mdl = paracon | para | warning | caution | note | legend
+# =====  Element and attribute declarations follow. =====
+start = table
+table = element table { table.attlist, tbl.table.mdl }
+table.attlist &=
+  attribute frame {
+    "top" | "bottom" | "topbot" | "all" | "sides" | "none"
+  }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  tbl.table.att,
+  bodyatt,
+  secur
+tgroup = element tgroup { tgroup.attlist, tbl.tgroup.mdl }
+tgroup.attlist &=
+  attribute cols { text },
+  tbl.tgroup.att,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?,
+  secur
+colspec = element colspec { colspec.attlist, empty }
+colspec.attlist &=
+  attribute colnum { text }?,
+  attribute colname { text }?,
+  attribute colwidth { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?
+spanspec = element spanspec { spanspec.attlist, empty }
+spanspec.attlist &=
+  attribute namest { text },
+  attribute nameend { text },
+  attribute spanname { text },
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?
+thead = element thead { thead.attlist, tbl.hdft.mdl }
+thead.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+tfoot = element tfoot { tfoot.attlist, tbl.hdft.mdl }
+tfoot.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+tbody = element tbody { tbody.attlist, row+ }
+tbody.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+row = element row { row.attlist, tbl.row.mdl }
+row.attlist &=
+  attribute rowsep { yesorno }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+entrytbl = element entrytbl { entrytbl.attlist, tbl.entrytbl.mdl }
+entrytbl.attlist &=
+  attribute cols { text },
+  tbl.tgroup.att,
+  attribute colname { text }?,
+  attribute spanname { text }?,
+  attribute namest { text }?,
+  attribute nameend { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?,
+  secur
+entry = element entry { entry.attlist, tbl.entry.mdl* }
+entry.attlist &=
+  attribute colname { text }?,
+  attribute namest { text }?,
+  attribute nameend { text }?,
+  attribute spanname { text }?,
+  attribute morerows { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { text }?,
+  attribute rotate { yesorno }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  secur
+caution |= notAllowed
+graphic |= notAllowed
+legend |= notAllowed
+note |= notAllowed
+para |= notAllowed
+title |= notAllowed
+warning |= notAllowed
+
+# End of DocBook CALS Table Model V4.2 .................................
+
+# ......................................................................
diff --git a/etc/schema/dbcalstbl.rnc b/etc/schema/dbcalstbl.rnc
new file mode 100644 (file)
index 0000000..9841df2
--- /dev/null
@@ -0,0 +1,25 @@
+# Definitions specific to the CALS Table Model.
+
+# Reference CALS Table Model
+include "calstbl.rnc" {
+  # Override definition of start
+  start |= notAllowed
+  # Add label and role attributes to table and informaltable
+  bodyatt = label.attrib
+  # Add common attributes to Table, TGroup, TBody, THead, TFoot, Row,
+  # EntryTbl, and Entry (and InformalTable element).
+  secur = common.attrib, tables.role.attrib
+  # Content model for Table.
+  tbl.table.mdl =
+    blockinfo?,
+    formalobject.title.content,
+    ndxterm.class*,
+    textobject*,
+    (graphic+ | mediaobject+ | tgroup+)
+  # Allow either objects or inlines; beware of REs between elements.
+  tbl.entry.mdl = para.char.mix | tabentry.mix
+}
+
+common.table.attribs = bodyatt, secur
+
+# end of table.module
diff --git a/etc/schema/dbdyntbl.rnc b/etc/schema/dbdyntbl.rnc
new file mode 100644 (file)
index 0000000..8e85914
--- /dev/null
@@ -0,0 +1,116 @@
+# This is an alternative to dbsoextbl.rnc and dbcalstbl.rnc that
+# allows the table model to be selected dynamically based on the
+# definitions of cals.table.module and exchange.table.module.
+#
+# To use this copy, docbook.rnc to docbook-dyntbl.rnc replacing
+# "dbcalstbl.rnc" by "dbdyntbl.rnc".  Then, you can override the
+# choice of table model by doing
+#
+# include "docbook-dyntbl.rnc" {
+#   cals.table.model = IGNORE
+#   exchange.table.model = INCLUDE
+# }
+
+INCLUDE = empty
+IGNORE = notAllowed
+cals.table.module = INCLUDE
+exchange.table.module = IGNORE
+
+# Add common attributes and the Label attribute to Table and
+# InformalTable.
+bodyatt = common.attrib, label.attrib, tables.role.attrib
+
+# Content model for Table.
+tbl.table.mdl =
+  blockinfo?,
+  formalobject.title.content,
+  ndxterm.class*,
+  textobject*,
+  (graphic+ | mediaobject+ | tgroup+)
+
+table = cals.table | exchange.table
+
+cals.table =
+  cals.table.module,
+  grammar {
+    # Reference CALS Table Model
+    include "calstbl.rnc" {
+      # Add label and role attributes to table and informaltable
+      bodyatt = parent label.attrib
+      # Add common attributes to Table, TGroup, TBody, THead, TFoot, Row,
+      # EntryTbl, and Entry (and InformalTable element).
+      secur = parent common.attrib, parent tables.role.attrib
+      tbl.table.mdl = parent tbl.table.mdl
+    }
+  }
+
+exchange.table =
+  exchange.table.module,
+  grammar {
+    # Reference OASIS Exchange Table Model
+    include "soextbl.rnc" {
+      # Add common attributes and the Label attribute to Table and
+      # InformalTable.
+      bodyatt = parent bodyatt
+      tbl.table.mdl = parent tbl.table.mdl
+    }
+  }
+
+tgroup = cals.tgroup | exchange.tgroup
+
+cals.tgroup =
+  cals.table.module,
+  grammar {
+    # Reference CALS Table Model
+    include "calstbl.rnc" {
+      start = tgroup
+      # Add label and role attributes to table and informaltable
+      bodyatt = parent label.attrib
+      # Add common attributes to Table, TGroup, TBody, THead, TFoot, Row,
+      # EntryTbl, and Entry (and InformalTable element).
+      secur = parent common.attrib, parent tables.role.attrib
+      # Allow either objects or inlines; beware of REs between elements.
+      tbl.entry.mdl = parent para.char.mix | parent tabentry.mix
+    }
+  }
+
+exchange.tgroup =
+  exchange.table.module,
+  grammar {
+    # Reference OASIS Exchange Table Model
+    include "soextbl.rnc" {
+      start = tgroup
+      bodyatt = parent bodyatt
+      # Add common attributes to TGroup, ColSpec, TBody, THead, Row, Entry
+      tbl.tgroup.att = parent common.attrib
+      tbl.colspec.att = parent common.attrib
+      tbl.tbody.att = parent common.attrib
+      tbl.thead.att = parent common.attrib
+      tbl.row.att = parent common.attrib
+      tbl.entry.att = parent common.attrib
+      # Allow either objects or inlines; beware of REs between elements.
+      tbl.entry.mdl = (parent para.char.mix | parent tabentry.mix)*
+    }
+  }
+
+tbl.table.att = cals.tbl.table.att | exchange.tbl.table.att
+
+cals.tbl.table.att =
+  cals.table.module,
+  grammar {
+    include "calstbl.rnc" {
+      start = tbl.table.att
+    }
+  }
+
+exchange.tbl.table.att =
+  exchange.table.module,
+  grammar {
+    include "soextbl.rnc" {
+      start = tbl.table.att
+    }
+  }
+
+common.table.attribs = bodyatt
+
+# end of table.module
diff --git a/etc/schema/dbhier.rnc b/etc/schema/dbhier.rnc
new file mode 100644 (file)
index 0000000..fd735bc
--- /dev/null
@@ -0,0 +1,1467 @@
+# ......................................................................
+
+# DocBook document hierarchy module V4.2 ...............................
+
+# File dbhierx.mod .....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# $Id: dbhier.rnc,v 1.1 2007/11/23 06:57:44 hexmode Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the definitions for the overall document
+# hierarchies of DocBook documents.  It covers computer documentation
+# manuals and manual fragments, as well as reference entries (such as
+# man pages) and technical journals or anthologies containing
+# articles.
+# 
+# This module depends on the DocBook information pool module.  All
+# elements and entities referenced but not defined here are assumed
+# to be defined in the information pool module.
+# 
+# In DTD driver files referring to this module, please use an entity
+# declaration that uses the public identifier shown below:
+# 
+# <!ENTITY % dbhier PUBLIC
+# "-//OASIS//ELEMENTS DocBook Document Hierarchy V4.2//EN"
+# "dbhierx.mod">
+# %dbhier;
+# 
+# See the documentation for detailed information on the parameter
+# entity and module scheme used in DocBook, customizing DocBook and
+# planning for interchange, and changes made since the last release
+# of DocBook.
+
+# ......................................................................
+
+# Entities for module inclusions .......................................
+
+# ......................................................................
+
+# Entities for element classes .........................................
+
+local.appendix.class = notAllowed
+appendix.class = appendix | local.appendix.class
+local.article.class = notAllowed
+article.class = article | local.article.class
+local.book.class = notAllowed
+book.class = book | local.book.class
+local.chapter.class = notAllowed
+chapter.class = chapter | local.chapter.class
+local.index.class = notAllowed
+index.class = index | setindex | local.index.class
+local.refentry.class = notAllowed
+refentry.class = refentry | local.refentry.class
+local.section.class = notAllowed
+section.class = section | local.section.class
+local.nav.class = notAllowed
+nav.class =
+  toc | lot | index | glossary | bibliography | local.nav.class
+# Redeclaration placeholder ............................................
+
+# For redeclaring entities that are declared after this point while
+# retaining their references to the entities that are declared before
+# this point
+
+# ......................................................................
+
+# Entities for element mixtures ........................................
+
+# The DocBook TC may produce an official forms module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+forms.hook = notAllowed
+local.divcomponent.mix = notAllowed
+divcomponent.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | compound.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | forms.hook
+  | local.divcomponent.mix
+local.refcomponent.mix = notAllowed
+refcomponent.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | compound.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | local.refcomponent.mix
+local.indexdivcomponent.mix = notAllowed
+indexdivcomponent.mix =
+  itemizedlist
+  | orderedlist
+  | variablelist
+  | simplelist
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | anchor
+  | remark
+  | link.char.class
+  | beginpage
+  | local.indexdivcomponent.mix
+local.refname.char.mix = notAllowed
+refname.char.mix = text | tech.char.class | local.refname.char.mix
+local.partcontent.mix = notAllowed
+partcontent.mix =
+  appendix.class
+  | chapter.class
+  | nav.class
+  | article.class
+  | preface
+  | refentry.class
+  | reference
+  | local.partcontent.mix
+local.refinline.char.mix = notAllowed
+refinline.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | ndxterm.class
+  | beginpage
+  | local.refinline.char.mix
+local.refclass.char.mix = notAllowed
+refclass.char.mix = text | application | local.refclass.char.mix
+# Redeclaration placeholder 2 ..........................................
+
+# For redeclaring entities that are declared after this point while
+# retaining their references to the entities that are declared before
+# this point
+
+# ......................................................................
+
+# Entities for content models ..........................................
+div.title.content = title, subtitle?, titleabbrev?
+bookcomponent.title.content = title, subtitle?, titleabbrev?
+sect.title.content = title, subtitle?, titleabbrev?
+refsect.title.content = title, subtitle?, titleabbrev?
+bookcomponent.content =
+  (divcomponent.mix+,
+   (sect1* | refentry.class* | simplesect* | section.class*))
+  | (sect1+ | refentry.class+ | simplesect+ | section.class+)
+# ......................................................................
+
+# Set and SetInfo ......................................................
+local.set.attrib = empty
+set.role.attrib = role.attrib
+set =
+  element set {
+    set.attlist,
+    div.title.content?,
+    setinfo?,
+    toc?,
+    book.class+,
+    setindex?
+  }
+# end of set.element
+
+# FPI: SGML formal public identifier
+set.attlist &=
+  attribute fpi { text }?,
+  status.attrib,
+  common.attrib,
+  set.role.attrib,
+  local.set.attrib
+# end of set.attlist
+
+# end of set.module
+local.setinfo.attrib = empty
+setinfo.role.attrib = role.attrib
+setinfo = element setinfo { setinfo.attlist, info.class+ }
+# end of setinfo.element
+
+# Contents: IDs of the ToC, Books, and SetIndex that comprise
+# the set, in the order of their appearance
+setinfo.attlist &=
+  attribute contents { xsd:IDREFS }?,
+  common.attrib,
+  setinfo.role.attrib,
+  local.setinfo.attrib
+# end of setinfo.attlist
+
+# end of setinfo.module
+
+# end of set.content.module
+
+# ......................................................................
+
+# Book and BookInfo ....................................................
+local.book.attrib = empty
+book.role.attrib = role.attrib
+book =
+  element book {
+    book.attlist,
+    div.title.content?,
+    bookinfo?,
+    (dedication
+     | toc
+     | lot
+     | glossary
+     | bibliography
+     | preface
+     | chapter.class
+     | reference
+     | part
+     | article.class
+     | appendix.class
+     | index.class
+     | colophon)*
+  }
+# end of book.element
+
+# FPI: SGML formal public identifier
+book.attlist &=
+  attribute fpi { text }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  book.role.attrib,
+  local.book.attrib
+# end of book.attlist
+
+# end of book.module
+local.bookinfo.attrib = empty
+bookinfo.role.attrib = role.attrib
+bookinfo = element bookinfo { bookinfo.attlist, info.class+ }
+# end of bookinfo.element
+
+# Contents: IDs of the ToC, LoTs, Prefaces, Parts, Chapters,
+# Appendixes, References, GLossary, Bibliography, and indexes
+# comprising the Book, in the order of their appearance
+bookinfo.attlist &=
+  attribute contents { xsd:IDREFS }?,
+  common.attrib,
+  bookinfo.role.attrib,
+  local.bookinfo.attrib
+# end of bookinfo.attlist
+
+# end of bookinfo.module
+
+# end of book.content.module
+
+# ......................................................................
+
+# Dedication, ToC, and LoT .............................................
+local.dedication.attrib = empty
+dedication.role.attrib = role.attrib
+dedication =
+  element dedication {
+    dedication.attlist, sect.title.content?, legalnotice.mix+
+  }
+# end of dedication.element
+dedication.attlist &=
+  status.attrib,
+  common.attrib,
+  dedication.role.attrib,
+  local.dedication.attrib
+# end of dedication.attlist
+
+# end of dedication.module
+local.colophon.attrib = empty
+colophon.role.attrib = role.attrib
+colophon =
+  element colophon {
+    colophon.attlist, sect.title.content?, textobject.mix+
+  }
+# end of colophon.element
+colophon.attlist &=
+  status.attrib,
+  common.attrib,
+  colophon.role.attrib,
+  local.colophon.attrib
+# end of colophon.attlist
+
+# end of colophon.module
+local.toc.attrib = empty
+toc.role.attrib = role.attrib
+toc =
+  element toc {
+    toc.attlist,
+    beginpage?,
+    bookcomponent.title.content?,
+    tocfront*,
+    (tocpart | tocchap)*,
+    tocback*
+  }
+# end of toc.element
+toc.attlist &=
+  pagenum.attrib, common.attrib, toc.role.attrib, local.toc.attrib
+# end of toc.attlist
+
+# end of toc.module
+local.tocfront.attrib = empty
+tocfront.role.attrib = role.attrib
+tocfront = element tocfront { tocfront.attlist, para.char.mix* }
+# end of tocfront.element
+
+# to element that this entry represents
+tocfront.attlist &=
+  label.attrib,
+  linkend.attrib,
+  pagenum.attrib,
+  common.attrib,
+  tocfront.role.attrib,
+  local.tocfront.attrib
+# end of tocfront.attlist
+
+# end of tocfront.module
+local.tocentry.attrib = empty
+tocentry.role.attrib = role.attrib
+tocentry = element tocentry { tocentry.attlist, para.char.mix* }
+# end of tocentry.element
+
+# to element that this entry represents
+tocentry.attlist &=
+  linkend.attrib,
+  pagenum.attrib,
+  common.attrib,
+  tocentry.role.attrib,
+  local.tocentry.attrib
+# end of tocentry.attlist
+
+# end of tocentry.module
+local.tocpart.attrib = empty
+tocpart.role.attrib = role.attrib
+tocpart = element tocpart { tocpart.attlist, tocentry+, tocchap* }
+# end of tocpart.element
+tocpart.attlist &=
+  common.attrib, tocpart.role.attrib, local.tocpart.attrib
+# end of tocpart.attlist
+
+# end of tocpart.module
+local.tocchap.attrib = empty
+tocchap.role.attrib = role.attrib
+tocchap = element tocchap { tocchap.attlist, tocentry+, toclevel1* }
+# end of tocchap.element
+tocchap.attlist &=
+  label.attrib, common.attrib, tocchap.role.attrib, local.tocchap.attrib
+# end of tocchap.attlist
+
+# end of tocchap.module
+local.toclevel1.attrib = empty
+toclevel1.role.attrib = role.attrib
+toclevel1 =
+  element toclevel1 { toclevel1.attlist, tocentry+, toclevel2* }
+# end of toclevel1.element
+toclevel1.attlist &=
+  common.attrib, toclevel1.role.attrib, local.toclevel1.attrib
+# end of toclevel1.attlist
+
+# end of toclevel1.module
+local.toclevel2.attrib = empty
+toclevel2.role.attrib = role.attrib
+toclevel2 =
+  element toclevel2 { toclevel2.attlist, tocentry+, toclevel3* }
+# end of toclevel2.element
+toclevel2.attlist &=
+  common.attrib, toclevel2.role.attrib, local.toclevel2.attrib
+# end of toclevel2.attlist
+
+# end of toclevel2.module
+local.toclevel3.attrib = empty
+toclevel3.role.attrib = role.attrib
+toclevel3 =
+  element toclevel3 { toclevel3.attlist, tocentry+, toclevel4* }
+# end of toclevel3.element
+toclevel3.attlist &=
+  common.attrib, toclevel3.role.attrib, local.toclevel3.attrib
+# end of toclevel3.attlist
+
+# end of toclevel3.module
+local.toclevel4.attrib = empty
+toclevel4.role.attrib = role.attrib
+toclevel4 =
+  element toclevel4 { toclevel4.attlist, tocentry+, toclevel5* }
+# end of toclevel4.element
+toclevel4.attlist &=
+  common.attrib, toclevel4.role.attrib, local.toclevel4.attrib
+# end of toclevel4.attlist
+
+# end of toclevel4.module
+local.toclevel5.attrib = empty
+toclevel5.role.attrib = role.attrib
+toclevel5 = element toclevel5 { toclevel5.attlist, tocentry+ }
+# end of toclevel5.element
+toclevel5.attlist &=
+  common.attrib, toclevel5.role.attrib, local.toclevel5.attrib
+# end of toclevel5.attlist
+
+# end of toclevel5.module
+local.tocback.attrib = empty
+tocback.role.attrib = role.attrib
+tocback = element tocback { tocback.attlist, para.char.mix* }
+# end of tocback.element
+
+# to element that this entry represents
+tocback.attlist &=
+  label.attrib,
+  linkend.attrib,
+  pagenum.attrib,
+  common.attrib,
+  tocback.role.attrib,
+  local.tocback.attrib
+# end of tocback.attlist
+
+# end of tocback.module
+
+# end of toc.content.module
+local.lot.attrib = empty
+lot.role.attrib = role.attrib
+lot =
+  element lot {
+    lot.attlist, beginpage?, bookcomponent.title.content?, lotentry*
+  }
+# end of lot.element
+lot.attlist &=
+  label.attrib, common.attrib, lot.role.attrib, local.lot.attrib
+# end of lot.attlist
+
+# end of lot.module
+local.lotentry.attrib = empty
+lotentry.role.attrib = role.attrib
+lotentry = element lotentry { lotentry.attlist, para.char.mix* }
+# end of lotentry.element
+
+# SrcCredit: Information about the source of the entry,
+# as for a list of illustrations
+
+#  linkend: to element that this entry represents
+lotentry.attlist &=
+  linkend.attrib,
+  pagenum.attrib,
+  attribute srccredit { text }?,
+  common.attrib,
+  lotentry.role.attrib,
+  local.lotentry.attrib
+# end of lotentry.attlist
+
+# end of lotentry.module
+
+# end of lot.content.module
+
+# ......................................................................
+
+# Appendix, Chapter, Part, Preface, Reference, PartIntro ...............
+local.appendix.attrib = empty
+appendix.role.attrib = role.attrib
+appendix =
+  element appendix {
+    appendix.attlist,
+    beginpage?,
+    appendixinfo?,
+    bookcomponent.title.content,
+    nav.class*,
+    tocchap?,
+    bookcomponent.content,
+    nav.class*
+  }
+# end of appendix.element
+appendix.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  appendix.role.attrib,
+  local.appendix.attrib
+# end of appendix.attlist
+
+# end of appendix.module
+local.chapter.attrib = empty
+chapter.role.attrib = role.attrib
+chapter =
+  element chapter {
+    chapter.attlist,
+    beginpage?,
+    chapterinfo?,
+    bookcomponent.title.content,
+    nav.class*,
+    tocchap?,
+    bookcomponent.content,
+    nav.class*
+  }
+# end of chapter.element
+chapter.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  chapter.role.attrib,
+  local.chapter.attrib
+# end of chapter.attlist
+
+# end of chapter.module
+
+# Note that Part was to have its content model reduced in V4.2.  This
+# change will not be made after all.
+local.part.attrib = empty
+part.role.attrib = role.attrib
+part =
+  element part {
+    part.attlist,
+    beginpage?,
+    partinfo?,
+    bookcomponent.title.content,
+    partintro?,
+    partcontent.mix+
+  }
+# end of part.element
+part.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  part.role.attrib,
+  local.part.attrib
+# end of part.attlist
+
+# ELEMENT PartIntro (defined below)
+
+# end of part.module
+local.preface.attrib = empty
+preface.role.attrib = role.attrib
+preface =
+  element preface {
+    preface.attlist,
+    beginpage?,
+    prefaceinfo?,
+    bookcomponent.title.content,
+    nav.class*,
+    tocchap?,
+    bookcomponent.content,
+    nav.class*
+  }
+# end of preface.element
+preface.attlist &=
+  status.attrib,
+  common.attrib,
+  preface.role.attrib,
+  local.preface.attrib
+# end of preface.attlist
+
+# end of preface.module
+local.reference.attrib = empty
+reference.role.attrib = role.attrib
+reference =
+  element reference {
+    reference.attlist,
+    beginpage?,
+    referenceinfo?,
+    bookcomponent.title.content,
+    partintro?,
+    refentry.class+
+  }
+# end of reference.element
+reference.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  reference.role.attrib,
+  local.reference.attrib
+# end of reference.attlist
+
+# ELEMENT PartIntro (defined below)
+
+# end of reference.module
+local.partintro.attrib = empty
+partintro.role.attrib = role.attrib
+partintro =
+  element partintro {
+    partintro.attlist, div.title.content?, bookcomponent.content
+  }
+# end of partintro.element
+partintro.attlist &=
+  label.attrib,
+  common.attrib,
+  partintro.role.attrib,
+  local.partintro.attrib
+# end of partintro.attlist
+
+# end of partintro.module
+
+# ......................................................................
+
+# Other Info elements ..................................................
+local.appendixinfo.attrib = empty
+appendixinfo.role.attrib = role.attrib
+appendixinfo =
+  element appendixinfo { appendixinfo.attlist, info.class+ }
+# end of appendixinfo.element
+appendixinfo.attlist &=
+  common.attrib, appendixinfo.role.attrib, local.appendixinfo.attrib
+# end of appendixinfo.attlist
+
+# end of appendixinfo.module
+local.bibliographyinfo.attrib = empty
+bibliographyinfo.role.attrib = role.attrib
+bibliographyinfo =
+  element bibliographyinfo { bibliographyinfo.attlist, info.class+ }
+# end of bibliographyinfo.element
+bibliographyinfo.attlist &=
+  common.attrib,
+  bibliographyinfo.role.attrib,
+  local.bibliographyinfo.attrib
+# end of bibliographyinfo.attlist
+
+# end of bibliographyinfo.module
+local.chapterinfo.attrib = empty
+chapterinfo.role.attrib = role.attrib
+chapterinfo = element chapterinfo { chapterinfo.attlist, info.class+ }
+# end of chapterinfo.element
+chapterinfo.attlist &=
+  common.attrib, chapterinfo.role.attrib, local.chapterinfo.attrib
+# end of chapterinfo.attlist
+
+# end of chapterinfo.module
+local.glossaryinfo.attrib = empty
+glossaryinfo.role.attrib = role.attrib
+glossaryinfo =
+  element glossaryinfo { glossaryinfo.attlist, info.class+ }
+# end of glossaryinfo.element
+glossaryinfo.attlist &=
+  common.attrib, glossaryinfo.role.attrib, local.glossaryinfo.attrib
+# end of glossaryinfo.attlist
+
+# end of glossaryinfo.module
+local.indexinfo.attrib = empty
+indexinfo.role.attrib = role.attrib
+indexinfo = element indexinfo { indexinfo.attlist, info.class+ }
+# end of indexinfo.element
+indexinfo.attlist &=
+  common.attrib, indexinfo.role.attrib, local.indexinfo.attrib
+# end of indexinfo.attlist
+
+# end of indexinfo.module
+local.setindexinfo.attrib = empty
+setindexinfo.role.attrib = role.attrib
+setindexinfo =
+  element setindexinfo { setindexinfo.attlist, info.class+ }
+# end of setindexinfo.element
+setindexinfo.attlist &=
+  common.attrib, setindexinfo.role.attrib, local.setindexinfo.attrib
+# end of setindexinfo.attlist
+
+# end of setindexinfo.module
+local.partinfo.attrib = empty
+partinfo.role.attrib = role.attrib
+partinfo = element partinfo { partinfo.attlist, info.class+ }
+# end of partinfo.element
+partinfo.attlist &=
+  common.attrib, partinfo.role.attrib, local.partinfo.attrib
+# end of partinfo.attlist
+
+# end of partinfo.module
+local.prefaceinfo.attrib = empty
+prefaceinfo.role.attrib = role.attrib
+prefaceinfo = element prefaceinfo { prefaceinfo.attlist, info.class+ }
+# end of prefaceinfo.element
+prefaceinfo.attlist &=
+  common.attrib, prefaceinfo.role.attrib, local.prefaceinfo.attrib
+# end of prefaceinfo.attlist
+
+# end of prefaceinfo.module
+local.refentryinfo.attrib = empty
+refentryinfo.role.attrib = role.attrib
+refentryinfo =
+  element refentryinfo { refentryinfo.attlist, info.class+ }
+# end of refentryinfo.element
+refentryinfo.attlist &=
+  common.attrib, refentryinfo.role.attrib, local.refentryinfo.attrib
+# end of refentryinfo.attlist
+
+# end of refentryinfo.module
+local.refsectioninfo.attrib = empty
+refsectioninfo.role.attrib = role.attrib
+refsectioninfo =
+  element refsectioninfo { refsectioninfo.attlist, info.class+ }
+# end of refsectioninfo.element
+refsectioninfo.attlist &=
+  common.attrib, refsectioninfo.role.attrib, local.refsectioninfo.attrib
+# end of refsectioninfo.attlist
+
+# end of refsectioninfo.module
+local.refsect1info.attrib = empty
+refsect1info.role.attrib = role.attrib
+refsect1info =
+  element refsect1info { refsect1info.attlist, info.class+ }
+# end of refsect1info.element
+refsect1info.attlist &=
+  common.attrib, refsect1info.role.attrib, local.refsect1info.attrib
+# end of refsect1info.attlist
+
+# end of refsect1info.module
+local.refsect2info.attrib = empty
+refsect2info.role.attrib = role.attrib
+refsect2info =
+  element refsect2info { refsect2info.attlist, info.class+ }
+# end of refsect2info.element
+refsect2info.attlist &=
+  common.attrib, refsect2info.role.attrib, local.refsect2info.attrib
+# end of refsect2info.attlist
+
+# end of refsect2info.module
+local.refsect3info.attrib = empty
+refsect3info.role.attrib = role.attrib
+refsect3info =
+  element refsect3info { refsect3info.attlist, info.class+ }
+# end of refsect3info.element
+refsect3info.attlist &=
+  common.attrib, refsect3info.role.attrib, local.refsect3info.attrib
+# end of refsect3info.attlist
+
+# end of refsect3info.module
+local.refsynopsisdivinfo.attrib = empty
+refsynopsisdivinfo.role.attrib = role.attrib
+refsynopsisdivinfo =
+  element refsynopsisdivinfo { refsynopsisdivinfo.attlist, info.class+ }
+# end of refsynopsisdivinfo.element
+refsynopsisdivinfo.attlist &=
+  common.attrib,
+  refsynopsisdivinfo.role.attrib,
+  local.refsynopsisdivinfo.attrib
+# end of refsynopsisdivinfo.attlist
+
+# end of refsynopsisdivinfo.module
+local.referenceinfo.attrib = empty
+referenceinfo.role.attrib = role.attrib
+referenceinfo =
+  element referenceinfo { referenceinfo.attlist, info.class+ }
+# end of referenceinfo.element
+referenceinfo.attlist &=
+  common.attrib, referenceinfo.role.attrib, local.referenceinfo.attrib
+# end of referenceinfo.attlist
+
+# end of referenceinfo.module
+local.sect1info.attrib = empty
+sect1info.role.attrib = role.attrib
+sect1info = element sect1info { sect1info.attlist, info.class+ }
+# end of sect1info.element
+sect1info.attlist &=
+  common.attrib, sect1info.role.attrib, local.sect1info.attrib
+# end of sect1info.attlist
+local.sect2info.attrib = empty
+sect2info.role.attrib = role.attrib
+sect2info = element sect2info { sect2info.attlist, info.class+ }
+# end of sect2info.element
+sect2info.attlist &=
+  common.attrib, sect2info.role.attrib, local.sect2info.attrib
+# end of sect2info.attlist
+local.sect3info.attrib = empty
+sect3info.role.attrib = role.attrib
+sect3info = element sect3info { sect3info.attlist, info.class+ }
+# end of sect3info.element
+sect3info.attlist &=
+  common.attrib, sect3info.role.attrib, local.sect3info.attrib
+# end of sect3info.attlist
+local.sect4info.attrib = empty
+sect4info.role.attrib = role.attrib
+sect4info = element sect4info { sect4info.attlist, info.class+ }
+# end of sect4info.element
+sect4info.attlist &=
+  common.attrib, sect4info.role.attrib, local.sect4info.attrib
+# end of sect4info.attlist
+local.sect5info.attrib = empty
+sect5info.role.attrib = role.attrib
+sect5info = element sect5info { sect5info.attlist, info.class+ }
+# end of sect5info.element
+sect5info.attlist &=
+  common.attrib, sect5info.role.attrib, local.sect5info.attrib
+# end of sect5info.attlist
+
+# ......................................................................
+
+# Section (parallel to Sect*) .........................................
+local.section.attrib = empty
+section.role.attrib = role.attrib
+section =
+  element section {
+    section.attlist,
+    sectioninfo?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+,
+      (refentry.class* | section.class* | simplesect*))
+     | refentry.class+
+     | section.class+
+     | simplesect+),
+    nav.class*
+  }
+# end of section.element
+section.attlist &=
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  section.role.attrib,
+  local.section.attrib
+# end of section.attlist
+
+# end of section.module
+sectioninfo.role.attrib = role.attrib
+local.sectioninfo.attrib = empty
+sectioninfo = element sectioninfo { sectioninfo.attlist, info.class+ }
+# end of sectioninfo.element
+sectioninfo.attlist &=
+  common.attrib, sectioninfo.role.attrib, local.sectioninfo.attrib
+# end of sectioninfo.attlist
+
+# end of sectioninfo.module
+
+# end of section.content.module
+
+# ......................................................................
+
+# Sect1, Sect2, Sect3, Sect4, Sect5 ....................................
+local.sect1.attrib = empty
+sect1.role.attrib = role.attrib
+sect1 =
+  element sect1 {
+    sect1.attlist,
+    sect1info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect2* | simplesect*))
+     | refentry.class+
+     | sect2+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect1.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect1.attlist &=
+  attribute renderas { "sect2" | "sect3" | "sect4" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect1.role.attrib,
+  local.sect1.attrib
+# end of sect1.attlist
+
+# end of sect1.module
+local.sect2.attrib = empty
+sect2.role.attrib = role.attrib
+sect2 =
+  element sect2 {
+    sect2.attlist,
+    sect2info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect3* | simplesect*))
+     | refentry.class+
+     | sect3+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect2.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect2.attlist &=
+  attribute renderas { "sect1" | "sect3" | "sect4" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect2.role.attrib,
+  local.sect2.attrib
+# end of sect2.attlist
+
+# end of sect2.module
+local.sect3.attrib = empty
+sect3.role.attrib = role.attrib
+sect3 =
+  element sect3 {
+    sect3.attlist,
+    sect3info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect4* | simplesect*))
+     | refentry.class+
+     | sect4+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect3.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect3.attlist &=
+  attribute renderas { "sect1" | "sect2" | "sect4" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect3.role.attrib,
+  local.sect3.attrib
+# end of sect3.attlist
+
+# end of sect3.module
+local.sect4.attrib = empty
+sect4.role.attrib = role.attrib
+sect4 =
+  element sect4 {
+    sect4.attlist,
+    sect4info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | sect5* | simplesect*))
+     | refentry.class+
+     | sect5+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect4.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect4.attlist &=
+  attribute renderas { "sect1" | "sect2" | "sect3" | "sect5" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect4.role.attrib,
+  local.sect4.attrib
+# end of sect4.attlist
+
+# end of sect4.module
+local.sect5.attrib = empty
+sect5.role.attrib = role.attrib
+sect5 =
+  element sect5 {
+    sect5.attlist,
+    sect5info?,
+    sect.title.content,
+    nav.class*,
+    ((divcomponent.mix+, (refentry.class* | simplesect*))
+     | refentry.class+
+     | simplesect+),
+    nav.class*
+  }
+# end of sect5.element
+
+# Renderas: Indicates the format in which the heading should
+# appear
+sect5.attlist &=
+  attribute renderas { "sect1" | "sect2" | "sect3" | "sect4" }?,
+  label.attrib,
+  status.attrib,
+  common.attrib,
+  sect5.role.attrib,
+  local.sect5.attrib
+# end of sect5.attlist
+
+# end of sect5.module
+local.simplesect.attrib = empty
+simplesect.role.attrib = role.attrib
+simplesect =
+  element simplesect {
+    simplesect.attlist, sect.title.content, divcomponent.mix+
+  }
+# end of simplesect.element
+simplesect.attlist &=
+  common.attrib, simplesect.role.attrib, local.simplesect.attrib
+# end of simplesect.attlist
+
+# end of simplesect.module
+
+# ......................................................................
+
+# Bibliography .........................................................
+local.bibliography.attrib = empty
+bibliography.role.attrib = role.attrib
+bibliography =
+  element bibliography {
+    bibliography.attlist,
+    bibliographyinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (bibliodiv+ | (biblioentry | bibliomixed)+)
+  }
+# end of bibliography.element
+bibliography.attlist &=
+  status.attrib,
+  common.attrib,
+  bibliography.role.attrib,
+  local.bibliography.attrib
+# end of bibliography.attlist
+
+# end of bibliography.module
+local.bibliodiv.attrib = empty
+bibliodiv.role.attrib = role.attrib
+bibliodiv =
+  element bibliodiv {
+    bibliodiv.attlist,
+    sect.title.content?,
+    component.mix*,
+    (biblioentry | bibliomixed)+
+  }
+# end of bibliodiv.element
+bibliodiv.attlist &=
+  status.attrib,
+  common.attrib,
+  bibliodiv.role.attrib,
+  local.bibliodiv.attrib
+# end of bibliodiv.attlist
+
+# end of bibliodiv.module
+
+# end of bibliography.content.module
+
+# ......................................................................
+
+# Glossary .............................................................
+local.glossary.attrib = empty
+glossary.role.attrib = role.attrib
+glossary =
+  element glossary {
+    glossary.attlist,
+    glossaryinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (glossdiv+ | glossentry+),
+    bibliography?
+  }
+# end of glossary.element
+glossary.attlist &=
+  status.attrib,
+  common.attrib,
+  glossary.role.attrib,
+  local.glossary.attrib
+# end of glossary.attlist
+
+# end of glossary.module
+local.glossdiv.attrib = empty
+glossdiv.role.attrib = role.attrib
+glossdiv =
+  element glossdiv {
+    glossdiv.attlist, sect.title.content, component.mix*, glossentry+
+  }
+# end of glossdiv.element
+glossdiv.attlist &=
+  status.attrib,
+  common.attrib,
+  glossdiv.role.attrib,
+  local.glossdiv.attrib
+# end of glossdiv.attlist
+
+# end of glossdiv.module
+
+# end of glossary.content.module
+
+# ......................................................................
+
+# Index and SetIndex ...................................................
+local.indexes.attrib = empty
+indexes.role.attrib = role.attrib
+index =
+  element index {
+    index.attlist,
+    indexinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (indexdiv* | indexentry*)
+  }
+# end of index.element
+index.attlist &=
+  common.attrib, indexes.role.attrib, local.indexes.attrib
+# end of index.attlist
+setindex =
+  element setindex {
+    setindex.attlist,
+    setindexinfo?,
+    bookcomponent.title.content?,
+    component.mix*,
+    (indexdiv* | indexentry*)
+  }
+# end of setindex.element
+setindex.attlist &=
+  common.attrib, indexes.role.attrib, local.indexes.attrib
+# end of setindex.attlist
+
+# end of indexes.module
+
+# SegmentedList in this content is useful for marking up permuted
+# indices.
+local.indexdiv.attrib = empty
+indexdiv.role.attrib = role.attrib
+indexdiv =
+  element indexdiv {
+    indexdiv.attlist,
+    sect.title.content?,
+    (indexdivcomponent.mix*, (indexentry+ | segmentedlist))
+  }
+# end of indexdiv.element
+indexdiv.attlist &=
+  common.attrib, indexdiv.role.attrib, local.indexdiv.attrib
+# end of indexdiv.attlist
+
+# end of indexdiv.module
+
+# Index entries appear in the index, not the text.
+local.indexentry.attrib = empty
+indexentry.role.attrib = role.attrib
+indexentry =
+  element indexentry {
+    indexentry.attlist,
+    primaryie,
+    (seeie | seealsoie)*,
+    (secondaryie, (seeie | seealsoie | tertiaryie)*)*
+  }
+# end of indexentry.element
+indexentry.attlist &=
+  common.attrib, indexentry.role.attrib, local.indexentry.attrib
+# end of indexentry.attlist
+
+# end of indexentry.module
+local.primsecterie.attrib = empty
+primsecterie.role.attrib = role.attrib
+primaryie = element primaryie { primaryie.attlist, ndxterm.char.mix* }
+# end of primaryie.element
+
+# to IndexTerms that these entries represent
+primaryie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  primsecterie.role.attrib,
+  local.primsecterie.attrib
+# end of primaryie.attlist
+secondaryie =
+  element secondaryie { secondaryie.attlist, ndxterm.char.mix* }
+# end of secondaryie.element
+
+# to IndexTerms that these entries represent
+secondaryie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  primsecterie.role.attrib,
+  local.primsecterie.attrib
+# end of secondaryie.attlist
+tertiaryie =
+  element tertiaryie { tertiaryie.attlist, ndxterm.char.mix* }
+# end of tertiaryie.element
+
+# to IndexTerms that these entries represent
+tertiaryie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  primsecterie.role.attrib,
+  local.primsecterie.attrib
+# end of tertiaryie.attlist
+
+# end of primsecterie.module
+local.seeie.attrib = empty
+seeie.role.attrib = role.attrib
+seeie = element seeie { seeie.attlist, ndxterm.char.mix* }
+# end of seeie.element
+
+# to IndexEntry to look up
+seeie.attlist &=
+  linkend.attrib, common.attrib, seeie.role.attrib, local.seeie.attrib
+# end of seeie.attlist
+
+# end of seeie.module
+local.seealsoie.attrib = empty
+seealsoie.role.attrib = role.attrib
+seealsoie = element seealsoie { seealsoie.attlist, ndxterm.char.mix* }
+# end of seealsoie.element
+
+# to related IndexEntries
+seealsoie.attlist &=
+  linkends.attrib,
+  common.attrib,
+  seealsoie.role.attrib,
+  local.seealsoie.attrib
+# end of seealsoie.attlist
+
+# end of seealsoie.module
+
+# end of index.content.module
+
+# ......................................................................
+
+# RefEntry .............................................................
+local.refentry.attrib = empty
+refentry.role.attrib = role.attrib
+refentry =
+  element refentry {
+    refentry.attlist,
+    beginpage?,
+    ndxterm.class*,
+    refentryinfo?,
+    refmeta?,
+    (remark | link.char.class)*,
+    refnamediv,
+    refsynopsisdiv?,
+    (refsect1+ | refsection+)
+  }
+# end of refentry.element
+refentry.attlist &=
+  status.attrib,
+  common.attrib,
+  refentry.role.attrib,
+  local.refentry.attrib
+# end of refentry.attlist
+
+# end of refentry.module
+local.refmeta.attrib = empty
+refmeta.role.attrib = role.attrib
+refmeta =
+  element refmeta {
+    refmeta.attlist,
+    ndxterm.class*,
+    refentrytitle,
+    manvolnum?,
+    refmiscinfo*,
+    ndxterm.class*
+  }
+# end of refmeta.element
+refmeta.attlist &=
+  common.attrib, refmeta.role.attrib, local.refmeta.attrib
+# end of refmeta.attlist
+
+# end of refmeta.module
+local.refmiscinfo.attrib = empty
+refmiscinfo.role.attrib = role.attrib
+refmiscinfo =
+  element refmiscinfo { refmiscinfo.attlist, docinfo.char.mix* }
+# end of refmiscinfo.element
+
+# Class: Freely assignable parameter; no default
+refmiscinfo.attlist &=
+  attribute class { text }?,
+  common.attrib,
+  refmiscinfo.role.attrib,
+  local.refmiscinfo.attrib
+# end of refmiscinfo.attlist
+
+# end of refmiscinfo.module
+local.refnamediv.attrib = empty
+refnamediv.role.attrib = role.attrib
+refnamediv =
+  element refnamediv {
+    refnamediv.attlist,
+    refdescriptor?,
+    refname+,
+    refpurpose,
+    refclass*,
+    (remark | link.char.class)*
+  }
+# end of refnamediv.element
+refnamediv.attlist &=
+  common.attrib, refnamediv.role.attrib, local.refnamediv.attrib
+# end of refnamediv.attlist
+
+# end of refnamediv.module
+local.refdescriptor.attrib = empty
+refdescriptor.role.attrib = role.attrib
+refdescriptor =
+  element refdescriptor { refdescriptor.attlist, refname.char.mix* }
+# end of refdescriptor.element
+refdescriptor.attlist &=
+  common.attrib, refdescriptor.role.attrib, local.refdescriptor.attrib
+# end of refdescriptor.attlist
+
+# end of refdescriptor.module
+local.refname.attrib = empty
+refname.role.attrib = role.attrib
+refname = element refname { refname.attlist, refname.char.mix* }
+# end of refname.element
+refname.attlist &=
+  common.attrib, refname.role.attrib, local.refname.attrib
+# end of refname.attlist
+
+# end of refname.module
+local.refpurpose.attrib = empty
+refpurpose.role.attrib = role.attrib
+refpurpose =
+  element refpurpose { refpurpose.attlist, refinline.char.mix* }
+# end of refpurpose.element
+refpurpose.attlist &=
+  common.attrib, refpurpose.role.attrib, local.refpurpose.attrib
+# end of refpurpose.attlist
+
+# end of refpurpose.module
+local.refclass.attrib = empty
+refclass.role.attrib = role.attrib
+refclass = element refclass { refclass.attlist, refclass.char.mix* }
+# end of refclass.element
+refclass.attlist &=
+  common.attrib, refclass.role.attrib, local.refclass.attrib
+# end of refclass.attlist
+
+# end of refclass.module
+local.refsynopsisdiv.attrib = empty
+refsynopsisdiv.role.attrib = role.attrib
+refsynopsisdiv =
+  element refsynopsisdiv {
+    refsynopsisdiv.attlist,
+    refsynopsisdivinfo?,
+    refsect.title.content?,
+    ((refcomponent.mix+, refsect2*) | refsect2+)
+  }
+# end of refsynopsisdiv.element
+refsynopsisdiv.attlist &=
+  common.attrib, refsynopsisdiv.role.attrib, local.refsynopsisdiv.attrib
+# end of refsynopsisdiv.attlist
+
+# end of refsynopsisdiv.module
+local.refsection.attrib = empty
+refsection.role.attrib = role.attrib
+refsection =
+  element refsection {
+    refsection.attlist,
+    refsectioninfo?,
+    refsect.title.content,
+    ((refcomponent.mix+, refsection*) | refsection+)
+  }
+# end of refsection.element
+refsection.attlist &=
+  status.attrib,
+  common.attrib,
+  refsection.role.attrib,
+  local.refsection.attrib
+# end of refsection.attlist
+
+# end of refsection.module
+local.refsect1.attrib = empty
+refsect1.role.attrib = role.attrib
+refsect1 =
+  element refsect1 {
+    refsect1.attlist,
+    refsect1info?,
+    refsect.title.content,
+    ((refcomponent.mix+, refsect2*) | refsect2+)
+  }
+# end of refsect1.element
+refsect1.attlist &=
+  status.attrib,
+  common.attrib,
+  refsect1.role.attrib,
+  local.refsect1.attrib
+# end of refsect1.attlist
+
+# end of refsect1.module
+local.refsect2.attrib = empty
+refsect2.role.attrib = role.attrib
+refsect2 =
+  element refsect2 {
+    refsect2.attlist,
+    refsect2info?,
+    refsect.title.content,
+    ((refcomponent.mix+, refsect3*) | refsect3+)
+  }
+# end of refsect2.element
+refsect2.attlist &=
+  status.attrib,
+  common.attrib,
+  refsect2.role.attrib,
+  local.refsect2.attrib
+# end of refsect2.attlist
+
+# end of refsect2.module
+local.refsect3.attrib = empty
+refsect3.role.attrib = role.attrib
+refsect3 =
+  element refsect3 {
+    refsect3.attlist,
+    refsect3info?,
+    refsect.title.content,
+    refcomponent.mix+
+  }
+# end of refsect3.element
+refsect3.attlist &=
+  status.attrib,
+  common.attrib,
+  refsect3.role.attrib,
+  local.refsect3.attrib
+# end of refsect3.attlist
+
+# end of refsect3.module
+
+# end of refentry.content.module
+
+# ......................................................................
+
+# Article ..............................................................
+
+# An Article is a chapter-level, stand-alone document that is often,
+# but need not be, collected into a Book.
+local.article.attrib = empty
+article.role.attrib = role.attrib
+article =
+  element article {
+    article.attlist,
+    div.title.content?,
+    articleinfo?,
+    tocchap?,
+    lot*,
+    bookcomponent.content,
+    (nav.class | appendix.class | ackno)*
+  }
+# end of article.element
+
+# Class: Indicates the type of a particular article;
+# all articles have the same structure and general purpose.
+# No default.
+
+# ParentBook: ID of the enclosing Book
+article.attlist &=
+  attribute class {
+    "journalarticle"
+    | "productsheet"
+    | "whitepaper"
+    | "techreport"
+    | "specification"
+    | "faq"
+  }?,
+  attribute parentbook { xsd:IDREF }?,
+  status.attrib,
+  common.attrib,
+  article.role.attrib,
+  local.article.attrib
+# end of article.attlist
+
+# end of article.module
+
+# End of DocBook document hierarchy module V4.2 ........................
+
+# ......................................................................
diff --git a/etc/schema/dbnotn.rnc b/etc/schema/dbnotn.rnc
new file mode 100644 (file)
index 0000000..bb1116f
--- /dev/null
@@ -0,0 +1,84 @@
+# ......................................................................
+
+# DocBook notations module V4.2 ........................................
+
+# File dbnotnx.mod .....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# $Id: dbnotn.rnc,v 1.1 2007/11/23 06:57:44 hexmode Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the entity declarations for the standard ISO
+# entity sets used by DocBook.
+# 
+# In DTD driver files referring to this module, please use an entity
+# declaration that uses the public identifier shown below:
+# 
+# <!ENTITY % dbnotn PUBLIC
+# "-//OASIS//ENTITIES DocBook Notations V4.2//EN"
+# "dbnotnx.mod">
+# %dbnotn;
+# 
+# See the documentation for detailed information on the parameter
+# entity and module scheme used in DocBook, customizing DocBook and
+# planning for interchange, and changes made since the last release
+# of DocBook.
+
+local.notation.class = notAllowed
+notation.class =
+  "BMP"
+  | "CGM-CHAR"
+  | "CGM-BINARY"
+  | "CGM-CLEAR"
+  | "DITROFF"
+  | "DVI"
+  | "EPS"
+  | "EQN"
+  | "FAX"
+  | "GIF"
+  | "GIF87a"
+  | "GIF89a"
+  | "JPG"
+  | "JPEG"
+  | "IGES"
+  | "PCX"
+  | "PIC"
+  | "PNG"
+  | "PS"
+  | "SGML"
+  | "TBL"
+  | "TEX"
+  | "TIFF"
+  | "WMF"
+  | "WPG"
+  | "SVG"
+  | "linespecific"
+  | local.notation.class
+# WordPerfect Graphic format
+
+# End of DocBook notations module V4.2 .................................
+
+# ......................................................................
diff --git a/etc/schema/dbpool.rnc b/etc/schema/dbpool.rnc
new file mode 100644 (file)
index 0000000..ec99516
--- /dev/null
@@ -0,0 +1,5083 @@
+# This file was generated automatically by Trang.  The table model
+# dependent definitions have been moved into separate files.
+
+# ......................................................................
+
+# DocBook XML information pool module V4.2 .............................
+
+# File dbpoolx.mod .....................................................
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# $Id: dbpool.rnc,v 1.1 2007/11/23 06:57:44 hexmode Exp $
+# 
+# Permission to use, copy, modify and distribute the DocBook XML DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook XML DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# ......................................................................
+
+# This module contains the definitions for the objects, inline
+# elements, and so on that are available to be used as the main
+# content of DocBook documents.  Some elements are useful for general
+# publishing, and others are useful specifically for computer
+# documentation.
+# 
+# This module has the following dependencies on other modules:
+# 
+# o It assumes that a %notation.class; entity is defined by the
+#   driver file or other high-level module.  This entity is
+#   referenced in the NOTATION attributes for the graphic-related and
+#   ModeSpec elements.
+# 
+# o It assumes that an appropriately parameterized table module is
+#   available for use with the table-related elements.
+# 
+# In DTD driver files referring to this module, please use an entity
+# declaration that uses the public identifier shown below:
+# 
+# <!ENTITY % dbpool PUBLIC
+# "-//OASIS//ELEMENTS DocBook XML Information Pool V4.2//EN"
+# "dbpoolx.mod">
+# %dbpool;
+# 
+# See the documentation for detailed information on the parameter
+# entity and module scheme used in DocBook, customizing DocBook and
+# planning for interchange, and changes made since the last release
+# of DocBook.
+
+# ......................................................................
+
+# General-purpose semantics entities ...................................
+
+namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
+
+yesorno.attvals = string
+# ......................................................................
+
+# Entities for module inclusions .......................................
+
+# ......................................................................
+
+# Entities for element classes and mixtures ............................
+
+# "Ubiquitous" classes: ndxterm.class and beginpage
+local.ndxterm.class = notAllowed
+ndxterm.class = indexterm | local.ndxterm.class
+# Object-level classes .................................................
+local.list.class = notAllowed
+list.class =
+  calloutlist
+  | glosslist
+  | itemizedlist
+  | orderedlist
+  | segmentedlist
+  | simplelist
+  | variablelist
+  | local.list.class
+local.admon.class = notAllowed
+admon.class =
+  caution | important | note | tip | warning | local.admon.class
+local.linespecific.class = notAllowed
+linespecific.class =
+  literallayout
+  | programlisting
+  | programlistingco
+  | screen
+  | screenco
+  | screenshot
+  | local.linespecific.class
+local.method.synop.class = notAllowed
+method.synop.class =
+  constructorsynopsis
+  | destructorsynopsis
+  | methodsynopsis
+  | local.method.synop.class
+local.synop.class = notAllowed
+synop.class =
+  synopsis
+  | cmdsynopsis
+  | funcsynopsis
+  | classsynopsis
+  | fieldsynopsis
+  | method.synop.class
+  | local.synop.class
+local.para.class = notAllowed
+para.class = formalpara | para | simpara | local.para.class
+local.informal.class = notAllowed
+informal.class =
+  address
+  | blockquote
+  | graphic
+  | graphicco
+  | mediaobject
+  | mediaobjectco
+  | informalequation
+  | informalexample
+  | informalfigure
+  | informaltable
+  | local.informal.class
+local.formal.class = notAllowed
+formal.class = equation | example | figure | table | local.formal.class
+# The DocBook TC may produce an official EBNF module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+ebnf.block.hook = notAllowed
+local.compound.class = notAllowed
+compound.class =
+  msgset
+  | procedure
+  | sidebar
+  | qandaset
+  | ebnf.block.hook
+  | local.compound.class
+local.genobj.class = notAllowed
+genobj.class =
+  anchor | bridgehead | remark | highlights | local.genobj.class
+local.descobj.class = notAllowed
+descobj.class = abstract | authorblurb | epigraph | local.descobj.class
+# Character-level classes ..............................................
+local.xref.char.class = notAllowed
+xref.char.class = footnoteref | xref | local.xref.char.class
+local.gen.char.class = notAllowed
+gen.char.class =
+  abbrev
+  | acronym
+  | citation
+  | citerefentry
+  | citetitle
+  | emphasis
+  | firstterm
+  | foreignphrase
+  | glossterm
+  | footnote
+  | phrase
+  | quote
+  | trademark
+  | wordasword
+  | personname
+  | local.gen.char.class
+local.link.char.class = notAllowed
+link.char.class = link | olink | ulink | local.link.char.class
+# The DocBook TC may produce an official EBNF module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+ebnf.inline.hook = notAllowed
+local.tech.char.class = notAllowed
+tech.char.class =
+  action
+  | application
+  | classname
+  | methodname
+  | interfacename
+  | exceptionname
+  | ooclass
+  | oointerface
+  | ooexception
+  | command
+  | computeroutput
+  | database
+  | email
+  | envar
+  | errorcode
+  | errorname
+  | errortype
+  | errortext
+  | filename
+  | function
+  | guibutton
+  | guiicon
+  | guilabel
+  | guimenu
+  | guimenuitem
+  | guisubmenu
+  | hardware
+  | interface
+  | keycap
+  | keycode
+  | keycombo
+  | keysym
+  | literal
+  | constant
+  | markup
+  | medialabel
+  | menuchoice
+  | mousebutton
+  | option
+  | optional
+  | parameter
+  | prompt
+  | property
+  | replaceable
+  | returnvalue
+  | sgmltag
+  | structfield
+  | structname
+  | symbol
+  | systemitem
+  | \token
+  | type
+  | userinput
+  | varname
+  | ebnf.inline.hook
+  | local.tech.char.class
+local.base.char.class = notAllowed
+base.char.class = anchor | local.base.char.class
+local.docinfo.char.class = notAllowed
+docinfo.char.class =
+  author
+  | authorinitials
+  | corpauthor
+  | modespec
+  | othercredit
+  | productname
+  | productnumber
+  | revhistory
+  | local.docinfo.char.class
+local.other.char.class = notAllowed
+other.char.class =
+  remark | subscript | superscript | local.other.char.class
+local.inlineobj.char.class = notAllowed
+inlineobj.char.class =
+  inlinegraphic
+  | inlinemediaobject
+  | inlineequation
+  | local.inlineobj.char.class
+# ......................................................................
+
+# Entities for content models ..........................................
+formalobject.title.content = title, titleabbrev?
+# Redeclaration placeholder ............................................
+
+# For redeclaring entities that are declared after this point while
+# retaining their references to the entities that are declared before
+# this point
+
+# Object-level mixtures ................................................
+
+#                       list admn line synp para infm form cmpd gen  desc
+# Component mixture       X    X    X    X    X    X    X    X    X    X
+# Sidebar mixture         X    X    X    X    X    X    X    a    X
+# Footnote mixture        X         X    X    X    X
+# Example mixture         X         X    X    X    X
+# Highlights mixture      X    X              X
+# Paragraph mixture       X         X    X         X
+# Admonition mixture      X         X    X    X    X    X    b    c
+# Figure mixture                    X    X         X
+# Table entry mixture     X    X    X         X    d
+# Glossary def mixture    X         X    X    X    X         e
+# Legal notice mixture    X    X    X         X    f
+# 
+# a. Just Procedure; not Sidebar itself or MsgSet.
+# b. No MsgSet.
+# c. No Highlights.
+# d. Just Graphic; no other informal objects.
+# e. No Anchor, BridgeHead, or Highlights.
+# f. Just BlockQuote; no other informal objects.
+local.component.mix = notAllowed
+component.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | compound.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | local.component.mix
+local.sidebar.mix = notAllowed
+sidebar.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | genobj.class
+  | ndxterm.class
+  | beginpage
+  | local.sidebar.mix
+local.qandaset.mix = notAllowed
+qandaset.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | genobj.class
+  | ndxterm.class
+  | local.qandaset.mix
+local.revdescription.mix = notAllowed
+revdescription.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | genobj.class
+  | ndxterm.class
+  | local.revdescription.mix
+local.footnote.mix = notAllowed
+footnote.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | local.footnote.mix
+local.example.mix = notAllowed
+example.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | ndxterm.class
+  | beginpage
+  | local.example.mix
+local.highlights.mix = notAllowed
+highlights.mix =
+  list.class
+  | admon.class
+  | para.class
+  | ndxterm.class
+  | local.highlights.mix
+# %formal.class; is explicitly excluded from many contexts in which
+# paragraphs are used
+local.para.mix = notAllowed
+para.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | informal.class
+  | formal.class
+  | local.para.mix
+local.admon.mix = notAllowed
+admon.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | procedure
+  | sidebar
+  | anchor
+  | bridgehead
+  | remark
+  | ndxterm.class
+  | beginpage
+  | local.admon.mix
+local.figure.mix = notAllowed
+figure.mix =
+  linespecific.class
+  | synop.class
+  | informal.class
+  | ndxterm.class
+  | beginpage
+  | local.figure.mix
+local.tabentry.mix = notAllowed
+tabentry.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | para.class
+  | graphic
+  | mediaobject
+  | local.tabentry.mix
+local.glossdef.mix = notAllowed
+glossdef.mix =
+  list.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | formal.class
+  | remark
+  | ndxterm.class
+  | beginpage
+  | local.glossdef.mix
+local.legalnotice.mix = notAllowed
+legalnotice.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | para.class
+  | blockquote
+  | ndxterm.class
+  | beginpage
+  | local.legalnotice.mix
+local.textobject.mix = notAllowed
+textobject.mix =
+  list.class
+  | admon.class
+  | linespecific.class
+  | para.class
+  | blockquote
+  | local.textobject.mix
+local.mediaobject.mix = notAllowed
+mediaobject.mix =
+  videoobject
+  | audioobject
+  | imageobject
+  | textobject
+  | local.mediaobject.mix
+local.listpreamble.mix = notAllowed
+listpreamble.mix =
+  admon.class
+  | linespecific.class
+  | synop.class
+  | para.class
+  | informal.class
+  | genobj.class
+  | descobj.class
+  | ndxterm.class
+  | beginpage
+  | local.listpreamble.mix
+# Character-level mixtures .............................................
+
+# sgml.features
+
+# not [sgml.features[
+
+# ]] not sgml.features
+
+#                     #PCD xref word link cptr base dnfo othr inob (synop)
+# para.char.mix         X    X    X    X    X    X    X    X    X
+# title.char.mix        X    X    X    X    X    X    X    X    X
+# ndxterm.char.mix      X    X    X    X    X    X    X    X    a
+# cptr.char.mix         X              X    X    X         X    a
+# smallcptr.char.mix    X                   b                   a
+# word.char.mix         X         c    X         X         X    a
+# docinfo.char.mix      X         d    X    b              X    a
+# 
+# a. Just InlineGraphic; no InlineEquation.
+# b. Just Replaceable; no other computer terms.
+# c. Just Emphasis and Trademark; no other word elements.
+# d. Just Acronym, Emphasis, and Trademark; no other word elements.
+
+# The DocBook TC may produce an official forms module for DocBook.
+
+# This PE provides the hook by which it can be inserted into the DTD.
+forminlines.hook = notAllowed
+local.para.char.mix = notAllowed
+para.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | inlineobj.char.class
+  | synop.class
+  | ndxterm.class
+  | beginpage
+  | forminlines.hook
+  | local.para.char.mix
+local.title.char.mix = notAllowed
+title.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | inlineobj.char.class
+  | ndxterm.class
+  | local.title.char.mix
+local.ndxterm.char.mix = notAllowed
+ndxterm.char.mix =
+  text
+  | xref.char.class
+  | gen.char.class
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | docinfo.char.class
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | local.ndxterm.char.mix
+local.cptr.char.mix = notAllowed
+cptr.char.mix =
+  text
+  | link.char.class
+  | tech.char.class
+  | base.char.class
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | beginpage
+  | local.cptr.char.mix
+local.smallcptr.char.mix = notAllowed
+smallcptr.char.mix =
+  text
+  | replaceable
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | beginpage
+  | local.smallcptr.char.mix
+local.word.char.mix = notAllowed
+word.char.mix =
+  text
+  | acronym
+  | emphasis
+  | trademark
+  | link.char.class
+  | base.char.class
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | beginpage
+  | local.word.char.mix
+local.docinfo.char.mix = notAllowed
+docinfo.char.mix =
+  text
+  | link.char.class
+  | emphasis
+  | trademark
+  | replaceable
+  | other.char.class
+  | inlinegraphic
+  | inlinemediaobject
+  | ndxterm.class
+  | local.docinfo.char.mix
+# ENTITY % bibliocomponent.mix (see Bibliographic section, below)
+
+# ENTITY % person.ident.mix (see Bibliographic section, below)
+
+# ......................................................................
+
+# Entities for attributes and attribute components .....................
+
+# Effectivity attributes ...............................................
+
+# Arch: Computer or chip architecture to which element applies; no
+# default
+arch.attrib = attribute arch { text }?
+# Condition: General-purpose effectivity attribute
+condition.attrib = attribute condition { text }?
+# Conformance: Standards conformance characteristics
+conformance.attrib = attribute conformance { xsd:NMTOKENS }?
+# OS: Operating system to which element applies; no default
+os.attrib = attribute os { text }?
+# Revision: Editorial revision to which element belongs; no default
+revision.attrib = attribute revision { text }?
+# Security: Security classification; no default
+security.attrib = attribute security { text }?
+# UserLevel: Level of user experience to which element applies; no
+# default
+userlevel.attrib = attribute userlevel { text }?
+# Vendor: Computer vendor to which element applies; no default
+vendor.attrib = attribute vendor { text }?
+local.effectivity.attrib = empty
+effectivity.attrib =
+  arch.attrib,
+  condition.attrib,
+  conformance.attrib,
+  os.attrib,
+  revision.attrib,
+  security.attrib,
+  userlevel.attrib,
+  vendor.attrib,
+  local.effectivity.attrib
+# Common attributes ....................................................
+
+# Id: Unique identifier of element; no default
+id.attrib = attribute id { xsd:ID }?
+# Id: Unique identifier of element; a value must be supplied; no
+# default
+idreq.attrib = attribute id { xsd:ID }
+# Lang: Indicator of language in which element is written, for
+# translation, character set management, etc.; no default
+lang.attrib = attribute lang { text }?
+# Remap: Previous role of element before conversion; no default
+remap.attrib = attribute remap { text }?
+# Role: New role of element in local environment; no default
+role.attrib = attribute role { text }?
+# XRefLabel: Alternate labeling string for XRef text generation;
+# default is usually title or other appropriate label text already
+# contained in element
+xreflabel.attrib = attribute xreflabel { text }?
+# RevisionFlag: Revision status of element; default is that element
+# wasn't revised
+revisionflag.attrib =
+  attribute revisionflag { "changed" | "added" | "deleted" | "off" }?
+local.common.attrib = empty
+# Role is included explicitly on each element
+common.attrib =
+  id.attrib,
+  lang.attrib,
+  remap.attrib,
+  xreflabel.attrib,
+  revisionflag.attrib,
+  effectivity.attrib,
+  local.common.attrib
+# Role is included explicitly on each element
+idreq.common.attrib =
+  idreq.attrib,
+  lang.attrib,
+  remap.attrib,
+  xreflabel.attrib,
+  revisionflag.attrib,
+  effectivity.attrib,
+  local.common.attrib
+# Semi-common attributes and other attribute entities ..................
+local.graphics.attrib = empty
+# EntityRef: Name of an external entity containing the content
+# of the graphic
+
+# FileRef: Filename, qualified by a pathname if desired,
+# designating the file containing the content of the graphic
+
+# Format: Notation of the element content, if any
+
+# SrcCredit: Information about the source of the Graphic
+
+# Width: Same as CALS reprowid (desired width)
+
+# Depth: Same as CALS reprodep (desired depth)
+
+# Align: Same as CALS hplace with 'none' removed; #IMPLIED means
+# application-specific
+
+# Scale: Conflation of CALS hscale and vscale
+
+# Scalefit: Same as CALS scalefit
+graphics.attrib =
+  attribute entityref { xsd:ENTITY }?,
+  attribute fileref { text }?,
+  attribute format { notation.class }?,
+  attribute srccredit { text }?,
+  attribute width { text }?,
+  attribute contentwidth { text }?,
+  attribute depth { text }?,
+  attribute contentdepth { text }?,
+  attribute align { "left" | "right" | "center" }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  attribute scale { text }?,
+  attribute scalefit { yesorno.attvals }?,
+  local.graphics.attrib
+local.keyaction.attrib = empty
+# Action: Key combination type; default is unspecified if one
+# child element, Simul if there is more than one; if value is
+# Other, the OtherAction attribute must have a nonempty value
+
+# OtherAction: User-defined key combination type
+keyaction.attrib =
+  attribute action {
+    "click" | "double-click" | "press" | "seq" | "simul" | "other"
+  }?,
+  attribute otheraction { text }?,
+  local.keyaction.attrib
+# Label: Identifying number or string; default is usually the
+# appropriate number or string autogenerated by a formatter
+label.attrib = attribute label { text }?
+# Format: whether element is assumed to contain significant white
+# space
+linespecific.attrib =
+  [ a:defaultValue = "linespecific" ]
+  attribute format { "linespecific" }?,
+  attribute linenumbering { "numbered" | "unnumbered" }?
+# Linkend: link to related information; no default
+linkend.attrib = attribute linkend { xsd:IDREF }?
+# Linkend: required link to related information
+linkendreq.attrib = attribute linkend { xsd:IDREF }
+# Linkends: link to one or more sets of related information; no
+# default
+linkends.attrib = attribute linkends { xsd:IDREFS }?
+local.mark.attrib = empty
+mark.attrib =
+  attribute mark { text }?,
+  local.mark.attrib
+# MoreInfo: whether element's content has an associated RefEntry
+moreinfo.attrib =
+  [ a:defaultValue = "none" ]
+  attribute moreinfo { "refentry" | "none" }?
+# Pagenum: number of page on which element appears; no default
+pagenum.attrib = attribute pagenum { text }?
+local.status.attrib = empty
+# Status: Editorial or publication status of the element
+# it applies to, such as "in review" or "approved for distribution"
+status.attrib =
+  attribute status { text }?,
+  local.status.attrib
+# Width: width of the longest line in the element to which it
+# pertains, in number of characters
+width.attrib = attribute width { text }?
+# ......................................................................
+
+# Title elements .......................................................
+local.title.attrib = empty
+title.role.attrib = role.attrib
+title = element title { title.attlist, title.char.mix* }
+# end of title.element
+title.attlist &=
+  pagenum.attrib, common.attrib, title.role.attrib, local.title.attrib
+# end of title.attlist
+
+# end of title.module
+local.titleabbrev.attrib = empty
+titleabbrev.role.attrib = role.attrib
+titleabbrev =
+  element titleabbrev { titleabbrev.attlist, title.char.mix* }
+# end of titleabbrev.element
+titleabbrev.attlist &=
+  common.attrib, titleabbrev.role.attrib, local.titleabbrev.attrib
+# end of titleabbrev.attlist
+
+# end of titleabbrev.module
+local.subtitle.attrib = empty
+subtitle.role.attrib = role.attrib
+subtitle = element subtitle { subtitle.attlist, title.char.mix* }
+# end of subtitle.element
+subtitle.attlist &=
+  common.attrib, subtitle.role.attrib, local.subtitle.attrib
+# end of subtitle.attlist
+
+# end of subtitle.module
+
+# ......................................................................
+
+# Bibliographic entities and elements ..................................
+
+# The bibliographic elements are typically used in the document
+# hierarchy. They do not appear in content models of information
+# pool elements.  See also the document information elements,
+# below.
+local.person.ident.mix = notAllowed
+person.ident.mix =
+  honorific
+  | firstname
+  | surname
+  | lineage
+  | othername
+  | affiliation
+  | authorblurb
+  | contrib
+  | local.person.ident.mix
+local.bibliocomponent.mix = notAllowed
+bibliocomponent.mix =
+  abbrev
+  | abstract
+  | address
+  | artpagenums
+  | author
+  | authorgroup
+  | authorinitials
+  | bibliomisc
+  | biblioset
+  | collab
+  | confgroup
+  | contractnum
+  | contractsponsor
+  | copyright
+  | corpauthor
+  | corpname
+  | date
+  | edition
+  | editor
+  | invpartnumber
+  | isbn
+  | issn
+  | issuenum
+  | orgname
+  | biblioid
+  | citebiblioid
+  | bibliosource
+  | bibliorelation
+  | bibliocoverage
+  | othercredit
+  | pagenums
+  | printhistory
+  | productname
+  | productnumber
+  | pubdate
+  | publisher
+  | publishername
+  | pubsnumber
+  | releaseinfo
+  | revhistory
+  | seriesvolnums
+  | subtitle
+  | title
+  | titleabbrev
+  | volumenum
+  | citetitle
+  | personname
+  | person.ident.mix
+  | ndxterm.class
+  | local.bibliocomponent.mix
+# I don't think this is well placed, but it needs to be here because of
+
+# the reference to bibliocomponent.mix
+local.info.class = notAllowed
+info.class =
+  graphic
+  | mediaobject
+  | legalnotice
+  | modespec
+  | subjectset
+  | keywordset
+  | itermset
+  | bibliocomponent.mix
+  | local.info.class
+local.biblioentry.attrib = empty
+biblioentry.role.attrib = role.attrib
+biblioentry =
+  element biblioentry {
+    biblioentry.attlist, (articleinfo | bibliocomponent.mix)+
+  }
+# end of biblioentry.element
+biblioentry.attlist &=
+  common.attrib, biblioentry.role.attrib, local.biblioentry.attrib
+# end of biblioentry.attlist
+
+# end of biblioentry.module
+local.bibliomixed.attrib = empty
+bibliomixed.role.attrib = role.attrib
+bibliomixed =
+  element bibliomixed {
+    bibliomixed.attlist, (text | bibliocomponent.mix | bibliomset)*
+  }
+# end of bibliomixed.element
+bibliomixed.attlist &=
+  common.attrib, bibliomixed.role.attrib, local.bibliomixed.attrib
+# end of bibliomixed.attlist
+
+# end of bibliomixed.module
+local.articleinfo.attrib = empty
+articleinfo.role.attrib = role.attrib
+articleinfo = element articleinfo { articleinfo.attlist, info.class+ }
+# end of articleinfo.element
+articleinfo.attlist &=
+  common.attrib, articleinfo.role.attrib, local.articleinfo.attrib
+# end of articleinfo.attlist
+
+# end of articleinfo.module
+local.biblioset.attrib = empty
+biblioset.role.attrib = role.attrib
+biblioset =
+  element biblioset { biblioset.attlist, bibliocomponent.mix+ }
+# end of biblioset.element
+
+# Relation: Relationship of elements contained within BiblioSet
+biblioset.attlist &=
+  attribute relation { text }?,
+  common.attrib,
+  biblioset.role.attrib,
+  local.biblioset.attrib
+# end of biblioset.attlist
+
+# end of biblioset.module
+bibliomset.role.attrib = role.attrib
+local.bibliomset.attrib = empty
+bibliomset =
+  element bibliomset {
+    bibliomset.attlist, (text | bibliocomponent.mix | bibliomset)*
+  }
+# end of bibliomset.element
+
+# Relation: Relationship of elements contained within BiblioMSet
+bibliomset.attlist &=
+  attribute relation { text }?,
+  common.attrib,
+  bibliomset.role.attrib,
+  local.bibliomset.attrib
+# end of bibliomset.attlist
+
+# end of bibliomset.module
+local.bibliomisc.attrib = empty
+bibliomisc.role.attrib = role.attrib
+bibliomisc = element bibliomisc { bibliomisc.attlist, para.char.mix* }
+# end of bibliomisc.element
+bibliomisc.attlist &=
+  common.attrib, bibliomisc.role.attrib, local.bibliomisc.attrib
+# end of bibliomisc.attlist
+
+# end of bibliomisc.module
+
+# ......................................................................
+
+# Subject, Keyword, and ITermSet elements ..............................
+local.subjectset.attrib = empty
+subjectset.role.attrib = role.attrib
+subjectset = element subjectset { subjectset.attlist, subject+ }
+# end of subjectset.element
+
+# Scheme: Controlled vocabulary employed in SubjectTerms
+subjectset.attlist &=
+  attribute scheme { xsd:NMTOKEN }?,
+  common.attrib,
+  subjectset.role.attrib,
+  local.subjectset.attrib
+# end of subjectset.attlist
+
+# end of subjectset.module
+local.subject.attrib = empty
+subject.role.attrib = role.attrib
+subject = element subject { subject.attlist, subjectterm+ }
+# end of subject.element
+
+# Weight: Ranking of this group of SubjectTerms relative
+# to others, 0 is low, no highest value specified
+subject.attlist &=
+  attribute weight { text }?,
+  common.attrib,
+  subject.role.attrib,
+  local.subject.attrib
+# end of subject.attlist
+
+# end of subject.module
+local.subjectterm.attrib = empty
+subjectterm.role.attrib = role.attrib
+subjectterm = element subjectterm { subjectterm.attlist, text }
+# end of subjectterm.element
+subjectterm.attlist &=
+  common.attrib, subjectterm.role.attrib, local.subjectterm.attrib
+# end of subjectterm.attlist
+
+# end of subjectterm.module
+
+# end of subjectset.content.module
+local.keywordset.attrib = empty
+keywordset.role.attrib = role.attrib
+keywordset = element keywordset { keywordset.attlist, keyword+ }
+# end of keywordset.element
+keywordset.attlist &=
+  common.attrib, keywordset.role.attrib, local.keywordset.attrib
+# end of keywordset.attlist
+
+# end of keywordset.module
+local.keyword.attrib = empty
+keyword.role.attrib = role.attrib
+keyword = element keyword { keyword.attlist, text }
+# end of keyword.element
+keyword.attlist &=
+  common.attrib, keyword.role.attrib, local.keyword.attrib
+# end of keyword.attlist
+
+# end of keyword.module
+
+# end of keywordset.content.module
+local.itermset.attrib = empty
+itermset.role.attrib = role.attrib
+itermset = element itermset { itermset.attlist, indexterm+ }
+# end of itermset.element
+itermset.attlist &=
+  common.attrib, itermset.role.attrib, local.itermset.attrib
+# end of itermset.attlist
+
+# end of itermset.module
+
+# Bibliographic info for "blocks"
+local.blockinfo.attrib = empty
+blockinfo.role.attrib = role.attrib
+blockinfo = element blockinfo { blockinfo.attlist, info.class+ }
+# end of blockinfo.element
+blockinfo.attlist &=
+  common.attrib, blockinfo.role.attrib, local.blockinfo.attrib
+# end of blockinfo.attlist
+
+# end of blockinfo.module
+
+# ......................................................................
+
+# Compound (section-ish) elements ......................................
+
+# Message set ......................
+local.msgset.attrib = empty
+msgset.role.attrib = role.attrib
+msgset =
+  element msgset {
+    msgset.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    (msgentry+ | simplemsgentry+)
+  }
+# end of msgset.element
+msgset.attlist &= common.attrib, msgset.role.attrib, local.msgset.attrib
+# end of msgset.attlist
+
+# end of msgset.module
+local.msgentry.attrib = empty
+msgentry.role.attrib = role.attrib
+msgentry =
+  element msgentry { msgentry.attlist, msg+, msginfo?, msgexplan* }
+# end of msgentry.element
+msgentry.attlist &=
+  common.attrib, msgentry.role.attrib, local.msgentry.attrib
+# end of msgentry.attlist
+
+# end of msgentry.module
+local.simplemsgentry.attrib = empty
+simplemsgentry.role.attrib = role.attrib
+simplemsgentry =
+  element simplemsgentry { simplemsgentry.attlist, msgtext, msgexplan+ }
+# end of simplemsgentry.element
+simplemsgentry.attlist &=
+  attribute audience { text }?,
+  attribute level { text }?,
+  attribute origin { text }?,
+  common.attrib,
+  simplemsgentry.role.attrib,
+  local.simplemsgentry.attrib
+# end of simplemsgentry.attlist
+
+# end of simplemsgentry.module
+local.msg.attrib = empty
+msg.role.attrib = role.attrib
+msg = element msg { msg.attlist, title?, msgmain, (msgsub | msgrel)* }
+# end of msg.element
+msg.attlist &= common.attrib, msg.role.attrib, local.msg.attrib
+# end of msg.attlist
+
+# end of msg.module
+local.msgmain.attrib = empty
+msgmain.role.attrib = role.attrib
+msgmain = element msgmain { msgmain.attlist, title?, msgtext }
+# end of msgmain.element
+msgmain.attlist &=
+  common.attrib, msgmain.role.attrib, local.msgmain.attrib
+# end of msgmain.attlist
+
+# end of msgmain.module
+local.msgsub.attrib = empty
+msgsub.role.attrib = role.attrib
+msgsub = element msgsub { msgsub.attlist, title?, msgtext }
+# end of msgsub.element
+msgsub.attlist &= common.attrib, msgsub.role.attrib, local.msgsub.attrib
+# end of msgsub.attlist
+
+# end of msgsub.module
+local.msgrel.attrib = empty
+msgrel.role.attrib = role.attrib
+msgrel = element msgrel { msgrel.attlist, title?, msgtext }
+# end of msgrel.element
+msgrel.attlist &= common.attrib, msgrel.role.attrib, local.msgrel.attrib
+# end of msgrel.attlist
+
+# end of msgrel.module
+
+#  MsgText (defined in the Inlines section, below)
+local.msginfo.attrib = empty
+msginfo.role.attrib = role.attrib
+msginfo =
+  element msginfo { msginfo.attlist, (msglevel | msgorig | msgaud)* }
+# end of msginfo.element
+msginfo.attlist &=
+  common.attrib, msginfo.role.attrib, local.msginfo.attrib
+# end of msginfo.attlist
+
+# end of msginfo.module
+local.msglevel.attrib = empty
+msglevel.role.attrib = role.attrib
+msglevel = element msglevel { msglevel.attlist, smallcptr.char.mix* }
+# end of msglevel.element
+msglevel.attlist &=
+  common.attrib, msglevel.role.attrib, local.msglevel.attrib
+# end of msglevel.attlist
+
+# end of msglevel.module
+local.msgorig.attrib = empty
+msgorig.role.attrib = role.attrib
+msgorig = element msgorig { msgorig.attlist, smallcptr.char.mix* }
+# end of msgorig.element
+msgorig.attlist &=
+  common.attrib, msgorig.role.attrib, local.msgorig.attrib
+# end of msgorig.attlist
+
+# end of msgorig.module
+local.msgaud.attrib = empty
+msgaud.role.attrib = role.attrib
+msgaud = element msgaud { msgaud.attlist, para.char.mix* }
+# end of msgaud.element
+msgaud.attlist &= common.attrib, msgaud.role.attrib, local.msgaud.attrib
+# end of msgaud.attlist
+
+# end of msgaud.module
+local.msgexplan.attrib = empty
+msgexplan.role.attrib = role.attrib
+msgexplan =
+  element msgexplan { msgexplan.attlist, title?, component.mix+ }
+# end of msgexplan.element
+msgexplan.attlist &=
+  common.attrib, msgexplan.role.attrib, local.msgexplan.attrib
+# end of msgexplan.attlist
+
+# end of msgexplan.module
+
+# end of msgset.content.module
+
+# QandASet ........................
+local.qandaset.attrib = empty
+qandaset.role.attrib = role.attrib
+qandaset =
+  element qandaset {
+    qandaset.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    qandaset.mix*,
+    (qandadiv+ | qandaentry+)
+  }
+# end of qandaset.element
+qandaset.attlist &=
+  attribute defaultlabel { "qanda" | "number" | "none" }?,
+  common.attrib,
+  qandaset.role.attrib,
+  local.qandaset.attrib
+# end of qandaset.attlist
+
+# end of qandaset.module
+local.qandadiv.attrib = empty
+qandadiv.role.attrib = role.attrib
+qandadiv =
+  element qandadiv {
+    qandadiv.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    qandaset.mix*,
+    (qandadiv+ | qandaentry+)
+  }
+# end of qandadiv.element
+qandadiv.attlist &=
+  common.attrib, qandadiv.role.attrib, local.qandadiv.attrib
+# end of qandadiv.attlist
+
+# end of qandadiv.module
+local.qandaentry.attrib = empty
+qandaentry.role.attrib = role.attrib
+qandaentry =
+  element qandaentry {
+    qandaentry.attlist, blockinfo?, revhistory?, question, answer*
+  }
+# end of qandaentry.element
+qandaentry.attlist &=
+  common.attrib, qandaentry.role.attrib, local.qandaentry.attrib
+# end of qandaentry.attlist
+
+# end of qandaentry.module
+local.question.attrib = empty
+question.role.attrib = role.attrib
+question = element question { question.attlist, label?, qandaset.mix+ }
+# end of question.element
+question.attlist &=
+  common.attrib, question.role.attrib, local.question.attrib
+# end of question.attlist
+
+# end of question.module
+local.answer.attrib = empty
+answer.role.attrib = role.attrib
+answer =
+  element answer { answer.attlist, label?, qandaset.mix*, qandaentry* }
+# end of answer.element
+answer.attlist &= common.attrib, answer.role.attrib, local.answer.attrib
+# end of answer.attlist
+
+# end of answer.module
+local.label.attrib = empty
+label.role.attrib = role.attrib
+label = element label { label.attlist, word.char.mix* }
+# end of label.element
+label.attlist &= common.attrib, label.role.attrib, local.label.attrib
+# end of label.attlist
+
+# end of label.module
+
+# end of qandaset.content.module
+
+# Procedure ........................
+local.procedure.attrib = empty
+procedure.role.attrib = role.attrib
+procedure =
+  element procedure {
+    procedure.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    component.mix*,
+    step+
+  }
+# end of procedure.element
+procedure.attlist &=
+  common.attrib, procedure.role.attrib, local.procedure.attrib
+# end of procedure.attlist
+
+# end of procedure.module
+local.step.attrib = empty
+step.role.attrib = role.attrib
+step =
+  element step {
+    step.attlist,
+    title?,
+    ((component.mix+, (substeps, component.mix*)?)
+     | (substeps, component.mix*))
+  }
+# end of step.element
+
+# Performance: Whether the Step must be performed
+
+# not #REQUIRED!
+step.attlist &=
+  [ a:defaultValue = "required" ]
+  attribute performance { "optional" | "required" }?,
+  common.attrib,
+  step.role.attrib,
+  local.step.attrib
+# end of step.attlist
+
+# end of step.module
+local.substeps.attrib = empty
+substeps.role.attrib = role.attrib
+substeps = element substeps { substeps.attlist, step+ }
+# end of substeps.element
+
+# Performance: whether entire set of substeps must be performed
+
+# not #REQUIRED!
+substeps.attlist &=
+  [ a:defaultValue = "required" ]
+  attribute performance { "optional" | "required" }?,
+  common.attrib,
+  substeps.role.attrib,
+  local.substeps.attrib
+# end of substeps.attlist
+
+# end of substeps.module
+
+# end of procedure.content.module
+
+# Sidebar ..........................
+local.sidebarinfo.attrib = empty
+sidebarinfo.role.attrib = role.attrib
+sidebarinfo = element sidebarinfo { sidebarinfo.attlist, info.class+ }
+# end of sidebarinfo.element
+sidebarinfo.attlist &=
+  common.attrib, sidebarinfo.role.attrib, local.sidebarinfo.attrib
+# end of sidebarinfo.attlist
+
+# end of sidebarinfo.module
+local.sidebar.attrib = empty
+sidebar.role.attrib = role.attrib
+sidebar =
+  element sidebar {
+    sidebar.attlist,
+    sidebarinfo?,
+    formalobject.title.content?,
+    sidebar.mix+
+  }
+# end of sidebar.element
+sidebar.attlist &=
+  common.attrib, sidebar.role.attrib, local.sidebar.attrib
+# end of sidebar.attlist
+
+# end of sidebar.module
+
+# end of sidebar.content.model
+
+# ......................................................................
+
+# Paragraph-related elements ...........................................
+local.abstract.attrib = empty
+abstract.role.attrib = role.attrib
+abstract = element abstract { abstract.attlist, title?, para.class+ }
+# end of abstract.element
+abstract.attlist &=
+  common.attrib, abstract.role.attrib, local.abstract.attrib
+# end of abstract.attlist
+
+# end of abstract.module
+local.authorblurb.attrib = empty
+authorblurb.role.attrib = role.attrib
+authorblurb =
+  element authorblurb { authorblurb.attlist, title?, para.class+ }
+# end of authorblurb.element
+authorblurb.attlist &=
+  common.attrib, authorblurb.role.attrib, local.authorblurb.attrib
+# end of authorblurb.attlist
+
+# end of authorblurb.module
+local.personblurb.attrib = empty
+personblurb.role.attrib = role.attrib
+personblurb =
+  element personblurb { personblurb.attlist, title?, para.class+ }
+# end of personblurb.element
+personblurb.attlist &=
+  common.attrib, personblurb.role.attrib, local.personblurb.attrib
+# end of personblurb.attlist
+
+# end of personblurb.module
+local.blockquote.attrib = empty
+blockquote.role.attrib = role.attrib
+blockquote =
+  element blockquote {
+    blockquote.attlist, title?, attribution?, component.mix+
+  }
+# end of blockquote.element
+blockquote.attlist &=
+  common.attrib, blockquote.role.attrib, local.blockquote.attrib
+# end of blockquote.attlist
+
+# end of blockquote.module
+local.attribution.attrib = empty
+attribution.role.attrib = role.attrib
+attribution =
+  element attribution { attribution.attlist, para.char.mix* }
+# end of attribution.element
+attribution.attlist &=
+  common.attrib, attribution.role.attrib, local.attribution.attrib
+# end of attribution.attlist
+
+# end of attribution.module
+local.bridgehead.attrib = empty
+bridgehead.role.attrib = role.attrib
+bridgehead = element bridgehead { bridgehead.attlist, title.char.mix* }
+# end of bridgehead.element
+
+# Renderas: Indicates the format in which the BridgeHead
+# should appear
+bridgehead.attlist &=
+  attribute renderas {
+    "other" | "sect1" | "sect2" | "sect3" | "sect4" | "sect5"
+  }?,
+  common.attrib,
+  bridgehead.role.attrib,
+  local.bridgehead.attrib
+# end of bridgehead.attlist
+
+# end of bridgehead.module
+local.remark.attrib = empty
+remark.role.attrib = role.attrib
+remark = element remark { remark.attlist, para.char.mix* }
+# end of remark.element
+remark.attlist &= common.attrib, remark.role.attrib, local.remark.attrib
+# end of remark.attlist
+
+# end of remark.module
+local.epigraph.attrib = empty
+epigraph.role.attrib = role.attrib
+epigraph =
+  element epigraph {
+    epigraph.attlist, attribution?, (para.class | literallayout)+
+  }
+# end of epigraph.element
+epigraph.attlist &=
+  common.attrib, epigraph.role.attrib, local.epigraph.attrib
+# end of epigraph.attlist
+
+#  Attribution (defined above)
+
+# end of epigraph.module
+local.footnote.attrib = empty
+footnote.role.attrib = role.attrib
+footnote = element footnote { footnote.attlist, footnote.mix+ }
+# end of footnote.element
+footnote.attlist &=
+  label.attrib,
+  common.attrib,
+  footnote.role.attrib,
+  local.footnote.attrib
+# end of footnote.attlist
+
+# end of footnote.module
+local.highlights.attrib = empty
+highlights.role.attrib = role.attrib
+highlights = element highlights { highlights.attlist, highlights.mix+ }
+# end of highlights.element
+highlights.attlist &=
+  common.attrib, highlights.role.attrib, local.highlights.attrib
+# end of highlights.attlist
+
+# end of highlights.module
+local.formalpara.attrib = empty
+formalpara.role.attrib = role.attrib
+formalpara =
+  element formalpara { formalpara.attlist, title, ndxterm.class*, para }
+# end of formalpara.element
+formalpara.attlist &=
+  common.attrib, formalpara.role.attrib, local.formalpara.attrib
+# end of formalpara.attlist
+
+# end of formalpara.module
+local.para.attrib = empty
+para.role.attrib = role.attrib
+para = element para { para.attlist, (para.char.mix | para.mix)* }
+# end of para.element
+para.attlist &= common.attrib, para.role.attrib, local.para.attrib
+# end of para.attlist
+
+# end of para.module
+local.simpara.attrib = empty
+simpara.role.attrib = role.attrib
+simpara = element simpara { simpara.attlist, para.char.mix* }
+# end of simpara.element
+simpara.attlist &=
+  common.attrib, simpara.role.attrib, local.simpara.attrib
+# end of simpara.attlist
+
+# end of simpara.module
+local.admon.attrib = empty
+admon.role.attrib = role.attrib
+caution = element caution { caution.attlist, title?, admon.mix+ }
+# end of caution.element
+caution.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of caution.attlist
+important = element important { important.attlist, title?, admon.mix+ }
+# end of important.element
+important.attlist &=
+  common.attrib, admon.role.attrib, local.admon.attrib
+# end of important.attlist
+note = element note { note.attlist, title?, admon.mix+ }
+# end of note.element
+note.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of note.attlist
+tip = element tip { tip.attlist, title?, admon.mix+ }
+# end of tip.element
+tip.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of tip.attlist
+warning = element warning { warning.attlist, title?, admon.mix+ }
+# end of warning.element
+warning.attlist &= common.attrib, admon.role.attrib, local.admon.attrib
+# end of warning.attlist
+
+# end of admon.module
+
+# ......................................................................
+
+# Lists ................................................................
+
+# GlossList ........................
+local.glosslist.attrib = empty
+glosslist.role.attrib = role.attrib
+glosslist = element glosslist { glosslist.attlist, glossentry+ }
+# end of glosslist.element
+glosslist.attlist &=
+  common.attrib, glosslist.role.attrib, local.glosslist.attrib
+# end of glosslist.attlist
+
+# end of glosslist.module
+local.glossentry.attrib = empty
+glossentry.role.attrib = role.attrib
+glossentry =
+  element glossentry {
+    glossentry.attlist,
+    glossterm,
+    acronym?,
+    abbrev?,
+    ndxterm.class*,
+    revhistory?,
+    (glosssee | glossdef+)
+  }
+# end of glossentry.element
+
+# SortAs: String by which the GlossEntry is to be sorted
+# (alphabetized) in lieu of its proper content
+glossentry.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  glossentry.role.attrib,
+  local.glossentry.attrib
+# end of glossentry.attlist
+
+# end of glossentry.module
+
+#  GlossTerm (defined in the Inlines section, below)
+local.glossdef.attrib = empty
+glossdef.role.attrib = role.attrib
+glossdef =
+  element glossdef { glossdef.attlist, glossdef.mix+, glossseealso* }
+# end of glossdef.element
+
+# Subject: List of subjects; keywords for the definition
+glossdef.attlist &=
+  attribute subject { text }?,
+  common.attrib,
+  glossdef.role.attrib,
+  local.glossdef.attrib
+# end of glossdef.attlist
+
+# end of glossdef.module
+local.glosssee.attrib = empty
+glosssee.role.attrib = role.attrib
+glosssee = element glosssee { glosssee.attlist, para.char.mix* }
+# end of glosssee.element
+
+# OtherTerm: Reference to the GlossEntry whose GlossTerm
+# should be displayed at the point of the GlossSee
+glosssee.attlist &=
+  attribute otherterm { xsd:IDREF }?,
+  common.attrib,
+  glosssee.role.attrib,
+  local.glosssee.attrib
+# end of glosssee.attlist
+
+# end of glosssee.module
+local.glossseealso.attrib = empty
+glossseealso.role.attrib = role.attrib
+glossseealso =
+  element glossseealso { glossseealso.attlist, para.char.mix* }
+# end of glossseealso.element
+
+# OtherTerm: Reference to the GlossEntry whose GlossTerm
+# should be displayed at the point of the GlossSeeAlso
+glossseealso.attlist &=
+  attribute otherterm { xsd:IDREF }?,
+  common.attrib,
+  glossseealso.role.attrib,
+  local.glossseealso.attrib
+# end of glossseealso.attlist
+
+# end of glossseealso.module
+
+# end of glossentry.content.module
+
+# ItemizedList and OrderedList .....
+local.itemizedlist.attrib = empty
+itemizedlist.role.attrib = role.attrib
+itemizedlist =
+  element itemizedlist {
+    itemizedlist.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    listpreamble.mix*,
+    listitem+
+  }
+# end of itemizedlist.element
+
+# Spacing: Whether the vertical space in the list should be
+# compressed
+
+# Mark: Keyword, e.g., bullet, dash, checkbox, none;
+# list of keywords and defaults are implementation specific
+itemizedlist.attlist &=
+  attribute spacing { "normal" | "compact" }?,
+  mark.attrib,
+  common.attrib,
+  itemizedlist.role.attrib,
+  local.itemizedlist.attrib
+# end of itemizedlist.attlist
+
+# end of itemizedlist.module
+local.orderedlist.attrib = empty
+orderedlist.role.attrib = role.attrib
+orderedlist =
+  element orderedlist {
+    orderedlist.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    listpreamble.mix*,
+    listitem+
+  }
+# end of orderedlist.element
+
+# Numeration: Style of ListItem numbered; default is expected
+# to be Arabic
+
+# InheritNum: Specifies for a nested list that the numbering
+# of ListItems should include the number of the item
+# within which they are nested (e.g., 1a and 1b within 1,
+# rather than a and b)
+
+# Continuation: Where list numbering begins afresh (Restarts,
+# the default) or continues that of the immediately preceding
+# list (Continues)
+
+# Spacing: Whether the vertical space in the list should be
+# compressed
+orderedlist.attlist &=
+  attribute numeration {
+    "arabic" | "upperalpha" | "loweralpha" | "upperroman" | "lowerroman"
+  }?,
+  [ a:defaultValue = "ignore" ]
+  attribute inheritnum { "inherit" | "ignore" }?,
+  [ a:defaultValue = "restarts" ]
+  attribute continuation { "continues" | "restarts" }?,
+  attribute spacing { "normal" | "compact" }?,
+  common.attrib,
+  orderedlist.role.attrib,
+  local.orderedlist.attrib
+# end of orderedlist.attlist
+
+# end of orderedlist.module
+local.listitem.attrib = empty
+listitem.role.attrib = role.attrib
+listitem = element listitem { listitem.attlist, component.mix+ }
+# end of listitem.element
+
+# Override: Indicates the mark to be used for this ListItem
+# instead of the default mark or the mark specified by
+# the Mark attribute on the enclosing ItemizedList
+listitem.attlist &=
+  attribute override { text }?,
+  common.attrib,
+  listitem.role.attrib,
+  local.listitem.attrib
+# end of listitem.attlist
+
+# end of listitem.module
+
+# SegmentedList ....................
+local.segmentedlist.attrib = empty
+segmentedlist.role.attrib = role.attrib
+segmentedlist =
+  element segmentedlist {
+    segmentedlist.attlist,
+    formalobject.title.content?,
+    segtitle+,
+    seglistitem+
+  }
+# end of segmentedlist.element
+segmentedlist.attlist &=
+  common.attrib, segmentedlist.role.attrib, local.segmentedlist.attrib
+# end of segmentedlist.attlist
+
+# end of segmentedlist.module
+local.segtitle.attrib = empty
+segtitle.role.attrib = role.attrib
+segtitle = element segtitle { segtitle.attlist, title.char.mix* }
+# end of segtitle.element
+segtitle.attlist &=
+  common.attrib, segtitle.role.attrib, local.segtitle.attrib
+# end of segtitle.attlist
+
+# end of segtitle.module
+local.seglistitem.attrib = empty
+seglistitem.role.attrib = role.attrib
+seglistitem = element seglistitem { seglistitem.attlist, seg+ }
+# end of seglistitem.element
+seglistitem.attlist &=
+  common.attrib, seglistitem.role.attrib, local.seglistitem.attrib
+# end of seglistitem.attlist
+
+# end of seglistitem.module
+local.seg.attrib = empty
+seg.role.attrib = role.attrib
+seg = element seg { seg.attlist, para.char.mix* }
+# end of seg.element
+seg.attlist &= common.attrib, seg.role.attrib, local.seg.attrib
+# end of seg.attlist
+
+# end of seg.module
+
+# end of segmentedlist.content.module
+
+# SimpleList .......................
+local.simplelist.attrib = empty
+simplelist.role.attrib = role.attrib
+simplelist = element simplelist { simplelist.attlist, member+ }
+# end of simplelist.element
+
+# Columns: The number of columns the array should contain
+
+# Type: How the Members of the SimpleList should be
+# formatted: Inline (members separated with commas etc.
+# inline), Vert (top to bottom in n Columns), or Horiz (in
+# the direction of text flow) in n Columns.  If Column
+# is 1 or implied, Type=Vert and Type=Horiz give the same
+# results.
+simplelist.attlist &=
+  attribute columns { text }?,
+  [ a:defaultValue = "vert" ]
+  attribute type { "inline" | "vert" | "horiz" }?,
+  common.attrib,
+  simplelist.role.attrib,
+  local.simplelist.attrib
+# end of simplelist.attlist
+
+# end of simplelist.module
+local.member.attrib = empty
+member.role.attrib = role.attrib
+member = element member { member.attlist, para.char.mix* }
+# end of member.element
+member.attlist &= common.attrib, member.role.attrib, local.member.attrib
+# end of member.attlist
+
+# end of member.module
+
+# end of simplelist.content.module
+
+# VariableList .....................
+local.variablelist.attrib = empty
+variablelist.role.attrib = role.attrib
+variablelist =
+  element variablelist {
+    variablelist.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    listpreamble.mix*,
+    varlistentry+
+  }
+# end of variablelist.element
+
+# TermLength: Length beyond which the presentation engine
+# may consider the Term too long and select an alternate
+# presentation of the Term and, or, its associated ListItem.
+variablelist.attlist &=
+  attribute termlength { text }?,
+  common.attrib,
+  variablelist.role.attrib,
+  local.variablelist.attrib
+# end of variablelist.attlist
+
+# end of variablelist.module
+local.varlistentry.attrib = empty
+varlistentry.role.attrib = role.attrib
+varlistentry =
+  element varlistentry { varlistentry.attlist, term+, listitem }
+# end of varlistentry.element
+varlistentry.attlist &=
+  common.attrib, varlistentry.role.attrib, local.varlistentry.attrib
+# end of varlistentry.attlist
+
+# end of varlistentry.module
+local.term.attrib = empty
+term.role.attrib = role.attrib
+term = element term { term.attlist, para.char.mix* }
+# end of term.element
+term.attlist &= common.attrib, term.role.attrib, local.term.attrib
+# end of term.attlist
+
+# end of term.module
+
+#  ListItem (defined above)
+
+# end of variablelist.content.module
+
+# CalloutList ......................
+local.calloutlist.attrib = empty
+calloutlist.role.attrib = role.attrib
+calloutlist =
+  element calloutlist {
+    calloutlist.attlist, formalobject.title.content?, callout+
+  }
+# end of calloutlist.element
+calloutlist.attlist &=
+  common.attrib, calloutlist.role.attrib, local.calloutlist.attrib
+# end of calloutlist.attlist
+
+# end of calloutlist.module
+local.callout.attrib = empty
+callout.role.attrib = role.attrib
+callout = element callout { callout.attlist, component.mix+ }
+# end of callout.element
+
+# AreaRefs: IDs of one or more Areas or AreaSets described
+# by this Callout
+callout.attlist &=
+  attribute arearefs { xsd:IDREFS },
+  common.attrib,
+  callout.role.attrib,
+  local.callout.attrib
+# end of callout.attlist
+
+# end of callout.module
+
+# end of calloutlist.content.module
+
+# ......................................................................
+
+# Objects ..............................................................
+
+# Examples etc. ....................
+local.example.attrib = empty
+example.role.attrib = role.attrib
+example =
+  element example {
+    example.attlist,
+    blockinfo?,
+    formalobject.title.content,
+    example.mix+
+  }
+# end of example.element
+example.attlist &=
+  label.attrib,
+  width.attrib,
+  common.attrib,
+  example.role.attrib,
+  local.example.attrib
+# end of example.attlist
+
+# end of example.module
+local.informalexample.attrib = empty
+informalexample.role.attrib = role.attrib
+informalexample =
+  element informalexample {
+    informalexample.attlist, blockinfo?, example.mix+
+  }
+# end of informalexample.element
+informalexample.attlist &=
+  width.attrib,
+  common.attrib,
+  informalexample.role.attrib,
+  local.informalexample.attrib
+# end of informalexample.attlist
+
+# end of informalexample.module
+local.programlistingco.attrib = empty
+programlistingco.role.attrib = role.attrib
+programlistingco =
+  element programlistingco {
+    programlistingco.attlist, areaspec, programlisting, calloutlist*
+  }
+# end of programlistingco.element
+programlistingco.attlist &=
+  common.attrib,
+  programlistingco.role.attrib,
+  local.programlistingco.attrib
+# end of programlistingco.attlist
+
+#  CalloutList (defined above in Lists)
+
+# end of informalexample.module
+local.areaspec.attrib = empty
+areaspec.role.attrib = role.attrib
+areaspec = element areaspec { areaspec.attlist, (area | areaset)+ }
+# end of areaspec.element
+
+# Units: global unit of measure in which coordinates in
+# this spec are expressed:
+# 
+# - CALSPair "x1,y1 x2,y2": lower-left and upper-right
+# coordinates in a rectangle describing repro area in which
+# graphic is placed, where X and Y dimensions are each some
+# number 0..10000 (taken from CALS graphic attributes)
+# 
+# - LineColumn "line column": line number and column number
+# at which to start callout text in "linespecific" content
+# 
+# - LineRange "startline endline": whole lines from startline
+# to endline in "linespecific" content
+# 
+# - LineColumnPair "line1 col1 line2 col2": starting and ending
+# points of area in "linespecific" content that starts at
+# first position and ends at second position (including the
+# beginnings of any intervening lines)
+# 
+# - Other: directive to look at value of OtherUnits attribute
+# to get implementation-specific keyword
+# 
+# The default is implementation-specific; usually dependent on
+# the parent element (GraphicCO gets CALSPair, ProgramListingCO
+# and ScreenCO get LineColumn)
+
+# OtherUnits: User-defined units
+areaspec.attlist &=
+  attribute units {
+    "calspair" | "linecolumn" | "linerange" | "linecolumnpair" | "other"
+  }?,
+  attribute otherunits { xsd:NMTOKEN }?,
+  common.attrib,
+  areaspec.role.attrib,
+  local.areaspec.attrib
+# end of areaspec.attlist
+
+# end of areaspec.module
+local.area.attrib = empty
+area.role.attrib = role.attrib
+area = element area { area.attlist, empty }
+# end of area.element
+
+# bug number/symbol override or initialization
+
+# to any related information
+
+# Units: unit of measure in which coordinates in this
+# area are expressed; inherits from AreaSet and AreaSpec
+
+# OtherUnits: User-defined units
+area.attlist &=
+  label.attrib,
+  linkends.attrib,
+  attribute units {
+    "calspair" | "linecolumn" | "linerange" | "linecolumnpair" | "other"
+  }?,
+  attribute otherunits { xsd:NMTOKEN }?,
+  attribute coords { text },
+  idreq.common.attrib,
+  area.role.attrib,
+  local.area.attrib
+# end of area.attlist
+
+# end of area.module
+local.areaset.attrib = empty
+areaset.role.attrib = role.attrib
+areaset = element areaset { areaset.attlist, area+ }
+# end of areaset.element
+
+# bug number/symbol override or initialization
+
+# Units: unit of measure in which coordinates in this
+# area are expressed; inherits from AreaSpec
+areaset.attlist &=
+  label.attrib,
+  attribute units {
+    "calspair" | "linecolumn" | "linerange" | "linecolumnpair" | "other"
+  }?,
+  attribute otherunits { xsd:NMTOKEN }?,
+  attribute coords { text },
+  idreq.common.attrib,
+  areaset.role.attrib,
+  local.areaset.attrib
+# end of areaset.attlist
+
+# end of areaset.module
+
+# end of areaspec.content.module
+local.programlisting.attrib = empty
+programlisting.role.attrib = role.attrib
+programlisting =
+  element programlisting {
+    programlisting.attlist,
+    (para.char.mix | co | coref | lineannotation | textobject)*
+  }
+# end of programlisting.element
+programlisting.attlist &=
+  width.attrib,
+  linespecific.attrib,
+  common.attrib,
+  programlisting.role.attrib,
+  local.programlisting.attrib
+# end of programlisting.attlist
+
+# end of programlisting.module
+local.literallayout.attrib = empty
+literallayout.role.attrib = role.attrib
+literallayout =
+  element literallayout {
+    literallayout.attlist,
+    (para.char.mix | co | coref | textobject | lineannotation)*
+  }
+# end of literallayout.element
+literallayout.attlist &=
+  width.attrib,
+  linespecific.attrib,
+  [ a:defaultValue = "normal" ]
+  attribute class { "monospaced" | "normal" }?,
+  common.attrib,
+  literallayout.role.attrib,
+  local.literallayout.attrib
+# end of literallayout.attlist
+
+#  LineAnnotation (defined in the Inlines section, below)
+
+# end of literallayout.module
+local.screenco.attrib = empty
+screenco.role.attrib = role.attrib
+screenco =
+  element screenco { screenco.attlist, areaspec, screen, calloutlist* }
+# end of screenco.element
+screenco.attlist &=
+  common.attrib, screenco.role.attrib, local.screenco.attrib
+# end of screenco.attlist
+
+#  AreaSpec (defined above)
+
+#  CalloutList (defined above in Lists)
+
+# end of screenco.module
+local.screen.attrib = empty
+screen.role.attrib = role.attrib
+screen =
+  element screen {
+    screen.attlist,
+    (para.char.mix | co | coref | textobject | lineannotation)*
+  }
+# end of screen.element
+screen.attlist &=
+  width.attrib,
+  linespecific.attrib,
+  common.attrib,
+  screen.role.attrib,
+  local.screen.attrib
+# end of screen.attlist
+
+# end of screen.module
+local.screenshot.attrib = empty
+screenshot.role.attrib = role.attrib
+screenshot =
+  element screenshot {
+    screenshot.attlist,
+    screeninfo?,
+    (graphic | graphicco | mediaobject | mediaobjectco)
+  }
+# end of screenshot.element
+screenshot.attlist &=
+  common.attrib, screenshot.role.attrib, local.screenshot.attrib
+# end of screenshot.attlist
+
+# end of screenshot.module
+local.screeninfo.attrib = empty
+screeninfo.role.attrib = role.attrib
+screeninfo = element screeninfo { screeninfo.attlist, para.char.mix* }
+# end of screeninfo.element
+screeninfo.attlist &=
+  common.attrib, screeninfo.role.attrib, local.screeninfo.attrib
+# end of screeninfo.attlist
+
+# end of screeninfo.module
+
+# end of screenshot.content.module
+
+# Figures etc. .....................
+local.figure.attrib = empty
+figure.role.attrib = role.attrib
+figure =
+  element figure {
+    figure.attlist,
+    blockinfo?,
+    formalobject.title.content,
+    (figure.mix | link.char.class)+
+  }
+# end of figure.element
+
+# Float: Whether the Figure is supposed to be rendered
+# where convenient (yes (1) value) or at the place it occurs
+# in the text (no (0) value, the default)
+figure.attlist &=
+  [ a:defaultValue = "0" ] attribute float { yesorno.attvals }?,
+  attribute pgwide { yesorno.attvals }?,
+  label.attrib,
+  common.attrib,
+  figure.role.attrib,
+  local.figure.attrib
+# end of figure.attlist
+
+# end of figure.module
+local.informalfigure.attrib = empty
+informalfigure.role.attrib = role.attrib
+informalfigure =
+  element informalfigure {
+    informalfigure.attlist, blockinfo?, (figure.mix | link.char.class)+
+  }
+# end of informalfigure.element
+
+# Float: Whether the Figure is supposed to be rendered
+# where convenient (yes (1) value) or at the place it occurs
+# in the text (no (0) value, the default)
+informalfigure.attlist &=
+  [ a:defaultValue = "0" ] attribute float { yesorno.attvals }?,
+  attribute pgwide { yesorno.attvals }?,
+  label.attrib,
+  common.attrib,
+  informalfigure.role.attrib,
+  local.informalfigure.attrib
+# end of informalfigure.attlist
+
+# end of informalfigure.module
+local.graphicco.attrib = empty
+graphicco.role.attrib = role.attrib
+graphicco =
+  element graphicco {
+    graphicco.attlist, areaspec, graphic, calloutlist*
+  }
+# end of graphicco.element
+graphicco.attlist &=
+  common.attrib, graphicco.role.attrib, local.graphicco.attrib
+# end of graphicco.attlist
+
+#  AreaSpec (defined above in Examples)
+
+#  CalloutList (defined above in Lists)
+
+# end of graphicco.module
+
+# Graphical data can be the content of Graphic, or you can reference
+# an external file either as an entity (Entitref) or a filename
+# (Fileref).
+local.graphic.attrib = empty
+graphic.role.attrib = role.attrib
+graphic = element graphic { graphic.attlist, empty }
+# end of graphic.element
+graphic.attlist &=
+  graphics.attrib,
+  common.attrib,
+  graphic.role.attrib,
+  local.graphic.attrib
+# end of graphic.attlist
+
+# end of graphic.module
+local.inlinegraphic.attrib = empty
+inlinegraphic.role.attrib = role.attrib
+inlinegraphic = element inlinegraphic { inlinegraphic.attlist, empty }
+# end of inlinegraphic.element
+inlinegraphic.attlist &=
+  graphics.attrib,
+  common.attrib,
+  inlinegraphic.role.attrib,
+  local.inlinegraphic.attrib
+# end of inlinegraphic.attlist
+
+# end of inlinegraphic.module
+local.mediaobject.attrib = empty
+mediaobject.role.attrib = role.attrib
+mediaobject =
+  element mediaobject {
+    mediaobject.attlist, objectinfo?, mediaobject.mix+, caption?
+  }
+# end of mediaobject.element
+mediaobject.attlist &=
+  common.attrib, mediaobject.role.attrib, local.mediaobject.attrib
+# end of mediaobject.attlist
+
+# end of mediaobject.module
+local.inlinemediaobject.attrib = empty
+inlinemediaobject.role.attrib = role.attrib
+inlinemediaobject =
+  element inlinemediaobject {
+    inlinemediaobject.attlist, objectinfo?, mediaobject.mix+
+  }
+# end of inlinemediaobject.element
+inlinemediaobject.attlist &=
+  common.attrib,
+  inlinemediaobject.role.attrib,
+  local.inlinemediaobject.attrib
+# end of inlinemediaobject.attlist
+
+# end of inlinemediaobject.module
+local.videoobject.attrib = empty
+videoobject.role.attrib = role.attrib
+videoobject =
+  element videoobject { videoobject.attlist, objectinfo?, videodata }
+# end of videoobject.element
+videoobject.attlist &=
+  common.attrib, videoobject.role.attrib, local.videoobject.attrib
+# end of videoobject.attlist
+
+# end of videoobject.module
+local.audioobject.attrib = empty
+audioobject.role.attrib = role.attrib
+audioobject =
+  element audioobject { audioobject.attlist, objectinfo?, audiodata }
+# end of audioobject.element
+audioobject.attlist &=
+  common.attrib, audioobject.role.attrib, local.audioobject.attrib
+# end of audioobject.attlist
+
+# end of audioobject.module
+local.imageobject.attrib = empty
+imageobject.role.attrib = role.attrib
+imageobject =
+  element imageobject { imageobject.attlist, objectinfo?, imagedata }
+# end of imageobject.element
+imageobject.attlist &=
+  common.attrib, imageobject.role.attrib, local.imageobject.attrib
+# end of imageobject.attlist
+
+# end of imageobject.module
+local.textobject.attrib = empty
+textobject.role.attrib = role.attrib
+textobject =
+  element textobject {
+    textobject.attlist,
+    objectinfo?,
+    (phrase | textdata | textobject.mix+)
+  }
+# end of textobject.element
+textobject.attlist &=
+  common.attrib, textobject.role.attrib, local.textobject.attrib
+# end of textobject.attlist
+
+# end of textobject.module
+local.objectinfo.attrib = empty
+objectinfo.role.attrib = role.attrib
+objectinfo = element objectinfo { objectinfo.attlist, info.class+ }
+# end of objectinfo.element
+objectinfo.attlist &=
+  common.attrib, objectinfo.role.attrib, local.objectinfo.attrib
+# end of objectinfo.attlist
+
+# end of objectinfo.module
+
+# EntityRef: Name of an external entity containing the content
+# of the object data
+
+# FileRef: Filename, qualified by a pathname if desired,
+# designating the file containing the content of the object data
+
+# Format: Notation of the element content, if any
+
+# SrcCredit: Information about the source of the image
+local.objectdata.attrib = empty
+objectdata.attrib =
+  attribute entityref { xsd:ENTITY }?,
+  attribute fileref { text }?,
+  attribute format { notation.class }?,
+  attribute srccredit { text }?,
+  local.objectdata.attrib
+local.videodata.attrib = empty
+videodata.role.attrib = role.attrib
+videodata = element videodata { videodata.attlist, empty }
+# end of videodata.element
+
+# Width: Same as CALS reprowid (desired width)
+
+# Depth: Same as CALS reprodep (desired depth)
+
+# Align: Same as CALS hplace with 'none' removed; #IMPLIED means
+# application-specific
+
+# Scale: Conflation of CALS hscale and vscale
+
+# Scalefit: Same as CALS scalefit
+videodata.attlist &=
+  attribute width { text }?,
+  attribute contentwidth { text }?,
+  attribute depth { text }?,
+  attribute contentdepth { text }?,
+  attribute align { "left" | "right" | "center" }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  attribute scale { text }?,
+  attribute scalefit { yesorno.attvals }?,
+  objectdata.attrib,
+  common.attrib,
+  videodata.role.attrib,
+  local.videodata.attrib
+# end of videodata.attlist
+
+# end of videodata.module
+local.audiodata.attrib = empty
+audiodata.role.attrib = role.attrib
+audiodata = element audiodata { audiodata.attlist, empty }
+# end of audiodata.element
+audiodata.attlist &=
+  objectdata.attrib,
+  common.attrib,
+  audiodata.role.attrib,
+  local.audiodata.attrib
+# end of audiodata.attlist
+
+# end of audiodata.module
+local.imagedata.attrib = empty
+imagedata.role.attrib = role.attrib
+imagedata = element imagedata { imagedata.attlist, empty }
+# end of imagedata.element
+
+# Width: Same as CALS reprowid (desired width)
+
+# Depth: Same as CALS reprodep (desired depth)
+
+# Align: Same as CALS hplace with 'none' removed; #IMPLIED means
+# application-specific
+
+# Scale: Conflation of CALS hscale and vscale
+
+# Scalefit: Same as CALS scalefit
+imagedata.attlist &=
+  attribute width { text }?,
+  attribute contentwidth { text }?,
+  attribute depth { text }?,
+  attribute contentdepth { text }?,
+  attribute align { "left" | "right" | "center" }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  attribute scale { text }?,
+  attribute scalefit { yesorno.attvals }?,
+  objectdata.attrib,
+  common.attrib,
+  imagedata.role.attrib,
+  local.imagedata.attrib
+# end of imagedata.attlist
+
+# end of imagedata.module
+local.textdata.attrib = empty
+textdata.role.attrib = role.attrib
+textdata = element textdata { textdata.attlist, empty }
+# end of textdata.element
+textdata.attlist &=
+  attribute encoding { text }?,
+  objectdata.attrib,
+  common.attrib,
+  textdata.role.attrib,
+  local.textdata.attrib
+# end of textdata.attlist
+
+# end of textdata.module
+local.caption.attrib = empty
+caption.role.attrib = role.attrib
+caption = element caption { caption.attlist, textobject.mix* }
+# end of caption.element
+caption.attlist &=
+  common.attrib, caption.role.attrib, local.caption.attrib
+# end of caption.attlist
+
+# end of caption.module
+local.mediaobjectco.attrib = empty
+mediaobjectco.role.attrib = role.attrib
+mediaobjectco =
+  element mediaobjectco {
+    mediaobjectco.attlist,
+    objectinfo?,
+    imageobjectco,
+    (imageobjectco | textobject)*
+  }
+# end of mediaobjectco.element
+mediaobjectco.attlist &=
+  common.attrib, mediaobjectco.role.attrib, local.mediaobjectco.attrib
+# end of mediaobjectco.attlist
+
+# end of mediaobjectco.module
+local.imageobjectco.attrib = empty
+imageobjectco.role.attrib = role.attrib
+imageobjectco =
+  element imageobjectco {
+    imageobjectco.attlist, areaspec, imageobject, calloutlist*
+  }
+# end of imageobjectco.element
+imageobjectco.attlist &=
+  common.attrib, imageobjectco.role.attrib, local.imageobjectco.attrib
+# end of imageobjectco.attlist
+
+# end of imageobjectco.module
+
+# end of mediaobject.content.module
+
+# Equations ........................
+
+# This PE provides a mechanism for replacing equation content,
+
+# perhaps adding a new or different model (e.g., MathML)
+equation.content = alt?, (graphic+ | mediaobject+)
+inlineequation.content = alt?, (graphic+ | inlinemediaobject+)
+local.equation.attrib = empty
+equation.role.attrib = role.attrib
+equation =
+  element equation {
+    equation.attlist,
+    blockinfo?,
+    formalobject.title.content?,
+    (informalequation | equation.content)
+  }
+# end of equation.element
+equation.attlist &=
+  label.attrib,
+  common.attrib,
+  equation.role.attrib,
+  local.equation.attrib
+# end of equation.attlist
+
+# end of equation.module
+local.informalequation.attrib = empty
+informalequation.role.attrib = role.attrib
+informalequation =
+  element informalequation {
+    informalequation.attlist, blockinfo?, equation.content
+  }
+# end of informalequation.element
+informalequation.attlist &=
+  common.attrib,
+  informalequation.role.attrib,
+  local.informalequation.attrib
+# end of informalequation.attlist
+
+# end of informalequation.module
+local.inlineequation.attrib = empty
+inlineequation.role.attrib = role.attrib
+inlineequation =
+  element inlineequation {
+    inlineequation.attlist, inlineequation.content
+  }
+# end of inlineequation.element
+inlineequation.attlist &=
+  common.attrib, inlineequation.role.attrib, local.inlineequation.attrib
+# end of inlineequation.attlist
+
+# end of inlineequation.module
+local.alt.attrib = empty
+alt.role.attrib = role.attrib
+alt = element alt { alt.attlist, text }
+# end of alt.element
+alt.attlist &= common.attrib, alt.role.attrib, local.alt.attrib
+# end of alt.attlist
+
+# end of alt.module
+
+# Tables ...........................
+
+tables.role.attrib = role.attrib
+
+# Note that InformalTable is dependent on some of the entity
+# declarations that customize Table.
+local.informaltable.attrib = empty
+informaltable =
+  element informaltable {
+    informaltable.attlist,
+    blockinfo?,
+    textobject*,
+    (graphic+ | mediaobject+ | tgroup+)
+  }
+# end of informaltable.element
+
+# Frame, Colsep, and Rowsep must be repeated because
+# they are not in entities in the table module.
+
+# includes TabStyle, ToCentry, ShortEntry,
+# Orient, PgWide
+
+# includes Label
+
+# includes common attributes
+informaltable.attlist &=
+  attribute frame {
+    "top" | "bottom" | "topbot" | "all" | "sides" | "none"
+  }?,
+  attribute colsep { yesorno.attvals }?,
+  attribute rowsep { yesorno.attvals }?,
+  common.table.attribs,
+  tbl.table.att,
+  local.informaltable.attrib
+# end of informaltable.attlist
+
+# end of informaltable.module
+
+# ......................................................................
+
+# Synopses .............................................................
+
+# Synopsis .........................
+local.synopsis.attrib = empty
+synopsis.role.attrib = role.attrib
+synopsis =
+  element synopsis {
+    synopsis.attlist,
+    (para.char.mix
+     | graphic
+     | mediaobject
+     | co
+     | coref
+     | textobject
+     | lineannotation)*
+  }
+# end of synopsis.element
+synopsis.attlist &=
+  label.attrib,
+  linespecific.attrib,
+  common.attrib,
+  synopsis.role.attrib,
+  local.synopsis.attrib
+# end of synopsis.attlist
+
+#  LineAnnotation (defined in the Inlines section, below)
+
+# end of synopsis.module
+
+# CmdSynopsis ......................
+local.cmdsynopsis.attrib = empty
+cmdsynopsis.role.attrib = role.attrib
+cmdsynopsis =
+  element cmdsynopsis {
+    cmdsynopsis.attlist, (command | arg | group | sbr)+, synopfragment*
+  }
+# end of cmdsynopsis.element
+
+# Sepchar: Character that should separate command and all
+# top-level arguments; alternate value might be e.g., &Delta;
+cmdsynopsis.attlist &=
+  label.attrib,
+  [ a:defaultValue = " " ] attribute sepchar { text }?,
+  attribute cmdlength { text }?,
+  common.attrib,
+  cmdsynopsis.role.attrib,
+  local.cmdsynopsis.attrib
+# end of cmdsynopsis.attlist
+
+# end of cmdsynopsis.module
+local.arg.attrib = empty
+arg.role.attrib = role.attrib
+arg =
+  element arg {
+    arg.attlist,
+    (text
+     | arg
+     | group
+     | option
+     | synopfragmentref
+     | replaceable
+     | sbr)*
+  }
+# end of arg.element
+
+# Choice: Whether Arg must be supplied: Opt (optional to
+# supply, e.g. [arg]; the default), Req (required to supply,
+# e.g. {arg}), or Plain (required to supply, e.g. arg)
+
+# Rep: whether Arg is repeatable: Norepeat (e.g. arg without
+# ellipsis; the default), or Repeat (e.g. arg...)
+arg.attlist &=
+  [ a:defaultValue = "opt" ]
+  attribute choice { "opt" | "req" | "plain" }?,
+  [ a:defaultValue = "norepeat" ]
+  attribute rep { "norepeat" | "repeat" }?,
+  common.attrib,
+  arg.role.attrib,
+  local.arg.attrib
+# end of arg.attlist
+
+# end of arg.module
+local.group.attrib = empty
+group.role.attrib = role.attrib
+group =
+  element group {
+    group.attlist,
+    (arg | group | option | synopfragmentref | replaceable | sbr)+
+  }
+# end of group.element
+
+# Choice: Whether Group must be supplied: Opt (optional to
+# supply, e.g.  [g1|g2|g3]; the default), Req (required to
+# supply, e.g.  {g1|g2|g3}), Plain (required to supply,
+# e.g.  g1|g2|g3), OptMult (can supply zero or more, e.g.
+# [[g1|g2|g3]]), or ReqMult (must supply one or more, e.g.
+# {{g1|g2|g3}})
+
+# Rep: whether Group is repeatable: Norepeat (e.g. group
+# without ellipsis; the default), or Repeat (e.g. group...)
+group.attlist &=
+  [ a:defaultValue = "opt" ]
+  attribute choice { "opt" | "req" | "plain" }?,
+  [ a:defaultValue = "norepeat" ]
+  attribute rep { "norepeat" | "repeat" }?,
+  common.attrib,
+  group.role.attrib,
+  local.group.attrib
+# end of group.attlist
+
+# end of group.module
+local.sbr.attrib = empty
+# Synopsis break
+sbr.role.attrib = role.attrib
+sbr = element sbr { sbr.attlist, empty }
+# end of sbr.element
+sbr.attlist &= common.attrib, sbr.role.attrib, local.sbr.attrib
+# end of sbr.attlist
+
+# end of sbr.module
+local.synopfragmentref.attrib = empty
+synopfragmentref.role.attrib = role.attrib
+synopfragmentref =
+  element synopfragmentref { synopfragmentref.attlist, text }
+# end of synopfragmentref.element
+
+# to SynopFragment of complex synopsis
+# material for separate referencing
+synopfragmentref.attlist &=
+  linkendreq.attrib,
+  common.attrib,
+  synopfragmentref.role.attrib,
+  local.synopfragmentref.attrib
+# end of synopfragmentref.attlist
+
+# end of synopfragmentref.module
+local.synopfragment.attrib = empty
+synopfragment.role.attrib = role.attrib
+synopfragment =
+  element synopfragment { synopfragment.attlist, (arg | group)+ }
+# end of synopfragment.element
+synopfragment.attlist &=
+  idreq.common.attrib,
+  synopfragment.role.attrib,
+  local.synopfragment.attrib
+# end of synopfragment.attlist
+
+# end of synopfragment.module
+
+#  Command (defined in the Inlines section, below)
+
+#  Option (defined in the Inlines section, below)
+
+#  Replaceable (defined in the Inlines section, below)
+
+# end of cmdsynopsis.content.module
+
+# FuncSynopsis .....................
+local.funcsynopsis.attrib = empty
+funcsynopsis.role.attrib = role.attrib
+funcsynopsis =
+  element funcsynopsis {
+    funcsynopsis.attlist, (funcsynopsisinfo | funcprototype)+
+  }
+# end of funcsynopsis.element
+funcsynopsis.attlist &=
+  label.attrib,
+  common.attrib,
+  funcsynopsis.role.attrib,
+  local.funcsynopsis.attrib
+# end of funcsynopsis.attlist
+
+# end of funcsynopsis.module
+local.funcsynopsisinfo.attrib = empty
+funcsynopsisinfo.role.attrib = role.attrib
+funcsynopsisinfo =
+  element funcsynopsisinfo {
+    funcsynopsisinfo.attlist,
+    (cptr.char.mix | textobject | lineannotation)*
+  }
+# end of funcsynopsisinfo.element
+funcsynopsisinfo.attlist &=
+  linespecific.attrib,
+  common.attrib,
+  funcsynopsisinfo.role.attrib,
+  local.funcsynopsisinfo.attrib
+# end of funcsynopsisinfo.attlist
+
+# end of funcsynopsisinfo.module
+local.funcprototype.attrib = empty
+funcprototype.role.attrib = role.attrib
+funcprototype =
+  element funcprototype {
+    funcprototype.attlist, funcdef, (void | varargs | paramdef+)
+  }
+# end of funcprototype.element
+funcprototype.attlist &=
+  common.attrib, funcprototype.role.attrib, local.funcprototype.attrib
+# end of funcprototype.attlist
+
+# end of funcprototype.module
+local.funcdef.attrib = empty
+funcdef.role.attrib = role.attrib
+funcdef =
+  element funcdef {
+    funcdef.attlist, (text | type | replaceable | function)*
+  }
+# end of funcdef.element
+funcdef.attlist &=
+  common.attrib, funcdef.role.attrib, local.funcdef.attrib
+# end of funcdef.attlist
+
+# end of funcdef.module
+local.void.attrib = empty
+void.role.attrib = role.attrib
+void = element void { void.attlist, empty }
+# end of void.element
+void.attlist &= common.attrib, void.role.attrib, local.void.attrib
+# end of void.attlist
+
+# end of void.module
+local.varargs.attrib = empty
+varargs.role.attrib = role.attrib
+varargs = element varargs { varargs.attlist, empty }
+# end of varargs.element
+varargs.attlist &=
+  common.attrib, varargs.role.attrib, local.varargs.attrib
+# end of varargs.attlist
+
+# end of varargs.module
+
+# Processing assumes that only one Parameter will appear in a
+# ParamDef, and that FuncParams will be used at most once, for
+# providing information on the "inner parameters" for parameters that
+# are pointers to functions.
+local.paramdef.attrib = empty
+paramdef.role.attrib = role.attrib
+paramdef =
+  element paramdef {
+    paramdef.attlist,
+    (text | type | replaceable | parameter | funcparams)*
+  }
+# end of paramdef.element
+paramdef.attlist &=
+  common.attrib, paramdef.role.attrib, local.paramdef.attrib
+# end of paramdef.attlist
+
+# end of paramdef.module
+local.funcparams.attrib = empty
+funcparams.role.attrib = role.attrib
+funcparams = element funcparams { funcparams.attlist, cptr.char.mix* }
+# end of funcparams.element
+funcparams.attlist &=
+  common.attrib, funcparams.role.attrib, local.funcparams.attrib
+# end of funcparams.attlist
+
+# end of funcparams.module
+
+#  LineAnnotation (defined in the Inlines section, below)
+
+#  Replaceable (defined in the Inlines section, below)
+
+#  Function (defined in the Inlines section, below)
+
+#  Parameter (defined in the Inlines section, below)
+
+# end of funcsynopsis.content.module
+
+# ClassSynopsis .....................
+local.classsynopsis.attrib = empty
+classsynopsis.role.attrib = role.attrib
+classsynopsis =
+  element classsynopsis {
+    classsynopsis.attlist,
+    (ooclass | oointerface | ooexception)+,
+    (classsynopsisinfo | fieldsynopsis | method.synop.class)*
+  }
+# end of classsynopsis.element
+classsynopsis.attlist &=
+  attribute language { text }?,
+  [ a:defaultValue = "class" ]
+  attribute class { "class" | "interface" }?,
+  common.attrib,
+  classsynopsis.role.attrib,
+  local.classsynopsis.attrib
+# end of classsynopsis.attlist
+
+# end of classsynopsis.module
+local.classsynopsisinfo.attrib = empty
+classsynopsisinfo.role.attrib = role.attrib
+classsynopsisinfo =
+  element classsynopsisinfo {
+    classsynopsisinfo.attlist,
+    (cptr.char.mix | textobject | lineannotation)*
+  }
+# end of classsynopsisinfo.element
+classsynopsisinfo.attlist &=
+  linespecific.attrib,
+  common.attrib,
+  classsynopsisinfo.role.attrib,
+  local.classsynopsisinfo.attrib
+# end of classsynopsisinfo.attlist
+
+# end of classsynopsisinfo.module
+local.ooclass.attrib = empty
+ooclass.role.attrib = role.attrib
+ooclass = element ooclass { ooclass.attlist, modifier*, classname }
+# end of ooclass.element
+ooclass.attlist &=
+  common.attrib, ooclass.role.attrib, local.ooclass.attrib
+# end of ooclass.attlist
+
+# end of ooclass.module
+local.oointerface.attrib = empty
+oointerface.role.attrib = role.attrib
+oointerface =
+  element oointerface { oointerface.attlist, modifier*, interfacename }
+# end of oointerface.element
+oointerface.attlist &=
+  common.attrib, oointerface.role.attrib, local.oointerface.attrib
+# end of oointerface.attlist
+
+# end of oointerface.module
+local.ooexception.attrib = empty
+ooexception.role.attrib = role.attrib
+ooexception =
+  element ooexception { ooexception.attlist, modifier*, exceptionname }
+# end of ooexception.element
+ooexception.attlist &=
+  common.attrib, ooexception.role.attrib, local.ooexception.attrib
+# end of ooexception.attlist
+
+# end of ooexception.module
+local.modifier.attrib = empty
+modifier.role.attrib = role.attrib
+modifier = element modifier { modifier.attlist, smallcptr.char.mix* }
+# end of modifier.element
+modifier.attlist &=
+  common.attrib, modifier.role.attrib, local.modifier.attrib
+# end of modifier.attlist
+
+# end of modifier.module
+local.interfacename.attrib = empty
+interfacename.role.attrib = role.attrib
+interfacename =
+  element interfacename { interfacename.attlist, cptr.char.mix* }
+# end of interfacename.element
+interfacename.attlist &=
+  common.attrib, interfacename.role.attrib, local.interfacename.attrib
+# end of interfacename.attlist
+
+# end of interfacename.module
+local.exceptionname.attrib = empty
+exceptionname.role.attrib = role.attrib
+exceptionname =
+  element exceptionname { exceptionname.attlist, smallcptr.char.mix* }
+# end of exceptionname.element
+exceptionname.attlist &=
+  common.attrib, exceptionname.role.attrib, local.exceptionname.attrib
+# end of exceptionname.attlist
+
+# end of exceptionname.module
+local.fieldsynopsis.attrib = empty
+fieldsynopsis.role.attrib = role.attrib
+fieldsynopsis =
+  element fieldsynopsis {
+    fieldsynopsis.attlist, modifier*, type?, varname, initializer?
+  }
+# end of fieldsynopsis.element
+fieldsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  fieldsynopsis.role.attrib,
+  local.fieldsynopsis.attrib
+# end of fieldsynopsis.attlist
+
+# end of fieldsynopsis.module
+local.initializer.attrib = empty
+initializer.role.attrib = role.attrib
+initializer =
+  element initializer { initializer.attlist, smallcptr.char.mix* }
+# end of initializer.element
+initializer.attlist &=
+  common.attrib, initializer.role.attrib, local.initializer.attrib
+# end of initializer.attlist
+
+# end of initializer.module
+local.constructorsynopsis.attrib = empty
+constructorsynopsis.role.attrib = role.attrib
+constructorsynopsis =
+  element constructorsynopsis {
+    constructorsynopsis.attlist,
+    modifier*,
+    methodname?,
+    (methodparam+ | void),
+    exceptionname*
+  }
+# end of constructorsynopsis.element
+constructorsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  constructorsynopsis.role.attrib,
+  local.constructorsynopsis.attrib
+# end of constructorsynopsis.attlist
+
+# end of constructorsynopsis.module
+local.destructorsynopsis.attrib = empty
+destructorsynopsis.role.attrib = role.attrib
+destructorsynopsis =
+  element destructorsynopsis {
+    destructorsynopsis.attlist,
+    modifier*,
+    methodname?,
+    (methodparam+ | void),
+    exceptionname*
+  }
+# end of destructorsynopsis.element
+destructorsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  destructorsynopsis.role.attrib,
+  local.destructorsynopsis.attrib
+# end of destructorsynopsis.attlist
+
+# end of destructorsynopsis.module
+local.methodsynopsis.attrib = empty
+methodsynopsis.role.attrib = role.attrib
+methodsynopsis =
+  element methodsynopsis {
+    methodsynopsis.attlist,
+    modifier*,
+    (type | void)?,
+    methodname,
+    (methodparam+ | void),
+    exceptionname*,
+    modifier*
+  }
+# end of methodsynopsis.element
+methodsynopsis.attlist &=
+  attribute language { text }?,
+  common.attrib,
+  methodsynopsis.role.attrib,
+  local.methodsynopsis.attrib
+# end of methodsynopsis.attlist
+
+# end of methodsynopsis.module
+local.methodname.attrib = empty
+methodname.role.attrib = role.attrib
+methodname =
+  element methodname { methodname.attlist, smallcptr.char.mix* }
+# end of methodname.element
+methodname.attlist &=
+  common.attrib, methodname.role.attrib, local.methodname.attrib
+# end of methodname.attlist
+
+# end of methodname.module
+local.methodparam.attrib = empty
+methodparam.role.attrib = role.attrib
+methodparam =
+  element methodparam {
+    methodparam.attlist,
+    modifier*,
+    type?,
+    ((parameter, initializer?) | funcparams),
+    modifier*
+  }
+# end of methodparam.element
+methodparam.attlist &=
+  [ a:defaultValue = "req" ]
+  attribute choice { "opt" | "req" | "plain" }?,
+  [ a:defaultValue = "norepeat" ]
+  attribute rep { "norepeat" | "repeat" }?,
+  common.attrib,
+  methodparam.role.attrib,
+  local.methodparam.attrib
+# end of methodparam.attlist
+
+# end of methodparam.module
+
+# end of classsynopsis.content.module
+
+# ......................................................................
+
+# Document information entities and elements ...........................
+
+# The document information elements include some elements that are
+# currently used only in the document hierarchy module. They are
+# defined here so that they will be available for use in customized
+# document hierarchies.
+
+# ..................................
+
+# Ackno ............................
+local.ackno.attrib = empty
+ackno.role.attrib = role.attrib
+ackno = element ackno { ackno.attlist, docinfo.char.mix* }
+# end of ackno.element
+ackno.attlist &= common.attrib, ackno.role.attrib, local.ackno.attrib
+# end of ackno.attlist
+
+# end of ackno.module
+
+# Address ..........................
+local.address.attrib = empty
+address.role.attrib = role.attrib
+address =
+  element address {
+    address.attlist,
+    (text
+     | personname
+     | person.ident.mix
+     | street
+     | pob
+     | postcode
+     | city
+     | state
+     | country
+     | phone
+     | fax
+     | email
+     | otheraddr)*
+  }
+# end of address.element
+address.attlist &=
+  linespecific.attrib,
+  common.attrib,
+  address.role.attrib,
+  local.address.attrib
+# end of address.attlist
+
+# end of address.module
+local.street.attrib = empty
+street.role.attrib = role.attrib
+street = element street { street.attlist, docinfo.char.mix* }
+# end of street.element
+street.attlist &= common.attrib, street.role.attrib, local.street.attrib
+# end of street.attlist
+
+# end of street.module
+local.pob.attrib = empty
+pob.role.attrib = role.attrib
+pob = element pob { pob.attlist, docinfo.char.mix* }
+# end of pob.element
+pob.attlist &= common.attrib, pob.role.attrib, local.pob.attrib
+# end of pob.attlist
+
+# end of pob.module
+local.postcode.attrib = empty
+postcode.role.attrib = role.attrib
+postcode = element postcode { postcode.attlist, docinfo.char.mix* }
+# end of postcode.element
+postcode.attlist &=
+  common.attrib, postcode.role.attrib, local.postcode.attrib
+# end of postcode.attlist
+
+# end of postcode.module
+local.city.attrib = empty
+city.role.attrib = role.attrib
+city = element city { city.attlist, docinfo.char.mix* }
+# end of city.element
+city.attlist &= common.attrib, city.role.attrib, local.city.attrib
+# end of city.attlist
+
+# end of city.module
+local.state.attrib = empty
+state.role.attrib = role.attrib
+state = element state { state.attlist, docinfo.char.mix* }
+# end of state.element
+state.attlist &= common.attrib, state.role.attrib, local.state.attrib
+# end of state.attlist
+
+# end of state.module
+local.country.attrib = empty
+country.role.attrib = role.attrib
+country = element country { country.attlist, docinfo.char.mix* }
+# end of country.element
+country.attlist &=
+  common.attrib, country.role.attrib, local.country.attrib
+# end of country.attlist
+
+# end of country.module
+local.phone.attrib = empty
+phone.role.attrib = role.attrib
+phone = element phone { phone.attlist, docinfo.char.mix* }
+# end of phone.element
+phone.attlist &= common.attrib, phone.role.attrib, local.phone.attrib
+# end of phone.attlist
+
+# end of phone.module
+local.fax.attrib = empty
+fax.role.attrib = role.attrib
+fax = element fax { fax.attlist, docinfo.char.mix* }
+# end of fax.element
+fax.attlist &= common.attrib, fax.role.attrib, local.fax.attrib
+# end of fax.attlist
+
+# end of fax.module
+
+#  Email (defined in the Inlines section, below)
+local.otheraddr.attrib = empty
+otheraddr.role.attrib = role.attrib
+otheraddr = element otheraddr { otheraddr.attlist, docinfo.char.mix* }
+# end of otheraddr.element
+otheraddr.attlist &=
+  common.attrib, otheraddr.role.attrib, local.otheraddr.attrib
+# end of otheraddr.attlist
+
+# end of otheraddr.module
+
+# end of address.content.module
+
+# Affiliation ......................
+local.affiliation.attrib = empty
+affiliation.role.attrib = role.attrib
+affiliation =
+  element affiliation {
+    affiliation.attlist,
+    shortaffil?,
+    jobtitle*,
+    orgname?,
+    orgdiv*,
+    address*
+  }
+# end of affiliation.element
+affiliation.attlist &=
+  common.attrib, affiliation.role.attrib, local.affiliation.attrib
+# end of affiliation.attlist
+
+# end of affiliation.module
+local.shortaffil.attrib = empty
+shortaffil.role.attrib = role.attrib
+shortaffil =
+  element shortaffil { shortaffil.attlist, docinfo.char.mix* }
+# end of shortaffil.element
+shortaffil.attlist &=
+  common.attrib, shortaffil.role.attrib, local.shortaffil.attrib
+# end of shortaffil.attlist
+
+# end of shortaffil.module
+local.jobtitle.attrib = empty
+jobtitle.role.attrib = role.attrib
+jobtitle = element jobtitle { jobtitle.attlist, docinfo.char.mix* }
+# end of jobtitle.element
+jobtitle.attlist &=
+  common.attrib, jobtitle.role.attrib, local.jobtitle.attrib
+# end of jobtitle.attlist
+
+# end of jobtitle.module
+
+#  OrgName (defined elsewhere in this section)
+local.orgdiv.attrib = empty
+orgdiv.role.attrib = role.attrib
+orgdiv = element orgdiv { orgdiv.attlist, docinfo.char.mix* }
+# end of orgdiv.element
+orgdiv.attlist &= common.attrib, orgdiv.role.attrib, local.orgdiv.attrib
+# end of orgdiv.attlist
+
+# end of orgdiv.module
+
+#  Address (defined elsewhere in this section)
+
+# end of affiliation.content.module
+
+# ArtPageNums ......................
+local.artpagenums.attrib = empty
+artpagenums.role.attrib = role.attrib
+artpagenums =
+  element artpagenums { artpagenums.attlist, docinfo.char.mix* }
+# end of artpagenums.element
+artpagenums.attlist &=
+  common.attrib, artpagenums.role.attrib, local.artpagenums.attrib
+# end of artpagenums.attlist
+
+# end of artpagenums.module
+
+# PersonName
+local.personname.attrib = empty
+personname.role.attrib = role.attrib
+personname =
+  element personname {
+    personname.attlist,
+    (honorific | firstname | surname | lineage | othername)+
+  }
+# end of personname.element
+personname.attlist &=
+  common.attrib, personname.role.attrib, local.personname.attrib
+# end of personname.attlist
+
+# end of personname.module
+
+# Author ...........................
+local.author.attrib = empty
+author.role.attrib = role.attrib
+author =
+  element author {
+    author.attlist,
+    (personname | person.ident.mix+),
+    (personblurb | email | address)*
+  }
+# end of author.element
+author.attlist &= common.attrib, author.role.attrib, local.author.attrib
+# end of author.attlist
+
+# (see "Personal identity elements" for %person.ident.mix;)
+
+# end of author.module
+
+# AuthorGroup ......................
+local.authorgroup.attrib = empty
+authorgroup.role.attrib = role.attrib
+authorgroup =
+  element authorgroup {
+    authorgroup.attlist,
+    (author | editor | collab | corpauthor | othercredit)+
+  }
+# end of authorgroup.element
+authorgroup.attlist &=
+  common.attrib, authorgroup.role.attrib, local.authorgroup.attrib
+# end of authorgroup.attlist
+
+# end of authorgroup.module
+
+#  Author (defined elsewhere in this section)
+
+#  Editor (defined elsewhere in this section)
+local.collab.attrib = empty
+collab.role.attrib = role.attrib
+collab = element collab { collab.attlist, collabname, affiliation* }
+# end of collab.element
+collab.attlist &= common.attrib, collab.role.attrib, local.collab.attrib
+# end of collab.attlist
+
+# end of collab.module
+local.collabname.attrib = empty
+collabname.role.attrib = role.attrib
+collabname =
+  element collabname { collabname.attlist, docinfo.char.mix* }
+# end of collabname.element
+collabname.attlist &=
+  common.attrib, collabname.role.attrib, local.collabname.attrib
+# end of collabname.attlist
+
+# end of collabname.module
+
+#  Affiliation (defined elsewhere in this section)
+
+# end of collab.content.module
+
+#  CorpAuthor (defined elsewhere in this section)
+
+#  OtherCredit (defined elsewhere in this section)
+
+# end of authorgroup.content.module
+
+# AuthorInitials ...................
+local.authorinitials.attrib = empty
+authorinitials.role.attrib = role.attrib
+authorinitials =
+  element authorinitials { authorinitials.attlist, docinfo.char.mix* }
+# end of authorinitials.element
+authorinitials.attlist &=
+  common.attrib, authorinitials.role.attrib, local.authorinitials.attrib
+# end of authorinitials.attlist
+
+# end of authorinitials.module
+
+# ConfGroup ........................
+local.confgroup.attrib = empty
+confgroup.role.attrib = role.attrib
+confgroup =
+  element confgroup {
+    confgroup.attlist,
+    (confdates | conftitle | confnum | address | confsponsor)*
+  }
+# end of confgroup.element
+confgroup.attlist &=
+  common.attrib, confgroup.role.attrib, local.confgroup.attrib
+# end of confgroup.attlist
+
+# end of confgroup.module
+local.confdates.attrib = empty
+confdates.role.attrib = role.attrib
+confdates = element confdates { confdates.attlist, docinfo.char.mix* }
+# end of confdates.element
+confdates.attlist &=
+  common.attrib, confdates.role.attrib, local.confdates.attrib
+# end of confdates.attlist
+
+# end of confdates.module
+local.conftitle.attrib = empty
+conftitle.role.attrib = role.attrib
+conftitle = element conftitle { conftitle.attlist, docinfo.char.mix* }
+# end of conftitle.element
+conftitle.attlist &=
+  common.attrib, conftitle.role.attrib, local.conftitle.attrib
+# end of conftitle.attlist
+
+# end of conftitle.module
+local.confnum.attrib = empty
+confnum.role.attrib = role.attrib
+confnum = element confnum { confnum.attlist, docinfo.char.mix* }
+# end of confnum.element
+confnum.attlist &=
+  common.attrib, confnum.role.attrib, local.confnum.attrib
+# end of confnum.attlist
+
+# end of confnum.module
+
+#  Address (defined elsewhere in this section)
+local.confsponsor.attrib = empty
+confsponsor.role.attrib = role.attrib
+confsponsor =
+  element confsponsor { confsponsor.attlist, docinfo.char.mix* }
+# end of confsponsor.element
+confsponsor.attlist &=
+  common.attrib, confsponsor.role.attrib, local.confsponsor.attrib
+# end of confsponsor.attlist
+
+# end of confsponsor.module
+
+# end of confgroup.content.module
+
+# ContractNum ......................
+local.contractnum.attrib = empty
+contractnum.role.attrib = role.attrib
+contractnum =
+  element contractnum { contractnum.attlist, docinfo.char.mix* }
+# end of contractnum.element
+contractnum.attlist &=
+  common.attrib, contractnum.role.attrib, local.contractnum.attrib
+# end of contractnum.attlist
+
+# end of contractnum.module
+
+# ContractSponsor ..................
+local.contractsponsor.attrib = empty
+contractsponsor.role.attrib = role.attrib
+contractsponsor =
+  element contractsponsor { contractsponsor.attlist, docinfo.char.mix* }
+# end of contractsponsor.element
+contractsponsor.attlist &=
+  common.attrib,
+  contractsponsor.role.attrib,
+  local.contractsponsor.attrib
+# end of contractsponsor.attlist
+
+# end of contractsponsor.module
+
+# Copyright ........................
+local.copyright.attrib = empty
+copyright.role.attrib = role.attrib
+copyright = element copyright { copyright.attlist, year+, holder* }
+# end of copyright.element
+copyright.attlist &=
+  common.attrib, copyright.role.attrib, local.copyright.attrib
+# end of copyright.attlist
+
+# end of copyright.module
+local.year.attrib = empty
+year.role.attrib = role.attrib
+year = element year { year.attlist, docinfo.char.mix* }
+# end of year.element
+year.attlist &= common.attrib, year.role.attrib, local.year.attrib
+# end of year.attlist
+
+# end of year.module
+local.holder.attrib = empty
+holder.role.attrib = role.attrib
+holder = element holder { holder.attlist, docinfo.char.mix* }
+# end of holder.element
+holder.attlist &= common.attrib, holder.role.attrib, local.holder.attrib
+# end of holder.attlist
+
+# end of holder.module
+
+# end of copyright.content.module
+
+# CorpAuthor .......................
+local.corpauthor.attrib = empty
+corpauthor.role.attrib = role.attrib
+corpauthor =
+  element corpauthor { corpauthor.attlist, docinfo.char.mix* }
+# end of corpauthor.element
+corpauthor.attlist &=
+  common.attrib, corpauthor.role.attrib, local.corpauthor.attrib
+# end of corpauthor.attlist
+
+# end of corpauthor.module
+
+# CorpName .........................
+local.corpname.attrib = empty
+corpname = element corpname { corpname.attlist, docinfo.char.mix* }
+# end of corpname.element
+corpname.role.attrib = role.attrib
+corpname.attlist &=
+  common.attrib, corpname.role.attrib, local.corpname.attrib
+# end of corpname.attlist
+
+# end of corpname.module
+
+# Date .............................
+local.date.attrib = empty
+date.role.attrib = role.attrib
+date = element date { date.attlist, docinfo.char.mix* }
+# end of date.element
+date.attlist &= common.attrib, date.role.attrib, local.date.attrib
+# end of date.attlist
+
+# end of date.module
+
+# Edition ..........................
+local.edition.attrib = empty
+edition.role.attrib = role.attrib
+edition = element edition { edition.attlist, docinfo.char.mix* }
+# end of edition.element
+edition.attlist &=
+  common.attrib, edition.role.attrib, local.edition.attrib
+# end of edition.attlist
+
+# end of edition.module
+
+# Editor ...........................
+local.editor.attrib = empty
+editor.role.attrib = role.attrib
+editor =
+  element editor {
+    editor.attlist,
+    (personname | person.ident.mix+),
+    (personblurb | email | address)*
+  }
+# end of editor.element
+editor.attlist &= common.attrib, editor.role.attrib, local.editor.attrib
+# end of editor.attlist
+
+# (see "Personal identity elements" for %person.ident.mix;)
+
+# end of editor.module
+
+# ISBN .............................
+local.isbn.attrib = empty
+isbn.role.attrib = role.attrib
+isbn = element isbn { isbn.attlist, docinfo.char.mix* }
+# end of isbn.element
+isbn.attlist &= common.attrib, isbn.role.attrib, local.isbn.attrib
+# end of isbn.attlist
+
+# end of isbn.module
+
+# ISSN .............................
+local.issn.attrib = empty
+issn.role.attrib = role.attrib
+issn = element issn { issn.attlist, docinfo.char.mix* }
+# end of issn.element
+issn.attlist &= common.attrib, issn.role.attrib, local.issn.attrib
+# end of issn.attlist
+
+# end of issn.module
+
+# BiblioId .................
+biblio.class.attrib =
+  attribute class {
+    "uri"
+    | "doi"
+    | "isbn"
+    | "issn"
+    | "libraryofcongress"
+    | "pubnumber"
+    | "other"
+  }?,
+  attribute otherclass { text }?
+local.biblioid.attrib = empty
+biblioid.role.attrib = role.attrib
+biblioid = element biblioid { biblioid.attlist, docinfo.char.mix* }
+# end of biblioid.element
+biblioid.attlist &=
+  biblio.class.attrib,
+  common.attrib,
+  biblioid.role.attrib,
+  local.biblioid.attrib
+# end of biblioid.attlist
+
+# end of biblioid.module
+
+# CiteBiblioId .................
+local.citebiblioid.attrib = empty
+citebiblioid.role.attrib = role.attrib
+citebiblioid =
+  element citebiblioid { citebiblioid.attlist, docinfo.char.mix* }
+# end of citebiblioid.element
+citebiblioid.attlist &=
+  biblio.class.attrib,
+  common.attrib,
+  citebiblioid.role.attrib,
+  local.citebiblioid.attrib
+# end of citebiblioid.attlist
+
+# end of citebiblioid.module
+
+# BiblioSource .................
+local.bibliosource.attrib = empty
+bibliosource.role.attrib = role.attrib
+bibliosource =
+  element bibliosource { bibliosource.attlist, docinfo.char.mix* }
+# end of bibliosource.element
+bibliosource.attlist &=
+  biblio.class.attrib,
+  common.attrib,
+  bibliosource.role.attrib,
+  local.bibliosource.attrib
+# end of bibliosource.attlist
+
+# end of bibliosource.module
+
+# BiblioRelation .................
+local.bibliorelation.attrib = empty
+local.bibliorelation.types = notAllowed
+bibliorelation.type.attrib =
+  attribute type {
+    "isversionof"
+    | "hasversion"
+    | "isreplacedby"
+    | "replaces"
+    | "isrequiredby"
+    | "requires"
+    | "ispartof"
+    | "haspart"
+    | "isreferencedby"
+    | "references"
+    | "isformatof"
+    | "hasformat"
+    | "othertype"
+    | local.bibliorelation.types
+  }?,
+  attribute othertype { text }?
+bibliorelation.role.attrib = role.attrib
+bibliorelation =
+  element bibliorelation { bibliorelation.attlist, docinfo.char.mix* }
+# end of bibliorelation.element
+bibliorelation.attlist &=
+  biblio.class.attrib,
+  bibliorelation.type.attrib,
+  common.attrib,
+  bibliorelation.role.attrib,
+  local.bibliorelation.attrib
+# end of bibliorelation.attlist
+
+# end of bibliorelation.module
+
+# BiblioCoverage .................
+local.bibliocoverage.attrib = empty
+bibliocoverage.role.attrib = role.attrib
+bibliocoverage =
+  element bibliocoverage { bibliocoverage.attlist, docinfo.char.mix* }
+# end of bibliocoverage.element
+bibliocoverage.attlist &=
+  attribute spatial {
+    "dcmipoint" | "iso3166" | "dcmibox" | "tgn" | "otherspatial"
+  }?,
+  attribute otherspatial { text }?,
+  attribute temporal { "dcmiperiod" | "w3c-dtf" | "othertemporal" }?,
+  attribute othertemporal { text }?,
+  common.attrib,
+  bibliocoverage.role.attrib,
+  local.bibliocoverage.attrib
+# end of bibliocoverage.attlist
+
+# end of bibliocoverage.module
+
+# InvPartNumber ....................
+local.invpartnumber.attrib = empty
+invpartnumber.role.attrib = role.attrib
+invpartnumber =
+  element invpartnumber { invpartnumber.attlist, docinfo.char.mix* }
+# end of invpartnumber.element
+invpartnumber.attlist &=
+  common.attrib, invpartnumber.role.attrib, local.invpartnumber.attrib
+# end of invpartnumber.attlist
+
+# end of invpartnumber.module
+
+# IssueNum .........................
+local.issuenum.attrib = empty
+issuenum.role.attrib = role.attrib
+issuenum = element issuenum { issuenum.attlist, docinfo.char.mix* }
+# end of issuenum.element
+issuenum.attlist &=
+  common.attrib, issuenum.role.attrib, local.issuenum.attrib
+# end of issuenum.attlist
+
+# end of issuenum.module
+
+# LegalNotice ......................
+local.legalnotice.attrib = empty
+legalnotice.role.attrib = role.attrib
+legalnotice =
+  element legalnotice {
+    legalnotice.attlist, blockinfo?, title?, legalnotice.mix+
+  }
+# end of legalnotice.element
+legalnotice.attlist &=
+  common.attrib, legalnotice.role.attrib, local.legalnotice.attrib
+# end of legalnotice.attlist
+
+# end of legalnotice.module
+
+# ModeSpec .........................
+local.modespec.attrib = empty
+modespec.role.attrib = role.attrib
+modespec = element modespec { modespec.attlist, docinfo.char.mix* }
+# end of modespec.element
+
+# Application: Type of action required for completion
+# of the links to which the ModeSpec is relevant (e.g.,
+# retrieval query)
+modespec.attlist &=
+  attribute application { notation.class }?,
+  common.attrib,
+  modespec.role.attrib,
+  local.modespec.attrib
+# end of modespec.attlist
+
+# end of modespec.module
+
+# OrgName ..........................
+local.orgname.attrib = empty
+orgname.role.attrib = role.attrib
+orgname = element orgname { orgname.attlist, docinfo.char.mix* }
+# end of orgname.element
+orgname.attlist &=
+  common.attrib,
+  attribute class {
+    "corporation" | "nonprofit" | "consortium" | "informal" | "other"
+  }?,
+  attribute otherclass { text }?,
+  orgname.role.attrib,
+  local.orgname.attrib
+# end of orgname.attlist
+
+# end of orgname.module
+
+# OtherCredit ......................
+local.othercredit.attrib = empty
+othercredit.role.attrib = role.attrib
+othercredit =
+  element othercredit {
+    othercredit.attlist,
+    (personname | person.ident.mix+),
+    (personblurb | email | address)*
+  }
+# end of othercredit.element
+othercredit.attlist &=
+  common.attrib, othercredit.role.attrib, local.othercredit.attrib
+# end of othercredit.attlist
+
+# (see "Personal identity elements" for %person.ident.mix;)
+
+# end of othercredit.module
+
+# PageNums .........................
+local.pagenums.attrib = empty
+pagenums.role.attrib = role.attrib
+pagenums = element pagenums { pagenums.attlist, docinfo.char.mix* }
+# end of pagenums.element
+pagenums.attlist &=
+  common.attrib, pagenums.role.attrib, local.pagenums.attrib
+# end of pagenums.attlist
+
+# end of pagenums.module
+
+# Personal identity elements .......
+
+# These elements are used only within Author, Editor, and
+# OtherCredit.
+local.contrib.attrib = empty
+contrib.role.attrib = role.attrib
+contrib = element contrib { contrib.attlist, docinfo.char.mix* }
+# end of contrib.element
+contrib.attlist &=
+  common.attrib, contrib.role.attrib, local.contrib.attrib
+# end of contrib.attlist
+
+# end of contrib.module
+local.firstname.attrib = empty
+firstname.role.attrib = role.attrib
+firstname = element firstname { firstname.attlist, docinfo.char.mix* }
+# end of firstname.element
+firstname.attlist &=
+  common.attrib, firstname.role.attrib, local.firstname.attrib
+# end of firstname.attlist
+
+# end of firstname.module
+local.honorific.attrib = empty
+honorific.role.attrib = role.attrib
+honorific = element honorific { honorific.attlist, docinfo.char.mix* }
+# end of honorific.element
+honorific.attlist &=
+  common.attrib, honorific.role.attrib, local.honorific.attrib
+# end of honorific.attlist
+
+# end of honorific.module
+local.lineage.attrib = empty
+lineage.role.attrib = role.attrib
+lineage = element lineage { lineage.attlist, docinfo.char.mix* }
+# end of lineage.element
+lineage.attlist &=
+  common.attrib, lineage.role.attrib, local.lineage.attrib
+# end of lineage.attlist
+
+# end of lineage.module
+local.othername.attrib = empty
+othername.role.attrib = role.attrib
+othername = element othername { othername.attlist, docinfo.char.mix* }
+# end of othername.element
+othername.attlist &=
+  common.attrib, othername.role.attrib, local.othername.attrib
+# end of othername.attlist
+
+# end of othername.module
+local.surname.attrib = empty
+surname.role.attrib = role.attrib
+surname = element surname { surname.attlist, docinfo.char.mix* }
+# end of surname.element
+surname.attlist &=
+  common.attrib, surname.role.attrib, local.surname.attrib
+# end of surname.attlist
+
+# end of surname.module
+
+# end of person.ident.module
+
+# PrintHistory .....................
+local.printhistory.attrib = empty
+printhistory.role.attrib = role.attrib
+printhistory =
+  element printhistory { printhistory.attlist, para.class+ }
+# end of printhistory.element
+printhistory.attlist &=
+  common.attrib, printhistory.role.attrib, local.printhistory.attrib
+# end of printhistory.attlist
+
+# end of printhistory.module
+
+# ProductName ......................
+local.productname.attrib = empty
+productname.role.attrib = role.attrib
+productname =
+  element productname { productname.attlist, para.char.mix* }
+# end of productname.element
+
+# Class: More precisely identifies the item the element names
+productname.attlist &=
+  [ a:defaultValue = "trade" ]
+  attribute class { "service" | "trade" | "registered" | "copyright" }?,
+  common.attrib,
+  productname.role.attrib,
+  local.productname.attrib
+# end of productname.attlist
+
+# end of productname.module
+
+# ProductNumber ....................
+local.productnumber.attrib = empty
+productnumber.role.attrib = role.attrib
+productnumber =
+  element productnumber { productnumber.attlist, docinfo.char.mix* }
+# end of productnumber.element
+productnumber.attlist &=
+  common.attrib, productnumber.role.attrib, local.productnumber.attrib
+# end of productnumber.attlist
+
+# end of productnumber.module
+
+# PubDate ..........................
+local.pubdate.attrib = empty
+pubdate.role.attrib = role.attrib
+pubdate = element pubdate { pubdate.attlist, docinfo.char.mix* }
+# end of pubdate.element
+pubdate.attlist &=
+  common.attrib, pubdate.role.attrib, local.pubdate.attrib
+# end of pubdate.attlist
+
+# end of pubdate.module
+
+# Publisher ........................
+local.publisher.attrib = empty
+publisher.role.attrib = role.attrib
+publisher =
+  element publisher { publisher.attlist, publishername, address* }
+# end of publisher.element
+publisher.attlist &=
+  common.attrib, publisher.role.attrib, local.publisher.attrib
+# end of publisher.attlist
+
+# end of publisher.module
+local.publishername.attrib = empty
+publishername.role.attrib = role.attrib
+publishername =
+  element publishername { publishername.attlist, docinfo.char.mix* }
+# end of publishername.element
+publishername.attlist &=
+  common.attrib, publishername.role.attrib, local.publishername.attrib
+# end of publishername.attlist
+
+# end of publishername.module
+
+#  Address (defined elsewhere in this section)
+
+# end of publisher.content.module
+
+# PubsNumber .......................
+local.pubsnumber.attrib = empty
+pubsnumber.role.attrib = role.attrib
+pubsnumber =
+  element pubsnumber { pubsnumber.attlist, docinfo.char.mix* }
+# end of pubsnumber.element
+pubsnumber.attlist &=
+  common.attrib, pubsnumber.role.attrib, local.pubsnumber.attrib
+# end of pubsnumber.attlist
+
+# end of pubsnumber.module
+
+# ReleaseInfo ......................
+local.releaseinfo.attrib = empty
+releaseinfo.role.attrib = role.attrib
+releaseinfo =
+  element releaseinfo { releaseinfo.attlist, docinfo.char.mix* }
+# end of releaseinfo.element
+releaseinfo.attlist &=
+  common.attrib, releaseinfo.role.attrib, local.releaseinfo.attrib
+# end of releaseinfo.attlist
+
+# end of releaseinfo.module
+
+# RevHistory .......................
+local.revhistory.attrib = empty
+revhistory.role.attrib = role.attrib
+revhistory = element revhistory { revhistory.attlist, revision+ }
+# end of revhistory.element
+revhistory.attlist &=
+  common.attrib, revhistory.role.attrib, local.revhistory.attrib
+# end of revhistory.attlist
+
+# end of revhistory.module
+local.revision.attrib = empty
+revision.role.attrib = role.attrib
+revision =
+  element revision {
+    revision.attlist,
+    revnumber,
+    date,
+    authorinitials*,
+    (revremark | revdescription)?
+  }
+# end of revision.element
+revision.attlist &=
+  common.attrib, revision.role.attrib, local.revision.attrib
+# end of revision.attlist
+
+# end of revision.module
+local.revnumber.attrib = empty
+revnumber.role.attrib = role.attrib
+revnumber = element revnumber { revnumber.attlist, docinfo.char.mix* }
+# end of revnumber.element
+revnumber.attlist &=
+  common.attrib, revnumber.role.attrib, local.revnumber.attrib
+# end of revnumber.attlist
+
+# end of revnumber.module
+
+#  Date (defined elsewhere in this section)
+
+#  AuthorInitials (defined elsewhere in this section)
+local.revremark.attrib = empty
+revremark.role.attrib = role.attrib
+revremark = element revremark { revremark.attlist, docinfo.char.mix* }
+# end of revremark.element
+revremark.attlist &=
+  common.attrib, revremark.role.attrib, local.revremark.attrib
+# end of revremark.attlist
+
+# end of revremark.module
+local.revdescription.attrib = empty
+revdescription.role.attrib = role.attrib
+revdescription =
+  element revdescription { revdescription.attlist, revdescription.mix+ }
+# end of revdescription.element
+revdescription.attlist &=
+  common.attrib, revdescription.role.attrib, local.revdescription.attrib
+# end of revdescription.attlist
+
+# end of revdescription.module
+
+# end of revhistory.content.module
+
+# SeriesVolNums ....................
+local.seriesvolnums.attrib = empty
+seriesvolnums.role.attrib = role.attrib
+seriesvolnums =
+  element seriesvolnums { seriesvolnums.attlist, docinfo.char.mix* }
+# end of seriesvolnums.element
+seriesvolnums.attlist &=
+  common.attrib, seriesvolnums.role.attrib, local.seriesvolnums.attrib
+# end of seriesvolnums.attlist
+
+# end of seriesvolnums.module
+
+# VolumeNum ........................
+local.volumenum.attrib = empty
+volumenum.role.attrib = role.attrib
+volumenum = element volumenum { volumenum.attlist, docinfo.char.mix* }
+# end of volumenum.element
+volumenum.attlist &=
+  common.attrib, volumenum.role.attrib, local.volumenum.attrib
+# end of volumenum.attlist
+
+# end of volumenum.module
+
+# ..................................
+
+# end of docinfo.content.module
+
+# ......................................................................
+
+# Inline, link, and ubiquitous elements ................................
+
+# Technical and computer terms .........................................
+local.accel.attrib = empty
+accel.role.attrib = role.attrib
+accel = element accel { accel.attlist, smallcptr.char.mix* }
+# end of accel.element
+accel.attlist &= common.attrib, accel.role.attrib, local.accel.attrib
+# end of accel.attlist
+
+# end of accel.module
+local.action.attrib = empty
+action.role.attrib = role.attrib
+action = element action { action.attlist, cptr.char.mix* }
+# end of action.element
+action.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  action.role.attrib,
+  local.action.attrib
+# end of action.attlist
+
+# end of action.module
+local.application.attrib = empty
+application.role.attrib = role.attrib
+application =
+  element application { application.attlist, para.char.mix* }
+# end of application.element
+application.attlist &=
+  attribute class { "hardware" | "software" }?,
+  moreinfo.attrib,
+  common.attrib,
+  application.role.attrib,
+  local.application.attrib
+# end of application.attlist
+
+# end of application.module
+local.classname.attrib = empty
+classname.role.attrib = role.attrib
+classname = element classname { classname.attlist, smallcptr.char.mix* }
+# end of classname.element
+classname.attlist &=
+  common.attrib, classname.role.attrib, local.classname.attrib
+# end of classname.attlist
+
+# end of classname.module
+local.co.attrib = empty
+# CO is a callout area of the LineColumn unit type (a single character
+# position); the position is directly indicated by the location of CO.
+co.role.attrib = role.attrib
+co = element co { co.attlist, empty }
+# end of co.element
+
+# bug number/symbol override or initialization
+
+# to any related information
+co.attlist &=
+  label.attrib,
+  linkends.attrib,
+  idreq.common.attrib,
+  co.role.attrib,
+  local.co.attrib
+# end of co.attlist
+
+# end of co.module
+local.coref.attrib = empty
+# COREF is a reference to a CO
+coref.role.attrib = role.attrib
+coref = element coref { coref.attlist, empty }
+# end of coref.element
+
+# bug number/symbol override or initialization
+
+# to any related information
+coref.attlist &=
+  label.attrib,
+  linkendreq.attrib,
+  common.attrib,
+  coref.role.attrib,
+  local.coref.attrib
+# end of coref.attlist
+
+# end of coref.module
+local.command.attrib = empty
+command.role.attrib = role.attrib
+command = element command { command.attlist, cptr.char.mix* }
+# end of command.element
+command.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  command.role.attrib,
+  local.command.attrib
+# end of command.attlist
+
+# end of command.module
+local.computeroutput.attrib = empty
+computeroutput.role.attrib = role.attrib
+computeroutput =
+  element computeroutput {
+    computeroutput.attlist, (cptr.char.mix | co)*
+  }
+# end of computeroutput.element
+computeroutput.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  computeroutput.role.attrib,
+  local.computeroutput.attrib
+# end of computeroutput.attlist
+
+# end of computeroutput.module
+local.database.attrib = empty
+database.role.attrib = role.attrib
+database = element database { database.attlist, cptr.char.mix* }
+# end of database.element
+
+# Class: Type of database the element names; no default
+database.attlist &=
+  attribute class {
+    "name" | "table" | "field" | "key1" | "key2" | "record"
+  }?,
+  moreinfo.attrib,
+  common.attrib,
+  database.role.attrib,
+  local.database.attrib
+# end of database.attlist
+
+# end of database.module
+local.email.attrib = empty
+email.role.attrib = role.attrib
+email = element email { email.attlist, docinfo.char.mix* }
+# end of email.element
+email.attlist &= common.attrib, email.role.attrib, local.email.attrib
+# end of email.attlist
+
+# end of email.module
+local.envar.attrib = empty
+envar.role.attrib = role.attrib
+envar = element envar { envar.attlist, smallcptr.char.mix* }
+# end of envar.element
+envar.attlist &= common.attrib, envar.role.attrib, local.envar.attrib
+# end of envar.attlist
+
+# end of envar.module
+local.errorcode.attrib = empty
+errorcode.role.attrib = role.attrib
+errorcode = element errorcode { errorcode.attlist, smallcptr.char.mix* }
+# end of errorcode.element
+errorcode.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  errorcode.role.attrib,
+  local.errorcode.attrib
+# end of errorcode.attlist
+
+# end of errorcode.module
+local.errorname.attrib = empty
+errorname.role.attrib = role.attrib
+errorname = element errorname { errorname.attlist, smallcptr.char.mix* }
+# end of errorname.element
+errorname.attlist &=
+  common.attrib, errorname.role.attrib, local.errorname.attrib
+# end of errorname.attlist
+
+# end of errorname.module
+local.errortext.attrib = empty
+errortext.role.attrib = role.attrib
+errortext = element errortext { errortext.attlist, smallcptr.char.mix* }
+# end of errortext.element
+errortext.attlist &=
+  common.attrib, errortext.role.attrib, local.errortext.attrib
+# end of errortext.attlist
+
+# end of errortext.module
+local.errortype.attrib = empty
+errortype.role.attrib = role.attrib
+errortype = element errortype { errortype.attlist, smallcptr.char.mix* }
+# end of errortype.element
+errortype.attlist &=
+  common.attrib, errortype.role.attrib, local.errortype.attrib
+# end of errortype.attlist
+
+# end of errortype.module
+local.filename.attrib = empty
+filename.role.attrib = role.attrib
+filename = element filename { filename.attlist, cptr.char.mix* }
+# end of filename.element
+
+# Class: Type of filename the element names; no default
+
+# Path: Search path (possibly system-specific) in which
+# file can be found
+filename.attlist &=
+  attribute class {
+    "headerfile"
+    | "partition"
+    | "devicefile"
+    | "libraryfile"
+    | "directory"
+    | "extension"
+    | "symlink"
+  }?,
+  attribute path { text }?,
+  moreinfo.attrib,
+  common.attrib,
+  filename.role.attrib,
+  local.filename.attrib
+# end of filename.attlist
+
+# end of filename.module
+local.function.attrib = empty
+function.role.attrib = role.attrib
+function = element function { function.attlist, cptr.char.mix* }
+# end of function.element
+function.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  function.role.attrib,
+  local.function.attrib
+# end of function.attlist
+
+# end of function.module
+local.guibutton.attrib = empty
+guibutton.role.attrib = role.attrib
+guibutton =
+  element guibutton { guibutton.attlist, (smallcptr.char.mix | accel)* }
+# end of guibutton.element
+guibutton.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guibutton.role.attrib,
+  local.guibutton.attrib
+# end of guibutton.attlist
+
+# end of guibutton.module
+local.guiicon.attrib = empty
+guiicon.role.attrib = role.attrib
+guiicon =
+  element guiicon { guiicon.attlist, (smallcptr.char.mix | accel)* }
+# end of guiicon.element
+guiicon.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guiicon.role.attrib,
+  local.guiicon.attrib
+# end of guiicon.attlist
+
+# end of guiicon.module
+local.guilabel.attrib = empty
+guilabel.role.attrib = role.attrib
+guilabel =
+  element guilabel { guilabel.attlist, (smallcptr.char.mix | accel)* }
+# end of guilabel.element
+guilabel.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guilabel.role.attrib,
+  local.guilabel.attrib
+# end of guilabel.attlist
+
+# end of guilabel.module
+local.guimenu.attrib = empty
+guimenu.role.attrib = role.attrib
+guimenu =
+  element guimenu { guimenu.attlist, (smallcptr.char.mix | accel)* }
+# end of guimenu.element
+guimenu.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guimenu.role.attrib,
+  local.guimenu.attrib
+# end of guimenu.attlist
+
+# end of guimenu.module
+local.guimenuitem.attrib = empty
+guimenuitem.role.attrib = role.attrib
+guimenuitem =
+  element guimenuitem {
+    guimenuitem.attlist, (smallcptr.char.mix | accel)*
+  }
+# end of guimenuitem.element
+guimenuitem.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guimenuitem.role.attrib,
+  local.guimenuitem.attrib
+# end of guimenuitem.attlist
+
+# end of guimenuitem.module
+local.guisubmenu.attrib = empty
+guisubmenu.role.attrib = role.attrib
+guisubmenu =
+  element guisubmenu {
+    guisubmenu.attlist, (smallcptr.char.mix | accel)*
+  }
+# end of guisubmenu.element
+guisubmenu.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  guisubmenu.role.attrib,
+  local.guisubmenu.attrib
+# end of guisubmenu.attlist
+
+# end of guisubmenu.module
+local.hardware.attrib = empty
+hardware.role.attrib = role.attrib
+hardware = element hardware { hardware.attlist, cptr.char.mix* }
+# end of hardware.element
+hardware.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  hardware.role.attrib,
+  local.hardware.attrib
+# end of hardware.attlist
+
+# end of hardware.module
+local.interface.attrib = empty
+interface.role.attrib = role.attrib
+interface =
+  element interface { interface.attlist, (smallcptr.char.mix | accel)* }
+# end of interface.element
+
+# Class: Type of the Interface item; no default
+interface.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  interface.role.attrib,
+  local.interface.attrib
+# end of interface.attlist
+
+# end of interface.module
+local.keycap.attrib = empty
+keycap.role.attrib = role.attrib
+keycap = element keycap { keycap.attlist, cptr.char.mix* }
+# end of keycap.element
+keycap.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  keycap.role.attrib,
+  local.keycap.attrib
+# end of keycap.attlist
+
+# end of keycap.module
+local.keycode.attrib = empty
+keycode.role.attrib = role.attrib
+keycode = element keycode { keycode.attlist, smallcptr.char.mix* }
+# end of keycode.element
+keycode.attlist &=
+  common.attrib, keycode.role.attrib, local.keycode.attrib
+# end of keycode.attlist
+
+# end of keycode.module
+local.keycombo.attrib = empty
+keycombo.role.attrib = role.attrib
+keycombo =
+  element keycombo {
+    keycombo.attlist, (keycap | keycombo | keysym | mousebutton)+
+  }
+# end of keycombo.element
+keycombo.attlist &=
+  keyaction.attrib,
+  moreinfo.attrib,
+  common.attrib,
+  keycombo.role.attrib,
+  local.keycombo.attrib
+# end of keycombo.attlist
+
+# end of keycombo.module
+local.keysym.attrib = empty
+keysysm.role.attrib = role.attrib
+keysym = element keysym { keysym.attlist, smallcptr.char.mix* }
+# end of keysym.element
+keysym.attlist &=
+  common.attrib, keysysm.role.attrib, local.keysym.attrib
+# end of keysym.attlist
+
+# end of keysym.module
+local.lineannotation.attrib = empty
+lineannotation.role.attrib = role.attrib
+lineannotation =
+  element lineannotation { lineannotation.attlist, para.char.mix* }
+# end of lineannotation.element
+lineannotation.attlist &=
+  common.attrib, lineannotation.role.attrib, local.lineannotation.attrib
+# end of lineannotation.attlist
+
+# end of lineannotation.module
+local.literal.attrib = empty
+literal.role.attrib = role.attrib
+literal = element literal { literal.attlist, cptr.char.mix* }
+# end of literal.element
+literal.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  literal.role.attrib,
+  local.literal.attrib
+# end of literal.attlist
+
+# end of literal.module
+local.constant.attrib = empty
+constant.role.attrib = role.attrib
+constant = element constant { constant.attlist, smallcptr.char.mix* }
+# end of constant.element
+constant.attlist &=
+  attribute class { "limit" }?,
+  common.attrib,
+  constant.role.attrib,
+  local.constant.attrib
+# end of constant.attlist
+
+# end of constant.module
+local.varname.attrib = empty
+varname.role.attrib = role.attrib
+varname = element varname { varname.attlist, smallcptr.char.mix* }
+# end of varname.element
+varname.attlist &=
+  common.attrib, varname.role.attrib, local.varname.attrib
+# end of varname.attlist
+
+# end of varname.module
+local.markup.attrib = empty
+markup.role.attrib = role.attrib
+markup = element markup { markup.attlist, smallcptr.char.mix* }
+# end of markup.element
+markup.attlist &= common.attrib, markup.role.attrib, local.markup.attrib
+# end of markup.attlist
+
+# end of markup.module
+local.medialabel.attrib = empty
+medialabel.role.attrib = role.attrib
+medialabel =
+  element medialabel { medialabel.attlist, smallcptr.char.mix* }
+# end of medialabel.element
+
+# Class: Type of medium named by the element; no default
+medialabel.attlist &=
+  attribute class { "cartridge" | "cdrom" | "disk" | "tape" }?,
+  common.attrib,
+  medialabel.role.attrib,
+  local.medialabel.attrib
+# end of medialabel.attlist
+
+# end of medialabel.module
+local.menuchoice.attrib = empty
+menuchoice.role.attrib = role.attrib
+menuchoice =
+  element menuchoice {
+    menuchoice.attlist,
+    shortcut?,
+    (guibutton
+     | guiicon
+     | guilabel
+     | guimenu
+     | guimenuitem
+     | guisubmenu
+     | interface)+
+  }
+# end of menuchoice.element
+menuchoice.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  menuchoice.role.attrib,
+  local.menuchoice.attrib
+# end of menuchoice.attlist
+
+# end of menuchoice.module
+
+# See also KeyCombo
+local.shortcut.attrib = empty
+shortcut.role.attrib = role.attrib
+shortcut =
+  element shortcut {
+    shortcut.attlist, (keycap | keycombo | keysym | mousebutton)+
+  }
+# end of shortcut.element
+shortcut.attlist &=
+  keyaction.attrib,
+  moreinfo.attrib,
+  common.attrib,
+  shortcut.role.attrib,
+  local.shortcut.attrib
+# end of shortcut.attlist
+
+# end of shortcut.module
+
+# end of menuchoice.content.module
+local.mousebutton.attrib = empty
+mousebutton.role.attrib = role.attrib
+mousebutton =
+  element mousebutton { mousebutton.attlist, smallcptr.char.mix* }
+# end of mousebutton.element
+mousebutton.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  mousebutton.role.attrib,
+  local.mousebutton.attrib
+# end of mousebutton.attlist
+
+# end of mousebutton.module
+local.msgtext.attrib = empty
+msgtext.role.attrib = role.attrib
+msgtext = element msgtext { msgtext.attlist, component.mix+ }
+# end of msgtext.element
+msgtext.attlist &=
+  common.attrib, msgtext.role.attrib, local.msgtext.attrib
+# end of msgtext.attlist
+
+# end of msgtext.module
+local.option.attrib = empty
+option.role.attrib = role.attrib
+option = element option { option.attlist, cptr.char.mix* }
+# end of option.element
+option.attlist &= common.attrib, option.role.attrib, local.option.attrib
+# end of option.attlist
+
+# end of option.module
+local.optional.attrib = empty
+optional.role.attrib = role.attrib
+optional = element optional { optional.attlist, cptr.char.mix* }
+# end of optional.element
+optional.attlist &=
+  common.attrib, optional.role.attrib, local.optional.attrib
+# end of optional.attlist
+
+# end of optional.module
+local.parameter.attrib = empty
+parameter.role.attrib = role.attrib
+parameter = element parameter { parameter.attlist, cptr.char.mix* }
+# end of parameter.element
+
+# Class: Type of the Parameter; no default
+parameter.attlist &=
+  attribute class { "command" | "function" | "option" }?,
+  moreinfo.attrib,
+  common.attrib,
+  parameter.role.attrib,
+  local.parameter.attrib
+# end of parameter.attlist
+
+# end of parameter.module
+local.prompt.attrib = empty
+prompt.role.attrib = role.attrib
+prompt = element prompt { prompt.attlist, (smallcptr.char.mix | co)* }
+# end of prompt.element
+prompt.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  prompt.role.attrib,
+  local.prompt.attrib
+# end of prompt.attlist
+
+# end of prompt.module
+local.property.attrib = empty
+property.role.attrib = role.attrib
+property = element property { property.attlist, cptr.char.mix* }
+# end of property.element
+property.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  property.role.attrib,
+  local.property.attrib
+# end of property.attlist
+
+# end of property.module
+local.replaceable.attrib = empty
+replaceable.role.attrib = role.attrib
+replaceable =
+  element replaceable {
+    replaceable.attlist,
+    (text
+     | link.char.class
+     | optional
+     | base.char.class
+     | other.char.class
+     | inlinegraphic
+     | inlinemediaobject
+     | co)*
+  }
+# end of replaceable.element
+
+# Class: Type of information the element represents; no
+# default
+replaceable.attlist &=
+  attribute class { "command" | "function" | "option" | "parameter" }?,
+  common.attrib,
+  replaceable.role.attrib,
+  local.replaceable.attrib
+# end of replaceable.attlist
+
+# end of replaceable.module
+local.returnvalue.attrib = empty
+returnvalue.role.attrib = role.attrib
+returnvalue =
+  element returnvalue { returnvalue.attlist, smallcptr.char.mix* }
+# end of returnvalue.element
+returnvalue.attlist &=
+  common.attrib, returnvalue.role.attrib, local.returnvalue.attrib
+# end of returnvalue.attlist
+
+# end of returnvalue.module
+local.sgmltag.attrib = empty
+sgmltag.role.attrib = role.attrib
+sgmltag = element sgmltag { sgmltag.attlist, smallcptr.char.mix* }
+# end of sgmltag.element
+
+# Class: Type of SGML construct the element names; no default
+sgmltag.attlist &=
+  attribute class {
+    "attribute"
+    | "attvalue"
+    | "element"
+    | "endtag"
+    | "emptytag"
+    | "genentity"
+    | "numcharref"
+    | "paramentity"
+    | "pi"
+    | "xmlpi"
+    | "starttag"
+    | "sgmlcomment"
+  }?,
+  common.attrib,
+  sgmltag.role.attrib,
+  local.sgmltag.attrib
+# end of sgmltag.attlist
+
+# end of sgmltag.module
+local.structfield.attrib = empty
+structfield.role.attrib = role.attrib
+structfield =
+  element structfield { structfield.attlist, smallcptr.char.mix* }
+# end of structfield.element
+structfield.attlist &=
+  common.attrib, structfield.role.attrib, local.structfield.attrib
+# end of structfield.attlist
+
+# end of structfield.module
+local.structname.attrib = empty
+structname.role.attrib = role.attrib
+structname =
+  element structname { structname.attlist, smallcptr.char.mix* }
+# end of structname.element
+structname.attlist &=
+  common.attrib, structname.role.attrib, local.structname.attrib
+# end of structname.attlist
+
+# end of structname.module
+local.symbol.attrib = empty
+symbol.role.attrib = role.attrib
+symbol = element symbol { symbol.attlist, smallcptr.char.mix* }
+# end of symbol.element
+
+# Class: Type of symbol; no default
+symbol.attlist &=
+  attribute class { "limit" }?,
+  common.attrib,
+  symbol.role.attrib,
+  local.symbol.attrib
+# end of symbol.attlist
+
+# end of symbol.module
+local.systemitem.attrib = empty
+systemitem.role.attrib = role.attrib
+systemitem =
+  element systemitem {
+    systemitem.attlist, (cptr.char.mix | acronym | co)*
+  }
+# end of systemitem.element
+
+# Class: Type of system item the element names; no default
+systemitem.attlist &=
+  attribute class {
+    "constant"
+    | "event"
+    | "eventhandler"
+    | "domainname"
+    | "fqdomainname"
+    | "ipaddress"
+    | "netmask"
+    | "etheraddress"
+    | "groupname"
+    | "library"
+    | "macro"
+    | "osname"
+    | "filesystem"
+    | "resource"
+    | "systemname"
+    | "username"
+    | "newsgroup"
+  }?,
+  moreinfo.attrib,
+  common.attrib,
+  systemitem.role.attrib,
+  local.systemitem.attrib
+# end of systemitem.attlist
+
+# end of systemitem.module
+local.token.attrib = empty
+token.role.attrib = role.attrib
+\token = element token { token.attlist, smallcptr.char.mix* }
+# end of token.element
+token.attlist &= common.attrib, token.role.attrib, local.token.attrib
+# end of token.attlist
+
+# end of token.module
+local.type.attrib = empty
+type.role.attrib = role.attrib
+type = element type { type.attlist, smallcptr.char.mix* }
+# end of type.element
+type.attlist &= common.attrib, type.role.attrib, local.type.attrib
+# end of type.attlist
+
+# end of type.module
+local.userinput.attrib = empty
+userinput.role.attrib = role.attrib
+userinput =
+  element userinput { userinput.attlist, (cptr.char.mix | co)* }
+# end of userinput.element
+userinput.attlist &=
+  moreinfo.attrib,
+  common.attrib,
+  userinput.role.attrib,
+  local.userinput.attrib
+# end of userinput.attlist
+
+# end of userinput.module
+
+# General words and phrases ............................................
+local.abbrev.attrib = empty
+abbrev.role.attrib = role.attrib
+abbrev = element abbrev { abbrev.attlist, word.char.mix* }
+# end of abbrev.element
+abbrev.attlist &= common.attrib, abbrev.role.attrib, local.abbrev.attrib
+# end of abbrev.attlist
+
+# end of abbrev.module
+local.acronym.attrib = empty
+acronym.role.attrib = role.attrib
+acronym = element acronym { acronym.attlist, word.char.mix* }
+# end of acronym.element
+acronym.attlist &=
+  common.attrib, acronym.role.attrib, local.acronym.attrib
+# end of acronym.attlist
+
+# end of acronym.module
+local.citation.attrib = empty
+citation.role.attrib = role.attrib
+citation = element citation { citation.attlist, para.char.mix* }
+# end of citation.element
+citation.attlist &=
+  common.attrib, citation.role.attrib, local.citation.attrib
+# end of citation.attlist
+
+# end of citation.module
+local.citerefentry.attrib = empty
+citerefentry.role.attrib = role.attrib
+citerefentry =
+  element citerefentry {
+    citerefentry.attlist, refentrytitle, manvolnum?
+  }
+# end of citerefentry.element
+citerefentry.attlist &=
+  common.attrib, citerefentry.role.attrib, local.citerefentry.attrib
+# end of citerefentry.attlist
+
+# end of citerefentry.module
+local.refentrytitle.attrib = empty
+refentrytitle.role.attrib = role.attrib
+refentrytitle =
+  element refentrytitle { refentrytitle.attlist, para.char.mix* }
+# end of refentrytitle.element
+refentrytitle.attlist &=
+  common.attrib, refentrytitle.role.attrib, local.refentrytitle.attrib
+# end of refentrytitle.attlist
+
+# end of refentrytitle.module
+local.manvolnum.attrib = empty
+namvolnum.role.attrib = role.attrib
+manvolnum = element manvolnum { manvolnum.attlist, word.char.mix* }
+# end of manvolnum.element
+manvolnum.attlist &=
+  common.attrib, namvolnum.role.attrib, local.manvolnum.attrib
+# end of manvolnum.attlist
+
+# end of manvolnum.module
+local.citetitle.attrib = empty
+citetitle.role.attrib = role.attrib
+citetitle = element citetitle { citetitle.attlist, para.char.mix* }
+# end of citetitle.element
+
+# Pubwork: Genre of published work cited; no default
+citetitle.attlist &=
+  attribute pubwork {
+    "article"
+    | "book"
+    | "chapter"
+    | "part"
+    | "refentry"
+    | "section"
+    | "journal"
+    | "series"
+    | "set"
+    | "manuscript"
+  }?,
+  common.attrib,
+  citetitle.role.attrib,
+  local.citetitle.attrib
+# end of citetitle.attlist
+
+# end of citetitle.module
+local.emphasis.attrib = empty
+emphasis.role.attrib = role.attrib
+emphasis = element emphasis { emphasis.attlist, para.char.mix* }
+# end of emphasis.element
+emphasis.attlist &=
+  common.attrib, emphasis.role.attrib, local.emphasis.attrib
+# end of emphasis.attlist
+
+# end of emphasis.module
+local.firstterm.attrib = empty
+firstterm.role.attrib = role.attrib
+firstterm = element firstterm { firstterm.attlist, word.char.mix* }
+# end of firstterm.element
+
+# to GlossEntry or other explanation
+firstterm.attlist &=
+  linkend.attrib,
+  common.attrib,
+  firstterm.role.attrib,
+  local.firstterm.attrib
+# end of firstterm.attlist
+
+# end of firstterm.module
+local.foreignphrase.attrib = empty
+foreignphrase.role.attrib = role.attrib
+foreignphrase =
+  element foreignphrase { foreignphrase.attlist, para.char.mix* }
+# end of foreignphrase.element
+foreignphrase.attlist &=
+  common.attrib, foreignphrase.role.attrib, local.foreignphrase.attrib
+# end of foreignphrase.attlist
+
+# end of foreignphrase.module
+local.glossterm.attrib = empty
+glossterm.role.attrib = role.attrib
+glossterm = element glossterm { glossterm.attlist, para.char.mix* }
+# end of glossterm.element
+
+# to GlossEntry if Glossterm used in text
+
+# BaseForm: Provides the form of GlossTerm to be used
+# for indexing
+glossterm.attlist &=
+  linkend.attrib,
+  attribute baseform { text }?,
+  common.attrib,
+  glossterm.role.attrib,
+  local.glossterm.attrib
+# end of glossterm.attlist
+
+# end of glossterm.module
+local.phrase.attrib = empty
+phrase.role.attrib = role.attrib
+phrase = element phrase { phrase.attlist, para.char.mix* }
+# end of phrase.element
+phrase.attlist &= common.attrib, phrase.role.attrib, local.phrase.attrib
+# end of phrase.attlist
+
+# end of phrase.module
+local.quote.attrib = empty
+quote.role.attrib = role.attrib
+quote = element quote { quote.attlist, para.char.mix* }
+# end of quote.element
+quote.attlist &= common.attrib, quote.role.attrib, local.quote.attrib
+# end of quote.attlist
+
+# end of quote.module
+local.ssscript.attrib = empty
+ssscript.role.attrib = role.attrib
+subscript =
+  element subscript {
+    subscript.attlist,
+    (text
+     | link.char.class
+     | emphasis
+     | replaceable
+     | symbol
+     | inlinegraphic
+     | inlinemediaobject
+     | base.char.class
+     | other.char.class)*
+  }
+# end of subscript.element
+subscript.attlist &=
+  common.attrib, ssscript.role.attrib, local.ssscript.attrib
+# end of subscript.attlist
+superscript =
+  element superscript {
+    superscript.attlist,
+    (text
+     | link.char.class
+     | emphasis
+     | replaceable
+     | symbol
+     | inlinegraphic
+     | inlinemediaobject
+     | base.char.class
+     | other.char.class)*
+  }
+# end of superscript.element
+superscript.attlist &=
+  common.attrib, ssscript.role.attrib, local.ssscript.attrib
+# end of superscript.attlist
+
+# end of ssscript.module
+local.trademark.attrib = empty
+trademark.role.attrib = role.attrib
+trademark =
+  element trademark {
+    trademark.attlist,
+    (text
+     | link.char.class
+     | tech.char.class
+     | base.char.class
+     | other.char.class
+     | inlinegraphic
+     | inlinemediaobject
+     | emphasis)*
+  }
+# end of trademark.element
+
+# Class: More precisely identifies the item the element names
+trademark.attlist &=
+  [ a:defaultValue = "trade" ]
+  attribute class { "service" | "trade" | "registered" | "copyright" }?,
+  common.attrib,
+  trademark.role.attrib,
+  local.trademark.attrib
+# end of trademark.attlist
+
+# end of trademark.module
+local.wordasword.attrib = empty
+wordasword.role.attrib = role.attrib
+wordasword = element wordasword { wordasword.attlist, word.char.mix* }
+# end of wordasword.element
+wordasword.attlist &=
+  common.attrib, wordasword.role.attrib, local.wordasword.attrib
+# end of wordasword.attlist
+
+# end of wordasword.module
+
+# Links and cross-references ...........................................
+local.link.attrib = empty
+link.role.attrib = role.attrib
+link = element link { link.attlist, para.char.mix* }
+# end of link.element
+
+# Endterm: ID of element containing text that is to be
+# fetched from elsewhere in the document to appear as
+# the content of this element
+
+# to linked-to object
+
+# Type: Freely assignable parameter
+link.attlist &=
+  attribute endterm { xsd:IDREF }?,
+  linkendreq.attrib,
+  attribute type { text }?,
+  common.attrib,
+  link.role.attrib,
+  local.link.attrib
+# end of link.attlist
+
+# end of link.module
+local.olink.attrib = empty
+olink.role.attrib = role.attrib
+olink = element olink { olink.attlist, para.char.mix* }
+# end of olink.element
+
+# TargetDocEnt: Name of an entity to be the target of the link
+
+# LinkMode: ID of a ModeSpec containing instructions for
+# operating on the entity named by TargetDocEnt
+
+# LocalInfo: Information that may be passed to ModeSpec
+
+# Type: Freely assignable parameter
+olink.attlist &=
+  attribute targetdocent { xsd:ENTITY }?,
+  attribute linkmode { xsd:IDREF }?,
+  attribute localinfo { text }?,
+  attribute type { text }?,
+  attribute targetdoc { text }?,
+  attribute targetptr { text }?,
+  common.attrib,
+  olink.role.attrib,
+  local.olink.attrib
+# end of olink.attlist
+
+# end of olink.module
+local.ulink.attrib = empty
+ulink.role.attrib = role.attrib
+ulink = element ulink { ulink.attlist, para.char.mix* }
+# end of ulink.element
+
+# URL: uniform resource locator; the target of the ULink
+
+# Type: Freely assignable parameter
+ulink.attlist &=
+  attribute url { text },
+  attribute type { text }?,
+  common.attrib,
+  ulink.role.attrib,
+  local.ulink.attrib
+# end of ulink.attlist
+
+# end of ulink.module
+local.footnoteref.attrib = empty
+footnoteref.role.attrib = role.attrib
+footnoteref = element footnoteref { footnoteref.attlist, empty }
+# end of footnoteref.element
+
+# to footnote content supplied elsewhere
+footnoteref.attlist &=
+  linkendreq.attrib,
+  label.attrib,
+  common.attrib,
+  footnoteref.role.attrib,
+  local.footnoteref.attrib
+# end of footnoteref.attlist
+
+# end of footnoteref.module
+local.xref.attrib = empty
+xref.role.attrib = role.attrib
+xref = element xref { xref.attlist, empty }
+# end of xref.element
+
+# Endterm: ID of element containing text that is to be
+# fetched from elsewhere in the document to appear as
+# the content of this element
+
+# to linked-to object
+xref.attlist &=
+  attribute endterm { xsd:IDREF }?,
+  linkendreq.attrib,
+  common.attrib,
+  xref.role.attrib,
+  local.xref.attrib
+# end of xref.attlist
+
+# end of xref.module
+
+# Ubiquitous elements ..................................................
+local.anchor.attrib = empty
+anchor.role.attrib = role.attrib
+anchor = element anchor { anchor.attlist, empty }
+# end of anchor.element
+
+# required
+
+# replaces Lang
+anchor.attlist &=
+  idreq.attrib,
+  pagenum.attrib,
+  remap.attrib,
+  xreflabel.attrib,
+  revisionflag.attrib,
+  effectivity.attrib,
+  anchor.role.attrib,
+  local.anchor.attrib
+# end of anchor.attlist
+
+# end of anchor.module
+local.beginpage.attrib = empty
+beginpage.role.attrib = role.attrib
+beginpage = element beginpage { beginpage.attlist, empty }
+# end of beginpage.element
+
+# PageNum: Number of page that begins at this point
+beginpage.attlist &=
+  pagenum.attrib,
+  common.attrib,
+  beginpage.role.attrib,
+  local.beginpage.attrib
+# end of beginpage.attlist
+
+# end of beginpage.module
+
+# IndexTerms appear in the text flow for generating or linking an
+# index.
+local.indexterm.attrib = empty
+indexterm.role.attrib = role.attrib
+indexterm =
+  element indexterm {
+    indexterm.attlist,
+    primary?,
+    ((secondary,
+      ((tertiary, (see | seealso+)?)
+       | see
+       | seealso+)?)
+     | see
+     | seealso+)?
+  }
+# end of indexterm.element
+
+# Scope: Indicates which generated indices the IndexTerm
+# should appear in: Global (whole document set), Local (this
+# document only), or All (both)
+
+# Significance: Whether this IndexTerm is the most pertinent
+# of its series (Preferred) or not (Normal, the default)
+
+# Class: Indicates type of IndexTerm; default is Singular,
+# or EndOfRange if StartRef is supplied; StartOfRange value
+# must be supplied explicitly on starts of ranges
+
+# StartRef: ID of the IndexTerm that starts the indexing
+# range ended by this IndexTerm
+
+# Zone: IDs of the elements to which the IndexTerm applies,
+# and indicates that the IndexTerm applies to those entire
+# elements rather than the point at which the IndexTerm
+# occurs
+indexterm.attlist &=
+  pagenum.attrib,
+  attribute scope { "all" | "global" | "local" }?,
+  [ a:defaultValue = "normal" ]
+  attribute significance { "preferred" | "normal" }?,
+  attribute class { "singular" | "startofrange" | "endofrange" }?,
+  attribute startref { xsd:IDREF }?,
+  attribute zone { xsd:IDREFS }?,
+  common.attrib,
+  indexterm.role.attrib,
+  local.indexterm.attrib
+# end of indexterm.attlist
+
+# end of indexterm.module
+local.primsecter.attrib = empty
+primsecter.role.attrib = role.attrib
+primary = element primary { primary.attlist, ndxterm.char.mix* }
+# end of primary.element
+
+# SortAs: Alternate sort string for index sorting, e.g.,
+# "fourteen" for an element containing "14"
+primary.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  primsecter.role.attrib,
+  local.primsecter.attrib
+# end of primary.attlist
+secondary = element secondary { secondary.attlist, ndxterm.char.mix* }
+# end of secondary.element
+
+# SortAs: Alternate sort string for index sorting, e.g.,
+# "fourteen" for an element containing "14"
+secondary.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  primsecter.role.attrib,
+  local.primsecter.attrib
+# end of secondary.attlist
+tertiary = element tertiary { tertiary.attlist, ndxterm.char.mix* }
+# end of tertiary.element
+
+# SortAs: Alternate sort string for index sorting, e.g.,
+# "fourteen" for an element containing "14"
+tertiary.attlist &=
+  attribute sortas { text }?,
+  common.attrib,
+  primsecter.role.attrib,
+  local.primsecter.attrib
+# end of tertiary.attlist
+
+# end of primsecter.module
+local.seeseealso.attrib = empty
+seeseealso.role.attrib = role.attrib
+see = element see { see.attlist, ndxterm.char.mix* }
+# end of see.element
+see.attlist &=
+  common.attrib, seeseealso.role.attrib, local.seeseealso.attrib
+# end of see.attlist
+seealso = element seealso { seealso.attlist, ndxterm.char.mix* }
+# end of seealso.element
+seealso.attlist &=
+  common.attrib, seeseealso.role.attrib, local.seeseealso.attrib
+# end of seealso.attlist
+
+# end of seeseealso.module
+
+# end of indexterm.content.module
+
+# End of DocBook XML information pool module V4.2 ......................
+
+# ......................................................................
diff --git a/etc/schema/dbsoextbl.rnc b/etc/schema/dbsoextbl.rnc
new file mode 100644 (file)
index 0000000..a547586
--- /dev/null
@@ -0,0 +1,30 @@
+# Definitions specific to the OASIS XML Exchange Table Model.
+
+# Reference OASIS Exchange Table Model
+include "soextbl.rnc" {
+  # Override definition of start
+  start |= notAllowed
+  # Add common attributes and the Label attribute to Table and
+  # InformalTable.
+  bodyatt = common.attrib, label.attrib, tables.role.attrib
+  # Add common attributes to TGroup, ColSpec, TBody, THead, Row, Entry
+  tbl.tgroup.att = common.attrib
+  tbl.colspec.att = common.attrib
+  tbl.tbody.att = common.attrib
+  tbl.thead.att = common.attrib
+  tbl.row.att = common.attrib
+  tbl.entry.att = common.attrib
+  # Content model for Table.
+  tbl.table.mdl =
+    blockinfo?,
+    formalobject.title.content,
+    ndxterm.class*,
+    textobject*,
+    (graphic+ | mediaobject+ | tgroup+)
+  # Allow either objects or inlines; beware of REs between elements.
+  tbl.entry.mdl = (para.char.mix | tabentry.mix)*
+}
+
+common.table.attribs = bodyatt
+
+# end of table.module
diff --git a/etc/schema/dbstart.rnc b/etc/schema/dbstart.rnc
new file mode 100644 (file)
index 0000000..284f9b5
--- /dev/null
@@ -0,0 +1,23 @@
+# This choice of root elements comes from the 1.0b1 RNG schema at
+# http://www.oasis-open.org/docbook/relaxng/1.0b1/index.shtml
+
+start = 
+  set
+  | setindex
+  | book
+  | part
+  | reference
+  | preface
+  | chapter
+  | appendix
+  | article
+  | bibliography
+  | glossary
+  | index
+  | refentry
+  | sect1
+  | sect2
+  | sect3
+  | sect4
+  | sect5
+  | section
diff --git a/etc/schema/docbook-dyntbl.rnc b/etc/schema/docbook-dyntbl.rnc
new file mode 100644 (file)
index 0000000..9bb997f
--- /dev/null
@@ -0,0 +1,18 @@
+# Variant of docbook.rnc that allows the table model to be selected
+# dynamically based on the definitions of cals.table.module and
+# exchange.table.module.  See dbdyntbl.rnc.
+
+# Document (root) elements
+include "dbstart.rnc"
+
+# Notation declarations
+include "dbnotn.rnc"
+
+# Information pool
+include "dbpool.rnc"
+
+# Dynamic Table Model
+include "dbdyntbl.rnc"
+
+# Document hierarchy
+include "dbhier.rnc"
diff --git a/etc/schema/docbook-soextbl.rnc b/etc/schema/docbook-soextbl.rnc
new file mode 100644 (file)
index 0000000..945a621
--- /dev/null
@@ -0,0 +1,17 @@
+# Variant of docbook.rnc that uses the OASIS XML Exchange Table Model
+# rather than the CALS Table Model.
+
+# Document (root) elements
+include "dbstart.rnc"
+
+# Notation declarations
+include "dbnotn.rnc"
+
+# Information pool
+include "dbpool.rnc"
+
+# OASIS XML Exchange Table Model
+include "dbsoextbl.rnc"
+
+# Document hierarchy
+include "dbhier.rnc"
diff --git a/etc/schema/docbook.rnc b/etc/schema/docbook.rnc
new file mode 100644 (file)
index 0000000..d10f614
--- /dev/null
@@ -0,0 +1,48 @@
+# Unofficial DocBook RELAX NG Compact Syntax schema
+
+# This file was generated automatically by Trang
+# (http://www.thaiopensource.com/relaxng/trang.html) from the DocBook
+# XML DTD V4.2 (http://www.oasis-open.org/docbook/xml/4.2/), then
+# changing the definition of start, changing the filenames,
+# editing the comments and adding includes of dbstart.rnc
+# and dbcalstbl.rnc.
+
+# The following copyright applies to the DocBook XML DTD V4.2.
+
+# Copyright 1992-2002 HaL Computer Systems, Inc.,
+# O'Reilly & Associates, Inc., ArborText, Inc., Fujitsu Software
+# Corporation, Norman Walsh, Sun Microsystems, Inc., and the
+# Organization for the Advancement of Structured Information
+# Standards (OASIS).
+# 
+# Permission to use, copy, modify and distribute the DocBook XML DTD
+# and its accompanying documentation for any purpose and without fee
+# is hereby granted in perpetuity, provided that the above copyright
+# notice and this paragraph appear in all copies.  The copyright
+# holders make no representation about the suitability of the DTD for
+# any purpose.  It is provided "as is" without expressed or implied
+# warranty.
+# 
+# If you modify the DocBook DTD in any way, except for declaring and
+# referencing additional sets of general entities and declaring
+# additional notations, label your DTD as a variant of DocBook.  See
+# the maintenance documentation for more information.
+# 
+# Please direct all questions, bug reports, or suggestions for
+# changes to the docbook@lists.oasis-open.org mailing list. For more
+# information, see http://www.oasis-open.org/docbook/.
+
+# Document (root) elements
+include "dbstart.rnc"
+
+# Notation declarations
+include "dbnotn.rnc"
+
+# Information pool
+include "dbpool.rnc"
+
+# CALS Table Model
+include "dbcalstbl.rnc"
+
+# Document hierarchy
+include "dbhier.rnc"
diff --git a/etc/schema/locate.rnc b/etc/schema/locate.rnc
new file mode 100644 (file)
index 0000000..89230ad
--- /dev/null
@@ -0,0 +1,200 @@
+default namespace this = "http://thaiopensource.com/ns/locating-rules/1.0"
+namespace local = ""
+
+start = locatingRules
+
+locatingRules =  element locatingRules { common, rule* }
+
+rule =
+  \include
+  # | group
+  | applyFollowingRules
+  | documentElement
+  # | doctypePublicId
+  | \namespace
+  | uri
+  | transformURI
+  # | typeIdProcessingInstruction
+  | \default
+  | typeId
+  # | typeIdBase
+  | extensionRule
+## Group of rules. Useful with xml:base.
+group = element group { common, rule* }
+
+\include =
+  element include {
+    common,
+    attribute rules { xsd:anyURI }
+  }
+
+applyFollowingRules =
+  element applyFollowingRules {
+    common,
+    attribute ruleType {
+      "documentElement"
+      | "doctypePublicId"
+      | "namespace"
+      | "uri"
+      | "transformURI"
+      | "typeIdProcessingInstruction"
+      | "default"
+    }
+  }
+
+documentElement =
+  ## Matches if the prefix and/or local name of document element
+  ## match the values of the prefix and localName attributes.
+  element documentElement {
+    common,
+    nameAtts,
+    targetAtt
+  }
+
+## If there's no prefix attribute, then only the local name must match.
+## If there's no local name attribute, then only the prefix must match.
+nameAtts = (prefixAtt, localNameAtt?) | localNameAtt
+
+## prefix="" matches if the document element has no prefix.
+prefixAtt = attribute prefix { (xsd:NCName - "xmlns") | "" }
+localNameAtt = attribute localName { xsd:NCName - "xmlns" }
+
+doctypePublicId =
+  ## Matches if the document has a DOCTYPE declaration with a public
+  ## identifier that, after normalization, matches the value of the
+  ## publicId attribute.
+  element doctypePublicId {
+    common,
+    attribute publicId { publicIdValue },
+    targetAtt
+  }
+
+publicIdValue =
+  xsd:token {
+    ## Newline and tab are excluded, because pattern applies to
+    ## the post-normalization value.
+    pattern = "[\-'()+,./:=?;!*#@$_%a-zA-Z0-9 ]*"
+  }
+
+# This is separate from documentElement so it can be distinguished
+# by applyFollowingRules.
+\namespace =
+  ## Matches if the document element has a namespace URI equal to the value
+  ## of the ns attribute.  A document element with no namespace matches if
+  ## the value of the ns attribute is the empty string.
+  element namespace {
+    common,
+    attribute ns { xsd:string },
+    targetAtt
+  }
+
+uri =
+  ## Matches based on the URI of the document.
+  element uri {
+    common,
+    (resourceAtt | patternAtt),
+    targetAtt
+  }
+
+## Matches if it can be determined that the document resource is
+## the same resource as that identified by the value of the resource
+## attribute.  In determining this, the implementation should apply
+## the semantics of the URI scheme used by the URI.
+resourceAtt = attribute resource { xsd:anyURI }
+
+## Matches if the document's URI matches the pattern specified
+## by the pattern attribute.  A * in the path component matches
+## zero or more characters other than / (after resolving escapes).
+## If the pattern is a relative URI, it means that there must
+## be some URI such that when the pattern is resolved relative
+## to that URI, it matches the document's URI. Thus an empty
+## pattern will always match.
+patternAtt = attribute pattern { uriPattern }
+
+## A pattern for a URI. Same syntax as a URI, except that a * in
+## the path component has a special meaning.
+uriPattern = xsd:anyURI
+
+transformURI =
+  ## Generates a URI for the related resource by transforming
+  ## the URI of the document. Matches if the transformation
+  ## yields a valid URI that identifies an existing resource.
+  element transformURI {
+    common,
+    ## Semantics are the same as the pattern attribute of the uri element.
+    attribute fromPattern { uriPattern },
+    ## The result of the transformation is produced from the toPattern
+    ## by replacing each * by the string that matched the corresponding
+    ## * in the toPattern.  The toPattern is appended to the initial
+    ## part of the document's URI that was not explicitly matched
+    ## by fromPattern.
+    attribute toPattern { uriPattern }
+  }
+
+\default =
+  ## Always matches.
+  element default {
+    common,
+    targetAtt
+  }
+
+## A document can be mapped onto a URI either indirectly via a typeId
+## or directly.
+targetAtt = uriAtt | typeIdAtt
+
+## Specifies the URI of the related resource.
+## xml:base is used if it's relative.
+uriAtt = attribute uri { xsd:anyURI }
+
+## Specifies an identifier of the type of document. typeId and
+## typeIdBase rules will be used to map this to a URI.
+typeIdAtt = attribute typeId { typeIdValue }
+
+## A type identifier can be anything convenient (e.g. a public identifier,
+## a URL or just a string with no formal structure).  Whitespace is
+## normalized like a public identifier before comparing type identifiers
+## for equality.
+typeIdValue = xsd:token
+
+typeIdProcessingInstruction =
+  ## Matches if there's a processing instruction in the prolog
+  ## before any DOCTYPE declaration whose target is the value of
+  ## the target attribute.  The value of the processing instruction
+  ## is interpreted as a typeId, which will be mapped to a
+  ## URI as normal.
+  element typeIdProcessingInstruction {
+    common,
+    attribute target { xsd:NCName }
+  }
+
+typeId =
+  ## Maps a typeId onto a URI.
+  element typeId {
+    common,
+    attribute id { typeIdValue },
+    targetAtt
+  }
+
+typeIdBase =
+  ## Used to map a typeId onto a URI. First, any URI reserved characters
+  ## are URI encoded. If the append attribute is specified, it is appended.
+  ## This is then treated as a URI. If relative, it is resolved using
+  ## the applicable base URI as usual.  If the resulting URI identifies
+  ## an existing resource, then the typeId is mapped to this resource.
+  ## This is intended to be useful with file URIs.
+  element typeIdBase {
+    common,
+    attribute append { xsd:string }?
+  }
+
+extensionRule =
+  element * - this:* {
+    attribute * { text }*, (text|anyElement)*
+  }
+
+anyElement = element * { attribute * { text }*, (text|anyElement)* }
+
+common = 
+  # attribute xml:base { xsd:anyURI }?,
+  attribute * - (xml:base|this:*|local:*) { text }*
diff --git a/etc/schema/rdfxml.rnc b/etc/schema/rdfxml.rnc
new file mode 100644 (file)
index 0000000..9730322
--- /dev/null
@@ -0,0 +1,205 @@
+#
+# RELAX NG Compact Schema for RDF/XML Syntax
+#
+# This schema is for information only and NON-NORMATIVE
+#
+# It is based on one originally written by James Clark in
+# http://lists.w3.org/Archives/Public/www-rdf-comments/2001JulSep/0248.html
+# and updated with later changes.
+#
+
+namespace local = ""
+namespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
+
+
+start = doc
+
+
+# I cannot seem to do this in RNGC so they are expanded in-line
+
+# coreSyntaxTerms = rdf:RDF | rdf:ID | rdf:about | rdf:parseType | rdf:resource | rdf:nodeID | rdf:datatype
+# syntaxTerms = coreSyntaxTerms | rdf:Description | rdf:li
+# oldTerms    = rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID
+# nodeElementURIs       = * - ( coreSyntaxTerms | rdf:li | oldTerms )
+# propertyElementURIs   = * - ( coreSyntaxTerms | rdf:Description | oldTerms )
+# propertyAttributeURIs = * - ( coreSyntaxTerms | rdf:Description | rdf:li | oldTerms )
+
+# Also needed to allow rdf:li on all property element productions
+# since we can't capture the rdf:li rewriting to rdf_<n> in relaxng
+
+# Need to add these explicitly
+xmllang = attribute xml:lang { text }
+xmlbase = attribute xml:base { text }
+# and to forbid every other xml:* attribute, element
+
+doc = 
+  RDF
+
+RDF =
+  element rdf:RDF { 
+     xmllang?, xmlbase?, nodeElementList
+}
+
+nodeElementList = 
+  nodeElement*
+
+  # Should be something like:
+  #  ws* , (  nodeElement , ws* )*
+  # but RELAXNG does this by default, ignoring whitespace separating tags.
+
+nodeElement =
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype | rdf:li |
+                rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID ) {
+      (idAttr | nodeIdAttr | aboutAttr )?, xmllang?, xmlbase?, propertyAttr*, propertyEltList
+  }
+
+  # It is not possible to say "and not things
+  # beginning with _ in the rdf: namespace" in RELAX NG.
+
+ws = 
+  " "
+
+  # Not used in this RELAX NG schema; but should be any legal XML
+  # whitespace defined by http://www.w3.org/TR/2000/REC-xml-20001006#NT-S
+
+
+propertyEltList = 
+  propertyElt*
+
+  # Should be something like:
+  #  ws* , ( propertyElt , ws* )*
+  # but RELAXNG does this by default, ignoring whitespace separating tags.
+
+propertyElt = 
+  resourcePropertyElt | 
+  literalPropertyElt | 
+  parseTypeLiteralPropertyElt |
+  parseTypeResourcePropertyElt |
+  parseTypeCollectionPropertyElt |
+  parseTypeOtherPropertyElt |
+  emptyPropertyElt
+
+resourcePropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, xmllang?, xmlbase?, nodeElement
+  }
+
+literalPropertyElt =
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      (idAttr | datatypeAttr )?, xmllang?, xmlbase?, text 
+  }
+
+parseTypeLiteralPropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, parseLiteral, xmllang?, xmlbase?, literal 
+  }
+
+parseTypeResourcePropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, parseResource, xmllang?, xmlbase?, propertyEltList
+  }
+
+parseTypeCollectionPropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, xmllang?, xmlbase?, parseCollection, nodeElementList
+  }
+
+parseTypeOtherPropertyElt = 
+  element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                rdf:resource | rdf:nodeID | rdf:datatype |
+                rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                xml:* ) {
+      idAttr?, xmllang?, xmlbase?, parseOther, any
+  }
+
+emptyPropertyElt =
+   element * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                 rdf:resource | rdf:nodeID | rdf:datatype |
+                 rdf:Description | rdf:aboutEach | rdf:aboutEachPrefix | rdf:bagID |
+                 xml:* ) {
+       idAttr?, (resourceAttr | nodeIdAttr)?, xmllang?, xmlbase?, propertyAttr*
+   }
+
+idAttr = 
+  attribute rdf:ID { 
+      IDsymbol 
+  }
+
+nodeIdAttr = 
+  attribute rdf:nodeID { 
+      IDsymbol 
+  }
+
+aboutAttr = 
+  attribute rdf:about { 
+      URI-reference 
+  }
+
+propertyAttr = 
+  attribute * - ( local:* | rdf:RDF | rdf:ID | rdf:about | rdf:parseType |
+                  rdf:resource | rdf:nodeID | rdf:datatype | rdf:li |
+                  rdf:Description | rdf:aboutEach |
+                 rdf:aboutEachPrefix | rdf:bagID |
+                  xml:* ) {
+      string
+  }
+
+resourceAttr = 
+  attribute rdf:resource {
+      URI-reference 
+  }
+
+datatypeAttr = 
+  attribute rdf:datatype {
+      URI-reference 
+  }
+
+parseLiteral = 
+  attribute rdf:parseType {
+      "Literal" 
+  }
+
+parseResource = 
+  attribute rdf:parseType {
+      "Resource"
+  }
+
+parseCollection = 
+  attribute rdf:parseType {
+      "Collection"
+  }
+
+parseOther = 
+  attribute rdf:parseType {
+      text
+  }
+
+URI-reference = 
+  string
+
+literal =
+  any
+
+IDsymbol = 
+  xsd:NMTOKEN
+
+any =
+  mixed { element * { attribute * { text }*, any }* }
+
diff --git a/etc/schema/relaxng.rnc b/etc/schema/relaxng.rnc
new file mode 100644 (file)
index 0000000..08686ac
--- /dev/null
@@ -0,0 +1,63 @@
+# RELAX NG XML syntax expressed in RELAX NG Compact syntax.
+
+default namespace rng = "http://relaxng.org/ns/structure/1.0"
+namespace local = ""
+datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
+
+start = pattern
+
+pattern =
+  element element { (nameQName | nameClass), (common & pattern+) }
+  | element attribute { (nameQName | nameClass), (common & pattern?) }
+  | element group|interleave|choice|optional
+            |zeroOrMore|oneOrMore|list|mixed { common & pattern+ }
+  | element ref|parentRef { nameNCName, common }
+  | element empty|notAllowed|text { common }
+  | element data { type, param*, (common & exceptPattern?) }
+  | element value { commonAttributes, type?, xsd:string }
+  | element externalRef { href, common }
+  | element grammar { common & grammarContent* }
+
+param = element param { commonAttributes, nameNCName, xsd:string }
+
+exceptPattern = element except { common & pattern+ }
+
+grammarContent = 
+  definition
+  | element div { common & grammarContent* }
+  | element include { href, (common & includeContent*) }
+
+includeContent =
+  definition
+  | element div { common & includeContent* }
+
+definition =
+  element start { combine?, (common & pattern+) }
+  | element define { nameNCName, combine?, (common & pattern+) }
+
+combine = attribute combine { "choice" | "interleave" }
+
+nameClass = 
+  element name { commonAttributes, xsd:QName }
+  | element anyName { common & exceptNameClass? }
+  | element nsName { common & exceptNameClass? }
+  | element choice { common & nameClass+ }
+
+exceptNameClass = element except { common & nameClass+ }
+
+nameQName = attribute name { xsd:QName }
+nameNCName = attribute name { xsd:NCName }
+href = attribute href { xsd:anyURI }
+type = attribute type { xsd:NCName }
+
+common = commonAttributes, foreignElement*
+
+commonAttributes = 
+  attribute ns { xsd:string }?,
+  attribute datatypeLibrary { xsd:anyURI }?,
+  foreignAttribute*
+
+foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* }
+foreignAttribute = attribute * - (rng:*|local:*) { text }
+anyElement = element * { (anyAttribute | text | anyElement)* }
+anyAttribute = attribute * { text }
diff --git a/etc/schema/schemas.xml b/etc/schema/schemas.xml
new file mode 100644 (file)
index 0000000..1eef763
--- /dev/null
@@ -0,0 +1,39 @@
+<locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0">
+  <transformURI fromPattern="*.xml" toPattern="*.rnc"/>
+
+  <uri pattern="*.xsl" typeId="XSLT"/>
+  <uri pattern="*.html" typeId="XHTML"/>
+  <uri pattern="*.rng" typeId="RELAX NG"/>
+  <uri pattern="*.rdf" typeId="RDF"/>
+  
+  <namespace ns="http://www.w3.org/1999/XSL/Transform" typeId="XSLT"/>
+  <namespace ns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" typeId="RDF"/>
+  <namespace ns="http://www.w3.org/1999/xhtml" typeId="XHTML"/>
+  <namespace ns="http://relaxng.org/ns/structure/1.0" typeId="RELAX NG"/>
+  <namespace ns="http://thaiopensource.com/ns/locating-rules/1.0"
+            uri="locate.rnc"/>
+
+  <documentElement localName="stylesheet" typeId="XSLT"/>
+  <documentElement prefix="xsl" localName="transform" typeId="XSLT"/>
+
+  <documentElement localName="html" typeId="XHTML"/>
+
+  <documentElement localName="grammar" typeId="RELAX NG"/>
+
+  <documentElement prefix="" localName="article" typeId="DocBook"/>
+  <documentElement prefix="" localName="book" typeId="DocBook"/>
+
+  <documentElement localName="RDF" typeId="RDF"/>
+  <documentElement prefix="rdf" typeId="RDF"/>
+  
+  <documentElement localName="locatingRules" uri="locate.rnc"/>
+
+  <typeId id="XSLT" uri="xslt.rnc"/>
+  <typeId id="RELAX NG" uri="relaxng.rnc"/>
+  <typeId id="XHTML" uri="xhtml.rnc"/>
+  <typeId id="DocBook" uri="docbook.rnc"/>
+  <typeId id="RDF" uri="rdfxml.rnc"/>
+</locatingRules>
+
+<!-- arch-tag: 1fde96fa-b401-4033-8514-c4990b1e18a5
+     (do not change this comment) -->
diff --git a/etc/schema/soextbl.rnc b/etc/schema/soextbl.rnc
new file mode 100644 (file)
index 0000000..2e69127
--- /dev/null
@@ -0,0 +1,260 @@
+# XML EXCHANGE TABLE MODEL DECLARATION MODULE
+
+# This set of declarations defines the XML version of the Exchange
+# Table Model as of the date shown in the Formal Public Identifier
+# (FPI) for this entity.
+# 
+# This set of declarations may be referred to using a public external
+# entity declaration and reference as shown in the following three
+# lines:
+# 
+# <!ENTITY % calstblx
+#   PUBLIC "-//OASIS//DTD XML Exchange Table Model 19990315//EN">
+#   %calstblx;
+# 
+# If various parameter entities used within this set of declarations
+# are to be given non-default values, the appropriate declarations
+# should be given before calling in this package (i.e., before the
+# "%calstblx;" reference).
+
+# The motivation for this XML version of the Exchange Table Model
+# is simply to create an XML version of the SGML Exchange Table
+# Model. By design, no effort has been made to "improve" the model.
+# 
+# This XML version incorporates the logical bare minimum changes
+# necessary to make the Exchange Table Model a valid XML DTD.
+
+# The XML version of the Exchange Table Model differs from
+# the SGML version in the following ways:
+# 
+# The following parameter entities have been removed:
+# 
+#   - tbl.table.excep, tbl.hdft.excep, tbl.row.excep, tbl.entry.excep
+#     There are no exceptions in XML. The following normative statement
+#     is made in lieu of exceptions: the exchange table model explicitly
+#     forbids a table from occurring within another table. If the
+#     content model of an entry includes a table element, then this
+#     cannot be enforced by the DTD, but it is a deviation from the
+#     exchange table model to include a table within a table.
+# 
+#   - tbl.hdft.name, tbl.hdft.mdl, tbl.hdft.excep, tbl.hdft.att
+#     The motivation for these elements was to change the table
+#     header/footer elements. Since XML does not allow element declarations
+#     to contain name groups, and the exchange table model does not
+#     allow a table to contain footers, the continued presence of these
+#     attributes seems unnecessary.
+# 
+# The following parameter entity has been added:
+# 
+#   - tbl.thead.att
+#     This entity parameterizes the attributes on thead. It replaces
+#     the tbl.hdft.att parameter entity.
+# 
+# Other miscellaneous changes:
+# 
+#   - Tag ommission indicators have been removed
+#   - Comments have been removed from declarations
+#   - NUMBER attributes have been changed to NMTOKEN
+#   - NUTOKEN attributes have been to changed to NMTOKEN
+#   - Removed the grouping characters around the content model
+#     parameter entry for the 'entry' element. This is necessary
+#     so that an entry can contain #PCDATA and be defined as an
+#     optional, repeatable OR group beginning with #PCDATA.
+
+# This entity includes a set of element and attribute declarations
+# that partially defines the Exchange table model.  However, the model
+# is not well-defined without the accompanying natural language
+# description of the semantics (meanings) of these various elements,
+# attributes, and attribute values.  The semantic writeup, also available
+# from SGML Open, should be used in conjunction with this entity.
+
+# In order to use the Exchange table model, various parameter entity
+# declarations are required.  A brief description is as follows:
+# 
+# ENTITY NAME      WHERE USED              WHAT IT IS
+# 
+# %yesorno         In ATTLIST of:          An attribute declared value
+#                  almost all elements     for a "boolean" attribute
+# 
+# %paracon         In content model of:    The "text" (logical content)
+#                  <entry>                 of the model group for <entry>
+# 
+# %titles          In content model of:    The "title" part of the model
+#                  table element           group for the table element
+# 
+# %tbl.table.name  In declaration of:      The name of the "table"
+#                  table element           element
+# 
+# %tbl.table-titles.mdl In content model of: The model group for the title
+#                  table elements          part of the content model for
+#                                          table element
+# 
+# %tbl.table.mdl   In content model of:    The model group for the content
+#                  table elements          model for table element,
+#                                          often (and by default) defined
+#                                          in terms of %tbl.table-titles.mdl
+#                                          and tgroup
+# 
+# %tbl.table.att   In ATTLIST of:          Additional attributes on the
+#                  table element           table element
+# 
+# %bodyatt         In ATTLIST of:          Additional attributes on the
+#                  table element           table element (for backward
+#                                          compatibility with the SGML
+#                                          model)
+# 
+# %tbl.tgroup.mdl  In content model of:    The model group for the content
+#                  <tgroup>                model for <tgroup>
+# 
+# %tbl.tgroup.att  In ATTLIST of:          Additional attributes on the
+#                  <tgroup>                <tgroup> element
+# 
+# %tbl.thead.att   In ATTLIST of:          Additional attributes on the
+#                  <thead>                 <thead> element
+# 
+# %tbl.tbody.att   In ATTLIST of:          Additional attributes on the
+#                  <tbody>                 <tbody> element
+# 
+# %tbl.colspec.att In ATTLIST of:          Additional attributes on the
+#                  <colspec>               <colspec> element
+# 
+# %tbl.row.mdl     In content model of:    The model group for the content
+#                  <row>                   model for <row>
+# 
+# %tbl.row.att     In ATTLIST of:          Additional attributes on the
+#                  <row>                   <row> element
+# 
+# %tbl.entry.mdl   In content model of:    The model group for the content
+#                  <entry>                 model for <entry>
+# 
+# %tbl.entry.att   In ATTLIST of:          Additional attributes on the
+#                  <entry>                 <entry> element
+# 
+# This set of declarations will use the default definitions shown below
+# for any of these parameter entities that are not declared before this
+# set of declarations is referenced.
+
+# These definitions are not directly related to the table model, but are
+# used in the default CALS table model and may be defined elsewhere (and
+# prior to the inclusion of this table module) in the referencing DTD.
+
+yesorno = xsd:NMTOKEN
+# no if zero(s), yes if any other value
+pcd = text
+paracon = pcd
+# default for use in entry content
+
+# The parameter entities as defined below change and simplify the CALS table
+# model as published (as part of the Example DTD) in MIL-HDBK-28001.  The
+# resulting simplified DTD has support from the SGML Open vendors and is
+# therefore more interoperable among different systems.
+# 
+# These following declarations provide the Exchange default definitions
+# for these entities.  However, these entities can be redefined (by giving
+# the appropriate parameter entity declaration(s) prior to the reference
+# to this Table Model declaration set entity) to fit the needs of the
+# current application.
+# 
+# Note, however, that changes may have significant effect on the ability to
+# interchange table information.  These changes may manifest themselves
+# in useability, presentation, and possible structure information degradation.
+tbl.table-titles.mdl = title
+tbl.table-main.mdl = tgroup+
+tbl.table.mdl = tbl.table-titles.mdl | tbl.table-main.mdl
+tbl.table.att = attribute pgwide { yesorno }?
+bodyatt = empty
+tbl.tgroup.mdl = colspec*, thead?, tbody
+tbl.tgroup.att = empty
+tbl.thead.att = empty
+tbl.tbody.att = empty
+tbl.colspec.att = empty
+tbl.row.mdl = entry+
+tbl.row.att = empty
+tbl.entry.mdl = paracon*
+tbl.entry.att = empty
+# =====  Element and attribute declarations follow. =====
+
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.table.name       "table"
+# ENTITY % tbl.table-titles.mdl "%titles;,"
+# ENTITY % tbl.table.mdl        "%tbl.table-titles; tgroup+"
+# ENTITY % tbl.table.att        "
+#                    pgwide          %yesorno;       #IMPLIED "
+table = element table { table.attlist, tbl.table.mdl }
+table.attlist &=
+  attribute frame {
+    "top" | "bottom" | "topbot" | "all" | "sides" | "none"
+  }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  tbl.table.att,
+  bodyatt
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.tgroup.mdl    "colspec*,thead?,tbody"
+# ENTITY % tbl.tgroup.att    ""
+tgroup = element tgroup { tgroup.attlist, tbl.tgroup.mdl }
+tgroup.attlist &=
+  attribute cols { xsd:NMTOKEN },
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  tbl.tgroup.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.colspec.att   ""
+colspec = element colspec { colspec.attlist, empty }
+colspec.attlist &=
+  attribute colnum { xsd:NMTOKEN }?,
+  attribute colname { xsd:NMTOKEN }?,
+  attribute colwidth { text }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { xsd:NMTOKEN }?,
+  tbl.colspec.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.thead.att      ""
+thead = element thead { thead.attlist, row+ }
+thead.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.thead.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.tbody.att     ""
+tbody = element tbody { tbody.attlist, row+ }
+tbody.attlist &=
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.tbody.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % tbl.row.mdl       "entry+"
+# ENTITY % tbl.row.att       ""
+row = element row { row.attlist, tbl.row.mdl }
+row.attlist &=
+  attribute rowsep { yesorno }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.row.att
+# Default declarations previously defined in this entity and
+# referenced below include:
+# ENTITY % paracon           "#PCDATA"
+# ENTITY % tbl.entry.mdl     "(%paracon;)*"
+# ENTITY % tbl.entry.att     ""
+entry = element entry { entry.attlist, tbl.entry.mdl }
+entry.attlist &=
+  attribute colname { xsd:NMTOKEN }?,
+  attribute namest { xsd:NMTOKEN }?,
+  attribute nameend { xsd:NMTOKEN }?,
+  attribute morerows { xsd:NMTOKEN }?,
+  attribute colsep { yesorno }?,
+  attribute rowsep { yesorno }?,
+  attribute align { "left" | "right" | "center" | "justify" | "char" }?,
+  attribute char { text }?,
+  attribute charoff { xsd:NMTOKEN }?,
+  attribute valign { "top" | "middle" | "bottom" }?,
+  tbl.entry.att
+title |= notAllowed
+start = table
diff --git a/etc/schema/xhtml-applet.rnc b/etc/schema/xhtml-applet.rnc
new file mode 100644 (file)
index 0000000..115f1cb
--- /dev/null
@@ -0,0 +1,19 @@
+# Applet Module
+
+applet =
+  element applet {
+    applet.attlist,
+    # No restrictions on mixed content in TREX.
+    param*,
+    Flow.model
+  }
+applet.attlist =
+  Core.attrib,
+  attribute alt { Text.datatype },
+  attribute archive { text }?,
+  attribute code { text }?,
+  attribute codebase { URI.datatype }?,
+  attribute object { text }?,
+  attribute height { Length.datatype },
+  attribute width { Length.datatype }
+Inline.class |= applet
diff --git a/etc/schema/xhtml-attribs.rnc b/etc/schema/xhtml-attribs.rnc
new file mode 100644 (file)
index 0000000..ef653c7
--- /dev/null
@@ -0,0 +1,14 @@
+# Common Attributes Module
+
+id.attrib = attribute id { ID.datatype }?
+class.attrib = attribute class { NMTOKENS.datatype }?
+title.attrib = attribute title { Text.datatype }?
+Core.attrib = id.attrib, class.attrib, title.attrib
+lang.attrib = attribute xml:lang { LanguageCode.datatype }?
+I18n.attrib = lang.attrib
+Common.attrib = Core.attrib, I18n.attrib
+CommonIdRequired.attrib =
+  attribute id { ID.datatype },
+  class.attrib,
+  title.attrib,
+  I18n.attrib
diff --git a/etc/schema/xhtml-base.rnc b/etc/schema/xhtml-base.rnc
new file mode 100644 (file)
index 0000000..154dfce
--- /dev/null
@@ -0,0 +1,5 @@
+# Base Module
+
+base = element base { base.attlist }
+base.attlist = attribute href { URI.datatype }
+head.content &= base?
diff --git a/etc/schema/xhtml-basic-form.rnc b/etc/schema/xhtml-basic-form.rnc
new file mode 100644 (file)
index 0000000..c0a78a1
--- /dev/null
@@ -0,0 +1,63 @@
+# Simplified Forms Module
+
+form =
+  element form {
+    form.attlist,
+    # Don't use Block.model, because this gets redefined by the
+    # legacy module.
+    Block.class+
+  }
+form.attlist =
+  Common.attrib,
+  attribute action { URI.datatype },
+  attribute method { "get" | "post" }?,
+  attribute enctype { ContentType.datatype }?
+label = element label { label.attlist, Inline.model }
+label.attlist =
+  Common.attrib,
+  attribute for { IDREF.datatype }?,
+  attribute accesskey { Character.datatype }?
+input = element input { input.attlist }
+input.attlist =
+  Common.attrib,
+  attribute type { InputType.class }?,
+  attribute name { text }?,
+  attribute value { text }?,
+  attribute checked { "checked" }?,
+  attribute size { text }?,
+  attribute maxlength { Number.datatype }?,
+  attribute src { URI.datatype }?,
+  attribute accesskey { Character.datatype }?
+InputType.class =
+  "text"
+  | "password"
+  | "checkbox"
+  | "radio"
+  | "submit"
+  | "reset"
+  | "hidden"
+select = element select { select.attlist, option+ }
+select.attlist =
+  Common.attrib,
+  attribute name { text }?,
+  attribute size { Number.datatype }?,
+  attribute multiple { "multiple" }?
+option =
+  element option {
+    Common.attrib,
+    attribute selected { "selected" }?,
+    attribute value { text }?,
+    text
+  }
+textarea = element textarea { textarea.attlist }
+textarea.attlist =
+  Common.attrib,
+  attribute name { text }?,
+  attribute rows { Number.datatype },
+  attribute cols { Number.datatype },
+  attribute accesskey { Character.datatype }?,
+  text
+Form.class = form
+Formctrl.class = input | label | select | textarea
+Block.class |= Form.class
+Inline.class |= Formctrl.class
diff --git a/etc/schema/xhtml-basic-table.rnc b/etc/schema/xhtml-basic-table.rnc
new file mode 100644 (file)
index 0000000..97e10a5
--- /dev/null
@@ -0,0 +1,28 @@
+# Basic Tables Module
+
+table = element table { table.attlist, caption?, tr+ }
+table.attlist =
+  Common.attrib,
+  attribute summary { Text.datatype }?
+caption = element caption { caption.attlist, Inline.model }
+caption.attlist = Common.attrib
+tr = element tr { tr.attlist, (th | td)+ }
+tr.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+th = element th { th.attlist, Flow.model }
+th.attlist = Cell.attrib
+td = element td { td.attlist, Flow.model }
+td.attlist = Cell.attrib
+Cell.attrib =
+  Common.attrib,
+  attribute abbr { Text.datatype }?,
+  attribute axis { text }?,
+  attribute headers { IDREFS.datatype }?,
+  scope.attrib,
+  attribute rowspan { Number.datatype }?,
+  attribute colspan { Number.datatype }?,
+  CellHAlign.attrib,
+  CellVAlign.attrib
+CellHAlign.attrib = attribute align { "left" | "center" | "right" }?
+CellVAlign.attrib = attribute valign { "top" | "middle" | "bottom" }?
+scope.attrib = attribute scope { "row" | "col" }?
+Block.class |= table
diff --git a/etc/schema/xhtml-bdo.rnc b/etc/schema/xhtml-bdo.rnc
new file mode 100644 (file)
index 0000000..5658be3
--- /dev/null
@@ -0,0 +1,7 @@
+# Bi-directional Module
+
+bdo = element bdo { bdo.attlist, Inline.model }
+bdo.attlist = Core.attrib, lang.attrib, dir.attrib
+dir.attrib = attribute dir { "ltr" | "rtl" }
+I18n.attrib &= dir.attrib?
+Inline.class |= bdo
diff --git a/etc/schema/xhtml-csismap.rnc b/etc/schema/xhtml-csismap.rnc
new file mode 100644 (file)
index 0000000..abd51f1
--- /dev/null
@@ -0,0 +1,29 @@
+# Client-side Image Map Module
+
+area = element area { area.attlist }
+area.attlist =
+  Common.attrib,
+  attribute href { URI.datatype }?,
+  shape.attrib,
+  coords.attrib,
+  attribute nohref { "nohref" }?,
+  attribute alt { Text.datatype },
+  attribute tabindex { Number.datatype }?,
+  attribute accesskey { Character.datatype }?
+map =
+  element map {
+    map.attlist,
+    (# This does not use Block.mix
+     # because loose.dtd doesn't use %Flow;
+     Block.class
+     | area)+
+  }
+map.attlist = CommonIdRequired.attrib
+a.attlist &= shape.attrib, coords.attrib
+img.attlist &= usemap.attlist
+object.attlist &= usemap.attlist
+usemap.attlist = attribute usemap { IDREF.datatype }?
+shape.attrib =
+  attribute shape { "rect" | "circle" | "poly" | "default" }?
+coords.attrib = attribute coords { text }?
+Inline.class |= map
diff --git a/etc/schema/xhtml-datatypes.rnc b/etc/schema/xhtml-datatypes.rnc
new file mode 100644 (file)
index 0000000..5965980
--- /dev/null
@@ -0,0 +1,47 @@
+# Datatypes Module
+
+# Length defined for cellpadding/cellspacing
+
+# nn for pixels or nn% for percentage length
+Length.datatype = text
+# space-separated list of link types
+LinkTypes.datatype = NMTOKENS.datatype
+# single or comma-separated list of media descriptors
+MediaDesc.datatype = text
+# pixel, percentage, or relative
+MultiLength.datatype = text
+# one or more digits (NUMBER)
+Number.datatype = text
+# integer representing length in pixels
+Pixels.datatype = text
+# script expression
+Script.datatype = text
+# textual content
+Text.datatype = text
+# Imported Datatypes ................................
+
+# a single character from [ISO10646]
+Character.datatype = text
+# a character encoding, as per [RFC2045]
+Charset.datatype = text
+# a space separated list of character encodings, as per [RFC2045]
+Charsets.datatype = text
+# media type, as per [RFC2045]
+ContentType.datatype = text
+# comma-separated list of media types, as per [RFC2045]
+ContentTypes.datatype = text
+# date and time information. ISO date format
+Datetime.datatype = text
+# formal public identifier, as per [ISO8879]
+FPI.datatype = text
+# a language code, as per [RFC1766]
+LanguageCode.datatype = xsd:language
+# a Uniform Resource Identifier, see [URI]
+URI.datatype = xsd:anyURI
+# a space-separated list of Uniform Resource Identifiers, see [URI]
+URIs.datatype = text
+NMTOKEN.datatype = xsd:NMTOKEN
+NMTOKENS.datatype = xsd:NMTOKENS
+ID.datatype = xsd:ID
+IDREF.datatype = xsd:IDREF
+IDREFS.datatype = xsd:IDREFS
diff --git a/etc/schema/xhtml-edit.rnc b/etc/schema/xhtml-edit.rnc
new file mode 100644 (file)
index 0000000..4301fc2
--- /dev/null
@@ -0,0 +1,12 @@
+# Edit Module
+
+del = element del { del.attlist, Inline.model }
+del.attlist = Edit.attrib
+ins = element ins { ins.attlist, Inline.model }
+ins.attlist = Edit.attrib
+Edit.attrib =
+  attribute cite { URI.datatype }?,
+  attribute datetime { Datetime.datatype }?
+Edit.class = del | ins
+Inline.class |= Edit.class
+Block.class |= Edit.class
diff --git a/etc/schema/xhtml-events.rnc b/etc/schema/xhtml-events.rnc
new file mode 100644 (file)
index 0000000..5368742
--- /dev/null
@@ -0,0 +1,47 @@
+# Events Module
+
+a.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+area.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+form.attlist &=
+  attribute onreset { Script.datatype }?,
+  attribute onsubmit { Script.datatype }?
+body.attlist &=
+  attribute onload { Script.datatype }?,
+  attribute onunload { Script.datatype }?
+label.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+input.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onchange { Script.datatype }?,
+  attribute onfocus { Script.datatype }?,
+  attribute onselect { Script.datatype }?
+select.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onchange { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+textarea.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onchange { Script.datatype }?,
+  attribute onfocus { Script.datatype }?,
+  attribute onselect { Script.datatype }?
+button.attlist &=
+  attribute onblur { Script.datatype }?,
+  attribute onfocus { Script.datatype }?
+Events.attrib =
+  attribute onclick { Script.datatype }?,
+  attribute ondblclick { Script.datatype }?,
+  attribute onmousedown { Script.datatype }?,
+  attribute onmouseup { Script.datatype }?,
+  attribute onmouseover { Script.datatype }?,
+  attribute onmousemove { Script.datatype }?,
+  attribute onmouseout { Script.datatype }?,
+  attribute onkeypress { Script.datatype }?,
+  attribute onkeydown { Script.datatype }?,
+  attribute onkeyup { Script.datatype }?
+Common.attrib &= Events.attrib
+CommonIdRequired.attrib &= Events.attrib
diff --git a/etc/schema/xhtml-form.rnc b/etc/schema/xhtml-form.rnc
new file mode 100644 (file)
index 0000000..f554419
--- /dev/null
@@ -0,0 +1,49 @@
+# Forms Module
+
+# Unlike the DTD implementation, this builds on the basic-form module
+
+include "xhtml-basic-form.rnc" {
+  select = element select { select.attlist, (option | optgroup)+ }
+}
+form.attlist &=
+  attribute accept-charset { Charsets.datatype }?,
+  attribute accept { ContentTypes.datatype }?
+input.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute readonly { "readonly" }?,
+  attribute alt { text }?,
+  attribute tabindex { Number.datatype }?,
+  attribute accept { ContentTypes.datatype }?
+InputType.class |= "image" | "button"
+select.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute tabindex { Number.datatype }?
+option.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute label { Text.datatype }?
+optgroup = element optgroup { optgroup.attlist, option+ }
+optgroup.attlist =
+  Common.attrib,
+  attribute disabled { "disabled" }?,
+  attribute label { Text.datatype }
+textarea.attlist &=
+  attribute disabled { "disabled" }?,
+  attribute readonly { "readonly" }?,
+  attribute tabindex { Number.datatype }?
+fieldset = element fieldset { fieldset.attlist, legend, Flow.model }
+fieldset.attlist = Common.attrib
+button = element button { button.attlist, Flow.model }
+button.attlist =
+  Common.attrib,
+  attribute name { text }?,
+  attribute value { text }?,
+  attribute type { "button" | "submit" | "reset" }?,
+  attribute disabled { "disabled" }?,
+  attribute tabindex { Number.datatype }?,
+  attribute accesskey { Character.datatype }?
+legend = element legend { legend.attlist, Inline.model }
+legend.attlist =
+  Common.attrib,
+  attribute accesskey { Character.datatype }?
+Form.class |= fieldset
+Formctrl.class |= button
diff --git a/etc/schema/xhtml-frames.rnc b/etc/schema/xhtml-frames.rnc
new file mode 100644 (file)
index 0000000..9b9f9ba
--- /dev/null
@@ -0,0 +1,26 @@
+# Frames Module
+
+include "xhtml-struct.rnc" {
+  html = element html { html.attlist, head, frameset }
+}
+frameset =
+  element frameset {
+    frameset.attlist,
+    ((frameset | frame)+ & noframes?)
+  }
+frameset.attlist =
+  Core.attrib,
+  attribute cols { MultiLength.datatype }?,
+  attribute rows { MultiLength.datatype }?
+frame = element frame { frame.attlist }
+frame.attlist =
+  Core.attrib,
+  attribute longdesc { URI.datatype }?,
+  attribute src { URI.datatype }?,
+  attribute frameborder { "1" | "0" }?,
+  attribute marginwidth { Pixels.datatype }?,
+  attribute marginheight { Pixels.datatype }?,
+  attribute noresize { "noresize" }?,
+  attribute scrolling { "yes" | "no" | "auto" }?
+noframes = element noframes { noframes.attlist, body }
+noframes.attlist = Common.attrib
diff --git a/etc/schema/xhtml-hypertext.rnc b/etc/schema/xhtml-hypertext.rnc
new file mode 100644 (file)
index 0000000..82e7686
--- /dev/null
@@ -0,0 +1,16 @@
+# Hypertext Module
+
+# Depends on text module.
+
+a = element a { a.attlist, Inline.model }
+a.attlist =
+  Common.attrib,
+  attribute href { URI.datatype }?,
+  attribute charset { Charset.datatype }?,
+  attribute type { ContentType.datatype }?,
+  attribute hreflang { LanguageCode.datatype }?,
+  attribute rel { LinkTypes.datatype }?,
+  attribute rev { LinkTypes.datatype }?,
+  attribute accesskey { Character.datatype }?,
+  attribute tabindex { Number.datatype }?
+Inline.class |= a
diff --git a/etc/schema/xhtml-iframe.rnc b/etc/schema/xhtml-iframe.rnc
new file mode 100644 (file)
index 0000000..bbcdd44
--- /dev/null
@@ -0,0 +1,14 @@
+# Iframe Module
+
+iframe = element iframe { iframe.attlist, Flow.model }
+iframe.attlist =
+  Core.attrib,
+  attribute longdesc { URI.datatype }?,
+  attribute src { URI.datatype }?,
+  attribute frameborder { "1" | "0" }?,
+  attribute width { Length.datatype }?,
+  attribute height { Length.datatype }?,
+  attribute marginwidth { Pixels.datatype }?,
+  attribute marginheight { Pixels.datatype }?,
+  attribute scrolling { "yes" | "no" | "auto" }?
+Inline.class |= iframe
diff --git a/etc/schema/xhtml-image.rnc b/etc/schema/xhtml-image.rnc
new file mode 100644 (file)
index 0000000..e1d6e56
--- /dev/null
@@ -0,0 +1,11 @@
+# Image Module
+
+img = element img { img.attlist }
+img.attlist =
+  Common.attrib,
+  attribute src { URI.datatype },
+  attribute alt { Text.datatype },
+  attribute longdesc { URI.datatype }?,
+  attribute height { Length.datatype }?,
+  attribute width { Length.datatype }?
+Inline.class |= img
diff --git a/etc/schema/xhtml-inlstyle.rnc b/etc/schema/xhtml-inlstyle.rnc
new file mode 100644 (file)
index 0000000..aa69b75
--- /dev/null
@@ -0,0 +1,3 @@
+# Inline Style Module
+
+Core.attrib &= attribute style { text }?
diff --git a/etc/schema/xhtml-legacy.rnc b/etc/schema/xhtml-legacy.rnc
new file mode 100644 (file)
index 0000000..b15061f
--- /dev/null
@@ -0,0 +1,100 @@
+# Legacy Module
+
+lang.attrib &= attribute lang { LanguageCode.datatype }?
+basefont = element basefont { basefont.attlist }
+basefont.attlist = id.attrib, Font.attrib
+center = element center { center.attlist, Flow.model }
+center.attlist = Common.attrib
+font = element font { font.attlist, Inline.model }
+font.attlist = Core.attrib, I18n.attrib, Font.attrib
+Font.attrib =
+  attribute size { text }?,
+  attribute color { Color.datatype }?,
+  attribute face { text }?
+s = element s { s.attlist, Inline.model }
+s.attlist = Common.attrib
+strike = element strike { strike.attlist, Inline.model }
+strike.attlist = Common.attrib
+u = element u { u.attlist, Inline.model }
+u.attlist = Common.attrib
+dir = element dir { dir.attlist, li.noblock+ }
+dir.attlist =
+  Common.attrib,
+  attribute compact { "compact" }?
+menu = element menu { menu.attlist, li.noblock+ }
+menu.attlist =
+  Common.attrib,
+  attribute compact { "compact" }?
+li.noblock = element li { li.attlist, Inline.model }
+isindex = element isindex { isindex.attlist }
+isindex.attlist =
+  Core.attrib,
+  I18n.attrib,
+  attribute prompt { Text.datatype }?
+applet.attlist &=
+  attribute align { "top" | "middle" | "bottom" | "left" | "right" }?,
+  attribute hspace { Pixels.datatype }?,
+  attribute vspace { Pixels.datatype }?
+body.attlist &=
+  attribute background { URI.datatype }?,
+  attribute bgcolor { Color.datatype }?,
+  attribute text { Color.datatype }?,
+  attribute link { Color.datatype }?,
+  attribute vlink { Color.datatype }?,
+  attribute alink { Color.datatype }?
+br.attlist &= attribute clear { "left" | "all" | "right" | "none" }?
+caption.attlist &= align.attrib
+div.attlist &= align.attrib
+# Not in the CR, but surely an error.
+dl.attlist &= attribute compact { "compact" }?
+Heading.attrib &= align.attrib
+hr.attlist &=
+  attribute align { "left" | "center" | "right" }?,
+  attribute noshade { "noshade" }?,
+  attribute size { Pixels.datatype }?,
+  attribute width { Pixels.datatype }?
+img.attlist &=
+  attribute align { "top" | "middle" | "bottom" | "left" | "right" }?,
+  attribute border { Pixels.datatype }?,
+  attribute hspace { Pixels.datatype }?,
+  attribute vspace { Pixels.datatype }?
+input.attlist &= align.attrib
+legend.attlist &=
+  attribute align { "top" | "bottom" | "left" | "right" }?
+li.attlist &=
+  attribute type { text }?,
+  attribute value { text }?
+object.attlist &=
+  attribute align { "top" | "middle" | "bottom" | "left" | "right" }?,
+  attribute border { Pixels.datatype }?,
+  attribute hspace { Pixels.datatype }?,
+  attribute vspace { Pixels.datatype }?
+ol.attlist &=
+  attribute type { text }?,
+  attribute compact { "compact" }?,
+  attribute start { text }?
+p.attlist &= align.attrib
+pre.attlist &= attribute width { Length.datatype }?
+script.attlist &= attribute language { ContentType.datatype }?
+table.attlist &=
+  align.attrib,
+  attribute bgcolor { Color.datatype }?
+tr.attlist &= attribute bgcolor { Color.datatype }?
+Cell.attrib &=
+  attribute nowrap { "nowrap" }?,
+  attribute bgcolor { Color.datatype }?,
+  attribute width { Pixels.datatype }?,
+  attribute height { Pixels.datatype }?
+ul.attlist &=
+  attribute type { text }?,
+  attribute compact { "compact" }?
+align.attrib = attribute align { "left" | "all" | "right" | "none" }?
+Color.datatype = text
+Inline.class |= font | basefont | s | strike | u
+Block.class |= center | isindex
+List.class |= dir | menu
+head.content &= isindex?
+Block.mix |= text | Inline.class
+# With the legacy module and the frames modules, the html
+# element can contain either body or frameset.
+frameset |= body
diff --git a/etc/schema/xhtml-link.rnc b/etc/schema/xhtml-link.rnc
new file mode 100644 (file)
index 0000000..9d0d6f1
--- /dev/null
@@ -0,0 +1,13 @@
+# Link Module
+
+link = element link { link.attlist }
+link.attlist =
+  Common.attrib,
+  attribute charset { Charset.datatype }?,
+  attribute href { URI.datatype }?,
+  attribute hreflang { LanguageCode.datatype }?,
+  attribute type { ContentType.datatype }?,
+  attribute rel { LinkTypes.datatype }?,
+  attribute rev { LinkTypes.datatype }?,
+  attribute media { MediaDesc.datatype }?
+head.content &= link*
diff --git a/etc/schema/xhtml-list.rnc b/etc/schema/xhtml-list.rnc
new file mode 100644 (file)
index 0000000..8b99404
--- /dev/null
@@ -0,0 +1,16 @@
+# List Module
+
+dl = element dl { dl.attlist, (dt | dd)+ }
+dl.attlist = Common.attrib
+dt = element dt { dt.attlist, Inline.model }
+dt.attlist = Common.attrib
+dd = element dd { dd.attlist, Flow.model }
+dd.attlist = Common.attrib
+ol = element ol { ol.attlist, li+ }
+ol.attlist = Common.attrib
+ul = element ul { ul.attlist, li+ }
+ul.attlist = Common.attrib
+li = element li { li.attlist, Flow.model }
+li.attlist = Common.attrib
+List.class = ul | ol | dl
+Block.class |= List.class
diff --git a/etc/schema/xhtml-meta.rnc b/etc/schema/xhtml-meta.rnc
new file mode 100644 (file)
index 0000000..ab0b5eb
--- /dev/null
@@ -0,0 +1,10 @@
+# Meta Module
+
+meta = element meta { meta.attlist }
+meta.attlist =
+  I18n.attrib,
+  attribute http-equiv { NMTOKEN.datatype }?,
+  attribute name { NMTOKEN.datatype }?,
+  attribute content { text }?,
+  attribute scheme { text }?
+head.content &= meta*
diff --git a/etc/schema/xhtml-nameident.rnc b/etc/schema/xhtml-nameident.rnc
new file mode 100644 (file)
index 0000000..ef4ad70
--- /dev/null
@@ -0,0 +1,10 @@
+# Name Identification Module
+
+a.attlist &= name.attlist
+applet.attlist &= name.attlist
+form.attlist &= name.attlist
+frame.attrib &= name.attlist
+iframe.attlist &= name.attlist
+img.attlist &= name.attlist
+map.attlist &= name.attlist
+name.attlist = attribute name { text }?
diff --git a/etc/schema/xhtml-object.rnc b/etc/schema/xhtml-object.rnc
new file mode 100644 (file)
index 0000000..ac65238
--- /dev/null
@@ -0,0 +1,24 @@
+# Object Module
+
+object =
+  element object {
+    object.attlist,
+    # No restrictions on mixed content in TREX.
+    param*,
+    Flow.model
+  }
+object.attlist =
+  Common.attrib,
+  attribute declare { "declare" }?,
+  attribute classid { URI.datatype }?,
+  attribute codebase { URI.datatype }?,
+  attribute data { URI.datatype }?,
+  attribute type { ContentType.datatype }?,
+  attribute codetype { ContentType.datatype }?,
+  attribute archive { URIs.datatype }?,
+  attribute standby { Text.datatype }?,
+  attribute height { Length.datatype }?,
+  attribute width { Length.datatype }?,
+  attribute name { text }?,
+  attribute tabindex { Number.datatype }?
+Inline.class |= object
diff --git a/etc/schema/xhtml-param.rnc b/etc/schema/xhtml-param.rnc
new file mode 100644 (file)
index 0000000..8a921ca
--- /dev/null
@@ -0,0 +1,9 @@
+# Param Module
+
+param = element param { param.attlist }
+param.attlist =
+  id.attrib,
+  attribute name { text },
+  attribute value { text }?,
+  attribute valuetype { "data" | "ref" | "object" }?,
+  attribute type { ContentType.datatype }?
diff --git a/etc/schema/xhtml-pres.rnc b/etc/schema/xhtml-pres.rnc
new file mode 100644 (file)
index 0000000..677372b
--- /dev/null
@@ -0,0 +1,18 @@
+hr = element hr { hr.attlist }
+hr.attlist = Common.attrib
+Block.class |= hr
+b = element b { b.attlist, Inline.model }
+b.attlist = Common.attrib
+big = element big { big.attlist, Inline.model }
+big.attlist = Common.attrib
+i = element i { i.attlist, Inline.model }
+i.attlist = Common.attrib
+small = element small { small.attlist, Inline.model }
+small.attlist = Common.attrib
+sub = element sub { sub.attlist, Inline.model }
+sub.attlist = Common.attrib
+sup = element sup { sup.attlist, Inline.model }
+sup.attlist = Common.attrib
+tt = element tt { tt.attlist, Inline.model }
+tt.attlist = Common.attrib
+Inline.class |= b | big | i | small | sub | sup | tt
diff --git a/etc/schema/xhtml-ruby.rnc b/etc/schema/xhtml-ruby.rnc
new file mode 100644 (file)
index 0000000..e55614d
--- /dev/null
@@ -0,0 +1,21 @@
+ruby =
+  element ruby {
+    ruby.attlist,
+    ((rb,
+      (rt | (rp, rt, rp)))
+     | (rbc, rtc, rtc?))
+  }
+ruby.attlist = Common.attrib
+rbc = element rbc { rbc.attlist, rb+ }
+rbc.attlist = Common.attrib
+rtc = element rtc { rtc.attlist, rt+ }
+rtc.attlist = Common.attrib
+rb = element rb { rb.attlist, Inline.model }
+rb.attlist = Common.attrib
+rt = element rt { rt.attlist, Inline.model }
+rt.attlist =
+  Common.attrib,
+  attribute rt { Number.datatype }?
+rp = element rp { rp.attlist, text }
+rp.attlist = Common.attrib
+Inline.class |= ruby
diff --git a/etc/schema/xhtml-script.rnc b/etc/schema/xhtml-script.rnc
new file mode 100644 (file)
index 0000000..fcf35b0
--- /dev/null
@@ -0,0 +1,15 @@
+# Script Module
+
+script = element script { script.attlist, text }
+script.attlist =
+  attribute charset { Charset.datatype }?,
+  attribute type { ContentType.datatype },
+  attribute src { URI.datatype }?,
+  attribute defer { "defer" }?,
+  attribute xml:space { "preserve" }?
+noscript = element noscript { noscript.attlist, Block.model }
+noscript.attlist = Common.attrib
+head.content &= script*
+Script.class = noscript | script
+Inline.class |= Script.class
+Block.class |= Script.class
diff --git a/etc/schema/xhtml-ssismap.rnc b/etc/schema/xhtml-ssismap.rnc
new file mode 100644 (file)
index 0000000..21a7496
--- /dev/null
@@ -0,0 +1,5 @@
+# Server-side Image Map Module
+
+# Depends on image module.
+
+img.attlist &= attribute ismap { "ismap" }?
diff --git a/etc/schema/xhtml-struct.rnc b/etc/schema/xhtml-struct.rnc
new file mode 100644 (file)
index 0000000..4c919c2
--- /dev/null
@@ -0,0 +1,14 @@
+# Structure Module
+
+start = html
+title = element title { title.attlist, text }
+title.attlist = I18n.attrib
+head = element head { head.attlist, head.content }
+head.attlist = I18n.attrib, profile.attlist
+head.content = title
+profile.attlist = attribute profile { URI.datatype }?
+body = element body { body.attlist, Block.model }
+body.attlist = Common.attrib
+html = element html { html.attlist, head, body }
+html.attlist = XHTML.version.attrib, I18n.attrib
+XHTML.version.attrib = attribute version { FPI.datatype }?
diff --git a/etc/schema/xhtml-style.rnc b/etc/schema/xhtml-style.rnc
new file mode 100644 (file)
index 0000000..93a52d5
--- /dev/null
@@ -0,0 +1,10 @@
+# Style Module
+
+style = element style { style.attlist, text }
+style.attlist =
+  title.attrib,
+  I18n.attrib,
+  attribute type { ContentType.datatype },
+  attribute media { MediaDesc.datatype }?,
+  attribute xml:space { "preserve" }?
+head.content &= style*
diff --git a/etc/schema/xhtml-table.rnc b/etc/schema/xhtml-table.rnc
new file mode 100644 (file)
index 0000000..70055b1
--- /dev/null
@@ -0,0 +1,67 @@
+# Tables Module
+
+# This builds on the basic tables module, unlike with the DTD
+# implementation.
+
+include "xhtml-basic-table.rnc" {
+  table =
+    element table {
+      table.attlist,
+      caption?,
+      (col* | colgroup*),
+      ((thead?, tfoot?, tbody+) | tr+)
+    }
+  th = element th { th.attlist, Flow.model }
+  td = element td { td.attlist, Flow.model }
+  CellHAlign.attrib =
+    attribute align {
+      "left" | "center" | "right" | "justify" | "char"
+    }?,
+    attribute char { Character.datatype }?,
+    attribute charoff { Length.datatype }?
+  CellVAlign.attrib =
+    attribute valign { "top" | "middle" | "bottom" | "baseline" }?
+  scope.attrib =
+    attribute scope { "row" | "col" | "rowgroup" | "colgroup" }?
+}
+table.attlist &=
+  attribute width { Length.datatype }?,
+  attribute border { Pixels.datatype }?,
+  frame.attrib,
+  rules.attrib,
+  attribute cellspacing { Length.datatype }?,
+  attribute cellpadding { Length.datatype }?
+col = element col { col.attlist }
+col.attlist =
+  Common.attrib,
+  attribute span { Number.datatype }?,
+  attribute width { MultiLength.datatype }?,
+  CellHAlign.attrib,
+  CellVAlign.attrib
+colgroup = element colgroup { colgroup.attlist, col* }
+colgroup.attlist =
+  Common.attrib,
+  attribute span { Number.datatype }?,
+  attribute width { MultiLength.datatype }?,
+  CellHAlign.attrib,
+  CellVAlign.attrib
+tbody = element tbody { tbody.attlist, tr+ }
+tbody.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+thead = element thead { thead.attlist, tr+ }
+thead.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+tfoot = element tfoot { tfoot.attlist, tr+ }
+tfoot.attlist = Common.attrib, CellHAlign.attrib, CellVAlign.attrib
+frame.attrib =
+  attribute frame {
+    "void"
+    | "above"
+    | "below"
+    | "hsides"
+    | "lhs"
+    | "rhs"
+    | "vsides"
+    | "box"
+    | "border"
+  }?
+rules.attrib =
+  attribute rules { "none" | "groups" | "rows" | "cols" | "all" }?
diff --git a/etc/schema/xhtml-target.rnc b/etc/schema/xhtml-target.rnc
new file mode 100644 (file)
index 0000000..505b379
--- /dev/null
@@ -0,0 +1,8 @@
+# Target Module
+
+a.attlist &= target.attrib
+area.attlist &= target.attrib
+base.attlist &= target.attrib
+link.attrib &= target.attrib
+form.attlist &= target.attrib
+target.attrib = attribute target { text }?
diff --git a/etc/schema/xhtml-text.rnc b/etc/schema/xhtml-text.rnc
new file mode 100644 (file)
index 0000000..c4283d4
--- /dev/null
@@ -0,0 +1,73 @@
+# Text Module
+
+br = element br { br.attlist, empty }
+br.attlist = Core.attrib
+span = element span { span.attlist, Inline.model }
+span.attlist = Common.attrib
+abbr = element abbr { abbr.attlist, Inline.model }
+abbr.attlist = Common.attrib
+acronym = element acronym { acronym.attlist, Inline.model }
+acronym.attlist = Common.attrib
+cite = element cite { cite.attlist, Inline.model }
+cite.attlist = Common.attrib
+code = element code { code.attlist, Inline.model }
+code.attlist = Common.attrib
+dfn = element dfn { dfn.attlist, Inline.model }
+dfn.attlist = Common.attrib
+em = element em { em.attlist, Inline.model }
+em.attlist = Common.attrib
+kbd = element kbd { kbd.attlist, Inline.model }
+kbd.attlist = Common.attrib
+q = element q { q.attlist, Inline.model }
+q.attlist =
+  Common.attrib,
+  attribute cite { URI.datatype }?
+samp = element samp { samp.attlist, Inline.model }
+samp.attlist = Common.attrib
+strong = element strong { strong.attlist, Inline.model }
+strong.attlist = Common.attrib
+var = element var { var.attlist, Inline.model }
+var.attlist = Common.attrib
+\div = element div { div.attlist, Flow.model }
+div.attlist = Common.attrib
+p = element p { p.attlist, Inline.model }
+p.attlist = Common.attrib
+address = element address { address.attlist, Inline.model }
+address.attlist = Common.attrib
+blockquote = element blockquote { blockquote.attlist, Block.model }
+blockquote.attlist =
+  Common.attrib,
+  attribute cite { URI.datatype }?
+pre = element pre { pre.attlist, Inline.model }
+pre.attlist =
+  Common.attrib,
+  attribute xml:space { "preserve" }?
+h1 = element h1 { Heading.attrib, Heading.content }
+h2 = element h2 { Heading.attrib, Heading.content }
+h3 = element h3 { Heading.attrib, Heading.content }
+h4 = element h4 { Heading.attrib, Heading.content }
+h5 = element h5 { Heading.attrib, Heading.content }
+h6 = element h6 { Heading.attrib, Heading.content }
+Heading.attrib = Common.attrib
+Heading.content = Inline.model
+Heading.class = h1 | h2 | h3 | h4 | h5 | h6
+Block.class = address | blockquote | \div | p | pre | Heading.class
+Inline.class =
+  abbr
+  | acronym
+  | br
+  | cite
+  | code
+  | dfn
+  | em
+  | kbd
+  | q
+  | samp
+  | span
+  | strong
+  | var
+Inline.model = (text | Inline.class)*
+# This is redefined by the legacy module to include inlines.
+Block.mix = Block.class
+Block.model = Block.mix+
+Flow.model = (text | Inline.class | Block.class)*
diff --git a/etc/schema/xhtml.rnc b/etc/schema/xhtml.rnc
new file mode 100644 (file)
index 0000000..3218cd7
--- /dev/null
@@ -0,0 +1,37 @@
+# XHTML
+
+# This corresponds to the union of transitional and frameset.
+
+default namespace = "http://www.w3.org/1999/xhtml"
+
+include "xhtml-datatypes.rnc"
+include "xhtml-attribs.rnc"
+# include "xhtml-struct.rnc"
+include "xhtml-frames.rnc"
+include "xhtml-text.rnc"
+include "xhtml-hypertext.rnc"
+include "xhtml-list.rnc"
+include "xhtml-image.rnc"
+include "xhtml-ssismap.rnc"
+include "xhtml-base.rnc"
+include "xhtml-link.rnc"
+include "xhtml-meta.rnc"
+include "xhtml-param.rnc"
+include "xhtml-object.rnc"
+include "xhtml-bdo.rnc"
+include "xhtml-pres.rnc"
+include "xhtml-edit.rnc"
+include "xhtml-applet.rnc"
+# include "xhtml-basic-form.rnc"
+include "xhtml-form.rnc"
+include "xhtml-style.rnc"
+include "xhtml-script.rnc"
+# include "xhtml-basic-table.rnc"
+include "xhtml-table.rnc"
+include "xhtml-csismap.rnc"
+include "xhtml-events.rnc"
+include "xhtml-inlstyle.rnc"
+include "xhtml-target.rnc"
+include "xhtml-iframe.rnc"
+include "xhtml-nameident.rnc"
+include "xhtml-legacy.rnc"
diff --git a/etc/schema/xslt.rnc b/etc/schema/xslt.rnc
new file mode 100644 (file)
index 0000000..573e6f9
--- /dev/null
@@ -0,0 +1,356 @@
+# $Id: xslt.rnc,v 1.1 2007/11/23 06:57:47 hexmode Exp $
+
+# This was mostly generated from the syntax summary in the XSLT
+# Recommendation (using XSLT of course).
+
+# Issues: this validates extension elements as literal result
+# elements, which is overly restrictive.
+
+namespace local = ""
+default namespace xsl = "http://www.w3.org/1999/XSL/Transform"
+
+start =
+  stylesheet.element
+  | transform.element
+  | literal-result-element-as-stylesheet
+version = "1.0"
+top-level-elements.model =
+  (top-level-element.category | top-level-extension)*
+top-level-extension =
+  element * - (xsl:* | local:*) {
+    grammar {
+      start = any
+      any =
+        (attribute * { text }
+         | text
+         | element * { any })*
+    }
+  }
+template.model = (instruction.category | literal-result-element | text)*
+literal-result-element-as-stylesheet =
+  element * - xsl:* {
+    attribute xsl:version { version },
+    literal-result-element-no-version.atts,
+    template.model
+  }
+literal-result-element =
+  element * - xsl:* { literal-result-element.atts, template.model }
+literal-result-element.atts =
+  literal-result-element-no-version.atts,
+  attribute xsl:version { version }?
+literal-result-element-no-version.atts =
+  (attribute * - xsl:* { avt.datatype }
+   | attribute xsl:extension-element-prefixes { prefixes.datatype }
+   | attribute xsl:exclude-result-prefixes { prefixes.datatype }
+   | attribute xsl:use-attribute-sets { qnames.datatype })*
+top-level-element.category =
+  include.element
+  | strip-space.element
+  | preserve-space.element
+  | template.element
+  | namespace-alias.element
+  | attribute-set.element
+  | variable.element
+  | param.element
+  | key.element
+  | decimal-format.element
+  | output.element
+instruction.category =
+  apply-templates.element
+  | apply-imports.element
+  | call-template.element
+  | element.element
+  | attribute.element
+  | text.element
+  | processing-instruction.element
+  | comment.element
+  | copy.element
+  | value-of.element
+  | number.element
+  | for-each.element
+  | if.element
+  | choose.element
+  | variable.element
+  | copy-of.element
+  | message.element
+  | fallback.element
+extension.atts = attribute * - (xsl:* | local:*) { text }*
+stylesheet.element = element stylesheet { stylesheet.model }
+transform.element = element transform { stylesheet.model }
+stylesheet.model =
+  extension.atts,
+  attribute id { xsd:NCName }?,
+  attribute extension-element-prefixes { prefixes.datatype }?,
+  attribute exclude-result-prefixes { prefixes.datatype }?,
+  attribute version { version },
+  (import.element*, top-level-elements.model)
+include.element =
+  element include {
+    extension.atts,
+    attribute href { xsd:anyURI }
+  }
+import.element =
+  element import {
+    extension.atts,
+    attribute href { xsd:anyURI }
+  }
+strip-space.element =
+  element strip-space {
+    extension.atts,
+    attribute elements { wildcards.datatype }
+  }
+preserve-space.element =
+  element preserve-space {
+    extension.atts,
+    attribute elements { wildcards.datatype }
+  }
+template.element =
+  element template {
+    extension.atts,
+    attribute match { pattern.datatype }?,
+    attribute name { qname.datatype }?,
+    attribute priority { number.datatype }?,
+    attribute mode { qname.datatype }?,
+    (param.element*, template.model)
+  }
+apply-templates.element =
+  element apply-templates {
+    extension.atts,
+    attribute select { expression.datatype }?,
+    attribute mode { qname.datatype }?,
+    (sort.element | with-param.element)*
+  }
+apply-imports.element = element apply-imports { extension.atts }
+call-template.element =
+  element call-template {
+    extension.atts,
+    attribute name { qname.datatype },
+    with-param.element*
+  }
+namespace-alias.element =
+  element namespace-alias {
+    extension.atts,
+    attribute stylesheet-prefix { prefix.datatype },
+    attribute result-prefix { prefix.datatype }
+  }
+element.element =
+  element element {
+    extension.atts,
+    attribute name { qname.datatype | expr-avt.datatype },
+    attribute namespace { xsd:anyURI | brace-avt.datatype }?,
+    attribute use-attribute-sets { qnames.datatype }?,
+    template.model
+  }
+attribute.element =
+  element attribute {
+    extension.atts,
+    attribute name { qname.datatype | expr-avt.datatype },
+    attribute namespace { xsd:anyURI | brace-avt.datatype }?,
+    template.model
+  }
+attribute-set.element =
+  element attribute-set {
+    extension.atts,
+    attribute name { qname.datatype },
+    attribute use-attribute-sets { qnames.datatype }?,
+    attribute.element*
+  }
+text.element =
+  element text {
+    extension.atts,
+    attribute disable-output-escaping {
+      xsd:string "yes" | xsd:string "no"
+    }?,
+    text
+  }
+processing-instruction.element =
+  element processing-instruction {
+    extension.atts,
+    attribute name { xsd:NCName | expr-avt.datatype },
+    template.model
+  }
+comment.element = element comment { extension.atts, template.model }
+copy.element =
+  element copy {
+    extension.atts,
+    attribute use-attribute-sets { qnames.datatype }?,
+    template.model
+  }
+value-of.element =
+  element value-of {
+    extension.atts,
+    attribute select { expression.datatype },
+    attribute disable-output-escaping {
+      xsd:string "yes" | xsd:string "no"
+    }?
+  }
+number.element =
+  element number {
+    extension.atts,
+    attribute level {
+      xsd:string "single" | xsd:string "multiple" | xsd:string "any"
+    }?,
+    attribute count { pattern.datatype }?,
+    attribute from { pattern.datatype }?,
+    attribute value { expression.datatype }?,
+    attribute format { avt.datatype }?,
+    attribute lang { xsd:NMTOKEN | expr-avt.datatype }?,
+    attribute letter-value {
+      xsd:string "alphabetic"
+      | xsd:string "traditional"
+      | expr-avt.datatype
+    }?,
+    attribute grouping-separator { char.datatype | expr-avt.datatype }?,
+    attribute grouping-size { number.datatype | expr-avt.datatype }?
+  }
+for-each.element =
+  element for-each {
+    extension.atts,
+    attribute select { expression.datatype },
+    (sort.element*, template.model)
+  }
+if.element =
+  element if {
+    extension.atts,
+    attribute test { expression.datatype },
+    template.model
+  }
+choose.element =
+  element choose { extension.atts, (when.element+, otherwise.element?) }
+when.element =
+  element when {
+    extension.atts,
+    attribute test { expression.datatype },
+    template.model
+  }
+otherwise.element = element otherwise { extension.atts, template.model }
+sort.element =
+  element sort {
+    extension.atts,
+    attribute select { expression.datatype }?,
+    attribute lang { xsd:NMTOKEN | expr-avt.datatype }?,
+    attribute data-type {
+      xsd:string "text"
+      | xsd:string "number"
+      | qname-but-not-ncname.datatype
+      | expr-avt.datatype
+    }?,
+    attribute order {
+      xsd:string "ascending"
+      | xsd:string "descending"
+      | expr-avt.datatype
+    }?,
+    attribute case-order {
+      xsd:string "upper-first"
+      | xsd:string "lower-first"
+      | expr-avt.datatype
+    }?
+  }
+variable.element =
+  element variable {
+    extension.atts,
+    attribute name { qname.datatype },
+    (attribute select { expression.datatype }
+     | template.model)
+  }
+param.element =
+  element param {
+    extension.atts,
+    attribute name { qname.datatype },
+    (attribute select { expression.datatype }
+     | template.model)
+  }
+copy-of.element =
+  element copy-of {
+    extension.atts,
+    attribute select { expression.datatype }
+  }
+with-param.element =
+  element with-param {
+    extension.atts,
+    attribute name { qname.datatype },
+    (attribute select { expression.datatype }
+     | template.model)
+  }
+key.element =
+  element key {
+    extension.atts,
+    attribute name { qname.datatype },
+    attribute match { pattern.datatype },
+    attribute use { expression.datatype }
+  }
+decimal-format.element =
+  element decimal-format {
+    extension.atts,
+    attribute name { qname.datatype }?,
+    attribute decimal-separator { char.datatype }?,
+    attribute grouping-separator { char.datatype }?,
+    attribute infinity { text }?,
+    attribute minus-sign { char.datatype }?,
+    attribute NaN { text }?,
+    attribute percent { char.datatype }?,
+    attribute per-mille { char.datatype }?,
+    attribute zero-digit { char.datatype }?,
+    attribute digit { char.datatype }?,
+    attribute pattern-separator { char.datatype }?
+  }
+message.element =
+  element message {
+    extension.atts,
+    attribute terminate { xsd:string "yes" | xsd:string "no" }?,
+    template.model
+  }
+fallback.element = element fallback { extension.atts, template.model }
+output.element =
+  element output {
+    extension.atts,
+    attribute method {
+      xsd:string "xml"
+      | xsd:string "html"
+      | xsd:string "text"
+      | qname-but-not-ncname.datatype
+    }?,
+    attribute version { xsd:NMTOKEN }?,
+    attribute encoding { text }?,
+    attribute omit-xml-declaration {
+      xsd:string "yes" | xsd:string "no"
+    }?,
+    attribute standalone { xsd:string "yes" | xsd:string "no" }?,
+    attribute doctype-public { text }?,
+    attribute doctype-system { text }?,
+    attribute cdata-section-elements { qnames.datatype }?,
+    attribute indent { xsd:string "yes" | xsd:string "no" }?,
+    attribute media-type { text }?
+  }
+prefixes.datatype = list { (xsd:NCName | "#default")* }
+prefix.datatype = xsd:NCName | "#default"
+wildcards.datatype =
+  list {
+    (xsd:QName
+     | xsd:token { pattern = "\*|\i\c*:\*" })*
+  }
+qname.datatype = xsd:QName
+qnames.datatype = list { xsd:QName* }
+char.datatype = xsd:string { length = "1" }
+number.datatype = xsd:decimal
+expression.datatype = text
+pattern.datatype = text
+qname-but-not-ncname.datatype = xsd:QName { pattern = ".*:.*" }
+# An AVT containing at least one expression.
+expr-avt.datatype =
+  xsd:string {
+    pattern =
+      """([^\{\}]|\{\{|\}\})*\{([^"'\{\}]|"[^"]*"|'[^']*')+\}([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
+  }
+# An AVT containing at least one brace; ie where instantiated AVT
+# is not the same as the literal AVT.
+brace-avt.datatype =
+  xsd:string {
+    pattern =
+      """[^\{\}]*(\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
+  }
+avt.datatype =
+  xsd:string {
+    pattern =
+      """([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"""
+  }
index 25e39c56ad1dd0ff5f48b36ff382663a50d82cc4..69351db078ba655991d238e1a43573a110bcec45 100644 (file)
@@ -1,3 +1,7 @@
+2007-11-17  Glenn Morris  <rgm@gnu.org>
+
+       * Makefile.in (check-declare): New target.
+
 2007-10-31  Glenn Morris  <rgm@gnu.org>
 
        * Makefile.in (install): Change ownership of installed files.
index ed17d8b5c8f6beb578863cb16171e2ebe13bce29..8ffa462c89602d5d806b3b892a328e9194113b9c 100644 (file)
@@ -277,3 +277,9 @@ maintainer-clean: distclean
 
 extraclean: maintainer-clean
        -rm -f *~ \#* m/?*~ s/?*~
+
+.PHONY: check-declare
+
+check-declare:
+       $(RUN-EMACS) -l $(buildlisppath)/emacs-lisp/check-declare \
+         --eval '(check-declare-directory "$(srcdir)")'
index 2c178ba8da9aa4f28de1be320ffc73dde8772d4d..2cc37d49dd40f684359a88367cc87e0b3362d929 100644 (file)
@@ -1,3 +1,40 @@
+2007-11-28  Jason Rumney  <jasonr@gnu.org>
+
+       * makefile.w32-in (VMS_SUPPORT): No longer byte-compiled.
+
+2007-11-27  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * pop.c (socket_connection): Remove AI_ADDRCONFIG.
+
+2007-11-19  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * pop.c (socket_connection): Move realhost out of #ifdefs.
+       Set realhost both for HAVE_GETADDRINFO and !HAVE_GETADDRINFO.
+
+2007-11-18  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * pop.c (socket_connection): Use getaddrinfo if available.
+
+2007-11-22  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * etags.c (default_C_help) [CTAGS]: differentiate the help string,
+       as the defaults in ctags are different from etags.
+
+2007-11-15  Francesco Potort\e,Al\e(B  <pot@gnu.org>
+
+       * etags.c: Make prototypes for extern definitions, and add all
+       that are needed to quench warnings on 64-bit.
+       (main): Use the same defaults for ctags as for etags: find
+       typedefs, structure tags, macro constants, enum constants, struct
+       members and global variables.
+       (make_C_tag) [DEBUG]: Add debugging printout.
+       (C_entries): In case '}' decrement bracelev before testing it.
+
+2007-11-15  Masatake YAMATO  <jet@gyve.org>
+
+       * etags.c (C_entries): In case '}', set fvdef to fvnone
+       unconditioned to (!ignoreindent && lp == newlb.buffer + 1).
+
 2007-11-01  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * makefile.w32-in (obj): Remove sunfns.o.
index 0412137496fe7d0d8c2c455042a660a93960e1de..23527171e485b1d2d032cea74f5bd6f19f2473df 100644 (file)
@@ -81,7 +81,7 @@ University of California, as described above. */
  * configuration file containing regexp definitions for etags.
  */
 
-char pot_etags_version[] = "@(#) pot revision number is 17.34";
+char pot_etags_version[] = "@(#) pot revision number is 17.38";
 
 #define        TRUE    1
 #define        FALSE   0
@@ -160,14 +160,20 @@ char pot_etags_version[] = "@(#) pot revision number is 17.34";
 #  include <stdlib.h>
 #  include <string.h>
 # else /* no standard C headers */
-   extern char *getenv ();
-   extern char *strcpy ();
-   extern char *strncpy ();
-   extern char *strcat ();
-   extern char *strncat ();
-   extern unsigned long strlen ();
-   extern PTR malloc ();
-   extern PTR realloc ();
+   extern char *getenv __P((const char *));
+   extern char *strcpy __P((char *, const char *));
+   extern char *strncpy __P((char *, const char *, unsigned long));
+   extern char *strcat __P((char *, const char *));
+   extern char *strncat __P((char *, const char *, unsigned long));
+   extern int strcmp __P((const char *, const char *));
+   extern int strncmp __P((const char *, const char *, unsigned long));
+   extern int system __P((const char *));
+   extern unsigned long strlen __P((const char *));
+   extern void *malloc __P((unsigned long));
+   extern void *realloc __P((void *, unsigned long));
+   extern void exit __P((int));
+   extern void free __P((void *));
+   extern void *memmove __P((void *, const void *, unsigned long));
 #  ifdef VMS
 #   define EXIT_SUCCESS        1
 #   define EXIT_FAILURE        0
@@ -491,7 +497,7 @@ static char
   *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
 
 static bool append_to_tagfile; /* -a: append to tags */
-/* The next five default to TRUE for etags, but to FALSE for ctags.  */
+/* 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++ */
@@ -508,7 +514,7 @@ 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 */
+static bool cplusplus;         /* .[hc] means C++, not C (undocumented) */
 static bool ignoreindent;      /* -I: ignore indentation in C */
 static bool packages_only;     /* --packages-only: in Ada, only tag packages*/
 
@@ -615,10 +621,19 @@ 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' keyowrds are met inside the file.
+   given, or if the `class' or `template' keywords are met inside the file.
    That is why default_C_entries is called for these. */
 static char *default_C_suffixes [] =
   { "c", "h", NULL };
+#if CTAGS                              /* C help for Ctags */
+static 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 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\
@@ -629,6 +644,7 @@ definitions and `enum' constants are tags unless you specify\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 char *Cplusplus_suffixes [] =
   { "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
@@ -883,7 +899,7 @@ etags --help --lang=ada.");
 # define EMACS_NAME "standalone"
 #endif
 #ifndef VERSION
-# define VERSION "17.34"
+# define VERSION "17.38"
 #endif
 static void
 print_version ()
@@ -1239,15 +1255,12 @@ main (argc, argv)
   argbuffer = xnew (argc, argument);
 
   /*
-   * If etags, always find typedefs and structure tags.  Why not?
+   * Always find typedefs and structure tags.
    * Also default to find macro constants, enum constants, struct
-   * members and global variables.
+   * members and global variables.  Do it for both etags and ctags.
    */
-  if (!CTAGS)
-    {
-      typedefs = typedefs_or_cplusplus = constantypedefs = TRUE;
-      globals = members = TRUE;
-    }
+  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. */
@@ -1498,6 +1511,7 @@ main (argc, argv)
       exit (EXIT_SUCCESS);
     }
 
+  /* From here on, we are in (CTAGS && !cxref_style) */
   if (update)
     {
       char cmd[BUFSIZ];
@@ -3006,11 +3020,6 @@ consider_token (str, len, c, c_extp, bracelev, parlev, is_func_or_var)
        return TRUE;
      }
 
-   /*
-    * This structdef business is NOT invoked when we are ctags and the
-    * file is plain C.  This is because a struct tag may have the same
-    * name as another tag, and this loses with ctags.
-    */
    switch (toktype)
      {
      case st_C_javastruct:
@@ -3246,16 +3255,16 @@ make_C_tag (isfun)
 {
   /* This function is never called when token.valid is FALSE, but
      we must protect against invalid input or internal errors. */
-  if (!DEBUG && !token.valid)
-    return;
-
   if (token.valid)
     make_tag (token_name.buffer, token_name.len, isfun, token.line,
              token.offset+token.length+1, token.lineno, token.linepos);
-  else                         /* this case is optimised 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);
+  else if (DEBUG)
+    {                            /* this branch is optimised 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", NULL);
+    }
 
   token.valid = FALSE;
 }
@@ -3978,7 +3987,7 @@ C_entries (c_ext, inf)
              make_C_tag (FALSE);  /* a struct or enum */
              break;
            }
-         bracelev++;
+         bracelev += 1;
          break;
        case '*':
          if (definedef != dnone)
@@ -3992,23 +4001,21 @@ C_entries (c_ext, inf)
        case '}':
          if (definedef != dnone)
            break;
+         bracelev -= 1;
          if (!ignoreindent && lp == newlb.buffer + 1)
            {
              if (bracelev != 0)
-               token.valid = FALSE;
+               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
+         else if (bracelev < 0)
            {
-             if (--bracelev < 0)
-               {
-                 bracelev = 0;
-                 token.valid = FALSE; /* something gone amiss, token unreliable */
-               }
-             if (bracelev == 0 && fvdef == vignore)
-               fvdef = fvnone;         /* end of function */
+             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. */
index 8e01c9dfeaf3e3e3bb4ae55269f86d6f73ab9f95..8b327bfabf821a7247d521b597dca5301d4d5f46 100644 (file)
@@ -187,8 +187,8 @@ MSDOS_SUPPORT = \
        $(lispsource)international/ccl.elc \
        $(lispsource)international/codepage.elc
 VMS_SUPPORT = \
-       $(lispsource)vmsproc.elc \
-       $(lispsource)vms-patch.elc
+       $(lispsource)vmsproc.el \
+       $(lispsource)vms-patch.el
 TOOLTIP_SUPPORT = $(lispsource)tooltip.elc
 WINDOW_SUPPORT = \
        $(lispsource)fringe.elc \
index 9fcbe4b370cdc3c2744e24005c11785860ec7d05..5e6623aaf8d0473bc0a3f1f6dde8b31406e4b506 100644 (file)
@@ -1010,12 +1010,19 @@ socket_connection (host, flags)
      char *host;
      int flags;
 {
+#ifdef HAVE_GETADDRINFO
+  struct addrinfo *res, *it;
+  struct addrinfo hints;
+  int ret;
+#else /* !HAVE_GETADDRINFO */
   struct hostent *hostent;
+#endif
   struct servent *servent;
   struct sockaddr_in addr;
   char found_port = 0;
   char *service;
   int sock;
+  char *realhost;
 #ifdef KERBEROS
 #ifdef KERBEROS5
   krb5_error_code rem;
@@ -1031,11 +1038,11 @@ socket_connection (host, flags)
   CREDENTIALS cred;
   Key_schedule schedule;
   int rem;
-  char *realhost;
 #endif /* KERBEROS5 */
 #endif /* KERBEROS */
 
   int try_count = 0;
+  int connect_ok;
 
 #ifdef WINDOWSNT
   {
@@ -1097,6 +1104,46 @@ socket_connection (host, flags)
 
     }
 
+#ifdef HAVE_GETADDRINFO
+  memset (&hints, 0, sizeof(hints));
+  hints.ai_socktype = SOCK_STREAM;
+  hints.ai_flags = AI_CANONNAME;
+  hints.ai_family = AF_INET;
+  do
+    {
+      ret = getaddrinfo (host, service, &hints, &res);
+      try_count++;
+      if (ret != 0 && (ret != EAI_AGAIN || try_count == 5))
+       {
+         strcpy (pop_error, "Could not determine POP server's address");
+         return (-1);
+       }
+    } while (ret != 0);
+
+  if (ret == 0)
+    {
+      it = res;
+      while (it)
+        {
+          if (it->ai_addrlen == sizeof (addr))
+            {
+              struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr;
+              bcopy (&in_a->sin_addr, (char *) &addr.sin_addr,
+                     sizeof (addr.sin_addr));
+              if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr)))
+                break;
+            }
+          it = it->ai_next;
+        }
+      connect_ok = it != NULL;
+      if (connect_ok)
+        {
+          realhost = alloca (strlen (it->ai_canonname) + 1);
+          strcpy (realhost, it->ai_canonname);
+        }
+      freeaddrinfo (res);
+    }
+#else /* !HAVE_GETADDRINFO */
   do
     {
       hostent = gethostbyname (host);
@@ -1116,10 +1163,18 @@ socket_connection (host, flags)
        break;
       hostent->h_addr_list++;
     }
+  connect_ok = *hostent->h_addr_list != NULL;
+  if (! connect_ok)
+    {
+      realhost = alloca (strlen (hostent->h_name) + 1);
+      strcpy (realhost, hostent->h_name);
+    }
+
+#endif /* !HAVE_GETADDRINFO */
 
 #define CONNECT_ERROR "Could not connect to POP server: "
 
-  if (! *hostent->h_addr_list)
+  if (! connect_ok)
     {
       CLOSESOCKET (sock);
       strcpy (pop_error, CONNECT_ERROR);
@@ -1130,6 +1185,7 @@ socket_connection (host, flags)
     }
 
 #ifdef KERBEROS
+
 #define KRB_ERROR "Kerberos error connecting to POP server: "
   if (! (flags & POP_NO_KERBEROS))
     {
@@ -1157,7 +1213,7 @@ socket_connection (host, flags)
       if (rem = krb5_cc_get_principal (kcontext, ccdef, &client))
        goto krb5error;
 
-      for (cp = hostent->h_name; *cp; cp++)
+      for (cp = realhost; *cp; cp++)
        {
          if (isupper (*cp))
            {
@@ -1165,7 +1221,7 @@ socket_connection (host, flags)
            }
        }
 
-      if (rem = krb5_sname_to_principal (kcontext, hostent->h_name,
+      if (rem = krb5_sname_to_principal (kcontext, realhost,
                                         POP_SERVICE, FALSE, &server))
        goto krb5error;
 
@@ -1210,7 +1266,6 @@ socket_connection (host, flags)
        }
 #else  /* ! KERBEROS5 */
       ticket = (KTEXT) malloc (sizeof (KTEXT_ST));
-      realhost = strdup (hostent->h_name);
       rem = krb_sendauth (0L, sock, ticket, "pop", realhost,
                          (char *) krb_realmofhost (realhost),
                          (unsigned long) 0, &msg_data, &cred, schedule,
@@ -1218,7 +1273,6 @@ socket_connection (host, flags)
                          (struct sockaddr_in *) 0,
                          "KPOPV0.1");
       free ((char *) ticket);
-      free (realhost);
       if (rem != KSUCCESS)
        {
          strcpy (pop_error, KRB_ERROR);
index ba0a5477f009f5b11f35f131d5acb63937d9c930..b1214e069bf63f54f3e2be513245e4d84bf13325 100644 (file)
-2007-11-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+2007-12-06  Glenn Morris  <rgm@gnu.org>
 
-       * ldefs-boot.el: Regenerate.
+       * progmodes/antlr-mode.el (antlr-keyword, antlr-syntax)
+       (antlr-ruledef, antlr-tokendef, antlr-ruleref-face)
+       (antlr-tokenref, antlr-literal): Inherit from standard font-lock
+       faces in non-light-background case.
+
+       * add-log.el, dired-aux.el, font-lock.el, help-fns.el, ido.el:
+       * informat.el, emacs-lisp/bytecomp.el, emacs-lisp/gulp.el:
+       * emacs-lisp/tcover-ses.el, emacs-lisp/timer.el, emulation/edt.el:
+       * emulation/vi.el, emulation/viper-cmd.el:
+       * international/titdic-cnv.el, mail/emacsbug.el, progmodes/dcl.el:
+       * progmodes/prolog.el, progmodes/ps-mode.el, progmodes/python.el:
+       * textmodes/fill.el: Remove directory part from filenames in
+       function declarations.
+
+       * dired-aux.el (mailcap-mime-info): Update declaration.
+
+2007-12-05  Richard Stallman  <rms@gnu.org>
+
+       * wid-edit.el (widget-type): Doc fix.
+
+2007-12-05  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/perl-mode.el (perl-font-lock-syntactic-keywords):
+       Don't match "sub { (...) ... }".
+
+2007-12-05  Richard Stallman  <rms@gnu.org>
+
+       * international/mule-cmds.el (toggle-input-method-active): New var.
+       (toggle-input-method): Bind toggle-input-method-active to t.
+       Error if it was already non-nil.
+
+2007-12-05  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * net/tls.el (tls-hostmismatch, open-tls-stream): Checkdoc cleanup.
+
+2007-12-05  Elias Oltmanns  <eo@nebensachen.de>
+
+       * net/tls.el (open-tls-stream): Actually consult tls-checktrust to
+       see if certs should be verified and what is to be done in the
+       event of a verification failure.
+
+2007-12-05  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * net/tls.el (tls-program): Provide more custom choices from
+       `tls-checktrust'.  Refer to `tls-checktrust' in doc string.
+       (tls-process-connection-type, tls-success): Remove "*" in doc string.
+       (tls-checktrust, tls-hostmismatch, tls-untrusted): Add custom
+       version.  Minor improvement to doc strings.
+       (tls-program): Add comment.
+
+2007-12-05  Elias Oltmanns  <eo@nebensachen.de>
+
+       * net/tls.el (tls-certtool-program, tls-hostmismatch): New variables.
+       (tls-checktrust): New variable.  Check if GNU TLS complained about a
+       mismatch between the hostname provided in the certificate and the name
+       of the host connnecting to.
+       (open-tls-stream): Use them.  Check certificates against trusted root
+       certificates.
+
+2007-12-05  Nathan J. Williams  <nathanw@MIT.EDU>  (tiny change)
+
+       * net/imap.el (imap-mailbox-status-asynch): Upcase STATUS items.
+       (imap-parse-status): Upcase status-att for broken servers that sends
+       them lower-case (e.g., MS Exchange 2007).
+
+2007-12-05  D. Goel  <deego3@gmail.com>
+
+       * simple.el (undo):
+       * image-dired.el (image-dired-display-thumb-properties):
+       (image-dired-modify-mark-on-thumb-original-file):
+       (image-dired-dired-display-properties):
+       * help.el (help-window-display-message):
+       * files.el (hack-local-variables-confirm):
+       * ediff.el (ediff-version):
+       * complete.el (pc-chunk-after, PC-temp-minibuffer-message):
+       `message' and `error': Ensure that first arg is a format string.
+
+       * emacs-lisp/find-func.el (find-library-name): Prefer files with
+       ".el" suffix over "".
+
+2007-12-05  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/dbus.el (dbus-hash-table=): Allow nil as wildcard in the
+       interface and member fields.
+
+2007-12-05  Glenn Morris  <rgm@gnu.org>
+
+       * eshell/em-alias.el (pcomplete-stub): Define for compiler.
+       (pcomplete-here): Autoload it.
+
+       * eshell/em-basic.el (print-func): No need to define for compiler.
+
+       * eshell/esh-cmd.el (eshell-debug-command):
+       * eshell/esh-io.el (eshell-print): Move definitions before use.
+
+       * eshell/esh-module.el (eshell-load-defgroups): Eval and compile.
+
+       * eshell/esh-util.el (top-level): Don't require pp.  Use
+       condition-case rather than ignore-errors.
+
+       * eshell/eshell.el (eshell-buffer-name): Define for compiler.
+
+       * eshell/em-alias.el, eshell/em-banner.el, eshell/em-basic.el
+       * eshell/em-cmpl.el, eshell/em-dirs.el, eshell/em-glob.el
+       * eshell/em-hist.el, eshell/em-ls.el, eshell/em-pred.el
+       * eshell/em-prompt.el, eshell/em-rebind.el, eshell/em-script.el
+       * eshell/em-smart.el, eshell/em-term.el, eshell/em-unix.el
+       * eshell/em-xtra.el, eshell/esh-cmd.el, eshell/esh-test.el
+       * eshell/esh-util.el, eshell/eshell.el: Require individual files
+       if needed when compiling, rather than esh-maint.  Collect any
+       require statements.  Move provide statement to end.  Move any
+       commentary to start.
+
+       * eshell/esh-arg.el, eshell/esh-ext.el, eshell/esh-io.el:
+       * eshell/esh-mode.el, eshell/esh-module.el, eshell/esh-opt.el:
+       * eshell/esh-proc.el, eshell/esh-var.el:
+       Require individual files if needed when compiling, rather than
+       esh-maint.  Collect any require statements.  Leave provide at start.
+       Move any commentary to start.
+
+       * emacs-lisp/bytecomp.el (byte-compile-declare-function): Remove
+       declared function from byte-compile-noruntime-functions.
+
+       * ediff-util.el (ediff-version):
+       * progmodes/python.el (compilation-shell-minor-mode):
+       * textmodes/org.el (Info-goto-node, calendar-astro-date-string)
+       (calendar-bahai-date-string, calendar-check-holidays)
+       (calendar-chinese-date-string, calendar-coptic-date-string)
+       (calendar-ethiopic-date-string, calendar-forward-day)
+       (calendar-french-date-string, calendar-goto-date)
+       (calendar-goto-today, calendar-hebrew-date-string)
+       (calendar-islamic-date-string, calendar-iso-date-string)
+       (calendar-julian-date-string, calendar-mayan-date-string)
+       (calendar-persian-date-string, gnus-summary-last-subject)
+       (parse-time-string, rmail-show-message): Declare as functions.
+
+2007-12-05  Michael Olson  <mwolson@gnu.org>
+
+       * textmodes/remember.el: Merge contents of remember-diary.el here,
+       updating header.  Add autoload cookie so that byte-compilation
+       works without warning.
+       (remember-diary-file): Default to nil, since diary might not yet
+       be loaded at this point, which would deny us access to diary-file.
+       (remember-diary-extract-entries): If remember-diary-file is nil,
+       then use diary-file instead.
+
+       * textmodes/remember-diary.el: Remove, due to the issue of needing
+       the first 8 characters of a filename to be unique.
+
+2007-12-04  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/dbus.el (dbus-hash-table=): New defun.
+       (dbus-hash-table-test) New hash table test function, used in
+       `dbus-registered-functions-table'.
+       (dbus-check-event, dbus-handle-event, dbus-event-bus-name)
+       (dbus-event-service-name, dbus-event-path-name)
+       (dbus-event-interface-name, dbus-event-member-name): Rewritten,
+       due to new structure of `dbus-event'.
+
+2007-12-04  Juanma Barranquero  <lekktu@gmail.com>
+
+       * ido.el (ido-save-history): Set the `coding' local
+       variable in the first line of the file.
+
+2007-12-04  Glenn Morris  <rgm@gnu.org>
+
+       * password-cache.el: Move here from gnus/password.el.
+       (top-level): Don't require cl when compiling.
+       (password-read-and-add): Doc fix.  Make obsolete.
+
+       * net/tramp.el: Require password-cache or password.
+
+       * emulation/cua-base.el (top-level): Move (provide 'cua-base) to end.
+       No longer provide 'cua.  Don't require cua-rect, cua-gmrk when
+       compiling.
+       (cua-set-rectangle-mark): Add doc string to autoload.
+       (cua--rectangle, cua--last-killed-rectangle)
+       (cua--global-mark-active): Always define for compiler.
+       (cua-copy-rectangle, cua-cut-rectangle, cua--rectangle-left)
+       (cua--delete-rectangle, cua--insert-rectangle)
+       (cua--rectangle-corner, cua--rectangle-assert)
+       (cua--insert-at-global-mark, cua--global-mark-post-command):
+       Declare as functions.
+
+       * emulation/cua-gmrk.el (top-level): Move provide to end.
+
+       * emulation/cua-rect.el (top-level): Move provide to end.
+       Don't require cua-gmrk when compiling.
+       (cua--cut-rectangle-to-global-mark)
+       (cua--copy-rectangle-to-global-mark): Declare as functions.
+
+       * emulation/viper-init.el (viper-replace-overlay-cursor-color)
+       (viper-insert-state-cursor-color, viper-emacs-state-cursor-color)
+       (viper-vi-state-cursor-color):
+       Consolidate make-variable-frame-local calls.
+
+       * net/eudcb-bbdb.el (bbdb-address-streets): Declare as a function.
+       (eudc-bbdb-extract-addresses): Use bbdb-address-streets rather
+       than bbdb-address-street1,2,3.
+
+       * textmodes/reftex-toc.el (reftex-make-separate-toc-frame):
+       Try x-focus-frame before focus-frame.  Only try focus-frame on XEmacs.
+
+2007-12-03  Karl Fogel  <kfogel@red-bean.com>
+
+       * saveplace.el (save-place-quiet): Remove, reverting 2007-12-02T19:54:46Z!kfogel@red-bean.com.
+       (save-place-alist-to-file, load-save-place-alist-from-file):
+       Don't print non-error messages at all, there's really no need.
+       Do print if there's a problem, and clarify message in that case.
+
+2007-12-03  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * ediff-diff.el (ediff-prepare-error-list):
+       * ediff-util.el (ediff-setup): Disable undo for ediff-error-buffer.
+
+2007-12-03  Tassilo Horn  <tassilo@member.fsf.org>
+
+       * doc-view.el (doc-view-initiate-display): Use `doc-view-mode-p'.
+       (doc-view-current-overlay, doc-view-pending-cache-flush):
+       Add doc string.
+
+2007-12-03  Richard Stallman  <rms@gnu.org>
+
+       * subr.el (declare-function): Moved from byte-run.el.
+
+       * emacs-lisp/byte-run.el (declare-function): Moved to subr.el
+
+       * window.el (recenter-top-bottom): Don't use `ecase'.
+
+2007-12-02  Karl Fogel  <kfogel@red-bean.com>
+
+       * saveplace.el (save-place-alist-to-file): Set
+       coding-system-for-write once and refer to it throughout.
+       Suggested by David Reitter <dreitter{_AT_}inf.ed.ac.uk>.
+
+2007-12-02  Karl Fogel  <kfogel@red-bean.com>
+
+       * saveplace.el (save-place-alist-to-file): Use `utf-8' coding
+       system when writing, and set it in the first-line file variables.
+       Suggested by David Reitter <dreitter{_AT_}inf.ed.ac.uk> and
+       Juanma Barranquero.
+
+2007-12-02  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/bytecomp.el (byte-compile-declare-function):
+       Reverse branches of if statement.
+
+       * emulation/viper-cmd.el (top-level): Don't require advice.
+       Don't load viper-util, viper-keym, viper-mous, viper-macs,
+       viper-ex when compiling.
+
+       * emulation/viper-ex.el (top-level): Don't load viper-util,
+       viper-keym when compiling.
+
+       * emulation/viper-init.el (top-level): Move provide statement to end.
+
+       * emulation/viper-keym.el (top-level): Don't load viper-util when
+       compiling.  Move provide statement to end.
+
+       * emulation/viper-macs.el (top-level): Don't load viper-util,
+       viper-keym, viper-mous when compiling.
+
+       * emulation/viper-mous.el (top-level): Don't load viper-util when
+       compiling.
+
+       * emulation/viper-util.el (top-level): Don't load viper-init when
+       compiling.
+
+       * emulation/viper.el (top-level): Don't require ring.
+       Don't load viper-init, viper-cmd when compiling.
+
+       * net/sasl-cram.el, net/sasl-digest.el, net/sasl-ntlm.el, net/sasl.el:
+       Move here from gnus/.
+
+2007-12-02  Karl Fogel  <kfogel@red-bean.com>
+
+       Offer option for saveplace to be quiet about loading and saving.
+       Suggested by David Reitter <dreitter{_AT_}inf.ed.ac.uk>
+
+       * lisp/saveplace.el (save-place-quiet): New customizable boolean.
+       (save-place-alist-to-file, load-save-place-alist-from-file): Use it
+       to determine whether to print loading/saving messages.
+
+2007-12-02  Glenn Morris  <rgm@gnu.org>
+
+       * mail/binhex.el: Move here from gnus/.
+       (binhex): New custom group.
+       (binhex-decoder-program, binhex-decoder-switches)
+       (binhex-use-external): Move to the binhex custom group.
+
+       * mail/uudecode.el: Move here from gnus/.
+       (uudecode): New custom group.
+       (uudecode-decoder-program, uudecode-decoder-switches)
+       (uudecode-use-external): Move to the uudecode custom group.
+
+       * net/netrc.el (top-level): Don't load `encrypt' features.
+       (netrc-parse): Don't use encrypt.
+       (netrc-find-service-name, netrc-find-service-number): Don't use caddr.
+
+       * progmodes/python.el (top-level): Don't require cl when compiling.
+
+2007-12-02  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
+
+       * textmodes/flyspell.el (flyspell-large-region): Explicitly set
+       encoding for aspell process and for communication with it.
+       Only add "-d" option if not already present.
+       Use ispell-current-dictionary and ispell-current-personal-dictionary.
+       General reorganization.
+
+       * textmodes/ispell.el (ispell-aspell-find-dictionary): Do not set
+       encoding here.
+       (ispell-start-process): Explicitly set encoding here if using aspell.
+
+2007-12-02  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * pcvs.el (cvs-mode-commit, cvs-mode-edit-log): Also pass a diff
+       function to log-edit.
+
+2007-12-02  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/dbus.el: New file.
+
+2007-12-02  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc.el (calc-lang-slash-idiv, calc-lang-allow-underscores)
+       (calc-lang-c-type-hex, calc-lang-brackets-are-subscripts)
+       (calc-lang-parens-are-subscripts): New variables.
+       (math-expr-special-function-mapping): Remove variable.
+       (math-eqn-ignore-words, math-tex-ignore-words)
+       (math-latex-ignore-words): Move to calc-lang.el.
+
+       * calc/calc-lang.el (math-compose-vector, math-compose-var)
+       (math-tex-expr-is-flat): Declare as functions.
+       (calc-lang-slash-idiv, calc-lang-allow-underscores)
+       (math-comp-left-bracket, math-comp-right-bracket)
+       (math-comp-comma, math-comp-vector-prec): Declare as variables.
+       (math-var-formatter, math-matrix-formatter)
+       (math-lang-adjust-words, math-lang-read-symbol, math-land-read)
+       (math-punc-table, math-compose-subscr,math-dots)
+       (math-func-formatter): New property names to store language
+       specific information.
+       (math-compose-tex-var, math-compose-tex-intv)
+       (math-compose-maple-intv, math-compose-eqn-intv)
+       (math-compose-tex-sum, math-compose-tex-func)
+       (math-compose-tex-intv): New functions.
+       (math-eqn-ignore-words,math-tex-ignore-words)
+       (math-latex-ignore-words): Move from calc.el.
+       (math-special-function-table): Add entries for tex.
+       (calc-lang-slash-idiv, calc-lang-allows-underscores):
+       New variables.
+       (math-compose-latex-frac): Rename from `math-latex-print-frac'.
+       (math-compose-tex-matrix, math-compose-eqn-matrix)
+       (math-eqn-special-functions): Move from calccomp.el.
+
+       * calc/calccomp.el (math-compose-var): New function.
+       (math-compose-expr): Allow more special functions to be used.
+       Change test for formatting fractions.  Use variables and property
+       names to help with language specific formatting.
+       (math-compose-tex-matrix, math-compose-eqn-matrix)
+       (math-eqn-special-functions): Move to calc-lang.el.
+       (math-compose-rows): Use property names to help with language
+       specific formatting.
+
+       * calc/calc-aent.el (math-read-factor): Turn multiple subscripts
+       into nested subscripts.
+       (math-read-token): Use variables and property names to help with
+       language specific parsing.
+       (math-read-expression-level): Use variables to help with language
+       specific parsing.
+
+2007-12-02  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * arc-mode.el (archive-find-type): Add recognition of rar-exe format.
+       (archive-rar-summarize): Allow the file name to be passed as argument.
+       Remove unused vars `header' and `footer'.
+       (archive-rar-exe-summarize, archive-rar-exe-extract): New functions.
+
+2007-12-01  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * log-edit.el (log-edit-show-diff): New function.
+       (log-edit-mode-map, log-edit-menu): Bind it.
+       (log-edit-diff-function): New variable.
+       (log-edit): Change the 3rd param to be an alist and accept a
+       function that computes a diff for the files involved.
+
+       * vc.el (vc-log-edit): Add a diff function parameter to log-edit.
+
+2007-12-01  Martin Rudalics  <rudalics@gmx.at>
+
+       * play/blackbox.el (bb-up, bb-down): Revert 2007-10-21 change and
+       wrap next-/previous-line in with-no-warnings.
+
+2007-12-01  Glenn Morris  <rgm@gnu.org>
+
+       * format-spec.el, hex-util.el, sha1.el: Move here from gnus/.
+
+       * net/dig.el: Move here from gnus/.
+       (dig-mode): Replace gnus-run-mode-hooks with equivalent expansion.
+
+       * net/dns.el: Move here from gnus/.
+       (top-level): Don't require mm-util, or cl when compiling.
+       (dns-write-name, dns-read, dns-read-type, query-dns):
+       Replace mm-with-unibyte-buffer with its expansion.
+       (query-dns): Replace decf and ignore-errors with non-cl equivalents.
+
+       * progmodes/gdb-ui.el (gud-remove, gud-break):
+       * progmodes/gud.el (gdb-create-define-alist)
+       (gdb-restore-windows, gdb-reset, global-hl-line-highlight)
+       (hl-line-highlight, gdb-display-source-buffer)
+       (gdb-display-buffer, c-langelem-sym, c-langelem-pos)
+       (syntax-symbol, syntax-point, gdb-enqueue-input): Declare as functions.
+
+2007-11-30  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * textmodes/org-export-latex.el (org-export-latex-cleaned-string):
+       Move args on defun line.
+
+       * textmodes/org.el (org-calendar-holiday):
+       Use calendar-check-holidays instead of the obsolete
+       check-calendar-holidays.
+       (add-to-diary-list, table--at-cell-p, Info-find-node, bbdb)
+       (bbdb-company, bbdb-current-record, bbdb-name)
+       (bbdb-record-getprop, bbdb-record-name)
+       (bibtex-beginning-of-entry, bibtex-generate-autokey)
+       (bibtex-parse-entry, bibtex-url, cdlatex-tab)
+       (dired-get-filename, gnus-article-show-summary, mh-display-msg)
+       (mh-find-path, mh-get-header-field, mh-get-msg-num)
+       (mh-header-display, mh-index-previous-folder)
+       (mh-normalize-folder-name, mh-search, mh-search-choose, mh-show)
+       (mh-show-buffer-message-number, mh-show-header-display)
+       (mh-show-msg, mh-show-show, mh-visit-folder)
+       (org-export-latex-cleaned-string, remember)
+       (remember-buffer-desc, rmail-narrow-to-non-pruned-header)
+       (rmail-what-message, elmo-folder-exists-p)
+       (elmo-message-entity-field, elmo-message-field)
+       (vm-beginning-of-message, vm-follow-summary-cursor)
+       (vm-get-header-contents, vm-isearch-narrow, vm-isearch-update)
+       (vm-select-folder-buffer, vm-su-message-id, vm-su-subject)
+       (vm-summarize, wl-folder-get-elmo-folder)
+       (wl-summary-goto-folder-subr)
+       (wl-summary-jump-to-msg-by-message-id, wl-summary-line-from)
+       (wl-summary-line-subject, wl-summary-message-number)
+       (wl-summary-redisplay): Declare as functions.
+
+2007-11-30  Martin Rudalics  <rudalics@gmx.at>
+
+       * longlines.el (longlines-show-hard-newlines): Remove handling of
+       buffer-undo-list and buffer-modified status.
+       (longlines-show-region, longlines-unshow-hard-newlines):
+       Handle buffer-undo-list, buffer-modified status, inhibit-read-only, and
+       inhibit-modification-hooks here to avoid that a buffer appears
+       modified when toggling visibility of hard newlines.
+
+2007-11-30  Glenn Morris  <rgm@gnu.org>
+
+       * nxml/rng-maint.el (rng-do-some-validation): Fix declaration.
+
+       * progmodes/idlw-complete-structtag.el
+       (idlwave-sintern-structtag):
+       * progmodes/idlw-help.el (idlwave-sintern-sysvar)
+       (idlwave-sintern-sysvartag):
+       * progmodes/idlwave.el (idlwave-sintern-class-tag)
+       (idlwave-sintern-sysvar, idlwave-sintern-sysvartag): Declare as
+       functions.
+
+2007-11-30  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * textmodes/reftex-index.el (texmathp):
+       * textmodes/reftex-auc.el (TeX-argument-insert)
+       (TeX-argument-prompt, multi-prompt, LaTeX-add-index-entries)
+       (LaTeX-add-labels, LaTeX-bibitem-list, LaTeX-index-entry-list)
+       (LaTeX-label-list):
+       * nxml/rng-maint.el (rng-clear-cached-state, rng-clear-overlays)
+       (rng-clear-conditional-region, rng-do-some-validation): Declare as
+       functions.
+       (rng-error-count, rng-validate-up-to-date-end): Pacify byte compiler.
+
+2007-11-30  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/byte-run.el (declare-function): Add optional fourth
+       argument and document it.
+
+       * emacs-lisp/bytecomp.el (byte-compile-declare-function):
+       Third argument to declare-function must be a list to specify arglist.
+
+       * emacs-lisp/check-declare.el (check-declare-scan): Doc fix.
+       Handle declare-function third argument `t' and fourth argument.
+       (check-declare-verify): Doc fix.  Handle `fileonly' case.
+       Use progn rather than prog1.
+
+       * desktop.el (uniquify-item-base):
+       * term/mac-win.el (url-type): Declare as functions.
+
+       * net/eudcb-bbdb.el (bbdb-phone-location, bbdb-record-phones)
+       (bbdb-address-city, bbdb-address-state, bbdb-address-zip)
+       (bbdb-address-location, bbdb-record-addresses): Pass non-nil
+       fourth arg to declare-function.
+
+       * play/dunnet.el: Don't require cl when compiling.
+       (byte-compile-warnings): Set via file local variables.
+       (dun-parse): Let-bind `beg' and `line'.
+
+2007-11-29  Alexandre Julliard  <julliard@winehq.org>
+
+       * vc-git.el (vc-git-dir-state): Fix the git command arguments.
+
+2007-11-29  Ari Roponen  <ari.roponen@gmail.com>  (tiny change)
+
+       * calendar/time-date.el (encode-time-value): Doc fix.
+
+2007-11-29  Glenn Morris  <rgm@gnu.org>
+
+       * calendar/time-date.el (with-decoded-time-value): Doc fix.
+
+       * textmodes/css-mode.el (prog-mode): Remove.
+       (css-mode): Derive from fundamental-mode rather than prog-mode.
+
+       * emacs-lisp/byte-run.el (declare-function): Doc fix.
+
+       * emacs-lisp/check-declare.el (check-declare-locate)
+       (check-declare-verify): Handle `external' files.
+       (check-declare-errmsg): New function.
+       (check-declare-verify, check-declare-file, check-declare-directory):
+       Use check-declare-errmsg to report the number of problems.
+
+       * ffap.el (w3-view-this-url)
+       * mail/mspools.el (vm-visit-folder)
+       * net/browse-url.el (w3-fetch-other-window, w3-fetch)
+       * net/eudcb-bbdb.el (bbdb-phone-location, bbdb-phone-string)
+       (bbdb-record-phones, bbdb-address-city, bbdb-address-state)
+       (bbdb-address-zip, bbdb-address-location, bbdb-record-addresses)
+       (bbdb-records)
+       * net/eudc-export.el (bbdb-parse-phone-number, bbdb-string-trim)
+       * net/imap.el (sasl-find-mechanism, sasl-mechanism-name)
+       (sasl-make-client, sasl-next-step, sasl-step-data)
+       (sasl-step-set-data)
+       * net/newsticker.el (w3m-toggle-inline-image, htmlr-reset)
+       (htmlr-step): Declare as functions.
+
+       * net/eudcb-bbdb.el (eudc-bbdb-extract-addresses):
+       Use bbdb-address-zip rather than bbdb-address-zip-string.
+
+2007-11-28  Richard Stallman  <rms@gnu.org>
+
+       * md4.el, net/hmac-def.el, net/hmac-md5.el, net/ntlm.el:
+       Move here from gnus/.
+
+2007-11-28  Martin Rudalics  <rudalics@gmx.at>
+
+       * newcomment.el (comment-region-internal): Fix newline insertion
+       in `block' case.
+
+2007-11-28  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * pcvs-parse.el (cvs-parse-table): Adjust regexp for resurrections.
+
+2007-11-28  Glenn Morris  <rgm@gnu.org>
+
+       * Makefile.in (maintainer-clean): Depend on bootstrap-clean to
+       delete .elc files.
+
+       * nxml/char-name/unicode: Move to etc/nxml/.
+       * nxml/nxml-uchnm.el (top-level): Adapt for moved unicode files.
+
+       * nxml/nxml-enc.el (xmltok-get-declared-encoding-position):
+       Declare as a function.
+
+       * nxml/nxml-maint.el (nxml-create-unicode-char-name-sets):
+       * nxml/nxml-mode.el (nxml-get-char-name, nxml-insert-named-char):
+       * nxml/xsd-regexp.el (xsdre-gen-categories): Change mapcar -> mapc.
+
+       * nxml/nxml-outln.el (nxml-token-start-tag-p)
+       (nxml-token-end-tag-p): Move definitions before use.
+
+       * nxml/nxml-rap.el (nxml-prolog-regions): Declare for compiler.
+
+       * nxml/nxml-uchnm.el (top-level)
+       (nxml-enable-unicode-char-name-sets-1): Use mapc rather than mapcar.
+       (nxml-enabled-unicode-blocks): Add custom group.
+
+       * nxml/xmltok.el (xmltok-scan-char-ref, xmltok-char-number):
+       Use string-to-number rather than string-to-int.
+
+       * dired-x.el (dired-omit-old-add-entry): Declare as function.
+       Move definition before use.
+       (dired-old-find-buffer-nocreate): Declare as function.
+
+       * emacs-lisp/check-declare.el (check-declare-locate): Reflow doc.
+       (check-declare-verify): Handle fset.
+
+       * emulation/edt.el (edt-user-emulation-setup):
+       Test edt-setup-user-bindings is bound before calling.
+
+       * emulation/tpu-edt.el: Don't require cl when compiling.
+       (tpu-emacs-search, tpu-emacs-rev-search): Declare as functions.
+       (tpu-edt-off): Use condition-case rather than ignore-errors.
+       Use with-no-warnings.
+
+       * eshell/esh-util.el (top-level): Use require rather than load for
+       ange-ftp.
+
+       * mail/supercite.el (sc-version): Redefine as an alias for
+       emacs-version.
+       (sc-help-address): Remove.
+       (sc-version): Use emacs-version rather than sc-version.
+       (sc-submit-bug-report): Redefine as an alias for report-emacs-bug.
+
+       * net/socks.el (socks-original-open-network-stream): Declare as
+       function.  Move definition before use.
+
+2007-11-28  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-ext.el (math-sqrt-raw, math-map-vec)
+       (math-make-frac): Declare as functions.
+
+2007-11-27  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * progmodes/cperl-mode.el (compilation-error-regexp-alist):
+       Pacify byte compiler.
+       (cperl-mode): Use with-no-warnings for setting vc-header-alist.
+
+       * progmodes/idlwave.el (idlwave-shell-get-path-info)
+       (idlwave-shell-temp-file, idlwave-shell-is-running)
+       (widget-value, comint-dynamic-complete-filename, Info-goto-node):
+       * progmodes/idlw-help.el (idlwave-prepare-structure-tag-completion)
+       (idlwave-all-method-classes, idlwave-all-method-keyword-classes)
+       (idlwave-beginning-of-statement, idlwave-best-rinfo-assoc)
+       (idlwave-class-found-in, idlwave-class-or-superclass-with-tag)
+       (idlwave-completing-read, idlwave-current-routine)
+       (idlwave-downcase-safe, idlwave-entry-find-keyword)
+       (idlwave-expand-keyword, idlwave-find-class-definition)
+       (idlwave-find-inherited-class, idlwave-find-struct-tag)
+       (idlwave-get-buffer-visiting, idlwave-in-quote)
+       (idlwave-make-full-name, idlwave-members-only)
+       (idlwave-popup-select, idlwave-routine-source-file)
+       (idlwave-routines, idlwave-sintern-class)
+       (idlwave-sintern-keyword, idlwave-sintern-method)
+       (idlwave-sintern-routine-or-method)
+       (idlwave-substitute-link-target, idlwave-sys-dir)
+       (idlwave-this-word, idlwave-what-module-find-class)
+       (idlwave-where):
+       * progmodes/idlw-complete-structtag.el (idlwave-shell-buffer):
+       * mail/uce.el (rmail-msg-is-pruned)
+       (rmail-maybe-set-message-counters, rmail-msgbeg, rmail-msgend)
+       (rmail-toggle-header):
+       * mail/sendmail.el (dired-view-file, dired-get-filename):
+       * mail/rmailkwd.el (rmail-maybe-set-message-counters)
+       (rmail-display-labels, rmail-msgbeg)
+       (rmail-set-message-deleted-p, rmail-message-labels-p)
+       (rmail-show-message, mail-comma-list-regexp)
+       (mail-parse-comma-list):
+       * mail/rmail.el (rmail-spam-filter, rmail-summary-goto-msg)
+       (rmail-summary-mark-undeleted, rmail-summary-mark-deleted)
+       (rfc822-addresses, mail-abbrev-make-syntax-table)
+       (mail-sendmail-delimit-header, mail-header-end):
+       * mail/hashcash.el (message-narrow-to-headers-or-head)
+       (message-fetch-field, message-goto-eoh)
+       (message-narrow-to-headers):
+       * vc.el (view-mode-exit): Declare as functions.
+
+       * mail/vms-pmail.el:
+       * vmsproc.el:
+       * vms-patch.el: Don't byte compile these files, they don't work.
+
+2007-11-27  Glenn Morris  <rgm@gnu.org>
+
+       * calc/calc-ext.el (math-read-big-rec):
+       * calc/calc-nlfit.el (math-map-binop):
+       * calc/calc.el (math-normalize-nonstandard): Fix declarations.
+
+       * eshell/eshell.el (eshell-report-bug): Add version number of
+       obsolescence.
+
+       * emulation/viper.el, emulation/viper-util.el,
+       emulation/viper-macs.el, emulation/viper-keym.el,
+       emulation/viper-ex.el, emulation/viper-cmd.el:
+       Load viper-*.el files silently.
+
+       * ediff-diff.el, ediff-help.el, ediff-merg.el, ediff-mult.el,
+       ediff-ptch.el, ediff-util.el, ediff-vers.el, ediff-wind.el, ediff.el:
+       Load ediff-*.el files silently.
+
+       * ediff.el: Load dired silently.  Don't load info, pcl-cvs when
+       compiling.
+       (Info-goto-node): Declare as a function.
+
+       * ediff-init.el: Don't load ange-ftp when compiling.
+       * ediff-util.el: Don't load reporter when compiling.
+
+       * ediff-wind.el (ediff-display-pixel-width)
+       (ediff-display-pixel-height):
+       * generic-x.el (ini-generic-mode):
+       * ps-print.el (ps-mule-encode-header-string, ps-mule-begin-page)
+       (ps-mule-prepare-ascii-font, ps-mule-set-ascii-font)
+       (ps-mule-initialize, ps-mule-begin-job):
+       * calendar/cal-bahai.el (add-to-diary-list, diary-name-pattern)
+       (mark-calendar-days-named):
+       * calendar/cal-hebrew.el (holiday-filter-visible-calendar)
+       (add-to-diary-list, diary-name-pattern)
+       (mark-calendar-days-named):
+       * calendar/cal-islam.el (add-to-diary-list, diary-name-pattern)
+       (mark-calendar-days-named):
+       * calendar/cal-x.el (make-fancy-diary-buffer):
+       * calendar/holidays.el (calendar-absolute-from-julian):
+       * calendar/todo-mode.el (calendar-current-date):
+       * calendar/cal-menu.el (calendar-increment-month)
+       (calendar-month-name, extract-calendar-year)
+       (calendar-cursor-to-date, holiday-list, calendar-sunrise-sunset)
+       (calendar-current-date, calendar-cursor-holidays)
+       (calendar-date-string, insert-diary-entry, calendar-set-mark)
+       (cal-tex-cursor-day, cal-tex-cursor-week, cal-tex-cursor-week2)
+       (cal-tex-cursor-week-iso, cal-tex-cursor-week-monday)
+       (cal-tex-cursor-filofax-daily, cal-tex-cursor-filofax-2week)
+       (cal-tex-cursor-filofax-week, cal-tex-cursor-month)
+       (cal-tex-cursor-month-landscape, cal-tex-cursor-year)
+       (cal-tex-cursor-filofax-year, cal-tex-cursor-year-landscape)
+       (calendar-day-of-year-string, calendar-iso-date-string)
+       (calendar-julian-date-string, calendar-astro-date-string)
+       (calendar-absolute-from-gregorian, calendar-hebrew-date-string)
+       (calendar-persian-date-string, calendar-bahai-date-string)
+       (calendar-islamic-date-string, calendar-chinese-date-string)
+       (calendar-coptic-date-string, calendar-ethiopic-date-string)
+       (calendar-french-date-string, calendar-mayan-date-string)
+       (calendar-print-chinese-date, calendar-goto-date):
+       Declare as functions.
+
+       * calendar/calendar.el (nongregorian-diary-listing-hook): Doc fix.
+       (Info-find-emacs-command-nodes, Info-find-node): Declare as functions.
+
+       * ffap.el (ffap-bug, ffap-submit-bug): Redefine as obsolete
+       aliases for report-emacs-bug.
+       (gnus-summary-select-article, gnus-configure-windows): Declare as
+       functions.
+
+       * pgg-parse.el (pgg-parse-24, pgg-parse-crc24-string): Declare for
+       compiler.
+
+       * pgg.el (pgg-clear-string): Declare as a function.
+       (pgg-run-at-time-1): Wrap whole definition in (featurep 'xemacs) test.
+       (pgg-run-at-time, pgg-cancel-timer): Move definitions before use.
+
+       * emacs-lisp/check-declare.el (check-declare-locate):
+       Handle compressed files.
+       (check-declare-verify): Handle define-generic-mode,
+       define-global(ized)-minor-mode, define-obsolete-function-alias.
+
+2007-11-27  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-menu.el (calc-modes-menu): Add normal and incomplete
+       algebraic modes.
+
+       * calc/calc-aent.el (calc-refresh-evaltos, calc-execute-kbd-macro)
+       (math-is-true, calc-explain-why, calc-alg-edit)
+       (math-composite-inequalities, math-flatten-lands)
+       (math-multi-subst, calcFunc-vmatches, math-simplify)
+       (math-known-matrixp, math-parse-fortran-subscr, math-to-radians-2)
+       (math-read-string, math-read-brackets, math-read-angle-brackets):
+       Declare as functions.
+
+       * calc/calcalg3.el (calc-fit-s-shaped-logistic-curve)
+       (calc-fit-bell-shaped-logistic-curve)
+       (calc-fit-hubbert-linear-curve, calc-graph-add-curve)
+       (calc-graph-lookup, calc-graph-set-styles, math-min-list)
+       (math-max-list): Declare as functions.
+       (math-map-binop): New function.
+       (calc-curve-fit): Replace `mapcar*' by `math-map-binop'.
+
+       * calc/calc.el (calc-set-language, calc-edit-finish)
+       (calc-edit-cancel, calc-do-quick-calc, calc-do-calc-eval)
+       (calc-do-keypad, calcFunc-unixtime, math-parse-date)
+       (math-lessp, calc-embedded-finish-command)
+       (calc-embedded-select-buffer, calc-embedded-mode-line-change)
+       (calc-push-list-in-macro, calc-replace-selections)
+       (calc-record-list, calc-normalize-fancy, calc-do-handle-whys)
+       (calc-top-selected, calc-sel-error, calc-pop-stack-in-macro)
+       (calc-embedded-stack-change, calc-refresh-evaltos)
+       (calc-do-refresh, calc-binary-op-fancy, calc-unary-op-fancy)
+       (calc-delete-selection, calc-alg-digit-entry, calc-alg-entry)
+       (calc-dots, calc-temp-minibuffer-message, math-read-radix-digit)
+       (calc-digit-dots, math-normalize-fancy, math-normalize-nonstandard)
+       (math-recompile-eval-rules, math-apply-rewrites, calc-record-why)
+       (math-dimension-error, calc-incomplete-error, math-float-fancy)
+       (math-neg-fancy, math-zerop, calc-add-fractions)
+       (math-add-objects-fancy, math-add-symb-fancy, math-mul-zero)
+       (calc-mul-fractions, math-mul-objects-fancy, math-mul-symb-fancy)
+       (math-reject-arg, math-div-by-zero, math-div-zero, math-make-frac)
+       (calc-div-fractions, math-div-objects-fancy, math-div-symb-fancy)
+       (math-compose-expr, math-comp-width, math-composition-to-string)
+       (math-stack-value-offset-fancy, math-format-flat-expr-fancy)
+       (math-adjust-fraction, math-format-binary, math-format-radix)
+       (math-group-float, math-mod, math-format-number-fancy)
+       (math-format-bignum-fancy, math-read-number-fancy)
+       (calc-do-grab-region, calc-do-grab-rectangle, calc-do-embedded)
+       (calc-do-embedded-activate, math-do-defmath)
+       (calc-load-everything): Declare as functions.
+
+       * calc/calc-ext.el (math-clip, math-round, math-simplify)
+       (math-simplify-extended, math-simplify-units, calc-set-language)
+       (calc-flush-caches, calc-save-modes, calc-embedded-modes-change)
+       (calc-embedded-var-change, math-mul-float, math-arctan-raw)
+       (math-sqrt-float, math-exp-minus-1-raw, math-normalize-polar)
+       (math-normalize-hms, math-normalize-mod, math-make-sdev)
+       (math-make-intv, math-normalize-logical-op, math-possible-signs)
+       (math-infinite-dir, math-calcFunc-to-var)
+       (calc-embedded-evaluate-expr, math-known-nonzerop)
+       (math-read-expr-level, math-read-big-rec, math-read-big-balance)
+       (math-format-date, math-vector-is-string, math-vector-to-string)
+       (math-format-radix-float, math-compose-expr, math-abs)
+       (math-format-bignum-binary, math-format-bignum-octal)
+       (math-format-bignum-hex, math-format-bignum-radix)
+       (math-compute-max-digits): Declare as functions.
+       (math-provably-realp): Fix typo.
+
+       * calc/calc-forms.el (calendar-current-time-zone)
+       (calendar-absolute-from-gregorian, dst-in-effect): Declare as
+       functions.
+
+       * calc/calc-help.el (Info-goto-node, Info-last): Declare as functions.
+
+       * calc/calc-lang.el (math-read-factor, math-read-expr-level):
+       Declare as functions.
+
+       * calc/calc-macs.el (math-zerop, math-negp, math-looks-negp)
+       (math-posp, math-compare, math-bignum, math-compare-bignum):
+       Declare as functions.
+
+       * calc/calc-misc.el (calc-do-keypad, calc-inv-hyp-prefix-help)
+       (calc-inverse-prefix-help, calc-hyperbolic-prefix-help)
+       (calc-explain-why, calc-clear-command-flag)
+       (calc-roll-down-with-selections, calc-roll-up-with-selections)
+       (calc-last-args, calc-is-inverse, calc-do-prefix-help)
+       (math-objvecp, math-known-scalarp, math-vectorp, math-matrixp)
+       (math-trunc-special, math-trunc-fancy, math-floor-special)
+       (math-floor-fancy, math-square-matrixp, math-matrix-inv-raw)
+       (math-known-matrixp, math-mod-fancy, math-pow-of-zero)
+       (math-pow-zero, math-pow-fancy): Declare as functions.
+
+       * calc/calc-mode.el (calc-embedded-save-original-modes):
+       Declare as a function.
+
+       * calc/calc-nlfit.el (calc-get-fit-variables, math-map-binop):
+       Declare as functions.
+       (math-nlfit-make-matrix, math-nlfit-find-qmax, math-nlfit-fit)
+       (math-nlfit-fit-curve, calc-fit-hubbert-linear-curve):
+       Replace `mapcar*' by `math-map-binop'.
+       (math-nlfit-make-matrix): Replace `copy-list' with `copy-sequence'.
+
+       * calc/calc-prog.el (edmacro-format-keys,edmacro-parse-keys)
+       (math-read-expr-level): Declare as functions.
+
+       * calc/calc-vec.el (math-read-expr-level): Declare as a function.
+
+2007-11-26  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/lisp.el (end-of-defun): Restructure so that
+       end-of-defun-function is called consistently, even for negative
+       arguments.
+       (end-of-defun-function): Default to forward-sexp.
+
+2007-11-26  Juanma Barranquero  <lekktu@gmail.com>
+
+       * emacs-lisp/bytecomp.el (batch-byte-recompile-directory): Doc fix.
+
+2007-11-26  Glenn Morris  <rgm@gnu.org>
+
+       * calendar/cal-menu.el (cal-menu-holidays-menu): Use :label rather
+       than :suffix.
+
+       * emacs-lisp/easymenu.el (easy-menu-define): Doc fix.
+
+2007-11-26  Simon Josefsson  <simon@josefsson.org>
+
+       * net/imap.el: Move from ../gnus.
+
+2007-11-25  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * doc-view.el (doc-view-mode-p): New function.
+
+2007-11-25  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * mail/mspools.el (rmail-get-new-mail):
+       * mail/reporter.el (mail-position-on-field, mail-text):
+       * mail/rmail.el (mail-position-on-field, mail-text-start)
+       (rmail-update-summary):
+       * mail/rmailedit.el (rmail-summary-disable, rmail-summary-enable):
+       * mail/rmailmsc.el (rmail-parse-file-inboxes, rmail-show-message):
+       * mail/rmailout.el (rmail-update-summary):
+       * mail/rmailsort.el (rmail-update-summary):
+       * mail/sendmail.el (dired-move-to-filename, dired-get-filename)
+       (dired-view-file):
+       * mail/uce.el (mail-strip-quoted-names):
+       * mail/undigest.el (rmail-update-summary):
+       * mail/unrmail.el (mail-strip-quoted-names):
+       * ediff.el (diff-latest-backup-file): Declare as functions.
+
+       * obsolete/mlsupport.el (ml-previous-page): Fix typo.
+       (kill-to-end-of-line):
+       * obsolete/rnews.el (news-set-minor-modes):
+       Remove non working functions.
+
+2007-11-25  Glenn Morris  <rgm@gnu.org>
+
+       * eshell/esh-maint.el (top-level): Use require with NOERROR for
+       pcomplete.  Don't mess with load-path.
+
+       * eshell/eshell.el (eshell-report-bug-address): Remove.
+       (eshell-report-bug): Redefine as an alias for report-emacs-bug.
+
+2007-11-24  Glenn Morris  <rgm@gnu.org>
+
+       * calendar/appt.el: Remove leading `*' from defcustom doc-strings.
+       (appt-disp-window): Don't require electric.
+       Simplify minibuffer-avoidance code.
+       (appt-select-lowest-window): Avoid minibuffer.
+
+       * eshell/eshell.el: Remove leading `*' from defcustom doc-strings.
+       (esh-mode): Require it.
+       (esh-util): Use require rather than featurep and load.
+       (eshell): No need to test if eshell-mode is bound; remove obsolete
+       reference to eshell-auto.
+       (eshell-command, eshell-command-result): Don't require esh-mode
+       now that the file does.
+       (top-level): Move provide statement to the end of the file.
+       Re-order and update commentary.
+
+2007-11-24  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * vc.el (vc-annotate-mode): Frob buffer invisibility spec.
+       (vc-annotate-toggle-annotation-visibility): New command.
+       (vc-annotate-mode-map): Bind "V" to it.
+       (vc-annotate-mode-menu): Add entry for it.
+       (vc-annotate-get-time-set-line-props): New func.
+       (vc-annotate-display-autoscale)
+       (vc-annotate-display-difference): Use it.
+
+       * vc-git.el (vc-git-annotate-time): Handle optional field FILENAME.
+       Also, match one space at end of annotation text, after last paren.
+
+2007-11-24  Michael Albinus  <michael.albinus@gmx.de>
+
+       * ido.el (ido-file-name-all-completions-1): Check for fboundp of
+       `tramp-completion-mode-p' as it is in Tramp 2.1.  Let-bind
+       `tramp-completion-mode'.
+
+2007-11-24  Thien-Thi Nguyen  <ttn@gnuvola.org>
+
+       * vc-git.el (vc-git-show-log-entry): New func.
+
+       * vc-git.el (vc-git--call, vc-git--out-ok): New funcs.
+       (vc-git-state): Use vc-git--call.
+       (vc-git-registered, vc-git-working-revision)
+       (vc-git-previous-revision, vc-git-next-revision)
+       (vc-git--run-command-string, vc-git-symbolic-commit):
+       Use vc-git--out-ok.
+
+2007-11-24  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/byte-run.el (declare-function): Doc fix.
+
+2007-11-24  Kenichi Handa  <handa@m17n.org>
+
+       * international/ucs-tables.el (ucs-8859-7-alist): Update the table.
+
+2007-11-23  David Kastrup  <dak@gnu.org>
+
+       * server.el (server-process-filter): Use `command-line-args-left'.
+
+2007-11-23  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * nxml/subdirs.el, nxml/char-data/subdirs.el, nxml/rng-auto.el: Remove.
+
+2007-11-23  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc.el (vc-deduce-fileset): Also look for a fileset in the parent
+       buffer if the parent buffer is in vc-dired-mode.
+
+2007-11-23  Mark A. Hershberger  <mah@everybody.org>
+
+       * nxml: Initial merge of nxml.  Kept nxml/char-name subdir for now.
+
+2007-11-23  Juri Linkov  <juri@jurta.org>
+
+       * dired.el (dired-read-dir-and-switches): For C-x d, set the
+       value for M-n to the visited file name of the current buffer.
+       Use minibuffer-with-setup-hook to set minibuffer-default to
+       buffer-file-name inside read-file-name.
+
+       * man.el (Man-getpage-in-background): Don't disregard user option
+       `Man-width' on non-window systems.  Remove test for `window-system'
+       around setting envvar "COLUMNS" depending on the value of `Man-width'.
+
+       * progmodes/grep.el (grep-process-setup): Set envvar "TERM" to
+       "emacs-grep".  Set envvar "GREP_OPTIONS" to "--color=auto" instead
+       of "--color=always".
+
+2007-11-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/lisp.el (beginning-of-defun-raw): Pass `arg' down to
+       beginning-of-defun-function.
+
+2007-11-22  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * mail/hashcash.el: Move from ../gnus.  Add hashcash payments to email.
+
+2007-11-22  Glenn Morris  <rgm@gnu.org>
+
+       * emulation/cua-base.el (x-clipboard-yank): Fix declaration.
+
+       * emacs-lisp/check-declare.el (check-declare-locate): New function.
+       (check-declare-scan): Use check-declare-locate.
+       (check-declare-verify): No longer adjust fnfile, now
+       check-declare-locate does it.
+
+       * emacs-lisp/byte-run.el (declare-function): Doc fix.
+
+2007-11-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * subr.el (posn-col-row): Make the `default-value' use explicit.
+
+       * window.el (balance-windows): Remove unused var `counter'.
+       (bw-balance-sub): Remove unused var `lastchild'.
+       (split-window-vertically): Remove unused var `switch'.
+       (recenter-top-bottom): Remove unused vars `bottom', `current', `total'.
+
+       * emacs-lisp/bytecomp.el
+       (byte-compile-file-form-custom-declare-variable): Simplify.
+
+2007-11-22  Juanma Barranquero  <lekktu@gmail.com>
+
+       * cus-edit.el (custom-mode): Define with `define-derived-mode'.
+       Set `show-trailing-whitespace' to nil.
+
+       * dired.el (make-symbolic-link):
+       * dired-aux.el (mailcap-parse-mailcaps, mailcap-parse-mimetypes)
+       (mailcap-extension-to-mime, mailcap-mime-info, make-symbolic-link):
+       * dired-x.el (make-symbolic-link):
+       * frame.el (x-initialize-window-system):
+       * menu-bar.el (x-menu-bar-open):
+       * select.el (x-get-cut-buffer-internal, x-rotate-cut-buffers-internal)
+       (x-store-cut-buffer-internal):
+       * wdired.el (make-symbolic-link):
+       * x-dnd.el (x-register-dnd-atom, x-get-atom-name)
+       (x-send-client-message):
+       * emulation/cua-base.el (x-clipboard-yank): Declare as functions.
+
+2007-11-22  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * term/x-win.el (x-gtk-map-stock): Check if FILE is a string.
+
+2007-11-22  Glenn Morris  <rgm@gnu.org>
+
+       * dos-fns.el (int86):
+       * term/mac-win.el (mac-font-panel-mode): Fix declarations.
+
+       * calendar/cal-menu.el (cal-menu-holidays-menu): Fix holiday-list call.
+
+       * calendar/holidays.el (holiday-list): Add autoload cookie.
+
+       * emacs-lisp/check-declare.el (check-declare-scan): Expand .c
+       files relative to src/ directory.
+       (check-declare-verify): Handle .c files.  Warn if could not find
+       an arglist to check.
+
+       * emacs-lisp/byte-run.el (declare-function): Doc fix.
+
+2007-11-22  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * replace.el (occur-mode-map): Add a major mode menu with entries
+       for all occur operations.
+
+       * international/titdic-cnv.el (dos-8+3-filename):
+       * obsolete/fast-lock.el (msdos-long-file-names):
+       * frame.el (msdos-mouse-p):
+       * files.el (msdos-long-file-names, w32-long-file-name):
+       * term/mac-win.el (mac-code-convert-string, mac-coerce-ae-data)
+       (mac-resume-apple-event, mac-font-panel-mode)
+       (mac-atsu-font-face-attributes, mac-ae-set-reply-parameter)
+       (mac-clear-font-name-table):
+       * term/pc-win.el (msdos-remember-default-colors)
+       (w16-set-clipboard-data, w16-get-clipboard-data):
+       * term/w32-win.el (w32-send-sys-command, w32-select-font)
+       (set-message-beep):
+       * net/browse-url.el (w32-shell-execute):
+       * w32-fns.el (set-message-beep, w32-get-clipboard-data)
+       (w32-get-locale-info, w32-get-valid-locale-ids)
+       (w32-set-clipboard-data):
+       * dos-fns.el (int86, msdos-long-file-names):
+       * dos-w32.el (default-printer-name): Declare as functions.
+
+2007-11-21  Jason Rumney  <jasonr@gnu.org>
+
+       * emacs-lisp/byte-run.el (declare-function): Return nil.
+
+2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/sh-script.el (sh-mode): Set defun-prompt-regexp.
+
+2007-11-21  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
+
+       * ps-print.el (ps-lpr-switches): Docstring fix.
+       (ps-string-list): New fun.
+       (ps-do-despool): Code fix.
+
+2007-11-21  Juanma Barranquero  <lekktu@gmail.com>
+
+       * w32-fns.el: Undo 2007-11-21 change by Dan Nicolaescu.
+
+2007-11-21  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/check-declare.el (check-declare-verify): Skip C files
+       for now.  Handle define-minor-mode, and defalias (with no argument
+       checking).
+
+2007-11-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * frame.el (msdos-mouse-p):
+       * files.el (msdos-long-file-names, w32-long-file-name):
+       * term/mac-win.el (mac-code-convert-string, mac-coerce-ae-data)
+       (mac-resume-apple-event, mac-font-panel-mode)
+       (mac-atsu-font-face-attributes, mac-ae-set-reply-parameter)
+       (mac-clear-font-name-table):
+       * term/pc-win.el (msdos-remember-default-colors)
+       (w16-set-clipboard-data, w16-get-clipboard-data):
+       * term/w32-win.el (w32-send-sys-command, w32-select-font)
+       (set-message-beep):
+       * net/browse-url.el (w32-shell-execute):
+       * dos-fns.el (int86, msdos-long-file-names):
+       * dos-w32.el (default-printer-name): Undo previous change.
+
+2007-11-21  Eli Zaretskii  <eliz@gnu.org>
+
+       * international/mule-cmds.el (set-locale-environment):
+       Set default-file-name-coding-system _after_ keyboard and terminal
+       coding systems.  This fixes last change.
+
+       * mail/rmail.el (rmail-current-subject-regexp): Allow more than
+       one space after "Subject:".
+
+2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * pcvs-parse.el (cvs-parse-table): Ignore errors when looking up files
+       in order to determine if there's a conflict.
+
+2007-11-21  Richard Stallman  <rms@gnu.org>
+
+       * bindings.el (esc-map): Bind C-M-l here; moved from reposition.el.
+
+       * reposition.el (reposition-window):
+       Binding C-M-l moved to bindings.el.
+
+       * bindings.el (ctl-x-4-map): Bind C-x 4 a here; moved from add-log.el.
+
+       * add-log.el (add-change-log-entry-other-window):
+       Key binding C-x 4 a moved to bindings.el.
+
+       * bindings.el (minibuffer-local-map): Bind C-tab here; moved
+       from filecache.el.
+
+       * filecache.el: Minibuffer map bindings moved to bindings.el.
+
+2007-11-21  Jason Rumney  <jasonr@gnu.org>
+
+       * international/mule-cmds.el (set-locale-environment):
+       Set default-file-name-coding-system from system defaults on Windows.
+
+2007-11-21  Jason Rumney  <jasonr@gnu.org>
+
+       * term/w32console.el: New term init file for w32 console.
+
+       * w32-fns.el (x-alternatives-map): Copy from term/x-win.el.
+       (x-setup-function-keys): Likewise, replacing top-level key definitions.
+       (w32-tty-standard-colors): Move to term/w32console.el.
+
+       * term/w32-win.el (x-setup-function-keys): Remove.
+
+       * term/tty-colors.el (tty-register-default-colors): Remove special
+       case for w32.
+
+2007-11-21  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * frame.el (msdos-mouse-p):
+       * generic-x.el (w32-shell-name):
+       * files.el (msdos-long-file-names, w32-long-file-name)
+       (dired-get-filename, dired-unmark, dired-do-flagged-delete)
+       (dos-8+3-filename, vms-read-directory, view-mode-disable):
+       * term/mac-win.el (mac-code-convert-string, mac-coerce-ae-data)
+       (mac-resume-apple-event, mac-font-panel-mode)
+       (mac-atsu-font-face-attributes, mac-ae-set-reply-parameter)
+       (mac-clear-font-name-table):
+       * term/pc-win.el (msdos-remember-default-colors)
+       (w16-set-clipboard-data, w16-get-clipboard-data):
+       * term/w32-win.el (w32-send-sys-command, w32-select-font)
+       (set-message-beep):
+       * w32-fns.el (set-message-beep, w32-get-clipboard-data)
+       (w32-get-locale-info, w32-get-valid-locale-ids)
+       (w32-set-clipboard-data):
+       * help-fns.el (ad-get-advice-info):
+       * font-lock.el (fast-lock-after-fontify-buffer)
+       (fast-lock-after-unfontify-buffer, fast-lock-mode)
+       (lazy-lock-after-fontify-buffer)
+       (lazy-lock-after-unfontify-buffer, lazy-lock-mode):
+       * net/browse-url.el (w32-shell-execute):
+       * dos-fns.el (int86, msdos-long-file-names):
+       * dos-w32.el (default-printer-name): Declare as functions.
+
+2007-11-21  Juanma Barranquero  <lekktu@gmail.com>
+
+       * textmodes/paragraphs.el (forward-sentence): Doc fix.
+       Reported by Drew Adams <drew.adams@oracle.com>.
+
+2007-11-20  Jason Rumney  <jasonr@gnu.org>
+
+       * term/w32-win.el (x-setup-function-keys): Protect against
+       multiple calls on the same terminal.
+
+2007-11-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term/mac-win.el (x-setup-function-keys): Only setup
+       local-function-key-map if it has not been setup already for the
+       current frame.  Move the suspend-emacs processing here.
+
+2007-11-20  Juanma Barranquero  <lekktu@gmail.com>
+
+       * progmodes/grep.el (xargs-program): New variable.
+       (grep-compute-defaults): Use it.
+       (grep-default-command): Doc fix.
+       (grep, lgrep, rgrep): Reflow docstrings.
+
+2007-11-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc.el (vc-find-revision): Set the parent buffer.
+       Use when instead of if.
+
+       * progmodes/python.el (info-lookup-maybe-add-help):
+       * progmodes/ps-mode.el (doc-view-minor-mode):
+       * mail/emacsbug.el (Info-menu, Info-goto-node):
+       * emulation/viper-keym.el (viper-ex)
+       (viper-normalize-minor-mode-map-alist, viper-set-mode-vars-for):
+       * emulation/viper-cmd.el (widget-type, widget-button-press)
+       (viper-set-hooks):
+       * emacs-lisp/tcover-unsafep.el (unsafep-function):
+       * emacs-lisp/tcover-ses.el (ses-set-curcell, ses-update-cells)
+       (ses-load, ses-vector-delete, ses-create-header-string)
+       (ses-read-cell, ses-read-symbol, ses-command-hook, ses-jump):
+       * emacs-lisp/gulp.el (mail-subject, mail-send): Declare as functions.
+
+2007-11-20  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * pcvs.el (cvs-revert-if-needed): Fix copy&paste typo.
+
+2007-11-20  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/check-declare.el (check-declare-verify): Tweak regexp
+       for end of function-name.  Handle define-derived-mode.
+
+2007-11-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * progmodes/idlw-help.el: Require browse-url unconditionally, it
+       is available by default.
+       (idlwave-help-browse-url-available): Change default to t.
+
+       * emulation/edt.el (defgroup, defcustom): Remove definition.
+       (eval-when-compile): Remove.
+       (c-mark-function):
+       * textmodes/reftex-dcr.el (bibtex-beginning-of-entry):
+       * textmodes/fill.el (comment-search-forward)
+       (comment-string-strip):
+       * progmodes/prolog.el (comint-mode, comint-send-string)
+       (comint-send-region, comint-send-eof):
+       * progmodes/dcl-mode.el (imenu-default-create-index-function):
+       * emulation/viper-util.el (viper-forward-Word):
+       * emulation/vi.el (c-mark-function):
+       * emulation/edt-vt100.el (vt100-wide-mode):
+       * emacs-lisp/timer.el (diary-entry-time): Declare as functions.
+
+2007-11-19  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-open-connection-setup-interactive-shell):
+       Still some tuning in case of an echoing shell.
+       (tramp-send-command): Connection property "remote-echo" is not
+       persistent; cache key is the process therefore.
+
+2007-11-19  Juanma Barranquero  <lekktu@gmail.com>
+
+       * replace.el (map-query-replace-regexp): Doc fix (revert part of
+       2000-05-21T17:04:47Z!fx@gnu.org made on 2000-05-21 with no ChangeLog entry).
+
+2007-11-19  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
+       * play/yow.el (doctor-ret-or-read):
+       * vc-hooks.el (vc-dired-resynch-file):
+       * vc-hg.el (log-view-get-marked):
+       * smerge-mode.el (ediff-cleanup-mess):
+       * pcvs.el (vc-editable-p, vc-checkout):
+       * pcomplete.el (comint-bol):
+       * informat.el (texinfo-format-refill):
+       * ido.el (tramp-tramp-file-p):
+       * ibuffer.el (ibuffer-mark-on-buffer, ibuffer-format-qualifier)
+       (ibuffer-generate-filter-groups, ibuffer-format-filter-group-data):
+       * add-log.el (c-beginning-of-defun, c-end-of-defun): Declare as
+       functions.
+
+       * textmodes/ispell.el (ispell-int-char): Make it a defalias
+       instead of fset.
+       (ispell-message): Use with-no-warnings for sc-cite-regexp call.
+
+       * ido.el (ido-file-internal): Move with-no-warnings to include the
+       ffap-string-at-point call.
+
+       * pcomplete.el (pcomplete-executables): Move defsubst before first use.
+
+       * vc-hg.el (vc-hg-revision-table): Fix last change.
+
+2007-11-19  Martin Rudalics  <rudalics@gmx.at>
+
+       * menu-bar.el (top-level): Deactivate clipboard-kill-region and
+       clipboard-yank when the buffer is read-only.
+
+       * cus-edit.el (custom-field-keymap): Move to other Custom mode
+       keymaps such that it's before the definition of Custom-mode-menu.
+       (Custom-mode-menu): Show it for custom-field-keymap too.
+
+2007-11-19  Nick Roberts  <nickrob@snap.net.nz>
+
+       * progmodes/gdb-ui.el: Update commentary.
+
+2007-11-18  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * net/tramp.el (tramp-terminal-type): Remove duplicated definition.
+
+2007-11-19  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/check-declare.el (check-declare-verify): If fnfile
+       does not exist, try adding `.el' extension.  Also search for defsubsts.
+
+       * cus-edit.el (recentf-expand-file-name):
+       * dired.el (dired-relist-entry):
+       * subr.el (w32-shell-dos-semantics):
+       * emacs-lisp/bytecomp.el (compilation-forget-errors):
+       Declare as functions.
+
+2007-11-18  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * abbrev.el (kill-all-abbrevs, insert-abbrevs)
+       (prepare-abbrev-list-buffer): Use dolist.
+       (clear-abbrev-table): Preserve properties.
+
+2007-11-18  Shigeru Fukaya  <shigeru.fukaya@gmail.com>  (tiny change)
+
+       * textmodes/texinfmt.el (texinfo-format-printindex):
+       Collect combined indexes using texinfo-short-index-format-cmds-alist.
+       Reported on <bug-texinfo@gnu.org>.
+
+2007-11-18  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-completion-reread-directory-timeout):
+       New defcustom.
+       (tramp-handle-file-name-all-completions): Flush directory contents
+       from cache regularly.
+       (tramp-set-auto-save-file-modes): Check also for `buffer-modified-p'.
+       (tramp-open-connection-setup-interactive-shell):
+       Call `tramp-cleanup-connection' via funcall.
+
+       * net/tramp-ftp.el (tramp-ftp-file-name-handler): Temp file is already
+       created when copying.
+
+2007-11-17  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * eshell/esh-util.el (eshell-under-xemacs-p): Remove.
+       * eshell/esh-mode.el (eshell-mode-syntax-table, command-running-p):
+       * eshell/esh-ext.el (eshell-external-command):
+       * eshell/esh-cmd.el (require):
+       * eshell/em-unix.el (eshell-plain-locate-behavior):
+       * eshell/em-cmpl.el (eshell-cmpl-initialize):
+       Replace eshell-under-xemacs-p with (featurep 'xemacs).
+       * eshell/esh-mode.el (characterp, char-int): Remove unused
+       conditional defaliases.
+
+       * pcomplete.el (pcomplete-event-matches-key-specifier-p):
+       Rename from event-matches-key-specifier-p, define unconditionally.
+       (event-basic-type): Remove unused defalias.
+       (pcomplete-show-completions):
+       Use pcomplete-event-matches-key-specifier-p.
+
+2007-11-17  Eli Zaretskii  <eliz@gnu.org>
+
+       * eshell/esh-module.el (eshell-load-defgroups): Don't make backups
+       when saving esh-groups.el.
+
+2007-11-17  Martin Rudalics  <rudalics@gmx.at>
+
+       * wid-edit.el (widget-default-complete):
+       * progmodes/flymake.el (flymake-goto-file-and-line):
+       Fix typo in (doc-)string.
+
+2007-11-17  Glenn Morris  <rgm@gnu.org>
+
+       * emacs-lisp/byte-run.el (declare-function): New macro.
+       * emacs-lisp/bytecomp.el (byte-compile-declare-function):
+       New function, byte-hunk-handler for declare-function.
+       (byte-compile-callargs-warn): Handle declared functions.
+
+       * emacs-lisp/check-declare.el: New file.
+       * Makefile.in (check-declare): New target.
+
+       * progmodes/fortran.el (gud-find-c-expr): Declare as a function.
+
+       * subr.el (process-lines): Move here from ../admin/admin.el.
+       * emacs-lisp/authors.el (authors-process-lines): Remove.
+       (authors): Use process-lines rather than authors-process-lines.
+
+       * progmodes/compilation-perl.el, progmodes/compilation-weblint.el:
+       Remove these files.
+
+2007-11-17  Juanma Barranquero  <lekktu@gmail.com>
+
+       * emacs-lisp/backquote.el (backquote):
+       Improve argument/docstring consistency.
+
+       * emacs-lisp/ring.el (ring-size, ring-p, ring-insert)
+       (ring-length, ring-empty-p): Use c[ad]dr.
+       (ring-plus1): Use `1+'.
+       (ring-minus1): Use `zerop'.
+       (ring-remove): Use c[ad]dr.  Use `when'.
+       (ring-copy): Use c[ad]dr.  Use `let', not `let*'.
+       (ring-ref): Use `let', not `let*'.
+       (ring-insert-at-beginning): Use c[ad]dr.  Doc fix.
+       (ring-insert+extend): Use c[ad]dr.  Fix typo in docstring.
+       (ring-member): Simplify.  Doc fix.
+       (ring-convert-sequence-to-ring): Simplify.
+
+2007-11-17  Juri Linkov  <juri@jurta.org>
+
+       * dired-aux.el (dired-create-directory): Allow creating
+       a directory of an arbitrary depth.  Add a loop to find the topmost
+       nonexistent parent dir `new', and call `dired-add-file' on it.
+       Set the `PARENTS' arg of `make-directory' to t.
+
+2007-11-16  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-aent.el (calc-last-user-lang-parse-table): New variable.
+       (math-build-parse-table): Get parse information from math-parse-table.
+
+2007-11-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * window.el (recenter-last-op): New var.
+       (recenter-top-bottom): New command.
+       (global-map): Bind it to C-l.
+
+       * abbrev.el (abbrev--write): Fix error in transcription from C.
+
+       * emulation/pc-select.el (pc-select-shifted-mark): Remove.
+       (pc-select-ensure-mark): Set mark-active to a special value instead.
+       Rename from ensure-mark.  Update call callers.
+       (pc-select-maybe-deactivate-mark): Rename from maybe-deactivate-mark.
+       Rewrite.  Update all callers.
+       (pc-selection-mode): Remove redundant var declaration.
+
+2007-11-16  Tassilo Horn  <tassilo@member.fsf.org>
+
+       * doc-view.el (doc-view-search-backward, doc-view-search):
+       Fix assignment to free variable bug.
+
+2007-11-16  Martin Pohlack  <mp26@os.inf.tu-dresden.de>  (tiny change)
+
+       * emulation/pc-select.el (pc-select-shifted-mark): New var.
+       (ensure-mark): Set it.
+       (maybe-deactivate-mark): New fun.
+       Use it everywhere instead of (setq mark-active nil).
+
+2007-11-16  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * textmodes/reftex-dcr.el (reftex-start-itimer-once):
+       Add check for XEmacs.
+
+       * calc/calc-menu.el (calc-mode-map): Pacify byte compiler.
+
+       * doc-view.el (doc-view-resolution): Add missing :group.
+
+2007-11-16  Juanma Barranquero  <lekktu@gmail.com>
+
+       * subr.el (make-variable-frame-local):
+       Fix typo in obsolescence declaration.
+
+2007-11-16  Werner Lemberg  <wl@gnu.org>
+
+       * files.el (set-auto-mode-1): Check second line for -*- if file
+       starts with '\" (which is used by man pages to identify needed
+       troff preprocessors).
+
+2007-11-16  Glenn Morris  <rgm@gnu.org>
+
+       * mail/mail-extr.el (mail-extr-all-top-level-domains): Update domains.
+
+2007-11-16  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-lang.el (math-oper-table): Fix typo.
+       Reduce precedence of "/" for TeX.
+
+       * calc/calc-menu.el (calc-modes-menu): Add Languages submenu.
+
+2007-11-16  Juri Linkov  <juri@jurta.org>
+
+       * dired-aux.el (dired-read-shell-command-default): New function.
+       (dired-read-shell-command): Use its return value for DEFAULT arg.
+
+       * replace.el (keep-lines-read-args, occur-read-primary-args):
+       Use a list of default values for DEFAULT arg of read-from-minibuffer.
+
+       * man.el (Man-heading-regexp): Add 0-9.
+       (Man-first-heading-regexp): Remove leading space [ \t]* before NAME.
+
+2007-11-15  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * doc-view.el (doc-view-ghostscript-options): Remove resolution arg.
+       (doc-view-resolution): New custom var.
+       (doc-view-pdf/ps->png): Use it.
+       (doc-view-shrink-factor): New var.
+       (doc-view-enlarge, doc-view-shrink): New commands.
+       (doc-view-mode-map): Use them.
+
+2007-11-15  Juanma Barranquero  <lekktu@gmail.com>
+
+       * ediff-wind.el (ediff-window-setup-function):
+       * simple.el (normal-erase-is-backspace):
+       * eshell/em-unix.el (eshell/info):
+       * progmodes/cc-engine.el (c-crosses-statement-barrier-p):
+       Fix typos in docstrings.
+
+       * emulation/cua-base.el (cua--keymaps-initialized):
+       Rename from `cua--keymaps-initalized'.  Callers changed.
+       (cua-highlight-region-shift-only): Doc fix.
+       (cua-paste-pop): Fix typo in docstring.
+
+2007-11-15  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emulation/cua-base.el (cua--pre-command-handler-1):
+       Use input-decode-map instead of function-key-map.
+       Use event-modifiers now that it works reliably.
+
+       * vc.el (vc-diff-internal): Pop-to-buffer later.
+
+       * subr.el (event-modifiers): Use internal-event-symbol-parse-modifiers.
+
+       * pcvs.el (cvs-revert-if-needed): Ignore `unknown' files, since cvs
+       did not touch them.
+
+2007-11-15  Jay Belanger  <jay.p.belanger@gmail.com>
+
+       * calc/calc-menu.el: New file.
+       * calc/calc.el (calc-mode): Require calc-menu.
+
+2007-11-14  Juanma Barranquero  <lekktu@gmail.com>
+
+       * isearch-multi.el (isearch-buffers-next-buffer-function): Doc fix.
+
+2007-11-14  Nick Roberts  <nickrob@snap.net.nz>
+
+       * progmodes/gdb-ui.el (gdb-parent-bptno-enabled): New variable.
+       (gdb-breakpoint-regexp, gdb-mouse-toggle-breakpoint-margin)
+       (gdb-mouse-toggle-breakpoint-fringe, gdb-delete-breakpoint)
+       (gdb-goto-breakpoint): Generalise for breakpoints with multiple
+       locations.
+       (gdb-info-breakpoints-custom, gdb-assembler-custom)
+       (gdb-toggle-breakpoint): Update for new gdb-breakpoint-regexp.
+       (gdb-put-breakpoint-icon): Only display icon for parent breakpoint.
+
+2007-11-13  Noah Friedman  <friedman@splode.com>
+
+       * calc/calc.el: Add `backward-delete-char-untabify' to the list of
+       bindings to remap when `calc-scan-for-dels' is non-nil.
+
+2007-11-13  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * emacs-lisp/byte-opt.el (byte-compile-trueconstp): Handle more
+       constant forms.
+       (byte-compile-nilconstp): New function.
+       (byte-optimize-cond): Kill subsequent branches when a branch is
+       know to be taken or not taken.
+       (byte-optimize-if): Use byte-compile-nilconstp instead of hand coding.
+
+2007-11-13  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc.el (vc-register): Allow registering a file passed as a
+       parameter instead of just the current buffer.
+
+2007-11-12  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/tramp.el (tramp-open-connection-setup-interactive-shell):
+       Check whether the output of "uname -sr" has been changed.
+
+2007-11-12  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
+
+       * progmodes/compile.el (compilation-error-regexp-alist-alist): Insert
+       patterns from compilation-perl.el and compilation-weblint.el files.
+
+2007-11-12  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * progmodes/compilation-perl.el:
+       * progmodes/compilation-weblint.el: Disable autoloads, they cause
+       a bootstrap failure.
+
+       * vc-cvs.el (vc-cvs-diff): If backup files exist, diff them
+       instead of doing "cvs diff" in order to avoid accessing the repository.
+
+2007-11-12  Kevin Ryde  <user42@zip.com.au>
+
+       * progmodes/compilation-perl.el:
+       * progmodes/compilation-weblint.el: New files.
+
+2007-11-11  Juanma Barranquero  <lekktu@gmail.com>
+
+       * international/iso-cvt.el (iso-translate-conventions): Doc fix.
+       (iso-aggressive-german-trans-tab, iso-conservative-german-trans-tab)
+       (iso-tex2iso-trans-tab, iso-gtex2iso-trans-tab): Reflow docstring.
+       (iso-spanish, iso-german, iso-iso2tex, iso-tex2iso, iso-gtex2iso)
+       (iso-iso2gtex, iso-iso2duden, iso-iso2sgml, iso-sgml2iso):
+       Rewrite in active voice.
+
+2007-11-11  Tassilo Horn  <tassilo@member.fsf.org>
+
+       * doc-view.el: Add comments about isearch support.
+
+2007-11-11  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * vc.el (vc-start-entry): Fix setting the in the case the function
+       is called from vc-dired.  Use when instead of if where appropriate.
+
+2007-11-11  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
+
+       * ps-print.el (ps-do-despool): Do not force ps-lpr-switches
+       to be a list.
+       (ps-begin-job): Error if ps-lpr-switches is not a list.
 
 2007-11-11  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
 
 2007-11-10  Dan Nicolaescu  <dann@ics.uci.edu>
 
-       * emacs-lisp/byte-opt.el (byte-optimize-featurep): Optimize
-       (featurep 'emacs) to t.
+       * emacs-lisp/byte-opt.el (byte-optimize-featurep):
+       Optimize (featurep 'emacs) to t.
 
-       * emacs-lisp/bytecomp.el (byte-compile-find-bound-condition): New
-       function.
+       * emacs-lisp/bytecomp.el (byte-compile-find-bound-condition):
+       New function.
        (byte-compile-maybe-guarded): Use it to also look for bound
        symbols inside `and' forms.  Comment out non-working code that was
        trying to avoid warnings for XEmacs code.
 
        * net/tramp-cache.el (tramp-cache-print)
        (tramp-dump-connection-properties): Fix docstring.
-       (tramp-list-connections): Rename from
-       `tramp-cache-list-connections'.
+       (tramp-list-connections): Rename from `tramp-cache-list-connections'.
 
        * net/tramp-cmds.el (tramp-cleanup-connection): Apply it.
 
 
        * ediff-diff.el (ediff-set-fine-diff-properties-in-one-buffer): Do not
        use face-name.
-       (ediff-test-utility,ediff-diff-mandatory-option)
+       (ediff-test-utility, ediff-diff-mandatory-option)
        (ediff-reset-diff-options): Remove to simplify the mandatory option
        handling on Windows.
        (ediff-set-diff-options): Add.
        Use feature test instead of boundp test so it can be resolved at
        compile time.
 
-       * net/newsticker.el (replace-regexp-in-string): Only define for
-       XEmacs.
+       * net/newsticker.el (replace-regexp-in-string): Only define for XEmacs.
 
 2007-10-30  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        (allout-toggle-current-subtree-exposure): Add new interactive
        function for toggle subtree exposure - suggested by tassilo.
        (move-beginning-of-line, move-end-of-line): Don't use
-       line-move-invisible-p, it's obsolete - substitute the code,
-       instead.
+       line-move-invisible-p, it's obsolete - substitute the code, instead.
 
 2007-10-29  Dan Nicolaescu  <dann@ics.uci.edu>
 
 
 2007-10-08  Adam Hupp  <adam@hupp.org>  (tiny change)
 
-       * progmodes/gdb-ui.el (pdb): Specify file for gud-break.
+       * progmodes/gud.el (pdb): Specify file for gud-break.
 
 2007-10-08  Nick Roberts  <nickrob@snap.net.nz>
 
index 8fc7aa0fa35e6bd1868d0078a6678d1027935247..cb4924a89307c465831b8325700385ff1104072f 100644 (file)
        * jit-lock.el (jit-lock-fontify-again): New function.
        (jit-lock-fontify-now): Use it instead of lambda form.
 
-2006-09-13  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-09-13  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (flyspell-word, flyspell-correct-word)
        (flyspell-auto-correct-word): Make ispell-filter local to these
        * isearch.el (isearch-other-meta-char): Handle user bindings for
        shifted control characters.
 
-2006-03-18  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-03-18  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/ispell.el (ispell-skip-region-alist): Add "_+" to the
        part that matches email addresses, file names, etc.
        * progmodes/octave-mod.el (octave-indent-for-comment):
        Behave according to do string.
 
-2006-03-11  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-03-11  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/ispell.el (ispell-menu-map-needed) [ispell-message]:
        Be visible only if major mode is Mail Mode.
        (t-mouse-tty, t-mouse-make-event): Doc fix; use imperative.
        (t-mouse-mode): Remove period from end of error message.
 
-2006-03-03  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-03-03  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (flyspell-process-localwords):
        Be case-sensitive.
        (remove-from-invisibility-spec, allout-hide-current-subtree):
        Ditched unused variables.
 
-2006-02-17  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-02-17  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/ispell.el (ispell-change-dictionary): Call
        ispell-buffer-local-dict instead of
        described in the docstring for `bs-attributes-list'.
        (bs--get-name): Simplify.  Don't pad the buffer name.
 
-2006-01-27  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-01-27  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/ispell.el (ispell-find-aspell-dictionaries): If no
        English aspell dictionary is installed, use the first entry of
 
        * mail/rmailout.el (rmail-output): Don't use content-type if it is nil.
 
-2006-01-21  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-01-21  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (flyspell-emacs-popup, flypell-xemacs-popup):
        Default to disabling the "Save affix" question.
 
        * files.el (auto-mode-alist): Add Imakefile.
 
-2006-01-17  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-01-17  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (ispell-kill-ispell-hook): Add to the hook when
        loading the file rather than when turning on flyspell-mode.
        (org-get-time-of-day): Fix bug with times before 1am.
        (org-agenda-menu): Add tags commands.
 
-2006-01-13  Agustin Martin  <agustin.martin@hispalinux.es>
+2006-01-13  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/ispell.el (ispell-init-process): Include the used
        dictionary in ispell process start message.
        Use local var buffer-scan-pos to advance scan for next misspelling.
        Advance it only after we find the misspelling.
 
-2005-12-27  Agustin Martin  <agustin.martin@hispalinux.es>
+2005-12-27  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (flyspell-external-point-words):
        New criteria for finding the misspelling in the buffer.
 
        * international/latexenc.el (latex-inputenc-coding-alist): Doc fix.
 
-2005-12-02  Agustin Martin  <agustin.martin@hispalinux.es>
+2005-12-02  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (flyspell-external-point-words):
        Consider a misspelling as found in the string search if: (a) misspelling
        * textmodes/flyspell.el (flyspell-large-region):
        Call flyspell-accept-buffer-local-defs.
 
-2005-11-13  Agustin Martin  <agustin.martin@hispalinux.es>
+2005-11-13  Agust\e,Am\e(Bn Mart\e,Am\e(Bn  <agustin.martin@hispalinux.es>
 
        * textmodes/flyspell.el (flyspell-notify-misspell):
        Fix misspelling of "Misspelling".
index b12b4b5cb71cf472b228e887b81bd8b6b0ca5867..4c42467b605570996e7582af15f4e68989bf385d 100644 (file)
        * international/mule-cmds.el (describe-language-environment):
        Check if the specified input method exists or not.
 
+2007-11-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * ldefs-boot.el: Regenerate.
+
 2007-11-11  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
 
        * ps-print.el (ps-do-despool): Do not force ps-lpr-switches to be a
index 06457607c5a5dedf24156b3f94d14ef5252996e5..a221ccdf4a48287b36b85eb743cbc81ce588f152 100644 (file)
@@ -297,9 +297,12 @@ bootstrap-prepare:
          $(lisp)/ps-print.el                   \
          $(lisp)/emacs-lisp/cl-loaddefs.el
 
-maintainer-clean: distclean
-       cd $(lisp); rm -f *.elc */*.elc $(AUTOGENEL)
+maintainer-clean: distclean bootstrap-clean
+       cd $(lisp); rm -f $(AUTOGENEL)
 
+## NB note that this rules assume only one level of subdirs below lisp/.
+## If nested subdirs are added, it's probably time to switch to:
+## find $(lisp) -name "*.elc" -exec rm -f '{}' ';'
 bootstrap-clean:
        cd $(lisp); rm -f *.elc */*.elc
 
@@ -315,4 +318,10 @@ bootstrap-after: finder-data custom-deps
 distclean:
        -rm -f ./Makefile
 
+.PHONY: check-declare
+
+check-declare:
+       $(emacs) -l $(lisp)/emacs-lisp/check-declare \
+         --eval '(check-declare-directory "$(lisp)")'
+
 # Makefile ends here.
index 0c140a84159c09aaee52f1cc8692f68cbfe4d683..d7dfea2f6d8e82d674342a6c5cff88bfc9ee752e 100644 (file)
@@ -83,10 +83,8 @@ to enable or disable Abbrev mode in the current buffer."
 (defun kill-all-abbrevs ()
   "Undefine all defined abbrevs."
   (interactive)
-  (let ((tables abbrev-table-name-list))
-    (while tables
-      (clear-abbrev-table (symbol-value (car tables)))
-      (setq tables (cdr tables)))))
+  (dolist (tablesym abbrev-table-name-list)
+    (clear-abbrev-table (symbol-value tablesym))))
 
 (defun copy-abbrev-table (table)
   "Make a new abbrev-table with the same abbrevs as TABLE."
@@ -106,10 +104,8 @@ Mark is set after the inserted text."
   (interactive)
   (push-mark
    (save-excursion
-     (let ((tables abbrev-table-name-list))
-       (while tables
-        (insert-abbrev-table-description (car tables) t)
-        (setq tables (cdr tables))))
+     (dolist (tablesym abbrev-table-name-list)
+       (insert-abbrev-table-description tablesym t))
      (point))))
 
 (defun list-abbrevs (&optional local)
@@ -131,18 +127,17 @@ Otherwise display all abbrevs."
     found))
 
 (defun prepare-abbrev-list-buffer (&optional local)
-  (save-excursion
-    (let ((table local-abbrev-table))
-      (set-buffer (get-buffer-create "*Abbrevs*"))
-      (erase-buffer)
-      (if local
-         (insert-abbrev-table-description (abbrev-table-name table) t)
-       (dolist (table abbrev-table-name-list)
-         (insert-abbrev-table-description table t)))
-      (goto-char (point-min))
-      (set-buffer-modified-p nil)
-      (edit-abbrevs-mode)
-      (current-buffer))))
+  (with-current-buffer (get-buffer-create "*Abbrevs*")
+    (erase-buffer)
+    (if local
+        (insert-abbrev-table-description
+         (abbrev-table-name local-abbrev-table) t)
+      (dolist (table abbrev-table-name-list)
+        (insert-abbrev-table-description table t)))
+    (goto-char (point-min))
+    (set-buffer-modified-p nil)
+    (edit-abbrevs-mode)
+    (current-buffer)))
 
 (defun edit-abbrevs-mode ()
   "Major mode for editing the list of abbrev definitions.
@@ -524,8 +519,14 @@ the current abbrev table before abbrev lookup happens."
 (defun clear-abbrev-table (table)
   "Undefine all abbrevs in abbrev table TABLE, leaving it empty."
   (setq abbrevs-changed t)
-  (dotimes (i (length table))
-    (aset table i 0)))
+  (let* ((sym (intern-soft "" table)))
+    (dotimes (i (length table))
+      (aset table i 0))
+    ;; Preserve the table's properties.
+    (assert sym)
+    (intern sym table)
+    (abbrev-table-put table :abbrev-table-modiff
+                      (1+ (abbrev-table-get table :abbrev-table-modiff)))))
 
 (defun define-abbrev (table name expansion &optional hook &rest props)
   "Define an abbrev in TABLE named NAME, to expand to EXPANSION and call HOOK.
@@ -825,7 +826,7 @@ Only writes the non-system abbrevs.
 Presumes that `standard-output' points to `current-buffer'."
   (unless (or (null (symbol-value sym)) (abbrev-get sym :system))
     (insert "    (")
-    (prin1 sym)
+    (prin1 (symbol-name sym))
     (insert " ")
     (prin1 (symbol-value sym))
     (insert " ")
index 3ca1b613955e3da72f5f1d7b7425443f30ea6ad9..33ecd98ec44848158ef29ce769e5d8e7748c3d54 100644 (file)
@@ -664,7 +664,6 @@ the change log file in another window."
                   (list current-prefix-arg
                         (prompt-for-change-log-name))))
   (add-change-log-entry whoami file-name t))
-;;;###autoload (define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
 
 
 (defvar change-log-indent-text 0)
@@ -827,6 +826,9 @@ Prefix arg means justify as well."
   '(TeX-mode plain-TeX-mode LaTeX-mode tex-mode)
   "*Modes that look like TeX to `add-log-current-defun'.")
 
+(declare-function c-beginning-of-defun "cc-cmds" (&optional arg))
+(declare-function c-end-of-defun "cc-cmds" (&optional arg))
+
 ;;;###autoload
 (defun add-log-current-defun ()
   "Return name of function definition point is in, or nil.
index 421283da9e0022d349adb3df9f6a56780255d409..3cfd07398c525e66f6e690793fd83d275185c6d9 100644 (file)
@@ -728,6 +728,9 @@ archive.
           ;; Note this regexp is also in archive-exe-p.
           ((looking-at "MZ\\(.\\|\n\\)\\{34\\}LH[aA]'s SFX ") 'lzh-exe)
           ((looking-at "Rar!") 'rar)
+          ((and (looking-at "MZ")
+                (re-search-forward "Rar!" (+ (point) 100000) t))
+           'rar-exe)
          (t (error "Buffer format not recognized")))))
 ;; -------------------------------------------------------------------------
 
@@ -1860,10 +1863,10 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
 ;; -------------------------------------------------------------------------
 ;;; Section: Rar Archives
 
-(defun archive-rar-summarize ()
-  (let* ((file buffer-file-name)
-         (copy (file-local-copy file))
-         header footer
+(defun archive-rar-summarize (&optional file)
+  ;; File is used internally for `archive-rar-exe-summarize'.
+  (unless file (setq file buffer-file-name))
+  (let* ((copy (file-local-copy file))
          (maxname 10)
          (maxsize 5)
          (files ()))
@@ -1872,9 +1875,6 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
       (if copy (delete-file copy))
       (goto-char (point-min))
       (re-search-forward "^-+\n")
-      (setq header
-            (buffer-substring (save-excursion (re-search-backward "^[^ ]"))
-                              (point)))
       (while (looking-at (concat " \\(.*\\)\n" ;Name.
                                  ;; Size ; Packed.
                                  " +\\([0-9]+\\) +[0-9]+"
@@ -1894,8 +1894,7 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
                         size (match-string 3)
                         ;; Date, Time.
                         (match-string 4) (match-string 5))
-                files)))
-      (setq footer (buffer-substring (point) (point-max))))
+                files))))
     (setq files (nreverse files))
     (goto-char (point-min))
     (let* ((format (format " %%s %%s  %%%ds %%5s  %%s" maxsize))
@@ -1937,9 +1936,44 @@ This doesn't recover lost files, it just undoes changes in the buffer itself."
           (delete-directory (expand-file-name name dest)))
         (delete-directory dest)))))
 
+;;; Section: Rar self-extracting .exe archives.
+
+(defun archive-rar-exe-summarize ()
+  (let ((tmpfile (make-temp-file "rarexe")))
+    (unwind-protect
+        (progn
+          (goto-char (point-min))
+          (re-search-forward "Rar!")
+          (write-region (match-beginning 0) (point-max) tmpfile)
+          (archive-rar-summarize tmpfile))
+      (delete-file tmpfile))))
+
+(defun archive-rar-exe-extract (archive name)
+  (let* ((tmpfile (make-temp-file "rarexe"))
+         (buf (find-buffer-visiting archive))
+         (tmpbuf (unless buf (generate-new-buffer " *rar-exe*"))))
+    (unwind-protect
+        (progn
+          (with-current-buffer (or buf tmpbuf)
+            (save-excursion
+              (save-restriction
+                (if buf
+                    ;; point-max unwidened is assumed to be the end of the
+                    ;; summary text and the beginning of the actual file data.
+                    (progn (goto-char (point-max)) (widen))
+                  (insert-file-contents-literally archive)
+                  (goto-char (point-min)))
+                (re-search-forward "Rar!")
+                (write-region (match-beginning 0) (point-max) tmpfile))))
+          (archive-rar-extract tmpfile name))
+      (if tmpbuf (kill-buffer tmpbuf))
+      (delete-file tmpfile))))
+  
+
 ;; -------------------------------------------------------------------------
 ;; This line was a mistake; it is kept now for compatibility.
 ;; rms  15 Oct 98
+
 (provide 'archive-mode)
 
 (provide 'arc-mode)
index 1bc31e04bb9fe231f9c31b23596cfcd3d37a4d6e..ead6ac5157717fa7515be0b5d4866d43c1a70a18 100644 (file)
@@ -704,7 +704,8 @@ language you are using."
   ;; Override the global binding (which calls indent-relative via
   ;; indent-for-tab-command).  The alignment that indent-relative tries to
   ;; do doesn't make much sense here since the prompt messes it up.
-  (define-key map "\t"    'self-insert-command))
+  (define-key map "\t"    'self-insert-command)
+  (define-key minibuffer-local-map [C-tab] 'file-cache-minibuffer-complete))
 
 (define-key global-map "\C-u" 'universal-argument)
 (let ((i ?0))
@@ -1073,6 +1074,9 @@ language you are using."
 
 (define-key ctl-x-map "z" 'repeat)
 
+(define-key esc-map "\C-l" 'reposition-window)
+
+(define-key ctl-x-4-map "a" 'add-change-log-entry-other-window)
 (define-key ctl-x-4-map "c" 'clone-indirect-buffer-other-window)
 
 ;; Signal handlers
index dc474c43813adb46fbc6e0944793cdaf0b762e30..fbbd73b8fee96a32a1280dcd4f2eb35c3ca9f8b7 100644 (file)
@@ -72,6 +72,8 @@ opinions.
 Summary of changes to "Calc"
 ------- -- ------- --  ----
 
+* Added a menu.
+
 * Added logistic non-linear curves to curve-fitting.
 
 * Added option of plotting data points and curve when curve-fitting.
index ffd07bd8f2efc96546003f62b4efd426e44a60b9..697d510ac0285c84f064e26f5ae854f6d6ea843c 100644 (file)
 (require 'calc)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function calc-refresh-evaltos "calc-ext" (&optional which-var))
+(declare-function calc-execute-kbd-macro "calc-prog" (mac arg &rest prefix))
+(declare-function math-is-true "calc-ext" (expr))
+(declare-function calc-explain-why "calc-stuff" (why &optional more))
+(declare-function calc-alg-edit "calc-yank" (str))
+(declare-function math-composite-inequalities "calc-prog" (x op))
+(declare-function math-flatten-lands "calc-rewr" (expr))
+(declare-function math-multi-subst "calc-map" (expr olds news))
+(declare-function calcFunc-vmatches "calc-rewr" (expr pat))
+(declare-function math-simplify "calc-alg" (top-expr))
+(declare-function math-known-matrixp "calc-arith" (a))
+(declare-function math-parse-fortran-subscr "calc-lang" (sym args))
+(declare-function math-to-radians-2 "calc-math" (a))
+(declare-function math-read-string "calc-ext" ())
+(declare-function math-read-brackets "calc-vec" (space-sep math-rb-close))
+(declare-function math-read-angle-brackets "calc-forms" ())
+
+
 (defvar calc-quick-calc-history nil
   "The history list for quick-calc.")
 
@@ -603,6 +622,7 @@ in Calc algebraic input.")
 
 (defvar calc-user-parse-table nil)
 (defvar calc-last-main-parse-table nil)
+(defvar calc-last-user-lang-parse-table nil)
 (defvar calc-last-lang-parse-table nil)
 (defvar calc-user-tokens nil)
 (defvar calc-user-token-chars nil)
@@ -612,10 +632,12 @@ in Calc algebraic input.")
 
 (defun math-build-parse-table ()
   (let ((mtab (cdr (assq nil calc-user-parse-tables)))
-       (ltab (cdr (assq calc-language calc-user-parse-tables))))
+       (ltab (cdr (assq calc-language calc-user-parse-tables)))
+        (lltab (get calc-language 'math-parse-table)))
     (or (and (eq mtab calc-last-main-parse-table)
-            (eq ltab calc-last-lang-parse-table))
-       (let ((p (append mtab ltab))
+            (eq ltab calc-last-user-lang-parse-table)
+             (eq lltab calc-last-lang-parse-table))
+       (let ((p (append mtab ltab lltab))
              (math-toks nil))
          (setq calc-user-parse-table p)
          (setq calc-user-token-chars nil)
@@ -629,7 +651,8 @@ in Calc algebraic input.")
                                                                 (length y)))))
                                            "\\|")
                calc-last-main-parse-table mtab
-               calc-last-lang-parse-table ltab)))))
+               calc-last-user-lang-parse-table ltab
+                calc-last-lang-parse-table lltab)))))
 
 (defun math-find-user-tokens (p)
   (while p
@@ -660,7 +683,8 @@ in Calc algebraic input.")
       (setq math-exp-old-pos math-exp-pos
            math-exp-token 'end
            math-expr-data "\000")
-    (let ((ch (aref math-exp-str math-exp-pos)))
+    (let (adfn
+          (ch (aref math-exp-str math-exp-pos)))
       (setq math-exp-old-pos math-exp-pos)
       (cond ((memq ch '(32 10 9))
             (setq math-exp-pos (1+ math-exp-pos))
@@ -677,7 +701,7 @@ in Calc algebraic input.")
                   math-exp-pos (match-end 0)))
            ((or (and (>= ch ?a) (<= ch ?z))
                 (and (>= ch ?A) (<= ch ?Z)))
-            (string-match (if (memq calc-language '(c fortran pascal maple))
+            (string-match (if (memq calc-language calc-lang-allow-underscores)
                               "[a-zA-Z0-9_#]*"
                             "[a-zA-Z0-9'#]*")
                           math-exp-str math-exp-pos)
@@ -685,22 +709,8 @@ in Calc algebraic input.")
                   math-exp-pos (match-end 0)
                   math-expr-data (math-restore-dashes
                             (math-match-substring math-exp-str 0)))
-            (if (eq calc-language 'eqn)
-                (let ((code (assoc math-expr-data math-eqn-ignore-words)))
-                  (cond ((null code))
-                        ((null (cdr code))
-                         (math-read-token))
-                        ((consp (nth 1 code))
-                         (math-read-token)
-                         (if (assoc math-expr-data (cdr code))
-                             (setq math-expr-data (format "%s %s"
-                                                    (car code) math-expr-data))))
-                        ((eq (nth 1 code) 'punc)
-                         (setq math-exp-token 'punc
-                               math-expr-data (nth 2 code)))
-                        (t
-                         (math-read-token)
-                         (math-read-token))))))
+             (if (setq adfn (get calc-language 'math-lang-adjust-words))
+                 (funcall adfn)))
            ((or (and (>= ch ?0) (<= ch ?9))
                 (and (eq ch '?\.)
                      (eq (string-match "\\.[0-9]" math-exp-str math-exp-pos)
@@ -709,35 +719,31 @@ in Calc algebraic input.")
                      (eq (string-match "_\\.?[0-9]" math-exp-str math-exp-pos)
                           math-exp-pos)
                      (or (eq math-exp-pos 0)
-                         (and (memq calc-language '(nil flat big unform
-                                                        tex latex eqn))
+                         (and (not (memq calc-language 
+                                          calc-lang-allow-underscores))
                               (eq (string-match "[^])}\"a-zA-Z0-9'$]_"
                                                 math-exp-str (1- math-exp-pos))
                                   (1- math-exp-pos))))))
-            (or (and (eq calc-language 'c)
+            (or (and (memq calc-language calc-lang-c-type-hex)
                      (string-match "0[xX][0-9a-fA-F]+" math-exp-str math-exp-pos))
                 (string-match "_?\\([0-9]+.?0*@ *\\)?\\([0-9]+.?0*' *\\)?\\(0*\\([2-9]\\|1[0-4]\\)\\(#\\|\\^\\^\\)[0-9a-dA-D.]+[eE][-+_]?[0-9]+\\|0*\\([2-9]\\|[0-2][0-9]\\|3[0-6]\\)\\(#\\|\\^\\^\\)[0-9a-zA-Z:.]+\\|[0-9]+:[0-9:]+\\|[0-9.]+\\([eE][-+_]?[0-9]+\\)?\"?\\)?"
                                math-exp-str math-exp-pos))
             (setq math-exp-token 'number
                   math-expr-data (math-match-substring math-exp-str 0)
                   math-exp-pos (match-end 0)))
+            ((and (setq adfn 
+                        (assq ch (get calc-language 'math-lang-read-symbol)))
+                  (eval (nth 1 adfn)))
+             (eval (nth 2 adfn)))
            ((eq ch ?\$)
-            (if (and (eq calc-language 'pascal)
-                     (eq (string-match
-                          "\\(\\$[0-9a-fA-F]+\\)\\($\\|[^0-9a-zA-Z]\\)"
-                          math-exp-str math-exp-pos)
-                         math-exp-pos))
-                (setq math-exp-token 'number
-                      math-expr-data (math-match-substring math-exp-str 1)
-                      math-exp-pos (match-end 1))
-              (if (eq (string-match "\\$\\([1-9][0-9]*\\)" math-exp-str math-exp-pos)
-                      math-exp-pos)
-                  (setq math-expr-data (- (string-to-number (math-match-substring
-                                                    math-exp-str 1))))
-                (string-match "\\$+" math-exp-str math-exp-pos)
-                (setq math-expr-data (- (match-end 0) (match-beginning 0))))
-              (setq math-exp-token 'dollar
-                    math-exp-pos (match-end 0))))
+             (if (eq (string-match "\\$\\([1-9][0-9]*\\)" math-exp-str math-exp-pos)
+                     math-exp-pos)
+                 (setq math-expr-data (- (string-to-number (math-match-substring
+                                                            math-exp-str 1))))
+               (string-match "\\$+" math-exp-str math-exp-pos)
+               (setq math-expr-data (- (match-end 0) (match-beginning 0))))
+             (setq math-exp-token 'dollar
+                   math-exp-pos (match-end 0)))
            ((eq ch ?\#)
             (if (eq (string-match "#\\([1-9][0-9]*\\)" math-exp-str math-exp-pos)
                     math-exp-pos)
@@ -756,120 +762,18 @@ in Calc algebraic input.")
            ((and (eq ch ?\")
                  (string-match "\\(\"\\([^\"\\]\\|\\\\.\\)*\\)\\(\"\\|\\'\\)"
                                 math-exp-str math-exp-pos))
-            (if (eq calc-language 'eqn)
-                (progn
-                  (setq math-exp-str (copy-sequence math-exp-str))
-                  (aset math-exp-str (match-beginning 1) ?\{)
-                  (if (< (match-end 1) (length math-exp-str))
-                      (aset math-exp-str (match-end 1) ?\}))
-                  (math-read-token))
-              (setq math-exp-token 'string
-                    math-expr-data (math-match-substring math-exp-str 1)
-                    math-exp-pos (match-end 0))))
-           ((and (= ch ?\\) (eq calc-language 'tex)
-                 (< math-exp-pos (1- (length math-exp-str))))
-            (or (string-match "\\\\hbox *{\\([a-zA-Z0-9]+\\)}"
-                               math-exp-str math-exp-pos)
-                (string-match "\\(\\\\\\([a-zA-Z]+\\|[^a-zA-Z]\\)\\)"
-                               math-exp-str math-exp-pos))
-            (setq math-exp-token 'symbol
-                  math-exp-pos (match-end 0)
-                  math-expr-data (math-restore-dashes
-                            (math-match-substring math-exp-str 1)))
-            (let ((code (assoc math-expr-data math-latex-ignore-words)))
-              (cond ((null code))
-                    ((null (cdr code))
-                     (math-read-token))
-                    ((eq (nth 1 code) 'punc)
-                     (setq math-exp-token 'punc
-                           math-expr-data (nth 2 code)))
-                      ((and (eq (nth 1 code) 'mat)
-                            (string-match " *{" math-exp-str math-exp-pos))
-                     (setq math-exp-pos (match-end 0)
-                           math-exp-token 'punc
-                           math-expr-data "[")
-                     (let ((right (string-match "}" math-exp-str math-exp-pos)))
-                       (and right
-                            (setq math-exp-str (copy-sequence math-exp-str))
-                            (aset math-exp-str right ?\])))))))
-           ((and (= ch ?\\) (eq calc-language 'latex)
-                 (< math-exp-pos (1- (length math-exp-str))))
-            (or (string-match "\\\\hbox *{\\([a-zA-Z0-9]+\\)}"
-                               math-exp-str math-exp-pos)
-                 (string-match "\\\\text *{\\([a-zA-Z0-9]+\\)}"
-                               math-exp-str math-exp-pos)
-                (string-match "\\(\\\\\\([a-zA-Z]+\\|[^a-zA-Z]\\)\\)"
-                               math-exp-str math-exp-pos))
-            (setq math-exp-token 'symbol
-                  math-exp-pos (match-end 0)
-                  math-expr-data (math-restore-dashes
-                            (math-match-substring math-exp-str 1)))
-            (let ((code (assoc math-expr-data math-tex-ignore-words))
-                   envname)
-              (cond ((null code))
-                    ((null (cdr code))
-                     (math-read-token))
-                    ((eq (nth 1 code) 'punc)
-                     (setq math-exp-token 'punc
-                           math-expr-data (nth 2 code)))
-                     ((and (eq (nth 1 code) 'begenv)
-                           (string-match " *{\\([^}]*\\)}" math-exp-str math-exp-pos))
-                      (setq math-exp-pos (match-end 0)
-                            envname (match-string 1 math-exp-str)
-                            math-exp-token 'punc
-                            math-expr-data "[")
-                      (cond ((or (string= envname "matrix")
-                                 (string= envname "bmatrix")
-                                 (string= envname "smallmatrix")
-                                 (string= envname "pmatrix"))
-                             (if (string-match (concat "\\\\end{" envname "}")
-                                               math-exp-str math-exp-pos)
-                                 (setq math-exp-str
-                                       (replace-match "]" t t math-exp-str))
-                               (error "%s" (concat "No closing \\end{" envname "}"))))))
-                      ((and (eq (nth 1 code) 'mat)
-                            (string-match " *{" math-exp-str math-exp-pos))
-                     (setq math-exp-pos (match-end 0)
-                           math-exp-token 'punc
-                           math-expr-data "[")
-                     (let ((right (string-match "}" math-exp-str math-exp-pos)))
-                       (and right
-                            (setq math-exp-str (copy-sequence math-exp-str))
-                            (aset math-exp-str right ?\])))))))
-           ((and (= ch ?\.) (eq calc-language 'fortran)
-                 (eq (string-match "\\.[a-zA-Z][a-zA-Z][a-zA-Z]?\\."
-                                   math-exp-str math-exp-pos) math-exp-pos))
-            (setq math-exp-token 'punc
-                  math-expr-data (upcase (math-match-substring math-exp-str 0))
-                  math-exp-pos (match-end 0)))
-           ((and (eq calc-language 'math)
-                 (eq (string-match "\\[\\[\\|->\\|:>" math-exp-str math-exp-pos)
-                     math-exp-pos))
-            (setq math-exp-token 'punc
-                  math-expr-data (math-match-substring math-exp-str 0)
-                  math-exp-pos (match-end 0)))
-           ((and (eq calc-language 'eqn)
-                 (eq (string-match "->\\|<-\\|+-\\|\\\\dots\\|~\\|\\^"
-                                   math-exp-str math-exp-pos)
-                     math-exp-pos))
-            (setq math-exp-token 'punc
-                  math-expr-data (math-match-substring math-exp-str 0)
-                  math-exp-pos (match-end 0))
-            (and (eq (string-match "\\\\dots\\." math-exp-str math-exp-pos)
-                      math-exp-pos)
-                 (setq math-exp-pos (match-end 0)))
-            (if (memq (aref math-expr-data 0) '(?~ ?^))
-                (math-read-token)))
+             (setq math-exp-token 'string
+                   math-expr-data (math-match-substring math-exp-str 1)
+                   math-exp-pos (match-end 0)))
+            ((and (setq adfn (get calc-language 'math-lang-read)))
+                  (eval (nth 0 adfn))
+                  (eval (nth 1 adfn)))
            ((eq (string-match "%%.*$" math-exp-str math-exp-pos) math-exp-pos)
             (setq math-exp-pos (match-end 0))
             (math-read-token))
            (t
-            (if (and (eq ch ?\{) (memq calc-language '(tex latex eqn)))
-                (setq ch ?\())
-            (if (and (eq ch ?\}) (memq calc-language '(tex latex eqn)))
-                (setq ch ?\)))
-            (if (and (eq ch ?\&) (memq calc-language '(tex latex)))
-                (setq ch ?\,))
+             (if (setq adfn (assq ch (get calc-language 'math-punc-table)))
+                 (setq ch (cdr adfn)))
             (setq math-exp-token 'punc
                   math-expr-data (char-to-string ch)
                   math-exp-pos (1+ math-exp-pos)))))))
@@ -902,7 +806,9 @@ in Calc algebraic input.")
                             (memq math-exp-token '(symbol number dollar hash))
                             (equal math-expr-data "(")
                             (and (equal math-expr-data "[")
-                                 (not (eq calc-language 'math))
+                                 (not (equal 
+                                        (get calc-language 
+                                             'math-function-open) "["))
                                  (not (and math-exp-keep-spaces
                                            (eq (car-safe x) 'vec)))))
                         (or (not (setq op (assoc math-expr-data math-expr-opers)))
@@ -1178,7 +1084,9 @@ in Calc algebraic input.")
                                    (eq math-exp-token 'end)))
                           (throw 'syntax "Expected `)'"))
                       (math-read-token)
-                      (if (and (eq calc-language 'fortran) args
+                      (if (and (memq calc-language 
+                                      calc-lang-parens-are-subscripts) 
+                                args
                                (require 'calc-ext)
                                (let ((calc-matrix-mode 'scalar))
                                  (math-known-matrixp
@@ -1216,11 +1124,15 @@ in Calc algebraic input.")
                                               (substring (symbol-name (cdr v))
                                                          4))
                                              (cdr v))))))
-                  (while (and (memq calc-language '(c pascal maple))
+                  (while (and (memq calc-language 
+                                     calc-lang-brackets-are-subscripts)
                               (equal math-expr-data "["))
                     (math-read-token)
-                    (setq val (append (list 'calcFunc-subscr val)
-                                      (math-read-expr-list)))
+                     (let ((el (math-read-expr-list)))
+                       (while el
+                         (setq val (append (list 'calcFunc-subscr val)
+                                           (list (car el))))
+                         (setq el (cdr el))))
                     (if (equal math-expr-data "]")
                         (math-read-token)
                       (throw 'syntax "Expected ']'")))
index bb054de4951c1bf0e4288d4a239382388eb3eb7d..140335a3d02e4a5f6928c9124e7b08f6c302e947 100644 (file)
 (require 'calc)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function math-clip "calc-bin" (a &optional w))
+(declare-function math-round "calc-arith" (a &optional prec))
+(declare-function math-simplify "calc-alg" (top-expr))
+(declare-function math-simplify-extended "calc-alg" (a))
+(declare-function math-simplify-units "calc-units" (a))
+(declare-function calc-set-language "calc-lang" (lang &optional option no-refresh))
+(declare-function calc-flush-caches "calc-stuff" (&optional inhibit-msg))
+(declare-function calc-save-modes "calc-mode" ())
+(declare-function calc-embedded-modes-change "calc-embed" (vars))
+(declare-function calc-embedded-var-change "calc-embed" (var &optional buf))
+(declare-function math-mul-float "calc-arith" (a b))
+(declare-function math-arctan-raw "calc-math" (x))
+(declare-function math-sqrt-raw "calc-math" (a &optional guess))
+(declare-function math-sqrt-float "calc-math" (a &optional guess))
+(declare-function math-exp-minus-1-raw "calc-math" (x))
+(declare-function math-normalize-polar "calc-cplx" (a))
+(declare-function math-normalize-hms "calc-forms" (a))
+(declare-function math-normalize-mod "calc-forms" (a))
+(declare-function math-make-sdev "calc-forms" (x sigma))
+(declare-function math-make-intv "calc-forms" (mask lo hi))
+(declare-function math-normalize-logical-op "calc-prog" (a))
+(declare-function math-possible-signs "calc-arith" (a &optional origin))
+(declare-function math-infinite-dir "calc-math" (a &optional inf))
+(declare-function math-calcFunc-to-var "calc-map" (f))
+(declare-function calc-embedded-evaluate-expr "calc-embed" (x))
+(declare-function math-known-nonzerop "calc-arith" (a))
+(declare-function math-read-expr-level "calc-aent" (exp-prec &optional exp-term))
+(declare-function math-read-big-rec "calc-lang" (math-rb-h1 math-rb-v1 math-rb-h2 math-rb-v2 &optional baseline prec short))
+(declare-function math-read-big-balance "calc-lang" (h v what &optional commas))
+(declare-function math-format-date "calc-forms" (math-fd-date))
+(declare-function math-vector-is-string "calccomp" (a))
+(declare-function math-vector-to-string "calccomp" (a &optional quoted))
+(declare-function math-format-radix-float "calc-bin" (a prec))
+(declare-function math-compose-expr "calccomp" (a prec))
+(declare-function math-abs "calc-arith" (a))
+(declare-function math-format-bignum-binary "calc-bin" (a))
+(declare-function math-format-bignum-octal "calc-bin" (a))
+(declare-function math-format-bignum-hex "calc-bin" (a))
+(declare-function math-format-bignum-radix "calc-bin" (a))
+(declare-function math-compute-max-digits "calc-bin" (w r))
+(declare-function math-map-vec "calc-vec" (f a))
+(declare-function math-make-frac "calc-frac" (num den))
+
+
 (defvar math-simplifying nil)
 (defvar math-living-dangerously nil)   ; true if unsafe simplifications are okay.
 (defvar math-integrating nil)
@@ -2090,7 +2135,7 @@ calc-kill calc-kill-region calc-yank))))
 ;;; True if A is a real or will evaluate to a real.  [P x] [Public]
 (defun math-provably-realp (a)
   (or (Math-realp a)
-      (math-provably-integer a)
+      (math-provably-integerp a)
       (memq (car-safe a) '(abs arg))))
 
 ;;; True if A is a non-real, complex number.  [P x] [Public]
index 3839fc93666c44589a37e3c6fb4df9627b46d6b7..13048c85dceb969fbb23ba7b4d608503b66341dd 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function calendar-current-time-zone "cal-dst" ())
+(declare-function calendar-absolute-from-gregorian "calendar" (date))
+(declare-function dst-in-effect "cal-dst" (date))
+
+
 (defun calc-time ()
   (interactive)
   (calc-wrapper
index ed1c93e869425807b8923e7adb5b34f5ef8b627a..49d1fd937ba1319b5833bc0b7a0c70ee42483ce8 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function Info-goto-node "info" (nodename &optional fork))
+(declare-function Info-last "info" ())
+
+
 (defun calc-help-prefix (arg)
   "This key is the prefix for Calc help functions.  See calc-help-for-help."
   (interactive "P")
index 3871a1b0f098b61bf16aacfc43350f1232b42aee..2ae23cd5aa92c315b4a087f360ce6df69a040444 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+
+;; Declare functions which are defined elsewhere.
+(declare-function math-compose-vector "calccomp" (a sep prec))
+(declare-function math-compose-var "calccomp" (a))
+(declare-function math-tex-expr-is-flat "calccomp" (a))
+(declare-function math-read-factor "calc-aent" ())
+(declare-function math-read-expr-level "calc-aent" (exp-prec &optional exp-term))
+
+;; Declare variables which are defined elsewhere.
+(defvar calc-lang-slash-idiv)
+(defvar calc-lang-allow-underscores)
+(defvar math-comp-left-bracket)
+(defvar math-comp-right-bracket)
+(defvar math-comp-comma)
+(defvar math-comp-vector-prec)
+
 ;;; Alternate entry/display languages.
 
 (defun calc-set-language (lang &optional option no-refresh)
   (setq math-expr-opers (or (get lang 'math-oper-table) (math-standard-ops))
        math-expr-function-mapping (get lang 'math-function-table)
-       math-expr-special-function-mapping (get lang 'math-special-function-table)
        math-expr-variable-mapping (get lang 'math-variable-table)
        calc-language-input-filter (get lang 'math-input-filter)
        calc-language-output-filter (get lang 'math-output-filter)
                   (if (= r 8) (format "0%s" s)
                     (format "%d#%s" r s))))))
 
+(put 'c 'math-compose-subscr
+     (function
+      (lambda (a)
+        (let ((args (cdr (cdr a))))
+          (list 'horiz
+                (math-compose-expr (nth 1 a) 1000)
+                "["
+                (math-compose-vector args ", " 0)
+                "]")))))
+
+(add-to-list 'calc-lang-slash-idiv 'c)
+(add-to-list 'calc-lang-allow-underscores 'c)
+(add-to-list 'calc-lang-c-type-hex 'c)
+(add-to-list 'calc-lang-brackets-are-subscripts 'c)
 
 (defun calc-pascal-language (n)
   (interactive "P")
                 (if (= r 16) (format "$%s" s)
                   (format "%d#%s" r s)))))
 
+(put 'pascal 'math-lang-read-symbol
+     '((?\$
+        (eq (string-match
+             "\\(\\$[0-9a-fA-F]+\\)\\($\\|[^0-9a-zA-Z]\\)"
+             math-exp-str math-exp-pos)
+            math-exp-pos)
+        (setq math-exp-token 'number
+              math-expr-data (math-match-substring math-exp-str 1)
+              math-exp-pos (match-end 1)))))
+
+(put 'pascal 'math-compose-subscr
+     (function
+      (lambda (a)
+        (let ((args (cdr (cdr a))))
+          (while (eq (car-safe (nth 1 a)) 'calcFunc-subscr)
+            (setq args (append (cdr (cdr (nth 1 a))) args)
+                  a (nth 1 a)))
+          (list 'horiz
+                (math-compose-expr (nth 1 a) 1000)
+                "["
+                (math-compose-vector args ", " 0)
+                "]")))))
+
+(add-to-list 'calc-lang-allow-underscores 'pascal)
+(add-to-list 'calc-lang-brackets-are-subscripts 'pascal)
+
 (defun calc-input-case-filter (str)
   (cond ((or (null calc-language-option) (= calc-language-option 0))
         str)
      ( real       . calcFunc-re )))
 
 (put 'fortran 'math-input-filter 'calc-input-case-filter)
+
 (put 'fortran 'math-output-filter 'calc-output-case-filter)
 
+(put 'fortran 'math-lang-read-symbol
+     '((?\.
+        (eq (string-match "\\.[a-zA-Z][a-zA-Z][a-zA-Z]?\\."
+                          math-exp-str math-exp-pos) math-exp-pos)
+        (setq math-exp-token 'punc
+              math-expr-data (upcase (math-match-substring math-exp-str 0))
+              math-exp-pos (match-end 0)))))
+
+(put 'fortran 'math-compose-subscr
+     (function
+      (lambda (a)
+        (let ((args (cdr (cdr a))))
+          (while (eq (car-safe (nth 1 a)) 'calcFunc-subscr)
+            (setq args (append (cdr (cdr (nth 1 a))) args)
+                  a (nth 1 a)))
+          (list 'horiz
+                (math-compose-expr (nth 1 a) 1000)
+                "("
+                (math-compose-vector args ", " 0)
+                ")")))))
+
+(add-to-list 'calc-lang-slash-idiv 'fortran)
+(add-to-list 'calc-lang-allow-underscores 'fortran)
+(add-to-list 'calc-lang-parens-are-subscripts 'fortran)
+
 ;; The next few variables are local to math-read-exprs in calc-aent.el 
 ;; and math-read-expr in calc-ext.el, but are set in functions they call.
 
      ( "\\times"  *               191 190 )
      ( "*"        *               191 190 )
      ( "2x"      *                191 190 )
-     ( "/"       /                185 186 )
      ( "+"       +                180 181 )
      ( "-"       -                180 181 )
      ( "\\over"          /                170 171 )
+     ( "/"       /                170 171 )
      ( "\\choose" calcFunc-choose  170 171 )
      ( "\\mod"   %                170 171 )
      ( "<"       calcFunc-lt      160 161 )
      ( \\phi      . calcFunc-totient )
      ( \\mu       . calcFunc-moebius )))
 
+(put 'tex 'math-special-function-table
+     '((calcFunc-sum . (math-compose-tex-sum "\\sum"))
+       (calcFunc-prod . (math-compose-tex-sum "\\prod"))
+       (intv . math-compose-tex-intv)))
+
 (put 'tex 'math-variable-table
   '( 
     ;; The Greek letters
     ( \\sum        . (math-parse-tex-sum calcFunc-sum) )
     ( \\prod       . (math-parse-tex-sum calcFunc-prod) )))
 
+(put 'tex 'math-punc-table
+     '((?\{ . ?\()
+       (?\} . ?\))
+       (?\& . ?\,)))
+
 (put 'tex 'math-complex-format 'i)
 
+(put 'tex 'math-input-filter 'math-tex-input-filter)
+
+(put 'tex 'math-matrix-formatter
+     (function
+      (lambda (a)
+        (if (and (integerp calc-language-option)
+                 (or (= calc-language-option 0)
+                     (> calc-language-option 1)
+                     (< calc-language-option -1)))
+            (append '(vleft 0 "\\matrix{")
+                    (math-compose-tex-matrix (cdr a))
+                    '("}"))
+          (append '(horiz "\\matrix{ ")
+                  (math-compose-tex-matrix (cdr a))
+                  '(" }"))))))
+
+(put 'tex 'math-var-formatter 'math-compose-tex-var)
+
+(put 'tex 'math-func-formatter 'math-compose-tex-func)
+
+(put 'tex 'math-dots "\\ldots")
+
+(put 'tex 'math-big-parens '("\\left( " . " \\right)"))
+
+(put 'tex 'math-evalto '("\\evalto " . " \\to "))
+
+(defconst math-tex-ignore-words
+  '( ("\\hbox") ("\\mbox") ("\\text") ("\\left") ("\\right")
+     ("\\,") ("\\>") ("\\:") ("\\;") ("\\!") ("\\ ")
+     ("\\quad") ("\\qquad") ("\\hfil") ("\\hfill")
+     ("\\displaystyle") ("\\textstyle") ("\\dsize") ("\\tsize")
+     ("\\scriptstyle") ("\\scriptscriptstyle") ("\\ssize") ("\\sssize")
+     ("\\rm") ("\\bf") ("\\it") ("\\sl")
+     ("\\roman") ("\\bold") ("\\italic") ("\\slanted")
+     ("\\cal") ("\\mit") ("\\Cal") ("\\Bbb") ("\\frak") ("\\goth")
+     ("\\evalto")
+     ("\\matrix" mat) ("\\bmatrix" mat) ("\\pmatrix" mat)
+     ("\\begin" begenv)
+     ("\\cr" punc ";") ("\\\\" punc ";") ("\\*" punc "*")
+     ("\\{" punc "[") ("\\}" punc "]")))
+
+(defconst math-latex-ignore-words
+  (append math-tex-ignore-words
+          '(("\\begin" begenv))))
+
+(put 'tex 'math-lang-read-symbol
+     '((?\\
+        (< math-exp-pos (1- (length math-exp-str)))
+        (progn
+          (or (string-match "\\\\hbox *{\\([a-zA-Z0-9]+\\)}"
+                            math-exp-str math-exp-pos)
+              (string-match "\\(\\\\\\([a-zA-Z]+\\|[^a-zA-Z]\\)\\)"
+                            math-exp-str math-exp-pos))
+          (setq math-exp-token 'symbol
+                math-exp-pos (match-end 0)
+                math-expr-data (math-restore-dashes
+                                (math-match-substring math-exp-str 1)))
+          (let ((code (assoc math-expr-data math-latex-ignore-words)))
+            (cond ((null code))
+                  ((null (cdr code))
+                   (math-read-token))
+                  ((eq (nth 1 code) 'punc)
+                   (setq math-exp-token 'punc
+                         math-expr-data (nth 2 code)))
+                  ((and (eq (nth 1 code) 'mat)
+                        (string-match " *{" math-exp-str math-exp-pos))
+                   (setq math-exp-pos (match-end 0)
+                         math-exp-token 'punc
+                         math-expr-data "[")
+                   (let ((right (string-match "}" math-exp-str math-exp-pos)))
+                     (and right
+                          (setq math-exp-str (copy-sequence math-exp-str))
+                          (aset math-exp-str right ?\]))))))))))
+
+(defun math-compose-tex-matrix (a &optional ltx)
+  (if (cdr a)
+      (cons (append (math-compose-vector (cdr (car a)) " & " 0) 
+                    (if ltx '(" \\\\ ") '(" \\cr ")))
+            (math-compose-tex-matrix (cdr a) ltx))
+    (list (math-compose-vector (cdr (car a)) " & " 0))))
+
+(defun math-compose-tex-sum (a fn)
+  (cond
+   ((nth 4 a)
+    (list 'horiz (nth 1 fn)
+          "_{" (math-compose-expr (nth 2 a) 0)
+          "=" (math-compose-expr (nth 3 a) 0)
+          "}^{" (math-compose-expr (nth 4 a) 0)
+          "}{" (math-compose-expr (nth 1 a) 0) "}"))
+   ((nth 3 a)
+    (list 'horiz (nth 1 fn)
+          "_{" (math-compose-expr (nth 2 a) 0)
+          "=" (math-compose-expr (nth 3 a) 0)
+          "}{" (math-compose-expr (nth 1 a) 0) "}"))
+   (t
+    (list 'horiz (nth 1 fn)
+          "_{" (math-compose-expr (nth 2 a) 0)
+          "}{" (math-compose-expr (nth 1 a) 0) "}"))))
+
 (defun math-parse-tex-sum (f val)
   (let (low high save)
     (or (equal math-expr-data "_") (throw 'syntax "Expected `_'"))
     (setq str (concat (substring str 0 (1+ (match-beginning 0)))
                      (substring str (1- (match-end 0))))))
   str)
-(put 'tex 'math-input-filter 'math-tex-input-filter)
+
+;(defun math-tex-print-sqrt (a)
+;  (list 'horiz
+;        "\\sqrt{"
+;        (math-compose-expr (nth 1 a) 0)
+;        "}"))
+
+(defun math-compose-tex-intv (a)
+  (list 'horiz
+        (if (memq (nth 1 a) '(0 1)) "(" "[")
+        (math-compose-expr (nth 2 a) 0)
+        " \\ldots "
+        (math-compose-expr (nth 3 a) 0)
+        (if (memq (nth 1 a) '(0 2)) ")" "]")))
+
+(defun math-compose-tex-var (a prec)
+  (if (and calc-language-option
+           (not (= calc-language-option 0))
+           (string-match "\\`[a-zA-Z][a-zA-Z0-9]+\\'"
+                         (symbol-name (nth 1 a))))
+      (if (eq calc-language 'latex)
+          (format "\\text{%s}" (symbol-name (nth 1 a)))
+        (format "\\hbox{%s}" (symbol-name (nth 1 a))))
+    (math-compose-var a)))
+
+(defun math-compose-tex-func (func a)
+  (let (left right)
+    (if (and calc-language-option
+             (not (= calc-language-option 0))
+             (string-match "\\`[a-zA-Z][a-zA-Z0-9]+\\'" func))
+        (if (< (prefix-numeric-value calc-language-option) 0)
+            (setq func (format "\\%s" func))
+          (setq func (if (eq calc-language 'latex)
+                         (format "\\text{%s}" func)
+                       (format "\\hbox{%s}" func)))))
+    (cond ((or (> (length a) 2)
+               (not (math-tex-expr-is-flat (nth 1 a))))
+           (setq left "\\left( "
+                 right " \\right)"))
+          ((and (eq (aref func 0) ?\\)
+                (not (or
+                      (string-match "\\hbox{" func)
+                      (string-match "\\text{" func)))
+                (= (length a) 2)
+                (or (Math-realp (nth 1 a))
+                    (memq (car (nth 1 a)) '(var *))))
+           (setq left "{" right "}"))
+          (t (setq left calc-function-open
+                   right calc-function-close)))
+    (list 'horiz func 
+          left
+          (math-compose-vector (cdr a) ", " 0)
+          right)))
 
 (put 'latex 'math-oper-table
      (append (get 'tex 'math-oper-table)
                ( "\\Vec"    calcFunc-VEC     -1  950 )
                ( "\\dddot"  calcFunc-dddot   -1  950 )
                ( "\\ddddot" calcFunc-ddddot  -1  950 )
-               ( "\div"     /                170 171 )
+               ( "\\div"     /                170 171 )
                ( "\\le"     calcFunc-leq     160 161 )
                ( "\\leqq"   calcFunc-leq     160 161 )
                ( "\\leqsland" calcFunc-leq   160 161 )
         ( \\mu       . calcFunc-moebius ))))
 
 (put 'latex 'math-special-function-table
-     '((/               . (math-latex-print-frac "\\frac"))
-       (calcFunc-choose . (math-latex-print-frac "\\binom"))))
+     '((/               . (math-compose-latex-frac "\\frac"))
+       (calcFunc-choose . (math-compose-latex-frac "\\binom"))
+       (calcFunc-sum . (math-compose-tex-sum "\\sum"))
+       (calcFunc-prod . (math-compose-tex-sum "\\prod"))
+       (intv          . math-compose-tex-intv)))
 
 (put 'latex 'math-variable-table
      (get 'tex 'math-variable-table))
 
-(put 'latex 'math-complex-format 'i)
+(put 'latex 'math-punc-table
+     '((?\{ . ?\()
+       (?\} . ?\))
+       (?\& . ?\,)))
 
+(put 'latex 'math-complex-format 'i)
 
+(put 'latex 'math-matrix-formatter
+     (function
+      (lambda (a)
+        (if (and (integerp calc-language-option)
+                 (or (= calc-language-option 0)
+                     (> calc-language-option 1)
+                     (< calc-language-option -1)))
+            (append '(vleft 0 "\\begin{pmatrix}")
+                    (math-compose-tex-matrix (cdr a) t)
+                    '("\\end{pmatrix}"))
+          (append '(horiz "\\begin{pmatrix} ")
+                  (math-compose-tex-matrix (cdr a) t)
+                  '(" \\end{pmatrix}"))))))
+
+(put 'latex 'math-var-formatter 'math-compose-tex-var)
+
+(put 'latex 'math-func-formatter 'math-compose-tex-func)
+
+(put 'latex 'math-dots "\\ldots")
+
+(put 'latex 'math-big-parens '("\\left( " . " \\right)"))
+
+(put 'latex 'math-evalto '("\\evalto " . " \\to "))
+
+(put 'latex 'math-lang-read-symbol
+     '((?\\
+        (< math-exp-pos (1- (length math-exp-str)))
+        (progn
+          (or (string-match "\\\\hbox *{\\([a-zA-Z0-9]+\\)}"
+                            math-exp-str math-exp-pos)
+              (string-match "\\\\text *{\\([a-zA-Z0-9]+\\)}"
+                            math-exp-str math-exp-pos)
+              (string-match "\\(\\\\\\([a-zA-Z]+\\|[^a-zA-Z]\\)\\)"
+                            math-exp-str math-exp-pos))
+          (setq math-exp-token 'symbol
+                math-exp-pos (match-end 0)
+                math-expr-data (math-restore-dashes
+                                (math-match-substring math-exp-str 1)))
+          (let ((code (assoc math-expr-data math-tex-ignore-words))
+                envname)
+            (cond ((null code))
+                  ((null (cdr code))
+                   (math-read-token))
+                  ((eq (nth 1 code) 'punc)
+                   (setq math-exp-token 'punc
+                         math-expr-data (nth 2 code)))
+                  ((and (eq (nth 1 code) 'begenv)
+                        (string-match " *{\\([^}]*\\)}" math-exp-str math-exp-pos))
+                   (setq math-exp-pos (match-end 0)
+                         envname (match-string 1 math-exp-str)
+                         math-exp-token 'punc
+                         math-expr-data "[")
+                   (cond ((or (string= envname "matrix")
+                              (string= envname "bmatrix")
+                              (string= envname "smallmatrix")
+                              (string= envname "pmatrix"))
+                          (if (string-match (concat "\\\\end{" envname "}")
+                                            math-exp-str math-exp-pos)
+                              (setq math-exp-str
+                                    (replace-match "]" t t math-exp-str))
+                            (error "%s" (concat "No closing \\end{" envname "}"))))))
+                  ((and (eq (nth 1 code) 'mat)
+                        (string-match " *{" math-exp-str math-exp-pos))
+                   (setq math-exp-pos (match-end 0)
+                         math-exp-token 'punc
+                         math-expr-data "[")
+                   (let ((right (string-match "}" math-exp-str math-exp-pos)))
+                     (and right
+                          (setq math-exp-str (copy-sequence math-exp-str))
+                          (aset math-exp-str right ?\]))))))))))
+        
 (defun math-latex-parse-frac (f val)
   (let (numer denom)
     (setq numer (car (math-read-expr-list)))
     (setq second (math-read-factor))
     (list (nth 2 f) first second)))
 
-(defun math-latex-print-frac (a fn)
+(defun math-compose-latex-frac (a fn)
   (list 'horiz (nth 1 fn) "{" (math-compose-expr (nth 1 a) -1)
                "}{"
                (math-compose-expr (nth 2 a) -1)
      ( mu         . calcFunc-moebius )
      ( matrix     . (math-parse-eqn-matrix) )))
 
+(put 'eqn 'math-special-function-table
+     '((intv . math-compose-eqn-intv)))
+
+(put 'eqn 'math-punc-table
+     '((?\{ . ?\()
+       (?\} . ?\))))
+
 (put 'eqn 'math-variable-table
   '( ( inf        . var-uinf )))
 
 (put 'eqn 'math-complex-format 'i)
 
+(put 'eqn 'math-big-parens '("{left ( " . " right )}"))
+
+(put 'eqn 'math-evalto '("evalto " . " -> "))
+
+(put 'eqn 'math-matrix-formatter
+     (function
+      (lambda (a)
+        (append '(horiz "matrix { ")
+                (math-compose-eqn-matrix
+                 (cdr (math-transpose a)))
+                '("}")))))
+
+(put 'eqn 'math-var-formatter 
+     (function
+      (lambda (a prec)
+        (let (v)
+          (if (and math-compose-hash-args
+                   (let ((p calc-arg-values))
+                     (setq v 1)
+                     (while (and p (not (equal (car p) a)))
+                       (setq p (and (eq math-compose-hash-args t) (cdr p))
+                             v (1+ v)))
+                     p))
+              (if (eq math-compose-hash-args 1)
+                  "#"
+                (format "#%d" v))
+            (if (string-match ".'\\'" (symbol-name (nth 2 a)))
+                (math-compose-expr
+                 (list 'calcFunc-Prime
+                       (list
+                        'var
+                        (intern (substring (symbol-name (nth 1 a)) 0 -1))
+                        (intern (substring (symbol-name (nth 2 a)) 0 -1))))
+                 prec)
+              (symbol-name (nth 1 a))))))))
+      
+(defconst math-eqn-special-funcs
+  '( calcFunc-log
+     calcFunc-ln calcFunc-exp
+     calcFunc-sin calcFunc-cos calcFunc-tan
+     calcFunc-sec calcFunc-csc calcFunc-cot
+     calcFunc-sinh calcFunc-cosh calcFunc-tanh
+     calcFunc-sech calcFunc-csch calcFunc-coth
+     calcFunc-arcsin calcFunc-arccos calcFunc-arctan
+     calcFunc-arcsinh calcFunc-arccosh calcFunc-arctanh))
+
+(put 'eqn 'math-func-formatter 
+     (function
+      (lambda (func a)
+        (let (left right)
+          (if (string-match "[^']'+\\'" func)
+              (let ((n (- (length func) (match-beginning 0) 1)))
+                (setq func (substring func 0 (- n)))
+                (while (>= (setq n (1- n)) 0)
+                  (setq func (concat func " prime")))))
+          (cond ((or (> (length a) 2)
+                     (not (math-tex-expr-is-flat (nth 1 a))))
+                 (setq left "{left ( "
+                       right " right )}"))
+                
+                ((and 
+                  (memq (car a) math-eqn-special-funcs)
+                  (= (length a) 2)
+                  (or (Math-realp (nth 1 a))
+                      (memq (car (nth 1 a)) '(var *))))
+                 (setq left "~{" right "}"))
+                (t
+                 (setq left " ( "
+                       right " )")))
+          (list 'horiz func left
+                (math-compose-vector (cdr a) " , " 0)
+                right)))))
+
+(put 'eqn 'math-lang-read-symbol
+     '((?\"
+        (string-match "\\(\"\\([^\"\\]\\|\\\\.\\)*\\)\\(\"\\|\\'\\)"
+                      math-exp-str math-exp-pos)
+        (progn
+          (setq math-exp-str (copy-sequence math-exp-str))
+          (aset math-exp-str (match-beginning 1) ?\{)
+          (if (< (match-end 1) (length math-exp-str))
+              (aset math-exp-str (match-end 1) ?\}))
+          (math-read-token)))))
+
+(defconst math-eqn-ignore-words
+  '( ("roman") ("bold") ("italic") ("mark") ("lineup") ("evalto")
+     ("left" ("floor") ("ceil"))
+     ("right" ("floor") ("ceil"))
+     ("arc" ("sin") ("cos") ("tan") ("sinh") ("cosh") ("tanh"))
+     ("size" n) ("font" n) ("fwd" n) ("back" n) ("up" n) ("down" n)
+     ("above" punc ",")))
+
+(put 'eqn 'math-lang-adjust-words
+     (function 
+      (lambda ()
+        (let ((code (assoc math-expr-data math-eqn-ignore-words)))
+          (cond ((null code))
+                ((null (cdr code))
+                 (math-read-token))
+                ((consp (nth 1 code))
+                 (math-read-token)
+                 (if (assoc math-expr-data (cdr code))
+                     (setq math-expr-data (format "%s %s"
+                                                  (car code) math-expr-data))))
+                ((eq (nth 1 code) 'punc)
+                 (setq math-exp-token 'punc
+                       math-expr-data (nth 2 code)))
+                (t
+                 (math-read-token)
+                 (math-read-token)))))))
+
+(put 'eqn 'math-lang-read
+     '((eq (string-match "->\\|<-\\|+-\\|\\\\dots\\|~\\|\\^"
+                         math-exp-str math-exp-pos)
+           math-exp-pos)
+       (progn
+         (setq math-exp-token 'punc
+               math-expr-data (math-match-substring math-exp-str 0)
+               math-exp-pos (match-end 0))
+         (and (eq (string-match "\\\\dots\\." math-exp-str math-exp-pos)
+                  math-exp-pos)
+              (setq math-exp-pos (match-end 0)))
+         (if (memq (aref math-expr-data 0) '(?~ ?^))
+             (math-read-token)))))
+
+
+(defun math-compose-eqn-matrix (a)
+  (if a
+      (cons
+       (cond ((eq calc-matrix-just 'right) "rcol ")
+            ((eq calc-matrix-just 'center) "ccol ")
+            (t "lcol "))
+       (cons
+       (list 'break math-compose-level)
+       (cons
+        "{ "
+        (cons
+         (let ((math-compose-level (1+ math-compose-level)))
+           (math-compose-vector (cdr (car a)) " above " 1000))
+         (cons
+          " } "
+          (math-compose-eqn-matrix (cdr a)))))))
+    nil))
+
 (defun math-parse-eqn-matrix (f sym)
   (let ((vec nil))
     (while (assoc math-expr-data '(("ccol") ("lcol") ("rcol")))
              (intern (concat (symbol-name (nth 2 x)) "'"))))
     (list 'calcFunc-Prime x)))
 
+(defun math-compose-eqn-intv (a)
+  (list 'horiz
+        (if (memq (nth 1 a) '(0 1)) "(" "[")
+        (math-compose-expr (nth 2 a) 0)
+        " ... "
+        (math-compose-expr (nth 3 a) 0)
+        (if (memq (nth 1 a) '(0 2)) ")" "]")))
+
 
 (defun calc-mathematica-language ()
   (interactive)
 (put 'math 'math-radix-formatter
      (function (lambda (r s) (format "%d^^%s" r s))))
 
+(put 'math 'math-lang-read
+     '((eq (string-match "\\[\\[\\|->\\|:>" math-exp-str math-exp-pos)
+           math-exp-pos)
+       (setq math-exp-token 'punc
+             math-expr-data (math-match-substring math-exp-str 0)
+             math-exp-pos (match-end 0))))
+
+(put 'math 'math-compose-subscr
+     (function
+      (lambda (a)
+        (list 'horiz
+              (math-compose-expr (nth 1 a) 1000)
+              "[["
+              (math-compose-expr (nth 2 a) 0)
+              "]]"))))
+
 (defun math-read-math-subscr (x op)
   (let ((idx (math-read-expr-level 0)))
     (or (and (equal math-expr-data "]")
      ( vectdim    . calcFunc-vlen )
 ))
 
+(put 'maple 'math-special-function-table
+     '((intv . math-compose-maple-intv)))
+
 (put 'maple 'math-variable-table
   '( ( I          . var-i )
      ( Pi         . var-pi )
 
 (put 'maple 'math-complex-format 'I)
 
+(put 'maple 'math-matrix-formatter
+     (function
+      (lambda (a)
+        (list 'horiz
+              "matrix("
+              math-comp-left-bracket
+              (math-compose-vector (cdr a) 
+                                   (concat math-comp-comma " ")
+                                   math-comp-vector-prec)
+              math-comp-right-bracket
+              ")"))))
+
+(put 'maple 'math-compose-subscr
+     (function
+      (lambda (a)
+        (let ((args (cdr (cdr a))))
+          (list 'horiz
+                (math-compose-expr (nth 1 a) 1000)
+                "["
+                (math-compose-vector args ", " 0)
+                "]")))))
+
+(add-to-list 'calc-lang-allow-underscores 'maple)
+(add-to-list 'calc-lang-brackets-are-subscripts 'maple)
+
+(defun math-compose-maple-intv (a)
+  (list 'horiz
+        (math-compose-expr (nth 2 a) 0)
+        " .. "
+        (math-compose-expr (nth 3 a) 0)))
+
 (defun math-read-maple-dots (x op)
   (list 'intv 3 x (math-read-expr-level (nth 3 op))))
 
index 27001b43f367ca2005fc0b5766120febfd7075f2..8e939cdde7bd27dd69f2a739cce3e64fbe28464e 100644 (file)
 
 ;;; Code:
 
+;; Declare functions which are defined elsewhere.
+(declare-function math-zerop "calc-misc" (a))
+(declare-function math-negp "calc-misc" (a))
+(declare-function math-looks-negp "calc-misc" (a))
+(declare-function math-posp "calc-misc" (a))
+(declare-function math-compare "calc-ext" (a b))
+(declare-function math-bignum "calc" (a))
+(declare-function math-compare-bignum "calc-ext" (a b))
+
+
 (defmacro calc-wrapper (&rest body)
   `(calc-do (function (lambda ()
                        ,@body))))
diff --git a/lisp/calc/calc-menu.el b/lisp/calc/calc-menu.el
new file mode 100644 (file)
index 0000000..22c42ad
--- /dev/null
@@ -0,0 +1,1214 @@
+;;; calc-menu.el --- a menu for Calc
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com>
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+(defvar calc-arithmetic-menu
+  (list "Arithmetic"
+        (list "Basic"
+              ["-(1:)"         calc-change-sign :keys "n"]
+              ["(2:) + (1:)"   calc-plus   :keys "+"]
+              ["(2:) - (1:)"   calc-minus  :keys "-"]
+              ["(2:) * (1:)"   calc-times  :keys "*"]
+              ["(2:) / (1:)"   calc-divide :keys "/"]
+              ["(2:) ^ (1:)"   calc-power  :keys "^"]
+              ["(2:) ^ (1/(1:))" 
+               (progn
+                 (require 'calc-ext)
+                 (let ((calc-inverse-flag t))
+                   (call-interactively 'calc-power)))
+               :keys "I ^"
+               :help "The (1:)th root of (2:)"]
+              ["abs(1:)"   
+               (progn 
+                 (require 'calc-arith)
+                 (call-interactively 'calc-abs))
+               :keys "A"
+               :help "Absolute value"]
+              ["1/(1:)"
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-inv))
+               :keys "&"]
+              ["sqrt(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-sqrt))
+               :keys "Q"]
+              ["idiv(2:,1:)"
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-idiv))
+               :keys "\\"
+               :help "The integer quotient of (2:) over (1:)"]
+              ["(2:) mod (1:)"  
+               (progn
+                 (require 'calc-misc)
+                 (call-interactively 'calc-mod))
+               :keys "%"
+               :help "The remainder when (2:) is divided by (1:)"])
+        (list "Rounding"
+              ["floor(1:)" 
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-floor))
+               :keys "F"
+               :help "The greatest integer less than or equal to (1:)"]
+              ["ceiling(1:)"  
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-ceiling))
+               :keys "I F"
+               :help "The smallest integer greater than or equal to (1:)"]
+              ["round(1:)"    
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-round))
+               :keys "R"
+               :help "The nearest integer to (1:)"]
+              ["truncate(1:)" 
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-trunc))
+               :keys "I R"
+               :help "The integer part of (1:)"])
+        (list "Complex Numbers"
+              ["Re(1:)"
+               (progn
+                 (require 'calc-cplx)
+                 (call-interactively 'calc-re))
+               :keys "f r"]
+              ["Im(1:)"
+               (progn
+                 (require 'calc-cplx)
+                 (call-interactively 'calc-im))
+               :keys "f i"]
+              ["conj(1:)"
+               (progn
+                 (require 'calc-cplx)
+                 (call-interactively 'calc-conj))
+               :keys "J"
+               :help "The complex conjugate of (1:)"]
+              ["length(1:)"
+               (progn (require 'calc-arith)
+                      (call-interactively 'calc-abs))
+               :keys "A"
+               :help "The length (absolute value) of (1:)"]
+              ["arg(1:)"
+               (progn
+                 (require 'calc-cplx)
+                 (call-interactively 'calc-argument))
+               :keys "G"
+               :help "The argument (polar angle) of (1:)"])
+        (list "Conversion"
+              ["Convert (1:) to a float"    
+               (progn
+                 (require 'calc-ext)
+                 (call-interactively 'calc-float))
+               :keys "c f"]
+              ["Convert (1:) to a fraction" 
+               (progn
+                 (require 'calc-ext)
+                 (call-interactively 'calc-fraction))
+               :keys "c F"])
+        (list "Binary"
+              ["Set word size" 
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-word-size))
+               :keys "b w"]
+              ["Clip (1:) to word size" 
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-clip))
+               :keys "b c"
+               :help "Reduce (1:) modulo 2^wordsize"]
+              ["(2:) and (1:)"    
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-and))
+               :keys "b a"
+               :help "Bitwise AND [modulo 2^wordsize]"]
+              ["(2:) or (1:)"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-or))
+               :keys "b o"
+               :help "Bitwise inclusive OR [modulo 2^wordsize]"]
+              ["(2:) xor (1:)"
+               (progn 
+                 (require 'calc-bin)
+                 (call-interactively 'calc-xor))
+               :keys "b x"
+               :help "Bitwise exclusive OR [modulo 2^wordsize]"]
+              ["diff(2:,1:)" 
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-diff))
+               :keys "b d"
+               :help "Bitwise difference [modulo 2^wordsize]"]
+              ["not (1:)"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-not))
+               :keys "b n"
+               :help "Bitwise NOT [modulo 2^wordsize]"]
+              ["left shift(1:)"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-lshift-binary))
+               :keys "b l"
+               :help "Shift (1:)[modulo 2^wordsize] one bit left"]
+              ["right shift(1:)"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-rshift-binary))
+               :keys "b r"
+               :help "Shift (1:)[modulo 2^wordsize] one bit right, putting 0s on the left"]
+              ["arithmetic right shift(1:)"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-rshift-arith))
+               :keys "b R"
+               :help "Shift (1:)[modulo 2^wordsize] one bit right, duplicating the leftmost bit"]
+              ["rotate(1:)"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-rotate-binary))
+               :keys "b t"
+               :help "Rotate (1:)[modulo 2^wordsize] one bit left"])
+        "-------"
+        ["Help on Arithmetic"
+         (calc-info-goto-node "Arithmetic")])
+  "Menu for Calc's arithmetic functions.")
+
+(defvar calc-scientific-function-menu
+  (list "Scientific Functions"
+        (list "Constants"
+              ["pi"
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-pi))
+               :keys "P"]
+              ["e"
+               (progn
+                 (require 'calc-math)
+                 (let ((calc-hyperbolic-flag t))
+                   (call-interactively 'calc-pi)))
+               :keys "H P"]
+              ["phi"
+               (progn
+                 (require 'calc-math)
+                 (let ((calc-inverse-flag t)
+                       (calc-hyperbolic-flag t))
+                   (call-interactively 'calc-pi)))
+               :keys "I H P"
+               :help "The golden ratio"]
+              ["gamma"
+               (progn
+                 (require 'calc-math)
+                 (let ((calc-inverse-flag t))
+                   (call-interactively 'calc-pi)))
+               :keys "I P"
+               :help "Euler's constant"])
+        (list "Logs and Exps"
+              ["ln(1:)" 
+               (progn 
+                 (require 'calc-math) 
+                 (call-interactively 'calc-ln)) 
+               :keys "L"
+               :help "The natural logarithm"]
+              ["e^(1:)"   
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-exp))
+               :keys "E"]
+              ["log(1:) [base 10]" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-log10))
+               :keys "H L"
+               :help "The common logarithm"]
+              ["10^(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (let ((calc-inverse-flag t))
+                   (call-interactively 'calc-log10)))
+               :keys "I H L"]
+              ["log(2:) [base(1:)]" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-log))
+               :keys "B"
+               :help "The logarithm with an arbitrary base"]
+              ["(2:) ^ (1:)"  
+               calc-power 
+               :keys "^"])
+        (list "Trigonometric Functions"
+              ["sin(1:)"  
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-sin))
+               :keys "S"]
+              ["cos(1:)"  
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-cos))
+               :keys "C"]
+              ["tan(1:)"  
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-tan))
+               :keys "T"]
+              ["arcsin(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arcsin))
+               :keys "I S"]
+              ["arccos(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arccos))
+               :keys "I C"]
+              ["arctan(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arctan))
+               :keys "I T"]
+              ["arctan2(2:,1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arctan2))
+               :keys "f T"]
+              "--Angle Measure--"
+              ["Radians"
+               (progn
+                 (require 'calc-math)
+                 (calc-radians-mode))
+               :keys "m r"
+               :style radio
+               :selected (eq calc-angle-mode 'rad)]
+              ["Degrees"
+               (progn
+                 (require 'calc-math)
+                 (calc-degrees-mode))
+               :keys "m d"
+               :style radio
+               :selected (eq calc-angle-mode 'deg)]
+              ["HMS"
+               (progn
+                 (require 'calc-math)
+                 (calc-hms-mode))
+               :keys "m h"
+               :style radio
+               :selected (eq calc-angle-mode 'hms)])
+        (list "Hyperbolic Functions"
+              ["sinh(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-sinh))
+               :keys "H S"]
+              ["cosh(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-cosh))
+               :keys "H C"]
+              ["tanh(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-tanh))
+               :keys "H T"]
+              ["arcsinh(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arcsinh))
+               :keys "I H S"]
+              ["arccosh(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arccosh))
+               :keys "I H C"]
+              ["arctanh(1:)" 
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-arctanh))
+               :keys "I H T"])
+        (list "Advanced Math Functions"
+              ["Gamma(1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-gamma))
+               :keys "f g"
+               :help "The Euler Gamma function"]
+              ["GammaP(2:,1:)" 
+               (progn
+                 (require 'calc-funcs)
+                 (call-interactively 'calc-inc-gamma))
+               :keys "f G"
+               :help "The lower incomplete Gamma function"]
+              ["Beta(2:,1:)" 
+               (progn
+                 (require 'calc-funcs)
+                 (call-interactively 'calc-beta))
+               :keys "f b"
+               :help "The Euler Beta function"]
+              ["BetaI(3:,2:,1:)" 
+               (progn
+                 (require 'calc-funcs)
+                 (call-interactively 'calc-inc-beta))
+               :keys "f B"
+               :help "The incomplete Beta function"]
+              ["erf(1:)"
+               (progn
+                 (require 'calc-funcs)
+                 (call-interactively 'calc-erf))
+               :keys "f e"
+               :help "The error function"]
+              ["BesselJ(2:,1:)" 
+               (progn
+                 (require 'calc-funcs)
+                 (call-interactively 'calc-bessel-J))
+               :keys "f j"
+               :help "The Bessel function of the first kind (of order (2:))"]
+              ["BesselY(2:,1:)" 
+               (progn
+                 (require 'calc-funcs)
+                 (call-interactively 'calc-bessel-Y))
+               :keys "f y"
+               :help "The Bessel function of the second kind (of order (2:))"])
+        (list "Combinatorial Functions"
+              ["gcd(2:,1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-gcd))
+                 :keys "k g"]
+              ["lcm(2:,1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-lcm))
+               :keys "k l"]
+              ["factorial(1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-factorial))
+               :keys "!"]
+              ["(2:) choose (1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-choose))
+               :keys "k c"]
+              ["permutations(2:,1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-perm))
+               :keys "H k c"]
+              ["Primality test for (1:)" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-prime-test))
+               :keys "k p"
+               :help "For large (1:), a probabilistic test"]
+              ["Factor (1:) into primes" 
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-prime-factors))
+               :keys "k f"]
+              ["Next prime after (1:)"
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-next-prime))
+               :keys "k n"]
+              ["Previous prime before (1:)"
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-prev-prime))
+               :keys "I k n"]
+              ["phi(1:)"
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-totient))
+               :keys "k n"
+               :help "Euler's totient function"]
+              ["random(1:)"
+               (progn
+                 (require 'calc-comb)
+                 (call-interactively 'calc-random))
+               :keys "k r"
+               :help "A random number >=1 and < (1:)"])
+        "----"
+        ["Help on Scientific Functions"
+         (calc-info-goto-node "Scientific Functions")])
+  "Menu for Calc's scientific functions.")
+              
+(defvar calc-algebra-menu
+  (list "Algebra"
+        (list "Simplification"
+              ["Simplify (1:)" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-simplify))
+               :keys "a s"]
+              ["Simplify (1:) with extended rules" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-simplify-extended))
+               :keys "a e"
+               :help "Apply possibly unsafe simplifications"])
+        (list "Manipulation"
+              ["Expand formula (1:)" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-expand-formula))
+               :keys "a \""
+               :help "Expand (1:) into its defining formula, if possible"]
+              ["Evaluate variables in (1:)" 
+               (progn
+                 (require 'calc-ext)
+                 (call-interactively 'calc-evaluate))
+               :keys "="]
+              ["Make substitution in (1:)" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-substitute))
+               :keys "a b"
+               :help 
+               "Substitute all occurrences of a sub-expression with a new sub-expression"])
+        (list "Polynomials"
+              ["Factor (1:)" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-factor))
+               :keys "a f"]
+              ["Collect terms in (1:)" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-collect)) 
+               :keys "a c"
+               :help "Arrange as a polynomial in a given variable"]
+              ["Expand (1:)" 
+               (progn
+                 (require 'calc-alg)
+                 (call-interactively 'calc-expand))
+               :keys "a x"
+               :help "Apply distributive law everywhere"]
+              ["Find roots of (1:)" 
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-poly-roots))
+               :keys "a P"])
+        (list "Calculus"
+              ["Differentiate (1:)" 
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-derivative))
+               :keys "a d"]
+              ["Integrate (1:) [indefinite]" 
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-integral))
+               :keys "a i"]
+              ["Integrate (1:) [definite]" 
+               (progn
+                 (require 'calcalg2)
+                 (let ((var (read-string "Integration variable: ")))
+                   (calc-tabular-command 'calcFunc-integ "Integration" 
+                                         "intg" nil var nil nil)))
+               :keys "C-u a i"]
+              ["Integrate (1:) [numeric]"
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-num-integral))
+               :keys "a I"
+               :help "Integrate using the open Romberg method"]
+              ["Taylor expand (1:)" 
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-taylor))
+               :keys "a t"]
+              ["Minimize (2:) [initial guess = (1:)]" 
+               (progn
+                 (require 'calcalg3)
+                 (call-interactively 'calc-find-minimum))
+               :keys "a N"
+               :help "Find a local minimum"]
+              ["Maximize (2:) [initial guess = (1:)]" 
+               (progn
+                 (require 'calcalg3)
+                 (call-interactively 'calc-find-maximum))
+               :keys "a X"
+               :help "Find a local maximum"])
+        (list "Solving"
+              ["Solve equation (1:)" 
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-solve-for))
+               :keys "a S"]
+              ["Solve equation (2:) numerically [initial guess = (1:)]" 
+               (progn
+                 (require 'calcalg3)
+                 (call-interactively 'calc-find-root))
+               :keys "a R"]
+              ["Find roots of polynomial (1:)" 
+               (progn
+                 (require 'calcalg2)
+                 (call-interactively 'calc-poly-roots))
+               :keys "a P"])
+        (list "Curve Fitting"
+              ["Fit (1:)=[x values, y values] to a curve" 
+               (progn
+                 (require 'calcalg3)
+                 (call-interactively 'calc-curve-fit))
+               :keys "a F"])
+        "----"
+        ["Help on Algebra"
+         (calc-info-goto-node "Algebra")])
+  "Menu for Calc's algebraic facilities.")
+
+
+(defvar calc-graphics-menu
+  (list "Graphics"
+        ["Graph 2D [(1:)= y values, (2:)= x values]" 
+         (progn
+           (require 'calc-graph)
+           (call-interactively 'calc-graph-fast))
+         :keys "g f"]
+        ["Graph 3D [(1:)= z values, (2:)= y values, (3:)= x values]" 
+         (progn
+           (require 'calc-graph)
+           (call-interactively 'calc-graph-fast-3d))
+         :keys "g F"]
+        "----"
+        ["Help on Graphics"
+         (calc-info-goto-node "Graphics")])
+  "Menu for Calc's graphics.")
+
+
+(defvar calc-vectors-menu
+  (list "Matrices/Vectors"
+        (list "Matrices"
+              ["(2:) + (1:)"   calc-plus   :keys "+"]
+              ["(2:) - (1:)"   calc-minus  :keys "-"]
+              ["(2:) * (1:)"   calc-times  :keys "*"]
+              ["(1:)^(-1)"    
+               (progn
+                 (require 'calc-arith)
+                 (call-interactively 'calc-inv))
+               :keys "&"]
+              ["Create an identity matrix"
+               (progn 
+                 (require 'calc-vec)
+                 (call-interactively 'calc-ident))
+               :keys "v i"]
+              ["transpose(1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-transpose))
+               :keys "v t"]
+              ["det(1:)" 
+               (progn
+                 (require 'calc-mtx)
+                 (call-interactively 'calc-mdet))
+               :keys "V D"]
+              ["trace(1:)"
+               (progn
+                 (require 'calc-mtx)
+                 (call-interactively 'calc-mtrace))
+               :keys "V T"]
+              ["LUD decompose (1:)" 
+               (progn
+                 (require 'calc-mtx)
+                 (call-interactively 'calc-mlud))
+               :keys "V L"]
+              ["Extract a row from (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-mrow))
+               :keys "v r"]
+              ["Extract a column from (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-mcol))
+               :keys "v c"])
+        (list "Vectors"
+              ["Extract the first element of (1:)"
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-head))
+               :keys "v h"]
+              ["Extract an element from (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-mrow))
+               :keys "v r"]
+              ["Reverse (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-reverse-vector))
+               :keys "v v"]
+              ["Unpack (1:)"
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-unpack))
+               :keys "v u"
+               :help "Separate the elements of (1:)"]
+              ["(2:) cross (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-cross))
+               :keys "V C"
+               :help "The cross product in R^3"]
+              ["(2:) dot (1:)" 
+               calc-mult 
+               :keys "*"
+               :help "The dot product"]
+              ["Map a function across (1:)" 
+               (progn
+                 (require 'calc-map)
+                 (call-interactively 'calc-map))
+               :keys "V M"
+               :help "Apply a function to each element"])
+        (list "Vectors As Sets"
+              ["Remove duplicates from (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-remove-duplicates))
+               :keys "V +"]
+              ["(2:) union (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-set-union))
+               :keys "V V"]
+              ["(2:) intersect (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-set-intersect))
+               :keys "V ^"]
+              ["(2:) \\ (1:)" 
+               (progn
+                 (require 'calc-vec)
+                 (call-interactively 'calc-set-difference))
+               :keys "V -"
+               :help "Set difference"])
+        (list "Statistics On Vectors"
+              ["length(1:)" 
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-count))
+               :keys "u #"
+               :help "The number of data values"]
+              ["sum(1:)"    
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-sum))
+               :keys "u +"
+               :help "The sum of the data values"]
+              ["max(1:)"    
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-max))  
+               :keys "u x"
+               :help "The maximum of the data values"]
+              ["min(1:)"    
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-min))  
+               :keys "u N"
+               :help "The minumum of the data values"]
+              ["mean(1:)"   
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-mean))
+               :keys "u M"
+               :help "The average (arithmetic mean) of the data values"]
+              ["mean(1:) with error"
+              (progn
+                (require 'calc-stat)
+                (call-interactively 'calc-vector-mean-error))
+              :keys "I u M"
+              :help "The average (arithmetic mean) of the data values as an error form"]
+              ["sdev(1:)"   
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-sdev))
+               :keys "u S"
+               :help "The sample sdev, sqrt[sum((values - mean)^2)/(N-1)]"]
+              ["variance(1:)" 
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-variance))
+               :keys "H u S"
+               :help "The sample variance, sum((values - mean)^2)/(N-1)"]
+              ["population sdev(1:)" 
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-pop-sdev))
+               :keys "I u S"
+               :help "The population sdev, sqrt[sum((values - mean)^2)/N]"]
+              ["population variance(1:)" 
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-pop-variance))
+               :keys "H I u S"
+               :help "The population variance, sum((values - mean)^2)/N"]
+              ["median(1:)"
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-median))
+               :keys "H u M"
+               :help "The median of the data values"]
+              ["harmonic mean(1:)"
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-harmonic-mean))
+               :keys "H I u M"]
+              ["geometric mean(1:)"
+               (progn
+                 (require 'calc-stat)
+                 (call-interactively 'calc-vector-geometric-mean))
+               :keys "u G"]
+              ["arithmetic-geometric mean(1:)"
+               (progn
+                 (require 'calc-stat)
+                 (let ((calc-hyperbolic-flag t))
+                   (call-interactively 'calc-vector-geometric-mean)))
+               :keys "H u G"]
+               ["RMS(1:)"
+                (progn (require 'calc-arith)
+                       (call-interactively 'calc-abs))
+                :keys "A"
+                :help "The root-mean-square, or quadratic mean"])
+        ["Abbreviate long vectors"
+         (progn
+           (require 'calc-mode)
+           (call-interactively 'calc-full-vectors))
+         :keys "v ."
+         :style toggle
+         :selected (not calc-full-vectors)]
+        "----"
+        ["Help on Matrices/Vectors"
+         (calc-info-goto-node "Matrix Functions")])
+  "Menu for Calc's vector and matrix functions.")
+
+(defvar calc-units-menu
+  (list "Units"
+        ["Convert units in (1:)" 
+         (progn
+           (require 'calc-units)
+           (call-interactively 'calc-convert-units ))
+         :keys "u c"]
+        ["Convert temperature in (1:)" 
+         (progn
+           (require 'calc-units)
+           (call-interactively 'calc-convert-temperature))
+         :keys "u t"]
+        ["Simplify units in (1:)" 
+         (progn
+           (require 'calc-units)
+           (call-interactively 'calc-simplify-units))
+         :keys "u s"]
+        ["View units table" 
+         (progn
+           (require 'calc-units)
+           (call-interactively 'calc-view-units-table))
+         :keys "u V"]
+        "----"
+        ["Help on Units"
+         (calc-info-goto-node "Units")])
+  "Menu for Calc's units functions.")
+
+(defvar calc-variables-menu
+  (list "Variables"
+        ["Store (1:) into a variable" 
+         (progn
+           (require 'calc-store)
+           (call-interactively 'calc-store))
+         :keys "s s"]
+        ["Recall a variable value" 
+          (progn
+            (require 'calc-store)
+            (call-interactively 'calc-recall ))
+         :keys "s r"]
+        ["Edit the value of a variable" 
+         (progn
+           (require 'calc-store)
+           (call-interactively 'calc-edit-variable))
+         :keys "s e"]
+        ["Exchange (1:) with a variable value" 
+         (progn
+           (require 'calc-store)
+           (call-interactively 'calc-store-exchange))
+         :keys "s x"]
+        ["Clear variable value" 
+         (progn
+           (require 'calc-store)
+           (call-interactively 'calc-unstore))
+         :keys "s u"]
+        ["Evaluate variables in (1:)" 
+         (progn
+           (require 'calc-ext)
+           (call-interactively 'calc-evaluate))
+         :keys "="]
+        ["Evaluate (1:), assigning a value to a variable" 
+         (progn
+           (require 'calc-store)
+           (call-interactively 'calc-let))
+         :keys "s l"
+         :help "Evaluate (1:) under a temporary assignment of a variable"]
+        "----"
+        ["Help on Variables"
+         (calc-info-goto-node "Store and Recall")])
+  "Menu for Calc's variables.")
+
+(defvar calc-stack-menu
+  (list "Stack"
+        ["Remove (1:)" 
+         calc-pop 
+         :keys "DEL"]
+        ["Switch (1:) and (2:)" 
+         calc-roll-down 
+         :keys "TAB"]
+        ["Duplicate (1:)" 
+         calc-enter 
+         :keys "RET"]
+        ["Edit (1:)" 
+         (progn
+           (require 'calc-yank)
+           (call-interactively calc-edit))
+         :keys "`"]
+        "----"
+        ["Help on Stack"
+         (calc-info-goto-node "Stack and Trail")])
+  "Menu for Calc's stack functions.")
+
+(defvar calc-errors-menu
+  (list "Undo"
+        ["Undo" 
+         (progn
+           (require 'calc-undo)
+           (call-interactively 'calc-undo))
+         :keys "U"]
+        ["Redo" 
+         (progn
+           (require 'calc-undo)
+           (call-interactively 'calc-redo))
+         :keys "D"]
+        "----"
+        ["Help on Undo"
+         (progn
+           (calc-info-goto-node "Introduction")
+           (Info-goto-node "Undo"))]))
+
+(defvar calc-modes-menu
+  (list "Modes"
+        ["Precision" 
+         (progn
+           (require 'calc-ext)
+           (call-interactively 'calc-precision))
+         :keys "p"
+         :help "Set the precision for floating point calculations"]
+        ["Fraction mode"
+         (progn
+           (require 'calc-frac)
+           (call-interactively 'calc-frac-mode))
+         :keys "m f"
+         :style toggle
+         :selected calc-prefer-frac
+         :help "Leave integer quotients as fractions"]
+        ["Symbolic mode"
+         (lambda ()
+           (interactive)
+           (require 'calc-mode)
+           (calc-symbolic-mode nil))
+         :keys "m s"
+         :style toggle
+         :selected calc-symbolic-mode
+         :help "Leave functions producing inexact answers in symbolic form"]
+        ["Infinite mode"
+         (lambda ()
+           (interactive)
+           (require 'calc-mode)
+           (calc-infinite-mode nil))
+         :keys "m i"
+         :style toggle
+         :selected calc-infinite-mode
+         :help "Let expressions like 1/0 produce infinite results"]
+        ["Abbreviate long vectors"
+         (progn
+           (require 'calc-mode)
+           (call-interactively 'calc-full-vectors))
+         :keys "v ."
+         :style toggle
+         :selected (not calc-full-vectors)]
+        (list "Angle Measure"
+              ["Radians"
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-radians-mode))
+               :keys "m r"
+               :style radio
+               :selected (eq calc-angle-mode 'rad)]
+              ["Degrees"
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-degrees-mode))
+               :keys "m d"
+               :style radio
+               :selected (eq calc-angle-mode 'deg)]
+              ["HMS"
+               (progn
+                 (require 'calc-math)
+                 (call-interactively 'calc-hms-mode))
+               :keys "m h"
+               :style radio
+               :selected (eq calc-angle-mode 'hms)])
+        (list "Radix"
+              ["Decimal"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-decimal-radix))
+               :keys "d 0"
+               :style radio
+               :selected (= calc-number-radix 10)]
+              ["Binary"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-binary-radix))
+               :keys "d 2"
+               :style radio
+               :selected (= calc-number-radix 2)]
+              ["Octal"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-octal-radix))
+               :keys "d 8"
+               :style radio
+               :selected (= calc-number-radix 8)]
+              ["Hexadecimal"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-hex-radix))
+               :keys "d 6"
+               :style radio
+               :selected (= calc-number-radix 16)]
+              ["Other"
+               (progn
+                 (require 'calc-bin)
+                 (call-interactively 'calc-radix))
+               :keys "d r"
+               :style radio
+               :selected (not
+                          (or
+                           (= calc-number-radix 10)
+                           (= calc-number-radix 2)
+                           (= calc-number-radix 8)
+                           (= calc-number-radix 16)))])
+        (list "Float Format"
+              ["Normal"
+               (progn
+                 (require 'calc-mode)
+                 (call-interactively 'calc-normal-notation))
+               :keys "d n"
+               :style radio
+               :selected (eq (car-safe calc-float-format) 'float)]
+              ["Fixed point"
+               (progn
+                 (require 'calc-mode)
+                 (call-interactively 'calc-fix-notation))
+               :keys "d f"
+               :style radio
+               :selected (eq (car-safe calc-float-format) 'fix)]
+              ["Scientific notation"
+               (progn
+                 (require 'calc-mode)
+                 (call-interactively 'calc-sci-notation))
+               :keys "d s"
+               :style radio
+               :selected (eq (car-safe calc-float-format) 'sci)]
+              ["Engineering notation"
+               (progn
+                 (require 'calc-mode)
+                 (call-interactively 'calc-eng-notation))
+               :keys "d e"
+               :style radio
+               :selected (eq (car-safe calc-float-format) 'eng)])
+        (list "Algebraic"
+              ["Normal"
+               (progn
+                 (require 'calc-mode)
+                 (cond
+                  (calc-incomplete-algebraic-mode
+                   (calc-algebraic-mode t))
+                  (calc-algebraic-mode
+                   (calc-algebraic-mode nil))))
+               :style radio
+               :selected (not calc-algebraic-mode)]
+              ["Algebraic mode"
+               (progn
+                 (require 'calc-mode)
+                 (if (or
+                      calc-incomplete-algebraic-mode
+                      (not calc-algebraic-mode))
+                     (calc-algebraic-mode nil)))
+               :keys "m a"
+               :style radio
+               :selected (and calc-algebraic-mode
+                              (not calc-incomplete-algebraic-mode))
+               :help "Keys which start numeric entry also start algebraic entry"]
+              ["Incomplete algebraic mode"
+               (progn
+                 (require 'calc-mode)
+                 (unless calc-incomplete-algebraic-mode
+                   (calc-algebraic-mode t)))
+               :keys "C-u m a"
+               :style radio
+               :selected calc-incomplete-algebraic-mode
+               :help "Only ( and [ begin algebraic entry"]
+              ["Total algebraic mode"
+               (progn
+                 (require 'calc-mode)
+                 (unless (eq calc-algebraic-mode 'total)
+                   (calc-total-algebraic-mode nil)))
+               :keys "m t"
+               :style radio
+               :selected (eq calc-algebraic-mode 'total)
+               :help "All regular letters and punctuation begin algebraic entry"])
+        (list "Language"
+              ["Normal"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-normal-language))
+               :keys "d N"
+               :style radio
+               :selected (eq calc-language nil)]
+              ["Big"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-big-language))
+               :keys "d B"
+               :style radio
+               :selected (eq calc-language 'big)
+               :help "Use textual approximations to various mathematical notations"]
+              ["Flat"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-flat-language))
+               :keys "d O"
+               :style radio
+               :selected (eq calc-language 'flat)
+               :help "Write matrices on a single line"]
+              ["C"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-c-language))
+               :keys "d C"
+               :style radio
+               :selected (eq calc-language 'c)]
+              ["Pascal"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-pascal-language))
+               :keys "d P"
+               :style radio
+               :selected (eq calc-language 'pascal)]
+              ["Fortran"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-fortran-language))
+               :keys "d F"
+               :style radio
+               :selected (eq calc-language 'fortran)]
+              ["TeX"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-tex-language))
+               :keys "d T"
+               :style radio
+               :selected (eq calc-language 'tex)]
+              ["LaTeX"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-latex-language))
+               :keys "d L"
+               :style radio
+               :selected (eq calc-language 'latex)]
+              ["Eqn"
+               (progn
+                 (require 'calc-lang)
+                 (call-interactively 'calc-eqn-language))
+               :keys "d E"
+               :style radio
+               :selected (eq calc-language 'eqn)])
+        "----"
+        ["Save mode settings" calc-save-modes :keys "m m"]
+        "----"
+        ["Help on Modes"
+         (calc-info-goto-node "Mode settings")])
+  "Menu for Calc's mode settings.")
+
+(defvar  calc-help-menu
+  (list "Help"
+        ["Manual"   
+         calc-info
+         :keys "h i"]
+        ["Tutorial" 
+         calc-tutorial 
+         :keys "h t"]
+        ["Summary"  
+         calc-info-summary 
+         :keys "h s"]
+        "----"
+        ["Help on Help" 
+         (progn
+           (calc-info-goto-node "Introduction")
+           (Info-goto-node "Help Commands"))])
+  "Menu for Calc's help functions.")
+
+(defvar calc-mode-map)
+
+(easy-menu-define
+  calc-menu
+  calc-mode-map
+  "Menu for Calc."
+  (list "Calc"
+        :visible '(eq major-mode 'calc-mode)
+        calc-arithmetic-menu
+        calc-scientific-function-menu
+        calc-algebra-menu
+        calc-graphics-menu
+        calc-vectors-menu
+        calc-units-menu
+        calc-variables-menu
+        calc-stack-menu
+        calc-errors-menu
+        calc-modes-menu
+        calc-help-menu
+        ["Reset"  
+         (progn
+           (require 'calc-ext)
+           (call-interactively 'calc-reset))
+         :help "Reset Calc to its initial state"]
+        ["Quit" calc-quit]))
+
+(provide 'calc-menu)
+
+;; arch-tag: 9612c86a-cd4f-4baa-ab0b-40af7344d21f
index b660e046a21578c9690fa65eca588f549eae0bb8..f63e0fa42f9e9cec908da91d4044d6c944c482b3 100644 (file)
 (require 'calc)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function calc-do-keypad "calc-keypd" (&optional full-display interactive))
+(declare-function calc-inv-hyp-prefix-help "calc-help" ())
+(declare-function calc-inverse-prefix-help "calc-help" ())
+(declare-function calc-hyperbolic-prefix-help "calc-help" ())
+(declare-function calc-explain-why "calc-stuff" (why &optional more))
+(declare-function calc-clear-command-flag "calc-ext" (f))
+(declare-function calc-roll-down-with-selections "calc-sel" (n m))
+(declare-function calc-roll-up-with-selections "calc-sel" (n m))
+(declare-function calc-last-args "calc-undo" (n))
+(declare-function calc-is-inverse "calc-ext" ())
+(declare-function calc-do-prefix-help "calc-ext" (msgs group key))
+(declare-function math-objvecp "calc-ext" (a))
+(declare-function math-known-scalarp "calc-arith" (a &optional assume-scalar))
+(declare-function math-vectorp "calc-ext" (a))
+(declare-function math-matrixp "calc-ext" (a))
+(declare-function math-trunc-special "calc-arith" (a prec))
+(declare-function math-trunc-fancy "calc-arith" (a))
+(declare-function math-floor-special "calc-arith" (a prec))
+(declare-function math-floor-fancy "calc-arith" (a))
+(declare-function math-square-matrixp "calc-ext" (a))
+(declare-function math-matrix-inv-raw "calc-mtx" (m))
+(declare-function math-known-matrixp "calc-arith" (a))
+(declare-function math-mod-fancy "calc-arith" (a b))
+(declare-function math-pow-of-zero "calc-arith" (a b))
+(declare-function math-pow-zero "calc-arith" (a b))
+(declare-function math-pow-fancy "calc-arith" (a b))
+
+
 (defun calc-dispatch-help (arg)
   "C-x* is a prefix key sequence; follow it with one of these letters:
 
index 3d6fafc844a892e9817bcc2099ba8a8d989ccce7..d7daf1bf997b84b35a1ff2c89bec3e5550a6b951 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function calc-embedded-save-original-modes "calc-embed" ())
+
+
 (defun calc-line-numbering (n)
   (interactive "P")
   (calc-wrapper
index 489599781f65baecc849978d4d8c6ae3f7dc809d..4019058a56731ee23bfed9cef1c0c909ea9848f9 100644 (file)
 ;;; Code:
 
 (require 'calc-arith)
+(require 'calcalg3)
+
+;; Declare functions which are defined elsewhere.
+(declare-function calc-get-fit-variables "calcalg3" (nv nc &optional defv defc with-y homog))
+(declare-function math-map-binop "calcalg3" (binop args1 args2))
 
 (defun math-nlfit-least-squares (xdata ydata &optional sdata sigmas)
   "Return the parameters A and B for the best least squares fit y=a+bx."
 ;;; the maximum value of q.
 
 (defun math-nlfit-find-qmax (qdata pdata tdata)
-  (let* ((ratios (mapcar* 'math-div pdata qdata))
+  (let* ((ratios (math-map-binop 'math-div pdata qdata))
          (lsdata (math-nlfit-least-squares ratios tdata))
          (qmax (math-max-list (car qdata) (cdr qdata)))
          (a (math-neg (math-div (nth 1 lsdata) (nth 0 lsdata)))))
         (mat nil)
         (k 0))
     (while (< k i)
-      (setq mat (cons (copy-list row) mat))
+      (setq mat (cons (copy-sequence row) mat))
       (setq k (1+ k)))
     mat))
 
           (let* ((Ctilda (math-nlfit-make-Ctilda C lambda))
                  (dtilda (math-nlfit-make-dtilda d (length (car C))))
                  (zeta (math-nlfit-givens Ctilda dtilda))
-                 (newparms (mapcar* 'math-add (copy-tree parms) zeta))
+                 (newparms (math-map-binop 'math-add (copy-tree parms) zeta))
                  (newchisq (math-nlfit-chi-sq xlist ylist newparms fn slist)))
             (if (math-lessp newchisq chisq)
                 (progn
                (nth 0 sigmacovar)))
           (finalparms 
            (if sigmas
-               (mapcar* (lambda (x y) (list 'sdev x y)) finalparms sigmas)
+               (math-map-binop 
+                (lambda (x y) (list 'sdev x y)) finalparms sigmas)
              finalparms))
           (soln (funcall solnexpr finalparms var)))
      (let ((calc-fit-to-trail t)
                      (mapcar (lambda (x) (math-get-sdev x t)) pdata)
                    nil))
           (pdata (mapcar (lambda (x) (math-get-value x)) pdata))
-          (poverqdata (mapcar* 'math-div pdata qdata))
+          (poverqdata (math-map-binop 'math-div pdata qdata))
           (parmvals (math-nlfit-least-squares qdata poverqdata sdata sdevv))
           (finalparms (list (nth 0 parmvals)
                             (math-neg
index 4ceeeba3b4271e3b78def74468eb77b80e1936d3..87adf48006dfb52767a88ae7e1d945c34dd1cff6 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function edmacro-format-keys "edmacro" (macro &optional verbose))
+(declare-function edmacro-parse-keys "edmacro" (string &optional need-vector))
+(declare-function math-read-expr-level "calc-aent" (exp-prec &optional exp-term))
+
 
 (defun calc-equal-to (arg)
   (interactive "P")
index e4b3e1e5bbc0ee5a969f01d7dedb26483a277e13..e224e1ca6f58a3cd683212c4e4333e477285997c 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function math-read-expr-level "calc-aent" (exp-prec &optional exp-term))
+
+
 (defun calc-display-strings (n)
   (interactive "P")
   (calc-wrapper
index 5cfccb4f8dbfc2ce5e95a3253c3651daea8c1d23..69cacec2220832e885f21603851b4ce74e2dd95d 100644 (file)
 
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function calc-set-language "calc-lang" (lang &optional option no-refresh))
+(declare-function calc-edit-finish "calc-yank" (&optional keep))
+(declare-function calc-edit-cancel "calc-yank" ())
+(declare-function calc-do-quick-calc "calc-aent" ())
+(declare-function calc-do-calc-eval "calc-aent" (str separator args))
+(declare-function calc-do-keypad "calc-keypd" (&optional full-display interactive))
+(declare-function calcFunc-unixtime "calc-forms" (date &optional zone))
+(declare-function math-parse-date "calc-forms" (math-pd-str))
+(declare-function math-lessp "calc-ext" (a b))
+(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" ())
+(declare-function calc-push-list-in-macro "calc-prog" (vals m sels))
+(declare-function calc-replace-selections "calc-sel" (n vals m))
+(declare-function calc-record-list "calc-misc" (vals &optional prefix))
+(declare-function calc-normalize-fancy "calc-ext" (val))
+(declare-function calc-do-handle-whys "calc-misc" ())
+(declare-function calc-top-selected "calc-sel" (&optional n m))
+(declare-function calc-sel-error "calc-sel" ())
+(declare-function calc-pop-stack-in-macro "calc-prog" (n mm))
+(declare-function calc-embedded-stack-change "calc-embed" ())
+(declare-function calc-refresh-evaltos "calc-ext" (&optional which-var))
+(declare-function calc-do-refresh "calc-misc" ())
+(declare-function calc-binary-op-fancy "calc-ext" (name func arg ident unary))
+(declare-function calc-unary-op-fancy "calc-ext" (name func arg))
+(declare-function calc-delete-selection "calc-sel" (n))
+(declare-function calc-alg-digit-entry "calc-aent" ())
+(declare-function calc-alg-entry "calc-aent" (&optional initial prompt))
+(declare-function calc-dots "calc-incom" ())
+(declare-function calc-temp-minibuffer-message "calc-misc" (m))
+(declare-function math-read-radix-digit "calc-misc" (dig))
+(declare-function calc-digit-dots "calc-incom" ())
+(declare-function math-normalize-fancy "calc-ext" (a))
+(declare-function math-normalize-nonstandard "calc-ext" ())
+(declare-function math-recompile-eval-rules "calc-alg" ())
+(declare-function math-apply-rewrites "calc-rewr" (expr rules &optional heads math-apply-rw-ruleset))
+(declare-function calc-record-why "calc-misc" (&rest stuff))
+(declare-function math-dimension-error "calc-vec" ())
+(declare-function calc-incomplete-error "calc-incom" (a))
+(declare-function math-float-fancy "calc-arith" (a))
+(declare-function math-neg-fancy "calc-arith" (a))
+(declare-function math-zerop "calc-misc" (a))
+(declare-function calc-add-fractions "calc-frac" (a b))
+(declare-function math-add-objects-fancy "calc-arith" (a b))
+(declare-function math-add-symb-fancy "calc-arith" (a b))
+(declare-function math-mul-zero "calc-arith" (a b))
+(declare-function calc-mul-fractions "calc-frac" (a b))
+(declare-function math-mul-objects-fancy "calc-arith" (a b))
+(declare-function math-mul-symb-fancy "calc-arith" (a b))
+(declare-function math-reject-arg "calc-misc" (&optional a p option))
+(declare-function math-div-by-zero "calc-arith" (a b))
+(declare-function math-div-zero "calc-arith" (a b))
+(declare-function math-make-frac "calc-frac" (num den))
+(declare-function calc-div-fractions "calc-frac" (a b))
+(declare-function math-div-objects-fancy "calc-arith" (a b))
+(declare-function math-div-symb-fancy "calc-arith" (a b))
+(declare-function math-compose-expr "calccomp" (a prec))
+(declare-function math-comp-width "calccomp" (c))
+(declare-function math-composition-to-string "calccomp" (c &optional width))
+(declare-function math-stack-value-offset-fancy "calccomp" ())
+(declare-function math-format-flat-expr-fancy "calc-ext" (a prec))
+(declare-function math-adjust-fraction "calc-ext" (a))
+(declare-function math-format-binary "calc-bin" (a))
+(declare-function math-format-radix "calc-bin" (a))
+(declare-function math-group-float "calc-ext" (str))
+(declare-function math-mod "calc-misc" (a b))
+(declare-function math-format-number-fancy "calc-ext" (a prec))
+(declare-function math-format-bignum-fancy "calc-ext" (a))
+(declare-function math-read-number-fancy "calc-ext" (s))
+(declare-function calc-do-grab-region "calc-yank" (top bot arg))
+(declare-function calc-do-grab-rectangle "calc-yank" (top bot arg &optional reduce))
+(declare-function calc-do-embedded "calc-embed" (calc-embed-arg end obeg oend))
+(declare-function calc-do-embedded-activate "calc-embed" (calc-embed-arg cbuf))
+(declare-function math-do-defmath "calc-prog" (func args body))
+(declare-function calc-load-everything "calc-ext" ())
+
+
 (defgroup calc nil
   "GNU Calc."
   :prefix "calc-"
@@ -889,6 +967,16 @@ If nil, selections displayed but ignored.")
   "Function through which to pass strings before parsing.")
 (defvar calc-radix-formatter nil
   "Formatting function used for non-decimal numbers.")
+(defvar calc-lang-slash-idiv nil
+  "A list of languages in which / might represent integer division.")
+(defvar calc-lang-allow-underscores nil
+  "A list of languages which allow underscores in variable names.")
+(defvar calc-lang-c-type-hex nil
+  "Languages in which octal and hex numbers are written with leading 0 and 0x,")
+(defvar calc-lang-brackets-are-subscripts nil
+  "Languages in which subscripts are indicated by brackets.")
+(defvar calc-lang-parens-are-subscripts nil
+  "Languages in which subscripts are indicated by parentheses.")
 
 (defvar calc-last-kill nil)            ; Last number killed in calc-mode.
 (defvar calc-dollar-values nil)                ; Values to be used for '$'.
@@ -911,7 +999,6 @@ If nil, selections displayed but ignored.")
 (defvar math-eval-rules-cache-tag t)
 (defvar math-radix-explicit-format t)
 (defvar math-expr-function-mapping nil)
-(defvar math-expr-special-function-mapping nil)
 (defvar math-expr-variable-mapping nil)
 (defvar math-read-expr-quotes nil)
 (defvar math-working-step nil)
@@ -1009,6 +1096,7 @@ If nil, selections displayed but ignored.")
       (if calc-scan-for-dels
          (append (where-is-internal 'delete-backward-char global-map)
                  (where-is-internal 'backward-delete-char global-map)
+                 (where-is-internal 'backward-delete-char-untabify global-map)
                  '("\C-d"))
        '("\177" "\C-d")))
 
@@ -1221,6 +1309,7 @@ Notations:  3.14e6     3.14 * 10^6
           (string-match "full" (nth 1 p))
           (setq calc-standalone-flag t))
       (setq p (cdr p))))
+  (require 'calc-menu)
   (run-mode-hooks 'calc-mode-hook)
   (calc-refresh t)
   (calc-set-mode-line)
@@ -3497,34 +3586,6 @@ and all digits are kept, regardless of Calc's current precision."
            (math-read-bignum (substring s 0 (- math-bignum-digit-length))))
     (list (string-to-number s))))
 
-
-(defconst math-tex-ignore-words
-  '( ("\\hbox") ("\\mbox") ("\\text") ("\\left") ("\\right")
-     ("\\,") ("\\>") ("\\:") ("\\;") ("\\!") ("\\ ")
-     ("\\quad") ("\\qquad") ("\\hfil") ("\\hfill")
-     ("\\displaystyle") ("\\textstyle") ("\\dsize") ("\\tsize")
-     ("\\scriptstyle") ("\\scriptscriptstyle") ("\\ssize") ("\\sssize")
-     ("\\rm") ("\\bf") ("\\it") ("\\sl")
-     ("\\roman") ("\\bold") ("\\italic") ("\\slanted")
-     ("\\cal") ("\\mit") ("\\Cal") ("\\Bbb") ("\\frak") ("\\goth")
-     ("\\evalto")
-     ("\\matrix" mat) ("\\bmatrix" mat) ("\\pmatrix" mat)
-     ("\\begin" begenv)
-     ("\\cr" punc ";") ("\\\\" punc ";") ("\\*" punc "*")
-     ("\\{" punc "[") ("\\}" punc "]")))
-
-(defconst math-latex-ignore-words
-  (append math-tex-ignore-words
-          '(("\\begin" begenv))))
-
-(defconst math-eqn-ignore-words
-  '( ("roman") ("bold") ("italic") ("mark") ("lineup") ("evalto")
-     ("left" ("floor") ("ceil"))
-     ("right" ("floor") ("ceil"))
-     ("arc" ("sin") ("cos") ("tan") ("sinh") ("cosh") ("tanh"))
-     ("size" n) ("font" n) ("fwd" n) ("back" n) ("up" n) ("down" n)
-     ("above" punc ",")))
-
 (defconst math-standard-opers
   '( ( "_"     calcFunc-subscr 1200 1201 )
      ( "%"     calcFunc-percent 1100 -1 )
index 5aa410be19e675cd0595f50bbc346072c3ead80a..374b0487cfefe9690f170567fb0ecf22fd378899 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function calc-fit-s-shaped-logistic-curve "calc-nlfit" (arg))
+(declare-function calc-fit-bell-shaped-logistic-curve "calc-nlfit" (arg))
+(declare-function calc-fit-hubbert-linear-curve "calc-nlfit" (&optional sdv))
+(declare-function calc-graph-add-curve "calc-graph" (xdata ydata &optional zdata))
+(declare-function calc-graph-lookup "calc-graph" (thing))
+(declare-function calc-graph-set-styles "calc-graph" (lines points &optional yerr))
+(declare-function math-min-list "calc-arith" (a b))
+(declare-function math-max-list "calc-arith" (a b))
+
+
+(defun math-map-binop (binop args1 args2)
+  "Apply BINOP to the elements of the lists ARGS1 and ARGS2"
+  (if args1
+      (cons
+       (funcall binop (car args1) (car args2))
+       (funcall 'math-map-binop binop (cdr args1) (cdr args2)))))
+
 (defun calc-find-root (var)
   (interactive "sVariable(s) to solve for: ")
   (calc-slow-wrapper
                               (nth 1 plot)
                               (cons
                                'vec
-                               (mapcar* 'calcFunc-div
-                                        (cdr (nth 2 plot))
-                                        (cdr (nth 1 plot)))))))
+                               (math-map-binop 'calcFunc-div
+                                               (cdr (nth 2 plot))
+                                               (cdr (nth 1 plot)))))))
               (calc-fit-hubbert-linear-curve func))
             ((memq key '(?e ?E))
              (calc-get-fit-variables calc-curve-nvars 
index 6bd663cef5b8e1ae2d8e4f2862eea1e94bc6db8c..dd59b36688176f293570c36296481c34655b61a7 100644 (file)
 (require 'calc-ext)
 (require 'calc-macs)
 
-(defconst math-eqn-special-funcs
-  '( calcFunc-log
-     calcFunc-ln calcFunc-exp
-     calcFunc-sin calcFunc-cos calcFunc-tan
-     calcFunc-sec calcFunc-csc calcFunc-cot
-     calcFunc-sinh calcFunc-cosh calcFunc-tanh
-     calcFunc-sech calcFunc-csch calcFunc-coth
-     calcFunc-arcsin calcFunc-arccos calcFunc-arctan
-     calcFunc-arcsinh calcFunc-arccosh calcFunc-arctanh))
-
 ;;; A "composition" has one of the following forms:
 ;;;
 ;;;    "string"              A literal string
 (defvar math-comp-right-bracket)
 (defvar math-comp-comma)
 
+(defun math-compose-var (a)
+  (let (v)
+    (if (and math-compose-hash-args
+             (let ((p calc-arg-values))
+               (setq v 1)
+               (while (and p (not (equal (car p) a)))
+                 (setq p (and (eq math-compose-hash-args t) (cdr p))
+                       v (1+ v)))
+               p))
+        (if (eq math-compose-hash-args 1)
+            "#"
+          (format "#%d" v))
+      (if (memq calc-language calc-lang-allow-underscores)
+          (math-to-underscores (symbol-name (nth 1 a)))
+        (symbol-name (nth 1 a))))))
 
 (defun math-compose-expr (a prec)
   (let ((math-compose-level (1+ math-compose-level))
        (list 'tag a (math-compose-expr a prec))))
      ((and (not (consp a)) (not (integerp a)))
       (concat "'" (prin1-to-string a)))
-     ((setq spfn (assq (car-safe a) math-expr-special-function-mapping))
+     ((setq spfn (assq (car-safe a) 
+                       (get calc-language 'math-special-function-table)))
       (setq spfn (cdr spfn))
-      (funcall (car spfn) a spfn))
+      (if (consp spfn)
+          (funcall (car spfn) a spfn)
+        (funcall spfn a)))
      ((math-scalarp a)
       (if (or (eq (car-safe a) 'frac)
              (and (nth 1 calc-frac-format) (Math-integerp a)))
-         (if (memq calc-language '(tex latex eqn math maple c fortran pascal))
+         (if (and
+               calc-language
+               (not (memq calc-language 
+                          '(flat big unform))))
              (let ((aa (math-adjust-fraction a))
                    (calc-frac-format nil))
                (math-compose-expr (list '/
-                                        (if (memq calc-language '(c fortran))
+                                        (if (memq calc-language 
+                                                   calc-lang-slash-idiv)
                                             (math-float (nth 1 aa))
                                           (nth 1 aa))
                                         (nth 2 aa)) prec))
                                            (cdr a)
                                            (if full rows 3) t)))))
              (if (or calc-full-vectors (< (length a) 7))
-                 (if (and (eq calc-language 'tex)
-                          (math-matrixp a))
-                      (if (and (integerp calc-language-option)
-                               (or (= calc-language-option 0)
-                                   (> calc-language-option 1)
-                                   (< calc-language-option -1)))
-                          (append '(vleft 0 "\\matrix{")
-                                  (math-compose-tex-matrix (cdr a))
-                                  '("}"))
-                        (append '(horiz "\\matrix{ ")
-                                (math-compose-tex-matrix (cdr a))
-                                '(" }")))
-                    (if (and (eq calc-language 'latex)
-                             (math-matrixp a))
-                        (if (and (integerp calc-language-option)
-                                 (or (= calc-language-option 0)
-                                     (> calc-language-option 1)
-                                     (< calc-language-option -1)))
-                            (append '(vleft 0 "\\begin{pmatrix}")
-                                    (math-compose-tex-matrix (cdr a) t)
-                                    '("\\end{pmatrix}"))
-                          (append '(horiz "\\begin{pmatrix} ")
-                                  (math-compose-tex-matrix (cdr a) t)
-                                  '(" \\end{pmatrix}")))
-                      (if (and (eq calc-language 'eqn)
-                               (math-matrixp a))
-                          (append '(horiz "matrix { ")
-                                  (math-compose-eqn-matrix
-                                   (cdr (math-transpose a)))
-                                  '("}"))
-                        (if (and (eq calc-language 'maple)
-                                 (math-matrixp a))
-                            (list 'horiz
-                                  "matrix("
-                                  math-comp-left-bracket
-                                  (math-compose-vector (cdr a) 
-                                                       (concat math-comp-comma " ")
-                                                       math-comp-vector-prec)
-                                  math-comp-right-bracket
-                                  ")")
-                          (list 'horiz
-                                math-comp-left-bracket
-                                (math-compose-vector (cdr a) 
-                                                     (concat math-comp-comma " ")
-                                                     math-comp-vector-prec)
-                                math-comp-right-bracket)))))
+                  (if (and 
+                       (setq spfn (get calc-language 'math-matrix-formatter))
+                       (math-matrixp a))
+                      (funcall spfn a)
+                    (list 'horiz
+                          math-comp-left-bracket
+                          (math-compose-vector (cdr a) 
+                                               (concat math-comp-comma " ")
+                                               math-comp-vector-prec)
+                          math-comp-right-bracket))
                (list 'horiz
                      math-comp-left-bracket
                      (math-compose-vector (list (nth 1 a) (nth 2 a) (nth 3 a))
                                           (concat math-comp-comma " ") 
                                            math-comp-vector-prec)
-                     math-comp-comma (if (memq calc-language '(tex latex)) 
-                                          " \\ldots" " ...")
+                     math-comp-comma 
+                      (if (setq spfn (get calc-language 'math-dots))
+                          (concat " " spfn)
+                        " ...")
                      math-comp-comma " "
                      (list 'break math-compose-level)
                      (math-compose-expr (nth (1- (length a)) a)
       (let ((v (rassq (nth 2 a) math-expr-variable-mapping)))
        (if v
            (symbol-name (car v))
-         (if (and (memq calc-language '(tex latex))
-                  calc-language-option
-                  (not (= calc-language-option 0))
-                  (string-match "\\`[a-zA-Z][a-zA-Z0-9]+\\'"
-                                (symbol-name (nth 1 a))))
-              (if (eq calc-language 'latex)
-                  (format "\\text{%s}" (symbol-name (nth 1 a)))
-                (format "\\hbox{%s}" (symbol-name (nth 1 a))))
-           (if (and math-compose-hash-args
-                    (let ((p calc-arg-values))
-                      (setq v 1)
-                      (while (and p (not (equal (car p) a)))
-                        (setq p (and (eq math-compose-hash-args t) (cdr p))
-                              v (1+ v)))
-                      p))
-               (if (eq math-compose-hash-args 1)
-                   "#"
-                 (format "#%d" v))
-             (if (memq calc-language '(c fortran pascal maple))
-                 (math-to-underscores (symbol-name (nth 1 a)))
-               (if (and (eq calc-language 'eqn)
-                        (string-match ".'\\'" (symbol-name (nth 2 a))))
-                   (math-compose-expr
-                    (list 'calcFunc-Prime
-                          (list
-                           'var
-                           (intern (substring (symbol-name (nth 1 a)) 0 -1))
-                           (intern (substring (symbol-name (nth 2 a)) 0 -1))))
-                    prec)
-                 (symbol-name (nth 1 a)))))))))
+          (if (setq spfn (get calc-language 'math-var-formatter))
+              (funcall spfn a prec)
+            (math-compose-var a)))))
      ((eq (car a) 'intv)
       (list 'horiz
-           (if (eq calc-language 'maple) ""
-             (if (memq (nth 1 a) '(0 1)) "(" "["))
+            (if (memq (nth 1 a) '(0 1)) "(" "[")
            (math-compose-expr (nth 2 a) 0)
-           (if (memq calc-language '(tex latex)) " \\ldots "
-             (if (eq calc-language 'eqn) " ... " " .. "))
+            " .. "
            (math-compose-expr (nth 3 a) 0)
-           (if (eq calc-language 'maple) ""
-             (if (memq (nth 1 a) '(0 2)) ")" "]"))))
+            (if (memq (nth 1 a) '(0 2)) ")" "]")))
      ((eq (car a) 'date)
       (if (eq (car calc-date-format) 'X)
          (math-format-date a)
        (concat "<" (math-format-date a) ">")))
-     ((and (eq (car a) 'calcFunc-subscr) (cdr (cdr a))
-          (memq calc-language '(c pascal fortran maple)))
-      (let ((args (cdr (cdr a))))
-       (while (and (memq calc-language '(pascal fortran))
-                   (eq (car-safe (nth 1 a)) 'calcFunc-subscr))
-         (setq args (append (cdr (cdr (nth 1 a))) args)
-               a (nth 1 a)))
-       (list 'horiz
-             (math-compose-expr (nth 1 a) 1000)
-             (if (eq calc-language 'fortran) "(" "[")
-             (math-compose-vector args ", " 0)
-             (if (eq calc-language 'fortran) ")" "]"))))
+     ((and (eq (car a) 'calcFunc-subscr)
+           (setq spfn (get calc-language 'math-compose-subscr)))
+      (funcall spfn a))
      ((and (eq (car a) 'calcFunc-subscr) (= (length a) 3)
           (eq calc-language 'big))
       (let* ((a1 (math-compose-expr (nth 1 a) 1000))
                        ", "
                        a2))
          (list 'subscr a1 a2))))
-     ((and (eq (car a) 'calcFunc-subscr) (= (length a) 3)
-          (eq calc-language 'math))
-      (list 'horiz
-           (math-compose-expr (nth 1 a) 1000)
-           "[["
-           (math-compose-expr (nth 2 a) 0)
-           "]]"))
-     ((and (eq (car a) 'calcFunc-sqrt)
-          (memq calc-language '(tex latex)))
-      (list 'horiz
-           "\\sqrt{"
-           (math-compose-expr (nth 1 a) 0)
-           "}"))
-     ((and nil (eq (car a) 'calcFunc-sqrt)
-          (eq calc-language 'eqn))
-      (list 'horiz
-           "sqrt {"
-           (math-compose-expr (nth 1 a) -1)
-           "}"))
      ((and (eq (car a) '^)
           (eq calc-language 'big))
       (list 'supscr
        (list 'vcent
              (math-comp-height a1)
              a1 '(rule ?-) a2)))
-     ((and (memq (car a) '(calcFunc-sum calcFunc-prod))
-          (memq calc-language '(tex latex))
-          (= (length a) 5))
-      (list 'horiz (if (eq (car a) 'calcFunc-sum) "\\sum" "\\prod")
-           "_{" (math-compose-expr (nth 2 a) 0)
-           "=" (math-compose-expr (nth 3 a) 0)
-           "}^{" (math-compose-expr (nth 4 a) 0)
-           "}{" (math-compose-expr (nth 1 a) 0) "}"))
      ((and (eq (car a) 'calcFunc-lambda)
           (> (length a) 2)
           (memq calc-language '(nil flat big)))
           (integerp (nth 2 a)))
       (let ((c (math-compose-expr (nth 1 a) -1)))
        (if (> prec (nth 2 a))
-           (if (memq calc-language '(tex latex))
-               (list 'horiz "\\left( " c " \\right)")
-             (if (eq calc-language 'eqn)
-                 (list 'horiz "{left ( " c " right )}")
-               (list 'horiz "(" c ")")))
+            (if (setq spfn (get calc-language 'math-big-parens))
+                (list 'horiz (car spfn) c (cdr spfn))
+              (list 'horiz "(" c ")"))
          c)))
      ((and (eq (car a) 'calcFunc-choriz)
           (not (eq calc-language 'unform))
                      (make-list (nth 1 a) c))))))
      ((and (eq (car a) 'calcFunc-evalto)
           (setq calc-any-evaltos t)
-          (memq calc-language '(tex latex eqn))
+          (setq spfn (get calc-language 'math-evalto))
           (= math-compose-level (if math-comp-tagged 2 1))
           (= (length a) 3))
       (list 'horiz
-           (if (memq calc-language '(tex latex)) "\\evalto " "evalto ")
+            (car spfn)
            (math-compose-expr (nth 1 a) 0)
-           (if (memq calc-language '(tex latex)) " \\to " " -> ")
+           (cdr spfn)
            (math-compose-expr (nth 2 a) 0)))
      (t
       (let ((op (and (not (eq calc-language 'unform))
                                  (symbol-name func))
                                 (math-match-substring (symbol-name func) 1)
                               (symbol-name func))))
-                (if (memq calc-language '(c fortran pascal maple))
+                (if (memq calc-language calc-lang-allow-underscores)
                     (setq func (math-to-underscores func)))
-                (if (and (memq calc-language '(tex latex))
-                         calc-language-option
-                         (not (= calc-language-option 0))
-                         (string-match "\\`[a-zA-Z][a-zA-Z0-9]+\\'" func))
-                    (if (< (prefix-numeric-value calc-language-option) 0)
-                        (setq func (format "\\%s" func))
-                      (setq func (if (eq calc-language 'latex)
-                                      (format "\\text{%s}" func)
-                                    (format "\\hbox{%s}" func)))))
-                (if (and (eq calc-language 'eqn)
-                         (string-match "[^']'+\\'" func))
-                    (let ((n (- (length func) (match-beginning 0) 1)))
-                      (setq func (substring func 0 (- n)))
-                      (while (>= (setq n (1- n)) 0)
-                        (setq func (concat func " prime")))))
-                (cond ((and (memq calc-language '(tex latex))
-                            (or (> (length a) 2)
-                                (not (math-tex-expr-is-flat (nth 1 a)))))
-                       (setq left "\\left( "
-                             right " \\right)"))
-                      ((and (eq calc-language 'eqn)
-                            (or (> (length a) 2)
-                                (not (math-tex-expr-is-flat (nth 1 a)))))
-                       (setq left "{left ( "
-                             right " right )}"))
-                      ((and (or (and (memq calc-language '(tex latex))
-                                     (eq (aref func 0) ?\\))
-                                (and (eq calc-language 'eqn)
-                                     (memq (car a) math-eqn-special-funcs)))
-                            (not (or
-                                   (string-match "\\hbox{" func)
-                                   (string-match "\\text{" func)))
-                            (= (length a) 2)
-                            (or (Math-realp (nth 1 a))
-                                (memq (car (nth 1 a)) '(var *))))
-                       (setq left (if (eq calc-language 'eqn) "~{" "{")
-                             right "}"))
-                      ((eq calc-language 'eqn)
-                       (setq left " ( "
-                             right " )"))
-                      (t (setq left calc-function-open
-                               right calc-function-close)))
-                (list 'horiz func left
-                      (math-compose-vector (cdr a)
-                                           (if (eq calc-language 'eqn)
-                                               " , " ", ")
-                                           0)
-                      right)))))))))
+                 (if (setq spfn (get calc-language 'math-func-formatter))
+                     (funcall spfn func a)
+
+                   (list 'horiz func calc-function-open
+                      (math-compose-vector (cdr a) ", " 0)
+                      calc-function-close))))))))))
 
 
 (defun math-prod-first-term (x)
       (if (<= count 0)
          (if (< count 0)
              (math-compose-rows (cdr a) -1 nil)
-           (cons (concat (if (memq calc-language '(tex latex)) "  \\ldots" "  ...")
-                         math-comp-comma)
+           (cons (concat 
+                   (let ((mdots (get calc-language 'math-dots)))
+                     (if mdots
+                         (concat " " mdots)
+                       "  ..."))
+                   math-comp-comma)
                  (math-compose-rows (cdr a) -1 nil)))
        (cons (list 'horiz
                    (if first (concat math-comp-left-bracket " ") "  ")
                (math-compose-expr (car a) math-comp-vector-prec)
                (concat " " math-comp-right-bracket)))))
 
-(defun math-compose-tex-matrix (a &optional ltx)
-  (if (cdr a)
-      (cons (append (math-compose-vector (cdr (car a)) " & " 0) 
-                    (if ltx '(" \\\\ ") '(" \\cr ")))
-            (math-compose-tex-matrix (cdr a) ltx))
-    (list (math-compose-vector (cdr (car a)) " & " 0))))
-
-(defun math-compose-eqn-matrix (a)
-  (if a
-      (cons
-       (cond ((eq calc-matrix-just 'right) "rcol ")
-            ((eq calc-matrix-just 'center) "ccol ")
-            (t "lcol "))
-       (cons
-       (list 'break math-compose-level)
-       (cons
-        "{ "
-        (cons
-         (let ((math-compose-level (1+ math-compose-level)))
-           (math-compose-vector (cdr (car a)) " above " 1000))
-         (cons
-          " } "
-          (math-compose-eqn-matrix (cdr a)))))))
-    nil))
-
 (defun math-vector-is-string (a)
   (while (and (setq a (cdr a))
              (or (and (natnump (car a))
index 94df068b012ddb1108b0080ef57a558e3356ac74..c605cbef10d2a2f4d90ec89ada42c9582e7b72ed 100644 (file)
@@ -82,7 +82,7 @@
 
 ;;;###autoload
 (defcustom appt-issue-message t
-  "*Non-nil means check for appointments in the diary buffer.
+  "Non-nil means check for appointments in the diary buffer.
 To be detected, the diary entry must have the format described in the
 documentation of the function `appt-check'."
   :type 'boolean
@@ -94,19 +94,19 @@ variable `appt-display-format' instead." "22.1")
 
 ;;;###autoload
 (defcustom appt-message-warning-time 12
-  "*Time in minutes before an appointment that the warning begins."
+  "Time in minutes before an appointment that the warning begins."
   :type 'integer
   :group 'appt)
 
 ;;;###autoload
 (defcustom appt-audible t
-  "*Non-nil means beep to indicate appointment."
+  "Non-nil means beep to indicate appointment."
   :type 'boolean
   :group 'appt)
 
 ;;;###autoload
 (defcustom appt-visible t
-  "*Non-nil means display appointment message in echo area.
+  "Non-nil means display appointment message in echo area.
 This variable is only relevant if `appt-msg-window' is nil."
   :type 'boolean
   :group 'appt)
@@ -115,7 +115,7 @@ This variable is only relevant if `appt-msg-window' is nil."
 
 ;;;###autoload
 (defcustom appt-msg-window t
-  "*Non-nil means display appointment message in another window.
+  "Non-nil means display appointment message in another window.
 If non-nil, this variable overrides `appt-visible'."
   :type 'boolean
   :group 'appt)
@@ -144,27 +144,27 @@ of the (obsolete) variables `appt-msg-window' and `appt-visible'."
 
 ;;;###autoload
 (defcustom appt-display-mode-line t
-  "*Non-nil means display minutes to appointment and time on the mode line.
+  "Non-nil means display minutes to appointment and time on the mode line.
 This is in addition to any other display of appointment messages."
   :type 'boolean
   :group 'appt)
 
 ;;;###autoload
 (defcustom appt-display-duration 10
-  "*The number of seconds an appointment message is displayed.
+  "The number of seconds an appointment message is displayed.
 Only relevant if reminders are to be displayed in their own window."
   :type 'integer
   :group 'appt)
 
 ;;;###autoload
 (defcustom appt-display-diary t
-  "*Non-nil displays the diary when the appointment list is first initialized.
+  "Non-nil displays the diary when the appointment list is first initialized.
 This will occur at midnight when the appointment list is updated."
   :type 'boolean
   :group 'appt)
 
 (defcustom appt-display-interval 3
-  "*Number of minutes to wait between checking the appointment list."
+  "Number of minutes to wait between checking the appointment list."
   :type 'integer
   :group 'appt)
 
@@ -436,20 +436,13 @@ displayed in a window:
   "Display appointment message APPT-MSG in a separate buffer.
 The appointment is due in MIN-TO-APP (a string) minutes.
 NEW-TIME is a string giving the date."
-  (require 'electric)
-
-  ;; Make sure we're not in the minibuffer
-  ;; before splitting the window.
-
-  (if (equal (selected-window) (minibuffer-window))
-      (if (other-window 1)
-         (select-window (other-window 1))
-       (if (display-multi-frame-p)
-           (select-frame (other-frame 1)))))
-
+  ;; Make sure we're not in the minibuffer before splitting the window.
+  ;; FIXME this seems needlessly complicated?
+  (when (minibufferp)
+    (other-window 1)
+    (and (minibufferp) (display-multi-frame-p) (other-frame 1)))
   (let ((this-window (selected-window))
         (appt-disp-buf (set-buffer (get-buffer-create appt-buffer-name))))
-
     (if (cdr (assq 'unsplittable (frame-parameters)))
        ;; In an unsplittable frame, use something somewhere else.
        (display-buffer appt-disp-buf)
@@ -489,7 +482,7 @@ Usually just deletes the appointment buffer."
                    (let ((next-bottom-edge (nth 3 (window-edges w))))
                      (when (< bottom-edge next-bottom-edge)
                        (setq bottom-edge next-bottom-edge
-                             lowest-window w)))))
+                             lowest-window w)))) 'nomini)
     (select-window lowest-window)))
 
 (defconst appt-time-regexp
index dae539b34361ffcb211ffe954268ff1f28cd9e40..f6d5cdb58c1d3ff2b7b8c4155f34e63a038c5af9 100644 (file)
@@ -204,6 +204,10 @@ nil if it is not visible in the current calendar window."
             (if (calendar-date-is-visible-p date)
                 (list (list date string))))))))
 
+;; d-b-l-e should be called from diary code.
+(declare-function add-to-diary-list "diary-lib"
+                  (date string specifier &optional marker globcolor literal))
+
 (defun diary-bahai-list-entries ()
   "Add any Bahá'í date entries from the diary file to `diary-entries-list'.
 Bahá'í date diary entries must be prefaced by an
@@ -290,6 +294,12 @@ calendar.  This function is provided for use with the
         (set-buffer-modified-p diary-modified))
     (goto-char (point-min))))
 
+(declare-function diary-name-pattern "diary-lib"
+                  (string-array &optional abbrev-array paren))
+
+(declare-function mark-calendar-days-named "diary-lib"
+                  (dayname &optional color))
+
 (defun diary-bahai-mark-entries ()
   "Mark days in the calendar window that have Bahá'í date diary entries.
 Each entry in diary-file (or included files) visible in the calendar
index 02cc9bfabb27a20f5c79d53ffb453485c07e35dc..9e20bfa88022208392bd0a5b7980178723e96a20 100644 (file)
@@ -301,6 +301,9 @@ nil if it is not visible in the current calendar window."
             (if (calendar-date-is-visible-p date)
                 (list (list date string))))))))
 
+;; h-r-h-e should be called from holidays code.
+(declare-function holiday-filter-visible-calendar "holidays" (l))
+
 (defun holiday-rosh-hashanah-etc ()
   "List of dates related to Rosh Hashanah, as visible in calendar window."
   (if (or (< displayed-month 8)
@@ -500,6 +503,10 @@ nil if it is not visible in the current calendar window."
                (calendar-dayname-on-or-before 6 (+ abs-t-a 7)))
               "Shabbat Nahamu"))))))
 
+;; l-h-d-e should be called from diary code.
+(declare-function add-to-diary-list "diary-lib"
+                  (date string specifier &optional marker globcolor literal))
+
 (defun list-hebrew-diary-entries ()
   "Add any Hebrew date entries from the diary file to `diary-entries-list'.
 Hebrew date diary entries must be prefaced by `hebrew-diary-entry-symbol'
@@ -661,6 +668,12 @@ A value of 0 in any position is a wildcard."
                  (mark-visible-calendar-date
                   (calendar-gregorian-from-absolute date)))))))))
 
+(declare-function diary-name-pattern "diary-lib"
+                  (string-array &optional abbrev-array paren))
+
+(declare-function mark-calendar-days-named "diary-lib"
+                  (dayname &optional color))
+
 (defun mark-hebrew-diary-entries ()
   "Mark days in the calendar window that have Hebrew date diary entries.
 Each entry in diary-file (or included files) visible in the calendar window
index c562437fc14c8cd0fca74402b7bcbd98e9277fba..aa8590340e04bb10d9ab867ddf0f4508d790a8d6 100644 (file)
@@ -195,6 +195,10 @@ nil if it is not visible in the current calendar window."
             (if (calendar-date-is-visible-p date)
                 (list (list date string))))))))
 
+;; l-i-d-e should be called from diary code.
+(declare-function add-to-diary-list "diary-lib"
+                  (date string specifier &optional marker globcolor literal))
+
 (defun list-islamic-diary-entries ()
   "Add any Islamic date entries from the diary file to `diary-entries-list'.
 Islamic date diary entries must be prefaced by an `islamic-diary-entry-symbol'
@@ -281,6 +285,12 @@ not be marked in the calendar.  This function is provided for use with the
         (set-buffer-modified-p diary-modified))
     (goto-char (point-min))))
 
+(declare-function diary-name-pattern "diary-lib"
+                  (string-array &optional abbrev-array paren))
+
+(declare-function mark-calendar-days-named "diary-lib"
+                  (dayname &optional color))
+
 (defun mark-islamic-diary-entries ()
   "Mark days in the calendar window that have Islamic date diary entries.
 Each entry in diary-file (or included files) visible in the calendar window
index 47fd4fc4c2adf3f68488b5fc7542023e0f64b1fb..0f54722a5ca5888ab37c00c8492607803ef3c18f 100644 (file)
 
 ;;; Code:
 
+;; The code in this file is only called from calendar.el, but can't
+;; require it (to supress undefined function warnings from compiler)
+;; without a recursive require.
+;; All these functions are either autoloaded, or autoloaded or defined
+;; in calendar.el.
+(declare-function calendar-increment-month "calendar" (n &optional mon yr))
+(declare-function calendar-month-name      "calendar" (month &optional abbrev))
+(declare-function extract-calendar-year    "calendar" (date))
+(declare-function calendar-cursor-to-date  "calendar" (&optional error))
+(declare-function holiday-list             "holidays" (y1 y2 &optional l label))
+(declare-function calendar-sunrise-sunset  "solar"    nil)
+(declare-function calendar-current-date    "calendar" nil)
+(declare-function calendar-cursor-holidays "holidays" nil)
+(declare-function calendar-date-string     "calendar"
+                  (date &optional abbreviate nodayname))
+(declare-function insert-diary-entry       "diary-lib" (arg))
+(declare-function calendar-set-mark        "calendar"  (arg))
+(declare-function cal-tex-cursor-day       "cal-tex"   (&optional arg))
+(declare-function cal-tex-cursor-week      "cal-tex"   (&optional arg))
+(declare-function cal-tex-cursor-week2     "cal-tex"   (&optional arg))
+(declare-function cal-tex-cursor-week-iso  "cal-tex"   (&optional arg))
+(declare-function cal-tex-cursor-week-monday     "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-filofax-daily   "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-filofax-2week   "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-filofax-week    "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-month           "cal-tex"    (arg))
+(declare-function cal-tex-cursor-month-landscape "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-year            "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-filofax-year    "cal-tex"    (&optional arg))
+(declare-function cal-tex-cursor-year-landscape  "cal-tex"    (&optional arg))
+(declare-function calendar-day-of-year-string    "calendar"   (&optional date))
+(declare-function calendar-iso-date-string       "cal-iso"    (&optional date))
+(declare-function calendar-julian-date-string    "cal-julian" (&optional date))
+(declare-function calendar-astro-date-string     "cal-julian" (&optional date))
+(declare-function calendar-absolute-from-gregorian "calendar" (date))
+(declare-function calendar-hebrew-date-string    "cal-hebrew" (&optional date))
+(declare-function calendar-persian-date-string   "cal-persia" (&optional date))
+(declare-function calendar-bahai-date-string     "cal-bahai"  (&optional date))
+(declare-function calendar-islamic-date-string   "cal-islam"  (&optional date))
+(declare-function calendar-chinese-date-string   "cal-china"  (&optional date))
+(declare-function calendar-coptic-date-string    "cal-coptic" (&optional date))
+(declare-function calendar-ethiopic-date-string  "cal-coptic" (&optional date))
+(declare-function calendar-french-date-string    "cal-french" (&optional date))
+(declare-function calendar-mayan-date-string     "cal-mayan"  (&optional date))
+(declare-function calendar-print-chinese-date    "cal-china"  nil)
+(declare-function calendar-goto-date             "cal-move"   (date))
+
 (defvar displayed-year)
 
 (defconst cal-menu-moon-menu
     "--"
     ,@(let ((l ()))
         ;; Show 11 years--5 before, 5 after year of middle month.
+        ;; http://lists.gnu.org/archive/html/emacs-devel/2007-11/msg01813.html
         (dotimes (i 11)
-          (push (vector "For Year"
+          (push (vector (format "hol-year-%d" i)
                         `(lambda ()
                            (interactive)
-                           (holiday-list (+ displayed-year ,(- i 5))))
-                        :suffix `(number-to-string (+ displayed-year ,(- i 5))))
+                           (holiday-list (+ displayed-year ,(- i 5))
+                                         (+ displayed-year ,(- i 5))))
+                        :label `(format "For Year %d"
+                                       (+ displayed-year ,(- i 5))))
                 l))
         (nreverse l))
     "--"
index 24b1f896179daacfdbda6a2006e6486ec33bd754..4aea547f88d93b9e0ddfe090e7ca4bebf8be1a50 100644 (file)
@@ -64,6 +64,9 @@ Location and color should be set in .Xdefaults.")
   "Hooks to be run just after setting up a calendar frame.
 Can be used to change frame parameters, such as font, color, location, etc.")
 
+;; calendar-basic-setup is called first, and will autoload diary-lib.
+(declare-function make-fancy-diary-buffer "diary-lib" nil)
+
 (defun calendar-one-frame-setup (&optional arg)
   "Start calendar and display it in a dedicated frame together with the diary.
 This function requires a display capable of multiple frames, else
index c252341526a7463835712eeae2920070a84d3d9e..d49667d2810b9a8f3b88d573db0dad814264018f 100644 (file)
@@ -1,7 +1,8 @@
 ;;; calendar.el --- calendar functions
 
 ;; Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1997,
-;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007  Free Software Foundation, Inc.
+;;   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+;;   Free Software Foundation, Inc.
 
 ;; Author: Edward M. Reingold <reingold@cs.uiuc.edu>
 ;; Maintainer: Glenn Morris <rgm@gnu.org>
@@ -818,7 +819,7 @@ diary buffer, set the variable `diary-list-include-blanks' to t."
 As the files are processed for diary entries, these functions are used
 to cull relevant entries.  You can use either or both of
 `list-hebrew-diary-entries', `list-islamic-diary-entries' and
-`list-bahai-diary-entries'.  The documentation for these functions
+`diary-bahai-list-entries'.  The documentation for these functions
 describes the style of such diary entries."
   :type 'hook
   :options '(list-hebrew-diary-entries
@@ -2444,6 +2445,11 @@ under the cursor:
     (select-window (posn-window (event-start event)))
     (call-interactively 'calendar-other-month)))
 
+;; (require 'info) will define these.
+(declare-function Info-find-emacs-command-nodes "info" (command))
+(declare-function Info-find-node "info"
+                  (filename nodename &optional no-going-back))
+
 (defun calendar-goto-info-node ()
   "Go to the info node for the calendar."
   (interactive)
index f61349401694c8f10588b35e36c3866fb7060ce4..cee571f5f1c1e2d5ce734c9bd178e0ea030ec6fe 100644 (file)
@@ -208,6 +208,7 @@ The optional LABEL is used to label the buffer created."
       (display-buffer holiday-buffer)
       (message "Computing holidays...done"))))
 
+;;;###autoload
 (defalias 'holiday-list 'list-holidays)
 
 (defun calendar-check-holidays (date)
@@ -487,6 +488,9 @@ is non-nil)."
        (list (list (calendar-gregorian-from-absolute (+ abs-easter n))
                    string))))))
 
+;; Prior call to calendar-julian-from-absolute will autoload cal-julian.
+(declare-function calendar-absolute-from-julian "cal-julian" (date))
+
 (defun holiday-greek-orthodox-easter ()
   "Date of Easter according to the rule of the Council of Nicaea."
   (let ((m displayed-month)
index d15312abfa3d27c66a054e453b895e99b93f634b..ffd2b5b6f59986f29d90f9d95d7541a4227eac94 100644 (file)
@@ -53,7 +53,7 @@ the symbols HIGH-SYMBOL, LOW-SYMBOL and MICRO-SYMBOL.
 
 The optional TYPE-SYMBOL is bound to the type of the time value.
 Type 0 is the cons cell (HIGH . LOW), type 1 is the list (HIGH
-LOW), and type 3 is the list (HIGH LOW MICRO)."
+LOW), and type 2 is the list (HIGH LOW MICRO)."
   (declare (indent 1)
           (debug ((&rest (symbolp symbolp symbolp &or [symbolp form] form))
                   body)))
@@ -86,7 +86,7 @@ LOW), and type 3 is the list (HIGH LOW MICRO)."
 (defun encode-time-value (high low micro type)
   "Encode HIGH, LOW, and MICRO into a time value of type TYPE.
 Type 0 is the cons cell (HIGH . LOW), type 1 is the list (HIGH LOW),
-and type 3 is the list (HIGH LOW MICRO)."
+and type 2 is the list (HIGH LOW MICRO)."
   (cond
    ((eq type 0) (cons high low))
    ((eq type 1) (list high low))
index 13ef042f736295b0d0a5468ef7927dcca98b0a30..e3db7e46407a347953440f820ad9ca96a26df4ef 100644 (file)
@@ -916,6 +916,9 @@ Number of entries for each category is given by `todo-print-priorities'."
   (defvar date)
   (defvar entry))
 
+;; t-c should be used from diary code, which requires calendar.
+(declare-function calendar-current-date "calendar" nil)
+
 ;; Read about this function in the setup instructions above!
 ;;;###autoload
 (defun todo-cp ()
index e1d0ef07df4127810812625675e6a022ba8adef9..b3a4928dd5359572b0c2702684a4f66df2308ce3 100644 (file)
@@ -381,9 +381,9 @@ of `minibuffer-completion-table' and the minibuffer contents.")
 ;; Returns the sequence of non-delimiter characters that follow regexp in string.
 (defun PC-chunk-after (string regexp)
   (if (not (string-match regexp string))
-      (let ((message (format "String %s didn't match regexp %s" string regexp)))
-       (message message)
-       (error message)))
+      (let ((message "String %s didn't match regexp %s"))
+       (message message string regexp)
+       (error message string regexp)))
   (let ((result (substring string (match-end 0))))
     ;; result may contain multiple chunks
     (if (string-match PC-delim-regex result)
@@ -869,7 +869,7 @@ GOTO-END is non-nil, however, it instead replaces up to END."
 (defun PC-temp-minibuffer-message (message)
   "A Lisp version of `temp_minibuffer_message' from minibuf.c."
   (cond (PC-not-minibuffer
-        (message message)
+        (message "%s" message)
         (sit-for 2)
         (message ""))
        ((fboundp 'temp-minibuffer-message)
index 5e398d46ccf9d0f11a8362b018a74ffc11cd9779..b9e462ec05ff9be2326ba46c91b952c194004e74 100644 (file)
     map)
   "Local keymap for links in `custom-mode'.")
 
+(defvar custom-field-keymap
+  (let ((map (copy-keymap widget-field-keymap)))
+    (define-key map "\C-c\C-c" 'Custom-set)
+    (define-key map "\C-x\C-s" 'Custom-save)
+    map)
+  "Keymap used inside editable fields in customization buffers.")
+
+(widget-put (get 'editable-field 'widget-type) :keymap custom-field-keymap)
 
 ;;; Utilities.
 
@@ -4126,6 +4134,9 @@ if only the first line of the docstring is shown."))
           (setq user-init-file default-init-file))
         user-init-file))))
 
+;; If recentf-mode is non-nil, this is defined.
+(declare-function recentf-expand-file-name "recentf" (name))
+
 ;;;###autoload
 (defun custom-save-all ()
   "Save all customizations in `custom-file'."
@@ -4435,7 +4446,7 @@ The format is suitable for use with `easy-menu-define'."
 ;;; Toolbar and menubar support
 
 (easy-menu-define
-  Custom-mode-menu custom-mode-map
+  Custom-mode-menu (list custom-mode-map custom-field-keymap)
   "Menu used in customization buffers."
   (nconc (list "Custom"
               (customize-menu-create 'customize))
@@ -4473,15 +4484,6 @@ The format is suitable for use with `easy-menu-define'."
        (widget-apply-action button event)
       (error "You can't edit this part of the Custom buffer"))))
 
-(defvar custom-field-keymap
-  (let ((map (copy-keymap widget-field-keymap)))
-    (define-key map "\C-c\C-c" 'Custom-set)
-    (define-key map "\C-x\C-s" 'Custom-save)
-    map)
-  "Keymap used inside editable fields in customization buffers.")
-
-(widget-put (get 'editable-field 'widget-type) :keymap custom-field-keymap)
-
 (defun Custom-goto-parent ()
   "Go to the parent group listed at the top of this buffer.
 If several parents are listed, go to the first of them."
@@ -4502,7 +4504,7 @@ If several parents are listed, go to the first of them."
   (if (eq (widget-get (widget-get widget :parent) :custom-state) 'modified)
       (message "To install your edits, invoke [State] and choose the Set operation")))
 
-(defun custom-mode ()
+(define-derived-mode custom-mode nil "Custom"
   "Major mode for editing customization buffers.
 
 The following commands are available:
@@ -4524,9 +4526,6 @@ Erase customizations; set options
 
 Entry to this mode calls the value of `custom-mode-hook'
 if that value is non-nil."
-  (kill-all-local-variables)
-  (setq major-mode 'custom-mode
-       mode-name "Custom")
   (use-local-map custom-mode-map)
   (easy-menu-add Custom-mode-menu)
   (set (make-local-variable 'tool-bar-map) custom-tool-bar-map)
@@ -4536,6 +4535,7 @@ if that value is non-nil."
   (setq widget-documentation-face 'custom-documentation)
   (make-local-variable 'widget-button-face)
   (setq widget-button-face custom-button)
+  (setq show-trailing-whitespace nil)
 
   ;; We need this because of the "More" button on docstrings.
   ;; Otherwise clicking on "More" can push point offscreen, which
@@ -4553,8 +4553,7 @@ if that value is non-nil."
     (set (make-local-variable 'widget-push-button-suffix) "")
     (set (make-local-variable 'widget-link-prefix) "")
     (set (make-local-variable 'widget-link-suffix) ""))
-  (add-hook 'widget-edit-functions 'custom-state-buffer-message nil t)
-  (run-mode-hooks 'custom-mode-hook))
+  (add-hook 'widget-edit-functions 'custom-state-buffer-message nil t))
 
 (put 'custom-mode 'mode-class 'special)
 
index 6054099bb4d8d5e4d841367db8d99ad48c1fb27b..749956091df004d679b94ee46a2d212a47956645 100644 (file)
@@ -651,6 +651,8 @@ is nil, ask the user where to save the desktop."
       value)))
 
 ;; ----------------------------------------------------------------------------
+(declare-function uniquify-item-base "uniquify" (cl-x) t) ; defstruct
+
 (defun desktop-buffer-info (buffer)
   (set-buffer buffer)
   (list
index b9ceb728dbc1a5cafaf427b73d1feb54e11c76dc..32c63aba2fef08b3275dba7ae9cd83921abd0b04 100644 (file)
@@ -463,6 +463,56 @@ with a prefix argument."
 \f
 ;;; Shell commands
 
+(declare-function mailcap-parse-mailcaps "mailcap" (&optional path force))
+(declare-function mailcap-parse-mimetypes "mailcap" (&optional path force))
+(declare-function mailcap-extension-to-mime "mailcap" (extn))
+(declare-function mailcap-mime-info "mailcap"
+                  (string &optional request no-decode))
+
+(defun dired-read-shell-command-default (files)
+  "Return a list of default commands for `dired-read-shell-command'."
+  (require 'mailcap)
+  (mailcap-parse-mailcaps)
+  (mailcap-parse-mimetypes)
+  (let* ((all-mime-type
+         ;; All unique MIME types from file extensions
+         (delete-dups (mapcar (lambda (file)
+                                (mailcap-extension-to-mime
+                                 (file-name-extension file t)))
+                              files)))
+        (all-mime-info
+         ;; All MIME info lists
+         (delete-dups (mapcar (lambda (mime-type)
+                                (mailcap-mime-info mime-type 'all))
+                              all-mime-type)))
+        (common-mime-info
+         ;; Intersection of mime-infos from different mime-types;
+         ;; or just the first MIME info for a single MIME type
+         (if (cdr all-mime-info)
+             (delq nil (mapcar (lambda (mi1)
+                                 (unless (memq nil (mapcar
+                                                    (lambda (mi2)
+                                                      (member mi1 mi2))
+                                                    (cdr all-mime-info)))
+                                   mi1))
+                               (car all-mime-info)))
+           (car all-mime-info)))
+        (commands
+         ;; Command strings from `viewer' field of the MIME info
+         (delq nil (mapcar (lambda (mime-info)
+                             (let ((command (cdr (assoc 'viewer mime-info))))
+                               (if (stringp command)
+                                   (replace-regexp-in-string
+                                    ;; Replace mailcap's `%s' placeholder
+                                    ;; with dired's `?' placeholder
+                                    "%s" "?"
+                                    (replace-regexp-in-string
+                                     ;; Remove the final filename placeholder
+                                     "\s*\\('\\)?%s\\1?\s*\\'" "" command nil t)
+                                    nil t))))
+                           common-mime-info))))
+    commands))
+
 (defun dired-read-shell-command (prompt arg files)
 ;;  "Read a dired shell command prompting with PROMPT (using read-string).
 ;;ARG is the prefix arg and may be used to indicate in the prompt which
@@ -472,7 +522,8 @@ with a prefix argument."
    nil 'shell files
    (function read-string)
    (format prompt (dired-mark-prompt arg files))
-   nil 'shell-command-history))
+   nil 'shell-command-history
+   (dired-read-shell-command-default files)))
 
 ;; The in-background argument is only needed in Emacs 18 where
 ;; shell-command doesn't understand an appended ampersand `&'.
@@ -1151,6 +1202,8 @@ Special value `always' suppresses confirmation."
   (dired-copy-file-recursive from to ok-flag dired-copy-preserve-time t
                             dired-recursive-copies))
 
+(declare-function make-symbolic-link "fileio.c")
+
 (defun dired-copy-file-recursive (from to ok-flag &optional
                                       preserve-time top recursive)
   (let ((attrs (file-attributes from))
@@ -1533,10 +1586,16 @@ Optional arg HOW-TO is used to set the value of the into-dir variable
   "Create a directory called DIRECTORY."
   (interactive
    (list (read-file-name "Create directory: " (dired-current-directory))))
-  (let ((expanded (directory-file-name (expand-file-name directory))))
-    (make-directory expanded)
-    (dired-add-file expanded)
-    (dired-move-to-filename)))
+  (let* ((expanded (directory-file-name (expand-file-name directory)))
+        (try expanded) new)
+    ;; Find the topmost nonexistent parent dir (variable `new')
+    (while (and try (not (file-exists-p try)) (not (equal new try)))
+      (setq new try
+           try (directory-file-name (file-name-directory try))))
+    (make-directory expanded t)
+    (when new
+      (dired-add-file new)
+      (dired-move-to-filename))))
 
 (defun dired-into-dir-with-symlinks (target)
   (and (file-directory-p target)
index 0be3aa393e15ccf58f8e0ec69247e5fe9101b0dc..f8e0b2a61403ecf04a05968afe489c0a33f10e23 100644 (file)
@@ -1,15 +1,13 @@
 ;;; dired-x.el --- extra Dired functionality -*-byte-compile-dynamic: t;-*-
 
+;; Copyright (C) 1993, 1994, 1997, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007 Free Software Foundation, Inc.
+
 ;; Author: Sebastian Kremer <sk@thp.uni-koeln.de>
 ;;     Lawrence R. Dodd <dodd@roebling.poly.edu>
 ;; Maintainer: Romain Francoise <rfrancoise@gnu.org>
-;; Version: 2.37+
-;; Date: 1994/08/18 19:27:42
 ;; Keywords: dired extensions files
 
-;; Copyright (C) 1993, 1994, 1997, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007 Free Software Foundation, Inc.
-
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
@@ -652,6 +650,15 @@ Optional fourth argument LOCALP is as in `dired-get-filename'."
         (and fn (string-match regexp fn))))
      msg)))
 
+;; Compiler does not get fset.
+(declare-function dired-omit-old-add-entry "dired-x")
+
+;;; REDEFINE.
+;;; Redefine dired-aux.el's version of `dired-add-entry'
+;;; Save old defun if not already done:
+(or (fboundp 'dired-omit-old-add-entry)
+    (fset 'dired-omit-old-add-entry (symbol-function 'dired-add-entry)))
+
 ;;; REDEFINE.
 (defun dired-omit-new-add-entry (filename &optional marker-char relative)
   ;; This redefines dired-aux.el's dired-add-entry to avoid calling ls for
@@ -679,11 +686,6 @@ Optional fourth argument LOCALP is as in `dired-get-filename'."
     ;; omitting is not turned on at all
     (dired-omit-old-add-entry filename marker-char relative)))
 
-;;; REDEFINE.
-;;; Redefine dired-aux.el's version of `dired-add-entry'
-;;; Save old defun if not already done:
-(or (fboundp 'dired-omit-old-add-entry)
-    (fset 'dired-omit-old-add-entry (symbol-function 'dired-add-entry)))
 ;; Redefine it.
 (fset 'dired-add-entry 'dired-omit-new-add-entry)
 
@@ -746,7 +748,7 @@ you can relist single subdirs using \\[dired-do-redisplay]."
   ;; decent subdir headerline:
   (goto-char (point-min))
   (or (looking-at dired-subdir-regexp)
-      (insert "  " 
+      (insert "  "
              (directory-file-name (file-name-directory default-directory))
              ":\n"))
   (dired-mode dirname (or switches dired-listing-switches))
@@ -1211,6 +1213,8 @@ This is an extra function so that you can redefine it."
 \f
 ;;; RELATIVE SYMBOLIC LINKS.
 
+(declare-function make-symbolic-link "fileio.c")
+
 (defvar dired-keep-marker-relsymlink ?S
   "See variable `dired-keep-marker-move'.")
 
@@ -1437,6 +1441,8 @@ See also variable `dired-vm-read-only-folders'."
 \f
 ;;; MISCELLANEOUS INTERNAL FUNCTIONS.
 
+(declare-function dired-old-find-buffer-nocreate "dired-x")
+
 (or (fboundp 'dired-old-find-buffer-nocreate)
     (fset 'dired-old-find-buffer-nocreate
           (symbol-function 'dired-find-buffer-nocreate)))
index 16b53acb6da8ed1f72f7c04ff46008169f683c0a..ab56579e718a47bc26f81f7c57fbe27d0e04fa40 100644 (file)
@@ -595,8 +595,12 @@ Don't use that together with FILTER."
            (if (next-read-file-uses-dialog-p)
                (read-directory-name (format "Dired %s(directory): " str)
                                     nil default-directory nil)
-             (read-file-name (format "Dired %s(directory): " str)
-                             nil default-directory nil)))))
+             (let ((default (and buffer-file-name
+                                 (abbreviate-file-name buffer-file-name))))
+               (minibuffer-with-setup-hook
+                   (lambda () (setq minibuffer-default default))
+                 (read-file-name (format "Dired %s(directory): " str)
+                                 nil default-directory nil)))))))
 
 ;;;###autoload (define-key ctl-x-map "d" 'dired)
 ;;;###autoload
@@ -3264,6 +3268,9 @@ Anything else means ask for each directory."
        (dired-dnd-handle-local-file uri action)
       nil)))
 
+(declare-function dired-relist-entry "dired-aux" (file))
+(declare-function make-symbolic-link "fileio.c")
+
 (defun dired-dnd-handle-local-file (uri action)
   "Copy, move or link a file to the dired directory.
 URI is the file to handle, ACTION is one of copy, move, link or ask.
index 89f1b009f7f350769ef2bd01d72e188d243eca0f..0e336b12dd5e50de9f92d43e1f57ce0370c6112b 100644 (file)
 ;;
 ;; and modify them to your needs.
 
-;;; Code:
+;;; Todo:
 
-;; Todo:
 ;; - better menu.
 ;; - don't use `find-file'.
 ;; - Bind slicing to a drag event.
-;; - zoom (the whole document and/or just the region around the cursor).
+;; - doc-view-fit-doc-to-window and doc-view-fit-window-to-doc.
+;; - zoom a the region around the cursor (like xdvi).
 ;; - get rid of the silly arrow in the fringe.
 ;; - improve anti-aliasing (pdf-utils gets it better).
 
+;;;; About isearch support
+
+;; I tried implementing isearch by setting
+;; `isearch-search-fun-function' buffer-locally, but that didn't
+;; work too good.  The function doing the real search was called
+;; endlessly somehow.  But even if we'd get that working no real
+;; isearch feeling comes up due to the missing match highlighting.
+;; Currently I display all lines containing a match in a tooltip and
+;; each C-s or C-r jumps directly to the next/previous page with a
+;; match.  With isearch we could only display the current match.  So
+;; we had to decide if another C-s jumps to the next page with a
+;; match (thus only the first match in a page will be displayed in a
+;; tooltip) or to the next match, which would do nothing visible
+;; (except the tooltip) if the next match is on the same page.
+
+;; And it's much slower than the current search facility, because
+;; isearch really searches for each step forward or backward wheras
+;; the current approach searches once and then it knows to which
+;; pages to jump.
+
+;; Anyway, if someone with better isearch knowledge wants to give it a try,
+;; feel free to do it.  --Tassilo
+
+;;; Code:
+
 (require 'dired)
 (require 'image-mode)
 (require 'jka-compr)
   '("-dSAFER" ;; Avoid security problems when rendering files from untrusted
              ;; sources.
     "-dNOPAUSE" "-sDEVICE=png16m" "-dTextAlphaBits=4"
-    "-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET" "-r100")
+    "-dBATCH" "-dGraphicsAlphaBits=4" "-dQUIET")
   "A list of options to give to ghostscript."
   :type '(repeat string)
   :group 'doc-view)
 
+(defcustom doc-view-resolution 100
+  "Dots per inch resolution used to render the documents.
+Higher values result in larger images."
+  :type 'number
+  :group 'doc-view)
+
 (defcustom doc-view-dvipdfm-program (executable-find "dvipdfm")
   "Program to convert DVI files to PDF.
 
@@ -203,8 +234,12 @@ has finished."
 
 (defvar doc-view-current-image nil
   "Only used internally.")
-(defvar doc-view-current-overlay)
-(defvar doc-view-pending-cache-flush nil)
+
+(defvar doc-view-current-overlay nil
+  "Only used internally.")
+
+(defvar doc-view-pending-cache-flush nil
+  "Only used internally.")
 
 (defvar doc-view-current-info nil
   "Only used internally.")
@@ -229,6 +264,9 @@ has finished."
     (define-key map (kbd "M-<")       'doc-view-first-page)
     (define-key map (kbd "M->")       'doc-view-last-page)
     (define-key map [remap goto-line] 'doc-view-goto-page)
+    ;; Zoom in/out.
+    (define-key map "+"               'doc-view-enlarge)
+    (define-key map "-"               'doc-view-shrink)
     ;; Killing/burying the buffer (and the process)
     (define-key map (kbd "q")         'bury-buffer)
     (define-key map (kbd "k")         'doc-view-kill-proc-and-buffer)
@@ -422,8 +460,40 @@ It's a subdirectory of `doc-view-cache-directory'."
       (when (not (funcall predicate item))
        (setq new-list (cons item new-list))))))
 
+;;;###autoload
+(defun doc-view-mode-p (type)
+  "Return non-nil if image type TYPE is available for `doc-view'.
+Image types are symbols like `dvi', `postscript' or `pdf'."
+  (and (display-graphic-p)
+       (image-type-available-p 'png)
+       (cond
+       ((eq type 'dvi)
+        (and (doc-view-mode-p 'pdf)
+             doc-view-dvipdfm-program
+             (executable-find doc-view-dvipdfm-program)))
+       ((or (eq type 'postscript) (eq type 'ps)
+            (eq type 'pdf))
+        (and doc-view-ghostscript-program
+             (executable-find doc-view-ghostscript-program)))
+       (t ;; unknown image type
+        nil))))
+
 ;;;; Conversion Functions
 
+(defvar doc-view-shrink-factor 1.125)
+
+(defun doc-view-enlarge (factor)
+  "Enlarge the document."
+  (interactive (list doc-view-shrink-factor))
+  (set (make-local-variable 'doc-view-resolution)
+       (* factor doc-view-resolution))
+  (doc-view-reconvert-doc))
+
+(defun doc-view-shrink (factor)
+  "Shrink the document."
+  (interactive (list doc-view-shrink-factor))
+  (doc-view-enlarge (/ 1.0 factor)))
+
 (defun doc-view-reconvert-doc ()
   "Reconvert the current document.
 Should be invoked when the cached images aren't up-to-date."
@@ -479,6 +549,7 @@ Should be invoked when the cached images aren't up-to-date."
               (append (list "pdf/ps->png" doc-view-conversion-buffer
                             doc-view-ghostscript-program)
                       doc-view-ghostscript-options
+                       (list (format "-r%d" (round doc-view-resolution)))
                       (list (concat "-sOutputFile=" png))
                       (list pdf-ps)))
        mode-line-process (list (format ":%s" doc-view-current-converter-process)))
@@ -738,7 +809,7 @@ the pagenumber and CONTEXTS are all lines of text containing a match."
   "Call `doc-view-search' for backward search.
 If prefix NEW-QUERY is given, ask for a new regexp."
   (interactive "P")
-  (doc-view-search arg t))
+  (doc-view-search new-query t))
 
 (defun doc-view-search (new-query &optional backward)
   "Jump to the next match or initiate a new search if NEW-QUERY is given.
@@ -746,7 +817,7 @@ If the current document hasn't been transformed to plain text
 till now do that first.
 If BACKWARD is non-nil, jump to the previous match."
   (interactive "P")
-  (if (and (not arg)
+  (if (and (not new-query)
           doc-view-current-search-matches)
       (if backward
          (doc-view-search-previous-match 1)
@@ -820,8 +891,7 @@ If BACKWARD is non-nil, jump to the previous match."
 
 (defun doc-view-initiate-display ()
   ;; Switch to image display if possible
-  (if (and (display-images-p)
-          (image-type-available-p 'png))
+  (if (doc-view-mode-p (intern (file-name-extension buffer-file-name)))
       (progn
        (doc-view-buffer-message)
        (setq doc-view-current-page (or doc-view-current-page 1))
@@ -838,8 +908,9 @@ If BACKWARD is non-nil, jump to the previous match."
     (message
      "%s"
      (substitute-command-keys
-      (concat "No image (png) support available.  Type \\[doc-view-toggle-display] "
-             "to switch to an editing mode.")))))
+      (concat "No image (png) support available or some conversion utility for "
+             (file-name-extension buffer-file-name)" files is missing.  "
+             "Type \\[doc-view-toggle-display] to switch to an editing mode.")))))
 
 ;;;###autoload
 (defun doc-view-mode ()
index c66cbc7933a54462f3a993ee5e4d643a90f48777..780fdd425a352b14bfc4f31dc95349d53260befc 100644 (file)
@@ -29,6 +29,9 @@
 
 ;;; Code:
 
+(declare-function int86 "dosfns.c")
+(declare-function msdos-long-file-names "msdos.c")
+
 ;; This overrides a trivial definition in files.el.
 (defun convert-standard-filename (filename)
   "Convert a standard file's name to something suitable for the current OS.
index 28cab4ccbcb80ea162d361f16705dbbb132d769d..878e5c5818958d89c5a2d2176a033a1df6148d9f 100644 (file)
@@ -370,6 +370,8 @@ filesystem mounted on drive Z:, FILESYSTEM could be \"Z:\"."
 
 (defvar printer-name)
 
+(declare-function default-printer-name "w32fns.c")
+
 (defun direct-print-region-function (start end
                                           &optional lpr-prog
                                           delete-text buf display
index 06d7b60344010e61536e79dc29fac4255a2877f8..1b51b440f05d4457b327569bcd2d797f5350cd65 100644 (file)
@@ -35,9 +35,9 @@
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-util)
-       (load "ediff-util.el" nil nil 'nosuffix))
+       (load "ediff-util.el" nil t 'nosuffix))
     ))
 ;; end pacifier
 
@@ -343,6 +343,7 @@ one optional arguments, diff-number to refine.")
            (get-buffer-create (ediff-unique-buffer-name
                                "*ediff-errors" "*"))))
   (ediff-with-current-buffer ediff-error-buffer
+    (setq buffer-undo-list t)
     (erase-buffer)
     (insert (ediff-with-current-buffer diff-buff (buffer-string)))
     (goto-char (point-min))
index 0c37be313723dfa4a5ca64eaadde6755c3204061..833260db673a1706bf984659c182c31baa19f7a2 100644 (file)
@@ -33,7 +33,7 @@
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     ))
 ;; end pacifier
 
index dd69b52b022956ad0c1976f4d083076237ba3b8a..b46562b5fdefc79cf7d6fcf2403c159f6a529a4b 100644 (file)
 (defvar ediff-multiframe)
 (defvar ediff-use-toolbar-p)
 (defvar mswindowsx-bitmap-file-path)
-
-(and noninteractive
-     (eval-when-compile
-        (load "ange-ftp" 'noerror)))
 ;; end pacifier
 
 ;; This is used to avoid compilation warnings. When emacs/xemacs forms can
index d9d19f176304ee5592b22276cd7740fba67bd096..95f3efca93b2b3104576a4b00cade74c393fad7f 100644 (file)
@@ -37,9 +37,9 @@
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-util)
-       (load "ediff-util.el" nil nil 'nosuffix))
+       (load "ediff-util.el" nil t 'nosuffix))
     ))
 ;; end pacifier
 
index 51502615cf77417f8946cf643a02485ec3e3547a..97c05e3b3cb1e8fdeab577197fe2a1aec2ddebb5 100644 (file)
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-util)
-       (load "ediff-util.el" nil nil 'nosuffix))
+       (load "ediff-util.el" nil t 'nosuffix))
     ))
 ;; end pacifier
 
index 2efa2ac3012f05dbc5c12ea07bf9b560a136c3fc..905a07c53dfa69af4bb31eeed924c0f07d30ffb8 100644 (file)
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-mult)
-       (load "ediff-mult.el" nil nil 'nosuffix))
+       (load "ediff-mult.el" nil t 'nosuffix))
     (or (featurep 'ediff)
-       (load "ediff.el" nil nil 'nosuffix))
+       (load "ediff.el" nil t 'nosuffix))
     ))
 ;; end pacifier
 
index 2ed8f73a2829d9ff0482c61100d206b77662b21c..a642167474cf0e88b174c2be8dae0e83d9d456c9 100644 (file)
 
 (defvar ediff-after-quit-hook-internal nil)
 
-(and noninteractive
-     (eval-when-compile
-        (load "reporter" 'noerror)))
-
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (provide 'ediff-util) ; to break recursive load cycle
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-help)
-       (load "ediff-help.el" nil nil 'nosuffix))
+       (load "ediff-help.el" nil t 'nosuffix))
     (or (featurep 'ediff-mult)
-       (load "ediff-mult.el" nil nil 'nosuffix))
+       (load "ediff-mult.el" nil t 'nosuffix))
     (or (featurep 'ediff-wind)
-       (load "ediff-wind.el" nil nil 'nosuffix))
+       (load "ediff-wind.el" nil t 'nosuffix))
     (or (featurep 'ediff-diff)
-       (load "ediff-diff.el" nil nil 'nosuffix))
+       (load "ediff-diff.el" nil t 'nosuffix))
     (or (featurep 'ediff-merg)
-       (load "ediff-merg.el" nil nil 'nosuffix))
+       (load "ediff-merg.el" nil t 'nosuffix))
     (or (featurep 'ediff)
-       (load "ediff.el" nil nil 'nosuffix))
+       (load "ediff.el" nil t 'nosuffix))
     (or (featurep 'ediff-tbar)
        (featurep 'emacs)
        (load "ediff-tbar.el" 'noerror nil 'nosuffix))
@@ -400,6 +396,9 @@ to invocation.")
       (setq ediff-error-buffer
            (get-buffer-create (ediff-unique-buffer-name "*ediff-errors" "*")))
 
+      (with-current-buffer ediff-error-buffer
+       (setq buffer-undo-list t))
+
       (ediff-with-current-buffer buffer-A (ediff-strip-mode-line-format))
       (ediff-with-current-buffer buffer-B (ediff-strip-mode-line-format))
       (if ediff-3way-job
@@ -2818,6 +2817,9 @@ up an appropriate window config."
    "To resume, type M-x eregistry and select the desired Ediff session"))
 
 
+;; ediff-barf-if-not-control-buffer ensures only called from ediff.
+(declare-function ediff-version "ediff" ())
+
 (defun ediff-status-info ()
   "Show the names of the buffers or files being operated on by Ediff.
 Hit \\[ediff-recenter] to reset the windows afterward."
index 293acc5a854d2e1754a12f481738cc0be7ab90c6..0fd06176b46cec09326b6a2a39bae68eb21f716e 100644 (file)
@@ -41,7 +41,7 @@
         (load "rcs" 'noerror)
         ;; (load "vc" 'noerror) ; this sometimes causes compiler error
         (or (featurep 'ediff-init)
-            (load "ediff-init.el" nil nil 'nosuffix))
+            (load "ediff-init.el" nil t 'nosuffix))
         )))
 ;; end pacifier
 
index 8b72a673d176d2edf40a24e84d8e874b7336ada0..e13d89ac6eb9318663f0fd75963372b1dc509ddb 100644 (file)
 (eval-when-compile
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-util)
-       (load "ediff-util.el" nil nil 'nosuffix))
+       (load "ediff-util.el" nil t 'nosuffix))
     (or (featurep 'ediff-help)
-       (load "ediff-help.el" nil nil 'nosuffix))
+       (load "ediff-help.el" nil t 'nosuffix))
     (or (featurep 'ediff-tbar)
        (featurep 'emacs)
        (load "ediff-tbar.el" 'noerror nil 'nosuffix))
@@ -77,7 +77,7 @@ Ediff provides a choice of three functions: `ediff-setup-windows-plain', for
 doing everything in one frame, `ediff-setup-windows-multiframe', which sets
 the control panel in a separate frame, and
 `ediff-setup-windows-automatic' (the default), which chooses an appropriate
-behaviour based on the current window system.  If the multiframe function
+behavior based on the current window system.  If the multiframe function
 detects that one of the buffers A/B is seen in some other frame, it will try
 to keep that buffer in that frame.
 
@@ -147,6 +147,10 @@ In this case, Ediff will use those frames to display these buffers."
   :type 'function
   :group 'ediff-window)
 
+;; Definitions hidden from the compiler by compat wrappers.
+(declare-function ediff-display-pixel-width "ediff-init")
+(declare-function ediff-display-pixel-height "ediff-init")
+
 (defconst ediff-control-frame-parameters
   (list
    '(name . "Ediff")
index a2aafc90292c51cb3759d1bd80d010d7590518ff..a53b93aee5bb863f17350978e817b218a17ad36f 100644 (file)
 (defvar ediff-last-dir-patch)
 (defvar ediff-patch-default-directory)
 
-(and noninteractive
-     (eval-when-compile
-        (load-library "dired")
-        (load-library "info")
-        (load "pcl-cvs" 'noerror)))
+
 (eval-when-compile
+  (and noninteractive
+       (load "dired" nil t))
   (let ((load-path (cons (expand-file-name ".") load-path)))
     (provide 'ediff) ; to break recursive load cycle
     (or (featurep 'ediff-init)
-       (load "ediff-init.el" nil nil 'nosuffix))
+       (load "ediff-init.el" nil t 'nosuffix))
     (or (featurep 'ediff-mult)
-       (load "ediff-mult.el" nil nil 'nosuffix))
+       (load "ediff-mult.el" nil t 'nosuffix))
     (or (featurep 'ediff-ptch)
-       (load "ediff-ptch.el" nil nil 'nosuffix))
+       (load "ediff-ptch.el" nil t 'nosuffix))
     (or (featurep 'ediff-vers)
-       (load "ediff-vers.el" nil nil 'nosuffix))
+       (load "ediff-vers.el" nil t 'nosuffix))
     ))
 ;; end pacifier
 
                 (list (cons 'ediff-job-name job-name))
                 merge-buffer-file)))
 
+(declare-function diff-latest-backup-file "diff" (fn))
 
 ;;;###autoload
 (defalias 'ediff 'ediff-files)
@@ -1424,9 +1423,11 @@ Uses `vc.el' or `rcs.el' depending on `ediff-version-control-package'."
 When called interactively, displays the version."
   (interactive)
   (if (interactive-p)
-      (message (ediff-version))
+      (message "%s" (ediff-version))
     (format "Ediff %s of %s" ediff-version ediff-date)))
 
+;; info is run first, and will autoload info.el.
+(declare-function Info-goto-node "info" (nodename &optional fork))
 
 ;;;###autoload
 (defun ediff-documentation (&optional node)
index 50d2f41f7aed9567618cb1479610081cd8576c01..486a02d2c6b11dbae9bcf837cdc7701946b2ea87 100644 (file)
@@ -418,24 +418,6 @@ author and what he did in hash table TABLE.  See the description of
          (nconc entry (list (cons action 1))))))))
 
 
-(defun authors-process-lines (program &rest args)
-  "Execute PROGRAM with ARGS, returning its output as a list of lines.
-Signal an error if the program returns with a non-zero exit status."
-  (with-temp-buffer
-    (let ((status (apply 'call-process program nil (current-buffer) nil args)))
-      (unless (eq status 0)
-       (error "%s exited with status %s" program status))
-      (goto-char (point-min))
-      (let (lines)
-       (while (not (eobp))
-         (setq lines (cons (buffer-substring-no-properties
-                            (line-beginning-position)
-                            (line-end-position))
-                           lines))
-         (forward-line 1))
-       (nreverse lines)))))
-
-
 (defun authors-canonical-author-name (author)
   "Return a canonicalized form of AUTHOR, an author name.
 If AUTHOR has an alias, use that.  Remove email addresses.  Capitalize
@@ -605,7 +587,7 @@ Result is a buffer *Authors* containing authorship information, and a
 buffer *Authors Errors* containing references to unknown files."
   (interactive "DEmacs source directory: ")
   (setq root (expand-file-name root))
-  (let ((logs (authors-process-lines "find" root "-name" "ChangeLog*"))
+  (let ((logs (process-lines "find" root "-name" "ChangeLog*"))
        (table (make-hash-table :test 'equal))
        (buffer-name "*Authors*")
        authors-checked-files-alist
@@ -617,7 +599,7 @@ buffer *Authors Errors* containing references to unknown files."
       (when (string-match "ChangeLog\\(.[0-9]+\\)?$" log)
        (message "Scanning %s..." log)
        (authors-scan-change-log log table)))
-    (let ((els (authors-process-lines "find" root "-name" "*.el")))
+    (let ((els (process-lines "find" root "-name" "*.el")))
       (dolist (file els)
        (message "Scanning %s..." file)
        (authors-scan-el file table)))
index a2a929d96011c4966e88762afe8b1fd16c4e9929..4940e2fd8c67a54fe59ec1eed778adc22b017341 100644 (file)
@@ -92,7 +92,7 @@ For example (backquote-list* 'a 'b 'c) => (a b . c)"
   "Symbol used to represent a splice inside a backquote.")
 
 ;;;###autoload
-(defmacro backquote (arg)
+(defmacro backquote (structure)
   "Argument STRUCTURE describes a template to build.
 
 The whole structure acts as if it were quoted except for certain
@@ -106,7 +106,7 @@ b              => (ba bb bc)                ; assume b has this value
 `(a ,@b c)     => (a ba bb bc c)       ; splice in the value of b
 
 Vectors work just like lists.  Nested backquotes are permitted."
-  (cdr (backquote-process arg)))
+  (cdr (backquote-process structure)))
 
 ;; GNU Emacs has no reader macros
 
index bc864aab490b0d52c48220df866bb139400e1b6b..eb8c80af145d6f70f91340504df9b301ecfd0313 100644 (file)
 ;;; Code:
 
 (require 'bytecomp)
+(eval-when-compile (require 'cl))
 
 (defun byte-compile-log-lap-1 (format &rest args)
   (if (aref byte-code-vector 0)
              ;; Isn't it an error for `string' not to be unibyte??  --stef
              (if (fboundp 'string-as-unibyte)
                  (setq string (string-as-unibyte string)))
+             ;; `byte-compile-splice-in-already-compiled-code'
+             ;; takes care of inlining the body.
              (cons `(lambda ,(aref fn 0)
                       (byte-code ,string ,(aref fn 2) ,(aref fn 3)))
                    (cdr form)))
 ;;
 ;; It is now safe to optimize code such that it introduces new bindings.
 
-;; I'd like this to be a defsubst, but let's not be self-referential...
-(defmacro byte-compile-trueconstp (form)
-  ;; Returns non-nil if FORM is a non-nil constant.
-  `(cond ((consp ,form) (eq (car ,form) 'quote))
-        ((not (symbolp ,form)))
-        ((eq ,form t))
-        ((keywordp ,form))))
+(defsubst byte-compile-trueconstp (form)
+  "Return non-nil if FORM always evaluates to a non-nil value."
+  (cond ((consp form)
+         (case (car form)
+           (quote (cadr form))
+           (progn (byte-compile-trueconstp (car (last (cdr form)))))))
+        ((not (symbolp form)))
+        ((eq form t))
+        ((keywordp form))))
+
+(defsubst byte-compile-nilconstp (form)
+  "Return non-nil if FORM always evaluates to a nil value."
+  (cond ((consp form)
+         (case (car form)
+           (quote (null (cadr form)))
+           (progn (byte-compile-nilconstp (car (last (cdr form)))))))
+        ((not (symbolp form)) nil)
+        ((null form))))
 
 ;; If the function is being called with constant numeric args,
 ;; evaluate as much as possible at compile-time.  This optimizer
     (setq rest form)
     (while (setq rest (cdr rest))
       (cond ((byte-compile-trueconstp (car-safe (car rest)))
-            (cond ((eq rest (cdr form))
-                   (setq form
-                         (if (cdr (car rest))
-                             (if (cdr (cdr (car rest)))
-                                 (cons 'progn (cdr (car rest)))
-                               (nth 1 (car rest)))
-                           (car (car rest)))))
+             ;; This branch will always be taken: kill the subsequent ones.
+            (cond ((eq rest (cdr form)) ;First branch of `cond'.
+                   (setq form `(progn ,@(car rest))))
                   ((cdr rest)
                    (setq form (copy-sequence form))
                    (setcdr (memq (car rest) form) nil)))
-            (setq rest nil)))))
+            (setq rest nil))
+            ((and (consp (car rest))
+                  (byte-compile-nilconstp (caar rest)))
+             ;; This branch will never be taken: kill its body.
+             (setcdr (car rest) nil)))))
   ;;
   ;; Turn (cond (( <x> )) ... ) into (or <x> (cond ... ))
   (if (eq 'cond (car-safe form))
                      (byte-optimize-if
                       `(if ,(car (last clause)) ,@(nthcdr 2 form)))))))
           ((byte-compile-trueconstp clause)
-          (nth 2 form))
-         ((null clause)
-          (if (nthcdr 4 form)
-              (cons 'progn (nthcdr 3 form))
-            (nth 3 form)))
+          `(progn ,clause ,(nth 2 form)))
+         ((byte-compile-nilconstp clause)
+           `(progn ,clause ,@(nthcdr 3 form)))
          ((nth 2 form)
           (if (equal '(nil) (nthcdr 3 form))
               (list 'if clause (nth 2 form))
index 27ee27eda92a34667b19330f12559b62170a5986..82866a07ff7de4c9dce1c0c2c87bfcb6b51604b8 100644 (file)
@@ -1053,6 +1053,9 @@ Each function's symbol gets added to `byte-compile-noruntime-functions'."
 (defun byte-compile-warning-series (&rest ignore)
   nil)
 
+;; (compile-mode) will cause this to be loaded.
+(declare-function compilation-forget-errors "compile" ())
+
 ;; Log the start of a file in *Compile-Log*, and mark it as done.
 ;; Return the position of the start of the page in the log buffer.
 ;; But do nothing in batch mode.
@@ -1258,7 +1261,7 @@ Each function's symbol gets added to `byte-compile-noruntime-functions'."
                  (byte-compile-fdefinition (car form) t)))
         (sig (if (and def (not (eq def t)))
                  (byte-compile-arglist-signature
-                  (if (eq 'lambda (car-safe def))
+                  (if (memq (car-safe def) '(declared lambda))
                       (nth 1 def)
                     (if (byte-code-function-p def)
                         (aref def 0)
@@ -2274,18 +2277,17 @@ list that represents a doc string reference.
     (byte-compile-nogroup-warn form))
   (when (byte-compile-warning-enabled-p 'free-vars)
     (push (nth 1 (nth 1 form)) byte-compile-bound-variables))
+  ;; Don't compile the expression because it may be displayed to the user.
+  ;; (when (eq (car-safe (nth 2 form)) 'quote)
+  ;;   ;; (nth 2 form) is meant to evaluate to an expression, so if we have the
+  ;;   ;; final value already, we can byte-compile it.
+  ;;   (setcar (cdr (nth 2 form))
+  ;;           (byte-compile-top-level (cadr (nth 2 form)) nil 'file)))
   (let ((tail (nthcdr 4 form)))
     (while tail
-      ;; If there are any (function (lambda ...)) expressions, compile
-      ;; those functions.
-      (if (and (consp (car tail))
-              (eq (car (car tail)) 'function)
-              (consp (nth 1 (car tail))))
-         (setcar tail (byte-compile-lambda (nth 1 (car tail))))
-       ;; Likewise for a bare lambda.
-       (if (and (consp (car tail))
-                (eq (car (car tail)) 'lambda))
-           (setcar tail (byte-compile-lambda (car tail)))))
+      (unless (keywordp (car tail))      ;No point optimizing keywords.
+        ;; Compile the keyword arguments.
+        (setcar tail (byte-compile-top-level (car tail) nil 'file)))
       (setq tail (cdr tail))))
   form)
 
@@ -2817,6 +2819,20 @@ If FORM is a lambda or a macro, byte-compile it as a function."
         (cdr body))
        (body
         (list body))))
+
+(put 'declare-function 'byte-hunk-handler 'byte-compile-declare-function)
+(defun byte-compile-declare-function (form)
+  (push (cons (nth 1 form)
+              (if (and (> (length form) 3)
+                       (listp (nth 3 form)))
+                  (list 'declared (nth 3 form))
+                t))                     ; arglist not specified
+        byte-compile-function-environment)
+  ;; We are stating that it _will_ be defined at runtime.
+  (setq byte-compile-noruntime-functions
+        (delq (nth 1 form) byte-compile-noruntime-functions))
+  nil)
+
 \f
 ;; This is the recursive entry point for compiling each subform of an
 ;; expression.
@@ -3496,12 +3512,12 @@ That command is designed for interactive use only" fn))
 
 ;; Return the list of items in CONDITION-PARAM that match PRED-LIST.
 ;; Only return items that are not in ONLY-IF-NOT-PRESENT.
-(defun byte-compile-find-bound-condition (condition-param 
-                                         pred-list 
+(defun byte-compile-find-bound-condition (condition-param
+                                         pred-list
                                          &optional only-if-not-present)
   (let ((result nil)
        (nth-one nil)
-       (cond-list 
+       (cond-list
         (if (memq (car-safe condition-param) pred-list)
             ;; The condition appears by itself.
             (list condition-param)
@@ -3509,7 +3525,7 @@ That command is designed for interactive use only" fn))
           ;; `and' arguments.
           (when (eq 'and (car-safe condition-param))
             (cdr condition-param)))))
-    
+
     (dolist (crt cond-list)
       (when (and (memq (car-safe crt) pred-list)
                 (eq 'quote (car-safe (setq nth-one (nth 1 crt))))
@@ -3531,10 +3547,10 @@ being undefined will be suppressed.
 If CONDITION's value is (not (featurep 'emacs)) or (featurep 'xemacs),
 that suppresses all warnings during execution of BODY."
   (declare (indent 1) (debug t))
-  `(let* ((fbound-list (byte-compile-find-bound-condition 
-                       ,condition (list 'fboundp) 
+  `(let* ((fbound-list (byte-compile-find-bound-condition
+                       ,condition (list 'fboundp)
                        byte-compile-unresolved-functions))
-         (bound-list (byte-compile-find-bound-condition 
+         (bound-list (byte-compile-find-bound-condition
                       ,condition (list 'boundp 'default-boundp)))
          ;; Maybe add to the bound list.
          (byte-compile-bound-variables
@@ -4264,7 +4280,7 @@ Must be used only with `-batch', and kills Emacs on completion.
 For example, invoke `emacs -batch -f batch-byte-recompile-directory .'.
 
 Optional argument ARG is passed as second argument ARG to
-`batch-recompile-directory'; see there for its possible values
+`byte-recompile-directory'; see there for its possible values
 and corresponding effects."
   ;; command-line-args-left is what is left of the command line (startup.el)
   (defvar command-line-args-left)      ;Avoid 'free variable' warning
diff --git a/lisp/emacs-lisp/check-declare.el b/lisp/emacs-lisp/check-declare.el
new file mode 100644 (file)
index 0000000..9fc8a9e
--- /dev/null
@@ -0,0 +1,311 @@
+;;; check-declare.el --- Check declare-function statements
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Glenn Morris <rgm@gnu.org>
+;; Keywords: lisp, tools, maint
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The byte-compiler often warns about undefined functions that you
+;; know will actually be defined when it matters.  The `declare-function'
+;; statement allows you to suppress these warnings.  This package
+;; checks that all such statements in a file or directory are accurate.
+;; The entry points are `check-declare-file' and `check-declare-directory'.
+
+;; For more information, see Info node `elisp(Declaring Functions)'.
+
+;;; TODO:
+
+;;; Code:
+
+(defconst check-declare-warning-buffer "*Check Declarations Warnings*"
+  "Name of buffer used to display any `check-declare' warnings.")
+
+(defun check-declare-locate (file basefile)
+  "Return the full path of FILE.
+Expands files with a \".c\" extension relative to the Emacs
+\"src/\" directory.  Otherwise, `locate-library' searches for FILE.
+If that fails, expands FILE relative to BASEFILE's directory part.
+The returned file might not exist.  If FILE has an \"ext:\" prefix, so does
+the result."
+  (let ((ext (string-match "^ext:" file))
+        tfile)
+    (if ext
+        (setq file (substring file 4)))
+    (setq file
+          (if (string-equal "c" (file-name-extension file))
+              (expand-file-name file (expand-file-name "src" source-directory))
+            (if (setq tfile (locate-library (file-name-nondirectory file)))
+                (progn
+                  (setq tfile
+                        (replace-regexp-in-string "\\.elc\\'" ".el" tfile))
+                  (if (and (not (file-exists-p tfile))
+                           (file-exists-p (concat tfile ".gz")))
+                      (concat tfile ".gz")
+                    tfile))
+              (setq tfile (expand-file-name file
+                                            (file-name-directory basefile)))
+              (if (or (file-exists-p tfile)
+                      (string-match "\\.el\\'" tfile))
+                  tfile
+                (concat tfile ".el")))))
+    (if ext (concat "ext:" file)
+      file)))
+
+(defun check-declare-scan (file)
+  "Scan FILE for `declare-function' calls.
+Return a list with elements of the form (FNFILE FN ARGLIST FILEONLY),
+where only the first two elements need be present.  This claims that FNFILE
+defines FN, with ARGLIST.  FILEONLY non-nil means only check that FNFILE
+exists, not that it defines FN.  This is for function definitions that we
+don't know how to recognize (e.g. some macros)."
+  (let ((m (format "Scanning %s..." file))
+        alist fnfile fn arglist fileonly)
+    (message "%s" m)
+    (with-temp-buffer
+      (insert-file-contents file)
+      (while (re-search-forward
+              "^[ \t]*(declare-function[ \t]+\\(\\S-+\\)[ \t]+\
+\"\\(\\S-+\\)\"" nil t)
+        (setq fn (match-string 1)
+              fnfile (match-string 2)
+              fnfile (check-declare-locate fnfile (expand-file-name file))
+              arglist (progn
+                        (skip-chars-forward " \t\n")
+                        ;; Use `t' to distinguish no arglist
+                        ;; specified from an empty one.
+                        (if (looking-at "\\((\\|nil\\|t\\)")
+                            (read (current-buffer))
+                          t))
+              fileonly (progn
+                        (skip-chars-forward " \t\n")
+                        (if (looking-at "\\(t\\|'\\sw+\\)")
+                            (match-string 1)))
+              alist (cons (list fnfile fn arglist fileonly) alist))))
+    (message "%sdone" m)
+    alist))
+
+(defun check-declare-errmsg (errlist &optional full)
+  "Return a string with the number of errors in ERRLIST, if any.
+Normally just counts the number of elements in ERRLIST.
+With optional argument FULL, sums the number of elements in each element."
+  (if errlist
+      (let ((l (length errlist)))
+        (when full
+          (setq l 0)
+          (dolist (e errlist)
+            (setq l (1+ l))))
+        (format "%d problem%s found" l (if (= l 1) "" "s")))
+    "OK"))
+
+(autoload 'byte-compile-arglist-signature "bytecomp")
+
+(defun check-declare-verify (fnfile fnlist)
+  "Check that FNFILE contains function definitions matching FNLIST.
+Each element of FNLIST has the form (FILE FN ARGLIST FILEONLY), where
+only the first two elements need be present.  This means FILE claimed FN
+was defined in FNFILE with the specified ARGLIST.  FILEONLY non-nil means
+to only check that FNFILE exists, not that it actually defines FN.
+
+Returns nil if all claims are found to be true, otherwise a list
+of errors with elements of the form \(FILE FN TYPE), where TYPE
+is a string giving details of the error."
+  (let ((m (format "Checking %s..." fnfile))
+        (cflag (string-equal "c" (file-name-extension fnfile)))
+        (ext (string-match "^ext:" fnfile))
+        re fn sig siglist arglist type errlist minargs maxargs)
+    (message "%s" m)
+    (if ext
+        (setq fnfile (substring fnfile 4)))
+    (if (file-exists-p fnfile)
+        (with-temp-buffer
+          (insert-file-contents fnfile)
+          ;; defsubst's don't _have_ to be known at compile time.
+          (setq re (format (if cflag
+                               "^[ \t]*\\(DEFUN\\)[ \t]*([ \t]*\"%s\""
+                             "^[ \t]*(\\(fset[ \t]+'\\|def\\(?:un\\|subst\\|\
+ine-\\(?:derived\\|generic\\|\\(?:global\\(?:ized\\)?-\\)?minor\\)-mode\
+\\|\\(?:ine-obsolete-function-\\)?alias[ \t]+'\\)\\)\
+\[ \t]*%s\\([ \t;]+\\|$\\)")
+                           (regexp-opt (mapcar 'cadr fnlist) t)))
+          (while (re-search-forward re nil t)
+            (skip-chars-forward " \t\n")
+            (setq fn (match-string 2)
+                  type (match-string 1)
+                  ;; (min . max) for a fixed number of arguments, or
+                  ;; arglists with optional elements.
+                  ;; (min) for arglists with &rest.
+                  ;; sig = 'err means we could not find an arglist.
+                  sig (cond (cflag
+                             (or
+                              (when (re-search-forward "," nil t 3)
+                                (skip-chars-forward " \t\n")
+                                ;; Assuming minargs and maxargs on same line.
+                                (when (looking-at "\\([0-9]+\\)[ \t]*,[ \t]*\
+\\([0-9]+\\|MANY\\|UNEVALLED\\)")
+                                  (setq minargs (string-to-number
+                                                 (match-string 1))
+                                        maxargs (match-string 2))
+                                  (cons minargs (unless (string-match "[^0-9]"
+                                                                      maxargs)
+                                                 (string-to-number
+                                                  maxargs)))))
+                              'err))
+                            ((string-match
+                              "\\`define-\\(derived\\|generic\\)-mode\\'"
+                              type)
+                             '(0 . 0))
+                            ((string-match
+                              "\\`define\\(-global\\(ized\\)?\\)?-minor-mode\\'"
+                              type)
+                             '(0 . 1))
+                            ;; Prompt to update.
+                            ((string-match
+                              "\\`define-obsolete-function-alias\\>"
+                              type)
+                             'obsolete)
+                            ;; Can't easily check arguments in these cases.
+                            ((string-match "\\`\\(defalias\\|fset\\)\\>" type)
+                             t)
+                            ((looking-at "\\((\\|nil\\)")
+                             (byte-compile-arglist-signature
+                              (read (current-buffer))))
+                            (t
+                             'err))
+                  ;; alist of functions and arglist signatures.
+                  siglist (cons (cons fn sig) siglist)))))
+    (dolist (e fnlist)
+      (setq arglist (nth 2 e)
+            type
+            (if (not re)
+                "file not found"
+              (if (not (setq sig (assoc (cadr e) siglist)))
+                  (unless (nth 3 e)     ; fileonly
+                    "function not found")
+                (setq sig (cdr sig))
+                (cond ((eq sig 'obsolete) ; check even when no arglist specified
+                       "obsolete alias")
+                      ;; arglist t means no arglist specified, as
+                      ;; opposed to an empty arglist.
+                      ((eq arglist t) nil)
+                      ((eq sig t) nil) ; eg defalias - can't check arguments
+                      ((eq sig 'err)
+                       "arglist not found") ; internal error
+                      ((not (equal (byte-compile-arglist-signature
+                                    arglist)
+                                   sig))
+                       "arglist mismatch")))))
+      (when type
+        (setq errlist (cons (list (car e) (cadr e) type) errlist))))
+    (message "%s%s" m
+             (if (or re (not ext))
+                 (check-declare-errmsg errlist)
+               (progn
+                 (setq errlist nil)
+                 "skipping external file")))
+    errlist))
+
+(defun check-declare-sort (alist)
+  "Sort a list with elements FILE (FNFILE ...).
+Returned list has elements FNFILE (FILE ...)."
+  (let (file fnfile rest sort a)
+    (dolist (e alist)
+      (setq file (car e))
+      (dolist (f (cdr e))
+        (setq fnfile (car f)
+              rest (cdr f))
+        (if (setq a (assoc fnfile sort))
+            (setcdr a (append (cdr a) (list (cons file rest))))
+          (setq sort (cons (list fnfile (cons file rest)) sort)))))
+    sort))
+
+(defun check-declare-warn (file fn fnfile type)
+  "Warn that FILE made a false claim about FN in FNFILE.
+TYPE is a string giving the nature of the error.  Warning is displayed in
+`check-declare-warning-buffer'."
+  (display-warning 'check-declare
+                   (format "%s said `%s' was defined in %s: %s"
+                           (file-name-nondirectory file) fn
+                           (file-name-nondirectory fnfile)
+                           type)
+                   nil check-declare-warning-buffer))
+
+(defun check-declare-files (&rest files)
+  "Check veracity of all `declare-function' statements in FILES.
+Return a list of any errors found."
+  (let (alist err errlist)
+    (dolist (file files)
+      (setq alist (cons (cons file (check-declare-scan file)) alist)))
+    ;; Sort so that things are ordered by the files supposed to
+    ;; contain the defuns.
+    (dolist (e (check-declare-sort alist))
+      (if (setq err (check-declare-verify (car e) (cdr e)))
+          (setq errlist (cons (cons (car e) err) errlist))))
+    (if (get-buffer check-declare-warning-buffer)
+        (kill-buffer check-declare-warning-buffer))
+    ;; Sort back again so that errors are ordered by the files
+    ;; containing the declare-function statements.
+    (dolist (e (check-declare-sort errlist))
+        (dolist (f (cdr e))
+          (check-declare-warn (car e) (cadr f) (car f) (nth 2 f))))
+    errlist))
+
+;;;###autoload
+(defun check-declare-file (file)
+  "Check veracity of all `declare-function' statements in FILE.
+See `check-declare-directory' for more information."
+  (interactive "fFile to check: ")
+  (or (file-exists-p file)
+      (error "File `%s' not found" file))
+  (let ((m (format "Checking %s..." file))
+        errlist)
+    (message "%s" m)
+    (setq errlist (check-declare-files file))
+    (message "%s%s" m (check-declare-errmsg errlist))
+    errlist))
+
+;;;###autoload
+(defun check-declare-directory (root)
+  "Check veracity of all `declare-function' statements under directory ROOT.
+Returns non-nil if any false statements are found.  For this to
+work correctly, the statements must adhere to the format
+described in the documentation of `declare-function'."
+  (interactive "DDirectory to check: ")
+  (or (file-directory-p (setq root (expand-file-name root)))
+      (error "Directory `%s' not found" root))
+  (let ((m "Checking `declare-function' statements...")
+        (m2 "Finding files with declarations...")
+        errlist files)
+    (message "%s" m)
+    (message "%s" m2)
+    (setq files (process-lines "find" root "-name" "*.el"
+                                 "-exec" "grep" "-l"
+                                 "^[   ]*(declare-function" "{}" ";"))
+    (message "%s%d found" m2 (length files))
+    (when files
+      (setq errlist (apply 'check-declare-files files))
+      (message "%s%s" m (check-declare-errmsg errlist t))
+      errlist)))
+
+(provide 'check-declare)
+
+;; arch-tag: a4d6cdc4-deb7-4502-b327-0e4ef3d82d96
+;;; check-declare.el ends here.
index b802d8acd43c19d5ae1bfd229b61a73e5816dcd0..d6c23de0be81fbb2086c99b3b3b2d7697eb8c758 100644 (file)
@@ -116,10 +116,15 @@ whenever this expression's value is non-nil.
 INCLUDE is an expression; this item is only visible if this
 expression has a non-nil value.  `:included' is an alias for `:visible'.
 
+   :label FORM
+
+FORM is an expression that will be dynamically evaluated and whose
+value will be used for the menu entry's text label (the default is NAME).
+
    :suffix FORM
 
 FORM is an expression that will be dynamically evaluated and whose
-value will be concatenated to the menu entry's NAME.
+value will be concatenated to the menu entry's label.
 
    :style STYLE
 
index b3c7c339030daff2647eae56d6803fc273bc0a38..24e26827f7cd5f67e8aa5b2143505eae83217531 100644 (file)
@@ -149,10 +149,14 @@ See the functions `find-function' and `find-variable'."
   ;; the same name.
   (if (string-match "\\.el\\(c\\(\\..*\\)?\\)\\'" library)
       (setq library (replace-match "" t t library)))
-  (or (locate-file library
-                  (or find-function-source-path load-path)
-                  (append (find-library-suffixes) load-file-rep-suffixes))
-      (error "Can't find library %s" library)))
+  (or 
+   (locate-file library
+               (or find-function-source-path load-path)
+               (find-library-suffixes))
+   (locate-file library
+               (or find-function-source-path load-path)
+               load-file-rep-suffixes)
+   (error "Can't find library %s" library)))
 
 (defvar find-function-C-source-directory
   (let ((dir (expand-file-name "src" source-directory)))
index 9e0795c88220c26d6155d46fc481eabcf0b44e92..5ff2b8f564cca10380dd2df19a6922222f0219b7 100644 (file)
@@ -78,6 +78,9 @@ Thanks.")
   :type 'string
   :group 'gulp)
 
+(declare-function mail-subject "sendmail" ())
+(declare-function mail-send "sendmail" ())
+
 (defun gulp-send-requests (dir &optional time)
   "Send requests for updates to the authors of Lisp packages in directory DIR.
 For each maintainer, the message consists of `gulp-request-header',
index 788be284cdaf59d96809da20d0935adc8ebfced2..65bbade816e732d8e9e185b967eb95f2d39b3d94 100644 (file)
@@ -175,9 +175,10 @@ normal recipe (see `beginning-of-defun').  Major modes can define this
 if defining `defun-prompt-regexp' is not sufficient to handle the mode's
 needs.
 
-The function (of no args) should go to the line on which the current
-defun starts, and return non-nil, or should return nil if it can't
-find the beginning.")
+The function takes the same argument as `beginning-of-defun' and should
+behave similarly, returning non-nil if it found the beginning of a defun.
+Ideally it should move to a point right before an open-paren which encloses
+the body of the defun.")
 
 (defun beginning-of-defun (&optional arg)
   "Move backward to the beginning of a defun.
@@ -218,12 +219,22 @@ is called as a function to find the defun's beginning."
   (unless arg (setq arg 1))
   (cond
    (beginning-of-defun-function
-    (if (> arg 0)
-       (dotimes (i arg)
-         (funcall beginning-of-defun-function))
-      ;; Better not call end-of-defun-function directly, in case
-      ;; it's not defined.
-      (end-of-defun (- arg))))
+    (condition-case nil
+        (funcall beginning-of-defun-function arg)
+      ;; We used to define beginning-of-defun-function as taking no argument
+      ;; but that makes it impossible to implement correct forward motion:
+      ;; we used to use end-of-defun for that, but it's not supposed to do
+      ;; the same thing (it moves to the end of a defun not to the beginning
+      ;; of the next).
+      ;; In case the beginning-of-defun-function uses the old calling
+      ;; convention, fallback on the old implementation.
+      (wrong-number-of-arguments
+       (if (> arg 0)
+           (dotimes (i arg)
+             (funcall beginning-of-defun-function))
+         ;; Better not call end-of-defun-function directly, in case
+         ;; it's not defined.
+         (end-of-defun (- arg))))))
 
    ((or defun-prompt-regexp open-paren-in-column-0-is-defun-start)
     (and (< arg 0) (not (eobp)) (forward-char 1))
@@ -286,11 +297,11 @@ is called as a function to find the defun's beginning."
             (goto-char (if arg-+ve floor ceiling))
             nil))))))))
 
-(defvar end-of-defun-function nil
-  "If non-nil, function for function `end-of-defun' to call.
-This is used to find the end of the defun instead of using the normal
-recipe (see `end-of-defun').  Major modes can define this if the
-normal method is not appropriate.")
+(defvar end-of-defun-function #'forward-sexp
+  "Function for `end-of-defun' to call.
+This is used to find the end of the defun.
+It is called with no argument, right after calling `beginning-of-defun-raw'.
+So the function can assume that point is at the beginning of the defun body.")
 
 (defun buffer-end (arg)
   "Return the \"far end\" position of the buffer, in direction ARG.
@@ -315,45 +326,38 @@ is called as a function to find the defun's end."
       (and transient-mark-mode mark-active)
       (push-mark))
   (if (or (null arg) (= arg 0)) (setq arg 1))
-  (if end-of-defun-function
-      (if (> arg 0)
-         (dotimes (i arg)
-           (funcall end-of-defun-function))
-       ;; Better not call beginning-of-defun-function
-       ;; directly, in case it's not defined.
-       (beginning-of-defun (- arg)))
-    (let ((first t))
-      (while (and (> arg 0) (< (point) (point-max)))
-       (let ((pos (point)))
-         (while (progn
-                  (if (and first
-                           (progn
-                             (end-of-line 1)
-                             (beginning-of-defun-raw 1)))
-                      nil
-                    (or (bobp) (forward-char -1))
-                    (beginning-of-defun-raw -1))
-                  (setq first nil)
-                  (forward-list 1)
-                  (skip-chars-forward " \t")
-                  (if (looking-at "\\s<\\|\n")
-                      (forward-line 1))
-                  (<= (point) pos))))
-       (setq arg (1- arg)))
-      (while (< arg 0)
-       (let ((pos (point)))
-         (beginning-of-defun-raw 1)
-         (forward-sexp 1)
-         (forward-line 1)
-         (if (>= (point) pos)
-             (if (beginning-of-defun-raw 2)
-                 (progn
-                   (forward-list 1)
-                   (skip-chars-forward " \t")
-                   (if (looking-at "\\s<\\|\n")
-                       (forward-line 1)))
-               (goto-char (point-min)))))
-       (setq arg (1+ arg))))))
+  (while (> arg 0)
+    (let ((pos (point)))
+      (end-of-line 1)
+      (beginning-of-defun-raw 1)
+      (while (unless (eobp)
+               (funcall end-of-defun-function)
+               (skip-chars-forward " \t")
+               (if (looking-at "\\s<\\|\n")
+                   (forward-line 1))
+               ;; If we started after the end of the previous function, then
+               ;; try again with the next one.
+               (when (<= (point) pos)
+                 (or (bobp) (forward-char -1))
+                 (beginning-of-defun-raw -1)
+                 'try-again))))
+    (setq arg (1- arg)))
+  (while (< arg 0)
+    (let ((pos (point)))
+      (while (unless (bobp)
+               (beginning-of-line 1)
+               (beginning-of-defun-raw 1)
+               (let ((beg (point)))
+                 (funcall end-of-defun-function)
+                 (skip-chars-forward " \t")
+                 (if (looking-at "\\s<\\|\n")
+                     (forward-line 1))
+                 ;; If we started from within the function just found, then
+                 ;; try again with the previous one.
+                 (when (>= (point) pos)
+                   (goto-char beg)
+                   'try-again)))))
+    (setq arg (1+ arg))))
 
 (defun mark-defun (&optional allow-extend)
   "Put mark at end of this defun, point at beginning.
@@ -562,12 +566,47 @@ character."
                ;; "Unbalanced parentheses", but those may not be so
                ;; accurate/helpful, e.g. quotes may actually be
                ;; mismatched.
-               (error "Unmatched bracket or quote"))
-    (error (cond ((eq 'scan-error (car data))
-                 (goto-char (nth 2 data))
-                 (error "Unmatched bracket or quote"))
-                (t (signal (car data) (cdr data)))))))
+               (error "Unmatched bracket or quote"))))
 \f
+(defun field-complete (table &optional predicate)
+  (let* ((pattern (field-string-no-properties))
+         (completion (try-completion pattern table predicate)))
+    (cond ((eq completion t))
+          ((null completion)
+           (message "Can't find completion for \"%s\"" pattern)
+           (ding))
+          ((not (string= pattern completion))
+           (delete-region (field-beginning) (field-end))
+           (insert completion)
+           ;; Don't leave around a completions buffer that's out of date.
+           (let ((win (get-buffer-window "*Completions*" 0)))
+             (if win (with-selected-window win (bury-buffer)))))
+          (t
+           (let ((minibuf-is-in-use
+                  (eq (minibuffer-window) (selected-window))))
+             (unless minibuf-is-in-use
+               (message "Making completion list..."))
+             (let ((list (all-completions pattern table predicate)))
+               (setq list (sort list 'string<))
+               (or (eq predicate 'fboundp)
+                   (let (new)
+                     (while list
+                       (setq new (cons (if (fboundp (intern (car list)))
+                                           (list (car list) " <f>")
+                                         (car list))
+                                       new))
+                       (setq list (cdr list)))
+                     (setq list (nreverse new))))
+               (if (> (length list) 1)
+                   (with-output-to-temp-buffer "*Completions*"
+                     (display-completion-list list pattern))
+                 ;; Don't leave around a completions buffer that's
+                 ;; out of date.
+                 (let ((win (get-buffer-window "*Completions*" 0)))
+                   (if win (with-selected-window win (bury-buffer))))))
+             (unless minibuf-is-in-use
+               (message "Making completion list...%s" "done")))))))
+
 (defun lisp-complete-symbol (&optional predicate)
   "Perform completion on Lisp symbol preceding point.
 Compare that symbol against the known Lisp symbols.
index 93cf434292a31983e97969450a0f680514055f65..d9ce48e23a6601ed30b01e6a667d0b376d67aaa5 100644 (file)
@@ -51,8 +51,8 @@
 (defun ring-p (x)
   "Return t if X is a ring; nil otherwise."
   (and (consp x) (integerp (car x))
-       (consp (cdr x)) (integerp (car (cdr x)))
-       (vectorp (cdr (cdr x)))))
+       (consp (cdr x)) (integerp (cadr x))
+       (vectorp (cddr x))))
 
 ;;;###autoload
 (defun make-ring (size)
   (cons 0 (cons 0 (make-vector size nil))))
 
 (defun ring-insert-at-beginning (ring item)
-  "Add to RING the item ITEM.  Add it at the front, as the oldest item."
-  (let* ((vec (cdr (cdr ring)))
+  "Add to RING the item ITEM, at the front, as the oldest item."
+  (let* ((vec (cddr ring))
          (veclen (length vec))
          (hd (car ring))
-         (ln (car (cdr ring))))
+         (ln (cadr ring)))
     (setq ln (min veclen (1+ ln))
           hd (ring-minus1 hd veclen))
     (aset vec hd item)
 
 (defun ring-plus1 (index veclen)
   "Return INDEX+1, with wraparound."
-  (let ((new-index (+ index 1)))
+  (let ((new-index (1+ index)))
     (if (= new-index veclen) 0 new-index)))
 
 (defun ring-minus1 (index veclen)
   "Return INDEX-1, with wraparound."
-  (- (if (= 0 index) veclen index) 1))
+  (- (if (zerop index) veclen index) 1))
 
 (defun ring-length (ring)
   "Return the number of elements in the RING."
-  (car (cdr ring)))
+  (cadr ring))
 
 (defun ring-index (index head ringlen veclen)
   "Convert nominal ring index INDEX to an internal index.
@@ -95,26 +95,26 @@ VECLEN is the size of the vector in the ring."
 
 (defun ring-empty-p (ring)
   "Return t if RING is empty; nil otherwise."
-  (zerop (car (cdr ring))))
+  (zerop (cadr ring)))
 
 (defun ring-size (ring)
   "Return the size of RING, the maximum number of elements it can contain."
-  (length (cdr (cdr ring))))
+  (length (cddr ring)))
 
 (defun ring-copy (ring)
   "Return a copy of RING."
-  (let* ((vec (cdr (cdr ring)))
-        (hd  (car ring))
-        (ln  (car (cdr ring))))
+  (let ((vec (cddr ring))
+       (hd  (car ring))
+       (ln  (cadr ring)))
     (cons hd (cons ln (copy-sequence vec)))))
 
 (defun ring-insert (ring item)
   "Insert onto ring RING the item ITEM, as the newest (last) item.
 If the ring is full, dump the oldest item to make room."
-  (let* ((vec (cdr (cdr ring)))
+  (let* ((vec (cddr ring))
          (veclen (length vec))
          (hd (car ring))
-         (ln (car (cdr ring))))
+         (ln (cadr ring)))
     (prog1
         (aset vec (mod (+ hd ln) veclen) item)
       (if (= ln veclen)
@@ -128,13 +128,13 @@ numeric, remove the element indexed."
   (if (ring-empty-p ring)
       (error "Ring empty")
     (let* ((hd (car ring))
-           (ln (car (cdr ring)))
-           (vec (cdr (cdr ring)))
+           (ln (cadr ring))
+           (vec (cddr ring))
            (veclen (length vec))
            (tl (mod (1- (+ hd ln)) veclen))
            oldelt)
-      (if (null index)
-          (setq index (1- ln)))
+      (when (null index)
+       (setq index (1- ln)))
       (setq index (ring-index index hd ln veclen))
       (setq oldelt (aref vec index))
       (while (/= index tl)
@@ -152,7 +152,9 @@ INDEX need not be <= the ring length; the appropriate modulo operation
 will be performed."
   (if (ring-empty-p ring)
       (error "Accessing an empty ring")
-    (let* ((hd (car ring))  (ln (car (cdr ring)))  (vec (cdr (cdr ring))))
+    (let ((hd (car ring))
+         (ln (cadr ring))
+         (vec (cddr ring)))
       (aref vec (ring-index index hd ln (length vec))))))
 
 (defun ring-elements (ring)
@@ -165,15 +167,12 @@ will be performed."
       (push (aref vect (mod (+ start var) size)) lst))))
 
 (defun ring-member (ring item)
-  "Return index of ITEM if on RING, else nil.  Comparison via `equal'.
-The index is 0-based."
-  (let ((ind 0)
-        (len (1- (ring-length ring)))
-        (memberp nil))
-    (while (and (<= ind len)
-                (not (setq memberp (equal item (ring-ref ring ind)))))
-      (setq ind (1+ ind)))
-    (and memberp ind)))
+  "Return index of ITEM if on RING, else nil.
+Comparison is done via `equal'.  The index is 0-based."
+  (catch 'found
+    (dotimes (ind (ring-length ring) nil)
+      (when (equal item (ring-ref ring ind))
+       (throw 'found ind)))))
 
 (defun ring-next (ring item)
   "Return the next item in the RING, after ITEM.
@@ -190,12 +189,12 @@ Raise error if ITEM is not in the RING."
     (ring-ref ring (ring-minus1 curr-index (ring-length ring)))))
 
 (defun ring-insert+extend (ring item &optional grow-p)
-  "Like ring-insert, but if GROW-P is non-nil, then enlarge ring.
+  "Like `ring-insert', but if GROW-P is non-nil, then enlarge ring.
 Insert onto ring RING the item ITEM, as the newest (last) item.
 If the ring is full, behavior depends on GROW-P:
   If GROW-P is non-nil, enlarge the ring to accommodate the new item.
   If GROW-P is nil, dump the oldest item to make room for the new."
-  (let* ((vec (cdr (cdr ring)))
+  (let* ((vec (cddr ring))
         (veclen (length vec))
         (hd (car ring))
         (ringlen (ring-length ring)))
@@ -218,7 +217,8 @@ If the RING is full, behavior depends on GROW-P:
   If GROW-P is non-nil, enlarge the ring to accommodate the new ITEM.
   If GROW-P is nil, dump the oldest item to make room for the new."
   (let (ind)
-    (while (setq ind (ring-member ring item)) (ring-remove ring ind)))
+    (while (setq ind (ring-member ring item))
+      (ring-remove ring ind)))
   (ring-insert+extend ring item grow-p))
 
 (defun ring-convert-sequence-to-ring (seq)
@@ -227,13 +227,11 @@ If SEQ is already a ring, return it."
   (if (ring-p seq)
       seq
     (let* ((size (length seq))
-           (ring (make-ring size))
-           (count 0))
-      (while (< count size)
-        (if (or (ring-empty-p ring)
-                (not (equal (ring-ref ring 0) (elt seq count))))
-            (ring-insert-at-beginning ring (elt seq count)))
-        (setq count (1+ count)))
+           (ring (make-ring size)))
+      (dotimes (count size)
+        (when (or (ring-empty-p ring)
+                 (not (equal (ring-ref ring 0) (elt seq count))))
+         (ring-insert-at-beginning ring (elt seq count))))
       ring)))
 
 ;;; provide ourself:
index 27ddeb2571848b4d319c865baac035d589c8c1c4..a0097ef9052023ced7ba09b59af49fb3d4b77e85 100644 (file)
@@ -1,6 +1,7 @@
 ;;;; testcover-ses.el -- Example use of `testcover' to test "SES"
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
+;;   Free Software Foundation, Inc.
 
 ;; Author: Jonathan Yavner <jyavner@engineer.com>
 ;; Maintainer: Jonathan Yavner <jyavner@engineer.com>
 (defvar ses-initial-global-parameters)
 (defvar ses-mode-map)
 
+(declare-function ses-set-curcell "ses")
+(declare-function ses-update-cells "ses")
+(declare-function ses-load "ses")
+(declare-function ses-vector-delete "ses")
+(declare-function ses-create-header-string "ses")
+(declare-function ses-read-cell "ses")
+(declare-function ses-read-symbol "ses")
+(declare-function ses-command-hook "ses")
+(declare-function ses-jump "ses")
+
+
 ;;;Here are some macros that exercise SES.  Set `pause' to t if you want the
 ;;;macros to pause after each step.
 (let* ((pause nil)
index b999ce63b8cc0c019990802e33f448cf56c21f47..42c3ebef4e738acfeb64b74fda584d6afe7cd8f4 100644 (file)
     )
   "A-list of (FORM . REASON)... that`unsafep' should decide are unsafe.")
 
+(declare-function unsafep-function "unsafep" (fun))
 
 ;;;#########################################################################
 (defun testcover-unsafep ()
index 0fed5962fcbd45df134d9858c2555dd2b1c67603..b11f7ca9d5cfcba13b6bb6bc714f17e4b6ae7d45 100644 (file)
@@ -356,6 +356,9 @@ This function is called, by name, directly by the C code."
   "Non-nil if EVENT is a timeout event."
   (and (listp event) (eq (car event) 'timer-event)))
 \f
+
+(declare-function diary-entry-time "diary-lib" (s))
+
 ;;;###autoload
 (defun run-at-time (time repeat function &rest args)
   "Perform an action at time TIME.
index fbb39ee66d33cfea1817508a2d0255967210282f..1f6967888694ef1407d4303e78b11fb498e463c7 100644 (file)
@@ -286,7 +286,7 @@ enabled."
   "*If non-nil, only highlight region if marked with S-<move>.
 When this is non-nil, CUA toggles `transient-mark-mode' on when the region
 is marked using shifted movement keys, and off when the mark is cleared.
-But when the mark was set using \\[cua-set-mark], transient-mark-mode
+But when the mark was set using \\[cua-set-mark], Transient Mark mode
 is not turned on."
   :type 'boolean
   :group 'cua)
@@ -406,8 +406,8 @@ and after the region marked by the rectangle to search."
   "Global key used to toggle the cua rectangle mark."
   :set #'(lambda (symbol value)
           (set symbol value)
-          (when (and (boundp 'cua--keymaps-initalized)
-                     cua--keymaps-initalized)
+          (when (and (boundp 'cua--keymaps-initialized)
+                     cua--keymaps-initialized)
             (define-key cua-global-keymap value
               'cua-set-rectangle-mark)
             (when (boundp 'cua--rectangle-keymap)
@@ -583,35 +583,37 @@ a cons (TYPE . COLOR), then both properties are affected."
 
 ;;; Rectangle support is in cua-rect.el
 
-(autoload 'cua-set-rectangle-mark "cua-rect" nil t nil)
+(autoload 'cua-set-rectangle-mark "cua-rect"
+  "Start rectangle at mouse click position." t nil)
 
 ;; Stub definitions until it is loaded
-
-(when (not (featurep 'cua-rect))
-  (defvar cua--rectangle)
-  (setq cua--rectangle nil)
-  (defvar cua--last-killed-rectangle)
-  (setq cua--last-killed-rectangle nil))
-
-
+(defvar cua--rectangle)
+(defvar cua--last-killed-rectangle)
+(unless (featurep 'cua-rect)
+  (setq cua--rectangle nil
+        cua--last-killed-rectangle nil))
+
+;; All behind cua--rectangle tests.
+(declare-function cua-copy-rectangle    "cua-rect" (arg))
+(declare-function cua-cut-rectangle     "cua-rect" (arg))
+(declare-function cua--rectangle-left   "cua-rect" (&optional val))
+(declare-function cua--delete-rectangle "cua-rect" ())
+(declare-function cua--insert-rectangle "cua-rect"
+                  (rect &optional below paste-column line-count))
+(declare-function cua--rectangle-corner "cua-rect" (&optional advance))
+(declare-function cua--rectangle-assert "cua-rect" ())
 
 ;;; Global Mark support is in cua-gmrk.el
 
 (autoload 'cua-toggle-global-mark "cua-gmrk" nil t nil)
 
 ;; Stub definitions until cua-gmrk.el is loaded
-
-(when (not (featurep 'cua-gmrk))
-  (defvar cua--global-mark-active)
+(defvar cua--global-mark-active)
+(unless (featurep 'cua-gmrk)
   (setq cua--global-mark-active nil))
 
-
-(provide 'cua-base)
-
-(eval-when-compile
-  (require 'cua-rect)
-  (require 'cua-gmrk)
-  )
+(declare-function cua--insert-at-global-mark    "cua-gmrk" (str &optional msg))
+(declare-function cua--global-mark-post-command "cua-gmrk" ())
 
 
 ;;; Low-level Interface
@@ -874,6 +876,8 @@ With numeric prefix arg, copy to register 0-9 instead."
   (if (fboundp 'cua--cancel-rectangle)
       (cua--cancel-rectangle)))
 
+(declare-function x-clipboard-yank "../term/x-win" ())
+
 (defun cua-paste (arg)
   "Paste last cut or copied region or rectangle.
 An active region is deleted before executing the command.
@@ -918,6 +922,7 @@ If global mark is active, copy from register or one character."
       (cond
        (regtxt
        (cond
+        ;; This being a cons implies cua-rect is loaded?
         ((consp regtxt) (cua--insert-rectangle regtxt))
         ((stringp regtxt) (insert-for-yank regtxt))
         (t (message "Unknown data in register %c" cua--register))))
@@ -954,8 +959,8 @@ If global mark is active, copy from register or one character."
 
 (defun cua-paste-pop (arg)
   "Replace a just-pasted text or rectangle with a different text.
-See `yank-pop' for details about the default behaviour.  For an alternative
-behaviour, see `cua-paste-pop-rotate-temporarily'."
+See `yank-pop' for details about the default behavior.  For an alternative
+behavior, see `cua-paste-pop-rotate-temporarily'."
   (interactive "P")
   (cond
    ((eq last-command 'cua--paste-rectangle)
@@ -1225,22 +1230,26 @@ If ARG is the atom `-', scroll upward by nearly full screen."
 
    ;; Handle shifted cursor keys and other movement commands.
    ;; If region is not active, region is activated if key is shifted.
-   ;; If region is active, region is cancelled if key is unshifted (and region not started with C-SPC).
-   ;; If rectangle is active, expand rectangle in specified direction and ignore the movement.
+   ;; If region is active, region is cancelled if key is unshifted
+   ;;   (and region not started with C-SPC).
+   ;; If rectangle is active, expand rectangle in specified direction and
+   ;;   ignore the movement.
    ((if window-system
+        ;; Shortcut for window-system, assuming that input-decode-map is empty.
        (memq 'shift (event-modifiers
                      (aref (this-single-command-raw-keys) 0)))
       (or
+       ;; Check if the final key-sequence was shifted.
        (memq 'shift (event-modifiers
                     (aref (this-single-command-keys) 0)))
-       ;; See if raw escape sequence maps to a shifted event, e.g. S-up or C-S-home.
-       (and (boundp 'local-function-key-map)
-           local-function-key-map
-           (let ((ev (lookup-key local-function-key-map
-                                 (this-single-command-raw-keys))))
-             (and (vector ev)
-                  (symbolp (setq ev (aref ev 0)))
-                  (string-match "S-" (symbol-name ev)))))))
+       ;; If not, maybe the raw key-sequence was mapped by input-decode-map
+       ;; to a shifted key (and then mapped down to its unshifted form).
+       (let* ((keys (this-single-command-raw-keys))
+              (ev (lookup-key input-decode-map keys)))
+         (or (and (vector ev) (memq 'shift (event-modifiers (aref ev 0))))
+             ;; Or maybe, the raw key-sequence was not an escape sequence
+             ;; and was shifted (and then mapped down to its unshifted form).
+             (memq 'shift (event-modifiers (aref keys 0)))))))
     (unless mark-active
       (push-mark-command nil t))
     (setq cua--last-region-shifted t)
@@ -1326,8 +1335,8 @@ If ARG is the atom `-', scroll upward by nearly full screen."
 (defvar cua--cua-keys-keymap (make-sparse-keymap))
 (defvar cua--prefix-override-keymap (make-sparse-keymap))
 (defvar cua--prefix-repeat-keymap (make-sparse-keymap))
-(defvar cua--global-mark-keymap (make-sparse-keymap)) ; Initalized when cua-gmrk.el is loaded
-(defvar cua--rectangle-keymap (make-sparse-keymap))   ; Initalized when cua-rect.el is loaded
+(defvar cua--global-mark-keymap (make-sparse-keymap)) ; Initialized when cua-gmrk.el is loaded
+(defvar cua--rectangle-keymap (make-sparse-keymap))   ; Initialized when cua-rect.el is loaded
 (defvar cua--region-keymap (make-sparse-keymap))
 
 (defvar cua--ena-cua-keys-keymap nil)
@@ -1370,7 +1379,7 @@ If ARG is the atom `-', scroll upward by nearly full screen."
        (and cua--global-mark-active
             (not (window-minibuffer-p)))))
 
-(defvar cua--keymaps-initalized nil)
+(defvar cua--keymaps-initialized nil)
 
 (defun cua--shift-control-prefix (prefix arg)
   ;; handle S-C-x and S-C-c by emulating the fast double prefix function.
@@ -1534,9 +1543,9 @@ shifted movement key, set `cua-highlight-region-shift-only'."
   (setq mark-even-if-inactive t)
   (setq highlight-nonselected-windows nil)
 
-  (unless cua--keymaps-initalized
+  (unless cua--keymaps-initialized
     (cua--init-keymaps)
-    (setq cua--keymaps-initalized t))
+    (setq cua--keymaps-initialized t))
 
   (if cua-mode
       (progn
@@ -1600,7 +1609,7 @@ shifted movement key, set `cua-highlight-region-shift-only'."
   (setq cua--debug (not cua--debug)))
 
 
-(provide 'cua)
+(provide 'cua-base)
 
 ;;; arch-tag: 21fb6289-ba25-4fee-bfdc-f9fb351acf05
 ;;; cua-base.el ends here
index 6dc4d179d3d611763ae10aa62209a5e792dc7e73..6211a3c315462c4cb5afe318595cc6117a658ea6 100644 (file)
@@ -27,8 +27,6 @@
 
 ;;; Code:
 
-(provide 'cua-gmrk)
-
 (eval-when-compile
   (require 'cua-base)
   (require 'cua-rect)
@@ -386,5 +384,7 @@ With prefix argument, don't jump to global mark when cancelling it."
 
   (setq cua--global-mark-initialized t))
 
+(provide 'cua-gmrk)
+
 ;;; arch-tag: 553d8076-a91d-48ae-825d-6cb962a5f67f
 ;;; cua-gmrk.el ends here
index 5c4bc011464d3004ed106de6d05051df1f78075d..f6b5033681519bac4d25d2398e1a36d35ca25298 100644 (file)
 
 ;;; Code:
 
-(provide 'cua-rect)
-
 (eval-when-compile
-  (require 'cua-base)
-  (require 'cua-gmrk)
-)
+  (require 'cua-base))
 
 ;;; Rectangle support
 
@@ -1061,6 +1057,9 @@ The text previously in the rectangle is overwritten by the blanks."
         ;; (setq cua-save-point (point))
         ))))
 
+(declare-function cua--cut-rectangle-to-global-mark  "cua-gmrk" (as-text))
+(declare-function cua--copy-rectangle-to-global-mark "cua-gmrk" (as-text))
+
 (defun cua-copy-rectangle-as-text (&optional arg delete)
   "Copy rectangle, but store as normal text."
   (interactive "P")
@@ -1491,5 +1490,7 @@ With prefix arg, indent to that column."
 
   (setq cua--rectangle-initialized t))
 
+(provide 'cua-rect)
+
 ;;; arch-tag: b730df53-17b9-4a89-bd63-4a71ec196731
 ;;; cua-rect.el ends here
index 4e094a5f70358e82d5908ec14dd1ef659b9c85f5..fbe56c2c341be84ef74d1832f5043822f7610676 100644 (file)
@@ -39,6 +39,8 @@
 ;; The following functions are called by the EDT screen width commands defined
 ;; in edt.el.
 
+(declare-function vt100-wide-mode "../term/vt100" (&optional arg))
+
 (defun edt-set-term-width-80 ()
   "Set terminal width to 80 columns."
   (vt100-wide-mode -1))
index 4a68e258cb134c09dead0888a7640a5849c60e45..1674e7a266b4026e2283ded1b6bc5832624b0c08 100644 (file)
 ;;;; VARIABLES and CONSTANTS
 ;;;;
 
-;; For backward compatibility to Emacs 19.
-(or (fboundp 'defgroup)
-    (defmacro defgroup (&rest rest)))
-
 (defgroup edt nil
   "Emacs emulating EDT."
   :prefix "edt-"
   :group 'emulations)
 
 ;; To silence the byte-compiler
-(eval-when-compile
-  (defvar *EDT-keys*)
-  (defvar edt-default-global-map)
-  (defvar edt-last-copied-word)
-  (defvar edt-learn-macro-count)
-  (defvar edt-orig-page-delimiter)
-  (defvar edt-orig-transient-mark-mode)
-  (defvar edt-rect-start-point)
-  (defvar edt-user-global-map)
-  (defvar rect-start-point)
-  (defvar time-string)
-  (defvar zmacs-region-stays))
+(defvar *EDT-keys*)
+(defvar edt-default-global-map)
+(defvar edt-last-copied-word)
+(defvar edt-learn-macro-count)
+(defvar edt-orig-page-delimiter)
+(defvar edt-orig-transient-mark-mode)
+(defvar edt-rect-start-point)
+(defvar edt-user-global-map)
+(defvar rect-start-point)
+(defvar time-string)
+(defvar zmacs-region-stays)
 
 ;;;
 ;;;  Version Information
 ;;;  User Configurable Variables
 ;;;
 
-;; For backward compatibility to Emacs 19.
-(or (fboundp 'defcustom)
-    (defmacro defcustom (var value doc &rest ignore)
-      `(defvar ,var ,value ,doc)))
-
 (defcustom edt-keep-current-page-delimiter nil
   "*Emacs MUST be restarted for a change in value to take effect!
 Non-nil leaves Emacs value of `page-delimiter' unchanged within EDT
@@ -1628,6 +1618,8 @@ Argument NUM is the percentage into the buffer to move."
       (indent-region (point) (mark) nil)
     (fill-region (point) (mark))))
 
+
+(declare-function c-mark-function "cc-cmds" ())
 ;;;
 ;;; MARK SECTION WISELY
 ;;;
@@ -2237,7 +2229,10 @@ Optional argument USER-SETUP non-nil means  called from function
   ;; function edt-setup-extra-default-bindings.
   (define-prefix-command 'edt-user-gold-map)
   (fset 'edt-user-gold-map (copy-keymap 'edt-default-gold-map))
-  (edt-setup-user-bindings)
+  ;; This is a function that the user can define for custom bindings.
+  ;; See etc/edt-user.doc.
+  (if (fboundp 'edt-setup-user-bindings)
+      (edt-setup-user-bindings))
   (edt-select-user-global-map))
 
 (defun edt-select-default-global-map()
index a4e304616dad202d54f634cac2ad39150beca4b3..c35044b70ec85e2b01da4b3eab2a2ac183eeace6 100644 (file)
@@ -135,8 +135,8 @@ restored to their original values when PC Selection mode is toggled off.")
 
 (unless pc-select-default-key-bindings
   (let ((lst
-        ;; This is to avoid confusion with the delete-selection-mode
-       ;; On simple displays you cant see that a region is active and
+        ;; This is to avoid confusion with the delete-selection-mode.
+         ;; On simple displays you can't see that a region is active and
         ;; will be deleted on the next keypress IMHO especially for
         ;; copy-region-as-kill this is confusing.
         ;; The same goes for exchange-point-and-mark
@@ -182,7 +182,7 @@ restored to their original values when PC Selection mode is toggled off.")
           ([prior]     . scroll-down-nomark)
 
           ;; Next four lines are from Pete Forman.
-          ([C-down]    . forward-paragraph-nomark) ; KNextPara     cDn
+          ([C-down]    . forward-paragraph-nomark)  ; KNextPara     cDn
           ([C-up]      . backward-paragraph-nomark) ; KPrevPara     cUp
           ([S-C-down]  . forward-paragraph-mark)
           ([S-C-up]    . backward-paragraph-mark))))
@@ -281,10 +281,17 @@ and `transient-mark-mode'."
 ;;;;
 ;; non-interactive
 ;;;;
-(defun ensure-mark()
+(defun pc-select-ensure-mark ()
   ;; make sure mark is active
   ;; test if it is active, if it isn't, set it and activate it
-  (or mark-active (set-mark-command nil)))
+  (or mark-active (set-mark-command nil))
+  ;; Remember who activated the mark.
+  (setq mark-active 'pc-select))
+
+(defun pc-select-maybe-deactivate-mark ()
+  ;; maybe switch off mark (only if *we* switched it on)
+  (when (eq mark-active 'pc-select)
+    (deactivate-mark)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;; forward and mark
@@ -294,7 +301,7 @@ and `transient-mark-mode'."
   "Ensure mark is active; move point right ARG characters (left if ARG negative).
 On reaching end of buffer, stop and signal error."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (forward-char arg))
 
 (defun forward-word-mark (&optional arg)
@@ -303,13 +310,13 @@ Normally returns t.
 If an edge of the buffer is reached, point is left there
 and nil is returned."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (forward-word arg))
 
 (defun forward-line-mark (&optional arg)
   "Ensure mark is active; move cursor vertically down ARG lines."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (forward-line arg)
   (setq this-command 'forward-line)
 )
@@ -319,7 +326,7 @@ and nil is returned."
 With argument, do it that many times.  Negative arg -N means
 move backward across N balanced expressions."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (forward-sexp arg))
 
 (defun forward-paragraph-mark (&optional arg)
@@ -331,7 +338,7 @@ A line which `paragraph-start' matches either separates paragraphs
 A paragraph end is the beginning of a line which is not part of the paragraph
 to which the end of the previous line belongs, or the end of the buffer."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (forward-paragraph arg))
 
 (defun next-line-mark (&optional arg)
@@ -350,7 +357,7 @@ a semipermanent goal column to which this command always moves.
 Then it does not try to move vertically.  This goal column is stored
 in `goal-column', which is nil when there is none."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (with-no-warnings (next-line arg))
   (setq this-command 'next-line))
 
@@ -359,14 +366,14 @@ in `goal-column', which is nil when there is none."
 With argument ARG not nil or 1, move forward ARG - 1 lines first.
 If scan reaches end of buffer, stop there without error."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (end-of-line arg)
   (setq this-command 'end-of-line))
 
 (defun backward-line-mark (&optional arg)
   "Ensure mark is active; move cursor vertically up ARG lines."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (if (null arg)
       (setq arg 1))
   (forward-line (- arg))
@@ -379,7 +386,7 @@ A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll upward.
 When calling from a program, supply a number as argument or nil."
   (interactive "P")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (cond (pc-select-override-scroll-error
         (condition-case nil (scroll-down arg)
           (beginning-of-buffer (goto-char (point-min)))))
@@ -395,7 +402,7 @@ of the accessible part of the buffer.
 Don't use this command in Lisp programs!
 \(goto-char \(point-max)) is faster and avoids clobbering the mark."
   (interactive "P")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (let ((size (- (point-max) (point-min))))
     (goto-char (if arg
                   (- (point-max)
@@ -427,7 +434,7 @@ Don't use this command in Lisp programs!
   "Deactivate mark; move point right ARG characters \(left if ARG negative).
 On reaching end of buffer, stop and signal error."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (forward-char arg))
 
 (defun forward-word-nomark (&optional arg)
@@ -436,13 +443,13 @@ Normally returns t.
 If an edge of the buffer is reached, point is left there
 and nil is returned."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (forward-word arg))
 
 (defun forward-line-nomark (&optional arg)
   "Deactivate mark; move cursor vertically down ARG lines."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (forward-line arg)
   (setq this-command 'forward-line)
 )
@@ -452,7 +459,7 @@ and nil is returned."
 With argument, do it that many times.  Negative arg -N means
 move backward across N balanced expressions."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (forward-sexp arg))
 
 (defun forward-paragraph-nomark (&optional arg)
@@ -464,7 +471,7 @@ A line which `paragraph-start' matches either separates paragraphs
 A paragraph end is the beginning of a line which is not part of the paragraph
 to which the end of the previous line belongs, or the end of the buffer."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (forward-paragraph arg))
 
 (defun next-line-nomark (&optional arg)
@@ -483,7 +490,7 @@ a semipermanent goal column to which this command always moves.
 Then it does not try to move vertically.  This goal column is stored
 in `goal-column', which is nil when there is none."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (with-no-warnings (next-line arg))
   (setq this-command 'next-line))
 
@@ -492,14 +499,14 @@ in `goal-column', which is nil when there is none."
 With argument ARG not nil or 1, move forward ARG - 1 lines first.
 If scan reaches end of buffer, stop there without error."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (end-of-line arg)
   (setq this-command 'end-of-line))
 
 (defun backward-line-nomark (&optional arg)
   "Deactivate mark; move cursor vertically up ARG lines."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (if (null arg)
       (setq arg 1))
   (forward-line (- arg))
@@ -512,7 +519,7 @@ A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll upward.
 When calling from a program, supply a number as argument or nil."
   (interactive "P")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (cond (pc-select-override-scroll-error
         (condition-case nil (scroll-down arg)
           (beginning-of-buffer (goto-char (point-min)))))
@@ -528,7 +535,7 @@ of the accessible part of the buffer.
 Don't use this command in Lisp programs!
 \(goto-char (point-max)) is faster and avoids clobbering the mark."
   (interactive "P")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (let ((size (- (point-max) (point-min))))
     (goto-char (if arg
                   (- (point-max)
@@ -561,14 +568,14 @@ Don't use this command in Lisp programs!
 "Ensure mark is active; move point left ARG characters (right if ARG negative).
 On attempt to pass beginning or end of buffer, stop and signal error."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (backward-char arg))
 
 (defun backward-word-mark (&optional arg)
   "Ensure mark is active; move backward until encountering the end of a word.
 With argument, do this that many times."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (backward-word arg))
 
 (defun backward-sexp-mark (&optional arg)
@@ -576,7 +583,7 @@ With argument, do this that many times."
 With argument, do it that many times.  Negative arg -N means
 move forward across N balanced expressions."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (backward-sexp arg))
 
 (defun backward-paragraph-mark (&optional arg)
@@ -591,7 +598,7 @@ blank line.
 
 See `forward-paragraph' for more information."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (backward-paragraph arg))
 
 (defun previous-line-mark (&optional arg)
@@ -608,7 +615,7 @@ If you are thinking of using this in a Lisp program, consider using
 `forward-line' with a negative argument instead.  It is usually easier
 to use and more reliable (no dependence on goal column, etc.)."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (with-no-warnings (previous-line arg))
   (setq this-command 'previous-line))
 
@@ -617,7 +624,7 @@ to use and more reliable (no dependence on goal column, etc.)."
 With argument ARG not nil or 1, move forward ARG - 1 lines first.
 If scan reaches end of buffer, stop there without error."
   (interactive "p")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (beginning-of-line arg))
 
 
@@ -627,7 +634,7 @@ A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll downward.
 When calling from a program, supply a number as argument or nil."
   (interactive "P")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (cond (pc-select-override-scroll-error
         (condition-case nil (scroll-up arg)
           (end-of-buffer (goto-char (point-max)))))
@@ -643,7 +650,7 @@ of the accessible part of the buffer.
 Don't use this command in Lisp programs!
 \(goto-char (p\oint-min)) is faster and avoids clobbering the mark."
   (interactive "P")
-  (ensure-mark)
+  (pc-select-ensure-mark)
   (let ((size (- (point-max) (point-min))))
     (goto-char (if arg
                   (+ (point-min)
@@ -663,14 +670,14 @@ Don't use this command in Lisp programs!
   "Deactivate mark; move point left ARG characters (right if ARG negative).
 On attempt to pass beginning or end of buffer, stop and signal error."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (backward-char arg))
 
 (defun backward-word-nomark (&optional arg)
   "Deactivate mark; move backward until encountering the end of a word.
 With argument, do this that many times."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (backward-word arg))
 
 (defun backward-sexp-nomark (&optional arg)
@@ -678,7 +685,7 @@ With argument, do this that many times."
 With argument, do it that many times.  Negative arg -N means
 move forward across N balanced expressions."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (backward-sexp arg))
 
 (defun backward-paragraph-nomark (&optional arg)
@@ -693,7 +700,7 @@ blank line.
 
 See `forward-paragraph' for more information."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (backward-paragraph arg))
 
 (defun previous-line-nomark (&optional arg)
@@ -706,7 +713,7 @@ The command \\[set-goal-column] can be used to create
 a semipermanent goal column to which this command always moves.
 Then it does not try to move vertically."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (with-no-warnings (previous-line arg))
   (setq this-command 'previous-line))
 
@@ -715,7 +722,7 @@ Then it does not try to move vertically."
 With argument ARG not nil or 1, move forward ARG - 1 lines first.
 If scan reaches end of buffer, stop there without error."
   (interactive "p")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (beginning-of-line arg))
 
 (defun scroll-up-nomark (&optional arg)
@@ -724,7 +731,7 @@ A near full screen is `next-screen-context-lines' less than a full screen.
 Negative ARG means scroll downward.
 When calling from a program, supply a number as argument or nil."
   (interactive "P")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (cond (pc-select-override-scroll-error
         (condition-case nil (scroll-up arg)
           (end-of-buffer (goto-char (point-max)))))
@@ -740,7 +747,7 @@ of the accessible part of the buffer.
 Don't use this command in Lisp programs!
 \(goto-char (point-min)) is faster and avoids clobbering the mark."
   (interactive "P")
-  (setq mark-active nil)
+  (pc-select-maybe-deactivate-mark)
   (let ((size (- (point-max) (point-min))))
     (goto-char (if arg
                   (+ (point-min)
@@ -968,21 +975,5 @@ but before calling PC Selection mode):
       (setq pc-select-key-bindings-alist nil
            pc-select-saved-settings-alist nil))))
 
-
-;;;###autoload
-(defcustom pc-selection-mode nil
-  "Toggle PC Selection mode.
-Change mark behavior to emulate Motif, MAC or MS-Windows cut and paste style,
-and cursor movement commands.
-This mode enables Delete Selection mode and Transient Mark mode.
-Setting this variable directly does not take effect;
-you must modify it using \\[customize] or \\[pc-selection-mode]."
-  :set (lambda (symbol value)
-        (pc-selection-mode (if value 1 -1)))
-  :initialize 'custom-initialize-default
-  :type 'boolean
-  :group 'pc-select
-  :require 'pc-select)
-
-;;; arch-tag: 10697b70-ae07-4f3e-ad23-7814a3f418c2
+;; arch-tag: 10697b70-ae07-4f3e-ad23-7814a3f418c2
 ;;; pc-select.el ends here
index 425ac450faeb75e860e67325eb657098e3c92fca..c5ae34e0f07bc660798f76e66721bb4223ce1fa2 100644 (file)
 
 ;;; Code:
 
-(eval-when-compile (require 'cl))
 ;; we use picture-mode functions
 (require 'picture)
 
@@ -1367,6 +1366,9 @@ The search is performed in the current direction."
 ;;       tpu-search-forward (t)        tpu-search-reverse (t)
 ;;       tpu-search-forward-exit (t)   tpu-search-backward-exit (t)
 
+(declare-function tpu-emacs-search "tpu-edt")
+(declare-function tpu-emacs-rev-search "tpu-edt")
+
 (defun tpu-set-search (&optional arg)
   "Set the search functions and set the search direction to the current
 direction.  If an argument is specified, don't set the search direction."
@@ -2432,7 +2434,10 @@ If FILE is nil, try to load a default file.  The default file names are
         (if (eq tpu-global-map parent)
             (set-keymap-parent map (keymap-parent parent))
           (setq map parent)))))
-  (ignore-errors (ad-disable-regexp "\\`tpu-"))
+  ;; Only has an effect if the advice in tpu-extras has been activated.
+  (condition-case nil
+      (with-no-warnings (ad-disable-regexp "\\`tpu-"))
+    (error nil))
   (setq tpu-edt-mode nil))
 
 \f
index 81ad04b60d9f828ff8f6a7d2d77d88845a791209..de7bcffdf0e3f697e739efe8e4ed4577f619d118 100644 (file)
@@ -1375,6 +1375,8 @@ The following CHAR will be the name for the command or macro."
           (setq char (read-char))
           (vi-ask-for-info char))))
 
+(declare-function c-mark-function "cc-cmds" ())
+
 (defun vi-mark-region (arg region)
   "Mark region appropriately.  The next char REGION is d(efun),s(-exp),b(uffer),
 p(aragraph), P(age), f(unction in C/Pascal etc.), w(ord), e(nd of sentence),
index 5e13edb949587a418e6a7b47b8ef7005d0953ff1..8603169819f93d59846fce525aae77310211c4b6 100644 (file)
@@ -27,7 +27,6 @@
 ;;; Code:
 
 (provide 'viper-cmd)
-(require 'advice)
 
 ;; Compiler pacifier
 (defvar viper-minibuffer-current-face)
 (defvar initial)
 (defvar undo-beg-posn)
 (defvar undo-end-posn)
-
-;; loading happens only in non-interactive compilation
-;; in order to spare non-viperized emacs from being viperized
-(if noninteractive
-    (eval-when-compile
-      (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-util)
-           (load "viper-util.el" nil nil 'nosuffix))
-       (or (featurep 'viper-keym)
-           (load "viper-keym.el" nil nil 'nosuffix))
-       (or (featurep 'viper-mous)
-           (load "viper-mous.el" nil nil 'nosuffix))
-       (or (featurep 'viper-macs)
-           (load "viper-macs.el" nil nil 'nosuffix))
-       (or (featurep 'viper-ex)
-           (load "viper-ex.el" nil nil 'nosuffix))
-       )))
 ;; end pacifier
 
 
@@ -3097,6 +3079,9 @@ On reaching beginning of line, stop and signal error."
     (setq this-command 'next-line)
     (if com (viper-execute-com 'viper-next-line val com))))
 
+(declare-function widget-type "wid-edit" (widget))
+(declare-function widget-button-press "wid-edit" (pos &optional event))
+(declare-function viper-set-hooks "viper" ())
 
 (defun viper-next-line-at-bol (arg)
   "Next line at beginning of line.
index caeecd12c8a2c24985d130d4f5b3569d697c6ddd..ccc06e0b938b5afc796032c44f1a511663f4d77a 100644 (file)
 (if noninteractive
     (eval-when-compile
       (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-util)
-           (load "viper-util.el" nil nil 'nosuffix))
-       (or (featurep 'viper-keym)
-           (load "viper-keym.el" nil nil 'nosuffix))
        (or (featurep 'viper-cmd)
-           (load "viper-cmd.el" nil nil 'nosuffix))
+           (load "viper-cmd.el" nil t 'nosuffix))
        )))
 ;; end pacifier
 
index 1b1e07a0a0c1b31b0582ef1738534f8b1ed0ebef..539a561bb5b5389f87fcc32fa5b7e6b7ad1323a6 100644 (file)
@@ -26,8 +26,6 @@
 
 ;;; Code:
 
-(provide 'viper-init)
-
 ;; compiler pacifier
 (defvar mark-even-if-inactive)
 (defvar quail-mode)
@@ -429,15 +427,11 @@ delete the text being replaced, as in standard Vi."
   "*Cursor color when Viper is in Replace state."
   :type 'string
   :group 'viper)
-(if (fboundp 'make-variable-frame-local)
-    (make-variable-frame-local 'viper-replace-overlay-cursor-color))
 
 (defcustom viper-insert-state-cursor-color "Green"
   "Cursor color when Viper is in insert state."
   :type 'string
   :group 'viper)
-(if (fboundp 'make-variable-frame-local)
-    (make-variable-frame-local 'viper-insert-state-cursor-color))
 
 ;; viper-emacs-state-cursor-color doesn't work well. Causes cursor colors to be
 ;; confused in some cases. So, this var is nulled for now.
@@ -446,13 +440,17 @@ delete the text being replaced, as in standard Vi."
   "Cursor color when Viper is in Emacs state."
   :type 'string
   :group 'viper)
-(if (fboundp 'make-variable-frame-local)
-    (make-variable-frame-local 'viper-emacs-state-cursor-color))
 
 ;; internal var, used to remember the default cursor color of emacs frames
 (defvar viper-vi-state-cursor-color nil)
+
 (if (fboundp 'make-variable-frame-local)
-    (make-variable-frame-local 'viper-vi-state-cursor-color))
+    (mapc 'make-variable-frame-local
+          '(viper-replace-overlay-cursor-color
+            viper-insert-state-cursor-color
+            viper-emacs-state-cursor-color
+            viper-vi-state-cursor-color)))
+
 
 (viper-deflocalvar viper-replace-overlay nil "")
 (put 'viper-replace-overlay 'permanent-local t)
@@ -1025,6 +1023,9 @@ Should be set in `~/.viper' file."
     (setq cursor-type '(bar . 2))))
 
 
+(provide 'viper-init)
+
+
 ;; Local Variables:
 ;; eval: (put 'viper-deflocalvar 'lisp-indent-hook 'defun)
 ;; End:
index 0e502720f5e7b3726c70d7d728630d8b0772ff05..85a94075720ace45d8be9be9698982e00d8c71ee 100644 (file)
@@ -26,8 +26,6 @@
 
 ;;; Code:
 
-(provide 'viper-keym)
-
 ;; compiler pacifier
 (defvar viper-always)
 (defvar viper-current-state)
 (defvar viper-expert-level)
 (defvar viper-ex-style-editing)
 (defvar viper-ex-style-motion)
-
-;; loading happens only in non-interactive compilation
-;; in order to spare non-viperized emacs from being viperized
-(if noninteractive
-    (eval-when-compile
-      (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-util)
-           (load "viper-util.el" nil nil 'nosuffix))
-       )))
 ;; end pacifier
 
 (require 'viper-util)
 
+(declare-function viper-ex "viper-ex" (arg &optional string))
+(declare-function viper-normalize-minor-mode-map-alist "viper-cmd" ())
+(declare-function viper-set-mode-vars-for "viper-cmd" (state))
 
 ;;; Variables
 
@@ -702,6 +694,9 @@ form ((key . function) (key . function) ... )."
           alist))
 
 
+(provide 'viper-keym)
+
+
 ;;; Local Variables:
 ;;; eval: (put 'viper-deflocalvar 'lisp-indent-hook 'defun)
 ;;; End:
index 788feaf86e6a13edebdeab14cf732939de3f34ef..6eb7687c4e60b1a238ccd6dfaa4c11e338856a71 100644 (file)
 (if noninteractive
     (eval-when-compile
       (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-util)
-           (load "viper-util.el" nil nil 'nosuffix))
-       (or (featurep 'viper-keym)
-           (load "viper-keym.el" nil nil 'nosuffix))
-       (or (featurep 'viper-mous)
-           (load "viper-mous.el" nil nil 'nosuffix))
        (or (featurep 'viper-cmd)
-           (load "viper-cmd.el" nil nil 'nosuffix))
+           (load "viper-cmd.el" nil t 'nosuffix))
        )))
 ;; end pacifier
 
index 7a47d321890a8aef0b9199f8f03a62d3d7a69d58..dd727cd5f84a4cddbbfb772930ca39dc20db2abe 100644 (file)
 (if noninteractive
     (eval-when-compile
       (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-util)
-           (load "viper-util.el" nil nil 'nosuffix))
        (or (featurep 'viper-cmd)
-           (load "viper-cmd.el" nil nil 'nosuffix))
+           (load "viper-cmd.el" nil t 'nosuffix))
        )))
 ;; end pacifier
 
index c757eb63aef8e5e196778669fc29a93aa96dba43..87bf5235b818e281f3d609e911f73b86eacd31ac 100644 (file)
 
 (require 'ring)
 
-(if noninteractive
-    (eval-when-compile
-      (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-init)
-           (load "viper-init.el" nil nil 'nosuffix))
-       )))
 ;; end pacifier
 
 (require 'viper-init)
 
 
 \f
+(declare-function viper-forward-Word "viper-cmd" (arg))
+
 ;;; Support for :e, :r, :w file globbing
 
 ;; Glob the file spec.
index 65d40e8bad79e74328fad546ca9a784ecb09a1d6..bb3e4eb583dd08ef7bb451249d374ce81d91ad06 100644 (file)
 
 ;;; Code:
 
-(require 'advice)
-(require 'ring)
-
 ;; compiler pacifier
 (defvar mark-even-if-inactive)
 (defvar quail-mode)
 (defvar viper-expert-level)
 (defvar viper-mode-string)
 (defvar viper-major-mode-modifier-list)
-
-;; loading happens only in non-interactive compilation
-;; in order to spare non-viperized emacs from being viperized
-(if noninteractive
-    (eval-when-compile
-      (let ((load-path (cons (expand-file-name ".") load-path)))
-       (or (featurep 'viper-init)
-           (load "viper-init.el" nil nil 'nosuffix))
-       (or (featurep 'viper-cmd)
-           (load "viper-cmd.el" nil nil 'nosuffix))
-       )))
 ;; end pacifier
 
+(require 'advice)
 (require 'viper-init)
 (require 'viper-keym)
 
index 929df097790dfbb1ee36a97f3927862d66963a06..bd20dfbed453ae0a96dd24edf4af9c406cd0eab5 100644 (file)
@@ -1,3 +1,41 @@
+2007-12-01  Glenn Morris  <rgm@gnu.org>
+
+       * erc-backend.el (erc-server-send-ping): Move after definition of
+       erc-server-send.
+
+       * erc.el (iswitchb-temp-buflist, iswitchb-read-buffer)
+       (erc-controls-strip): Declare for compiler.
+       (erc-iswitchb): Don't require iswitchb when compiling.  Test
+       iswitchb-mode is bound.
+
+2007-11-30  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * erc.el (open-ssl-stream, open-tls-stream, erc-network-name):
+       Declare as functions.
+
+2007-11-29  Giorgos Keramidas  <keramida@ceid.upatras.gr>  (tiny change)
+
+       * erc-backend.el, erc.el:
+       Parse 307 (nick has identified) responses.
+
+2007-11-15  Juanma Barranquero  <lekktu@gmail.com>
+
+       * erc.el (erc-open):
+       * erc-backend.el (define-erc-response-handler):
+       * erc-log.el (log):
+       * erc-match.el (erc-log-matches): Fix typos in docstrings.
+
+2007-11-11  Michael Olson  <mwolson@gnu.org>
+
+       * erc-autoaway.el (erc-autoaway-possibly-set-away):
+       * erc-netsplit.el (erc-netsplit-timer):
+       * erc-notify.el (erc-notify-timer):
+       * erc-track.el (erc-user-is-active): Only run if we have
+       successfully established a connection to the server and have
+       logged in.  I suspect that sending messages too soon may make some
+       IRC servers not respond well, particularly when the network
+       connection is iffy or subject to traffic-shaping.
+
 2007-11-01  Michael Olson  <mwolson@gnu.org>
 
        * erc-compat.el (erc-set-write-file-functions): New compatibility
index c70beb112e2871a6ea8665ce56a60e3c7be443be..4c841387d7f8401267cd21de2cfd4a5506772137 100644 (file)
@@ -248,7 +248,8 @@ exceeds `erc-autoaway-idle-seconds'."
   ;; A test for (erc-server-process-alive) is not necessary, because
   ;; this function is called from `erc-timer-hook', which is called
   ;; whenever the server sends something to the client.
-  (when (and erc-auto-set-away
+  (when (and erc-server-connected
+            erc-auto-set-away
             (not erc-autoaway-caused-away)
             (erc-autoaway-some-open-server-buffer))
     (let ((idle-time (erc-time-diff erc-autoaway-last-sent-time
index 4e250490e9c13094491ce84b801e1506301e6f98..c0f4205c0120bae9b43be17522502a5de6725c99 100644 (file)
@@ -461,27 +461,6 @@ Currently this is called by `erc-send-input'."
     (upcase-word 1)
     (buffer-string)))
 
-(defun erc-server-send-ping (buf)
-  "Send a ping to the IRC server buffer in BUF.
-Additionally, detect whether the IRC process has hung."
-  (if (buffer-live-p buf)
-      (with-current-buffer buf
-        (if (and erc-server-send-ping-timeout
-                 (>
-                  (erc-time-diff (erc-current-time)
-                                 erc-server-last-received-time)
-                  erc-server-send-ping-timeout))
-            (progn
-              ;; if the process is hung, kill it
-              (setq erc-server-timed-out t)
-              (delete-process erc-server-process))
-          (erc-server-send (format "PING %.0f" (erc-current-time)))))
-    ;; remove timer if the server buffer has been killed
-    (let ((timer (assq buf erc-server-ping-timer-alist)))
-      (when timer
-        (erc-cancel-timer (cdr timer))
-        (setcdr timer nil)))))
-
 (defun erc-server-setup-periodical-ping (buffer)
   "Set up a timer to periodically ping the current server.
 The current buffer is given by BUFFER."
@@ -775,6 +754,27 @@ protection algorithm."
       (message "ERC: No process running")
       nil)))
 
+(defun erc-server-send-ping (buf)
+  "Send a ping to the IRC server buffer in BUF.
+Additionally, detect whether the IRC process has hung."
+  (if (buffer-live-p buf)
+      (with-current-buffer buf
+        (if (and erc-server-send-ping-timeout
+                 (>
+                  (erc-time-diff (erc-current-time)
+                                 erc-server-last-received-time)
+                  erc-server-send-ping-timeout))
+            (progn
+              ;; if the process is hung, kill it
+              (setq erc-server-timed-out t)
+              (delete-process erc-server-process))
+          (erc-server-send (format "PING %.0f" (erc-current-time)))))
+    ;; remove timer if the server buffer has been killed
+    (let ((timer (assq buf erc-server-ping-timer-alist)))
+      (when timer
+        (erc-cancel-timer (cdr timer))
+        (setcdr timer nil)))))
+
 ;; From Circe
 (defun erc-server-send-queue (buffer)
   "Send messages in `erc-server-flood-queue'.
@@ -1018,13 +1018,13 @@ NAME is the response name as sent by the server (see the IRC RFC for
 meanings).
 
 This creates:
- - a hook variable `erc-server-NAME-functions' initialised to `erc-server-NAME'.
+ - a hook variable `erc-server-NAME-functions' initialized to `erc-server-NAME'.
  - a function `erc-server-NAME' with body FN-BODY.
 
 If ALIASES is non-nil, each alias in ALIASES is `defalias'ed to
 `erc-server-NAME'.
 Alias hook variables are created as `erc-server-ALIAS-functions' and
-initialised to the same default value as `erc-server-NAME-functions'.
+initialized to the same default value as `erc-server-NAME-functions'.
 
 FN-BODY is the body of `erc-server-NAME' it may refer to the two
 function arguments PROC and PARSED.
@@ -1564,6 +1564,16 @@ See `erc-display-server-message'." nil
   (erc-display-message parsed 'notice 'active
                        's306 ?m (erc-response.contents parsed)))
 
+(define-erc-response-handler (307)
+  "Display nick-identified message." nil
+  (multiple-value-bind (nick user message)
+      (cdr (erc-response.command-args parsed))
+    (erc-display-message
+     parsed 'notice 'active 's307
+     ?n nick
+     ?m (mapconcat 'identity (cddr (erc-response.command-args parsed))
+                   " "))))
+
 (define-erc-response-handler (311 314)
   "WHOIS/WHOWAS notices." nil
   (let ((fname (erc-response.contents parsed))
index 8b5e07a383e8c5671e3806bcbeb2a81da14db92a..fe3e703f554a8a0c25cdfe0f37e40671d82c274a 100644 (file)
@@ -224,8 +224,8 @@ format is defined through a formatting function on
 
 Since automatic logging is not always a Good Thing (especially if
 people say things in different coding systems), you can turn logging
-behaviour on and off with the variable `erc-enable-logging', which can
-also be a predicate function. To only log when you are not set away, use:
+behavior on and off with the variable `erc-enable-logging', which can
+also be a predicate function.  To only log when you are not set away, use:
 
 \(setq erc-enable-logging
       (lambda (buffer)
index c147b6566f8e3bc8c7dda1bca25e290eed4e9d45..a4752588ebd0f77da5e0dc7379504f780b7b1e93 100644 (file)
@@ -530,11 +530,11 @@ Use this defun with `erc-insert-modify-hook'."
 
 (defun erc-log-matches (match-type nickuserhost message)
   "Log matches in a separate buffer, determined by MATCH-TYPE.
-The behaviour of this function is controlled by the variables
-`erc-log-matches-types-alist' and `erc-log-matches-flag'. Specify the
-match types which should be logged in the former, and
-deactivate/activate match logging in the latter. See
-`erc-log-match-format'."
+The behavior of this function is controlled by the variables
+`erc-log-matches-types-alist' and `erc-log-matches-flag'.
+Specify the match types which should be logged in the former,
+and deactivate/activate match logging in the latter.
+See `erc-log-match-format'."
   (let  ((match-buffer-name (cdr (assq match-type
                                       erc-log-matches-types-alist)))
         (nick (nth 0 (erc-parse-user nickuserhost))))
index 83bc0dffc0c076dbb96cb3e373d74670c88b3aa2..b20b7ad738b17c87c7cf75770777d57f2199e478 100644 (file)
@@ -173,13 +173,14 @@ join from that split has been detected or not.")
 
 (defun erc-netsplit-timer (now)
   "Clean cruft from `erc-netsplit-list' older than 10 minutes."
-  (dolist (elt erc-netsplit-list)
-    (when (> (erc-time-diff (cadr elt) now) 600)
-      (when erc-netsplit-debug
-       (erc-display-message
-        nil 'notice (current-buffer)
-        (concat "Netsplit: Removing " (car elt))))
-      (setq erc-netsplit-list (delq elt erc-netsplit-list)))))
+  (when erc-server-connected
+    (dolist (elt erc-netsplit-list)
+      (when (> (erc-time-diff (cadr elt) now) 600)
+       (when erc-netsplit-debug
+         (erc-display-message
+          nil 'notice (current-buffer)
+          (concat "Netsplit: Removing " (car elt))))
+       (setq erc-netsplit-list (delq elt erc-netsplit-list))))))
 
 ;;;###autoload
 (defun erc-cmd-WHOLEFT ()
index 9216631a9b42783d7bf960f756a5a7924aaa9bc0..34556a00d6c9ea131606e379539b9601822db1a6 100644 (file)
@@ -111,7 +111,8 @@ changes."
 ;;;; Timer handler
 
 (defun erc-notify-timer (now)
-  (when (and erc-notify-list
+  (when (and erc-server-connected
+            erc-notify-list
             (> (erc-time-diff
                 erc-last-ison-time now)
                erc-notify-interval))
index ad3eaf73a4b1d253f2c6b8162663ebc9d4fb2bb3..15de2094214486e211694fd67967132fd27d6e2e 100644 (file)
@@ -665,8 +665,9 @@ only consider active buffers visible.")
 
 (defun erc-user-is-active (&rest ignore)
   "Set `erc-buffer-activity'."
-  (setq erc-buffer-activity (erc-current-time))
-  (erc-track-modified-channels))
+  (when erc-server-connected
+    (setq erc-buffer-activity (erc-current-time))
+    (erc-track-modified-channels)))
 
 (defun erc-track-get-buffer-window (buffer frame-param)
   (if (eq frame-param 'selected-visible)
index fab8f7ca1b95504ba7313894189e81889bc931ee..e4e9268bfbe1616b0534455335ca77ea19e4567f 100644 (file)
@@ -1693,6 +1693,11 @@ nil."
 (put 'erc-with-all-buffers-of-server 'lisp-indent-function 1)
 (put 'erc-with-all-buffers-of-server 'edebug-form-spec '(form form body))
 
+;; (iswitchb-mode) will autoload iswitchb.el
+(defvar iswitchb-temp-buflist)
+(declare-function iswitchb-read-buffer "iswitchb"
+                (prompt &optional default require-match start matches-set))
+
 (defun erc-iswitchb (&optional arg)
   "Use `iswitchb-read-buffer' to prompt for a ERC buffer to switch to.
 When invoked with prefix argument, use all erc buffers.  Without prefix
@@ -1703,9 +1708,7 @@ If `erc-track-mode' is in enabled, put the last element of
 Due to some yet unresolved reason, global function `iswitchb-mode'
 needs to be active for this function to work."
   (interactive "P")
-  (eval-when-compile
-    (require 'iswitchb))
-  (let ((enabled iswitchb-mode))
+  (let ((enabled (bound-and-true-p iswitchb-mode)))
     (or enabled (iswitchb-mode 1))
     (unwind-protect
        (let ((iswitchb-make-buflist-hook
@@ -1924,7 +1927,7 @@ already connected and just create a separate buffer for the new
 target CHANNEL.
 
 Use PASSWD as user password on the server.  If TGT-LIST is
-non-nil, use it to initialise `erc-default-recipients'.
+non-nil, use it to initialize `erc-default-recipients'.
 
 Returns the buffer for the given server or channel."
   (let ((server-announced-name (when (and (boundp 'erc-session-server)
@@ -2165,6 +2168,8 @@ Arguments are the same as for `erc'."
 
 (defalias 'erc-select-ssl 'erc-ssl)
 
+(declare-function open-ssl-stream "ext:ssl" (name buffer host service))
+
 (defun erc-open-ssl-stream (name buffer host port)
   "Open an SSL stream to an IRC server.
 The process will be given the name NAME, its target buffer will be
@@ -2189,6 +2194,8 @@ Arguments are the same as for `erc'."
   (let ((erc-server-connect-function 'erc-open-tls-stream))
     (apply 'erc r)))
 
+(declare-function open-tls-stream "tls" (name buffer host port))
+
 (defun erc-open-tls-stream (name buffer host port)
   "Open an TLS stream to an IRC server.
 The process will be given the name NAME, its target buffer will be
@@ -2225,6 +2232,8 @@ but you won't see it.
 WARNING: Do not set this variable directly!  Instead, use the
 function `erc-toggle-debug-irc-protocol' to toggle its value.")
 
+(declare-function erc-network-name "erc-networks" ())
+
 (defun erc-log-irc-protocol (string &optional outbound)
   "Append STRING to the buffer *erc-protocol*.
 
@@ -5955,6 +5964,9 @@ if `erc-away' is non-nil."
     (cond (lag (format "lag:%.0f" lag))
          (t ""))))
 
+;; erc-goodies is required at end of this file.
+(declare-function erc-controls-strip "erc-goodies" (str))
+
 (defun erc-update-mode-line-buffer (buffer)
   "Update the mode line in a single ERC buffer BUFFER."
   (with-current-buffer buffer
@@ -6205,6 +6217,7 @@ All windows are opened in the current frame."
    (s303   . "Is online: %n")
    (s305   . "%m")
    (s306   . "%m")
+   (s307   . "%n %m")
    (s311   . "%n is %f (%u@%h)")
    (s312   . "%n is/was on server %s (%c)")
    (s313   . "%n is an IRC operator")
index 8ecc335523b56fde84f75d07a92d5aeae404b3d4..dd61dac05947c711e8eb1d4a55027342d6722b31 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-alias)
-
-(eval-when-compile (require 'esh-maint))
-(require 'eshell)
-
-(defgroup eshell-alias nil
-  "Command aliases allow for easy definition of alternate commands."
-  :tag "Command aliases"
-  ;; :link '(info-link "(eshell)Command aliases")
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; Command aliases greatly simplify the definition of new commands.
 ;;
 ;; Aliases are written to disk immediately after being defined or
 ;; deleted.  The filename in which they are kept is defined by the
-;; following variable:
+;; variable eshell-aliases-file.
 
-(defcustom eshell-aliases-file (concat eshell-directory-name "alias")
-  "*The file in which aliases are kept.
-Whenever an alias is defined by the user, using the `alias' command,
-it will be written to this file.  Thus, alias definitions (and
-deletions) are always permanent.  This approach was chosen for the
-sake of simplicity, since that's pretty much the only benefit to be
-gained by using this module."
-  :type 'file
-  :group 'eshell-alias)
-
-;;;
 ;; The format of this file is quite basic.  It specifies the alias
 ;; definitions in almost exactly the same way that the user entered
 ;; them, minus any argument quoting (since interpolation is not done
@@ -102,19 +80,12 @@ gained by using this module."
 ;; mispelled command, once a given tolerance threshold has been
 ;; reached.
 
-(defcustom eshell-bad-command-tolerance 3
-  "*The number of failed commands to ignore before creating an alias."
-  :type 'integer
-  ;; :link '(custom-manual "(eshell)Auto-correction of bad commands")
-  :group 'eshell-alias)
-
-;;;
-;; Whenever the same bad command name is encountered this many times,
-;; the user will be prompted in the minibuffer to provide an alias
-;; name.  An alias definition will then be created which will result
-;; in an equal call to the correct name.  In this way, Eshell
-;; gradually learns about the commands that the user mistypes
-;; frequently, and will automatically correct them!
+;; Whenever the same bad command name is encountered
+;; `eshell-bad-command-tolerance' times, the user will be prompted in
+;; the minibuffer to provide an alias name.  An alias definition will
+;; then be created which will result in an equal call to the correct
+;; name.  In this way, Eshell gradually learns about the commands that
+;; the user mistypes frequently, and will automatically correct them!
 ;;
 ;; Note that a '$*' is automatically appended at the end of the alias
 ;; definition, so that entering it is unnecessary when specifying the
@@ -122,6 +93,32 @@ gained by using this module."
 
 ;;; Code:
 
+(eval-when-compile
+  (require 'esh-util))
+(require 'eshell)
+
+(defgroup eshell-alias nil
+  "Command aliases allow for easy definition of alternate commands."
+  :tag "Command aliases"
+  ;; :link '(info-link "(eshell)Command aliases")
+  :group 'eshell-module)
+
+(defcustom eshell-aliases-file (concat eshell-directory-name "alias")
+  "*The file in which aliases are kept.
+Whenever an alias is defined by the user, using the `alias' command,
+it will be written to this file.  Thus, alias definitions (and
+deletions) are always permanent.  This approach was chosen for the
+sake of simplicity, since that's pretty much the only benefit to be
+gained by using this module."
+  :type 'file
+  :group 'eshell-alias)
+
+(defcustom eshell-bad-command-tolerance 3
+  "*The number of failed commands to ignore before creating an alias."
+  :type 'integer
+  ;; :link '(custom-manual "(eshell)Auto-correction of bad commands")
+  :group 'eshell-alias)
+
 (defcustom eshell-alias-load-hook '(eshell-alias-initialize)
   "*A hook that gets run when `eshell-alias' is loaded."
   :type 'hook
@@ -180,6 +177,9 @@ command, which will automatically write them to the file named by
     (eshell-write-aliases-list))
   nil)
 
+(defvar pcomplete-stub)
+(autoload 'pcomplete-here "pcomplete")
+
 (defun pcomplete/eshell-mode/alias ()
   "Completion function for Eshell's `alias' command."
   (pcomplete-here (eshell-alias-completions pcomplete-stub)))
@@ -274,5 +274,7 @@ These are all the command aliases which begin with NAME."
                                        eshell-prevent-alias-expansion))))
                     (eshell-parse-command alias))))))))))
 
+(provide 'em-alias)
+
 ;;; arch-tag: 8b018fc1-4e07-4ccc-aa73-c0a1ba361f82
 ;;; em-alias.el ends here
index 17d930a055def62592d189f70496bcfeac9a5406..b9642f41df6e31aa6f0adcab9ced2de22cbb5c00 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-banner)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-banner nil
-  "This sample module displays a welcome banner at login.
-It exists so that others wishing to create their own Eshell extension
-modules may have a simple template to begin with."
-  :tag "Login banner"
-  ;; :link '(info-link "(eshell)Login banner")
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; There is nothing to be done or configured in order to use this
@@ -51,6 +39,23 @@ modules may have a simple template to begin with."
 ;; In this case, it allows the user to change the string which
 ;; displays at login time.
 
+;;; Code:
+
+(eval-when-compile
+  (require 'cl)
+  (require 'esh-mode)
+  (require 'eshell))
+
+(require 'esh-util)
+
+(defgroup eshell-banner nil
+  "This sample module displays a welcome banner at login.
+It exists so that others wishing to create their own Eshell extension
+modules may have a simple template to begin with."
+  :tag "Login banner"
+  ;; :link '(info-link "(eshell)Login banner")
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-banner-message "Welcome to the Emacs shell\n\n"
@@ -61,10 +66,6 @@ This can be any sexp, and should end with at least two newlines."
 
 (put 'eshell-banner-message 'risky-local-variable t)
 
-;;; Code:
-
-(require 'esh-util)
-
 (defcustom eshell-banner-load-hook '(eshell-banner-initialize)
   "*A list of functions to run when `eshell-banner' is loaded."
   :type 'hook
@@ -90,5 +91,7 @@ This can be any sexp, and should end with at least two newlines."
     (goto-char (point-min))
     (looking-at msg)))
 
+(provide 'em-banner)
+
 ;;; arch-tag: e738b4ef-8671-42ae-a757-291779b92491
 ;;; em-banner.el ends here
index 458f6918de45f313990751b7347d3bc54c747456..57f9a09414130d653998a9ec840fb08bbe1b4b65 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-basic)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-basic nil
-  "The \"basic\" code provides a set of convenience functions which
-are traditionally considered shell builtins.  Since all of the
-functionality provided by them is accessible through Lisp, they are
-not really builtins at all, but offer a command-oriented way to do the
-same thing."
-  :tag "Basic shell commands"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; There are very few basic Eshell commands -- so-called builtins.
@@ -48,14 +35,6 @@ same thing."
 ;; echo as an argument), or whether it should try to act like a normal
 ;; shell echo, and always result in a flat string being returned.
 
-(defcustom eshell-plain-echo-behavior nil
-  "*If non-nil, `echo' tries to behave like an ordinary shell echo.
-This comes at some detriment to Lisp functionality.  However, the Lisp
-equivalent of `echo' can always be achieved by using `identity'."
-  :type 'boolean
-  :group 'eshell-basic)
-
-;;;
 ;; An example of the difference is the following:
 ;;
 ;;   echo Hello world
@@ -83,8 +62,27 @@ equivalent of `echo' can always be achieved by using `identity'."
 
 ;;; Code:
 
+(eval-when-compile
+  (require 'esh-util))
+
 (require 'esh-opt)
 
+(defgroup eshell-basic nil
+  "The \"basic\" code provides a set of convenience functions which
+are traditionally considered shell builtins.  Since all of the
+functionality provided by them is accessible through Lisp, they are
+not really builtins at all, but offer a command-oriented way to do the
+same thing."
+  :tag "Basic shell commands"
+  :group 'eshell-module)
+
+(defcustom eshell-plain-echo-behavior nil
+  "*If non-nil, `echo' tries to behave like an ordinary shell echo.
+This comes at some detriment to Lisp functionality.  However, the Lisp
+equivalent of `echo' can always be achieved by using `identity'."
+  :type 'boolean
+  :group 'eshell-basic)
+
 ;;; Functions:
 
 (defun eshell-echo (args &optional output-newline)
@@ -180,8 +178,7 @@ or `eshell-printn' for display."
       "Warning: umask changed for all new files created by Emacs.\n"))
    nil))
 
-(eval-when-compile
-  (defvar print-func))
+(provide 'em-basic)
 
 ;;; arch-tag: 385a31b1-cb95-46f0-9829-9d352ee77db8
 ;;; em-basic.el ends here
index 7247033a23550ac4d49c0bf5c173ca615ec277b4..b5f666a6bf6ac78fc13c600cbff6dc8f96b8e8b0 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-cmpl)
-
-(eval-when-compile (require 'esh-maint))
-(require 'esh-util)
-
-(defgroup eshell-cmpl nil
-  "This module provides a programmable completion function bound to
-the TAB key, which allows for completing command names, file names,
-variable names, arguments, etc."
-  :tag "Argument completion"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; Eshell, by using the pcomplete package, provides a full
@@ -82,6 +70,19 @@ variable names, arguments, etc."
 ;; This only works well if the completion function has provided Eshell
 ;; with sufficient pointers to locate the relevant help text.
 
+;;; Code:
+
+(eval-when-compile
+  (require 'eshell))
+(require 'esh-util)
+
+(defgroup eshell-cmpl nil
+  "This module provides a programmable completion function bound to
+the TAB key, which allows for completing command names, file names,
+variable names, arguments, etc."
+  :tag "Argument completion"
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-cmpl-load-hook '(eshell-cmpl-initialize)
@@ -296,7 +297,7 @@ to writing a completion function."
   (define-key eshell-mode-map [tab] 'pcomplete)
   (define-key eshell-mode-map [(control ?i)] 'pcomplete)
   ;; jww (1999-10-19): Will this work on anything but X?
-  (if (eshell-under-xemacs-p)
+  (if (featurep 'xemacs)
       (define-key eshell-mode-map [iso-left-tab] 'pcomplete-reverse)
     (define-key eshell-mode-map [(shift iso-lefttab)] 'pcomplete-reverse)
     (define-key eshell-mode-map [(shift control ?i)] 'pcomplete-reverse))
@@ -448,7 +449,7 @@ to writing a completion function."
                        (all-completions filename obarray 'functionp))
                   completions)))))))
 
-;;; Code:
+(provide 'em-cmpl)
 
 ;;; arch-tag: 0e914699-673a-45f8-8cbf-82e1dbc571bc
 ;;; em-cmpl.el ends here
index 02556661b1b5a15a04045432d308d716b861cbfa..8a1e81621bc82676afcdc64bca3b81f92a2a6b18 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-dirs)
-
-(eval-when-compile (require 'esh-maint))
-(require 'eshell)
-
-(defgroup eshell-dirs nil
-  "Directory navigation involves changing directories, examining the
-current directory, maintaining a directory stack, and also keeping
-track of a history of the last directory locations the user was in.
-Emacs does provide standard Lisp definitions of `pwd' and `cd', but
-they lack somewhat in feel from the typical shell equivalents."
-  :tag "Directory navigation"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; The only special feature that Eshell offers in the last-dir-ring.
@@ -57,9 +43,21 @@ they lack somewhat in feel from the typical shell equivalents."
 ;; Eshell sessions.  It is a separate mechanism from `pushd' and
 ;; `popd', and the two may be used at the same time.
 
+;;; Code:
+
+(require 'eshell)
 (require 'ring)
 (require 'esh-opt)
 
+(defgroup eshell-dirs nil
+  "Directory navigation involves changing directories, examining the
+current directory, maintaining a directory stack, and also keeping
+track of a history of the last directory locations the user was in.
+Emacs does provide standard Lisp definitions of `pwd' and `cd', but
+they lack somewhat in feel from the typical shell equivalents."
+  :tag "Directory navigation"
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-dirs-load-hook '(eshell-dirs-initialize)
@@ -566,7 +564,7 @@ in the minibuffer:
           (write-region (point-min) (point-max) file nil
                         'no-message))))))))
 
-;;; Code:
+(provide 'em-dirs)
 
 ;;; arch-tag: 1e9c5a95-f1bd-45f8-ad36-55aac706e787
 ;;; em-dirs.el ends here
index 2e95aaefae0e822d40102b7b23bd0ac3587842f7..b08ddd77e196512ecc5a1c7f6cd35f19e4cc6c0d 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-;;; Code:
-
-(provide 'em-glob)
-
-(eval-when-compile (require 'esh-maint))
-(require 'esh-util)
-
-(defgroup eshell-glob nil
-  "This module provides extended globbing syntax, similar what is used
-by zsh for filename generation."
-  :tag "Extended filename globbing"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; The globbing code used by Eshell closely follows the syntax used by
@@ -63,6 +50,17 @@ by zsh for filename generation."
 ;; owned by the user 'johnw'.  See [Value modifiers and predicates],
 ;; for more information about argument predication.
 
+;;; Code:
+
+(eval-when-compile (require 'eshell))
+(require 'esh-util)
+
+(defgroup eshell-glob nil
+  "This module provides extended globbing syntax, similar what is used
+by zsh for filename generation."
+  :tag "Extended filename globbing"
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-glob-load-hook '(eshell-glob-initialize)
@@ -356,5 +354,7 @@ the form:
       (eshell-glob-entries (car rdirs) globs recurse-p)
       (setq rdirs (cdr rdirs)))))
 
+(provide 'em-glob)
+
 ;;; arch-tag: d0548f54-fb7c-4978-a88e-f7c26f7f68ca
 ;;; em-glob.el ends here
index 88e154239561e134bdeaf70d6fa45ffac1dbfa43..2dd2b31d34a6518b63173d1c98de2dd42980dcb5 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-hist)
-
-(eval-when-compile (require 'esh-maint))
-(require 'eshell)
-
-(defgroup eshell-hist nil
-  "This module provides command history management."
-  :tag "History list management"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; Eshell's history facility imitates the syntax used by bash
 (require 'ring)
 (require 'esh-opt)
 (require 'em-pred)
+(require 'eshell)
+
+(defgroup eshell-hist nil
+  "This module provides command history management."
+  :tag "History list management"
+  :group 'eshell-module)
 
 ;;; User Variables:
 
@@ -988,5 +984,7 @@ If N is negative, search backwards for the -Nth previous match."
   (isearch-done)
   (eshell-send-input))
 
+(provide 'em-hist)
+
 ;;; arch-tag: 1a847333-f864-4b96-9acd-b549d620b6c6
 ;;; em-hist.el ends here
index d6b4f3aed29b8ddafd6b46893eca24c2b9bb0654..01a6bb87a1f7963011b2ed9928c54154ceb8b1d2 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-ls)
+;;; Commentary:
+
+;; Most of the command switches recognized by GNU's ls utility are
+;; supported ([(fileutils)ls invocation]).
 
-(eval-when-compile (require 'esh-maint))
+;;; Code:
+
+(eval-when-compile (require 'eshell))
+(require 'esh-util)
+(require 'esh-opt)
 
 (defgroup eshell-ls nil
   "This module implements the \"ls\" utility fully in Lisp.  If it is
@@ -35,14 +42,6 @@ properties to colorize its output based on the setting of
   :tag "Implementation of `ls' in Lisp"
   :group 'eshell-module)
 
-;;; Commentary:
-
-;; Most of the command switches recognized by GNU's ls utility are
-;; supported ([(fileutils)ls invocation]).
-
-(require 'esh-util)
-(require 'esh-opt)
-
 ;;; User Variables:
 
 (defvar eshell-ls-orig-insert-directory
@@ -922,7 +921,7 @@ to use, and each member of which is the width of that column
                                 (car file)))))
   (car file))
 
-;;; Code:
+(provide 'em-ls)
 
 ;;; arch-tag: 9295181c-0cb2-499c-999b-89f5359842cb
 ;;; em-ls.el ends here
index a7f68e4e222d3d475c1ecc54dc8a2174e11a27e9..628b8b611435cf19e36ad9c06b4ad5db4465c24c 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-pred)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-pred nil
-  "This module allows for predicates to be applied to globbing
-patterns (similar to zsh), in addition to string modifiers which can
-be applied either to globbing results, variable references, or just
-ordinary strings."
-  :tag "Value modifiers and predicates"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; Argument predication is used to affect which members of a list are
@@ -61,6 +49,16 @@ ordinary strings."
 
 ;;; Code:
 
+(eval-when-compile (require 'eshell))
+
+(defgroup eshell-pred nil
+  "This module allows for predicates to be applied to globbing
+patterns (similar to zsh), in addition to string modifiers which can
+be applied either to globbing results, variable references, or just
+ordinary strings."
+  :tag "Value modifiers and predicates"
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-pred-load-hook '(eshell-pred-initialize)
@@ -602,5 +600,7 @@ that 'ls -l' will show in the first column of its display. "
         (lambda (str)
           (split-string str ,sep))) lst))))
 
+(provide 'em-pred)
+
 ;;; arch-tag: 8b5ce022-17f3-4c40-93c7-5faafaa63f31
 ;;; em-pred.el ends here
index ddbf74f5c42da1bea7d95cdd38b61e3076c22331..57a1da7417713410cdd138bcaa98739b9d2f77cc 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-prompt)
+;;; Commentary:
+
+;; Most of the prompt navigation commands of `comint-mode' are
+;; supported, such as C-c C-n, C-c C-p, etc.
+
+;;; Code:
 
-(eval-when-compile (require 'esh-maint))
+(eval-when-compile (require 'eshell))
 
 (defgroup eshell-prompt nil
   "This module provides command prompts, and navigation between them,
@@ -32,11 +37,6 @@ as is common with most shells."
   :tag "Command prompts"
   :group 'eshell-module)
 
-;;; Commentary:
-
-;; Most of the prompt navigation commands of `comint-mode' are
-;; supported, such as C-c C-n, C-c C-p, etc.
-
 ;;; User Variables:
 
 (defcustom eshell-prompt-load-hook '(eshell-prompt-initialize)
@@ -173,7 +173,7 @@ If this takes us past the end of the current line, don't skip at all."
             (<= (match-end 0) eol))
        (goto-char (match-end 0)))))
 
-;;; Code:
+(provide 'em-prompt)
 
 ;;; arch-tag: 01c1574b-ce70-4e89-bc38-e6619f61e208
 ;;; em-prompt.el ends here
index 898f0b9d301f62873048c787ff2548efc506ecd0..b550016fbe1de43b962201c60a85f0796d254c2c 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-rebind)
+;;; Commentary:
+
+;;; Code:
 
-(eval-when-compile (require 'esh-maint))
+(eval-when-compile (require 'eshell))
 
 (defgroup eshell-rebind nil
   "This module allows for special keybindings that only take effect
@@ -39,8 +41,6 @@ the behavior of normal shells while the user editing new input text."
   :tag "Rebind keys at input"
   :group 'eshell-module)
 
-;;; Commentary:
-
 ;;; User Variables:
 
 (defcustom eshell-rebind-load-hook '(eshell-rebind-initialize)
@@ -242,7 +242,7 @@ input."
          (eshell-life-is-too-much)))
       (eshell-delete-backward-char (- arg)))))
 
-;;; Code:
+(provide 'em-rebind)
 
 ;;; arch-tag: 76d84f12-cc56-4d67-9b7d-c6b44ad20530
 ;;; em-rebind.el ends here
index 50fdc3cccccec193ba66ac540ea3c00cab613a89..0a83881c03f9893943961c75dd062be57eae293d 100644 (file)
@@ -22,9 +22,9 @@
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-script)
+;;; Commentary:
 
-(eval-when-compile (require 'esh-maint))
+;;; Code:
 
 (require 'eshell)
 
@@ -34,8 +34,6 @@ commands, as a script file."
   :tag "Running script files."
   :group 'eshell-module)
 
-;;; Commentary:
-
 ;;; User Variables:
 
 (defcustom eshell-script-load-hook '(eshell-script-initialize)
@@ -137,7 +135,7 @@ environment, binding ARGS to $1, $2, etc.")
 
 (put 'eshell/. 'eshell-no-numeric-conversions t)
 
-;;; Code:
+(provide 'em-script)
 
 ;;; arch-tag: a346439d-5ba8-4faf-ac2b-3aacfeaa4647
 ;;; em-script.el ends here
index f99a64bd17d6758e9b86094dc866881de09da230..ffb1b4a4d92d55d09bbce01665f07aedbb9c2d83 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-smart)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-smart nil
-  "This module combines the facility of normal, modern shells with
-some of the edit/review concepts inherent in the design of Plan 9's
-9term.  See the docs for more details.
-
-Most likely you will have to turn this option on and play around with
-it to get a real sense of how it works."
-  :tag "Smart display of output"
-  ;; :link '(info-link "(eshell)Smart display of output")
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; The best way to get a sense of what this code is trying to do is by
@@ -84,6 +69,21 @@ it to get a real sense of how it works."
 ;; (such as pwd), where the screen is mostly full, consumption can
 ;; increase by orders of magnitude.
 
+;;; Code:
+
+(eval-when-compile (require 'eshell))
+
+(defgroup eshell-smart nil
+  "This module combines the facility of normal, modern shells with
+some of the edit/review concepts inherent in the design of Plan 9's
+9term.  See the docs for more details.
+
+Most likely you will have to turn this option on and play around with
+it to get a real sense of how it works."
+  :tag "Smart display of output"
+  ;; :link '(info-link "(eshell)Smart display of output")
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-smart-load-hook '(eshell-smart-initialize)
@@ -322,7 +322,7 @@ and the end of the buffer are still visible."
     (if clear
        (remove-hook 'pre-command-hook 'eshell-smart-display-move t))))
 
-;;; Code:
+(provide 'em-smart)
 
 ;;; arch-tag: 8c0112c7-379c-4d54-9a1c-204d68786a4b
 ;;; em-smart.el ends here
index 541773a4b5bf3ab14aef96474d82e9058e7c83ad..6ee698148da07db6c82ea56920f2431bbf7cf5e6 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-term)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-term nil
-  "This module causes visual commands (e.g., 'vi') to be executed by
-the `term' package, which comes with Emacs.  This package handles most
-of the ANSI control codes, allowing curses-based applications to run
-within an Emacs window.  The variable `eshell-visual-commands' defines
-which commands are considered visual in nature."
-  :tag "Running visual commands"
-  :group 'eshell-module)
-
 ;;; Commentary:
 
 ;; At the moment, eshell is stream-based in its interactive input and
@@ -45,8 +32,20 @@ which commands are considered visual in nature."
 ;; buffer, giving the illusion that Eshell itself is allowing these
 ;; visual processes to execute.
 
+;;; Code:
+
+(eval-when-compile (require 'eshell))
 (require 'term)
 
+(defgroup eshell-term nil
+  "This module causes visual commands (e.g., 'vi') to be executed by
+the `term' package, which comes with Emacs.  This package handles most
+of the ANSI control codes, allowing curses-based applications to run
+within an Emacs window.  The variable `eshell-visual-commands' defines
+which commands are considered visual in nature."
+  :tag "Running visual commands"
+  :group 'eshell-module)
+
 ;;; User Variables:
 
 (defcustom eshell-term-load-hook '(eshell-term-initialize)
@@ -264,7 +263,7 @@ allowed."
 ;   "Switch to line (\"cooked\") sub-mode of eshell-term mode."
 ;  (use-local-map term-old-mode-map))
 
-;;; Code:
+(provide 'em-term)
 
 ;;; arch-tag: ab7c8fe4-3101-4257-925b-1354c6b2fe9d
 ;;; em-term.el ends here
index 33514d515afe1f1a66b63794a7f9e83f3609792a..e970c87f501b102ace9ec8d0ec390f8ba3e9a671 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-unix)
+;;; Commentary:
+
+;; This file contains implementations of several UNIX command in Emacs
+;; Lisp, for several reasons:
+;;
+;;   1) it makes them available on all platforms where the Lisp
+;;      functions used are available
+;;
+;;   2) it makes their functionality accessible and modified by the
+;;      Lisp programmer.
+;;
+;;   3) it allows Eshell to refrain from having to invoke external
+;;      processes for common operations.
+
+;;; Code:
 
-(eval-when-compile (require 'esh-maint))
 (require 'eshell)
 
 (defgroup eshell-unix nil
@@ -40,20 +53,6 @@ by name)."
   :tag "UNIX commands in Lisp"
   :group 'eshell-module)
 
-;;; Commentary:
-
-;; This file contains implementations of several UNIX command in Emacs
-;; Lisp, for several reasons:
-;;
-;;   1) it makes them available on all platforms where the Lisp
-;;      functions used are available
-;;
-;;   2) it makes their functionality accessible and modified by the
-;;      Lisp programmer.
-;;
-;;   3) it allows Eshell to refrain from having to invoke external
-;;      processes for common operations.
-
 (defcustom eshell-unix-load-hook '(eshell-unix-initialize)
   "*A list of functions to run when `eshell-unix' is loaded."
   :type 'hook
@@ -78,7 +77,7 @@ receiving side of a command pipeline."
   :type 'boolean
   :group 'eshell-unix)
 
-(defcustom eshell-plain-locate-behavior (eshell-under-xemacs-p)
+(defcustom eshell-plain-locate-behavior (featurep 'xemacs)
   "*If non-nil, standalone \"locate\" commands will behave normally.
 Standalone in this context means not redirected, and not on the
 receiving side of a command pipeline."
@@ -137,8 +136,6 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine."
   :type 'boolean
   :group 'eshell-unix)
 
-(require 'esh-opt)
-
 ;;; Functions:
 
 (defun eshell-unix-initialize ()
@@ -169,7 +166,7 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine."
 (put 'eshell/man 'eshell-no-numeric-conversions t)
 
 (defun eshell/info (&rest args)
-  "Runs the info command in-frame with the same behaviour as command-line `info', ie:
+  "Run the info command in-frame with the same behavior as command-line `info', ie:
   'info'           => goes to top info window
   'info arg1'      => IF arg1 is a file, then visits arg1
   'info arg1'      => OTHERWISE goes to top info window and then menu item arg1
@@ -1050,7 +1047,7 @@ Show wall-clock time elapsed during execution of COMMAND.")
 
 (put 'eshell/occur 'eshell-no-numeric-conversions t)
 
-;;; Code:
+(provide 'em-unix)
 
 ;;; arch-tag: 2462edd2-a76a-4cf2-897d-92e9a82ac1c9
 ;;; em-unix.el ends here
index bd48afb6bd6c6d80ba1fb91b96f39b18d9021571..f0a92eb0c6040a16d782a2d7d4a17fd7f294686f 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'em-xtra)
+;;; Commentary:
+
+;;; Code:
 
-(eval-when-compile (require 'esh-maint))
+(eval-when-compile
+  (require 'eshell)
+  (require 'pcomplete))
+(require 'compile)
 
 (defgroup eshell-xtra nil
   "This module defines some extra alias functions which are entirely
@@ -34,10 +39,6 @@ naturally accessible within Emacs."
   :tag "Extra alias functions"
   :group 'eshell-module)
 
-;;; Commentary:
-
-(require 'compile)
-
 ;;; Functions:
 
 (defun eshell/expr (&rest args)
@@ -117,7 +118,7 @@ naturally accessible within Emacs."
 
 (defalias 'pcomplete/bcc 'pcomplete/bcc32)
 
-;;; Code:
+(provide 'em-xtra)
 
 ;;; arch-tag: f944cfda-a118-470c-a0d6-b41a3a5c99c7
 ;;; em-xtra.el ends here
index 011e2a55520fe718ab6f0aa540c7123c3567f206..7db152d3604f11ea40a6d6a4b3328c5fc3c3826c 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
+;;; Commentary:
+
+;; Parsing of arguments can be extended by adding functions to the
+;; hook `eshell-parse-argument-hook'.  For a good example of this, see
+;; `eshell-parse-drive-letter', defined in eshell-dirs.el.
+
 (provide 'esh-arg)
 
-(eval-when-compile (require 'esh-maint))
+(eval-when-compile (require 'eshell))
 
 (defgroup eshell-arg nil
   "Argument parsing involves transforming the arguments passed on the
@@ -33,12 +39,6 @@ yield the values intended."
   :tag "Argument parsing"
   :group 'eshell)
 
-;;; Commentary:
-
-;; Parsing of arguments can be extended by adding functions to the
-;; hook `eshell-parse-argument-hook'.  For a good example of this, see
-;; `eshell-parse-drive-letter', defined in eshell-dirs.el.
-
 (defcustom eshell-parse-argument-hook
   (list
    ;; a term such as #<buffer NAME>, or #<process NAME> is a buffer
index f999bdcdf6df5dfa728b10e79cf19205fb4dd76e..247d6c74604a2a0f352492c2e6a3343da698fad0 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-cmd)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-cmd nil
-  "Executing an Eshell command is as simple as typing it in and
-pressing <RET>.  There are several different kinds of commands,
-however."
-  :tag "Command invocation"
-  ;; :link '(info-link "(eshell)Command invocation")
-  :group 'eshell)
-
 ;;; Commentary:
 
 ;;;_* Invoking external commands
@@ -64,11 +52,6 @@ however."
 ;; functions always take precedence, set
 ;; `eshell-prefer-lisp-functions' to t.
 
-(defcustom eshell-prefer-lisp-functions nil
-  "*If non-nil, prefer Lisp functions to external commands."
-  :type 'boolean
-  :group 'eshell-cmd)
-
 ;;;_* Alias functions
 ;;
 ;; Whenever a command is specified using a simple name, such as 'ls',
@@ -112,17 +95,44 @@ however."
 ;;
 ;; Lisp arguments are identified using the following regexp:
 
+;;;_* Command hooks
+;;
+;; There are several hooks involved with command execution, which can
+;; be used either to change or augment Eshell's behavior.
+
+
+;;; Code:
+
+(require 'esh-util)
+(unless (featurep 'xemacs)
+  (require 'eldoc))
+(require 'esh-arg)
+(require 'esh-proc)
+(require 'esh-ext)
+
+(eval-when-compile
+  (require 'pcomplete))
+
+
+(defgroup eshell-cmd nil
+  "Executing an Eshell command is as simple as typing it in and
+pressing <RET>.  There are several different kinds of commands,
+however."
+  :tag "Command invocation"
+  ;; :link '(info-link "(eshell)Command invocation")
+  :group 'eshell)
+
+(defcustom eshell-prefer-lisp-functions nil
+  "*If non-nil, prefer Lisp functions to external commands."
+  :type 'boolean
+  :group 'eshell-cmd)
+
 (defcustom eshell-lisp-regexp "\\([(`]\\|#'\\)"
   "*A regexp which, if matched at beginning of an argument, means Lisp.
 Such arguments will be passed to `read', and then evaluated."
   :type 'regexp
   :group 'eshell-cmd)
 
-;;;_* Command hooks
-;;
-;; There are several hooks involved with command execution, which can
-;; be used either to change or augment Eshell's behavior.
-
 (defcustom eshell-pre-command-hook nil
   "*A hook run before each interactive command is invoked."
   :type 'hook
@@ -219,15 +229,6 @@ return non-nil if the command is complex."
                         (function :tag "Predicate")))
   :group 'eshell-cmd)
 
-;;; Code:
-
-(require 'esh-util)
-(unless (eshell-under-xemacs-p)
-  (require 'eldoc))
-(require 'esh-arg)
-(require 'esh-proc)
-(require 'esh-ext)
-
 ;;; User Variables:
 
 (defcustom eshell-cmd-load-hook '(eshell-cmd-initialize)
@@ -394,6 +395,18 @@ hooks should be run before and after the command."
        (list 'eshell-commands commands)
       commands)))
 
+(defun eshell-debug-command (tag subform)
+  "Output a debugging message to '*eshell last cmd*'."
+  (let ((buf (get-buffer-create "*eshell last cmd*"))
+       (text (eshell-stringify eshell-current-command)))
+    (save-excursion
+      (set-buffer buf)
+      (if (not tag)
+         (erase-buffer)
+       (insert "\n\C-l\n" tag "\n\n" text
+               (if subform
+                   (concat "\n\n" (eshell-stringify subform)) ""))))))
+
 (defun eshell-debug-show-parsed-args (terms)
   "Display parsed arguments in the debug buffer."
   (ignore
@@ -956,18 +969,6 @@ at the moment are:
   "Completion for the `debug' command."
   (while (pcomplete-here '("errors" "commands"))))
 
-(defun eshell-debug-command (tag subform)
-  "Output a debugging message to '*eshell last cmd*'."
-  (let ((buf (get-buffer-create "*eshell last cmd*"))
-       (text (eshell-stringify eshell-current-command)))
-    (save-excursion
-      (set-buffer buf)
-      (if (not tag)
-         (erase-buffer)
-       (insert "\n\C-l\n" tag "\n\n" text
-               (if subform
-                   (concat "\n\n" (eshell-stringify subform)) ""))))))
-
 (defun eshell-invoke-directly (command input)
   (let ((base (cadr (nth 2 (nth 2 (cadr command))))) name)
     (if (and (eq (car base) 'eshell-trap-errors)
@@ -1418,5 +1419,7 @@ messages, and errors."
 
 (defalias 'eshell-lisp-command* 'eshell-lisp-command)
 
+(provide 'esh-cmd)
+
 ;;; arch-tag: 8e4f3867-a0c5-441f-96ba-ddd142d94366
 ;;; esh-cmd.el ends here
index 11090f97b83be15f1272d6218b3fa58f7bda0b4e..b3fc5c30bbef456452d678fe3bdd83d8d94d650d 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-ext)
-
-(eval-when-compile (require 'esh-maint))
-(require 'esh-util)
-
-(defgroup eshell-ext nil
-  "External commands are invoked when operating system executables are
-loaded into memory, thus beginning a new process."
-  :tag "External commands"
-  :group 'eshell)
-
 ;;; Commentary:
 
 ;; To force a command to invoked external, either provide an explicit
@@ -43,6 +32,18 @@ loaded into memory, thus beginning a new process."
 ;;   /bin/grep   ; will definitely invoke /bin/grep
 ;;   *grep        ; will also invoke /bin/grep
 
+(provide 'esh-ext)
+
+(eval-when-compile
+  (require 'esh-cmd))
+(require 'esh-util)
+
+(defgroup eshell-ext nil
+  "External commands are invoked when operating system executables are
+loaded into memory, thus beginning a new process."
+  :tag "External commands"
+  :group 'eshell)
+
 ;;; User Variables:
 
 (defcustom eshell-ext-load-hook '(eshell-ext-initialize)
@@ -211,7 +212,7 @@ causing the user to wonder if anything's really going on..."
           (find-file-name-handler default-directory
                                   'shell-command))))
     (if (and handler
-            (not (and (eshell-under-xemacs-p)
+            (not (and (featurep 'xemacs)
                       (eq handler 'dired-handler-fn))))
        (eshell-remote-command handler command args))
     (let ((interp (eshell-find-interpreter command)))
index 897f9942d47a8810b76de2bc7932fa8410f25f4a..15a4af8634641137fc854d88f4184d589f8a3c61 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-io)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-io nil
-  "Eshell's I/O management code provides a scheme for treating many
-different kinds of objects -- symbols, files, buffers, etc. -- as
-though they were files."
-  :tag "I/O management"
-  :group 'eshell)
-
 ;;; Commentary:
 
 ;; At the moment, only output redirection is supported in Eshell.  To
@@ -68,6 +57,17 @@ though they were files."
 ;;   (+ 1 2) > a > b > c   ; prints number to all three files
 ;;   (+ 1 2) > a | wc      ; prints to 'a', and pipes to 'wc'
 
+(provide 'esh-io)
+
+(eval-when-compile (require 'eshell))
+
+(defgroup eshell-io nil
+  "Eshell's I/O management code provides a scheme for treating many
+different kinds of objects -- symbols, files, buffers, etc. -- as
+though they were files."
+  :tag "I/O management"
+  :group 'eshell)
+
 ;;; User Variables:
 
 (defcustom eshell-io-load-hook '(eshell-io-initialize)
@@ -417,6 +417,10 @@ it defaults to `insert'."
 (defvar eshell-print-queue nil)
 (defvar eshell-print-queue-count -1)
 
+(defsubst eshell-print (object)
+  "Output OBJECT to the standard output handle."
+  (eshell-output-object object eshell-output-handle))
+
 (defun eshell-flush (&optional reset-p)
   "Flush out any lines that have been queued for printing.
 Must be called before printing begins with -1 as its argument, and
@@ -445,10 +449,6 @@ after all printing is over with no argument."
          (concat eshell-print-queue (apply 'concat strings))
          eshell-print-queue-count (1+ eshell-print-queue-count))))
 
-(defsubst eshell-print (object)
-  "Output OBJECT to the standard output handle."
-  (eshell-output-object object eshell-output-handle))
-
 (defsubst eshell-error (object)
   "Output OBJECT to the standard error handle."
   (eshell-output-object object eshell-error-handle))
index 61a4ef9510d94aab623c31c862c0d3b1a2feaf4c..3398014ff553707d825d3cfe9c615e1af597d7a7 100644 (file)
@@ -26,6 +26,8 @@
 
 ;;; Code:
 
+;; This cannot be moved to the end of the file without causing a
+;; recursive require during bootstrap.
 (provide 'esh-maint)
 
 (and (fboundp 'font-lock-add-keywords)
        ("(eshell-deftest\\>"        . font-lock-keyword-face)
        ("(eshell-condition-case\\>" . font-lock-keyword-face))))
 
-(if (file-directory-p "../pcomplete")
-    (add-to-list 'load-path "../pcomplete"))
-
-(if (locate-library "pcomplete")
-    (require 'pcomplete))
+(require 'pcomplete nil t)              ; why?
 
 (eval-when-compile
   (require 'cl)
index 8b7338f8833a1c388c724a1c1c4f00be36e513cf..eb618f6b6b8912f0b6b0b32747a33a01cade5714 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-mode)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-mode nil
-  "This module contains code for handling input from the user."
-  :tag "User interface"
-  :group 'eshell)
-
 ;;; Commentary:
 
 ;; Basically, Eshell is used just like shell mode (<M-x shell>).  The
 ;;
 ;; @ <C-c C-b> will move backward a complete shell argument.
 
+(provide 'esh-mode)
+
+(eval-when-compile (require 'esh-util))
 (require 'esh-module)
 (require 'esh-cmd)
 (require 'esh-io)
 (require 'esh-var)
 
+(defgroup eshell-mode nil
+  "This module contains code for handling input from the user."
+  :tag "User interface"
+  :group 'eshell)
+
 ;;; User Variables:
 
 (defcustom eshell-mode-unload-hook nil
@@ -222,11 +221,6 @@ This is used by `eshell-watch-for-password-prompt'."
 
 (define-abbrev-table 'eshell-mode-abbrev-table ())
 
-(eval-when-compile
-  (unless (eshell-under-xemacs-p)
-    (defalias 'characterp 'ignore)
-    (defalias 'char-int 'ignore)))
-
 (if (not eshell-mode-syntax-table)
     (let ((i 0))
       (setq eshell-mode-syntax-table (make-syntax-table))
@@ -269,7 +263,7 @@ This is used by `eshell-watch-for-password-prompt'."
       (modify-syntax-entry ?\[ "(]  " eshell-mode-syntax-table)
       (modify-syntax-entry ?\] ")[  " eshell-mode-syntax-table)
       ;; All non-word multibyte characters should be `symbol'.
-      (if (eshell-under-xemacs-p)
+      (if (featurep 'xemacs)
          (map-char-table
           (function
            (lambda (key val)
@@ -470,7 +464,7 @@ This is used by `eshell-watch-for-password-prompt'."
 
 (eshell-deftest mode command-running-p
   "Modeline shows no command running"
-  (or (eshell-under-xemacs-p)
+  (or (featurep 'xemacs)
       (not eshell-status-in-modeline)
       (and (memq 'eshell-command-running-string mode-line-format)
           (equal eshell-command-running-string "--"))))
index 1706719790999deeb424c08e682a0018b5c52010..cf9c2595a87c86298b8eb942436e9368e96414cf 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
+;;; Code:
+
 (provide 'esh-module)
 
 (eval-when-compile
-  (require 'esh-maint)
-  (require 'cl))
+  (require 'cl)
+  (require 'esh-util))
+
+(require 'esh-util)
 
 (defgroup eshell-module nil
   "The `eshell-module' group is for Eshell extension modules, which
@@ -36,10 +40,7 @@ customizing the variable `eshell-modules-list'."
   :tag "Extension modules"
   :group 'eshell)
 
-;;; Commentary:
-
-(require 'esh-util)
-
+(eval-and-compile
 (defun eshell-load-defgroups (&optional directory)
   "Load `defgroup' statements from Eshell's module files."
   (let ((vc-handled-backends nil)) ; avoid VC fucking things up
@@ -68,7 +69,9 @@ customizing the variable `eshell-modules-list'."
            (if defgroup
                (insert defgroup "\n\n")))
          (setq files (cdr files))))
-      (save-buffer))))
+      ;; Don't make backups, to avoid prompting the user if there are
+      ;; excess backup versions.
+      (save-buffer 0)))))
 
 ;; load the defgroup's for the standard extension modules, so that
 ;; documentation can be provided when the user customize's
index 66310895131407b75d40e8dd1629ef7be22e28ef..ec2279dff29679949fef24fe17e9829714d4e966 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
+;;; Commentary:
+
 (provide 'esh-opt)
 
-(eval-when-compile (require 'esh-maint))
+(eval-when-compile (require 'esh-ext))
 
 (defgroup eshell-opt nil
   "The options processing code handles command argument parsing for
@@ -32,8 +34,6 @@ Eshell commands implemented in Lisp."
   :tag "Command options processing"
   :group 'eshell)
 
-;;; Commentary:
-
 ;;; User Functions:
 
 (defmacro eshell-eval-using-options (name macro-args
index 7338756e3f82048003c1ec6f65f820d11cf2543f..c679ea7440a6e3981b846610ea2b5f37ca661cc7 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
+;;; Commentary:
+
 (provide 'esh-proc)
 
-(eval-when-compile (require 'esh-maint))
+(eval-when-compile
+  (require 'eshell)
+  (require 'esh-util))
 
 (defgroup eshell-proc nil
   "When Eshell invokes external commands, it always does so
@@ -33,8 +37,6 @@ finish."
   :tag "Process management"
   :group 'eshell)
 
-;;; Commentary:
-
 ;;; User Variables:
 
 (defcustom eshell-proc-load-hook '(eshell-proc-initialize)
index b4d65fa1f5e025ebc5e91e244b24b63d47574b54..a8e029b629c3bed0ff1ed3cfe9d93dd57e5ed17a 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-test)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-test nil
-  "This module is meant to ensure that Eshell is working correctly."
-  :tag "Eshell test suite"
-  :group 'eshell)
-
 ;;; Commentary:
 
 ;; The purpose of this module is to verify that Eshell works as
 
 ;;; Code:
 
+(eval-when-compile
+  (require 'eshell)
+  (require 'esh-util))
 (require 'esh-mode)
 
+(defgroup eshell-test nil
+  "This module is meant to ensure that Eshell is working correctly."
+  :tag "Eshell test suite"
+  :group 'eshell)
+
 ;;; User Variables:
 
 (defface eshell-test-ok
                 "\n"))))
            nil t))
 
+(provide 'esh-test)
+
 ;;; arch-tag: 6e32275a-8285-4a4e-b7cf-819aa7c86b8e
 ;;; esh-test.el ends here
index 25afdc38506f4c03e0022f36bbc2dcfc5454aeef..50243e760324393d0eadee2feb715319fd20c746 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-util)
+;;; Commentary:
 
-(eval-when-compile (require 'esh-maint))
+;;; Code:
 
 (defgroup eshell-util nil
   "This is general utility code, meant for use by Eshell itself."
   :tag "General utilities"
   :group 'eshell)
 
-;;; Commentary:
-
-(require 'pp)
-
 ;;; User Variables:
 
 (defcustom eshell-stringify-t t
@@ -139,10 +135,6 @@ function `string-to-number'."
 
 ;;; Functions:
 
-(defsubst eshell-under-xemacs-p ()
-  "Return non-nil if we are running under XEmacs."
-  (boundp 'xemacs-logo))
-
 (defsubst eshell-under-windows-p ()
   "Return non-nil if we are running under MS-DOS/Windows."
   (memq system-type '(ms-dos windows-nt)))
@@ -433,7 +425,9 @@ list."
   ;; "args out of range" error in `sit-for', if this function
   ;; runs while point is in the minibuffer and the users attempt
   ;; to use completion.  Don't ask me.
-  (ignore-errors (sit-for 0 0)))
+  (condition-case nil
+      (sit-for 0 0)
+    (error nil)))
 
 (defun eshell-read-passwd-file (file)
   "Return an alist correlating gids to group names in FILE."
@@ -636,7 +630,7 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
     (autoload 'parse-time-string "parse-time"))
 
 (eval-when-compile
-  (load "ange-ftp" t))
+  (require 'ange-ftp nil t))
 
 (defun eshell-parse-ange-ls (dir)
   (let (entry)
@@ -785,7 +779,7 @@ If NOSORT is non-nil, the list is not sorted--its order is unpredictable.
 ;     (or result
 ;      (file-attributes filename))))
 
-;;; Code:
+(provide 'esh-util)
 
 ;;; arch-tag: 70159778-5c7a-480a-bae4-3ad332fca19d
 ;;; esh-util.el ends here
index 7c04b5a942aa4612ff4a4aeaf04ce1effd49d031..dbc8802a9c54db0afe4457b1f2df23dcef160dc7 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'esh-var)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell-var nil
-  "Variable interpolation is introduced whenever the '$' character
-appears unquoted in any argument (except when that argument is
-surrounded by single quotes).  It may be used to interpolate a
-variable value, a subcommand, or even the result of a Lisp form."
-  :tag "Variable handling"
-  :group 'eshell)
-
 ;;; Commentary:
 
 ;; These are the possible variable interpolation syntaxes.  Also keep
@@ -118,9 +106,25 @@ variable value, a subcommand, or even the result of a Lisp form."
 ;; contains the exit code of the last command (0 or 1 for Lisp
 ;; functions, based on successful completion).
 
+(provide 'esh-var)
+
+(eval-when-compile
+  (require 'pcomplete)
+  (require 'esh-test)
+  (require 'esh-util)
+  (require 'esh-opt)
+  (require 'esh-mode))
 (require 'env)
 (require 'ring)
 
+(defgroup eshell-var nil
+  "Variable interpolation is introduced whenever the '$' character
+appears unquoted in any argument (except when that argument is
+surrounded by single quotes).  It may be used to interpolate a
+variable value, a subcommand, or even the result of a Lisp form."
+  :tag "Variable handling"
+  :group 'eshell)
+
 ;;; User Variables:
 
 (defcustom eshell-var-load-hook '(eshell-var-initialize)
index 23e361491748172d0b72a7ff1ee4839567d5fa17..58bc72a3ea9d2c1c34a0a8e9117d950bc092b1c1 100644 (file)
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
-(provide 'eshell)
-
-(eval-when-compile (require 'esh-maint))
-
-(defgroup eshell nil
-  "Eshell is a command shell implemented entirely in Emacs Lisp.  It
-invokes no external processes beyond those requested by the user.  It
-is intended to be a functional replacement for command shells such as
-bash, zsh, rc, 4dos; since Emacs itself is capable of handling most of
-the tasks accomplished by such tools."
-  :tag "The Emacs shell"
-  :link '(info-link "(eshell)Top")
-  :version "21.1"
-  :group 'applications)
-
 ;;; Commentary:
 
 ;;;_* What does Eshell offer you?
@@ -73,33 +58,9 @@ the tasks accomplished by such tools."
 ;; @ Alias functions, both Lisp and Eshell-syntax
 ;; @ Piping, sequenced commands, background jobs, etc...
 ;;
-;;;_* Eshell is free software
-;;
-;; Eshell 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 Eshell; see the file COPYING.  If not, write to the Free
-;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
-;; MA 02110-1301, USA.
-;;
 ;;;_* How to begin
 ;;
-;; To start using Eshell, add the following to your .emacs file:
-;;
-;;   (load "eshell-auto")
-;;
-;; This will define all of the necessary autoloads.
-;;
-;; Now type `M-x eshell'.  See the INSTALL file for full installation
-;; instructions.
+;; To start using Eshell, simply type `M-x eshell'.
 ;;
 ;;;_* Philosophy
 ;;
@@ -263,12 +224,28 @@ the tasks accomplished by such tools."
 ;; will only have to read in this one file, which will greatly speed
 ;; things up.
 
+(eval-when-compile
+  (require 'cl)
+  (require 'esh-util))
+(require 'esh-util)
+(require 'esh-mode)
+
+(defgroup eshell nil
+  "Eshell is a command shell implemented entirely in Emacs Lisp.  It
+invokes no external processes beyond those requested by the user.  It
+is intended to be a functional replacement for command shells such as
+bash, zsh, rc, 4dos; since Emacs itself is capable of handling most of
+the tasks accomplished by such tools."
+  :tag "The Emacs shell"
+  :link '(info-link "(eshell)Top")
+  :version "21.1"
+  :group 'applications)
+
+
 ;;;_* User Options
 ;;
 ;; The following user options modify the behavior of Eshell overall.
-
-(unless (featurep 'esh-util)
-  (load "esh-util" nil t))
+(defvar eshell-buffer-name)
 
 (defsubst eshell-add-to-window-buffer-names ()
   "Add `eshell-buffer-name' to `same-window-buffer-names'."
@@ -280,19 +257,19 @@ the tasks accomplished by such tools."
        (delete eshell-buffer-name same-window-buffer-names)))
 
 (defcustom eshell-load-hook nil
-  "*A hook run once Eshell has been loaded."
+  "A hook run once Eshell has been loaded."
   :type 'hook
   :group 'eshell)
 
 (defcustom eshell-unload-hook
   '(eshell-remove-from-window-buffer-names
     eshell-unload-all-modules)
-  "*A hook run when Eshell is unloaded from memory."
+  "A hook run when Eshell is unloaded from memory."
   :type 'hook
   :group 'eshell)
 
 (defcustom eshell-buffer-name "*eshell*"
-  "*The basename used for Eshell buffers."
+  "The basename used for Eshell buffers."
   :set (lambda (symbol value)
         ;; remove the old value of `eshell-buffer-name', if present
         (if (boundp 'eshell-buffer-name)
@@ -309,7 +286,7 @@ the tasks accomplished by such tools."
   (member eshell-buffer-name same-window-buffer-names))
 
 (defcustom eshell-directory-name (convert-standard-filename "~/.eshell/")
-  "*The directory where Eshell control files should be kept."
+  "The directory where Eshell control files should be kept."
   :type 'directory
   :group 'eshell)
 
@@ -356,10 +333,8 @@ buffer selected (or created)."
     ;; `same-window-buffer-names', which is done when Eshell is loaded
     (assert (and buf (buffer-live-p buf)))
     (pop-to-buffer buf)
-    (if (fboundp 'eshell-mode)
-       (unless (eq major-mode 'eshell-mode)
-         (eshell-mode))
-      (error "`eshell-auto' must be loaded before Eshell can be used"))
+    (unless (eq major-mode 'eshell-mode)
+      (eshell-mode))
     buf))
 
 (defun eshell-return-exits-minibuffer ()
@@ -406,7 +381,6 @@ With prefix ARG, insert output into the current buffer at point."
                    (format " >>> #<buffer %s>"
                            (buffer-name (current-buffer))))))
   (save-excursion
-    (require 'esh-mode)
     (let ((buf (set-buffer (generate-new-buffer " *eshell cmd*")))
          (eshell-non-interactive-p t))
       (eshell-mode)
@@ -465,7 +439,6 @@ corresponding to a successful execution."
        (if (and status-var (symbolp status-var))
           (set status-var 0)))
     (with-temp-buffer
-      (require 'esh-mode)
       (let ((eshell-non-interactive-p t))
        (eshell-mode)
        (let ((result (eshell-do-eval
@@ -483,40 +456,12 @@ corresponding to a successful execution."
 
 ;;;_* Reporting bugs
 ;;
-;; Since Eshell has not yet been in use by a wide audience, and since
-;; the number of possible configurations is quite large, it is certain
-;; that many bugs slipped past the rigors of testing it was put
-;; through.  If you do encounter a bug, on any system, please report
+;; If you do encounter a bug, on any system, please report
 ;; it -- in addition to any particular oddities in your configuration
 ;; -- so that the problem may be corrected for the benefit of others.
 
-(defconst eshell-report-bug-address "johnw@gnu.org"
-  "E-mail address to send Eshell bug reports to.")
-
 ;;;###autoload
-(defun eshell-report-bug (topic)
-  "Report a bug in Eshell.
-Prompts for the TOPIC.  Leaves you in a mail buffer.
-Please include any configuration details that might be involved."
-  (interactive "sBug Subject: ")
-  (compose-mail eshell-report-bug-address topic)
-  (goto-char (point-min))
-  (re-search-forward (concat "^" (regexp-quote mail-header-separator) "$"))
-  (forward-line 1)
-  (let ((signature (buffer-substring (point) (point-max))))
-    ;; Discourage users from writing non-English text.
-    (set-buffer-multibyte nil)
-    (delete-region (point) (point-max))
-    (insert signature)
-    (backward-char (length signature)))
-  (insert "emacs-version: " (emacs-version))
-  (insert "\n\nThere appears to be a bug in Eshell.\n\n"
-         "Please describe exactly what actions "
-         "triggered the bug and the precise\n"
-         "symptoms of the bug:\n\n")
-  ;; This is so the user has to type something in order to send
-  ;; the report easily.
-  (use-local-map (nconc (make-sparse-keymap) (current-local-map))))
+(define-obsolete-function-alias 'eshell-report-bug 'report-emacs-bug "23.1")
 
 ;;; Code:
 
@@ -543,5 +488,7 @@ Emacs."
 
 (run-hooks 'eshell-load-hook)
 
+(provide 'eshell)
+
 ;;; arch-tag: 9d4d5214-0e4e-4e02-b349-39add640d63f
 ;;; eshell.el ends here
index 8c338bd947ab755fbf79b9241112b9f674d20bd5..d045e5aa7f90401c5185363658631f7f68cf7c3c 100644 (file)
@@ -1045,6 +1045,9 @@ Assumes the buffer has not changed."
       ;; Older: (apply 'copy-region-as-kill ffap-string-at-point-region)
       (message "Copied to kill ring: %s"  str))))
 
+;; External.
+(declare-function w3-view-this-url "ext:w3" (&optional no-show))
+
 (defun ffap-url-at-point nil
   "Return url from around point if it exists, or nil."
   ;; Could use w3's url-get-url-at-point instead.  Both handle "URL:",
@@ -1687,20 +1690,8 @@ Only intended for interactive use."
 \f
 ;;; Bug Reporter:
 
-(defun ffap-bug nil
-  "Submit a bug report for the ffap package."
-  ;; Important: keep the version string here in synch with that at top
-  ;; of file!  Could use lisp-mnt from Emacs 19, but that would depend
-  ;; on being able to find the ffap.el source file.
-  (interactive)
-  (require 'reporter)
-  (let ((reporter-prompt-for-summary-p t))
-    (reporter-submit-bug-report
-     "Michelangelo Grigni <mic@mathcs.emory.edu>"
-     "ffap"
-     (mapcar 'intern (all-completions "ffap-" obarray 'boundp)))))
-
-(fset 'ffap-submit-bug 'ffap-bug)      ; another likely name
+(define-obsolete-function-alias 'ffap-bug 'report-emacs-bug "23.1")
+(define-obsolete-function-alias 'ffap-submit-bug 'report-emacs-bug "23.1")
 
 \f
 ;;; Hooks for Gnus, VM, Rmail:
@@ -1724,6 +1715,13 @@ Only intended for interactive use."
 (defvar gnus-summary-buffer)
 (defvar gnus-article-buffer)
 
+;; This code is called from gnus.
+(declare-function gnus-summary-select-article "gnus-sum"
+                  (&optional all-headers force pseudo article))
+
+(declare-function gnus-configure-windows "gnus-win"
+                  (setting &optional force))
+
 (defun ffap-gnus-wrapper (form)                ; used by both commands below
   (and (eq (current-buffer) (get-buffer gnus-summary-buffer))
        (gnus-summary-select-article))  ; get article of current line
index 18c537fed7c45a04cde7e3f9e02d079719504570..5138c947b7d3128fe7e23d9e76581de1dfc2e41a 100644 (file)
@@ -780,10 +780,6 @@ match REGEXP."
 ;; Keybindings
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;;;###autoload (define-key minibuffer-local-completion-map [C-tab] 'file-cache-minibuffer-complete)
-;;;###autoload (define-key minibuffer-local-map [C-tab] 'file-cache-minibuffer-complete)
-;;;###autoload (define-key minibuffer-local-must-match-map [C-tab] 'file-cache-minibuffer-complete)
-
 (provide 'filecache)
 
 ;;; arch-tag: 433d3ca4-4af2-47ce-b2cf-1f727460f538
index a7dd79b8a88be88a12222658379d767f9818c789..8d5fcfda8c298038a543e204bcd9d61658ece3ac 100644 (file)
@@ -213,6 +213,15 @@ have fast storage with limited space, such as a RAM disk."
 ;; The system null device. (Should reference NULL_DEVICE from C.)
 (defvar null-device "/dev/null" "The system null device.")
 
+(declare-function msdos-long-file-names "msdos.c")
+(declare-function w32-long-file-name "w32proc.c")
+(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
+(declare-function dired-unmark "dired" (arg))
+(declare-function dired-do-flagged-delete "dired" (&optional nomessage))
+(declare-function dos-8+3-filename "dos-fns" (filename))
+(declare-function vms-read-directory "vms-patch" (dirname switches buffer))
+(declare-function view-mode-disable "view" ())
+
 (defvar file-name-invalid-regexp
   (cond ((and (eq system-type 'ms-dos) (not (msdos-long-file-names)))
         (concat "^\\([^A-Z[-`a-z]\\|..+\\)?:\\|" ; colon except after drive
@@ -2428,7 +2437,11 @@ Otherwise, return nil; point may be changed."
                             ;; put them in the first line of
                             ;; such a file without screwing up
                             ;; the interpreter invocation.
-                            (and (looking-at "^#!") 2)) t)
+                            ;; The same holds for
+                            ;;   '\"
+                            ;; in man pages (preprocessor
+                            ;; magic for the `man' program).
+                            (and (looking-at "^\\(#!\\|'\\\\\"\\)") 2)) t)
      (progn
        (skip-chars-forward " \t")
        (setq beg (point))
@@ -2619,7 +2632,7 @@ n  -- to ignore the local variables list.")
                 (if offer-save '(?! ?y ?n ?\s ?\C-g) '(?y ?n ?\s ?\C-g)))
                done)
            (while (not done)
-             (message prompt)
+             (message "%s" prompt)
              (setq char (read-event))
              (if (numberp char)
                  (cond ((eq char ?\C-v)
index f82012500968cbf90842e9942b1daf7d38117492..dab7c9b3af4f94cd17343d816db4e7f85b0d12ad 100644 (file)
@@ -886,6 +886,13 @@ The value of this variable is used when Font Lock mode is turned on."
 (defvar lazy-lock-mode)
 (defvar jit-lock-mode)
 
+(declare-function fast-lock-after-fontify-buffer "fast-lock")
+(declare-function fast-lock-after-unfontify-buffer "fast-lock")
+(declare-function fast-lock-mode "fast-lock")
+(declare-function lazy-lock-after-fontify-buffer "lazy-lock")
+(declare-function lazy-lock-after-unfontify-buffer "lazy-lock")
+(declare-function lazy-lock-mode "lazy-lock")
+
 (defun font-lock-turn-on-thing-lock ()
   (let ((thing-mode (font-lock-value-in-major-mode font-lock-support-mode)))
     (cond ((eq thing-mode 'fast-lock-mode)
similarity index 100%
rename from lisp/gnus/format-spec.el
rename to lisp/format-spec.el
index 1c11829475bd81e08920dcc74b76c675bbb0f412..df3ed16f57432c62b36b23a7ab8873a58b3df7a3 100644 (file)
@@ -292,8 +292,9 @@ there (in decreasing order of priority)."
   ;; the buffer of the selected window, which fails when the selected
   ;; window is the minibuffer.
   (let ((old-buffer (current-buffer))
-       (window-system-frame-alist (cdr (assq initial-window-system
-                                             window-system-default-frame-alist))))
+       (window-system-frame-alist
+         (cdr (assq initial-window-system
+                    window-system-default-frame-alist))))
 
     (when (and frame-notice-user-settings
               (null frame-initial-frame))
@@ -599,6 +600,8 @@ is not considered (see `next-frame')."
                                  0))
   (select-frame-set-input-focus (selected-frame)))
 
+(declare-function x-initialize-window-system "term/x-win" ())
+
 (defun make-frame-on-display (display &optional parameters)
   "Make a frame on X display DISPLAY.
 The optional second argument PARAMETERS specifies additional frame parameters."
@@ -714,7 +717,8 @@ setup is for focus to follow the pointer."
              (let ((type (terminal-live-p (cdr (assq 'terminal parameters)))))
                (cond
                 ((eq type t) nil)
-                ((eq type nil) (error "Terminal %s does not exist" (cdr (assq 'terminal parameters))))
+                ((eq type nil) (error "Terminal %s does not exist"
+                                       (cdr (assq 'terminal parameters))))
                 (t type))))
             ((assq 'window-system parameters)
              (cdr (assq 'window-system parameters)))
@@ -725,7 +729,10 @@ setup is for focus to follow the pointer."
     (unless frame-creation-function
       (error "Don't know how to create a frame on window system %s" w))
     (run-hooks 'before-make-frame-hook)
-    (setq frame (funcall frame-creation-function (append parameters (cdr (assq w window-system-default-frame-alist)))))
+    (setq frame
+          (funcall frame-creation-function
+                   (append parameters
+                           (cdr (assq w window-system-default-frame-alist)))))
     (normal-erase-is-backspace-setup-frame frame)
     ;; Inherit the original frame's parameters.
     (dolist (param frame-inherited-parameters)
@@ -1126,6 +1133,8 @@ bars (top, bottom, or nil)."
   "Return the terminal that is now selected."
   (frame-terminal (selected-frame)))
 
+(declare-function msdos-mouse-p "dosfns.c")
+
 (defun display-mouse-p (&optional display)
   "Return non-nil if DISPLAY has a mouse available.
 DISPLAY can be a display name, a frame, or nil (meaning the selected
index fbabf6e6996e1391fc861b261b77ced873966cd2..f400b299b9ebf5d133efa10c0ca1125f3499a50e 100644 (file)
@@ -383,6 +383,10 @@ your changes into effect."
   "Generic mode for HOSTS files."))
 
 ;;; Windows INF files
+
+;; If i-g-m-f-f-h is defined, then so is i-g-m.
+(declare-function ini-generic-mode "generic-x")
+
 (when (memq 'inf-generic-mode generic-extras-enable-list)
 
 (define-generic-mode inf-generic-mode
@@ -443,6 +447,8 @@ like an INI file.  You can add this hook to `find-file-hook'."
            '((nil "^\\s-*\\(.*\\)\\s-*=" 1))))))
   "Generic mode for MS-Windows Registry files."))
 
+(declare-function w32-shell-name "w32-fns" ())
+
 ;;; DOS/Windows BAT files
 (when (memq 'bat-generic-mode generic-extras-enable-list)
 
index 7ac757f24e2c686f99857fbdf4261e7d028dcd37..bb92d478277d2b83b26ec0a745aeb5f790cd32f2 100644 (file)
@@ -1,3 +1,422 @@
+2007-12-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-use-idna)
+       * gnus-start.el (gnus-site-init-file)
+       * message.el (message-use-idna)
+       * mm-uu.el (mm-uu-hide-markers)
+       * smiley.el (smiley-style): Revert changes that suppress warnings.
+
+2007-12-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-article-browse-html-parts): Add meta html tag to
+       specify charset to html source.  Reported by Christoph Conrad
+       <christoph.conrad@gmx.de>.
+
+2007-12-05  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (gnus-use-idna): Don't directly refer to the value of
+       idna-program in order to suppress byte compile warning issued by XEmacs
+       that came to byte compile the default value section of defcustom forms
+       recently.
+
+       * gnus-start.el (gnus-site-init-file): Don't directly refer to the
+       value of installation-directory.
+
+       * message.el (message-use-idna): Don't directly refer to the value of
+       idna-program.
+
+       * mm-uu.el (mm-uu-hide-markers): Don't directly call defined-colors.
+
+       * smiley.el (smiley-style): Don't directly call face-attribute.
+
+2007-12-04  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-group.el (gnus-group-highlight-line): Add FIXME.
+
+       * gnus-dired.el: Reduce Gnus dependencies.
+       (gnus-ems, gnus-msg, gnus-util, message, mm-decode, mml): Don't
+       require.  Use autoloads instead.
+       (mml-attach-file, mm-default-file-encoding, mailcap-extension-to-mime)
+       (mailcap-mime-info, mm-mailcap-command, ps-print-preprint)
+       (message-buffers, gnus-setup-message, gnus-print-buffer): Autoload.
+       (gnus-dired-mode): Adjust doc string.
+       (gnus-dired-mail-mode): New variable.
+       (gnus-dired-mode-map): Avoid using `gnus-define-keys'.
+       (gnus-dired-mode): Avoid using `gnus-run-hooks'.
+       (gnus-dired-mail-buffers): New function.  Return mail or message
+       composition buffers.
+       (gnus-dired-attach): Use it.
+       (gnus-dired-find-file-mailcap): Call `mailcap-mime-info' with
+       NO-DECODE.
+       (gnus-dired-print): Use `gnus-print-buffer' depending on
+       `gnus-dired-mail-mode'.
+
+2007-12-04  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * rfc2047.el (rfc2047-encoded-word-regexp)
+       (rfc2047-encoded-word-regexp-loose): Move forward; add comments
+       explaining what regexp patterns are for.
+
+2007-12-04  Glenn Morris  <rgm@gnu.org>
+
+       * password.el: Move to ../password-cache.el.
+
+       * mml1991.el (password-read, password-cache-add, password-cache-remove):
+       * mml2015.el (password-read, password-cache-add, password-cache-remove):
+       * mml-smime.el (password-read, password-cache-add)
+       (password-cache-remove):
+       No need to autoload, since mml-sec requires password.
+
+       * gnus.el (gnus-spam-resend-to, gnus-ham-resend-to):
+       * message.el (gnus-extract-address-components):
+       * mml-smime.el (gnus-extract-address-components): Define for compiler.
+
+       * mml-sec.el, sieve-manage.el, smime.el: Require password-cache or
+       password.
+
+2007-12-03  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * mailcap.el: Reduce dependencies.
+       (mail-header-parse-content-type): Autoload.
+       (mailcap-delete-duplicates): New alias.
+       (mailcap-mime-info): Add optional argument NO-DECODE.
+       (mailcap-mime-types): Use mailcap-delete-duplicates.
+
+       * message.el (message-ignored-supersedes-headers): Add "X-ID".
+
+2007-12-03  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * gnus-sum.el (gnus-uu-extract-map): Add a command for the yenc
+       function.
+
+       * gnus-uu.el (gnus-uu-decode-yenc): New command.
+       (gnus-uu-yenc-article): New function.
+
+       * yenc.el (yenc-first-part-p, yenc-last-part-p): New functions.
+
+       * mm-uu.el (mm-uu-yenc-extract): Get the data from the original
+       buffer.
+
+2007-12-02  Glenn Morris  <rgm@gnu.org>
+
+       * sasl-cram.el, sasl-digest.el, sasl-ntlm.el, sasl.el:
+       Move to ../net.
+
+       * binhex.el, uudecode.el: Move to ../mail.
+
+       * encrypt.el: Remove file.
+
+2007-12-01  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.el (message-cite-prefix-regexp): Remove `-' and `+' to avoid
+       matches on patches.
+
+       * gnus-art.el (gnus-article-browse-html-article): Mention
+       `mm-text-html-renderer' in the doc string.
+
+       * rfc2047.el (rfc2047-encode-max-chars): Refer to RFC 2047 in doc
+       string.  Add comments.
+
+       * message.el (message-idna-to-ascii-rhs-1): Don't call `idna-to-ascii'
+       if rhs is ASCII.
+
+2007-12-01  Glenn Morris  <rgm@gnu.org>
+
+       * dig.el, dns.el: Move to ../net.
+       * format-spec.el, hex-util.el, sha1.el: Move to ../.
+
+       * mail-source.el (top-level): Require format-spec before
+       eval-when-compile.
+
+2007-11-30  Glenn Morris  <rgm@gnu.org>
+
+       * encrypt.el: Require password, rather than autoloading password-read.
+
+2007-11-28  Elias Oltmanns  <eo@nebensachen.de>
+
+       * gnus.el (gnus-method-to-server): Add an optional parameter so the
+       caller can indicate whether the cache should be disregarded for this
+       call.  This way the result of the call is reproducible at all times and
+       can be considered a canonical server name for the supplied method.
+       (gnus-agent-method-p): Canonicalize server names by pushing their
+       method through `gnus-method-to-server' using the no-cache argument.
+
+       * gnus-srvr.el (gnus-server-insert-server-line): Call
+       `gnus-method-to-server' with `no-cache' argument.
+
+       * gnus-agent.el (gnus-agent-toggle-plugged): Don't call
+       gnus-agent-possibly-synchronize-flags as this should be called when the
+       server is actually being opened.
+       (gnus-agent-possibly-synchronize-flags)
+       (gnus-agent-possibly-synchronize-flags-server): Move check for the
+       flags file of an agentized server to the latter function.
+
+       * gnus-int.el (gnus-agent-possibly-synchronize-flags-server): Autoload.
+       (gnus-open-server): Call gnus-agent-possibly-synchronize-flags-server
+       after a connection has been established successfully.
+
+2007-11-28  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-art.el (article-display-face): Force to display face if called
+       interactively; check if gnus-article-x-face-too-ugly matches author.
+       (article-display-x-face): Display face even if From header is missing
+       as article-display-face does.
+
+2007-11-28  Richard Stallman  <rms@gnu.org>
+
+       * md4.el: Move to ../.
+       * hmac-def.el, hmac-md5.el, ntlm.el: Move to ../net.
+
+2007-11-27  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * mail-source.el (mail-sources): Default to fetch from file for
+       compatibility with default of nnmail-spool-file.
+
+2007-11-27  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * rfc2047.el (rfc2047-allow-irregular-q-encoded-words): New variable.
+       (rfc2047-encodable-p): Use rfc2047-encoded-word-regexp instead of "=?"
+       to look for encoded word that should be encoded again.
+       (rfc2047-encoded-word-regexp): Make B encoding pattern strict.
+       (rfc2047-encoded-word-regexp-loose): New constant that has loose Q
+       encoding pattern.
+       (rfc2047-decode-region): Switch strict regexp and loose one according
+       to rfc2047-allow-irregular-q-encoded-words.
+
+2007-11-26  Simon Josefsson  <simon@josefsson.org>
+
+       * imap.el: Move to ../net directory.
+
+2007-11-25  Romain Francoise  <romain@orebokech.com>
+
+       * gnus-msg.el (gnus-summary-reply): Delete extra paren.
+
+2007-11-24  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * nnmail.el (nnmail-spool-file): Remove obsolete variable.
+       (nnmail-get-new-mail): Remove code using `nnmail-spool-file'.
+
+       * gnus-start.el (defvar, gnus-get-unread-articles): Remove code using
+       `nnmail-spool-file'.
+
+       * nnkiboze.el (nnkiboze-generate-groups): Don't bind obsolete
+       `nnmail-spool-file'.
+
+       * gnus-move.el (gnus-change-server): Ditto.
+
+       * gnus-kill.el (gnus-batch-score): Ditto.
+
+       * gnus-cache.el (gnus-jog-cache): Ditto.
+
+       * gnus-msg.el (gnus-summary-reply): Ignore
+       gnus-confirm-mail-reply-to-news for wide and very wide replies.
+
+2007-11-24  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-cache.el (gnus-cache-generate-nov-databases): Use
+       nnml-generate-nov-databases-directory instead of
+       nnml-generate-nov-databases-1.
+
+2007-11-24  Glenn Morris  <rgm@gnu.org>
+
+       * message.el (message-tool-bar-retro): Update for rename
+       mail_send.xpm->mail-send.xpm.
+
+2007-11-22  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * smime.el (smime-cert-by-ldap-1): Use `ldap-search' instead of
+       `smime-ldap-search' for Emacs 22 and up.
+
+2007-11-22  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * hashcash.el: Move to ../mail directory.
+
+       * smime-ldap.el: Remove.  Not used in Emacs 22 and up.
+
+       * smime.el (smime-cert-by-ldap-1): Use `ldap-search' instead of
+       `smime-ldap-search' for Emacs 22 and up.
+
+2007-11-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * gnus-art.el (gnus-article-truncate-lines): Use `truncate-lines'.
+
+       * message.el (message-send-mail-function): Fix error convention.
+       (message-mailer-swallows-blank-line, message-send-mail-with-sendmail)
+       (message-widen-reply, message-send-mail, message-talkative-question)
+       (message-with-reply-buffer, message-generate-new-buffer-clone-locals)
+       (message-clone-locals, message-send-news): Use with-current-buffer.
+       (message-insert-or-toggle-importance): Remove unused var `valid'.
+       (message-make-references): Remove unused var `new-references'.
+       (message-make-mail-followup-to): Remove unused var `subscribed-lists'.
+
+2007-11-22  Juanma Barranquero  <lekktu@gmail.com>
+
+       * spam.el (spam-find-spam, spam-enter-list): Doc fixes.
+       (spam-split-symbolic-return-positive): Reflow docstring.
+       (spam-backends, spam-summary-exit-behavior)
+       (spam-mark-ham-unread-before-move-from-spam-group)
+       (spam-summary-score-preferred-header, spam-sa-learn-spam-switch)
+       (spam-sa-learn-ham-switch, spam-sa-learn-unregister-switch)
+       (spam-clear-cache, spam-backend-check, spam-install-backend)
+       (spam-install-statistical-backend, spam-list-of-processors)
+       (spam-group-processor-p, spam-split, spam-bogofilter-score)
+       (spam-bsfilter-score, spam-check-bsfilter, spam-crm114-score)
+       (spam-check-crm114, spam-initialize, spam-unload-hook):
+       Fix typos in docstrings.
+
+2007-11-21  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-start.el (gnus-get-unread-articles): Mark groups as having never
+       been checked if they have never been read and those group levels are
+       higher than the one that a user specified.
+
+2007-11-21  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-start.el (gnus-get-unread-articles): Don't prevent from checking
+       foreign groups unless a group level is specified by a user.
+       Reported by Dan Nicolaescu <dann@ics.uci.edu>.
+
+2007-11-21  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.el (message-send-mail-function): Require sendmail.
+
+2007-11-20  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * message.el (message-send-mail-function): Check for smtpmail too.
+
+       * utf7.el (utf7-encode, utf7-decode): Use coding system
+       `utf-7'/`utf-7-imap' from utf-7.el' if available.
+
+       * message.el (message-send-mail-function): New function.
+       (message-send-mail-function): Set default using
+       message-send-mail-function.  Adjust doc string.
+       (message-send-mail-with-mailclient): New function.
+
+2007-11-17  Richard Stallman  <rms@gnu.org>
+
+       * assistant.el: Remove file.
+
+2007-11-16  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * smime.el (from):
+       * rfc2047.el (message-posting-charset):
+       * qp.el (mm-use-ultra-safe-encoding):
+       * pop3.el (parse-time-months):
+       * nnrss.el (mm-text-html-renderer, mm-text-html-washer-alist):
+       * nnml.el (files):
+       * nnheader.el (gnus-newsgroup-name, nnheader-file-coding-system)
+       (jka-compr-compression-info-list, ange-ftp-path-format)
+       (efs-path-regexp):
+       * nndiary.el (files):
+       * mml2015.el (mc-default-scheme, mc-schemes, pgg-default-user-id)
+       (pgg-errors-buffer, pgg-output-buffer, epg-user-id-alist)
+       (epg-digest-algorithm-alist, inhibit-redisplay)
+       (password-cache-expiry):
+       * mml1991.el (pgg-default-user-id, pgg-errors-buffer)
+       (pgg-output-buffer, password-cache-expiry):
+       * mml.el (mml-dnd-protocol-alist, ange-ftp-name-format)
+       (efs-path-regexp):
+       * mml-smime.el (epg-user-id-alist, epg-digest-algorithm-alist)
+       (inhibit-redisplay):
+       * mm-uu.el (file-name, start-point, end-point, entry)
+       (gnus-newsgroup-name, gnus-newsgroup-charset):
+       * mm-util.el (mm-mime-mule-charset-alist, latin-unity-coding-systems)
+       (latin-unity-ucs-list):
+       * mm-bodies.el (mm-uu-yenc-decode-function, mm-uu-decode-function)
+       (mm-uu-binhex-decode-function):
+       * message.el (gnus-message-group-art, gnus-list-identifiers, )
+       (rmail-enable-mime-composing, gnus-local-organization)
+       (gnus-post-method, gnus-select-method, gnus-active-hashtb)
+       (gnus-read-active-file, facemenu-add-face-function)
+       (facemenu-remove-face-function, gnus-article-decoded-p)
+       (tool-bar-mode):
+       * mail-source.el (display-time-mail-function):
+       * gnus-util.el (nnmail-pathname-coding-system)
+       (nnmail-active-file-coding-system, gnus-emphasize-whitespace-regexp)
+       (gnus-original-article-buffer, gnus-user-agent)
+       (rmail-default-rmail-file, mm-text-coding-system, tool-bar-mode)
+       (xemacs-codename, sxemacs-codename, emacs-program-version):
+       * gnus-sum.el (tool-bar-mode, gnus-tmp-header, number):
+       * gnus-start.el (gnus-agent-covered-methods)
+       (gnus-agent-file-loading-local, gnus-agent-file-loading-cache)
+       (gnus-current-headers, gnus-thread-indent-array, gnus-newsgroup-name)
+       (gnus-newsgroup-headers, gnus-group-list-mode)
+       (gnus-group-mark-positions, gnus-newsgroup-data)
+       (gnus-newsgroup-unreads, nnoo-state-alist)
+       (gnus-current-select-method, mail-sources)
+       (nnmail-scan-directory-mail-source-once, nnmail-split-history)
+       (nnmail-spool-file, gnus-cache-active-hashtb):
+       * gnus-mh.el (mh-lib-progs):
+       * gnus-ems.el (gnus-tmp-unread, gnus-tmp-replied)
+       (gnus-tmp-score-char, gnus-tmp-indentation, gnus-tmp-opening-bracket)
+       (gnus-tmp-lines, gnus-tmp-name, gnus-tmp-closing-bracket)
+       (gnus-tmp-subject-or-nil, gnus-check-before-posting, gnus-mouse-face)
+       (gnus-group-buffer):
+       * gnus-cite.el (font-lock-defaults-computed, font-lock-keywords)
+       (font-lock-set-defaults):
+       * gnus-art.el (tool-bar-map, w3m-minor-mode-map)
+       (gnus-face-properties-alist, charset, gnus-summary-article-menu)
+       (gnus-summary-post-menu, total-parts, type, condition, length):
+       * gnus-agent.el (gnus-agent-read-agentview):
+       * flow-fill.el (show-trailing-whitespace):
+       * gnus-group.el (tool-bar-mode, nnrss-group-alist): Remove unnecessary
+       eval-and-compile wrappers for byte compiler pacifiers.
+
+       * mm-view.el (mm-inline-image-xemacs): Only do something for XEmacs.
+       (mm-display-inline-fontify): Check for featurep 'xemacs not
+       extent-list.
+
+       * mm-decode.el (mm-display-external): Check for featurep 'xemacs not
+       itimer-list.
+       (mm-create-image-xemacs): Only do something for XEmacs.
+       (mm-image-fit-p): Check for featurep 'xemacs not glyph-width.
+
+       * mm-util.el (mm-find-buffer-file-coding-system): Add check for XEmacs.
+
+       * gnus-registry.el (gnus-adaptive-word-syntax-table):
+       * gnus-fun.el (gnus-face-properties-alist): Pacify byte compiler.
+
+2007-11-15  Juanma Barranquero  <lekktu@gmail.com>
+
+       * nnimap.el (nnimap-split-download-body):
+       * gnus-demon.el (gnus-demon):
+       * gnus-uu.el (gnus-uu-default-view-rules): Fix typos in docstrings.
+
+2007-11-15  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * nntp.el (nntp-insert-buffer-substring, nntp-copy-to-buffer): New
+       macros.
+       (nntp-wait-for, nntp-retrieve-articles, nntp-async-trigger)
+       (nntp-retrieve-headers-with-xover): Use nntp-insert-buffer-substring to
+       copy data from unibyte buffer to multibyte current buffer.
+       (nntp-retrieve-headers, nntp-retrieve-groups); Use nntp-copy-to-buffer
+       to copy data from unibyte current buffer to multibyte buffer.
+       (nntp-make-process-buffer): Make process buffer unibyte.
+
+       * pop3.el (pop3-open-server): Fix typo in Lisp code.
+
+2007-11-14  Denys Duchier  <denys.duchier@univ-orleans.fr>  (tiny change)
+
+       * pop3.el (pop3-open-server): Accept and process data more robustly at
+       connexion start to avoid spurious "POP SSL connexion failed" errors.
+
+2007-11-14  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * gnus-start.el (gnus-active-to-gnus-format): Use unibyte buffer to
+       read group names.
+
+2007-11-12  Reiner Steib  <Reiner.Steib@gmx.de>
+
+       * gnus-msg.el (gnus-confirm-mail-reply-to-news): Adjust :version.
+
+2007-11-12  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * nnmail.el (nnmail-parse-active): Make group names unibyte.
+       (nnmail-save-active): Use a unibyte buffer when saving active file,
+       which may contain non-ASCII group names.
+
+       * nnml.el (nnml-request-group): Decode group names in messages.
+
 2007-11-05  Reiner Steib  <Reiner.Steib@gmx.de>
 
        * message.el (message-citation-line-function)
 
 2007-10-04  Reiner Steib  <Reiner.Steib@gmx.de>
 
-        * Relicense "GPLv2 or later" files to "GPLv3 or later".
+       * Relicense "GPLv2 or later" files to "GPLv3 or later".
 
 2007-09-27  Teodor Zlatanov  <tzz@lifelogs.com>
 
        eval-when-compile, to define gnus-agent-set-cat-groups as the setf
        method of gnus-agent-cat-groups even when the buffer has been
        evaled.
-       (gnus-agent-save-active,gnus-agent-save-active-1): Merged to
+       (gnus-agent-save-active, gnus-agent-save-active-1): Merged to
        delete gnus-agent-save-active-1.
        (gnus-agent-save-groups): Deleted. Identical to
        gnus-agent-save-active.
        servers.  Add use of min/max range limits from server's local
        file.
        (gnus-agent-save-alist): Removed unused optional argument.
-       (gnus-agent-load-local,gnus-agent-read-and-cache-local),
-       (gnus-agent-read-local,gnus-agent-save-local,gnus-agent-get-local),
+       (gnus-agent-load-local, gnus-agent-read-and-cache-local),
+       (gnus-agent-read-local, gnus-agent-save-local, gnus-agent-get-local),
        (gnus-agent-set-local): A per-server file that keeps min/max range
-       limits for articles known to the agent.  Provides a fast mechanism
+       limits for articles known to the agent.  Provides a fast mechanism
        for altering many active ranges.
-       (gnus-agent-expire-group,gnus-agent-expire): No longer save the
+       (gnus-agent-expire-group, gnus-agent-expire): No longer save the
        active file (local makes it unnecessary).
        (gnus-agent-regenerate-group): Fixed XEmacs compatibility.
 
diff --git a/lisp/gnus/assistant.el b/lisp/gnus/assistant.el
deleted file mode 100644 (file)
index 25ff173..0000000
+++ /dev/null
@@ -1,487 +0,0 @@
-;;; assistant.el --- guiding users through Emacs setup
-;; Copyright (C) 2004, 2005 Free Software Foundation, Inc.
-
-;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
-;; Keywords: util
-
-;; 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, 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-
-;;; Code:
-
-(eval-when-compile
-  (require 'cl))
-
-(require 'widget)
-(require 'wid-edit)
-
-(autoload 'gnus-error "gnus-util")
-(autoload 'netrc-get "netrc")
-(autoload 'netrc-machine "netrc")
-(autoload 'netrc-parse "netrc")
-
-(defvar assistant-readers
-  '(("variable" assistant-variable-reader)
-    ("validate" assistant-sexp-reader)
-    ("result" assistant-list-reader)
-    ("next" assistant-list-reader)
-    ("text" assistant-text-reader)))
-
-(defface assistant-field '((t (:bold t)))
-  "Face used for editable fields."
-  :group 'gnus-article-emphasis)
-;; backward-compatibility alias
-(put 'assistant-field-face 'face-alias 'assistant-field)
-
-;;; Internal variables
-
-(defvar assistant-data nil)
-(defvar assistant-current-node nil)
-(defvar assistant-previous-nodes nil)
-(defvar assistant-widgets nil)
-
-(defun assistant-parse-buffer ()
-  (let (results command value)
-    (goto-char (point-min))
-    (while (search-forward "@" nil t)
-      (if (not (looking-at "[^ \t\n]+"))
-         (error "Dangling @")
-       (setq command (downcase (match-string 0)))
-       (goto-char (match-end 0)))
-      (setq value
-           (if (looking-at "[ \t]*\n")
-               (let (start)
-                 (forward-line 1)
-                 (setq start (point))
-                 (unless (re-search-forward (concat "^@end " command) nil t)
-                   (error "No @end %s found" command))
-                 (beginning-of-line)
-                 (prog1
-                     (buffer-substring start (point))
-                   (forward-line 1)))
-             (skip-chars-forward " \t")
-             (prog1
-                 (buffer-substring (point) (point-at-eol))
-               (forward-line 1))))
-      (push (list command (assistant-reader command value))
-           results))
-    (assistant-segment (nreverse results))))
-
-(defun assistant-text-reader (text)
-  (with-temp-buffer
-    (insert text)
-    (goto-char (point-min))
-    (let ((start (point))
-         (sections nil))
-      (while (re-search-forward "@\\([^{]+\\){\\([^}]+\\)}" nil t)
-       (push (buffer-substring start (match-beginning 0))
-             sections)
-       (push (list (match-string 1) (match-string 2))
-             sections)
-       (setq start (point)))
-      (push (buffer-substring start (point-max))
-           sections)
-      (nreverse sections))))
-
-;; Segment the raw assistant data into a list of nodes.
-(defun assistant-segment (list)
-  (let ((ast nil)
-       (node nil)
-       (title (pop list)))
-    (dolist (elem list)
-      (when (and (equal (car elem) "node")
-                node)
-       (push (list "save" nil) node)
-       (push (nreverse node) ast)
-       (setq node nil))
-      (push elem node))
-    (when node
-      (push (list "save" nil) node)
-      (push (nreverse node) ast))
-    (cons title (nreverse ast))))
-
-(defun assistant-reader (command value)
-  (let ((formatter (cadr (assoc command assistant-readers))))
-    (if (not formatter)
-       value
-      (funcall formatter value))))
-
-(defun assistant-list-reader (value)
-  (car (read-from-string (concat "(" value ")"))))
-
-(defun assistant-variable-reader (value)
-  (let ((section (car (read-from-string (concat "(" value ")")))))
-    (append section (list 'default))))
-
-(defun assistant-sexp-reader (value)
-  (if (zerop (length value))
-      nil
-    (car (read-from-string value))))
-
-(defun assistant-buffer-name (title)
-  (format "*Assistant %s*" title))
-
-(defun assistant-get (ast command)
-  (cadr (assoc command ast)))
-
-(defun assistant-set (ast command value)
-  (let ((elem (assoc command ast)))
-    (when elem
-      (setcar (cdr elem) value))))
-
-(defun assistant-get-list (ast command)
-  (let ((result nil))
-    (dolist (elem ast)
-      (when (equal (car elem) command)
-       (push elem result)))
-    (nreverse result)))
-
-;;;###autoload
-(defun assistant (file)
-  "Assist setting up Emacs based on FILE."
-  (interactive "fAssistant file name: ")
-  (let ((ast
-        (with-temp-buffer
-          (insert-file-contents file)
-          (assistant-parse-buffer))))
-    (pop-to-buffer (assistant-buffer-name (assistant-get ast "title")))
-    (assistant-render ast)))
-
-(defun assistant-render (ast)
-  (let ((first-node (assistant-get (nth 1 ast) "node")))
-    (set (make-local-variable 'assistant-data) ast)
-    (set (make-local-variable 'assistant-current-node) nil)
-    (set (make-local-variable 'assistant-previous-nodes) nil)
-    (assistant-render-node first-node)))
-
-(defun assistant-find-node (node-name)
-  (let ((ast (cdr assistant-data)))
-    (while (and ast
-               (not (string= node-name (assistant-get (car ast) "node"))))
-      (pop ast))
-    (car ast)))
-
-(defun assistant-node-name (node)
-  (assistant-get node "node"))
-
-(defun assistant-previous-node-text (node)
-  (format "<< Go back to %s" node))
-
-(defun assistant-next-node-text (node)
-  (if (and node
-          (not (eq node 'finish)))
-      (format "Proceed to %s >>" node)
-    "Finish"))
-
-(defun assistant-set-defaults (node &optional forcep)
-  (dolist (variable (assistant-get-list node "variable"))
-    (setq variable (cadr variable))
-    (when (or (eq (nth 3 variable) 'default)
-             forcep)
-      (setcar (nthcdr 3 variable)
-             (assistant-eval (nth 2 variable))))))
-
-(defun assistant-get-variable (node variable &optional type raw)
-  (let ((variables (assistant-get-list node "variable"))
-       (result nil)
-       elem)
-    (while (and (setq elem (pop variables))
-               (not result))
-      (setq elem (cadr elem))
-      (when (eq (intern variable) (car elem))
-       (if type
-           (setq result (nth 1 elem))
-         (setq result (if raw (nth 3 elem)
-                        (format "%s" (nth 3 elem)))))))
-    result))
-    
-(defun assistant-set-variable (node variable value)
-  (let ((variables (assistant-get-list node "variable"))
-       elem)
-    (while (setq elem (pop variables))
-      (setq elem (cadr elem))
-      (when (eq (intern variable) (car elem))
-       (setcar (nthcdr 3 elem) value)))))
-    
-(defun assistant-render-text (text node)
-  (unless (and text node)
-    (gnus-error 
-     5 
-     "The assistant was asked to render invalid text or node data"))
-  (dolist (elem text)
-    (if (stringp elem)
-       ;; Ordinary text
-       (insert elem)
-      ;; A variable to be inserted as a widget.
-      (let* ((start (point))
-            (variable (cadr elem))
-            (type (assistant-get-variable node variable 'type)))
-       (cond
-        ((eq (car-safe type) :radio)
-         (push
-          (apply
-           #'widget-create
-           'radio-button-choice
-           :assistant-variable variable
-           :assistant-node node
-           :value (assistant-get-variable node variable)
-           :notify (lambda (widget &rest ignore)
-                     (assistant-set-variable
-                      (widget-get widget :assistant-node)
-                      (widget-get widget :assistant-variable)
-                      (widget-value widget))
-                     (assistant-render-node
-                      (assistant-get
-                       (widget-get widget :assistant-node)
-                       "node")))
-           (cadr type))
-          assistant-widgets))
-        ((eq (car-safe type) :set)
-         (push
-          (apply
-           #'widget-create
-           'set
-           :assistant-variable variable
-           :assistant-node node
-           :value (assistant-get-variable node variable nil t)
-           :notify (lambda (widget &rest ignore)
-                     (assistant-set-variable
-                      (widget-get widget :assistant-node)
-                      (widget-get widget :assistant-variable)
-                      (widget-value widget))
-                     (assistant-render-node
-                      (assistant-get
-                       (widget-get widget :assistant-node)
-                       "node")))
-           (cadr type))
-          assistant-widgets))
-        (t
-         (push 
-          (widget-create
-           'editable-field
-           :value-face 'assistant-field
-           :assistant-variable variable
-           (assistant-get-variable node variable))
-          assistant-widgets)
-         ;; The editable-field widget apparently inserts a newline;
-         ;; remove it.
-         (delete-char -1)
-         (add-text-properties start (point)
-                              (list
-                               'bold t
-                               'face 'assistant-field
-                               'not-read-only t))))))))
-
-(defun assistant-render-node (node-name)
-  (let ((node (assistant-find-node node-name))
-       (inhibit-read-only t)
-       (previous assistant-current-node)
-       (buffer-read-only nil))
-    (unless node
-      (gnus-error 5 "The node for %s could not be found" node-name))
-    (set (make-local-variable 'assistant-widgets) nil)
-    (assistant-set-defaults node)
-    (if (equal (assistant-get node "type") "interstitial")
-       (assistant-render-node (nth 0 (assistant-find-next-nodes node-name)))
-      (setq assistant-current-node node-name)
-      (when previous
-       (push previous assistant-previous-nodes))
-      (erase-buffer)
-      (insert (cadar assistant-data) "\n\n")
-      (insert node-name "\n\n")
-      (assistant-render-text (assistant-get node "text") node)
-      (insert "\n\n")
-      (when assistant-previous-nodes
-       (assistant-node-button 'previous (car assistant-previous-nodes)))
-      (widget-create
-       'push-button
-       :assistant-node node-name
-       :notify (lambda (widget &rest ignore)
-                (let* ((node (widget-get widget :assistant-node)))
-                  (assistant-set-defaults (assistant-find-node node) 'force)
-                  (assistant-render-node node)))
-       "Reset")
-      (insert "\n")
-      (dolist (nnode (assistant-find-next-nodes))
-       (assistant-node-button 'next nnode)
-       (insert "\n"))
-
-      (goto-char (point-min))
-      (assistant-make-read-only))))
-
-(defun assistant-make-read-only ()
-  (let ((start (point-min))
-       end)
-    (while (setq end (text-property-any start (point-max) 'not-read-only t))
-      (put-text-property start end 'read-only t)
-      (put-text-property start end 'rear-nonsticky t)
-      (while (get-text-property end 'not-read-only)
-       (incf end))
-      (setq start end))
-    (put-text-property start (point-max) 'read-only t)))
-
-(defun assistant-node-button (type node)
-  (let ((text (if (eq type 'next)
-                 (assistant-next-node-text node)
-               (assistant-previous-node-text node))))
-    (widget-create
-     'push-button
-     :assistant-node node
-     :assistant-type type
-     :notify (lambda (widget &rest ignore)
-              (let* ((node (widget-get widget :assistant-node))
-                     (type (widget-get widget :assistant-type)))
-                (if (eq type 'previous)
-                    (progn
-                      (setq assistant-current-node nil)
-                      (pop assistant-previous-nodes))
-                  (assistant-get-widget-values)
-                  (assistant-validate))
-                (if (null node)
-                    (assistant-finish)
-                  (assistant-render-node node))))
-     text)
-    (use-local-map widget-keymap)))
-
-(defun assistant-validate-types (node)
-  (dolist (variable (assistant-get-list node "variable"))
-    (setq variable (cadr variable))
-    (let ((type (nth 1 variable))
-         (value (nth 3 variable)))
-      (when 
-         (cond
-          ((eq type :number)
-           (string-match "[^0-9]" value))
-          (t
-           nil))
-       (error "%s is not of type %s: %s"
-              (car variable) type value)))))
-
-(defun assistant-get-widget-values ()
-  (let ((node (assistant-find-node assistant-current-node)))
-    (dolist (widget assistant-widgets)
-      (assistant-set-variable
-       node (widget-get widget :assistant-variable)
-       (widget-value widget)))))
-
-(defun assistant-validate ()
-  (let* ((node (assistant-find-node assistant-current-node))
-        (validation (assistant-get node "validate"))
-        result)
-    (assistant-validate-types node)
-    (when validation
-      (when (setq result (assistant-eval validation))
-       (unless (y-or-n-p (format "Error: %s.  Continue? " result))
-         (error "%s" result))))
-    (assistant-set node "save" t)))
-
-;; (defun assistant-find-next-node (&optional node)
-;;   (let* ((node (assistant-find-node (or node assistant-current-node)))
-;;      (node-name (assistant-node-name node))
-;;      (nexts (assistant-get-list node "next"))
-;;      next elem applicable)
-
-;;     (while (setq elem (pop nexts))
-;;       (when (assistant-eval (car (cadr elem)))
-;;     (setq applicable (cons elem applicable))))
-
-;;     ;; return the first thing we can
-;;     (cadr (cadr (pop applicable)))))
-
-(defun assistant-find-next-nodes (&optional node)
-  (let* ((node (assistant-find-node (or node assistant-current-node)))
-        (nexts (assistant-get-list node "next"))
-        next elem applicable return)
-
-    (while (setq elem (pop nexts))
-      (when (assistant-eval (car (cadr elem)))
-       (setq applicable (cons elem applicable))))
-
-    ;; return the first thing we can
-    
-    (while (setq elem (pop applicable))
-      (push (cadr (cadr elem)) return))
-
-    return))
-
-(defun assistant-get-all-variables ()
-  (let ((variables nil))
-    (dolist (node (cdr assistant-data))
-      (setq variables
-           (append (assistant-get-list node "variable")
-                   variables)))
-    variables))
-  
-(defun assistant-eval (form)
-  (let ((bindings nil))
-    (dolist (variable (assistant-get-all-variables))
-      (setq variable (cadr variable))
-      (push (list (car variable) 
-                 (if (eq (nth 3 variable) 'default)
-                     nil
-                   (if (listp (nth 3 variable))
-                       `(list ,@(nth 3 variable))
-                     (nth 3 variable))))
-           bindings))
-    (eval
-     `(let ,bindings
-       ,form))))
-
-(defun assistant-finish ()
-  (let ((results nil)
-       result)
-    (dolist (node (cdr assistant-data))
-      (when (assistant-get node "save")
-       (setq result (assistant-get node "result"))
-       (push (list (car result)
-                   (assistant-eval (cadr result)))
-             results)))
-    (message "Results: %s"
-            (nreverse results))))
-
-;;; Validation functions.
-
-(defun assistant-validate-connect-to-server (server port)
-  (let* ((error nil)
-        (stream
-         (condition-case err
-             (open-network-stream "nntpd" nil server port)
-           (error (setq error err)))))
-    (if (and (processp stream)
-            (memq (process-status stream) '(open run)))
-       (progn
-         (delete-process stream)
-         nil)
-      error)))
-
-(defun assistant-authinfo-data (server port type)
-  (when (file-exists-p "~/.authinfo")
-    (netrc-get (netrc-machine (netrc-parse "~/.authinfo")
-                             server port)
-              (if (eq type 'user)
-                  "login"
-                "password"))))
-
-(defun assistant-password-required-p ()
-  nil)
-
-(provide 'assistant)
-
-;;; arch-tag: 0404bfa2-9226-4611-8d3f-335c2416175b
-;;; assistant.el ends here
index fed5598104d7f5de101c1467ad48d5f14cc172dd..145a2e518d22354d3e80e40341f00c8f024828c2 100644 (file)
@@ -6,18 +6,20 @@
 ;; Author: Katsumi Yamaoka <yamaoka@jpl.org>
 ;; Keywords: news, cancel-lock, hmac, sha1, rfc2104
 
-;; This program is free software; you can redistribute it and/or modify
+;; 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, or (at your option)
 ;; any later version.
 
-;; This program is distributed in the hope that it will be useful,
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
index 1c333fd2e037cc45396c2d27e01ca5596972bd36..42a75916277c418370d7a0a5cb9dedac2fccea6d 100644 (file)
@@ -1,5 +1,6 @@
 ;;; ecomplete.el --- electric completion of addresses and the like
-;; Copyright (C) 2006 Free Software Foundation, Inc.
+
+;; Copyright (C) 2006, 2007  Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: mail
diff --git a/lisp/gnus/encrypt.el b/lisp/gnus/encrypt.el
deleted file mode 100644 (file)
index 1fb54a2..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-;;; encrypt.el --- file encryption routines
-;; Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-
-;; Author: Teodor Zlatanov <tzz@lifelogs.com>
-;; Created: 2003/01/24
-;; Keywords: files
-
-;; 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, 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-
-;;; This module addresses data encryption.  Page breaks are used for
-;;; grouping declarations and documentation relating to each
-;;; particular aspect.
-
-;;; Use in Gnus like this:
-;;; (setq
-;;;   nnimap-authinfo-file "~/.authinfo.enc"
-;;;   nntp-authinfo-file "~/.authinfo.enc"
-;;;   smtpmail-auth-credentials "~/.authinfo.enc"
-;;;   ;; using the AES256 cipher, feel free to use your own favorite
-;;;   encrypt-file-alist (quote (("~/.authinfo.enc" (gpg "AES256"))))
-;;;   password-cache-expiry 600)
-
-;;; Then write ~/.authinfo.enc:
-
-;;; 1) open the old authinfo
-;;; C-x C-f ~/.authinfo
-
-;;; 2) write the new authinfo.enc
-;;; M-x encrypt-write-file-contents RET ~/.authinfo.enc
-
-;;; 3) verify the new authinfo is correct (this will show the contents in the minibuffer)
-;;; M-: (encrypt-get-file-contents "~/.authinfo.enc")
-
-
-;;; Code:
-
-;; autoload password
-(eval-and-compile
-  (autoload 'password-read "password"))
-
-(defgroup encrypt '((password-cache custom-variable)
-                   (password-cache-expiry custom-variable))
-  "File encryption configuration."
-  :group 'applications)
-
-(defcustom encrypt-file-alist nil
-  "List of file names or regexes matched with encryptions.
-Format example:
- '((\"beta\"
-    (gpg \"AES\"))
-   (\"/home/tzz/alpha\"
-    (encrypt-xor \"Semi-Secret\")))"
-
-  :type '(repeat
-         (list :tag "Encryption entry"
-          (radio :tag "What to encrypt"
-                 (file :tag "Filename")
-                 (regexp :tag "Regular expression match"))
-          (radio :tag "How to encrypt it"
-                 (list
-                  :tag "GPG Encryption"
-                  (const :tag "GPG Program" gpg)
-                  (radio :tag "Choose a cipher"
-                         (const :tag "3DES Encryption" "3DES")
-                         (const :tag "CAST5 Encryption" "CAST5")
-                         (const :tag "Blowfish Encryption" "BLOWFISH")
-                         (const :tag "AES Encryption" "AES")
-                         (const :tag "AES192 Encryption" "AES192")
-                         (const :tag "AES256 Encryption" "AES256")
-                         (const :tag "Twofish Encryption" "TWOFISH")
-                         (string :tag "Cipher Name")))
-                 (list
-                  :tag "Built-in simple XOR"
-                  (const :tag "XOR Encryption" encrypt-xor)
-                  (string :tag "XOR Cipher Value (seed value)")))))
-  :group 'encrypt)
-
-;; TODO: now, load gencrypt.el and if successful, modify the
-;; custom-type of encrypt-file-alist to add the gencrypt.el options
-
-;; (plist-get (symbol-plist 'encrypt-file-alist) 'custom-type)
-;; then use plist-put
-
-(defcustom encrypt-gpg-path (executable-find "gpg")
-  "Path to the GPG program."
-  :type '(radio
-         (file :tag "Location of the GPG executable")
-         (const :tag "GPG is not installed" nil))
-  :group 'encrypt)
-
-(defvar encrypt-temp-prefix "encrypt"
-  "Prefix for temporary filenames")
-
-;;;###autoload
-(defun encrypt-find-model (filename)
-  "Given a filename, find a encrypt-file-alist entry"
-  (dolist (entry encrypt-file-alist)
-    (let ((match (nth 0 entry))
-         (model (nth 1 entry)))
-      (when (or (eq match filename)
-               (string-match match filename))
-       (return model)))))
-
-;;;###autoload
-(defun encrypt-insert-file-contents (file &optional model)
-  "Decrypt FILE into the current buffer."
-  (interactive "fFile to insert: ")
-  (let* ((model (or model (encrypt-find-model file)))
-        (method (nth 0 model))
-        (cipher (nth 1 model))
-        (password-key (format "encrypt-password-%s-%s %s"
-                              (symbol-name method) cipher file))
-        (passphrase
-         (password-read-and-add
-          (format "%s password for cipher %s (file %s)? "
-                  file (symbol-name method) cipher)
-          password-key))
-         (buffer-file-coding-system 'binary)
-        (coding-system-for-read 'binary)
-        outdata)
-
-    ;; note we only insert-file-contents if the method is known to be valid
-    (cond
-     ((eq method 'gpg)
-      (insert-file-contents file)
-      (setq outdata (encrypt-gpg-decode-buffer passphrase cipher)))
-     ((eq method 'encrypt-xor)
-      (insert-file-contents file)
-      (setq outdata (encrypt-xor-decode-buffer passphrase cipher))))
-
-    (if outdata
-       (progn
-         (message "%s was decrypted with %s (cipher %s)"
-                  file (symbol-name method) cipher)
-         (delete-region (point-min) (point-max))
-         (goto-char (point-min))
-         (insert outdata))
-      ;; the decryption failed, alas
-      (password-cache-remove password-key)
-      (gnus-error 5 "%s was NOT decrypted with %s (cipher %s)"
-                 file (symbol-name method) cipher))))
-
-(defun encrypt-get-file-contents (file &optional model)
-  "Decrypt FILE and return the contents."
-  (interactive "fFile to decrypt: ")
-  (with-temp-buffer
-    (encrypt-insert-file-contents file model)
-    (buffer-string)))
-
-(defun encrypt-put-file-contents (file data &optional model)
-  "Encrypt the DATA to FILE, then continue normally."
-  (with-temp-buffer
-    (insert data)
-    (encrypt-write-file-contents file model)))
-
-(defun encrypt-write-file-contents (file &optional model)
-  "Encrypt the current buffer to FILE, then continue normally."
-  (interactive "sFile to write: ")
-  (setq model (or model (encrypt-find-model file)))
-  (if model
-      (let* ((method (nth 0 model))
-            (cipher (nth 1 model))
-            (password-key (format "encrypt-password-%s-%s %s"
-                                  (symbol-name method) cipher file))
-            (passphrase
-             (password-read
-              (format "%s password for cipher %s? "
-                      (symbol-name method) cipher)
-              password-key))
-            outdata)
-
-       (cond
-        ((eq method 'gpg)
-         (setq outdata (encrypt-gpg-encode-buffer passphrase cipher)))
-        ((eq method 'encrypt-xor)
-         (setq outdata (encrypt-xor-encode-buffer passphrase cipher))))
-
-       (if outdata
-           (progn
-             (message "%s was encrypted with %s (cipher %s)"
-                      file (symbol-name method) cipher)
-             (delete-region (point-min) (point-max))
-             (goto-char (point-min))
-             (insert outdata)
-             ;; do not confirm overwrites
-             (write-file file nil))
-         ;; the decryption failed, alas
-         (password-cache-remove password-key)
-         (gnus-error 5 "%s was NOT encrypted with %s (cipher %s)"
-                     file (symbol-name method) cipher)))
-    (gnus-error 1 "%s has no associated encryption model!  See encrypt-file-alist." file)))
-
-(defun encrypt-xor-encode-buffer (passphrase cipher)
-  (encrypt-xor-process-buffer passphrase cipher t))
-
-(defun encrypt-xor-decode-buffer (passphrase cipher)
-  (encrypt-xor-process-buffer passphrase cipher nil))
-
-(defun encrypt-xor-process-buffer (passphrase
-                                       cipher
-                                       &optional encode)
-  "Given PASSPHRASE, xor-encode or decode the contents of the current buffer."
-  (let* ((bs (buffer-substring-no-properties (point-min) (point-max)))
-        ;; passphrase-sum is a simple additive checksum of the
-        ;; passphrase and the cipher
-       (passphrase-sum
-        (when (stringp passphrase)
-          (apply '+ (append cipher passphrase nil))))
-       new-list)
-
-    (with-temp-buffer
-      (if encode
-         (progn
-           (dolist (x (append bs nil))
-             (setq new-list (cons (logxor x passphrase-sum) new-list)))
-
-           (dolist (x new-list)
-             (insert (format "%d " x))))
-       (progn
-         (setq new-list (reverse (split-string bs)))
-         (dolist (x new-list)
-           (setq x (string-to-number x))
-           (insert (format "%c" (logxor x passphrase-sum))))))
-      (buffer-substring-no-properties (point-min) (point-max)))))
-
-(defun encrypt-gpg-encode-buffer (passphrase cipher)
-  (encrypt-gpg-process-buffer passphrase cipher t))
-
-(defun encrypt-gpg-decode-buffer (passphrase cipher)
-  (encrypt-gpg-process-buffer passphrase cipher nil))
-
-(defun encrypt-gpg-process-buffer (passphrase 
-                                       cipher 
-                                       &optional encode)
-  "With PASSPHRASE, use GPG to encode or decode the current buffer."
-  (let* ((program encrypt-gpg-path)
-        (input (buffer-substring-no-properties (point-min) (point-max)))
-        (temp-maker (if (fboundp 'make-temp-file) 
-                        'make-temp-file 
-                      'make-temp-name))
-        (temp-file (funcall temp-maker encrypt-temp-prefix))
-        (default-enable-multibyte-characters nil)
-        (args `("--cipher-algo" ,cipher
-                "--status-fd" "2"
-                "--logger-fd" "2"
-                "--passphrase-fd" "0"
-                "--no-tty"))
-        exit-status exit-data)
-    
-    (when encode
-      (setq args
-           (append args
-                   '("--symmetric"
-                     "--armor"))))
-
-    (if program
-       (with-temp-buffer
-         (when passphrase
-           (insert passphrase "\n"))
-         (insert input)
-         (setq exit-status
-               (apply #'call-process-region (point-min) (point-max) program
-                      t `(t ,temp-file) nil args))
-         (if (equal exit-status 0)
-             (setq exit-data
-                   (buffer-substring-no-properties (point-min) (point-max)))
-           (with-temp-buffer
-             (when (file-exists-p temp-file)
-               (insert-file-contents temp-file))
-             (gnus-error 5 (format "%s exited abnormally: '%s' [%s]"
-                                   program exit-status (buffer-string)))))
-         (delete-file temp-file))
-      (gnus-error 5 "GPG is not installed."))
-    exit-data))
-
-(provide 'encrypt)
-;;; encrypt.el ends here
-
-;; arch-tag: d907e4f1-71b5-42b1-a180-fc7b84ff0648
index 1644ed0f8f290b3cc2c201223bd100b33eed2786..a13cd23156de1761e04618bd84745fad45cf835e 100644 (file)
@@ -154,8 +154,7 @@ RFC 2646 suggests 66 characters for readability."
 
 ;; Test vectors.
 
-(eval-when-compile
-  (defvar show-trailing-whitespace))
+(defvar show-trailing-whitespace)
 
 (defvar fill-flowed-encode-tests
   `(
index 0271186273aef66e292bb064a0936d8ea9ff6608..22ffd5859735c94b4d85b181af15f30c69fd74b0 100644 (file)
@@ -636,8 +636,7 @@ manipulated as follows:
                  (gnus-agent-make-mode-line-string " Plugged"
                                                    'mouse-2
                                                    'gnus-agent-toggle-plugged))
-         (gnus-agent-go-online gnus-agent-go-online)
-         (gnus-agent-possibly-synchronize-flags))
+         (gnus-agent-go-online gnus-agent-go-online))
         (t
          (gnus-agent-close-connections)
          (setq gnus-plugged set-to)
@@ -868,8 +867,7 @@ be a select method."
   (interactive)
   (save-excursion
     (dolist (gnus-command-method (gnus-agent-covered-methods))
-      (when (and (file-exists-p (gnus-agent-lib-file "flags"))
-                (eq (gnus-server-status gnus-command-method) 'ok))
+      (when (eq (gnus-server-status gnus-command-method) 'ok)
        (gnus-agent-possibly-synchronize-flags-server gnus-command-method)))))
 
 (defun gnus-agent-synchronize-flags-server (method)
@@ -905,11 +903,13 @@ be a select method."
 
 (defun gnus-agent-possibly-synchronize-flags-server (method)
   "Synchronize flags for server according to `gnus-agent-synchronize-flags'."
-  (when (or (and gnus-agent-synchronize-flags
-                (not (eq gnus-agent-synchronize-flags 'ask)))
-           (and (eq gnus-agent-synchronize-flags 'ask)
-                (gnus-y-or-n-p (format "Synchronize flags on server `%s'? "
-                                       (cadr method)))))
+  (when (and (file-exists-p (gnus-agent-lib-file "flags"))
+            (or (and gnus-agent-synchronize-flags
+                     (not (eq gnus-agent-synchronize-flags 'ask)))
+                (and (eq gnus-agent-synchronize-flags 'ask)
+                     (gnus-y-or-n-p
+                      (format "Synchronize flags on server `%s'? "
+                              (cadr method))))))
     (gnus-agent-synchronize-flags-server method)))
 
 ;;;###autoload
@@ -2104,8 +2104,7 @@ doesn't exist, to valid the overview buffer."
 
 ;; Keeps the compiler from warning about the free variable in
 ;; gnus-agent-read-agentview.
-(eval-when-compile
-  (defvar gnus-agent-read-agentview))
+(defvar gnus-agent-read-agentview)
 
 (defun gnus-agent-load-alist (group)
   "Load the article-state alist for GROUP."
index 0c98babcad520330b66daf64ea6d9d2fb8060efb..4bb9ceb97ba84d86ad9bb1f738fbc97d9e864d57 100644 (file)
@@ -28,9 +28,9 @@
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  (defvar tool-bar-map)
-  (defvar w3m-minor-mode-map))
+  (require 'cl))
+(defvar tool-bar-map)
+(defvar w3m-minor-mode-map)
 
 (require 'gnus)
 ;; Avoid the "Recursive load suspected" error in Emacs 21.1.
@@ -2222,7 +2222,7 @@ unfolded."
        (mail-header-fold-field)
        (goto-char (point-max))))))
 
-(defcustom gnus-article-truncate-lines default-truncate-lines
+(defcustom gnus-article-truncate-lines (default-value 'truncate-lines)
   "Value of `truncate-lines' in Gnus Article buffer.
 Valid values are nil, t, `head', `first', `last', an integer or a
 predicate.  See Info node `(gnus)Customizing Articles'."
@@ -2332,12 +2332,11 @@ long lines iff arg is positive."
         (forward-line 1)
         (point))))))
 
-(eval-when-compile
-  (defvar gnus-face-properties-alist))
+(defvar gnus-face-properties-alist)
 
-(defun article-display-face ()
+(defun article-display-face (&optional force)
   "Display any Face headers in the header."
-  (interactive)
+  (interactive (list 'force))
   (let ((wash-face-p buffer-read-only))
     (gnus-with-article-headers
       ;; When displaying parts, this function can be called several times on
@@ -2347,7 +2346,8 @@ long lines iff arg is positive."
       ;; read-only.
       (if (and wash-face-p (memq 'face gnus-article-wash-types))
          (gnus-delete-images 'face)
-       (let (face faces from)
+       (let ((from (message-fetch-field "from"))
+             face faces)
          (save-current-buffer
            (when (and wash-face-p
                       (gnus-buffer-live-p gnus-original-article-buffer)
@@ -2355,16 +2355,22 @@ long lines iff arg is positive."
              (set-buffer gnus-original-article-buffer))
            (save-restriction
              (mail-narrow-to-head)
-             (while (gnus-article-goto-header "Face")
-               (push (mail-header-field-value) faces))))
+             (when (or force
+                       ;; Check whether this face is censored.
+                       (not (and gnus-article-x-face-too-ugly
+                                 (or from
+                                     (setq from (message-fetch-field "from")))
+                                 (string-match gnus-article-x-face-too-ugly
+                                               from))))
+               (while (gnus-article-goto-header "Face")
+                 (push (mail-header-field-value) faces)))))
          (when faces
            (goto-char (point-min))
-           (let ((from (gnus-article-goto-header "from"))
-                 png image)
-             (unless from
+           (let (png image)
+             (unless (setq from (gnus-article-goto-header "from"))
                (insert "From:")
                (setq from (point))
-               (insert "[no `from' set]\n"))
+               (insert " [no `from' set]\n"))
              (while faces
                (when (setq png (gnus-convert-face-to-png (pop faces)))
                  (setq image
@@ -2389,7 +2395,8 @@ long lines iff arg is positive."
          ;; instead.
          (gnus-delete-images 'xface)
        ;; Display X-Faces.
-       (let (x-faces from face)
+       (let ((from (message-fetch-field "from"))
+             x-faces face)
          (save-current-buffer
            (when (and wash-face-p
                       (gnus-buffer-live-p gnus-original-article-buffer)
@@ -2400,43 +2407,41 @@ long lines iff arg is positive."
              (set-buffer gnus-original-article-buffer))
            (save-restriction
              (mail-narrow-to-head)
-             (while (gnus-article-goto-header "X-Face")
-               (push (mail-header-field-value) x-faces))
-             (setq from (message-fetch-field "from"))))
-         ;; Sending multiple EOFs to xv doesn't work, so we only do a
-         ;; single external face.
-         (when (stringp gnus-article-x-face-command)
-           (setq x-faces (list (car x-faces))))
-         (when (and x-faces
-                    gnus-article-x-face-command
-                    (or force
-                        ;; Check whether this face is censored.
-                        (not gnus-article-x-face-too-ugly)
-                        (and from
-                             (not (string-match gnus-article-x-face-too-ugly
-                                                from)))))
-           (while (setq face (pop x-faces))
-             ;; We display the face.
-             (cond ((stringp gnus-article-x-face-command)
-                    ;; The command is a string, so we interpret the command
-                    ;; as a, well, command, and fork it off.
-                    (let ((process-connection-type nil))
-                      (gnus-set-process-query-on-exit-flag
-                       (start-process
-                        "article-x-face" nil shell-file-name
-                        shell-command-switch gnus-article-x-face-command)
-                       nil)
-                      (with-temp-buffer
-                        (insert face)
-                        (process-send-region "article-x-face"
-                                             (point-min) (point-max)))
-                      (process-send-eof "article-x-face")))
-                   ((functionp gnus-article-x-face-command)
-                    ;; The command is a lisp function, so we call it.
-                    (funcall gnus-article-x-face-command face))
-                   (t
-                    (error "%s is not a function"
-                           gnus-article-x-face-command))))))))))
+             (and gnus-article-x-face-command
+                  (or force
+                      ;; Check whether this face is censored.
+                      (not (and gnus-article-x-face-too-ugly
+                                (or from
+                                    (setq from (message-fetch-field "from")))
+                                (string-match gnus-article-x-face-too-ugly
+                                              from))))
+                  (while (gnus-article-goto-header "X-Face")
+                    (push (mail-header-field-value) x-faces)))))
+         (when x-faces
+           ;; We display the face.
+           (cond ((functionp gnus-article-x-face-command)
+                  ;; The command is a lisp function, so we call it.
+                  (mapc gnus-article-x-face-command x-faces))
+                 ((stringp gnus-article-x-face-command)
+                  ;; The command is a string, so we interpret the command
+                  ;; as a, well, command, and fork it off.
+                  (let ((process-connection-type nil))
+                    (gnus-set-process-query-on-exit-flag
+                     (start-process
+                      "article-x-face" nil shell-file-name
+                      shell-command-switch gnus-article-x-face-command)
+                     nil)
+                    ;; Sending multiple EOFs to xv doesn't work,
+                    ;; so we only do a single external face.
+                    (with-temp-buffer
+                      (insert (car x-faces))
+                      (process-send-region "article-x-face"
+                                           (point-min) (point-max)))
+                    (process-send-eof "article-x-face")))
+                 (t
+                  (error "`%s' set to `%s' is not a function"
+                         gnus-article-x-face-command
+                         'gnus-article-x-face-command)))))))))
 
 (defun article-decode-mime-words ()
   "Decode all MIME-encoded words in the article."
@@ -2726,7 +2731,7 @@ charset defined in `gnus-summary-show-article-charset-alist' is used."
           ;; Put the mark meaning this part was rendered by emacs-w3m.
           'mm-inline-text-html-with-w3m t))))
 
-(eval-when-compile (defvar charset)) ;; Bound by `article-wash-html'.
+(defvar charset) ;; Bound by `article-wash-html'.
 
 (defun gnus-article-wash-html-with-w3m-standalone ()
   "Wash the current buffer with w3m."
@@ -2797,8 +2802,37 @@ Recurse into multiparts."
                    (string-match "text/html" (car (mm-handle-type handle))))
               (let ((tmp-file (mm-make-temp-file
                                ;; Do we need to care for 8.3 filenames?
-                               "mm-" nil ".html")))
-                (mm-save-part-to-file handle tmp-file)
+                               "mm-" nil ".html"))
+                    (charset (mail-content-type-get (mm-handle-type handle)
+                                                    'charset)))
+                (if charset
+                    ;; Add a meta html tag to specify charset.
+                    (mm-with-unibyte-buffer
+                      (insert (with-current-buffer (mm-handle-buffer handle)
+                                (if (eq charset 'gnus-decoded)
+                                    (mm-encode-coding-string
+                                     (buffer-string)
+                                     (setq charset 'utf-8))
+                                  (buffer-string))))
+                      (setq charset (format "\
+<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">"
+                                            charset))
+                      (goto-char (point-min))
+                      (let ((case-fold-search t))
+                        (cond (;; Don't modify existing meta tag.
+                               (re-search-forward "\
+<meta[\t\n\r ]+http-equiv=\"content-type\"[^>]+>"
+                                                  nil t))
+                              ((re-search-forward "<head>[\t\n\r ]*" nil t)
+                               (insert charset "\n"))
+                              (t
+                               (re-search-forward "\
+<html\\(?:[\t\n\r ]+[^>]+\\|[\t\n\r ]*\\)>[\t\n\r ]*"
+                                                  nil t)
+                               (insert "<head>\n" charset "\n</head>\n"))))
+                      (mm-write-region (point-min) (point-max)
+                                       tmp-file nil nil nil 'binary t))
+                  (mm-save-part-to-file handle tmp-file))
                 (add-to-list 'gnus-article-browse-html-temp-list tmp-file)
                 (add-hook 'gnus-summary-prepare-exit-hook
                           'gnus-article-browse-delete-temp-files)
@@ -2824,7 +2858,10 @@ Warning: Spammers use links to images in HTML articles to verify
 whether you have read the message.  As
 `gnus-article-browse-html-article' passes the unmodified HTML
 content to the browser without eliminating these \"web bugs\" you
-should only use it for mails from trusted senders."
+should only use it for mails from trusted senders.
+
+If you alwasy want to display HTML part in the browser, set
+`mm-text-html-renderer' to nil."
   ;; Cf. `mm-w3m-safe-url-regexp'
   (interactive)
   (save-window-excursion
@@ -3529,9 +3566,8 @@ This format is defined by the `gnus-article-time-format' variable."
                                 gnus-newsgroup-name 'highlight-words t)))
             gnus-emphasis-alist)))))
 
-(eval-when-compile
-  (defvar gnus-summary-article-menu)
-  (defvar gnus-summary-post-menu))
+(defvar gnus-summary-article-menu)
+(defvar gnus-summary-post-menu)
 
 ;;; Saving functions.
 
@@ -7903,12 +7939,11 @@ For example:
          (funcall (cadr elem)))))))
 
 ;; Dynamic variables.
-(eval-when-compile
-  (defvar part-number)
-  (defvar total-parts)
-  (defvar type)
-  (defvar condition)
-  (defvar length))
+(defvar part-number)
+(defvar total-parts)
+(defvar type)
+(defvar condition)
+(defvar length)
 
 (defun gnus-treat-predicate (val)
   (cond
index 1e76e3ac57b92a6641ba5f18c4146db70a78fc42..6341c8e48d8c04fc6cf130aa840f6785a8c4c7f3 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-bookmark.el --- Bookmarks in Gnus
 
-;; Copyright (C) 2006 Free Software Foundation, Inc.
+;; Copyright (C) 2006, 2007  Free Software Foundation, Inc.
 
 ;; Author: Bastien Guerry <bzg AT altern DOT org>
 ;; Keywords: news
index fecb068585856fbffa0df2843dd5a7589726ed80..4f61a0f27592beb6c0d4749029cd55dc0b0ae696 100644 (file)
@@ -92,7 +92,7 @@ it's not cached."
 (defvar gnus-cache-total-fetched-hashtb nil)
 
 (eval-and-compile
-  (autoload 'nnml-generate-nov-databases-1 "nnml")
+  (autoload 'nnml-generate-nov-databases-directory "nnml")
   (autoload 'nnvirtual-find-group-art "nnvirtual"))
 
 \f
@@ -620,7 +620,6 @@ $ emacs -batch -l ~/.emacs -l gnus -f gnus-jog-cache"
   (interactive)
   (let ((gnus-mark-article-hook nil)
        (gnus-expert-user t)
-       (nnmail-spool-file nil)
        (mail-sources nil)
        (gnus-use-dribble-file nil)
        (gnus-novice-user nil)
@@ -756,7 +755,7 @@ If LOW, update the lower bound instead."
   (interactive (list gnus-cache-directory))
   (gnus-cache-close)
   (let ((nnml-generate-active-function 'identity))
-    (nnml-generate-nov-databases-1 dir))
+    (nnml-generate-nov-databases-directory dir))
 
   (setq gnus-cache-total-fetched-hashtb nil)
 
index 5d1b2b26a8e896a83142585e0bd5fb59e1d95007..908a75513e446f7c1c257b042aae235c8eb4baf1 100644 (file)
@@ -1170,10 +1170,9 @@ Returns nil if there is no such line before LIMIT, t otherwise."
           (setq count (1+ count)))))) ;;
   "Keywords for highlighting different levels of message citations.")
 
-(eval-when-compile
-  (defvar font-lock-defaults-computed)
-  (defvar font-lock-keywords)
-  (defvar font-lock-set-defaults))
+(defvar font-lock-defaults-computed)
+(defvar font-lock-keywords)
+(defvar font-lock-set-defaults)
 
 (eval-and-compile
   (unless (featurep 'xemacs)
index 6d37120bd59198c32c4ae49938347f9300c58df3..845a467c57453cd5ec80ee2ea15c02a329c461ab 100644 (file)
@@ -949,20 +949,18 @@ articles in the thread.
     (gnus-score-set 'touched '(t) alist))
   (bury-buffer))
 
-(eval-when-compile
-  (defvar category-fields nil)
-  (defvar gnus-agent-cat-name)
-  (defvar gnus-agent-cat-score-file)
-  (defvar gnus-agent-cat-length-when-short)
-  (defvar gnus-agent-cat-length-when-long)
-  (defvar gnus-agent-cat-low-score)
-  (defvar gnus-agent-cat-high-score)
-  (defvar gnus-agent-cat-enable-expiration)
-  (defvar gnus-agent-cat-days-until-old)
-  (defvar gnus-agent-cat-predicate)
-  (defvar gnus-agent-cat-groups)
-  (defvar gnus-agent-cat-enable-undownloaded-faces)
-)
+(defvar category-fields nil)
+(defvar gnus-agent-cat-name)
+(defvar gnus-agent-cat-score-file)
+(defvar gnus-agent-cat-length-when-short)
+(defvar gnus-agent-cat-length-when-long)
+(defvar gnus-agent-cat-low-score)
+(defvar gnus-agent-cat-high-score)
+(defvar gnus-agent-cat-enable-expiration)
+(defvar gnus-agent-cat-days-until-old)
+(defvar gnus-agent-cat-predicate)
+(defvar gnus-agent-cat-groups)
+(defvar gnus-agent-cat-enable-undownloaded-faces)
 
 (defun gnus-trim-whitespace (s)
   (when (string-match "\\`[ \n\t]+" s)
index 98d098c51cfa100577a507db5a62577d5b779475..421d4a07ee7789ed95ee44a436f6e60c8ef9b4f4 100644 (file)
@@ -39,7 +39,7 @@
 (autoload 'parse-time-string "parse-time" nil nil)
 
 (defgroup gnus-demon nil
-  "Demonic behaviour."
+  "Demonic behavior."
   :group 'gnus)
 
 (defcustom gnus-demon-handlers nil
index fa9ef21bd1a300b8f0ebebe4dbfd9e1161c34921..97e61a013c8921bb0e08acca344349786dce46fe 100644 (file)
 ;;; Code:
 
 (require 'dired)
-(require 'gnus-ems)
-(require 'gnus-msg)
-(require 'gnus-util)
-(require 'message)
-(require 'mm-encode)
-(require 'mml)
+(autoload 'mml-attach-file "mml")
+(autoload 'mm-default-file-encoding "mm-decode");; Shift this to `mailcap.el'?
+(autoload 'mailcap-extension-to-mime "mailcap")
+(autoload 'mailcap-mime-info "mailcap")
+
+;; Maybe shift this function to `mailcap.el'?
+(autoload 'mm-mailcap-command "mm-decode")
+
+(autoload 'ps-print-preprint "ps-print")
+
+;; Autoloads to avoid byte-compiler warnings.  These are used only if the user
+;; customizes `gnus-dired-mail-mode' to use Message and/or Gnus.
+(autoload 'message-buffers "message")
+(autoload 'gnus-setup-message "gnus-msg")
+(autoload 'gnus-print-buffer "gnus-sum")
 
 (defvar gnus-dired-mode nil
-  "Minor mode for intersections of gnus and dired.")
+  "Minor mode for intersections of MIME mail composition and dired.")
 
 (defvar gnus-dired-mode-map nil)
 
 (unless gnus-dired-mode-map
   (setq gnus-dired-mode-map (make-sparse-keymap))
 
-  (gnus-define-keys gnus-dired-mode-map
-    "\C-c\C-m\C-a" gnus-dired-attach
-    "\C-c\C-m\C-l" gnus-dired-find-file-mailcap
-    "\C-c\C-m\C-p" gnus-dired-print))
+  (define-key gnus-dired-mode-map "\C-c\C-m\C-a" 'gnus-dired-attach)
+  (define-key gnus-dired-mode-map "\C-c\C-m\C-l" 'gnus-dired-find-file-mailcap)
+  (define-key gnus-dired-mode-map "\C-c\C-m\C-p" 'gnus-dired-print))
+
+;; FIXME: Make it customizable, change the default to `mail-user-agent' when
+;; this file if renamed (e.g. to `dired-mime.el').
+
+(defcustom gnus-dired-mail-mode 'gnus-user-agent ;; mail-user-agent
+  "Your preference for a mail composition package.
+See `mail-user-agent' for more information."
+  :group 'mail ;; dired?
+  :version "23.0" ;; No Gnus
+  :type '(radio (function-item :tag "Default Emacs mail"
+                              :format "%t\n"
+                              sendmail-user-agent)
+               (function-item :tag "Emacs interface to MH"
+                              :format "%t\n"
+                              mh-e-user-agent)
+               (function-item :tag "Gnus Message package"
+                              :format "%t\n"
+                              message-user-agent)
+               (function-item :tag "Gnus Message with full Gnus features"
+                              :format "%t\n"
+                              gnus-user-agent)
+               (function :tag "Other")))
 
 (defun gnus-dired-mode (&optional arg)
   "Minor mode for intersections of gnus and dired.
           (> (prefix-numeric-value arg) 0)))
     (when gnus-dired-mode
       (add-minor-mode 'gnus-dired-mode "" gnus-dired-mode-map)
-      (gnus-run-hooks 'gnus-dired-mode-hook))))
+      (save-current-buffer
+       (run-hooks 'gnus-dired-mode-hook)))))
 
 ;;;###autoload
 (defun turn-on-gnus-dired-mode ()
   "Convenience method to turn on gnus-dired-mode."
+  (interactive)
   (gnus-dired-mode 1))
 
-;; Method to attach files to a gnus composition.
+(defun gnus-dired-mail-buffers ()
+  "Return a list of active mail composition buffers."
+  (if (and (memq gnus-dired-mail-mode '(message-user-agent gnus-user-agent))
+          (require 'message)
+          (fboundp 'message-buffers))
+      (message-buffers)
+    ;; Cf. `message-buffers' in `message.el':
+    (let (buffers)
+      (save-excursion
+       (dolist (buffer (buffer-list t))
+         (set-buffer buffer)
+         (when (eq major-mode 'mail-mode)
+           (push (buffer-name buffer) buffers))))
+      (nreverse buffers))))
+
+;; Method to attach files to a mail composition.
 (defun gnus-dired-attach (files-to-attach)
   "Attach dired's marked files to a gnus message composition.
 If called non-interactively, FILES-TO-ATTACH should be a list of
@@ -102,22 +149,25 @@ filenames."
            (mapconcat
             (lambda (f) (file-name-nondirectory f))
             files-to-attach ", "))
-      (setq bufs (message-buffers))
+      (setq bufs (gnus-dired-mail-buffers))
 
-      ;; set up destination message buffer
+      ;; set up destination mail composition buffer
       (if (and bufs
-              (y-or-n-p "Attach files to existing message buffer? "))
+              (y-or-n-p "Attach files to existing mail composition buffer? "))
          (setq destination
                (if (= (length bufs) 1)
                    (get-buffer (car bufs))
-                 (completing-read "Attach to which message buffer: "
+                 (completing-read "Attach to which mail composition buffer: "
                                   (mapcar
                                    (lambda (b)
                                      (cons b (get-buffer b)))
                                    bufs)
                                   nil t)))
-       ;; setup a new gnus message buffer
-       (gnus-setup-message 'message (message-mail))
+       ;; setup a new mail composition buffer
+       (if (eq gnus-dired-mail-mode 'gnus-user-agent)
+           (gnus-setup-message 'message (message-mail))
+         ;; FIXME: Is this the right thing?
+         (compose-mail))
        (setq destination (current-buffer)))
 
       ;; set buffer to destination buffer, and attach files
@@ -151,7 +201,8 @@ If ARG is non-nil, open it in a new buffer."
                  (setq method
                        (cdr (assoc 'viewer
                                    (car (mailcap-mime-info mime-type
-                                                           'all)))))))
+                                                           'all 
+                                                           'no-decode)))))))
            (let ((view-command (mm-mailcap-command method file-name nil)))
              (message "viewing via %s" view-command)
              (start-process "*display*"
@@ -186,7 +237,8 @@ file to save in."
                     (mailcap-extension-to-mime
                      (match-string 0 file-name)))
               (stringp
-               (setq method (mailcap-mime-info mime-type "print"))))
+               (setq method (mailcap-mime-info mime-type "print"
+                                               'no-decode))))
          (call-process shell-file-name nil
                        (generate-new-buffer " *mm*")
                        nil
@@ -194,7 +246,10 @@ file to save in."
                        (mm-mailcap-command method file-name mime-type))
        (with-temp-buffer
          (insert-file-contents file-name)
-         (gnus-print-buffer))
+         (if (eq gnus-dired-mail-mode 'gnus-user-agent)
+             (gnus-print-buffer)
+           ;; FIXME:
+           (error "MIME print only implemeted via Gnus")))
        (ps-despool print-to))))
    ((file-symlink-p file-name)
      (error "File is a symlink to a nonexistent target"))
index f37b1b734164fc73ab11bc5939a9a2816f211b3d..79e513b5f051d827edfd905e15f28403269c7fa2 100644 (file)
     (defvar gnus-mouse-face-prop 'mouse-face
       "Property used for highlighting mouse regions.")))
 
-(eval-when-compile
-  (defvar gnus-tmp-unread)
-  (defvar gnus-tmp-replied)
-  (defvar gnus-tmp-score-char)
-  (defvar gnus-tmp-indentation)
-  (defvar gnus-tmp-opening-bracket)
-  (defvar gnus-tmp-lines)
-  (defvar gnus-tmp-name)
-  (defvar gnus-tmp-closing-bracket)
-  (defvar gnus-tmp-subject-or-nil)
-  (defvar gnus-check-before-posting)
-  (defvar gnus-mouse-face)
-  (defvar gnus-group-buffer))
+(defvar gnus-tmp-unread)
+(defvar gnus-tmp-replied)
+(defvar gnus-tmp-score-char)
+(defvar gnus-tmp-indentation)
+(defvar gnus-tmp-opening-bracket)
+(defvar gnus-tmp-lines)
+(defvar gnus-tmp-name)
+(defvar gnus-tmp-closing-bracket)
+(defvar gnus-tmp-subject-or-nil)
+(defvar gnus-check-before-posting)
+(defvar gnus-mouse-face)
+(defvar gnus-group-buffer)
 
 (defun gnus-ems-redefine ()
   (cond
index 162cc7e198453dd9620dc7d6eb2f501f427f8484..05454960e380bc3f97337fddc96e947fb305afd9 100644 (file)
@@ -34,6 +34,8 @@
 (require 'gnus-util)
 (require 'gnus)
 
+(defvar gnus-face-properties-alist)
+
 (defcustom gnus-x-face-directory (expand-file-name "x-faces" gnus-directory)
   "*Directory where X-Face PBM files are stored."
   :version "22.1"
index 942a1cf4947ba933b1f14c51d43d40c28202478d..5843214e48a5d994c70b3e50780cf0a631fb837c 100644 (file)
@@ -28,8 +28,8 @@
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  (defvar tool-bar-mode))
+  (require 'cl))
+(defvar tool-bar-mode)
 
 (require 'gnus)
 (require 'gnus-start)
@@ -1655,6 +1655,24 @@ if it is a string, only list groups matching REGEXP."
         (ticked (gnus-range-length (cdr (assq 'tick marked))))
         (group-age (gnus-group-timestamp-delta group))
         (inhibit-read-only t))
+    ;; FIXME: http://thread.gmane.org/gmane.emacs.gnus.general/65451/focus=65465
+    ;; ======================================================================
+    ;; From: Richard Stallman
+    ;; Subject: Re: Rewriting gnus-group-highlight-line (was: [...])
+    ;; Cc: ding@gnus.org
+    ;; Date: Sat, 27 Oct 2007 19:41:20 -0400
+    ;; Message-ID: <E1IlvHM-0006TS-7t@fencepost.gnu.org>
+    ;;
+    ;; [...]
+    ;; The kludge is that the alist elements contain expressions that refer
+    ;; to local variables with short names.  Perhaps write your own tiny
+    ;; evaluator that handles just `and', `or', and numeric comparisons
+    ;; and just a few specific variables.
+    ;; ======================================================================
+    ;;
+    ;; Similar for other evaluated variables.  Grep for risky-local-variable
+    ;; to find them!  -- rsteib
+    ;;
     ;; Eval the cars of the lists until we find a match.
     (while (and list
                (not (eval (caar list))))
@@ -2875,8 +2893,8 @@ If SOLID (the prefix), create a solid group."
        (cons (current-buffer)
             (if (eq major-mode 'gnus-summary-mode) 'summary 'group))))))
 
+(defvar nnrss-group-alist)
 (eval-when-compile
-  (defvar nnrss-group-alist)
   (defun nnrss-discover-feed (arg))
   (defun nnrss-save-server-data (arg)))
 (defun gnus-group-make-rss-group (&optional url)
index 52b5e350653df054e1a74b1651d06cdc45cb89cc..ac2b7237866f420337e7e41beb461a3ab95cea2d 100644 (file)
@@ -36,6 +36,7 @@
 (autoload 'gnus-agent-expire "gnus-agent")
 (autoload 'gnus-agent-regenerate-group "gnus-agent")
 (autoload 'gnus-agent-read-servers-validate-native "gnus-agent")
+(autoload 'gnus-agent-possibly-synchronize-flags-server "gnus-agent")
 
 (defcustom gnus-open-server-hook nil
   "Hook called just before opening connection to the news server."
@@ -278,6 +279,11 @@ If it is down, start it up (again)."
               ;; prompting with "go offline?".  This is only a concern
               ;; when the agent's backend fails to open the server.
               (gnus-open-server gnus-command-method))
+         (when (and (eq (cadr elem) 'ok) gnus-agent
+                    (gnus-agent-method-p gnus-command-method))
+           (save-excursion
+             (gnus-agent-possibly-synchronize-flags-server
+              gnus-command-method)))
           result)))))
 
 (defun gnus-close-server (gnus-command-method)
index 5778a02e16820c03b6cca96b2ef30d9385d04f9b..2d64a76b6c6aa7e1c0012f9a443fbd61a3cd064d 100644 (file)
@@ -687,7 +687,6 @@ Usage: emacs -batch -l ~/.emacs -l gnus -f gnus-batch-score"
           (concat "options -n "
                   (mapconcat 'identity command-line-args-left " "))))
         (gnus-expert-user t)
-        (nnmail-spool-file nil)
         (mail-sources nil)
         (gnus-use-dribble-file nil)
         (gnus-batch-mode t)
index 66321c0d3e839b9905aeedc48c5abe872b941f13..48a85071e674951c0ec467e2db88dcba8bdb0764 100644 (file)
@@ -41,8 +41,7 @@
 (require 'gnus-msg)
 (require 'gnus-sum)
 
-(eval-when-compile
-  (defvar mh-lib-progs))
+(defvar mh-lib-progs)
 
 (defun gnus-summary-save-article-folder (&optional arg)
   "Append the current article to an mh folder.
index 0a97f8d5bd69f8b1be2141e03df0d4f3c698ebbf..cf5cde692ff2f5f6a0e87b43950a0760ce4e0cc5 100644 (file)
@@ -47,8 +47,7 @@ Update the .newsrc.eld file to reflect the change of nntp server."
 
   ;; First start Gnus.
   (let ((gnus-activate-level 0)
-       (mail-sources nil)
-       (nnmail-spool-file nil))
+       (mail-sources nil))
     (gnus))
 
   (save-excursion
index 891ed1bc2692b6dc8dde2b587fb48ddf094c4f86..735b9ed629ba112c956831e874573615f3cf3ce2 100644 (file)
@@ -265,7 +265,7 @@ This can also be a function receiving the group name as the only
 parameter, which should return non-nil if a confirmation is needed; or
 a regexp, in which case a confirmation is asked for if the group name
 matches the regexp."
-  :version "22.1"
+  :version "23.0" ;; No Gnus (default changed)
   :group 'gnus-message
   :type '(choice (const :tag "No" nil)
                 (const :tag "Yes" t)
@@ -1101,7 +1101,10 @@ If VERY-WIDE, make a very wide reply."
                       ((functionp gnus-confirm-mail-reply-to-news)
                        (funcall gnus-confirm-mail-reply-to-news gnus-newsgroup-name))
                       (t gnus-confirm-mail-reply-to-news)))
-           (y-or-n-p "Really reply by mail to article author? "))
+           (if (or wide very-wide)
+               t ;; Ignore gnus-confirm-mail-reply-to-news for wide and very
+                 ;; wide replies.
+             (y-or-n-p "Really reply by mail to article author? ")))
     (let* ((article
            (if (listp (car yank))
                (caar yank)
index 2ccf70efc468258ecfc67cf539fc9609ccf44436..d45cc6c5d6d777144349235c17dcb40a2fdcd8d2 100644 (file)
@@ -63,6 +63,8 @@
 (require 'gnus-util)
 (require 'nnmail)
 
+(defvar gnus-adaptive-word-syntax-table)
+
 (defvar gnus-registry-dirty t
  "Boolean set to t when the registry is modified")
 
index ca087f9ca4d360df7daa32278e04ad0ca89b2f45..77e06ee04f8c1842962f721444606bf7acbfa1f3 100644 (file)
@@ -280,7 +280,7 @@ The following commands are available:
        ;; Insert the text.
        (eval gnus-server-line-format-spec))
      (list 'gnus-server (intern gnus-tmp-name)
-           'gnus-named-server (intern (gnus-method-to-server method))))))
+           'gnus-named-server (intern (gnus-method-to-server method t))))))
 
 (defun gnus-enter-server-buffer ()
   "Set up the server buffer."
index 39de524b1563746096660d7cc8a4bfe08f00987d..2c1b6677949d046f371af42508530915bbe41892 100644 (file)
 (autoload 'gnus-agent-possibly-alter-active "gnus-agent")
 
 (eval-when-compile
-  (require 'cl)
+  (require 'cl))
 
-  (defvar gnus-agent-covered-methods nil)
-  (defvar gnus-agent-file-loading-local nil)
-  (defvar gnus-agent-file-loading-cache nil))
+(defvar gnus-agent-covered-methods)
+(defvar gnus-agent-file-loading-local)
+(defvar gnus-agent-file-loading-cache)
 
 (defcustom gnus-startup-file (nnheader-concat gnus-home-directory ".newsrc")
   "Your `.newsrc' file.
@@ -652,21 +652,20 @@ the first newsgroup."
 ;;; General various misc type functions.
 
 ;; Silence byte-compiler.
-(eval-when-compile
-  (defvar gnus-current-headers)
-  (defvar gnus-thread-indent-array)
-  (defvar gnus-newsgroup-name)
-  (defvar gnus-newsgroup-headers)
-  (defvar gnus-group-list-mode)
-  (defvar gnus-group-mark-positions)
-  (defvar gnus-newsgroup-data)
-  (defvar gnus-newsgroup-unreads)
-  (defvar nnoo-state-alist)
-  (defvar gnus-current-select-method)
-  (defvar mail-sources)
-  (defvar nnmail-scan-directory-mail-source-once)
-  (defvar nnmail-split-history)
-  (defvar nnmail-spool-file))
+(defvar gnus-current-headers)
+(defvar gnus-thread-indent-array)
+(defvar gnus-newsgroup-name)
+(defvar gnus-newsgroup-headers)
+(defvar gnus-group-list-mode)
+(defvar gnus-group-mark-positions)
+(defvar gnus-newsgroup-data)
+(defvar gnus-newsgroup-unreads)
+(defvar nnoo-state-alist)
+(defvar gnus-current-select-method)
+(defvar mail-sources)
+(defvar nnmail-scan-directory-mail-source-once)
+(defvar nnmail-split-history)
+(defvar nnmail-spool-file)
 
 (defun gnus-close-all-servers ()
   "Close all servers."
@@ -1514,8 +1513,8 @@ newsgroup."
       (setq killed (cdr killed)))))
 
 ;; We want to inline a function from gnus-cache, so we cheat here:
+(defvar gnus-cache-active-hashtb)
 (eval-when-compile
-  (defvar gnus-cache-active-hashtb)
   (defun gnus-cache-possibly-alter-active (group active)
     "Alter the ACTIVE info for GROUP to reflect the articles in the cache."
     (when gnus-cache-active-hashtb
@@ -1672,7 +1671,7 @@ If SCAN, request a scan of that group as well."
 (defun gnus-get-unread-articles (&optional level)
   (setq gnus-server-method-cache nil)
   (let* ((newsrc (cdr gnus-newsrc-alist))
-        (level (or level gnus-activate-level (1+ gnus-level-subscribed)))
+        (alevel (or level gnus-activate-level (1+ gnus-level-subscribed)))
         (foreign-level
          (min
           (cond ((and gnus-activate-foreign-newsgroups
@@ -1681,11 +1680,11 @@ If SCAN, request a scan of that group as well."
                 ((numberp gnus-activate-foreign-newsgroups)
                  gnus-activate-foreign-newsgroups)
                 (t 0))
-          level))
+          alevel))
         (methods-cache nil)
         (type-cache nil)
         scanned-methods info group active method retrieve-groups cmethod
-        method-type ignore)
+        method-type)
     (gnus-message 6 "Checking new news...")
 
     (while newsrc
@@ -1722,7 +1721,6 @@ If SCAN, request a scan of that group as well."
                'foreign)))
        (push (cons method method-type) type-cache))
 
-      (setq ignore nil)
       (cond ((and method (eq method-type 'foreign))
             ;; These groups are foreign.  Check the level.
             (if (<= (gnus-info-level info) foreign-level)
@@ -1736,9 +1734,17 @@ If SCAN, request a scan of that group as well."
                   (when (fboundp (intern (concat (symbol-name (car method))
                                                  "-request-update-info")))
                     (inline (gnus-request-update-info info method))))
-              (setq ignore t)))
+              (if (and level
+                       ;; If `active' is nil that means the group has
+                       ;; never been read, the group should be marked
+                       ;; as having never been checked (see below).
+                       active
+                       (> (gnus-info-level info) level))
+                  ;; Don't check groups of which levels are higher
+                  ;; than the one that a user specified.
+                  (setq active 'ignore))))
            ;; These groups are native or secondary.
-           ((> (gnus-info-level info) level)
+           ((> (gnus-info-level info) alevel)
             ;; We don't want these groups.
             (setq active 'ignore))
            ;; Activate groups.
@@ -1758,11 +1764,7 @@ If SCAN, request a scan of that group as well."
               ;; not required.
               (if (and
                    (or nnmail-scan-directory-mail-source-once
-                       (null (assq 'directory
-                                   (or mail-sources
-                                       (if (listp nnmail-spool-file)
-                                           nnmail-spool-file
-                                         (list nnmail-spool-file))))))
+                       (null (assq 'directory mail-sources)))
                    (member method scanned-methods))
                   (setq active (gnus-activate-group group))
                 (setq active (gnus-activate-group group 'scan))
@@ -1775,10 +1777,6 @@ If SCAN, request a scan of that group as well."
        ((eq active 'ignore)
        ;; Don't do anything.
        )
-       ((and active ignore)
-       ;; The level of the foreign group is higher than the specified
-       ;; value.
-       )
        (active
        (inline (gnus-get-unread-articles-in-group info active t)))
        (t
@@ -2106,7 +2104,8 @@ If SCAN, request a scan of that group as well."
                            (if (equal method gnus-select-method)
                                (gnus-make-hashtable
                                 (count-lines (point-min) (point-max)))
-                             (gnus-make-hashtable 4096)))))))
+                             (gnus-make-hashtable 4096))))))
+       group max min)
     ;; Delete unnecessary lines.
     (goto-char (point-min))
     (cond
@@ -2141,8 +2140,12 @@ If SCAN, request a scan of that group as well."
                      (insert prefix)
                      (zerop (forward-line 1)))))))
     ;; Store the active file in a hash table.
-    (goto-char (point-min))
-    (let (group max min)
+    ;; Use a unibyte buffer in order to make `read' read non-ASCII
+    ;; group names (which have been encoded) as unibyte strings.
+    (mm-with-unibyte-buffer
+      (insert-buffer-substring cur)
+      (setq cur (current-buffer))
+      (goto-char (point-min))
       (while (not (eobp))
        (condition-case ()
            (progn
index bc5ed9f0fb51018ead87283718b0aed19fa427ef..b082a8b152eafeb0e28c1ecd84cb2406b16f4b90 100644 (file)
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  (defvar tool-bar-mode))
+  (require 'cl))
+
+(defvar tool-bar-mode)
+(defvar gnus-tmp-header)
 
 (require 'gnus)
 (require 'gnus-group)
@@ -2193,6 +2195,7 @@ increase the score of each group you read."
   "O" gnus-uu-decode-save
   "b" gnus-uu-decode-binhex
   "B" gnus-uu-decode-binhex
+  "Y" gnus-uu-decode-yenc
   "p" gnus-uu-decode-postscript
   "P" gnus-uu-decode-postscript-and-save)
 
@@ -4954,7 +4957,6 @@ Unscored articles will be counted as having a score of zero."
 (defvar gnus-tmp-root-expunged nil)
 (defvar gnus-tmp-dummy-line nil)
 
-(eval-when-compile (defvar gnus-tmp-header))
 (defun gnus-extra-header (type &optional header)
   "Return the extra header of TYPE."
   (or (cdr (assq type (mail-header-extra (or header gnus-tmp-header))))
@@ -5592,8 +5594,7 @@ If SELECT-ARTICLES, only select those articles from GROUP."
     (gnus-get-predicate display)))
 
 ;; Uses the dynamically bound `number' variable.
-(eval-when-compile
-  (defvar number))
+(defvar number)
 (defun gnus-article-marked-p (type &optional article)
   (let ((article (or article number)))
     (cond
index cf174d90ac8709095682407c78f68b1ff85db872..de01fb2db111a193cc24da03cb69041eeaf9b006 100644 (file)
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  ;; Fixme: this should be a gnus variable, not nnmail-.
-  (defvar nnmail-pathname-coding-system)
-  (defvar nnmail-active-file-coding-system)
-
-  ;; Inappropriate references to other parts of Gnus.
-  (defvar gnus-emphasize-whitespace-regexp)
-  (defvar gnus-original-article-buffer)
-  (defvar gnus-user-agent)
-  )
+  (require 'cl))
+;; Fixme: this should be a gnus variable, not nnmail-.
+(defvar nnmail-pathname-coding-system)
+(defvar nnmail-active-file-coding-system)
+
+;; Inappropriate references to other parts of Gnus.
+(defvar gnus-emphasize-whitespace-regexp)
+(defvar gnus-original-article-buffer)
+(defvar gnus-user-agent)
+
 (require 'time-date)
 (require 'netrc)
 
@@ -982,9 +982,10 @@ with potentially long computations."
      ;; version fails halfway, however it provides the rmail-select-summary
      ;; macro which uses the following functions:
      (autoload 'rmail-summary-displayed "rmail")
-     (autoload 'rmail-maybe-display-summary "rmail")))
-  (defvar rmail-default-rmail-file)
-  (defvar mm-text-coding-system))
+     (autoload 'rmail-maybe-display-summary "rmail"))))
+
+(defvar rmail-default-rmail-file)
+(defvar mm-text-coding-system)
 
 (defun gnus-output-to-rmail (filename &optional ask)
   "Append the current article to an Rmail file named FILENAME."
@@ -1551,8 +1552,7 @@ Return nil otherwise."
                                 display))
              display)))))
 
-(eval-when-compile
-  (defvar tool-bar-mode))
+(defvar tool-bar-mode)
 
 (defun gnus-tool-bar-update (&rest ignore)
   "Update the tool bar."
@@ -1621,10 +1621,9 @@ predicate on the elements."
          (push (pop list1) res)))
       (nconc (nreverse res) list1 list2))))
 
-(eval-when-compile
-  (defvar xemacs-codename)
-  (defvar sxemacs-codename)
-  (defvar emacs-program-version))
+(defvar xemacs-codename)
+(defvar sxemacs-codename)
+(defvar emacs-program-version)
 
 (defun gnus-emacs-version ()
   "Stringified Emacs version."
index 2093756209613f676f36c0813fd88fdfadd412ac..3a045c2c234d1a9b6de8d2d2d1db3c14b4faec48 100644 (file)
@@ -35,6 +35,7 @@
 (require 'message)
 (require 'gnus-msg)
 (require 'mm-decode)
+(require 'yenc)
 
 (defgroup gnus-extract nil
   "Extracting encoded files."
@@ -75,7 +76,7 @@
     ("\\.\\(tar\\|arj\\|zip\\|zoo\\|arc\\|gz\\|Z\\|lzh\\|ar\\|lha\\)$"
      "gnus-uu-archive"))
   "*Default actions to be taken when the user asks to view a file.
-To change the behaviour, you can either edit this variable or set
+To change the behavior, you can either edit this variable or set
 `gnus-uu-user-view-rules' to something useful.
 
 For example:
@@ -95,7 +96,7 @@ at that point in the command string.  If there's no \"%s\" in the
 command string, the file name will be appended to the command string
 before executing.
 
-There are several user variables to tailor the behaviour of gnus-uu to
+There are several user variables to tailor the behavior of gnus-uu to
 your needs.  First we have `gnus-uu-user-view-rules', which is the
 variable gnus-uu first consults when trying to decide how to view a
 file.  If this variable contains no matches, gnus-uu examines the
@@ -346,6 +347,7 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
 (defvar gnus-uu-file-name nil)
 (defvar gnus-uu-uudecode-process nil)
 (defvar gnus-uu-binhex-article-name nil)
+(defvar gnus-uu-yenc-article-name nil)
 
 (defvar gnus-uu-work-dir nil)
 
@@ -412,6 +414,17 @@ didn't work, and overwrite existing files.  Otherwise, ask each time."
        (mm-make-temp-file (expand-file-name "binhex" gnus-uu-work-dir)))
   (gnus-uu-decode-with-method 'gnus-uu-binhex-article n dir))
 
+(defun gnus-uu-decode-yenc (n dir)
+  "Decode the yEnc-encoded current article."
+  (interactive
+   (list current-prefix-arg
+        (file-name-as-directory
+         (read-file-name "yEnc decode and save in dir: "
+                         gnus-uu-default-dir
+                         gnus-uu-default-dir))))
+  (setq gnus-uu-yenc-article-name nil)
+  (gnus-uu-decode-with-method 'gnus-uu-yenc-article n dir nil t))
+
 (defun gnus-uu-decode-uu-view (&optional n)
   "Uudecodes and views the current article."
   (interactive "P")
@@ -1016,6 +1029,39 @@ When called interactively, prompt for REGEXP."
        (cons gnus-uu-binhex-article-name state)
       state)))
 
+;; yEnc
+
+(defun gnus-uu-yenc-article (buffer in-state)
+  (save-excursion
+    (set-buffer gnus-original-article-buffer)
+    (widen)
+    (let ((file-name (yenc-extract-filename))
+         state start-char)
+      (when (not file-name)
+       (setq state (list 'wrong-type)))
+
+      (if (memq 'wrong-type state)
+         ()
+       (when (yenc-first-part-p)
+         (setq gnus-uu-yenc-article-name
+               (expand-file-name file-name gnus-uu-work-dir))
+         (push 'begin state))
+       (when (yenc-last-part-p)
+         (push 'end state))
+       (unless state
+         (push 'middle state))
+       (mm-with-unibyte-buffer
+         (insert-buffer gnus-original-article-buffer)
+         (yenc-decode-region (point-min) (point-max))
+         (when (and (member 'begin state)
+                    (file-exists-p gnus-uu-yenc-article-name))
+           (delete-file gnus-uu-yenc-article-name))
+         (mm-append-to-file (point-min) (point-max)
+                            gnus-uu-yenc-article-name)))
+      (if (memq 'begin state)
+         (cons file-name state)
+       state))))
+
 ;; PostScript
 
 (defun gnus-uu-decode-postscript-article (process-buffer in-state)
index b09511ea9c44ccfc2e9af8d247b85b99dbe15eb0..bd96e52d65f13ff316267e0d10fa4249d2f23086 100644 (file)
@@ -43,6 +43,8 @@
 (defvar gnus-spam-autodetect-methods)
 (defvar gnus-spam-newsgroup-contents)
 (defvar gnus-spam-process-destinations)
+(defvar gnus-spam-resend-to)
+(defvar gnus-ham-resend-to)
 (defvar gnus-spam-process-newsgroups)
 
 
@@ -3519,15 +3521,16 @@ that that variable is buffer-local to the summary buffers."
                                   (nth 1 method))))
       method)))
 
-(defsubst gnus-method-to-server (method)
+(defsubst gnus-method-to-server (method &optional nocache)
   (catch 'server-name
     (setq method (or method gnus-select-method))
 
     ;; Perhaps it is already in the cache.
-    (mapc (lambda (name-method)
-           (if (equal (cdr name-method) method)
-               (throw 'server-name (car name-method))))
-         gnus-server-method-cache)
+    (unless nocache
+      (mapc (lambda (name-method)
+             (if (equal (cdr name-method) method)
+                 (throw 'server-name (car name-method))))
+           gnus-server-method-cache))
 
     (mapc
      (lambda (server-alist)
@@ -4252,14 +4255,16 @@ Allow completion over sensible values."
 
 ;;; Agent functions
 
-(defun gnus-agent-method-p (method)
+(defun gnus-agent-method-p (method-or-server)
   "Say whether METHOD is covered by the agent."
-  (or (eq (car gnus-agent-method-p-cache) method)
-      (setq gnus-agent-method-p-cache
-           (cons method
-                 (member (if (stringp method)
-                             method
-                           (gnus-method-to-server method)) gnus-agent-covered-methods))))
+  (or (eq (car gnus-agent-method-p-cache) method-or-server)
+      (let* ((method (if (stringp method-or-server)
+                        (gnus-server-to-method method-or-server)
+                      method-or-server))
+            (server (gnus-method-to-server method t)))
+       (setq gnus-agent-method-p-cache
+             (cons method-or-server
+                   (member server gnus-agent-covered-methods)))))
   (cdr gnus-agent-method-p-cache))
 
 (defun gnus-online (method)
index abf327564982cca3f7f93e3bab30c99bb14bc1d9..39595b767ad7eb281bb72687d72744c720777461 100644 (file)
 
 ;;; Code:
 
+(require 'format-spec)
 (eval-when-compile
   (require 'cl)
-  (require 'imap)
-  (eval-when-compile (defvar display-time-mail-function)))
+  (require 'imap))
 (eval-and-compile
   (autoload 'pop3-movemail "pop3")
   (autoload 'pop3-get-message-count "pop3")
   (autoload 'nnheader-cancel-timer "nnheader"))
-(require 'format-spec)
 (require 'mm-util)
 (require 'message) ;; for `message-directory'
 
+(defvar display-time-mail-function)
+
+
 (defgroup mail-source nil
   "The mail-fetching library."
   :version "21.1"
              (list 'const (car a)))
      imap-stream-alist)))
 
-(defcustom mail-sources nil
-  "*Where the mail backends will look for incoming mail.
+(defcustom mail-sources '((file))
+  "Where the mail backends will look for incoming mail.
 This variable is a list of mail source specifiers.
 See Info node `(gnus)Mail Source Specifiers'."
   :group 'mail-source
+  :version "23.0" ;; No Gnus
   :link '(custom-manual "(gnus)Mail Source Specifiers")
   :type `(choice
-         (const nil)
-         (repeat
+         (const :tag "None" nil)
+         (repeat :tag "List"
           (choice :format "%[Value Menu%] %v"
                   :value (file)
                   (cons :tag "Spool file"
index 6839a6472b7b98125a7e4f2baa61c4a67371c824..063b2ec2f449decfd1aef354c43719537656cb26 100644 (file)
 ;;; Code:
 
 (eval-when-compile (require 'cl))
-(require 'mail-parse)
-(require 'mm-util)
+(autoload 'mail-header-parse-content-type "mail-parse")
+
+;; `mm-delete-duplicates' is an alias for `delete-dups' in Emacs 22.
+(defalias 'mailcap-delete-duplicates
+  (if (fboundp 'delete-dups)
+      'delete-dups
+    (autoload 'mm-delete-duplicates "mm-util")
+    'mm-delete-duplicates))
 
 (defgroup mailcap nil
   "Definition of viewers for MIME types."
@@ -722,7 +728,7 @@ If TEST is not given, it defaults to t."
       t)
      (t nil))))
 
-(defun mailcap-mime-info (string &optional request)
+(defun mailcap-mime-info (string &optional request no-decode)
   "Get the MIME viewer command for STRING, return nil if none found.
 Expects a complete content-type header line as its argument.
 
@@ -732,7 +738,11 @@ entry) will be returned.  If it is a string, then the mailcap field
 corresponding to that string will be returned (print, description,
 whatever).  If a number, then all the information for this specific
 viewer is returned.  If `all', then all possible viewers for
-this type is returned."
+this type is returned.
+
+If NO-DECODE is non-nil, don't decode STRING."
+  ;; NO-DECODE avoids calling `mail-header-parse-content-type' from
+  ;; `mail-parse.el'
   (let (
        major                           ; Major encoding (text, etc)
        minor                           ; Minor encoding (html, etc)
@@ -746,7 +756,10 @@ this type is returned."
        viewer                          ; The one and only viewer
        ctl)
     (save-excursion
-      (setq ctl (mail-header-parse-content-type (or string "text/plain")))
+      (setq ctl
+           (if no-decode
+               (list (or string "text/plain"))
+             (mail-header-parse-content-type (or string "text/plain"))))
       (setq major (split-string (car ctl) "/"))
       (setq minor (cadr major)
            major (car major))
@@ -766,7 +779,7 @@ this type is returned."
        (setq viewer (car passed)))
       (cond
        ((and (null viewer) (not (equal major "default")) request)
-       (mailcap-mime-info "default" request))
+       (mailcap-mime-info "default" request no-decode))
        ((or (null request) (equal request ""))
        (mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info))
        ((stringp request)
@@ -976,7 +989,7 @@ If FORCE, re-parse even if already parsed."
 (defun mailcap-mime-types ()
   "Return a list of MIME media types."
   (mailcap-parse-mimetypes)
-  (mm-delete-duplicates
+  (mailcap-delete-duplicates
    (nconc
     (mapcar 'cdr mailcap-mime-extensions)
     (apply
index 895c36a6beb7cb56fe223821f2f32396f33827c1..3aaa8c25745fef4abfb23b32ef4f9acdaaf439b1 100644 (file)
@@ -32,9 +32,8 @@
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  (defvar gnus-message-group-art)
-  (defvar gnus-list-identifiers)) ; gnus-sum is required where necessary
+  (require 'cl))
+  
 (require 'hashcash)
 (require 'canlock)
 (require 'mailheader)
 (require 'rfc822)
 (require 'ecomplete)
 
+(autoload 'mailclient-send-it "mailclient") ;; Emacs 22 or contrib/
+
+(defvar gnus-message-group-art)
+(defvar gnus-list-identifiers) ; gnus-sum is required where necessary
+(defvar rmail-enable-mime-composing)
 
 (defgroup message '((user-mail-address custom-variable)
                    (user-full-name custom-variable))
@@ -269,7 +273,7 @@ included.  Organization and User-Agent are optional."
   :link '(custom-manual "(message)Mail Headers")
   :type 'regexp)
 
-(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|^X-Payment:\\|^Approved:"
+(defcustom message-ignored-supersedes-headers "^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-ID:\\|^X-Complaints-To:\\|Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|^X-Payment:\\|^Approved:"
   "*Header lines matching this regexp will be deleted before posting.
 It's best to delete old Path and Date headers before posting to avoid
 any confusion."
@@ -474,8 +478,7 @@ This is used by `message-kill-buffer'."
   :group 'message-buffers
   :type 'boolean)
 
-(eval-when-compile
-  (defvar gnus-local-organization))
+(defvar gnus-local-organization)
 (defcustom message-user-organization
   (or (and (boundp 'gnus-local-organization)
           (stringp gnus-local-organization)
@@ -585,21 +588,21 @@ Done before generating the new subject of a forward."
   :type 'regexp)
 
 (defcustom message-cite-prefix-regexp
-  (if (string-match "[[:digit:]]" "1") ;; support POSIX?
-      "\\([ \t]*[-_.[:word:]]+>+\\|[ \t]*[]>|}+]\\)+"
+  (if (string-match "[[:digit:]]" "1")
+      ;; Support POSIX?  XEmacs 21.5.27 doesn't.
+      "\\([ \t]*[_.[:word:]]+>+\\|[ \t]*[]>|}]\\)+"
     ;; ?-, ?_ or ?. MUST NOT be in syntax entry w.
     (let (non-word-constituents)
       (with-syntax-table text-mode-syntax-table
        (setq non-word-constituents
              (concat
-              (if (string-match "\\w" "-")  "" "-")
               (if (string-match "\\w" "_")  "" "_")
               (if (string-match "\\w" ".")  "" "."))))
       (if (equal non-word-constituents "")
-         "\\([ \t]*\\(\\w\\)+>+\\|[ \t]*[]>|}+]\\)+"
+         "\\([ \t]*\\(\\w\\)+>+\\|[ \t]*[]>|}]\\)+"
        (concat "\\([ \t]*\\(\\w\\|["
                non-word-constituents
-               "]\\)+>+\\|[ \t]*[]>|}+]\\)+"))))
+               "]\\)+>+\\|[ \t]*[]>|}]\\)+"))))
   "*Regexp matching the longest possible citation prefix on a line."
   :version "22.1"
   :group 'message-insertion
@@ -618,28 +621,36 @@ Done before generating the new subject of a forward."
   :link '(custom-manual "(message)Canceling News")
   :type 'string)
 
+(defvar smtpmail-default-smtp-server)
+
+(defun message-send-mail-function ()
+  "Return suitable value for the variable `message-send-mail-function'."
+  (cond ((and (require 'sendmail)
+             (boundp 'sendmail-program)
+             sendmail-program
+             (executable-find sendmail-program))
+        'message-send-mail-with-sendmail)
+       ((and (locate-library "smtpmail")
+             (require 'smtpmail)
+             smtpmail-default-smtp-server)
+        'message-smtpmail-send-it)
+       ((locate-library "mailclient")
+        'message-send-mail-with-mailclient)
+       (t
+        (lambda ()
+          (error "Don't know how to send mail.  Please customize `message-send-mail-function'")))))
+
 ;; Useful to set in site-init.el
-(defcustom message-send-mail-function
-  (let ((program (if (boundp 'sendmail-program)
-                    ;; see paths.el
-                    sendmail-program)))
-    (cond
-     ((and program
-          (string-match "/" program) ;; Skip path
-          (file-executable-p program))
-      'message-send-mail-with-sendmail)
-     ((and program
-          (executable-find program))
-      'message-send-mail-with-sendmail)
-     (t
-      'smtpmail-send-it)))
+(defcustom message-send-mail-function (message-send-mail-function)
   "Function to call to send the current buffer as mail.
 The headers should be delimited by a line whose contents match the
 variable `mail-header-separator'.
 
-Valid values include `message-send-mail-with-sendmail' (the default),
+Valid values include `message-send-mail-with-sendmail'
 `message-send-mail-with-mh', `message-send-mail-with-qmail',
-`message-smtpmail-send-it', `smtpmail-send-it' and `feedmail-send-it'.
+`message-smtpmail-send-it', `smtpmail-send-it',
+`feedmail-send-it' and `message-send-mail-with-mailclient'.  The
+default is system dependent.
 
 See also `send-mail-function'."
   :type '(radio (function-item message-send-mail-with-sendmail)
@@ -648,8 +659,12 @@ See also `send-mail-function'."
                (function-item message-smtpmail-send-it)
                (function-item smtpmail-send-it)
                (function-item feedmail-send-it)
-               (function :tag "Other"))
+               (function :tag "Other")
+               (function-item message-send-mail-with-mailclient
+                              :tag "Use Mailclient package")
+               (function :tag "Other"))
   :group 'message-sending
+  :initialize 'custom-initialize-default
   :link '(custom-manual "(message)Mail Variables")
   :group 'message-mail)
 
@@ -816,9 +831,8 @@ might set this variable to '(\"-f\" \"you@some.where\")."
   :type '(choice (function)
                 (repeat string)))
 
-(eval-when-compile
-  (defvar gnus-post-method)
-  (defvar gnus-select-method))
+(defvar gnus-post-method)
+(defvar gnus-select-method)
 (defcustom message-post-method
   (cond ((and (boundp 'gnus-post-method)
              (listp gnus-post-method)
@@ -1122,8 +1136,7 @@ these lines."
           (file-readable-p "/etc/sendmail.cf")
           (let ((buffer (get-buffer-create " *temp*")))
             (unwind-protect
-                (save-excursion
-                  (set-buffer buffer)
+                (with-current-buffer buffer
                   (insert-file-contents "/etc/sendmail.cf")
                   (goto-char (point-min))
                   (let ((case-fold-search nil))
@@ -1205,7 +1218,7 @@ If nil, you might be asked to input the charset."
 (defcustom message-dont-reply-to-names
   (and (boundp 'rmail-dont-reply-to-names) rmail-dont-reply-to-names)
   "*Addresses to prune when doing wide replies.
-This can be a regexp or a list of regexps. Also, a value of nil means
+This can be a regexp or a list of regexps.  Also, a value of nil means
 exclude your own user name only."
   :version "21.1"
   :group 'message
@@ -1617,7 +1630,7 @@ functionality to work."
 
 (defcustom message-generate-hashcash (if (executable-find "hashcash") t)
   "*Whether to generate X-Hashcash: headers.
-If `t', always generate hashcash headers.  If `opportunistic',
+If t, always generate hashcash headers.  If `opportunistic',
 only generate hashcash headers if it can be done without the user
 waiting (i.e., only asynchronously).
 
@@ -1640,9 +1653,8 @@ You must have the \"hashcash\" binary installed, see `hashcash-path'."
 (defvar message-inserted-headers nil)
 
 ;; Byte-compiler warning
-(eval-when-compile
-  (defvar gnus-active-hashtb)
-  (defvar gnus-read-active-file))
+(defvar gnus-active-hashtb)
+(defvar gnus-read-active-file)
 
 ;;; Regexp matching the delimiter of messages in UNIX mail format
 ;;; (UNIX From lines), minus the initial ^.  It should be a copy
@@ -1916,8 +1928,7 @@ see `message-narrow-to-headers-or-head'."
   "Evaluate FORMS in the reply buffer, if it exists."
   `(when (and message-reply-buffer
              (buffer-name message-reply-buffer))
-     (save-excursion
-       (set-buffer message-reply-buffer)
+     (with-current-buffer message-reply-buffer
        ,@forms)))
 
 (put 'message-with-reply-buffer 'lisp-indent-function 0)
@@ -2662,9 +2673,8 @@ Prefixed with two \\[universal-argument]'s, display the PGG manual."
 
 (defvar message-tool-bar-map nil)
 
-(eval-when-compile
-  (defvar facemenu-add-face-function)
-  (defvar facemenu-remove-face-function))
+(defvar facemenu-add-face-function)
+(defvar facemenu-remove-face-function)
 
 ;;; Forbidden properties
 ;;
@@ -3084,8 +3094,7 @@ or in the synonym headers, defined by `message-header-synonyms'."
   (let ((follow-to
         (and message-reply-buffer
              (buffer-name message-reply-buffer)
-             (save-excursion
-               (set-buffer message-reply-buffer)
+             (with-current-buffer message-reply-buffer
                (message-get-reply-headers t)))))
     (save-excursion
       (save-restriction
@@ -3337,8 +3346,7 @@ The three allowed values according to RFC 1327 are `high', `normal'
 and `low'."
   (interactive)
   (save-excursion
-    (let ((valid '("high" "normal" "low"))
-         (new "high")
+    (let ((new "high")
          cur)
       (save-restriction
        (message-narrow-to-headers)
@@ -3612,7 +3620,7 @@ Really top post? ")))
 (defun message-buffers ()
   "Return a list of active message buffers."
   (let (buffers)
-    (save-excursion
+    (save-current-buffer
       (dolist (buffer (buffer-list t))
        (set-buffer buffer)
        (when (and (eq major-mode 'message-mode)
@@ -3620,8 +3628,6 @@ Really top post? ")))
          (push (buffer-name buffer) buffers))))
     (nreverse buffers)))
 
-(eval-when-compile (defvar mail-citation-hook))        ; Compiler directive
-
 (defun message-cite-original-1 (strip-signature)
   "Cite an original message.
 If STRIP-SIGNATURE is non-nil, strips off the signature from the
@@ -3688,6 +3694,8 @@ 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)
+
 (defun message-insert-formatted-citation-line (&optional from date)
   "Function that inserts a formatted citation line.
 
@@ -4304,8 +4312,7 @@ This function could be useful in `message-setup-hook'."
       ;; Let the user do all of the above.
       (run-hooks 'message-header-hook))
     (unwind-protect
-       (save-excursion
-         (set-buffer tembuf)
+       (with-current-buffer tembuf
          (erase-buffer)
          ;; Avoid copying text props (except hard newlines).
          (insert (with-current-buffer mailbuf
@@ -4450,8 +4457,7 @@ If you always want Gnus to send messages in one piece, set
            (unless (or (null cpr) (and (numberp cpr) (zerop cpr)))
              (error "Sending...failed with exit value %d" cpr)))
          (when message-interactive
-           (save-excursion
-             (set-buffer errbuf)
+           (with-current-buffer errbuf
              (goto-char (point-min))
              (while (re-search-forward "\n+ *" nil t)
                (replace-match "; "))
@@ -4532,6 +4538,13 @@ manual for details."
   (run-hooks 'message-send-mail-hook)
   (smtpmail-send-it))
 
+(defun message-send-mail-with-mailclient ()
+  "Send the prepared message buffer with `mailclient-send-it'.
+This only differs from `smtpmail-send-it' that this command evaluates
+`message-send-mail-hook' just before sending a message."
+  (run-hooks 'message-send-mail-hook)
+  (mailclient-send-it))
+
 (defun message-canlock-generate ()
   "Return a string that is non-trivial to guess.
 Do not use this for anything important, it is cryptographically weak."
@@ -4614,8 +4627,7 @@ Otherwise, generate and save a value for `canlock-password' first."
                 (message-check-news-syntax)))
          nil
        (unwind-protect
-           (save-excursion
-             (set-buffer tembuf)
+           (with-current-buffer tembuf
              (buffer-disable-undo)
              (erase-buffer)
              ;; Avoid copying text props (except hard newlines).
@@ -5278,8 +5290,7 @@ In posting styles use `(\"Expires\" (make-expires-date 30))'."
   "Return the References header for this message."
   (when message-reply-headers
     (let ((message-id (mail-header-message-id message-reply-headers))
-         (references (mail-header-references message-reply-headers))
-         new-references)
+         (references (mail-header-references message-reply-headers)))
       (if (or references message-id)
          (concat (or references "") (and references " ")
                  (or message-id ""))
@@ -5527,8 +5538,7 @@ subscribed address (and not the additional To and Cc header contents)."
                             (mapcar 'funcall
                                     message-subscribed-address-functions))))
     (save-match-data
-      (let ((subscribed-lists nil)
-           (list
+      (let ((list
             (loop for recipient in recipients
               when (loop for regexp in mft-regexps
                      when (string-match regexp recipient) return t)
@@ -5549,7 +5559,9 @@ subscribed address (and not the additional To and Cc header contents)."
                        (mapcar 'downcase
                                (mapcar
                                 'car (mail-header-parse-addresses field))))))
-       (setq ace (downcase (idna-to-ascii rhs)))
+       (setq ace (if (string-match "\\`[[:ascii:]]+\\'" rhs)
+                     rhs
+                   (downcase (idna-to-ascii rhs))))
        (when (and (not (equal rhs ace))
                   (or (not (eq message-use-idna 'ask))
                       (y-or-n-p (format "Replace %s with %s in %s:? "
@@ -6873,8 +6885,7 @@ the message."
            (setq subject (funcall func subject))))
        subject))))
 
-(eval-when-compile
-  (defvar gnus-article-decoded-p))
+(defvar gnus-article-decoded-p)
 
 
 ;;;###autoload
@@ -7088,8 +7099,6 @@ is for the internal use."
        (rmail-msg-restore-non-pruned-header)))
   (message-forward-make-body forward-buffer))
 
-(eval-when-compile (defvar rmail-enable-mime-composing))
-
 ;; Fixme: Should have defcustom.
 ;;;###autoload
 (defun message-insinuate-rmail ()
@@ -7311,8 +7320,7 @@ which specify the range to operate on."
     (mapcar #'delete-overlay (overlays-in (point-min) (point-max)))))
 
 ;; Support for toolbar
-(eval-when-compile
-  (defvar tool-bar-mode))
+(defvar tool-bar-mode)
 
 ;; Note: The :set function in the `message-tool-bar*' variables will only
 ;; affect _new_ message buffers.  We might add a function that walks thru all
@@ -7377,7 +7385,7 @@ See `gmm-tool-bar-from-list' for details on the format of the list."
 
 (defcustom message-tool-bar-retro
   '(;; Old Emacs 21 icon for consistency.
-    (message-send-and-exit "gnus/mail_send")
+    (message-send-and-exit "gnus/mail-send")
     (message-kill-buffer "close")
     (message-dont-send "cancel")
     (mml-attach-file "attach" mml-mode-map)
@@ -7556,9 +7564,8 @@ The following arguments may contain lists of values."
   (if (and show
           (setq text (message-flatten-list text)))
       (save-window-excursion
-       (save-excursion
-         (with-output-to-temp-buffer " *MESSAGE information message*"
-           (set-buffer " *MESSAGE information message*")
+        (with-output-to-temp-buffer " *MESSAGE information message*"
+          (with-current-buffer " *MESSAGE information message*"
            (fundamental-mode)          ; for Emacs 20.4+
            (mapc 'princ text)
            (goto-char (point-min))))
@@ -7581,16 +7588,13 @@ Then clone the local variables and values from the old buffer to the
 new one, cloning only the locals having a substring matching the
 regexp VARSTR."
   (let ((oldbuf (current-buffer)))
-    (save-excursion
-      (set-buffer (generate-new-buffer name))
+    (with-current-buffer (generate-new-buffer name)
       (message-clone-locals oldbuf varstr)
       (current-buffer))))
 
 (defun message-clone-locals (buffer &optional varstr)
   "Clone the local variables from BUFFER to the current buffer."
-  (let ((locals (save-excursion
-                 (set-buffer buffer)
-                 (buffer-local-variables)))
+  (let ((locals (with-current-buffer buffer (buffer-local-variables)))
        (regexp "^gnus\\|^nn\\|^message\\|^sendmail\\|^smtp\\|^user-mail-address"))
     (mapcar
      (lambda (local)
index 20af36564f7e9e860a4d8d23d480b436b6214ce0..0560c51ba41e891675198366de6aeee21d2c5c32 100644 (file)
 
 ;;; Code:
 
-(eval-when-compile
-  (defvar mm-uu-decode-function)
-  (defvar mm-uu-binhex-decode-function))
-
 (require 'mm-util)
 (require 'rfc2047)
 (require 'mm-encode)
 
+(defvar mm-uu-yenc-decode-function)
+(defvar mm-uu-decode-function)
+(defvar mm-uu-binhex-decode-function)
+
 ;; 8bit treatment gets any char except: 0x32 - 0x7f, LF, TAB, BEL,
 ;; BS, vertical TAB, form feed, and ^_
 ;;
@@ -170,8 +170,6 @@ If no encoding was done, nil is returned."
 ;;; Functions for decoding
 ;;;
 
-(eval-when-compile (defvar mm-uu-yenc-decode-function))
-
 (defun mm-decode-content-transfer-encoding (encoding &optional type)
   "Decodes buffer encoded with ENCODING, returning success status.
 If TYPE is `text/plain' CRLF->LF translation may occur."
index 14e5c255d2a4b844485614b2d1c94efb2fa15615..71ef9bcdf556ee5a1312a2cd6e483c75c5344847 100644 (file)
@@ -895,7 +895,7 @@ external if displayed external."
                          ;; a vector in Emacs but is a list in XEmacs)
                          ;; requires that it is lexically scoped.
                          (timer (run-at-time 2.0 nil 'ignore)))
-                      (if (boundp 'itimer-list)
+                      (if (featurep 'xemacs)
                           (lambda (process state)
                             (when (eq 'exit (process-status process))
                               (if (memq timer itimer-list)
@@ -1364,34 +1364,35 @@ be determined."
            (mm-handle-set-cache handle spec))))))
 
 (defun mm-create-image-xemacs (type)
-  (cond
-   ((equal type "xbm")
-    ;; xbm images require special handling, since
-    ;; the only way to create glyphs from these
-    ;; (without a ton of work) is to write them
-    ;; out to a file, and then create a file
-    ;; specifier.
-    (let ((file (mm-make-temp-file
-                (expand-file-name "emm" mm-tmp-directory)
-                nil ".xbm")))
-      (unwind-protect
-         (progn
-           (write-region (point-min) (point-max) file)
-           (make-glyph (list (cons 'x file))))
-       (ignore-errors
-         (delete-file file)))))
-   (t
-    (make-glyph
-     (vector
-      (or (mm-image-type-from-buffer)
-         (intern type))
-      :data (buffer-string))))))
+  (when (featurep 'xemacs)
+    (cond
+     ((equal type "xbm")
+      ;; xbm images require special handling, since
+      ;; the only way to create glyphs from these
+      ;; (without a ton of work) is to write them
+      ;; out to a file, and then create a file
+      ;; specifier.
+      (let ((file (mm-make-temp-file
+                  (expand-file-name "emm" mm-tmp-directory)
+                  nil ".xbm")))
+       (unwind-protect
+           (progn
+             (write-region (point-min) (point-max) file)
+             (make-glyph (list (cons 'x file))))
+         (ignore-errors
+           (delete-file file)))))
+     (t
+      (make-glyph
+       (vector
+       (or (mm-image-type-from-buffer)
+           (intern type))
+       :data (buffer-string)))))))
 
 (defun mm-image-fit-p (handle)
   "Say whether the image in HANDLE will fit the current window."
   (let ((image (mm-get-image handle)))
     (or (not image)
-       (if (fboundp 'glyph-width)
+       (if (featurep 'xemacs)
            ;; XEmacs' glyphs can actually tell us about their width, so
            ;; lets be nice and smart about them.
            (or mm-inline-large-images
index cfc6c949be06d271c0a54b649306393090542593..edb7521dbf350afd0e57d2f87785137235b001d2 100644 (file)
@@ -36,6 +36,8 @@
        (require 'timer))
     (require 'timer)))
 
+(defvar mm-mime-mule-charset-alist )
+
 (eval-and-compile
   (mapc
    (lambda (elem)
@@ -837,9 +839,10 @@ This affects whether coding conversion should be attempted generally."
   (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")
-  (defvar latin-unity-coding-systems)
-  (defvar latin-unity-ucs-list))
+  (autoload 'latin-unity-representations-present-region "latin-unity"))
+
+(defvar latin-unity-coding-systems)
+(defvar latin-unity-ucs-list)
 
 (defun mm-xemacs-find-mime-charset-1 (begin end)
   "Determine which MIME charset to use to send region as message.
@@ -1375,7 +1378,7 @@ gzip, bzip2, etc. are allowed."
                    (funcall (symbol-value 'set-auto-coding-function)
                             nil (- (point-max) (point-min)))
                  (error nil)))))
-          ((featurep 'file-coding) ;; XEmacs
+          ((and (featurep 'xemacs) (featurep 'file-coding)) ;; XEmacs
            (let ((case-fold-search t)
                  (end (point-at-eol))
                  codesys start)
index c7f6b16a1c8e0024dfad03af28b64becc23e4c6c..52d47b728efa5ea3a07968522db9006cf1389588 100644 (file)
@@ -272,7 +272,7 @@ If PROPERTIES is non-nil, PROPERTIES are applied to the buffer,
 see `set-text-properties'.  If PROPERTIES equals t, this means to
 apply the face `mm-uu-extract'."
   (let ((obuf (current-buffer))
-        (coding-system
+       (coding-system
          ;; Might not exist in non-MULE XEmacs
          (when (boundp 'buffer-file-coding-system)
            buffer-file-coding-system)))
@@ -305,11 +305,10 @@ apply the face `mm-uu-extract'."
 
 (mm-uu-configure)
 
-(eval-when-compile
-  (defvar file-name)
-  (defvar start-point)
-  (defvar end-point)
-  (defvar entry))
+(defvar file-name)
+(defvar start-point)
+(defvar end-point)
+(defvar entry)
 
 (defun mm-uu-uu-filename ()
   (if (looking-at ".+")
@@ -375,8 +374,7 @@ apply the face `mm-uu-extract'."
                  (list mm-dissect-disposition
                        (cons 'filename file-name))))
 
-(eval-when-compile
-  (defvar gnus-newsgroup-name))
+(defvar gnus-newsgroup-name)
 
 (defun mm-uu-emacs-sources-test ()
   (setq file-name (match-string 1))
@@ -430,7 +428,12 @@ apply the face `mm-uu-extract'."
                            (cons 'filename file-name)))))
 
 (defun mm-uu-yenc-extract ()
-  (mm-make-handle (mm-uu-copy-to-buffer start-point end-point)
+  ;; This might not be exactly correct, but we sure can't get the
+  ;; binary data from the article buffer, since that's already in a
+  ;; non-binary charset.  So get it from the original article buffer. 
+  (mm-make-handle (save-excursion
+                   (set-buffer gnus-original-article-buffer)
+                   (mm-uu-copy-to-buffer start-point end-point))
                  (list (or (and file-name
                                 (string-match "\\.[^\\.]+$" file-name)
                                 (mailcap-extension-to-mime
@@ -465,8 +468,7 @@ apply the face `mm-uu-extract'."
           (y-or-n-p "Verify pgp signed part? ")
         (message ""))))))
 
-(eval-when-compile
-  (defvar gnus-newsgroup-charset))
+(defvar gnus-newsgroup-charset)
 
 (defun mm-uu-pgp-signed-extract-1 (handles ctl)
   (let ((buf (mm-uu-copy-to-buffer (point-min) (point-max))))
index ffaf0ed68ba10e840196668fd15aa4fc0218e325..cb4f42dabcfef0f04c55a0958eb714104e42726f 100644 (file)
          (delete-region b (+ b 2)))))))
 
 (defun mm-inline-image-xemacs (handle)
-  (insert "\n\n")
-  (forward-char -2)
-  (let ((annot (make-annotation (mm-get-image handle) nil 'text))
-       buffer-read-only)
-    (mm-handle-set-undisplayer
-     handle
-     `(lambda ()
-       (let ((b ,(point-marker))
-             buffer-read-only)
-         (delete-annotation ,annot)
-         (delete-region (- b 2) b))))
-    (set-extent-property annot 'mm t)
-    (set-extent-property annot 'duplicable t)))
+  (when (featurep 'xemacs)
+    (insert "\n\n")
+    (forward-char -2)
+    (let ((annot (make-annotation (mm-get-image handle) nil 'text))
+         buffer-read-only)
+      (mm-handle-set-undisplayer
+       handle
+       `(lambda ()
+         (let ((b ,(point-marker))
+               buffer-read-only)
+           (delete-annotation ,annot)
+           (delete-region (- b 2) b))))
+      (set-extent-property annot 'mm t)
+      (set-extent-property annot 'duplicable t))))
 
 (eval-and-compile
   (if (featurep 'xemacs)
       ;; By default, XEmacs font-lock uses non-duplicable text
       ;; properties.  This code forces all the text properties
       ;; to be copied along with the text.
-      (when (fboundp 'extent-list)
+      (when (featurep 'xemacs)
        (map-extents (lambda (ext ignored)
                       (set-extent-property ext 'duplicable t)
                       nil)
index 29bc0d41a1bdbebb2176ffd9b7696b48ccde1585..e7ecc06164f7f5a1ed42d48d3b2a8535cf2dfd63 100644 (file)
@@ -27,7 +27,9 @@
 ;;; Code:
 
 (eval-when-compile (require 'cl))
-(require 'password)
+(or (require 'password-cache nil t)
+    (require 'password))
+
 (autoload 'mml2015-sign "mml2015")
 (autoload 'mml2015-encrypt "mml2015")
 (autoload 'mml1991-sign "mml1991")
index c00ac416b8b92a856ab8ba4d1bd19078b201aec4..07dc1ab4ccbe432a9400b5a0207fc1a9c9e236f8 100644 (file)
@@ -142,6 +142,8 @@ Whether the passphrase is cached at all is controlled by
       nil))
   (goto-char (point-max)))
 
+(defvar gnus-extract-address-components)
+
 (defun mml-smime-openssl-sign-query ()
   ;; query information (what certificate) from user when MML tag is
   ;; added, for use later by the signing process
@@ -298,13 +300,13 @@ Whether the passphrase is cached at all is controlled by
 (defun mml-smime-openssl-verify-test (handle ctl)
   smime-openssl-program)
 
-(eval-and-compile
-  (autoload 'epg-make-context "epg"))
+(defvar epg-user-id-alist)
+(defvar epg-digest-algorithm-alist)
+(defvar inhibit-redisplay)
+(defvar password-cache-expiry)
 
 (eval-when-compile
-  (defvar epg-user-id-alist)
-  (defvar epg-digest-algorithm-alist)
-  (defvar inhibit-redisplay)
+  (autoload 'epg-make-context "epg")
   (autoload 'epg-context-set-armor "epg")
   (autoload 'epg-context-set-signers "epg")
   (autoload 'epg-context-result-for "epg")
@@ -321,12 +323,6 @@ Whether the passphrase is cached at all is controlled by
   (autoload 'epg-expand-group "epg-config")
   (autoload 'epa-select-keys "epa"))
 
-(eval-when-compile
-  (defvar password-cache-expiry)
-  (autoload 'password-read "password")
-  (autoload 'password-cache-add "password")
-  (autoload 'password-cache-remove "password"))
-
 (defvar mml-smime-epg-secret-key-id-list nil)
 
 (defun mml-smime-epg-passphrase-callback (context key-id ignore)
index 7fbc8bb3209805ffee62621b0ef556e0eab42233..c5b7796ffafa052d878d9f1c237b54279cb3d9a2 100644 (file)
@@ -53,6 +53,7 @@
 (defvar message-required-mail-headers)
 (defvar message-required-news-headers)
 (defvar dnd-protocol-alist)
+(defvar mml-dnd-protocol-alist)
 
 (defcustom mml-content-type-parameters
   '(name access-type expiration size permission format)
@@ -806,9 +807,9 @@ If MML is non-nil, return the buffer up till the correspondent mml tag."
         (mail-header-encode-parameter
          (symbol-name type) value))))))
 
-(eval-when-compile
-  (defvar ange-ftp-name-format)
-  (defvar efs-path-regexp))
+(defvar ange-ftp-name-format)
+(defvar efs-path-regexp)
+
 (defun mml-parse-file-name (path)
   (if (if (boundp 'efs-path-regexp)
          (string-match efs-path-regexp path)
index f6d2dcc7ad5c3211454881d492165a2111683ff2..be9981676e6572f8908fb4af59d9b317ee7c6b1f 100644 (file)
@@ -244,10 +244,9 @@ Whether the passphrase is cached at all is controlled by
 
 ;; pgg wrapper
 
-(eval-when-compile
-  (defvar pgg-default-user-id)
-  (defvar pgg-errors-buffer)
-  (defvar pgg-output-buffer))
+(defvar pgg-default-user-id)
+(defvar pgg-errors-buffer)
+(defvar pgg-output-buffer)
 
 (defun mml1991-pgg-sign (cont)
   (let ((pgg-text-mode t)
@@ -313,11 +312,11 @@ Whether the passphrase is cached at all is controlled by
 
 ;; epg wrapper
 
-(eval-and-compile
-  (autoload 'epg-make-context "epg"))
+(defvar epg-user-id-alist)
+(defvar password-cache-expiry)
 
-(eval-when-compile
-  (defvar epg-user-id-alist)
+(eval-and-compile
+  (autoload 'epg-make-context "epg")
   (autoload 'epg-passphrase-callback-function "epg")
   (autoload 'epa-select-keys "epa")
   (autoload 'epg-list-keys "epg")
@@ -330,12 +329,6 @@ Whether the passphrase is cached at all is controlled by
   (autoload 'epg-configuration "epg-config")
   (autoload 'epg-expand-group "epg-config"))
 
-(eval-when-compile
-  (defvar password-cache-expiry)
-  (autoload 'password-read "password")
-  (autoload 'password-cache-add "password")
-  (autoload 'password-cache-remove "password"))
-
 (defvar mml1991-epg-secret-key-id-list nil)
 
 (defun mml1991-epg-passphrase-callback (context key-id ignore)
index 1760e4615ce1e968dcdb9f1ffb334e9d151cc20d..28d1929399e2f02a71a1c2e4aa5a962e418ddb98 100644 (file)
@@ -173,9 +173,8 @@ Whether the passphrase is cached at all is controlled by
   (autoload 'mc-cleanup-recipient-headers "mc-toplev")
   (autoload 'mc-sign-generic "mc-toplev"))
 
-(eval-when-compile
-  (defvar mc-default-scheme)
-  (defvar mc-schemes))
+(defvar mc-default-scheme)
+(defvar mc-schemes)
 
 (defvar mml2015-decrypt-function 'mailcrypt-decrypt)
 (defvar mml2015-verify-function 'mailcrypt-verify)
@@ -707,10 +706,9 @@ Whether the passphrase is cached at all is controlled by
 
 ;;; pgg wrapper
 
-(eval-when-compile
-  (defvar pgg-default-user-id)
-  (defvar pgg-errors-buffer)
-  (defvar pgg-output-buffer))
+(defvar pgg-default-user-id)
+(defvar pgg-errors-buffer)
+(defvar pgg-output-buffer)
 
 (eval-and-compile
   (autoload 'pgg-decrypt-region "pgg")
@@ -945,13 +943,12 @@ Whether the passphrase is cached at all is controlled by
 
 ;;; epg wrapper
 
-(eval-and-compile
-  (autoload 'epg-make-context "epg"))
+(defvar epg-user-id-alist)
+(defvar epg-digest-algorithm-alist)
+(defvar inhibit-redisplay)
 
-(eval-when-compile
-  (defvar epg-user-id-alist)
-  (defvar epg-digest-algorithm-alist)
-  (defvar inhibit-redisplay)
+(eval-and-compile
+  (autoload 'epg-make-context "epg")
   (autoload 'epg-context-set-armor "epg")
   (autoload 'epg-context-set-textmode "epg")
   (autoload 'epg-context-set-signers "epg")
@@ -972,11 +969,7 @@ Whether the passphrase is cached at all is controlled by
   (autoload 'epg-expand-group "epg-config")
   (autoload 'epa-select-keys "epa"))
 
-(eval-when-compile
-  (defvar password-cache-expiry)
-  (autoload 'password-read "password")
-  (autoload 'password-cache-add "password")
-  (autoload 'password-cache-remove "password"))
+(defvar password-cache-expiry)
 
 (defvar mml2015-epg-secret-key-id-list nil)
 
index 015c06438933ad6dd8eb14f7373c5447600fb4f7..3767828a7663398f0906b811422ab8dc064e85e9 100644 (file)
@@ -1085,7 +1085,7 @@ all.  This may very well take some time.")
        (unless no-active
          (nnmail-save-active nndiary-group-alist nndiary-active-file))))))
 
-(eval-when-compile (defvar files))
+(defvar files)
 (defun nndiary-generate-active-info (dir)
   ;; Update the active info for this group.
   (let* ((group (nnheader-file-to-group
index 031d2c3d0fb259cbd483dc5e90b89b1dc4d29d6a..11cb4bff55c5a6185ef9b47b8d12019787d8b598 100644 (file)
@@ -32,6 +32,9 @@
 (eval-when-compile (require 'cl))
 
 (defvar nnmail-extra-headers)
+(defvar gnus-newsgroup-name)
+(defvar nnheader-file-coding-system)
+(defvar jka-compr-compression-info-list)
 
 ;; Requiring `gnus-util' at compile time creates a circular
 ;; dependency between nnheader.el and gnus-util.el.
@@ -696,7 +699,6 @@ the line could be found."
     (erase-buffer))
   (current-buffer))
 
-(eval-when-compile (defvar jka-compr-compression-info-list))
 (defvar nnheader-numerical-files
   (if (boundp 'jka-compr-compression-info-list)
       (concat "\\([0-9]+\\)\\("
@@ -939,9 +941,8 @@ first.  Otherwise, find the newest one, though it may take a time."
        (car results)
       (car (sort results 'file-newer-than-file-p)))))
 
-(eval-when-compile
-  (defvar ange-ftp-path-format)
-  (defvar efs-path-regexp))
+(defvar ange-ftp-path-format)
+(defvar efs-path-regexp)
 (defun nnheader-re-read-dir (path)
   "Re-read directory PATH if PATH is on a remote system."
   (if (and (fboundp 'efs-re-read-dir) (boundp 'efs-path-regexp))
index 28938e4c0a67db5f910dc0e1266b93d5ff0c58ff..9b0fab70469aea00c038002da2afd7e9079f4986 100644 (file)
@@ -208,7 +208,7 @@ This is generally not required, and will slow things down considerably.
 You may need it if you want to use an advanced splitting function that
 analyzes the body before splitting the article.
 If this variable is nil, bodies will not be downloaded; if this
-variable is the symbol `default' the default behaviour is
+variable is the symbol `default' the default behavior is
 used (which currently is nil, unless you use a statistical
 spam.el test); if this variable is another non-nil value bodies
 will be downloaded."
index 78e35c410bb6ef33759f150932521169fe3a4bb4..06acca8c09dd6b349c168e68c4f365ef87cdaedc 100644 (file)
   "\"Usage: emacs -batch -l nnkiboze -f nnkiboze-generate-groups\".
 Finds out what articles are to be part of the nnkiboze groups."
   (interactive)
-  (let ((nnmail-spool-file nil)
-       (mail-sources nil)
+  (let ((mail-sources nil)
        (gnus-use-dribble-file nil)
        (gnus-read-active-file t)
        (gnus-expert-user t))
index 7608660f019984688d64df5a94b2c93ec293744e..e05c286b1abbd05553a0119082b8d9e6750c8d29 100644 (file)
@@ -240,16 +240,11 @@ If non-nil, also update the cache when copy or move articles."
   :group 'nnmail
   :type 'boolean)
 
-(defcustom nnmail-spool-file '((file))
-  "*Where the mail backends will look for incoming mail.
-This variable is a list of mail source specifiers.
-This variable is obsolete; `mail-sources' should be used instead."
-  :group 'nnmail-files
-  :type 'sexp)
 (make-obsolete-variable 'nnmail-spool-file
                        "This option is obsolete in Gnus 5.9.  \
 Use `mail-sources' instead.")
 ;; revision 5.29 / p0-85 / Gnus 5.9
+;; Variable removed in No Gnus v0.7
 
 (defcustom nnmail-resplit-incoming nil
   "*If non-nil, re-split incoming procmail sorted mail."
@@ -693,7 +688,7 @@ nn*-request-list should have been called before calling this function."
              (setq group (symbol-name group)))
            (if (and (numberp (setq max (read buffer)))
                     (numberp (setq min (read buffer))))
-               (push (list group (cons min max))
+               (push (list (mm-string-as-unibyte group) (cons min max))
                      group-assoc)))
        (error nil))
       (widen)
@@ -708,6 +703,7 @@ nn*-request-list should have been called before calling this function."
   (let ((coding-system-for-write nnmail-active-file-coding-system))
     (when file-name
       (with-temp-file file-name
+       (mm-disable-multibyte)
        (nnmail-generate-active group-assoc)))))
 
 (defun nnmail-generate-active (alist)
@@ -1764,10 +1760,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
 (defun nnmail-get-new-mail (method exit-func temp
                                   &optional group spool-func)
   "Read new incoming mail."
-  (let* ((sources (or mail-sources
-                     (if (listp nnmail-spool-file)
-                         nnmail-spool-file
-                       (list nnmail-spool-file))))
+  (let* ((sources mail-sources)
         fetching-sources
         (group-in group)
         (i 0)
@@ -1777,20 +1770,6 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
     (when (and (nnmail-get-value "%s-get-new-mail" method)
               sources)
       (while (setq source (pop sources))
-       ;; Be compatible with old values.
-       (cond
-        ((stringp source)
-         (setq source
-               (cond
-                ((string-match "^po:" source)
-                 (list 'pop :user (substring source (match-end 0))))
-                ((file-directory-p source)
-                 (list 'directory :path source))
-                (t
-                 (list 'file :path source)))))
-        ((eq source 'procmail)
-         (message "Invalid value for nnmail-spool-file: `procmail'")
-         nil))
        ;; Hack to only fetch the contents of a single group's spool file.
        (when (and (eq (car source) 'directory)
                   (null nnmail-scan-directory-mail-source-once)
index 04b6af72aedf44e9b8461b79835f449af4dfd7dc..e7674168484360301c91722b39af8ab2f0bba655 100644 (file)
@@ -1,5 +1,6 @@
 ;;; nnmaildir.el --- maildir backend for Gnus
-;; Public domain.
+
+;; This file is in the public domain.
 
 ;; Author: Paul Jarc <prj@po.cwru.edu>
 
index 0f1591810263304e87c7bf5c7da1b5ed4fdd8599..8a5afbe5b60784ae1cbbe01f58b190785334c63a 100644 (file)
@@ -258,7 +258,8 @@ non-nil.")
            (string-to-number (file-name-nondirectory path)))))))
 
 (deffoo nnml-request-group (group &optional server dont-check)
-  (let ((file-name-coding-system nnmail-pathname-coding-system))
+  (let ((file-name-coding-system nnmail-pathname-coding-system)
+       (decoded (nnml-decoded-group-name group server)))
     (cond
      ((not (nnml-possibly-change-directory group server))
       (nnheader-report 'nnml "Invalid group (no such directory)"))
@@ -268,15 +269,15 @@ non-nil.")
      ((not (file-directory-p nnml-current-directory))
       (nnheader-report 'nnml "%s is not a directory" nnml-current-directory))
      (dont-check
-      (nnheader-report 'nnml "Group %s selected" group)
+      (nnheader-report 'nnml "Group %s selected" decoded)
       t)
      (t
       (nnheader-re-read-dir nnml-current-directory)
       (nnmail-activate 'nnml)
       (let ((active (nth 1 (assoc group nnml-group-alist))))
        (if (not active)
-           (nnheader-report 'nnml "No such group: %s" group)
-         (nnheader-report 'nnml "Selected group %s" group)
+           (nnheader-report 'nnml "No such group: %s" decoded)
+         (nnheader-report 'nnml "Selected group %s" decoded)
          (nnheader-insert "211 %d %d %d %s\n"
                           (max (1+ (- (cdr active) (car active))) 0)
                           (car active) (cdr active) group)))))))
@@ -885,7 +886,7 @@ Unless no-active is non-nil, update the active file too."
          (unless no-active
            (nnmail-save-active nnml-group-alist nnml-active-file)))))))
 
-(eval-when-compile (defvar files))
+(defvar files)
 (defun nnml-generate-active-info (dir)
   ;; Update the active info for this group.
   (let ((group (directory-file-name dir))
index 926553365d39438d8d887ca4252619feeafe2964..5c5e3c1af91367bf0e6f0aafee23396eea810621 100644 (file)
@@ -1,8 +1,11 @@
 ;;; nnnil.el --- empty backend for Gnus
-;; Public domain.
+
+;; This file is in the public domain.
 
 ;; Author: Paul Jarc <prj@po.cwru.edu>
 
+;; 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, or (at your option)
index 5241f9d80e6407cb9f3d9170e680feb27659b66b..f72166b0455407b0bff24bf0a8d4c7b561a4037f 100644 (file)
@@ -195,9 +195,8 @@ used to render text.  If it is nil, text will simply be folded.")
 (deffoo nnrss-close-group (group &optional server)
   t)
 
-(eval-when-compile
-  (defvar mm-text-html-renderer)
-  (defvar mm-text-html-washer-alist))
+(defvar mm-text-html-renderer)
+(defvar mm-text-html-washer-alist)
 
 (deffoo nnrss-request-article (article &optional group server buffer)
   (setq group (nnrss-decode-group-name group))
index c8c14da4df77c74f0392236f990418b97075030e..356ffefddeb4e9e74d61eb4d74b22b25713cd971 100644 (file)
@@ -364,6 +364,32 @@ be restored and the command retried."
 
   (throw 'nntp-with-open-group-error t))
 
+(defmacro nntp-insert-buffer-substring (buffer &optional start end)
+  "Copy string from unibyte buffer to multibyte current buffer."
+  (if (featurep 'xemacs)
+      `(insert-buffer-substring ,buffer ,start ,end)
+    `(if enable-multibyte-characters
+        (insert (with-current-buffer ,buffer
+                  (mm-string-to-multibyte
+                   ,(if (or start end)
+                        `(buffer-substring (or ,start (point-min))
+                                           (or ,end (point-max)))
+                      '(buffer-string)))))
+       (insert-buffer-substring ,buffer ,start ,end))))
+
+(defmacro nntp-copy-to-buffer (buffer start end)
+  "Copy string from unibyte current buffer to multibyte buffer."
+  (if (featurep 'xemacs)
+      `(copy-to-buffer ,buffer ,start ,end)
+    `(let ((string (buffer-substring ,start ,end)))
+       (with-current-buffer ,buffer
+        (erase-buffer)
+        (insert (if enable-multibyte-characters
+                    (mm-string-to-multibyte string)
+                  string))
+        (goto-char (point-min))
+        nil))))
+
 (defsubst nntp-wait-for (process wait-for buffer &optional decode discard)
   "Wait for WAIT-FOR to arrive from PROCESS."
 
@@ -409,7 +435,7 @@ be restored and the command retried."
            (save-excursion
              (set-buffer buffer)
              (goto-char (point-max))
-             (insert-buffer-substring (process-buffer process))
+             (nntp-insert-buffer-substring (process-buffer process))
              ;; Nix out "nntp reading...." message.
              (when nntp-have-messaged
                (setq nntp-have-messaged nil)
@@ -653,7 +679,7 @@ command whose response triggered the error."
                                              nntp-server-buffer))
                                    (buffer  (and process
                                                  (process-buffer process))))
-                               ;; When I an able to identify the
+                               ;; When I am able to identify the
                                ;; connection to the server AND I've
                                ;; received NO reponse for
                                ;; nntp-connection-timeout seconds.
@@ -738,7 +764,7 @@ command whose response triggered the error."
          (nnheader-fold-continuation-lines)
          ;; Remove all "\r"'s.
          (nnheader-strip-cr)
-         (copy-to-buffer nntp-server-buffer (point-min) (point-max))
+        (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max))
          'headers)))))
 
 (deffoo nntp-retrieve-groups (groups &optional server)
@@ -820,7 +846,8 @@ command whose response triggered the error."
 
            (if (not nntp-server-list-active-group)
                (progn
-                 (copy-to-buffer nntp-server-buffer (point-min) (point-max))
+                (nntp-copy-to-buffer nntp-server-buffer
+                                     (point-min) (point-max))
                  'group)
              ;; We have read active entries, so we just delete the
              ;; superfluous gunk.
@@ -828,7 +855,7 @@ command whose response triggered the error."
              (while (re-search-forward "^[.2-5]" nil t)
                (delete-region (match-beginning 0)
                               (progn (forward-line 1) (point))))
-             (copy-to-buffer nntp-server-buffer (point-min) (point-max))
+            (nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max))
              'active)))))))
 
 (deffoo nntp-retrieve-articles (articles &optional group server)
@@ -893,7 +920,7 @@ command whose response triggered the error."
           (narrow-to-region
            (setq point (goto-char (point-max)))
            (progn
-             (insert-buffer-substring buf last-point (cdr entry))
+            (nntp-insert-buffer-substring buf last-point (cdr entry))
              (point-max)))
           (setq last-point (cdr entry))
           (nntp-decode-text)
@@ -1206,7 +1233,7 @@ password contained in '~/.nntp-authinfo'."
       (format " *server %s %s %s*"
              nntp-address nntp-port-number
              (gnus-buffer-exists-p buffer))))
-    (mm-enable-multibyte)
+    (mm-disable-multibyte)
     (set (make-local-variable 'after-change-functions) nil)
     (set (make-local-variable 'nntp-process-wait-for) nil)
     (set (make-local-variable 'nntp-process-callback) nil)
@@ -1390,7 +1417,7 @@ password contained in '~/.nntp-authinfo'."
                (goto-char (point-max))
                (save-restriction
                  (narrow-to-region (point) (point))
-                 (insert-buffer-substring buf start)
+                 (nntp-insert-buffer-substring buf start)
                  (when decode
                    (nntp-decode-text))))))
          ;; report it.
@@ -1619,7 +1646,7 @@ password contained in '~/.nntp-authinfo'."
        (when in-process-buffer-p
          (set-buffer buf)
          (goto-char (point-max))
-         (insert-buffer-substring process-buffer)
+         (nntp-insert-buffer-substring process-buffer)
          (set-buffer process-buffer)
          (erase-buffer)
          (set-buffer buf))
index c8e309d8c14b26e7f38438ec1b89050ddfd19284..d152c2480ad167bcbcaf0ac9fe8527f4298d38b1 100644 (file)
@@ -36,6 +36,7 @@
 ;;; Code:
 
 (require 'mail-utils)
+(defvar parse-time-months)
 
 (defgroup pop3 nil
   "Post Office Protocol."
@@ -241,16 +242,23 @@ Returns the process associated with the connection."
                                              mailhost port)))
                (when process
                  ;; There's a load of info printed that needs deleting.
-                 (while (when (memq (process-status process) '(open run))
-                          (pop3-accept-process-output process)
-                          (goto-char (point-max))
-                          (forward-line -1)
-                          (if (looking-at "\\+OK")
-                              (progn
-                                (delete-region (point-min) (point))
-                                nil)
+                 (let ((again 't))
+                   ;; repeat until
+                   ;; - either we received the +OK line
+                   ;; - or accept-process-output timed out without getting
+                   ;;   anything
+                   (while (and again
+                               (setq again (memq (process-status process)
+                                                 '(open run))))
+                     (setq again (pop3-accept-process-output process))
+                     (goto-char (point-max))
+                     (forward-line -1)
+                     (cond ((looking-at "\\+OK")
+                            (setq again nil)
+                            (delete-region (point-min) (point)))
+                           ((not again)
                             (pop3-quit process)
-                            (error "POP SSL connexion failed"))))
+                            (error "POP SSL connexion failed")))))
                  process)))
             ((eq pop3-stream-type 'starttls)
              ;; gnutls-cli, openssl don't accept service names
@@ -327,8 +335,6 @@ Return the response string if optional second argument is non-nil."
       (forward-char)))
   (set-marker end nil))
 
-(eval-when-compile (defvar parse-time-months))
-
 ;; Copied from message-make-date.
 (defun pop3-make-date (&optional now)
   "Make a valid date header.
index 5689a70f3acbb92dbc276acbb905aa1bf90e7626..8ae34f193a168a9a59312e3506823ca9f2b346d0 100644 (file)
@@ -31,7 +31,7 @@
 ;;; Code:
 
 (require 'mm-util)
-(eval-when-compile (defvar mm-use-ultra-safe-encoding))
+(defvar mm-use-ultra-safe-encoding)
 
 ;;;###autoload
 (defun quoted-printable-decode-region (from to &optional coding-system)
index b789061853fdd2900595c455f518a85e50fcf663..aa9999a77222065ed0c8c53e33b4a54c0632c3ff 100644 (file)
@@ -30,8 +30,8 @@
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
-  (defvar message-posting-charset))
+  (require 'cl))
+(defvar message-posting-charset)
 
 (require 'qp)
 (require 'mm-util)
@@ -101,6 +101,40 @@ quoted-printable and base64 respectively.")
 (defvar rfc2047-encode-encoded-words t
   "Whether encoded words should be encoded again.")
 
+(defvar rfc2047-allow-irregular-q-encoded-words t
+  "*Whether to decode irregular Q-encoded words.")
+
+(eval-and-compile ;; Necessary to hard code them in `rfc2047-decode-region'.
+  (defconst rfc2047-encoded-word-regexp
+    "=\\?\\([^][\000-\040()<>@,\;:*\\\"/?.=]+\\)\\(?:\\*[^?]+\\)?\\?\
+\\(B\\?[+/0-9A-Za-z]*=*\
+\\|Q\\?[ ->@-~]*\
+\\)\\?="
+    "Regexp that matches encoded word."
+    ;; The patterns for the B encoding and the Q encoding, i.e. the ones
+    ;; beginning with "B" and "Q" respectively, are restricted into only
+    ;; the characters that those encodings may generally use.
+    )
+  (defconst rfc2047-encoded-word-regexp-loose
+    "=\\?\\([^][\000-\040()<>@,\;:*\\\"/?.=]+\\)\\(?:\\*[^?]+\\)?\\?\
+\\(B\\?[+/0-9A-Za-z]*=*\
+\\|Q\\?\\(?:\\?+[ -<>@-~]\\)?\\(?:[ ->@-~]+\\?+[ -<>@-~]\\)*[ ->@-~]*\\?*\
+\\)\\?="
+    "Regexp that matches encoded word allowing loose Q encoding."
+    ;; The pattern for the Q encoding, i.e. the one beginning with "Q",
+    ;; is similar to:
+    ;; "Q\\?\\(\\?+[^\n=?]\\)?\\([^\n?]+\\?+[^\n=?]\\)*[^\n?]*\\?*"
+    ;;      <--------1-------><----------2,3----------><--4--><-5->
+    ;; They mean:
+    ;; 1. After "Q?", allow "?"s that follow a character other than "=".
+    ;; 2. Allow "=" after "Q?"; it isn't regarded as the terminator.
+    ;; 3. In the middle of an encoded word, allow "?"s that follow a
+    ;;    character other than "=".
+    ;; 4. Allow any characters other than "?" in the middle of an
+    ;;    encoded word.
+    ;; 5. At the end, allow "?"s.
+    ))
+
 ;;;
 ;;; Functions for encoding RFC2047 messages
 ;;;
@@ -287,7 +321,6 @@ Should be called narrowed to the head of the message."
 
 ;; Fixme: This, and the require below may not be the Right Thing, but
 ;; should be safe just before release.  -- fx 2001-02-08
-(eval-when-compile (defvar message-posting-charset))
 
 (defun rfc2047-encodable-p ()
   "Return non-nil if any characters in current buffer need encoding in headers.
@@ -298,7 +331,7 @@ The buffer may be narrowed."
     (goto-char (point-min))
     (or (and rfc2047-encode-encoded-words
             (prog1
-                (search-forward "=?" nil t)
+                (re-search-forward rfc2047-encoded-word-regexp nil t)
               (goto-char (point-min))))
        (and charsets
             (not (equal charsets (list (car message-posting-charset))))))))
@@ -533,10 +566,19 @@ By default, the string is treated as containing addresses (see
     (rfc2047-encode-region (point-min) (point-max))
     (buffer-string)))
 
+;; From RFC 2047:
+;; 2. Syntax of encoded-words
+;;    [...]
+;;    While there is no limit to the length of a multiple-line header
+;;    field, each line of a header field that contains one or more
+;;    'encoded-word's is limited to 76 characters.
+;;
+;; In `rfc2047-encode-parameter' it is bound to nil, so don't defconst it.
 (defvar rfc2047-encode-max-chars 76
   "Maximum characters of each header line that contain encoded-words.
-If it is nil, encoded-words will not be folded.  Too small value may
-cause an error.  Don't change this for no particular reason.")
+According to RFC 2047, it is 76.  If it is nil, encoded-words
+will not be folded.  Too small value may cause an error.  You
+should not change this value.")
 
 (defun rfc2047-encode-1 (column string cs encoder start crest tail
                                &optional eword)
@@ -827,11 +869,6 @@ it, put the following line in your ~/.gnus.el file:
 ;;; Functions for decoding RFC2047 messages
 ;;;
 
-(eval-and-compile
-  (defconst rfc2047-encoded-word-regexp
-    "=\\?\\([^][\000-\040()<>@,\;:*\\\"/?.=]+\\)\\(?:\\*[^?]+\\)?\
-\\?\\(B\\|Q\\)\\?\\([!->@-~ ]*\\)\\?="))
-
 (defvar rfc2047-quote-decoded-words-containing-tspecials nil
   "If non-nil, quote decoded words containing special characters.")
 
@@ -950,10 +987,12 @@ If ADDRESS-MIME is non-nil, strip backslashes which precede characters
 other than `\"' and `\\' in quoted strings."
   (interactive "r")
   (let ((case-fold-search t)
-       (eword-regexp (eval-when-compile
-                       ;; Ignore whitespace between encoded-words.
-                       (concat "[\n\t ]*\\(" rfc2047-encoded-word-regexp
-                               "\\)")))
+       (eword-regexp
+        (if rfc2047-allow-irregular-q-encoded-words
+            (eval-when-compile
+              (concat "[\n\t ]*\\(" rfc2047-encoded-word-regexp-loose "\\)"))
+          (eval-when-compile
+            (concat "[\n\t ]*\\(" rfc2047-encoded-word-regexp "\\)"))))
        b e match words)
     (save-excursion
       (save-restriction
@@ -969,7 +1008,7 @@ other than `\"' and `\\' in quoted strings."
          (while match
            (push (list (match-string 2) ;; charset
                        (char-after (match-beginning 3)) ;; encoding
-                       (match-string 4) ;; encoded-text
+                       (substring (match-string 3) 2) ;; encoded-text
                        (match-string 1)) ;; encoded-word
                  words)
            ;; Look for the subsequent encoded-words.
index d8bd965718dd538238c682e5178c3d7b313fe539..5cf14f7eb32b6fc8b047529c52e9ea5f74eb7a50 100644 (file)
@@ -76,7 +76,8 @@
 
 ;;; Code:
 
-(require 'password)
+(or (require 'password-cache nil t)
+    (require 'password))
 (eval-when-compile
   (require 'sasl)
   (require 'starttls))
diff --git a/lisp/gnus/smime-ldap.el b/lisp/gnus/smime-ldap.el
deleted file mode 100644 (file)
index 882f9f8..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-;;; smime-ldap.el --- client interface to LDAP for Emacs
-
-;; Copyright (C) 1998, 1999, 2000, 2005 Free Software Foundation, Inc.
-
-;; Author: Oscar Figueiredo <Oscar.Figueiredo@di.epfl.ch>
-;; Maintainer: Arne J\e,Ax\e(Brgensen <arne@arnested.dk>
-;; Created: February 2005
-;; Keywords: comm
-
-;; 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, 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-
-;; This file has a slightly changed implementation of Emacs 21.3's
-;; ldap-search and ldap-search-internal from ldap.el. The changes are
-;; made to achieve compatibility with OpenLDAP v2 and to make it
-;; possible to retrieve LDAP attributes that are tagged ie ";binary".
-
-;; The file also adds a compatibility layer for Emacs and XEmacs.
-
-;;; Code:
-
-(require 'ldap)
-
-(defun smime-ldap-search (filter &optional host attributes attrsonly withdn)
-  "Perform an LDAP search.
-FILTER is the search filter in RFC1558 syntax.
-HOST is the LDAP host on which to perform the search.
-ATTRIBUTES are the specific attributes to retrieve, nil means
-retrieve all.
-ATTRSONLY, if non-nil, retrieves the attributes only, without
-the associated values.
-If WITHDN is non-nil, each entry in the result will be prepended with
-its distinguished name WITHDN.
-Additional search parameters can be specified through
-`ldap-host-parameters-alist', which see."
-  (interactive "sFilter:")
-  ;; for XEmacs
-  (if (fboundp 'ldap-search-entries)
-      (ldap-search-entries filter host attributes attrsonly)
-    ;; for Emacs 22
-    (if (>= emacs-major-version 22)
-       (cdr (ldap-search filter host attributes attrsonly))
-      ;; for Emacs 21.x
-      (or host
-         (setq host ldap-default-host)
-         (error "No LDAP host specified"))
-      (let ((host-plist (cdr (assoc host ldap-host-parameters-alist)))
-           result)
-       (setq result (smime-ldap-search-internal
-                     (append host-plist
-                             (list 'host host
-                                   'filter filter
-                                   'attributes attributes
-                                   'attrsonly attrsonly
-                                   'withdn withdn))))
-       (cdr (if ldap-ignore-attribute-codings
-                result
-              (mapcar (function
-                       (lambda (record)
-                         (mapcar 'ldap-decode-attribute record)))
-                      result)))))))
-
-(defun smime-ldap-search-internal (search-plist)
-  "Perform a search on a LDAP server.
-SEARCH-PLIST is a property list describing the search request.
-Valid keys in that list are:
-`host' is a string naming one or more (blank-separated) LDAP servers to
-to try to connect to.  Each host name may optionally be of the form HOST:PORT.
-`filter' is a filter string for the search as described in RFC 1558.
-`attributes' is a list of strings indicating which attributes to retrieve
-for each matching entry. If nil, return all available attributes.
-`attrsonly', if non-nil, indicates that only attributes are retrieved,
-not their associated values.
-`base' is the base for the search as described in RFC 1779.
-`scope' is one of the three symbols `sub', `base' or `one'.
-`binddn' is the distinguished name of the user to bind as (in RFC 1779 syntax).
-`passwd' is the password to use for simple authentication.
-`deref' is one of the symbols `never', `always', `search' or `find'.
-`timelimit' is the timeout limit for the connection in seconds.
-`sizelimit' is the maximum number of matches to return.
-`withdn' if non-nil each entry in the result will be prepended with
-its distinguished name DN.
-The function returns a list of matching entries.  Each entry is itself
-an alist of attribute/value pairs."
-  (let ((buf (get-buffer-create " *ldap-search*"))
-       (bufval (get-buffer-create " *ldap-value*"))
-       (host (or (plist-get search-plist 'host)
-                 ldap-default-host))
-       (filter (plist-get search-plist 'filter))
-       (attributes (plist-get search-plist 'attributes))
-       (attrsonly (plist-get search-plist 'attrsonly))
-       (base (or (plist-get search-plist 'base)
-                 ldap-default-base))
-       (scope (plist-get search-plist 'scope))
-       (binddn (plist-get search-plist 'binddn))
-       (passwd (plist-get search-plist 'passwd))
-       (deref (plist-get search-plist 'deref))
-       (timelimit (plist-get search-plist 'timelimit))
-       (sizelimit (plist-get search-plist 'sizelimit))
-       (withdn (plist-get search-plist 'withdn))
-       (numres 0)
-       arglist dn name value record result)
-    (if (or (null filter)
-           (equal "" filter))
-       (error "No search filter"))
-    (setq filter (cons filter attributes))
-    (save-excursion
-      (set-buffer buf)
-      (erase-buffer)
-      (if (and host
-              (not (equal "" host)))
-         (setq arglist (nconc arglist (list (format "-h%s" host)))))
-      (if (and attrsonly
-              (not (equal "" attrsonly)))
-         (setq arglist (nconc arglist (list "-A"))))
-      (if (and base
-              (not (equal "" base)))
-         (setq arglist (nconc arglist (list (format "-b%s" base)))))
-      (if (and scope
-              (not (equal "" scope)))
-         (setq arglist (nconc arglist (list (format "-s%s" scope)))))
-      (if (and binddn
-              (not (equal "" binddn)))
-         (setq arglist (nconc arglist (list (format "-D%s" binddn)))))
-      (if (and passwd
-              (not (equal "" passwd)))
-         (setq arglist (nconc arglist (list (format "-w%s" passwd)))))
-      (if (and deref
-              (not (equal "" deref)))
-         (setq arglist (nconc arglist (list (format "-a%s" deref)))))
-      (if (and timelimit
-              (not (equal "" timelimit)))
-         (setq arglist (nconc arglist (list (format "-l%s" timelimit)))))
-      (if (and sizelimit
-              (not (equal "" sizelimit)))
-         (setq arglist (nconc arglist (list (format "-z%s" sizelimit)))))
-      (eval `(call-process ldap-ldapsearch-prog
-                          nil
-                          buf
-                          nil
-                          ,@arglist
-                          "-tt"                ; Write values to temp files
-                          "-x"
-                          "-LL"
-                          ;                       ,@ldap-ldapsearch-args
-                          ,@filter))
-      (insert "\n")
-      (goto-char (point-min))
-
-      (while (re-search-forward "[\t\n\f]+ " nil t)
-       (replace-match "" nil nil))
-      (goto-char (point-min))
-
-      (if (looking-at "usage")
-         (error "Incorrect ldapsearch invocation")
-       (message "Parsing results... ")
-       (while (progn
-                (skip-chars-forward " \t\n")
-                (not (eobp)))
-         (setq dn (buffer-substring (point) (save-excursion
-                                              (end-of-line)
-                                              (point))))
-         (forward-line 1)
-         (while (looking-at (concat "^\\(\\w*\\)\\(;\\w*\\)?[=:\t ]+"
-                                    "\\(<[\t ]*file://\\)?\\(.*\\)$"))
-           (setq name (match-string 1)
-                 value (match-string 4))
-           (save-excursion
-             (set-buffer bufval)
-             (erase-buffer)
-             (insert-file-contents-literally value)
-             (delete-file value)
-             (setq value (buffer-substring (point-min) (point-max))))
-           (setq record (cons (list name value)
-                              record))
-           (forward-line 1))
-         (setq result (cons (if withdn
-                                (cons dn (nreverse record))
-                              (nreverse record)) result))
-         (setq record nil)
-         (skip-chars-forward " \t\n")
-         (message "Parsing results... %d" numres)
-         (1+ numres))
-       (message "Parsing results... done")
-       (nreverse result)))))
-
-(provide 'smime-ldap)
-
-;; arch-tag: 87e6bc44-21fc-4e9b-a89b-f55f031f78f8
-;;; smime-ldap.el ends here
index ee62fd8124b2eb841e5b1c46a0b969e1c6efa6b0..31545c16044f7842a1331bd3e2374e908db60c63 100644 (file)
 ;;; Code:
 
 (require 'dig)
-(require 'smime-ldap)
-(require 'password)
+(or (require 'password-cache nil t)
+    (require 'password))
 (eval-when-compile (require 'cl))
 
 (eval-and-compile
@@ -424,8 +424,7 @@ Any details (stdout and stderr) are left in the buffer specified by
     (insert-buffer-substring smime-details-buffer)
     nil))
 
-(eval-when-compile
-  (defvar from))
+(defvar from)
 
 (defun smime-decrypt-region (b e keyfile)
   "Decrypt S/MIME message in region between B and E with key in KEYFILE.
@@ -590,8 +589,17 @@ A string or a list of strings is returned."
 
 (defun smime-cert-by-ldap-1 (mail host)
   "Get cetificate for MAIL from the ldap server at HOST."
-  (let ((ldapresult (smime-ldap-search (concat "mail=" mail)
-                                      host '("userCertificate") nil))
+  (let ((ldapresult
+        (funcall
+         (if (or (featurep 'xemacs)
+                 ;; For Emacs >= 22 we don't need smime-ldap.el
+                 (< emacs-major-version 22))
+             (progn
+               (require 'smime-ldap)
+               'smime-ldap-search)
+           'ldap-search)
+         (concat "mail=" mail)
+         host '("userCertificate") nil))
        (retbuf (generate-new-buffer (format "*certificate for %s*" mail)))
        cert)
     (if (and (>= (length ldapresult) 1)
index d1be1816a4fd04379e35e10e64953f4544700af1..be9a822dd2f10bff4f7cc7f936fd47408053a9f6 100644 (file)
@@ -1,21 +1,21 @@
 ;;; spam-wash.el --- wash spam before analysis
 
-;; Copyright (C) 2004 Free Software Foundation, Inc.
+;; Copyright (C) 2004, 2007  Free Software Foundation, Inc.
 
 ;; Author: Andrew Cohen <cohen@andy.bu.edu>
 ;; Keywords: mail
 
 ;; This file is part of GNU Emacs.
 
-;; This is free software; you can redistribute it and/or modify it
-;; under the terms of the GNU General Public License as published by
+;; 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, or (at your option)
 ;; any later version.
 
-;; This 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.
+;; 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
index 4164d3f718b44899a4fe40d0c72e497a5334ea22..fddebb1d290f9e08a77017f971b4b436614879ae 100644 (file)
@@ -81,7 +81,7 @@
 ;;{{{ Main parameters.
 (defvar spam-backends nil
   "List of spam.el backends with all the pertinent data.
-Populated by spam-install-backend-super.")
+Populated by `spam-install-backend-super'.")
 
 (defgroup spam nil
   "Spam configuration."
@@ -91,13 +91,13 @@ Populated by spam-install-backend-super.")
 
 (defcustom spam-summary-exit-behavior 'default
   "Exit behavior at the time of summary exit.
-Note that setting the spam-use-move or spam-use-copy backends on
+Note that setting the `spam-use-move' or `spam-use-copy' backends on
 a group through group/topic parameters overrides this mechanism."
-  :type '(choice (const 'default :tag 
+  :type '(choice (const 'default :tag
                        "Move spam out of all groups.  Move ham out of spam groups.")
-                (const 'move-all :tag 
+                (const 'move-all :tag
                        "Move spam out of all groups.  Move ham out of all groups.")
-                (const 'move-none :tag 
+                (const 'move-none :tag
                        "Never move spam or ham out of any groups."))
   :group 'spam)
 
@@ -124,8 +124,7 @@ a group through group/topic parameters overrides this mechanism."
 
 (defcustom spam-split-symbolic-return-positive nil
   "Whether `spam-split' should ALWAYS work with symbols or group names.
-Do not set this if you use `spam-split' in a fancy split
-  method."
+Do not set this if you use `spam-split' in a fancy split method."
   :type 'boolean
   :group 'spam)
 
@@ -139,7 +138,7 @@ without losing it to the automatic spam-marking process."
 
 (defcustom spam-mark-ham-unread-before-move-from-spam-group nil
   "Whether ham should be marked unread before it's moved.
-The article is moved out of a spam group according to ham-process-destination.
+The article is moved out of a spam group according to `ham-process-destination'.
 This variable is an official entry in the international Longest Variable Name
 Competition."
   :type 'boolean
@@ -403,7 +402,7 @@ Only meaningful if you enable `spam-use-regex-body'."
   :group 'spam)
 
 (defcustom spam-summary-score-preferred-header nil
-  "Preferred header to use for spam-summary-score."
+  "Preferred header to use for `spam-summary-score'."
   :type '(choice :tag "Header name"
          (symbol :tag "SpamAssassin etc" X-Spam-Status)
          (symbol :tag "Bogofilter"       X-Bogosity)
@@ -621,17 +620,17 @@ order for SpamAssassin to recognize the new registered spam."
   :group 'spam-spamassassin)
 
 (defcustom spam-sa-learn-spam-switch "--spam"
-  "The switch that sa-learn uses to register spam messages"
+  "The switch that sa-learn uses to register spam messages."
   :type 'string
   :group 'spam-spamassassin)
 
 (defcustom spam-sa-learn-ham-switch "--ham"
-  "The switch that sa-learn uses to register ham messages"
+  "The switch that sa-learn uses to register ham messages."
   :type 'string
   :group 'spam-spamassassin)
 
 (defcustom spam-sa-learn-unregister-switch "--forget"
-  "The switch that sa-learn uses to unregister messages messages"
+  "The switch that sa-learn uses to unregister messages messages."
   :type 'string
   :group 'spam-spamassassin)
 
@@ -722,7 +721,7 @@ finds ham or spam.")
 ;;{{{ convenience functions
 
 (defun spam-clear-cache (symbol)
-  "Clear the spam-caches entry for a check."
+  "Clear the `spam-caches' entry for a check."
   (remhash symbol spam-caches))
 
 (defun spam-xor (a b)
@@ -730,7 +729,7 @@ finds ham or spam.")
   (and (or a b) (not (and a b))))
 
 (defun spam-set-difference (list1 list2)
-  "Return a set difference of LIST1 and LIST2.  
+  "Return a set difference of LIST1 and LIST2.
 When either list is nil, the other is returned."
   (if (and list1 list2)
       ;; we have two non-nil lists
@@ -837,15 +836,14 @@ Accepts incoming CHECK, ham registration function HRF, spam
 registration function SRF, ham unregistration function HUF, spam
 unregistration function SUF, and an indication whether the
 backend is STATISTICAL."
-
   (setq spam-backends (add-to-list 'spam-backends backend))
   (while properties
     (let ((property (pop properties))
          (value (pop properties)))
       (if (spam-backend-property-valid-p property)
          (put backend property value)
-       (gnus-error 
-        5 
+       (gnus-error
+        5
         "spam-install-backend-super got an invalid property %s"
         property)))))
 
@@ -875,7 +873,7 @@ The value nil means that the check does not yield a decision, and
 so, that further checks are needed.  The value t means that the
 message is definitely not spam, and that further spam checks
 should be inhibited.  Otherwise, a mailgroup name or the symbol
-'spam (depending on spam-split-symbolic-return) is returned where
+'spam (depending on `spam-split-symbolic-return') is returned where
 the mail should go, and further checks are also inhibited.  The
 usual mailgroup name is the value of `spam-split-group', meaning
 that the message is definitely a spam."
@@ -892,7 +890,7 @@ that the message is definitely a spam."
        (setq info (format "Backend %s has the following properties:\n"
                           backend))
        (dolist (property (spam-backend-properties))
-         (setq info (format "%s%s=%s\n" 
+         (setq info (format "%s%s=%s\n"
                             info
                             property
                             (get backend property))))
@@ -907,13 +905,13 @@ CLASSIFICATION is 'ham or 'spam."
   (if (and
        (spam-classification-valid-p classification)
        (spam-backend-function-type-valid-p type))
-      (let ((retrieval 
-            (intern 
+      (let ((retrieval
+            (intern
              (format "spam-backend-%s-%s-function"
                      classification
                      type))))
        (funcall retrieval backend))
-    (gnus-error 
+    (gnus-error
      5
      "%s was passed invalid backend %s, classification %s, or type %s"
      "spam-backend-function"
@@ -921,21 +919,21 @@ CLASSIFICATION is 'ham or 'spam."
      classification
      type)))
 
-(defun spam-backend-article-list-property (classification 
+(defun spam-backend-article-list-property (classification
                                           &optional unregister)
   "Property name of article list with CLASSIFICATION and UNREGISTER."
   (let* ((r (if unregister "unregister" "register"))
         (prop (format "%s-%s" classification r)))
     prop))
 
-(defun spam-backend-get-article-todo-list (backend 
-                                          classification 
+(defun spam-backend-get-article-todo-list (backend
+                                          classification
                                           &optional unregister)
-  "Get the articles to be processed for BACKEND and CLASSIFICATION.  
+  "Get the articles to be processed for BACKEND and CLASSIFICATION.
 With UNREGISTER, get articles to be unregistered.
 This is a temporary storage function - nothing here persists."
   (get
-   backend 
+   backend
    (intern (spam-backend-article-list-property classification unregister))))
 
 (defun spam-backend-put-article-todo-list (backend classification list &optional unregister)
@@ -977,7 +975,7 @@ The previous backend settings for ALIAS are erased."
 
   ;; install alias with no properties at first
   (spam-install-backend-super alias)
-  
+
   (dolist (property (spam-backend-properties))
     (put alias property (get backend property))))
 
@@ -991,8 +989,8 @@ Accepts ham registration function HRF, spam registration function
 SRF, ham unregistration function HUF, spam unregistration
 function SUF.  The backend has no incoming check and can't be
 statistical."
-  (spam-install-backend-super 
-   backend 
+  (spam-install-backend-super
+   backend
    'hrf hrf 'srf srf 'huf huf 'suf suf 'mover t))
 
 (defun spam-install-nocheck-backend (backend hrf srf huf suf)
@@ -1001,7 +999,7 @@ Accepts ham registration function HRF, spam registration function
 SRF, ham unregistration function HUF, spam unregistration
 function SUF.  The backend has no incoming check and can't be
 statistical (it could be, but in practice that doesn't happen)."
-  (spam-install-backend-super 
+  (spam-install-backend-super
    backend
    'hrf hrf 'srf srf 'huf huf 'suf suf))
 
@@ -1010,8 +1008,8 @@ statistical (it could be, but in practice that doesn't happen)."
 Accepts incoming CHECK, ham registration function HRF, spam
 registration function SRF, ham unregistration function HUF, spam
 unregistration function SUF.  The backend won't be
-statistical (use spam-install-statistical-backend for that)."
-  (spam-install-backend-super 
+statistical (use `spam-install-statistical-backend' for that)."
+  (spam-install-backend-super
    backend
    'check check 'hrf hrf 'srf srf 'huf huf 'suf suf))
 
@@ -1020,15 +1018,15 @@ statistical (use spam-install-statistical-backend for that)."
 Accepts incoming CHECK, ham registration function HRF, spam
 registration function SRF, ham unregistration function HUF, spam
 unregistration function SUF.  The backend will be
-statistical (use spam-install-backend for non-statistical
+statistical (use `spam-install-backend' for non-statistical
 backends)."
-  (spam-install-backend-super 
+  (spam-install-backend-super
    backend
    'check check 'statistical t 'hrf hrf 'srf srf 'huf huf 'suf suf))
 
 (defun spam-install-statistical-checkonly-backend (backend check)
   "Install a statistical BACKEND than can only CHECK for spam."
-  (spam-install-backend-super 
+  (spam-install-backend-super
    backend
    'check check 'statistical t))
 
@@ -1084,7 +1082,7 @@ backends)."
                              nil
                              nil)
 
-(spam-install-backend 'spam-use-BBDB    
+(spam-install-backend 'spam-use-BBDB
                      'spam-check-BBDB
                      'spam-BBDB-register-routine
                      nil
@@ -1128,7 +1126,7 @@ backends)."
                                  'spam-stat-unregister-ham-routine
                                  'spam-stat-unregister-spam-routine)
 
-(spam-install-statistical-backend 'spam-use-spamassassin 
+(spam-install-statistical-backend 'spam-use-spamassassin
                                  'spam-check-spamassassin
                                  'spam-spamassassin-register-ham-routine
                                  'spam-spamassassin-register-spam-routine
@@ -1224,13 +1222,13 @@ Note this has to be fast."
 With SPECIFIC-HEADER, returns only that header's score.
 Will not return a nil score."
   (let (score)
-    (dolist (header 
+    (dolist (header
             (if specific-header
                 (list specific-header)
               (spam-necessary-extra-headers)))
-      (setq score 
+      (setq score
            (spam-extra-header-to-number header headers))
-      (when score 
+      (when score
        (return)))
     (or score 0)))
 
@@ -1258,7 +1256,7 @@ Will not return a nil score."
   (let (found)
     (dolist (backend (spam-backend-list))
       (when (and (spam-backend-statistical-p backend)
-                (or (symbol-value backend) 
+                (or (symbol-value backend)
                     (memq backend force-symbols)))
        (setq found backend)))
     found))
@@ -1287,14 +1285,14 @@ This list contains pairs associating the obsolete ham/spam exit
 processor variables with a classification and a spam-use-*
 variable.  When the processor variable is nil, just the
 classification and spam-use-* check variable are used.  This is
-superceded by the new spam backend code, so it's only consulted
+superseded by the new spam backend code, so it's only consulted
 for backwards compatibility.")
 
 (defun spam-group-processor-p (group backend &optional classification)
   "Checks if GROUP has a BACKEND with CLASSIFICATION registered.
 Also accepts the obsolete processors, which can be found in
 gnus.el and in spam-list-of-processors.  In the case of mover
-backends, checks the setting of spam-summary-exit-behavior in
+backends, checks the setting of `spam-summary-exit-behavior' in
 addition to the set values for the group."
   (if (and (stringp group)
           (symbolp backend))
@@ -1315,7 +1313,7 @@ addition to the set values for the group."
          ;; spam-summary-exit-behavior-logic for mover backends
          (unless found
            (when (spam-backend-mover-p backend)
-             (setq 
+             (setq
               found
               (cond
                ((eq spam-summary-exit-behavior 'move-all) t)
@@ -1325,7 +1323,7 @@ addition to the set values for the group."
                     ;; move ham out of spam groups
                     (and (eq classification 'ham)
                          (spam-group-spam-contents-p group))))
-               (t (gnus-error 5 "Unknown spam-summary-exit-behavior: %s" 
+               (t (gnus-error 5 "Unknown spam-summary-exit-behavior: %s"
                               spam-summary-exit-behavior))))))
 
          found))
@@ -1385,8 +1383,8 @@ addition to the set values for the group."
            ;; call spam-register-routine with specific articles to unregister,
            ;; when there are articles to unregister and the check is enabled
            (when (and unregister-list (symbol-value backend))
-             (spam-backend-put-article-todo-list backend 
-                                                 classification 
+             (spam-backend-put-article-todo-list backend
+                                                 classification
                                                  unregister-list
                                                  t))))))
 
@@ -1398,7 +1396,7 @@ addition to the set values for the group."
                 gnus-newsgroup-name
                 backend
                 classification)
-           (spam-backend-put-article-todo-list backend 
+           (spam-backend-put-article-todo-list backend
                                                classification
                                                (spam-list-articles
                                                 gnus-newsgroup-articles
@@ -1457,11 +1455,11 @@ addition to the set values for the group."
                          article)
            (gnus-summary-mark-article article gnus-expirable-mark))
          (gnus-summary-set-process-mark article)
-           
+
          (if respool              ; respooling is with a "fake" group
              (let ((spam-split-disabled
                     (or spam-split-disabled
-                        (and (eq classification 'ham) 
+                        (and (eq classification 'ham)
                              spam-disable-spam-split-during-ham-respool))))
                (gnus-message 9 "Respooling article %d with method %s"
                              article respool-method)
@@ -1476,7 +1474,7 @@ addition to the set values for the group."
              (gnus-message 9 "Moving article %d to group %s"
                            article group)
              (gnus-summary-move-article nil group))))) ; else move articles
-       
+
       ;; now delete the articles, unless a) copy is t, and there was a copy done
       ;;                                 b) a move was done to a single group
       ;;                                 c) backend-supports-deletions is nil
@@ -1488,33 +1486,33 @@ addition to the set values for the group."
          (when articles
            (let ((gnus-novice-user nil)) ; don't ask me if I'm sure
              (gnus-summary-delete-article nil)))))
-       
+
       (gnus-summary-yank-process-mark)
       (length articles))))
 
 (defun spam-copy-spam-routine (articles)
-  (spam-copy-or-move-routine 
-   t 
+  (spam-copy-or-move-routine
+   t
    (gnus-parameter-spam-process-destination gnus-newsgroup-name)
    articles
    'spam))
 
 (defun spam-move-spam-routine (articles)
-  (spam-copy-or-move-routine 
+  (spam-copy-or-move-routine
    nil
    (gnus-parameter-spam-process-destination gnus-newsgroup-name)
    articles
    'spam))
 
 (defun spam-copy-ham-routine (articles)
-  (spam-copy-or-move-routine 
-   t 
+  (spam-copy-or-move-routine
+   t
    (gnus-parameter-ham-process-destination gnus-newsgroup-name)
    articles
    'ham))
 
 (defun spam-move-ham-routine (articles)
-  (spam-copy-or-move-routine 
+  (spam-copy-or-move-routine
    nil
    (gnus-parameter-ham-process-destination gnus-newsgroup-name)
    articles
@@ -1570,9 +1568,9 @@ to find it out)."
         ((equal field 'extra)
          (mail-header-extra data-header))
         (t
-         (gnus-error 
-          5 
-          "spam-fetch-field-fast: unknown field %s requested" 
+         (gnus-error
+          5
+          "spam-fetch-field-fast: unknown field %s requested"
           field)
          nil))
        (gnus-message 6 "Article %d has a nil data header" article)))))
@@ -1621,7 +1619,7 @@ to find it out)."
 This function can be used as an entry in the variable `nnmail-split-fancy',
 for example like this: (: spam-split).  It can take checks as
 parameters.  A string as a parameter will set the
-spam-split-group to that string.
+`spam-split-group' to that string.
 
 See the Info node `(gnus)Fancy Mail Splitting' for more details."
   (interactive)
@@ -1673,7 +1671,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
                decision))))))))
 
 (defun spam-find-spam ()
-  "This function will detect spam in the current newsgroup using spam-split."
+  "Detect spam in the current newsgroup using `spam-split'."
   (interactive)
 
   (let* ((group gnus-newsgroup-name)
@@ -1685,7 +1683,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
                     gnus-newsgroup-unseen))
         article-cannot-be-faked)
 
-    
+
     (dolist (backend methods)
       (when (spam-backend-statistical-p backend)
        (setq article-cannot-be-faked t)
@@ -1702,10 +1700,10 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
               (subject (spam-fetch-field-subject-fast article))
               (sender (spam-fetch-field-from-fast article))
               registry-lookup)
-          
+
           (unless id
             (gnus-message 6 "Article %d has no message ID!" article))
-        
+
           (when (and id spam-log-to-registry)
             (setq registry-lookup (spam-log-registration-type id 'incoming))
             (when registry-lookup
@@ -1732,12 +1730,12 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
                           (apply 'spam-split methods))))))
             (if (equal split-return 'spam)
                 (gnus-summary-mark-article article gnus-spam-mark))
-          
+
             (when (and id split-return spam-log-to-registry)
               (when (zerop (gnus-registry-group-count id))
                 (gnus-registry-add-group
                  id group subject sender))
-              
+
               (unless registry-lookup
                 (spam-log-processing-to-registry
                  id
@@ -1763,11 +1761,11 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
              (delcount 0))
 
          ;; clear the old lists right away
-         (spam-backend-put-article-todo-list backend 
+         (spam-backend-put-article-todo-list backend
                                              classification
                                              nil
                                              nil)
-         (spam-backend-put-article-todo-list backend 
+         (spam-backend-put-article-todo-list backend
                                              classification
                                              nil
                                              t)
@@ -1778,29 +1776,29 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
              (incf delcount)
              (setq rlist (delq article rlist))
              (setq ulist (delq article ulist))))
-         
+
          (unless (zerop delcount)
-           (gnus-message 
-            9 
+           (gnus-message
+            9
             "%d messages were saved the trouble of unregistering and then registering"
             delcount))
-         
+
          ;; unregister articles
          (unless (zerop (length ulist))
            (let ((num (spam-unregister-routine classification backend ulist)))
              (when (> num 0)
-               (gnus-message 
+               (gnus-message
                 6
                 "%d %s messages were unregistered by backend %s."
                 num
                 classification
                 backend))))
-           
+
            ;; register articles
            (unless (zerop (length rlist))
              (let ((num (spam-register-routine classification backend rlist)))
                (when (> num 0)
-                 (gnus-message 
+                 (gnus-message
                   6
                   "%d %s messages were registered by backend %s."
                   num
@@ -1808,12 +1806,12 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
                   backend)))))))))
 
 (defun spam-unregister-routine (classification
-                               backend 
+                               backend
                                specific-articles)
   (spam-register-routine classification backend specific-articles t))
 
 (defun spam-register-routine (classification
-                             backend 
+                             backend
                              specific-articles
                              &optional unregister)
   (when (and (spam-classification-valid-p classification)
@@ -2134,7 +2132,7 @@ See the Info node `(gnus)Fancy Mail Splitting' for more details."
              (save-excursion
                (save-window-excursion
                  (bbdb-records nil t)
-                 (mapatoms 
+                 (mapatoms
                   (lambda (symbol)
                     (intern (downcase (symbol-name symbol)) bbdb-cache))
                   bbdb-hashtable))))
@@ -2311,8 +2309,8 @@ With a non-nil REMOVE, remove them."
 
 (defun spam-enter-list (addresses file &optional remove)
   "Enter ADDRESSES into the given FILE.
-Either the whitelist or the blacklist files can be used.  With
-REMOVE not nil, remove the ADDRESSES."
+Either the whitelist or the blacklist files can be used.
+With a non-nil REMOVE, remove the ADDRESSES."
   (if (stringp addresses)
       (spam-enter-list (list addresses) file remove)
     ;; else, we have a list of addresses here
@@ -2467,7 +2465,7 @@ REMOVE not nil, remove the ADDRESSES."
   (spam-report-resend-register-routine articles t))
 
 (defun spam-report-resend-register-routine (articles &optional ham)
-  (let* ((resend-to-gp 
+  (let* ((resend-to-gp
          (if ham
              (gnus-parameter-ham-resend-to gnus-newsgroup-name)
            (gnus-parameter-spam-resend-to gnus-newsgroup-name)))
@@ -2492,7 +2490,7 @@ REMOVE not nil, remove the ADDRESSES."
 
 ;; return something sensible if the score can't be determined
 (defun spam-bogofilter-score (&optional recheck)
-  "Get the Bogofilter spamicity score"
+  "Get the Bogofilter spamicity score."
   (interactive "P")
   (save-window-excursion
     (gnus-summary-show-article t)
@@ -2509,10 +2507,10 @@ REMOVE not nil, remove the ADDRESSES."
   (when (eq spam-bogofilter-valid 'unknown)
     (setq spam-bogofilter-valid
          (not (string-match "^bogofilter version 0\\.\\([0-9]\\|1[01]\\)\\."
-                            (shell-command-to-string 
+                            (shell-command-to-string
                              (format "%s -V" spam-bogofilter-program))))))
   spam-bogofilter-valid)
-  
+
 (defun spam-check-bogofilter (&optional score)
   "Check the Bogofilter backend for the classification of this message."
   (if (spam-verify-bogofilter)
@@ -2550,7 +2548,7 @@ REMOVE not nil, remove the ADDRESSES."
          (when (stringp article-string)
            (with-temp-buffer
              (insert article-string)
-             
+
              (apply 'call-process-region
                     (point-min) (point-max)
                     spam-bogofilter-program
@@ -2736,7 +2734,7 @@ REMOVE not nil, remove the ADDRESSES."
 
 ;; return something sensible if the score can't be determined
 (defun spam-bsfilter-score (&optional recheck)
-  "Get the Bsfilter spamicity score"
+  "Get the Bsfilter spamicity score."
   (interactive "P")
   (save-window-excursion
     (gnus-summary-show-article t)
@@ -2749,7 +2747,7 @@ REMOVE not nil, remove the ADDRESSES."
       (or score "0"))))
 
 (defun spam-check-bsfilter (&optional score)
-  "Check the Bsfilter backend for the classification of this message"
+  "Check the Bsfilter backend for the classification of this message."
   (let ((article-buffer-name (buffer-name))
        (dir spam-bsfilter-database-directory)
        return)
@@ -2823,7 +2821,7 @@ REMOVE not nil, remove the ADDRESSES."
 
 ;; return something sensible if the score can't be determined
 (defun spam-crm114-score ()
-  "Get the CRM114 Mailfilter pR"
+  "Get the CRM114 Mailfilter pR."
   (interactive)
   (save-window-excursion
     (gnus-summary-show-article t)
@@ -2835,7 +2833,7 @@ REMOVE not nil, remove the ADDRESSES."
       (or score "0"))))
 
 (defun spam-check-crm114 (&optional score)
-  "Check the CRM114 Mailfilter backend for the classification of this message"
+  "Check the CRM114 Mailfilter backend for the classification of this message."
   (let ((article-buffer-name (buffer-name))
        (db spam-crm114-database-directory)
        return)
@@ -2897,9 +2895,9 @@ REMOVE not nil, remove the ADDRESSES."
 (defun spam-initialize (&rest symbols)
   "Install the spam.el hooks and do other initialization.
 When SYMBOLS is given, set those variables to t.  This is so you
-can call spam-initialize before you set spam-use-* variables on
+can call `spam-initialize' before you set spam-use-* variables on
 explicitly, and matters only if you need the extra headers
-installed through spam-necessary-extra-headers."
+installed through `spam-necessary-extra-headers'."
   (interactive)
 
   (dolist (var symbols)
@@ -2923,7 +2921,7 @@ installed through spam-necessary-extra-headers."
   (add-hook 'gnus-summary-prepared-hook 'spam-find-spam))
 
 (defun spam-unload-hook ()
-  "Uninstall the spam.el hooks"
+  "Uninstall the spam.el hooks."
   (interactive)
   (remove-hook 'gnus-save-newsrc-hook 'spam-maybe-spam-stat-save)
   (remove-hook 'gnus-get-top-new-news-hook 'spam-maybe-spam-stat-load)
index dbe749cad690fbffa286fb5beee5a6ae62743565..deba6d131e4c5aaf35a6a6cc117cfabc15c0c226 100644 (file)
@@ -209,20 +209,26 @@ Characters are in raw byte pairs in narrowed buffer."
 
 (defun utf7-encode (string &optional for-imap)
   "Encode UTF-7 STRING.  Use IMAP modification if FOR-IMAP is non-nil."
-  (let ((default-enable-multibyte-characters t))
-    (with-temp-buffer
-      (insert string)
-      (utf7-encode-internal for-imap)
-      (buffer-string))))
+  (if (and (coding-system-p 'utf-7) (coding-system-p 'utf-7-imap))
+      ;; Emacs 23 with proper support for IMAP
+      (encode-coding-string string (if for-imap 'utf-7-imap 'utf-7))
+    (let ((default-enable-multibyte-characters t))
+      (with-temp-buffer
+       (insert string)
+       (utf7-encode-internal for-imap)
+       (buffer-string)))))
 
 (defun utf7-decode (string &optional for-imap)
   "Decode UTF-7 STRING.  Use IMAP modification if FOR-IMAP is non-nil."
-  (let ((default-enable-multibyte-characters nil))
-    (with-temp-buffer
-      (insert string)
-      (utf7-decode-internal for-imap)
-      (mm-enable-multibyte)
-      (buffer-string))))
+  (if (and (coding-system-p 'utf-7) (coding-system-p 'utf-7-imap))
+      ;; Emacs 23 with proper support for IMAP
+      (decode-coding-string string (if for-imap 'utf-7-imap 'utf-7))
+    (let ((default-enable-multibyte-characters nil))
+      (with-temp-buffer
+       (insert string)
+       (utf7-decode-internal for-imap)
+       (mm-enable-multibyte)
+       (buffer-string)))))
 
 (provide 'utf7)
 
index 7550186b35e50cf0100723e804b3f1a4f4116a8d..7843f6a9aa06ba53288d60bda457a5cf53ebc4b3 100644 (file)
        191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
        208 209 210 211 212 213])
 
+(defun yenc-first-part-p ()
+  "Say whether the buffer contains the first part of a yEnc file."
+  (save-excursion
+    (goto-char (point-min))
+    (re-search-forward "^=ybegin part=1 " nil t)))
+
+(defun yenc-last-part-p ()
+  "Say whether the buffer contains the last part of a yEnc file."
+  (save-excursion
+    (goto-char (point-min))
+    (let (total-size end-size)
+      (when (re-search-forward "^=ybegin.*size=\\([0-9]+\\)" nil t)
+       (setq total-size (match-string 1)))
+      (when (re-search-forward "^=ypart.*end=\\([0-9]+\\)" nil t)
+       (setq end-size (match-string 1)))
+      (and total-size
+          end-size
+          (string= total-size end-size)))))
+
 ;;;###autoload
 (defun yenc-decode-region (start end)
   "Yenc decode region between START and END using an internal decoder."
index 2bfd417656765c222948d6e792f0db2146c4d8ea..5aa8860ae9d25fe6e3f50a110e843f16acfb2b85 100644 (file)
@@ -248,6 +248,8 @@ face (according to `face-differs-from-default-p')."
        src-file
       file-name)))
 
+(declare-function ad-get-advice-info "advice" (function))
+
 ;;;###autoload
 (defun describe-function-1 (function)
   (let* ((advised (and (featurep 'advice) (ad-get-advice-info function)))
index ac6af2d9e508fad35c6cf500ff1e0012f9644438..c6650e1cf21c1ca48844436b260b9c74f269933f 100644 (file)
@@ -1029,7 +1029,7 @@ scroll the \"other\" window."
           ".")
          (other ", \\[scroll-other-window] to scroll help.")
          (t ", \\[scroll-up] to scroll help."))))
-    (message
+    (message "%s"
      (substitute-command-keys (concat quit-part scroll-part)))))
 
 (defun help-window-setup-finish (window &optional reuse keep-frame)
similarity index 80%
rename from lisp/gnus/hex-util.el
rename to lisp/hex-util.el
index 981516e4b2abad0f7de4ed4fb3d0e6b63ffdaf89..3a1df2041275310723d41829bf1cdd93d369bd3d 100644 (file)
@@ -6,21 +6,21 @@
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
 ;; Keywords: data
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or
-;; (at your option) any later version.
+;; 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, or (at your option)
+;; any later version.
 
-;; This program is distributed in the hope that it will be useful,
+;; 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 this program; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
index 80133d227abe674fc31ff722e2746d5e97c46caf..b09a3e26979a7b6f66df01c97636a7f3494f86fc 100644 (file)
 (defvar ibuffer-tmp-hide-regexps)
 (defvar ibuffer-tmp-show-regexps)
 
+(declare-function ibuffer-mark-on-buffer "ibuf-ext" 
+                 (func &optional ibuffer-mark-on-buffer-mark group))
+(declare-function ibuffer-format-qualifier "ibuf-ext" (qualifier))
+(declare-function ibuffer-generate-filter-groups "ibuf-ext" 
+                 (bmarklist &optional noempty nodefault))
+(declare-function ibuffer-format-filter-group-data "ibuf-ext" (filter))
+
 (defgroup ibuffer nil
   "An advanced replacement for `buffer-menu'.
 
index 0a077f9dab69ee938adc3ad882a92d243660ab68..4658a8877168a406864b0aea0474a792c08365c7 100644 (file)
@@ -1309,6 +1309,7 @@ Value is an integer which is number of chars to right of prompt.")
       (unwind-protect
          (with-current-buffer buf
            (erase-buffer)
+           (insert ";;; -*- coding: utf-8 -*-\n")
            (setq buffer-file-coding-system 'utf-8)
            (ido-pp 'ido-last-directory-list)
            (ido-pp 'ido-work-directory-list)
@@ -1317,7 +1318,7 @@ Value is an integer which is number of chars to right of prompt.")
            (if (listp ido-unc-hosts-cache)
                (ido-pp 'ido-unc-hosts-cache)
              (insert "\n;; ----- ido-unc-hosts-cache -----\nt\n"))
-           (insert "\n;; Local Variables:\n;; coding: utf-8\n;; End:\n")
+           (insert "\n")
            (write-file ido-save-directory-list-file nil))
        (kill-buffer buf)))))
 
@@ -2281,9 +2282,10 @@ If cursor is not at the end of the user input, move to end of input."
                filename t))
 
         ((and ido-use-filename-at-point
-              (setq fn (if (eq ido-use-filename-at-point 'guess)
-                           (with-no-warnings (ffap-guesser))
-                         (ffap-string-at-point)))
+              (setq fn (with-no-warnings
+                         (if (eq ido-use-filename-at-point 'guess)
+                             (ffap-guesser)
+                           (ffap-string-at-point))))
               (not (string-match "^http:/" fn))
               (setq d (file-name-directory fn))
               (file-directory-p d))
@@ -3363,6 +3365,8 @@ for first matching file."
       (nconc ido-temp-list items)
     (setq ido-temp-list items)))
 
+(declare-function tramp-tramp-file-p "tramp" (name))
+
 (defun ido-file-name-all-completions-1 (dir)
   (cond
    ((ido-nonreadable-directory-p dir) '())
@@ -3370,24 +3374,25 @@ for first matching file."
    ;; Caller must have done that if necessary.
 
    ((and ido-enable-tramp-completion
-        (or (fboundp 'tramp-completion-mode)
+        (or (fboundp 'tramp-completion-mode-p)
             (require 'tramp nil t))
         (string-match "\\`/[^/]+[:@]\\'" dir))
     ;; Strip method:user@host: part of tramp completions.
     ;; Tramp completions do not include leading slash.
-    (let ((len (1- (length dir)))
-         (compl
-          (or (file-name-all-completions "" dir)
-              ;; work around bug in ange-ftp.
-              ;; /ftp:user@host: => nil
-              ;; /ftp:user@host:./ => ok
-              (and
-               (not (string= "/ftp:" dir))
-               (tramp-tramp-file-p dir)
-               (fboundp 'tramp-ftp-file-name-p)
-               (funcall 'tramp-ftp-file-name-p dir)
-               (string-match ":\\'" dir)
-               (file-name-all-completions "" (concat dir "./"))))))
+    (let* ((len (1- (length dir)))
+          (tramp-completion-mode t)
+          (compl
+           (or (file-name-all-completions "" dir)
+               ;; work around bug in ange-ftp.
+               ;; /ftp:user@host: => nil
+               ;; /ftp:user@host:./ => ok
+               (and
+                (not (string= "/ftp:" dir))
+                (tramp-tramp-file-p dir)
+                (fboundp 'tramp-ftp-file-name-p)
+                (funcall 'tramp-ftp-file-name-p dir)
+                (string-match ":\\'" dir)
+                (file-name-all-completions "" (concat dir "./"))))))
       (if (and compl
               (> (length (car compl)) len)
               (string= (substring (car compl) 0 len) (substring dir 1)))
index 82bfbfb20af9f0d893b2ec06257b6550ddb86496..cca9686f237b107a844781fb0705f14d973a3073 100644 (file)
@@ -1184,7 +1184,7 @@ comment."
                     ", "))
             (comment (get-text-property (point) 'comment)))
         (if file-name
-            (message
+             (message "%s"
              (image-dired-format-properties-string
               dired-buf
               file-name
@@ -1208,7 +1208,7 @@ dired."
     (if (not (and dired-buf file-name))
         (message "No image, or image with correct properties, at point.")
     (with-current-buffer dired-buf
-        (message file-name)
+        (message "%s" file-name)
         (setq file-name (file-name-nondirectory file-name))
         (goto-char (point-min))
         (if (search-forward file-name nil t)
@@ -2239,7 +2239,7 @@ non-nil."
                  ", "))
          (comment (image-dired-get-comment file)))
     (if file-name
-        (message
+        (message "%s"
          (image-dired-format-properties-string
           dired-buf
           file-name
index 18a459ba0fedeecc6a727b944aec883791877678..05be680bfa85571ee0c93106a5c3a57aa7831ae6 100644 (file)
@@ -32,6 +32,8 @@
 
 (require 'info)
 
+(declare-function texinfo-format-refill "texinfmt" ())
+
 ;;;###autoload
 (defun Info-tagify (&optional input-buffer-name)
   "Create or update Info file tag table in current buffer or in a region."
index d7149b8a9bc073352806bafc3aed8367abaaaefd..f2725e9d854e8e2c082b4b830116da06b7440039 100644 (file)
@@ -65,7 +65,7 @@
   "Spanish translation table.")
 
 (defun iso-translate-conventions (from to trans-tab)
-  "Use the translation table TRANS-TAB to translate the current buffer."
+  "Translate between FROM and TO using the translation table TRANS-TAB."
   (save-excursion
     (save-restriction
       (narrow-to-region from to)
@@ -84,8 +84,8 @@
 ;;;###autoload
 (defun iso-spanish (from to &optional buffer)
   "Translate net conventions for Spanish to ISO 8859-1.
-The region between FROM and TO is translated using
-the table `iso-spanish-trans-tab'.
+Translate the region between FROM and TO using the table
+`iso-spanish-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
   (interactive "*r")
   (iso-translate-conventions from to iso-spanish-trans-tab))
@@ -102,8 +102,8 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
     ("\\\\3" "ß")
     )
   "German translation table.
-This table uses an aggressive translation approach and may erroneously
-translate too much.")
+This table uses an aggressive translation approach
+and may erroneously translate too much.")
 
 (defvar iso-conservative-german-trans-tab
   '(
@@ -117,8 +117,8 @@ translate too much.")
     ("\\([-a-zA-Z\"`]\\)\\\\3" "\\1ß")
     )
   "German translation table.
-This table uses a conservative translation approach and may translate too
-little.")
+This table uses a conservative translation approach
+and may translate too little.")
 
 (defvar iso-german-trans-tab iso-aggressive-german-trans-tab
   "Currently active translation table for German.")
@@ -126,8 +126,8 @@ little.")
 ;;;###autoload
 (defun iso-german (from to &optional buffer)
  "Translate net conventions for German to ISO 8859-1.
-The region between FROM and TO is translated using
-the table `iso-german-trans-tab'.
+Translate the region FROM and TO using the table
+`iso-german-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-german-trans-tab))
@@ -199,8 +199,8 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
 ;;;###autoload
 (defun iso-iso2tex (from to &optional buffer)
  "Translate ISO 8859-1 characters to TeX sequences.
-The region between FROM and TO is translated using
-the table `iso-iso2tex-trans-tab'.
+Translate the region between FROM and TO using the table
+`iso-iso2tex-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-iso2tex-trans-tab))
@@ -386,14 +386,14 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
     ("!`" "¡")
     )
   "Translation table for translating TeX sequences to ISO 8859-1 characters.
-This table is not exhaustive (and due to TeX's power can never be).  It only
-contains commonly used sequences.")
+This table is not exhaustive (and due to TeX's power can never be).
+It only contains commonly used sequences.")
 
 ;;;###autoload
 (defun iso-tex2iso (from to &optional buffer)
  "Translate TeX sequences to ISO 8859-1 characters.
-The region between FROM and TO is translated using
-the table `iso-tex2iso-trans-tab'.
+Translate the region between FROM and TO using the table
+`iso-tex2iso-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-tex2iso-trans-tab))
@@ -581,8 +581,8 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
     ("\\\\3" "ß")
     )
   "Translation table for translating German TeX sequences to ISO 8859-1.
-This table is not exhaustive (and due to TeX's power can never be).  It only
-contains commonly used sequences.")
+This table is not exhaustive (and due to TeX's power can never be).
+It only contains commonly used sequences.")
 
 (defvar iso-iso2gtex-trans-tab
   '(
@@ -651,8 +651,8 @@ contains commonly used sequences.")
 ;;;###autoload
 (defun iso-gtex2iso (from to &optional buffer)
  "Translate German TeX sequences to ISO 8859-1 characters.
-The region between FROM and TO is translated using
-the table `iso-gtex2iso-trans-tab'.
+Translate the region between FROM and TO using the table
+`iso-gtex2iso-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-gtex2iso-trans-tab))
@@ -660,8 +660,8 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
 ;;;###autoload
 (defun iso-iso2gtex (from to &optional buffer)
  "Translate ISO 8859-1 characters to German TeX sequences.
-The region between FROM and TO is translated using
-the table `iso-iso2gtex-trans-tab'.
+Translate the region between FROM and TO using the table
+`iso-iso2gtex-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-iso2gtex-trans-tab))
@@ -679,8 +679,8 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
 ;;;###autoload
 (defun iso-iso2duden (from to &optional buffer)
  "Translate ISO 8859-1 characters to Duden sequences.
-The region between FROM and TO is translated using
-the table `iso-iso2duden-trans-tab'.
+Translate the region between FROM and TO using the table
+`iso-iso2duden-trans-tab'.
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-iso2duden-trans-tab))
@@ -817,7 +817,7 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
 ;;;###autoload
 (defun iso-iso2sgml (from to &optional buffer)
  "Translate ISO 8859-1 characters in the region to SGML entities.
-The entities used are from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
+Use entities from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-iso2sgml-trans-tab))
@@ -825,7 +825,7 @@ Optional arg BUFFER is ignored (for use in `format-alist')."
 ;;;###autoload
 (defun iso-sgml2iso (from to &optional buffer)
  "Translate SGML entities in the region to ISO 8859-1 characters.
-The entities used are from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
+Use entities from \"ISO 8879:1986//ENTITIES Added Latin 1//EN\".
 Optional arg BUFFER is ignored (for use in `format-alist')."
  (interactive "*r")
  (iso-translate-conventions from to iso-sgml2iso-trans-tab))
index 164c3d7ca9902920982d42b0a0545c379a1596e8..111c45dd50a6357b667d8ce0a576009ca676805a 100644 (file)
@@ -1459,6 +1459,9 @@ To deactivate it programmatically, use `inactivate-input-method'."
     (customize-mark-as-set 'default-input-method))
   default-input-method)
 
+(defvar toggle-input-method-active nil
+  "Non-nil inside `toggle-input-method'.")
+
 (defun toggle-input-method (&optional arg interactive)
   "Enable or disable multilingual text input method for the current buffer.
 Only one input method can be enabled at any time in a given buffer.
@@ -1478,9 +1481,12 @@ When called interactively, the optional arg INTERACTIVE is non-nil,
 which marks the variable `default-input-method' as set for Custom buffers."
 
   (interactive "P\np")
+  (if toggle-input-method-active
+      (error "Recursive use of `toggle-input-method'"))
   (if (and current-input-method (not arg))
       (inactivate-input-method)
-    (let ((default (or (car input-method-history) default-input-method)))
+    (let ((toggle-input-method-active t)
+         (default (or (car input-method-history) default-input-method)))
       (if (and arg default (equal current-input-method default)
               (> (length input-method-history) 1))
          (setq default (nth 1 input-method-history)))
@@ -2590,14 +2596,24 @@ See also `locale-charset-language-names', `locale-language-names',
 system codeset `%s' for this locale." coding-system codeset))))))))
 
     ;; On Windows, override locale-coding-system,
-    ;; keyboard-coding-system with system codepage.  Note:
-    ;; selection-coding-system is already set in w32select.c.
+    ;; default-file-name-coding-system, keyboard-coding-system,
+    ;; terminal-coding-system with system codepage.
     (when (boundp 'w32-ansi-code-page)
       (let ((code-page-coding (intern (format "cp%d" w32-ansi-code-page))))
        (when (coding-system-p code-page-coding)
          (unless frame (setq locale-coding-system code-page-coding))
          (set-keyboard-coding-system code-page-coding frame)
-         (set-terminal-coding-system code-page-coding frame))))
+         (set-terminal-coding-system code-page-coding frame)
+         ;; Set default-file-name-coding-system last, so that Emacs
+         ;; doesn't try to use cpNNNN when it defines keyboard and
+         ;; terminal encoding.  That's because the above two lines
+         ;; will want to load code-pages.el, where cpNNNN are
+         ;; defined; if default-file-name-coding-system were set to
+         ;; cpNNNN while these two lines run, Emacs will want to use
+         ;; it for encoding the file name it wants to load.  And that
+         ;; will fail, since cpNNNN is not yet usable until
+         ;; code-pages.el finishes loading.
+         (setq default-file-name-coding-system code-page-coding))))
 
     (when (eq system-type 'darwin)
       ;; On Darwin, file names are always encoded in utf-8, no matter
index 541f38d38a3222ef3bdfc3b895b5c8dafaf289fa..9ed565eada73c22e6cc0c662b0cca41062f6aae0 100644 (file)
@@ -1112,6 +1112,8 @@ To input symbols and punctuations, type `/' followed by one of `a' to
  Some infrequent characters are accessed by typing \\, followed by
  the Cantonese romanization of the respective radical (\e$(0?f5}\e(B)."))
 
+(declare-function dos-8+3-filename "dos-fns.el" (filename))
+
 (defun miscdic-convert (filename &optional dirname)
   "Convert a dictionary file FILENAME into a Quail package.
 Optional argument DIRNAME if specified is the directory name under which
index acd456815a07b5eb4a0bf1d1e5267a05cf95a33e..9161ef82c7eeb662628831568556a6eba88fd966 100644 (file)
@@ -66,15 +66,16 @@ The value is nil when the search still is in the initial buffer.")
   "Function to call to get the next buffer to search.
 
 When this variable is set to a function that returns a buffer, then
-after typing another C-s or C-r at a failing search, the search goes
+after typing another \\[isearch-forward] or \\[isearch-backward] \
+at a failing search, the search goes
 to the next buffer in the series and continues searching for the
 next occurrence.
 
 The first argument of this function is the current buffer where the
 search is currently searching.  It defines the base buffer relative to
 which this function should find the next buffer.  When the isearch
-direction is backward (when isearch-forward is nil), this function
-should return the previous buffer to search. If the second argument of
+direction is backward (when `isearch-forward' is nil), this function
+should return the previous buffer to search.  If the second argument of
 this function WRAP is non-nil, then it should return the first buffer
 in the series; and for the backward search, it should return the last
 buffer in the series.")
index 5c2cf989f625b3cd0485f6c3760eec15f992f7d5..a2f749ad127b6c10a011f1ac5ee77909517a2f7d 100644 (file)
@@ -57,6 +57,7 @@
 (easy-mmode-defmap log-edit-mode-map
   `(("\C-c\C-c" . log-edit-done)
     ("\C-c\C-a" . log-edit-insert-changelog)
+    ("\C-c\C-d" . log-edit-show-diff)
     ("\C-c\C-f" . log-edit-show-files)
     ("\M-n"    . log-edit-next-comment)
     ("\M-p"    . log-edit-previous-comment)
@@ -79,6 +80,8 @@
     ["Insert ChangeLog" log-edit-insert-changelog]
     ["Add to ChangeLog" log-edit-add-to-changelog]
     "--"
+    ["Show diff" log-edit-show-diff
+     :help "Show the diff for the files to be committed."]
     ["List files" log-edit-show-files
      :help "Show the list of relevant files."]
     "--"
@@ -170,6 +173,7 @@ when this variable is set to nil.")
 (defconst log-edit-files-buf "*log-edit-files*")
 (defvar log-edit-initial-files nil)
 (defvar log-edit-callback nil)
+(defvar log-edit-diff-function nil)
 (defvar log-edit-listfun nil)
 (defvar log-edit-parent-buffer nil)
 
@@ -301,7 +305,7 @@ automatically."
      (2 font-lock-function-name-face))))
 
 ;;;###autoload
-(defun log-edit (callback &optional setup listfun buffer &rest ignore)
+(defun log-edit (callback &optional setup params buffer &rest ignore)
   "Setup a buffer to enter a log message.
 \\<log-edit-mode-map>The buffer will be put in `log-edit-mode'.
 If SETUP is non-nil, the buffer is then erased and `log-edit-hook' is run.
@@ -309,8 +313,13 @@ Mark and point will be set around the entire contents of the
 buffer so that it is easy to kill the contents of the buffer with \\[kill-region].
 Once you're done editing the message, pressing \\[log-edit-done] will call
 `log-edit-done' which will end up calling CALLBACK to do the actual commit.
-LISTFUN if non-nil is a function of no arguments returning the list of files
-  that are concerned by the current operation (using relative names).
+PARAMS if non-nil is an alist. The keys for the alist can be:
+`log-edit-listfun' and `log-edit-diff-function'. The associated
+value for `log-edit-listfun' should be a function with not
+arguments that returns the list of files that are concerned by
+the current operation (using relative names). The associated
+value for `log-edit-diff-function' should be a function with no
+arguments that displays a diff of the files concerned by the current operation.
 If BUFFER is non-nil `log-edit' will jump to that buffer, use it to edit the
   log message and go back to the current buffer when done.  Otherwise, it
   uses the current buffer."
@@ -321,7 +330,13 @@ If BUFFER is non-nil `log-edit' will jump to that buffer, use it to edit the
     (when setup (erase-buffer))
     (log-edit-mode)
     (set (make-local-variable 'log-edit-callback) callback)
-    (set (make-local-variable 'log-edit-listfun) listfun)
+    (if (listp params)
+       (dolist (crt params)
+         (set (make-local-variable (car crt)) (cdr crt)))
+      ;; For backward compatibility with log-edit up to version 22.2
+      ;; accept non-list PARAMS to mean `log-edit-list'.
+      (set (make-local-variable 'log-edit-listfun) params))
+
     (if buffer (set (make-local-variable 'log-edit-parent-buffer) parent))
     (set (make-local-variable 'log-edit-initial-files) (log-edit-files))
     (when setup (run-hooks 'log-edit-hook))
@@ -417,6 +432,13 @@ If you want to abort the commit, simply delete the buffer."
       (indent-rigidly (point-min) (point-max)
                      (- log-edit-common-indent common)))))
 
+(defun log-edit-show-diff ()
+  "Show the diff for the files to be committed."
+  (interactive)
+  (if (functionp log-edit-diff-function)
+      (funcall log-edit-diff-function)
+    (error "Diff functionality has not been setup")))
+
 (defun log-edit-show-files ()
   "Show the list of files to be committed."
   (interactive)
index f043a48c7378cd8dbb9ad2c242b35183f6365cac..57b5742751f42ebd74ea7d62e9a0b3be23a7cc34 100644 (file)
@@ -207,33 +207,39 @@ major mode changes."
   "Make hard newlines visible by adding a face.
 With optional argument ARG, make the hard newlines invisible again."
   (interactive "P")
-  (let ((buffer-undo-list t)
-        (mod (buffer-modified-p)))
     (if arg
         (longlines-unshow-hard-newlines)
       (setq longlines-showing t)
-      (longlines-show-region (point-min) (point-max)))
-    (set-buffer-modified-p mod)))
+      (longlines-show-region (point-min) (point-max))))
 
 (defun longlines-show-region (beg end)
   "Make hard newlines between BEG and END visible."
   (let* ((pmin (min beg end))
          (pmax (max beg end))
          (pos (text-property-not-all pmin pmax 'hard nil))
-         (inhibit-read-only t))
+        (mod (buffer-modified-p))
+        (buffer-undo-list t)
+        (inhibit-read-only t)
+        (inhibit-modification-hooks t))
     (while pos
       (put-text-property pos (1+ pos) 'display
-                         (copy-sequence longlines-show-effect))
-      (setq pos (text-property-not-all (1+ pos) pmax 'hard nil)))))
+                        (copy-sequence longlines-show-effect))
+      (setq pos (text-property-not-all (1+ pos) pmax 'hard nil)))
+    (restore-buffer-modified-p mod)))
 
 (defun longlines-unshow-hard-newlines ()
   "Make hard newlines invisible again."
   (interactive)
   (setq longlines-showing nil)
-  (let ((pos (text-property-not-all (point-min) (point-max) 'hard nil)))
+  (let ((pos (text-property-not-all (point-min) (point-max) 'hard nil))
+       (mod (buffer-modified-p))
+       (buffer-undo-list t)
+       (inhibit-read-only t)
+       (inhibit-modification-hooks t))
     (while pos
       (remove-text-properties pos (1+ pos) '(display))
-      (setq pos (text-property-not-all (1+ pos) (point-max) 'hard nil)))))
+      (setq pos (text-property-not-all (1+ pos) (point-max) 'hard nil)))
+    (restore-buffer-modified-p mod)))
 
 ;; Wrapping the paragraphs.
 
similarity index 98%
rename from lisp/gnus/binhex.el
rename to lisp/mail/binhex.el
index 88f0e20f17cded0ac26a7c49d64ad2f1aae32b1f..c1d1316c82ea45e664362958907ef4bf3e9e78e5 100644 (file)
        'char-int
       'identity)))
 
+(defgroup binhex nil
+  "Decoding of BinHex (binary-to-hexadecimal) data."
+  :group 'mail
+  :group 'news)
+
 (defcustom binhex-decoder-program "hexbin"
   "*Non-nil value should be a string that names a binhex decoder.
 The program should expect to read binhex data on its standard
 input and write the converted data to its standard output."
   :type 'string
-  :group 'gnus-extract)
+  :group 'binhex)
 
 (defcustom binhex-decoder-switches '("-d")
   "*List of command line flags passed to the command `binhex-decoder-program'."
-  :group 'gnus-extract
+  :group 'binhex
   :type '(repeat string))
 
 (defcustom binhex-use-external
   (executable-find binhex-decoder-program)
   "*Use external binhex program."
   :version "22.1"
-  :group 'gnus-extract
+  :group 'binhex
   :type 'boolean)
 
 (defconst binhex-alphabet-decoding-alist
index ce98a608665793bc9332d4c42ae9520ee6802638..14a0a8d4ef1a1e4fa7d8634fcbd4fbd33e86ae71 100644 (file)
@@ -229,6 +229,9 @@ Type SPC to scroll through this section and its subsections."))))
       (setq report-emacs-bug-orig-text (buffer-substring (point-min) (point))))
     (goto-char user-point)))
 
+(declare-function Info-menu "info" (menu-item &optional fork))
+(declare-function Info-goto-node "info" (nodename &optional fork))
+
 (defun report-emacs-bug-info ()
   "Go to the Info node on reporting Emacs bugs."
   (interactive)
similarity index 98%
rename from lisp/gnus/hashcash.el
rename to lisp/mail/hashcash.el
index 737178b821889b842e0d87e9da018a3333228793..22005ce957ed48e1e1e719d54b2e2864ce73ac56 100644 (file)
@@ -126,6 +126,11 @@ For example, you may want to set this to '(\"-Z2\") to reduce header length."
       (concat (match-string 1 addr) (match-string 2 addr))
     addr))
 
+(declare-function  message-narrow-to-headers-or-head "message" ())
+(declare-function  message-fetch-field "message" (header &optional not-all))
+(declare-function  message-goto-eoh "message" ())
+(declare-function  message-narrow-to-headers "message" ())
+
 (defun hashcash-token-substring ()
   (save-excursion
     (let ((token ""))
index 209b1deacf89322e365a250736787845f346f4e2..9ef5a02bd264a0cdd88ca2676c3534c59b13430f 100644 (file)
@@ -1854,7 +1854,7 @@ place.  It affects how `mail-extract-address-components' works."
 ;; http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1-semic.txt
 ;; http://www.iana.org/domain-names.htm
 ;; http://www.iana.org/cctld/cctld-whois.htm
-;; Latest change: Mon Jul  8 14:21:59 CEST 2002
+;; Latest change: 2007/11/15
 
 (defconst mail-extr-all-top-level-domains
   (let ((ob (make-vector 739 0)))
@@ -1867,6 +1867,7 @@ place.  It affects how `mail-extract-address-components' works."
              (nth 1 x))))
      '(
        ;; ISO 3166 codes:
+       ("ac" "Ascension Island")
        ("ad" "Andorra")
        ("ae" "United Arab Emirates")
        ("af" "Afghanistan")
@@ -1882,6 +1883,7 @@ place.  It affects how `mail-extract-address-components' works."
        ("at" "Austria"         "The Republic of %s")
        ("au" "Australia")
        ("aw" "Aruba")
+       ("ax" "Aland Islands")
        ("az" "Azerbaijan")
        ("ba" "Bosnia-Herzegovina")
        ("bb" "Barbados")
@@ -1892,6 +1894,7 @@ place.  It affects how `mail-extract-address-components' works."
        ("bh" "Bahrain")
        ("bi" "Burundi")
        ("bj" "Benin")
+       ("bl" "Saint Barthelemy")
        ("bm" "Bermuda")
        ("bn" "Brunei Darussalam")
        ("bo" "Bolivia"         "Republic of %s")
@@ -1933,6 +1936,7 @@ place.  It affects how `mail-extract-address-components' works."
        ("er" "Eritrea")
        ("es" "Spain"           "The Kingdom of %s")
        ("et" "Ethiopia")
+       ("eu" "European Union")
        ("fi" "Finland"         "The Republic of %s")
        ("fj" "Fiji")
        ("fk" "Falkland Islands (Malvinas)")
@@ -1944,6 +1948,7 @@ place.  It affects how `mail-extract-address-components' works."
        ("gd" "Grenada")
        ("ge" "Georgia")
        ("gf" "French Guiana")
+       ("gg" "Guernsey")
        ("gh" "Ghana")
        ("gi" "Gibraltar")
        ("gl" "Greenland")
@@ -1973,6 +1978,7 @@ place.  It affects how `mail-extract-address-components' works."
        ("ir" "Iran"            "Islamic Republic of %s")
        ("is" "Iceland"         "The Republic of %s")
        ("it" "Italy"           "The Italian Republic")
+       ("je" "Jersey")
        ("jm" "Jamaica")
        ("jo" "Jordan")
        ("jp" "Japan")
@@ -2001,6 +2007,8 @@ place.  It affects how `mail-extract-address-components' works."
        ("ma" "Morocco")
        ("mc" "Monaco")
        ("md" "Moldova"         "The Republic of %s")
+       ("me" "Montenegro")
+       ("mf" "Saint Martin (French part)")
        ("mg" "Madagascar")
        ("mh" "Marshall Islands")
        ("mk" "Macedonia"       "The Former Yugoslav Republic of %s")
@@ -2049,6 +2057,7 @@ place.  It affects how `mail-extract-address-components' works."
        ("qa" "Qatar")
        ("re" "Reunion (Fr.)")          ; In .fr domain
        ("ro" "Romania")
+       ("rs" "Serbia")
        ("ru" "Russia"          "Russian Federation")
        ("rw" "Rwanda")
        ("sa" "Saudi Arabia")
@@ -2112,15 +2121,21 @@ place.  It affects how `mail-extract-address-components' works."
        ("zw" "Zimbabwe"                "Republic of %s")
        ;; Generic Domains:
        ("aero" t                "Air Transport Industry")
+       ("asia" t                "Pan-Asia and Asia Pacific community")
        ("biz" t                 "Businesses")
+       ("cat" t                 "Catalan language and culture")
        ("com" t                        "Commercial")
        ("coop" t                "Cooperative Associations")
        ("info" t                "Info")
+       ("jobs" t                "Employment")
+       ("mobi" t                "Mobile products")
        ("museum" t              "Museums")
        ("name" t                "Individuals")
        ("net" t                        "Network")
        ("org" t                        "Non-profit Organization")
-       ;;("pro" t                 "Credentialed professionals")
+       ("pro" t                 "Credentialed professionals")
+       ("tel" t                 "Contact data")
+       ("travel" t              "Travel industry")
        ;;("bitnet" t           "Because It's Time NET")
        ("gov" t                        "United States Government")
        ("edu" t                        "Educational")
index 514bf4fe5f3703d6371b132ec7fa7b67cca6812b..b248ba7dec1d97e45f8a39d69ae8a4245fc812b9 100644 (file)
@@ -246,6 +246,11 @@ Buffer is not displayed if SHOW is non-nil."
   (mspools-mode)
   )
 
+(declare-function rmail-get-new-mail "rmail" (&optional file-name))
+
+;; External.
+(declare-function vm-visit-folder "ext:vm-startup" (folder &optional read-only))
+
 (defun mspools-visit-spool ()
   "Visit the folder on the current line of the *spools* buffer."
   (interactive)
index 596c7ee9627785dd77aa840f90dad6585148280a..24dd9ab0c3587fd05fddf7ad9972797797c4daa8 100644 (file)
@@ -168,6 +168,9 @@ composed.")
     (goto-char (1+ (nth 1 state)))
     (current-column)))
 
+(declare-function mail-position-on-field "sendmail" (field &optional soft))
+(declare-function mail-text "sendmail" ())
+
 (defun reporter-dump-variable (varsym mailbuf)
   "Pretty-print the value of the variable in symbol VARSYM.
 MAILBUF is the mail buffer being composed."
index 4a7bd12ba42ab06016bf6df49baebcd099a41fcb..5d276f9c76af2a4ed2c78caa4df86ed735109599 100644 (file)
@@ -184,6 +184,10 @@ please report it with \\[report-emacs-bug].")
     :group 'rmail-retrieve
     :type '(repeat (directory)))
 
+(declare-function mail-position-on-field "sendmail" (field &optional soft))
+(declare-function mail-text-start "sendmail" ())
+(declare-function rmail-update-summary "rmailsum" (&rest ignore))
+
 (defun rmail-probe (prog)
   "Determine what flavor of movemail PROG is.
 We do this by executing it with `--version' and analyzing its output."
@@ -1515,6 +1519,15 @@ original copy."
 \f
 ;;;; *** Rmail input ***
 
+(declare-function rmail-spam-filter "rmail-spam-filter" (msg))
+(declare-function rmail-summary-goto-msg "rmailsum" (&optional n nowarn skip-rmail))
+(declare-function rmail-summary-mark-undeleted "rmailsum" (n))
+(declare-function rmail-summary-mark-deleted "rmailsum" (&optional n undel))
+(declare-function rfc822-addresses "rfc822" (header-text))
+(declare-function mail-abbrev-make-syntax-table "mailabbrev.el" ())
+(declare-function mail-sendmail-delimit-header "sendmail" ())
+(declare-function mail-header-end "sendmail" ())
+
 ;; RLK feature not added in this version:
 ;; argument specifies inbox file or files in various ways.
 
@@ -3282,7 +3295,9 @@ and more whitespace.  The returned regular expressions contains
     (setq subject (regexp-quote subject))
     (setq subject
          (replace-regexp-in-string "[ \t\n]+" "[ \t\n]+" subject t t))
-    (concat "^Subject: "
+    ;; Some mailers insert extra spaces after "Subject:", so allow any
+    ;; amount of them.
+    (concat "^Subject:[ \t]+"
            (if (string= "\\`" (substring rmail-reply-regexp 0 2))
                (substring rmail-reply-regexp 2)
              rmail-reply-regexp)
index 04982aec3491e62ce310b5adb83a83810b440b07..02bc23fe0c57f66bbd6bdd556370f7d99ed2f212 100644 (file)
@@ -49,6 +49,9 @@
 ;; Rmail Edit mode is suitable only for specially formatted data.
 (put 'rmail-edit-mode 'mode-class 'special)
 
+(declare-function rmail-summary-disable "" ())
+(declare-function rmail-summary-enable "rmailsum" ())
+
 (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 two commands
index c479e35beb7e486a7fbc196b6a50681ab0a20921..48e2246520bd8b5511de68059846668311b34f25 100644 (file)
@@ -86,6 +86,15 @@ Completion is performed over known labels when reading."
          rmail-last-label
        (setq rmail-last-label (rmail-make-label result t))))))
 
+(declare-function rmail-maybe-set-message-counters "rmail" ())
+(declare-function rmail-display-labels "rmail" ())
+(declare-function rmail-msgbeg "rmail" (n))
+(declare-function rmail-set-message-deleted-p "rmail" (n state))
+(declare-function rmail-message-labels-p "rmail" (msg labels))
+(declare-function rmail-show-message "rmail" (&optional n no-summary))
+(declare-function mail-comma-list-regexp "mail-utils" (labels))
+(declare-function mail-parse-comma-list "mail-utils.el" ())
+
 (defun rmail-set-label (l state &optional n)
   (with-current-buffer rmail-buffer
     (rmail-maybe-set-message-counters)
index 3b7ccd72d02b841c1a2beed42098e17892c09a86..67cea297f0eec15fa7106619e80e4b699e32dafe 100644 (file)
@@ -30,6 +30,9 @@
 (defvar rmail-current-message)
 (defvar rmail-inbox-list)
 
+(declare-function rmail-parse-file-inboxes "rmail" ())
+(declare-function rmail-show-message "rmail" (&optional n no-summary))
+
 ;;;###autoload
 (defun set-rmail-inbox-list (file-name)
   "Set the inbox list of the current RMAIL file to FILE-NAME.
index d85bfc0bfe8ecaed540f59fdc26c8415680bb854..1e9f8379b7b9d222f66728e94d88b44a01336d9e 100644 (file)
@@ -109,6 +109,8 @@ Set `rmail-default-file' to this name as well as returning it."
               (or read-file (file-name-nondirectory default-file))
               (file-name-directory default-file)))))))
 
+(declare-function rmail-update-summary "rmailsum" (&rest ignore))
+
 ;;; There are functions elsewhere in Emacs that use this function;
 ;;; look at them before you change the calling method.
 ;;;###autoload
index ba496a31228c632c9b54787457c40d7257905c19..bed40cd0820c04d2ff4479a40391bc36fbd9bd99 100644 (file)
@@ -152,6 +152,7 @@ KEYWORDS is a comma-separated list of labels."
                              n))))))
 \f
 ;; Basic functions
+(declare-function rmail-update-summary "rmailsum" (&rest ignore))
 
 (defun rmail-sort-messages (reverse keyfun)
   "Sort messages of current Rmail file.
index fd5931fdef9ab6f84bb7db1196c892830756fd4c..cde289ed719c55e124ac33559d3062ca63f32223 100644 (file)
@@ -1323,6 +1323,13 @@ argument says to read a file name and use that file as the inbox."
     (end-of-buffer))
   (forward-line -1))
 
+(declare-function rmail-abort-edit "rmailedit" ())
+(declare-function rmail-cease-edit "rmailedit"())
+(declare-function rmail-set-label "rmailkwd" (l state &optional n))
+(declare-function rmail-output-read-file-name "rmailout" ())
+(declare-function rmail-output-read-rmail-file-name  "rmailout" ())
+(declare-function mail-send-and-exit "sendmail" (&optional arg))
+
 (defvar rmail-summary-edit-map nil)
 (if rmail-summary-edit-map
     nil
index e8d896be2464c1d6fa54b8d8118bb6b96cbd5c1d..7d66b5e7ac6bf93a8612195469431fe8aeae6d1c 100644 (file)
@@ -1744,6 +1744,9 @@ The seventh argument ACTIONS is a list of actions to take
        (message "Auto save file for draft message exists; consider M-x mail-recover"))
     initialized))
 
+(declare-function dired-view-file "dired" ())
+(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
+
 (defun mail-recover-1 ()
   "Pop up a list of auto-saved draft messages so you can recover one of them."
   (interactive)
@@ -1815,6 +1818,10 @@ The seventh argument ACTIONS is a list of actions to take
              (setq buffer-file-coding-system
                    default-buffer-file-coding-system))))))))
 
+(declare-function dired-move-to-filename "dired" (&optional raise-error eol))
+(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
+(declare-function dired-view-file "dired" ())
+
 (defun mail-recover ()
   "Recover interrupted mail composition from auto-save files.
 
index 61e7d0a00ebb274c24f6d914dec9835443f2198e..c0e581c0310a835467ccae573da19b085cff6631 100644 (file)
@@ -6,11 +6,8 @@
 ;; Author: 1993 Barry A. Warsaw <bwarsaw@python.org>
 ;; Maintainer:    Glenn Morris <rgm@gnu.org>
 ;; Created:       February 1993
-;; Last Modified: 1993/09/22 18:58:46
 ;; Keywords: mail, news
 
-;; supercite.el revision: 3.54
-
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
@@ -510,10 +507,7 @@ string."
 ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 ;; end user configuration variables
 \f
-(defconst sc-version "3.1"
-  "Supercite version number.")
-(defconst sc-help-address "bug-supercite@gnu.org"
-  "Address accepting submissions of bug reports.")
+(define-obsolete-variable-alias 'sc-version 'emacs-version "23.1")
 
 (defvar sc-mail-info nil
   "Alist of mail header information gleaned from reply buffer.")
@@ -2010,7 +2004,7 @@ cited."
 If MESSAGE is non-nil (interactively, with no prefix argument),
 inserts the version string in the current buffer instead."
   (interactive (not current-prefix-arg))
-  (let ((verstr (format "Using Supercite.el %s" sc-version)))
+  (let ((verstr (format "Using Supercite.el %s" emacs-version)))
     (if message
        (message verstr)
       (insert "`sc-version' says: " verstr))))
@@ -2023,48 +2017,7 @@ more information.  Info node `(SC)Top'."
   (interactive)
   (describe-function 'sc-describe))
 
-(defun sc-submit-bug-report ()
-  "Submit a bug report on Supercite via mail."
-  (interactive)
-  (require 'reporter)
-  (and
-   (y-or-n-p "Do you want to submit a report on Supercite? ")
-   (reporter-submit-bug-report
-    sc-help-address
-    (concat "Supercite version " sc-version)
-    (list
-     'sc-attrib-selection-list
-     'sc-auto-fill-region-p
-     'sc-blank-lines-after-headers
-     'sc-citation-leader
-     'sc-citation-delimiter
-     'sc-citation-separator
-     'sc-citation-leader-regexp
-     'sc-citation-root-regexp
-     'sc-citation-nonnested-root-regexp
-     'sc-citation-delimiter-regexp
-     'sc-citation-separator-regexp
-     'sc-cite-region-limit
-     'sc-confirm-always-p
-     'sc-default-attribution
-     'sc-default-author-name
-     'sc-downcase-p
-     'sc-electric-circular-p
-     'sc-electric-references-p
-     'sc-fixup-whitespace-p
-     'sc-mail-warn-if-non-rfc822-p
-     'sc-mumble
-     'sc-name-filter-alist
-     'sc-nested-citation-p
-     'sc-nuke-mail-headers
-     'sc-nuke-mail-header-list
-     'sc-preferred-attribution-list
-     'sc-preferred-header-style
-     'sc-reference-tag-string
-     'sc-rewrite-header-list
-     'sc-titlecue-regexp
-     'sc-use-only-preference-p
-     ))))
+(define-obsolete-function-alias 'sc-submit-bug-report 'report-emacs-bug "23.1")
 
 \f
 ;; useful stuff
index 61afd248332aac7dc1dec90f2acb9708bc24e4d3..5a4e01ae9fc3cfc5bdf211034e5177bbe914e3e4 100644 (file)
@@ -217,6 +217,14 @@ These are mostly meant for headers that prevent delivery errors reporting."
   :type 'string
   :group 'uce)
 
+(declare-function mail-strip-quoted-names "mail-utils" (address))
+(declare-function rmail-msg-is-pruned "rmail" ())
+(declare-function rmail-maybe-set-message-counters "rmail" ())
+(declare-function rmail-msgbeg "rmail" (n))
+(declare-function rmail-msgend "rmail" (n))
+(declare-function rmail-toggle-header "rmail" (&optional arg))
+
+
 (defun uce-reply-to-uce (&optional ignored)
   "Send reply to UCE in Rmail.
 UCE stands for unsolicited commercial email.  Function will set up reply
index 5d6f266b3b0334edb25d895974586aa3e5818ec0..9bb2f3eab90c6616dc2d07b748f317258052083e 100644 (file)
@@ -153,6 +153,8 @@ See rmail-digest-methods."
       ;; Return the list of marker pairs
       (nreverse result))))
 
+(declare-function rmail-update-summary "rmailsum" (&rest ignore))
+
 ;;;###autoload
 (defun undigestify-rmail-message ()
   "Break up a digest message into its constituent messages.
index f1cf85a4ffca5d1cd7961ce579bf51c1b9413287..7ad1c69b50d47328370744eb713c8f4e8a4e8c76 100644 (file)
@@ -48,6 +48,8 @@ For example, invoke `emacs -batch -f batch-unrmail RMAIL'."
     (message "Done")
     (kill-emacs (if error 1 0))))
 
+(declare-function mail-strip-quoted-names "mail-utils" (address))
+
 ;;;###autoload
 (defun unrmail (file to-file)
   "Convert Rmail file FILE to system inbox format file TO-FILE."
similarity index 98%
rename from lisp/gnus/uudecode.el
rename to lisp/mail/uudecode.el
index 74abeff6621ad4b0281dfc1992db1f56d44a4144..9dc430e825d150c9480e420c8326ceb6615dfea9 100644 (file)
        'char-int
       'identity)))
 
+(defgroup uudecode nil
+  "Decoding of uuencoded data."
+  :group 'mail
+  :group 'news)
+
 (defcustom uudecode-decoder-program "uudecode"
   "*Non-nil value should be a string that names a uu decoder.
 The program should expect to read uu data on its standard
 input and write the converted data to its standard output."
   :type 'string
-  :group 'gnus-extract)
+  :group 'uudecode)
 
 (defcustom uudecode-decoder-switches nil
   "*List of command line flags passed to `uudecode-decoder-program'."
-  :group 'gnus-extract
+  :group 'uudecode
   :type '(repeat string))
 
 (defcustom uudecode-use-external
   (executable-find uudecode-decoder-program)
   "*Use external uudecode program."
   :version "22.1"
-  :group 'gnus-extract
+  :group 'uudecode
   :type 'boolean)
 
 (defconst uudecode-alphabet "\040-\140")
index 022a8070a2ede9f3d1ad4d0f0a9520717fc4f0c6..9785fed71e6c9aa9d5559fd1844f1a2111533d1d 100644 (file)
@@ -1,3 +1,4 @@
+;; -*- no-byte-compile: t -*-
 ;;; vms-pmail.el --- use Emacs as the editor within VMS mail
 
 ;; Copyright (C) 1992, 2001, 2002, 2003, 2004, 2005,
index 96d69dc0bb7aeb857124490a7a96139c953eae3f..1998dc6d59033fc4b276b7597fb03aefed293267 100644 (file)
@@ -84,6 +84,7 @@ WINS_ALMOST=\
        mail \
        mh-e \
        net \
+       nxml \
        play \
        progmodes \
        term \
index fc84f32727169ae13b40418c4de99264ca942438..41f1d37bb181ae9afcb9415b746cb91ebf7e58f8 100644 (file)
@@ -264,14 +264,17 @@ the associated section number."
            "(\\(" Man-section-regexp "\\))\\).*\\1"))
   "Regular expression describing the heading of a page.")
 
-(defvar Man-heading-regexp "^\\([A-Z][A-Z /-]+\\)$"
+(defvar Man-heading-regexp "^\\([A-Z][A-Z0-9 /-]+\\)$"
   "Regular expression describing a manpage heading entry.")
 
 (defvar Man-see-also-regexp "SEE ALSO"
   "Regular expression for SEE ALSO heading (or your equivalent).
 This regexp should not start with a `^' character.")
 
-(defvar Man-first-heading-regexp "^[ \t]*NAME$\\|^[ \t]*No manual entry fo.*$"
+;; This used to have leading space [ \t]*, but was removed because it
+;; causes false page splits on an occasional NAME with leading space
+;; inside a manpage.  And `Man-heading-regexp' doesn't have [ \t]* anyway.
+(defvar Man-first-heading-regexp "^NAME$\\|^[ \t]*No manual entry fo.*$"
   "Regular expression describing first heading on a manpage.
 This regular expression should start with a `^' character.")
 
@@ -763,17 +766,16 @@ all sections related to a subject, put something appropriate into the
        ;;               minal (using an ioctl(2) if available, the value of
        ;;               $COLUMNS,  or falling back to 80 characters if nei-
        ;;               ther is available).
-       (if window-system
-           (unless (or (getenv "MANWIDTH") (getenv "COLUMNS"))
-             ;; This isn't strictly correct, since we don't know how
-             ;; the page will actually be displayed, but it seems
-             ;; reasonable.
-             (setenv "COLUMNS" (number-to-string
-                                (cond
-                                 ((and (integerp Man-width) (> Man-width 0))
-                                  Man-width)
-                                 (Man-width (frame-width))
-                                 ((window-width)))))))
+       (unless (or (getenv "MANWIDTH") (getenv "COLUMNS"))
+         ;; This isn't strictly correct, since we don't know how
+         ;; the page will actually be displayed, but it seems
+         ;; reasonable.
+         (setenv "COLUMNS" (number-to-string
+                            (cond
+                             ((and (integerp Man-width) (> Man-width 0))
+                              Man-width)
+                             (Man-width (frame-width))
+                             ((window-width))))))
        (setenv "GROFF_NO_SGR" "1")
        (if (fboundp 'start-process)
            (set-process-sentinel
similarity index 95%
rename from lisp/gnus/md4.el
rename to lisp/md4.el
index aa9bc5432032b8526552f8ed2e4c3260cc057294..7ccb22a20feda2c330e5dc264d9628526c4c7987 100644 (file)
@@ -1,26 +1,26 @@
 ;;; md4.el --- MD4 Message Digest Algorithm.
 
-;; Copyright (C) 2004 Free Software Foundation, Inc.
-;; Copyright (C) 2001 Taro Kawagishi
+;; Copyright (C) 2001, 2004, 2007  Free Software Foundation, Inc.
+
 ;; Author: Taro Kawagishi <tarok@transpulse.org>
 ;; Keywords: MD4
 ;; Version: 1.00
 ;; Created: February 2001
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is part of GNU Emacs.
 
-;; This program is free software; you can redistribute it and/or modify
+;; 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, or (at your option)
 ;; any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
index c05a4e66a9ab907e55304529c677f95c197cf7ad..2f4c95d6484146c3f8039cb671352c4a9a01de33 100644 (file)
@@ -504,11 +504,14 @@ A large number or nil slows down menu responsiveness."
 ;; These are alternative definitions for the cut, paste and copy
 ;; menu items.  Use them if your system expects these to use the clipboard.
 
-(put 'clipboard-kill-region 'menu-enable 'mark-active)
+(put 'clipboard-kill-region 'menu-enable
+     '(and mark-active (not buffer-read-only)))
 (put 'clipboard-kill-ring-save 'menu-enable 'mark-active)
 (put 'clipboard-yank 'menu-enable
-     '(or (and (fboundp 'x-selection-exists-p) (x-selection-exists-p))
-         (x-selection-exists-p 'CLIPBOARD)))
+     '(and (or (and (fboundp 'x-selection-exists-p)
+                   (x-selection-exists-p))
+              (x-selection-exists-p 'CLIPBOARD))
+          (not buffer-read-only)))
 
 (defun clipboard-yank ()
   "Insert the clipboard contents, or the last stretch of killed text."
@@ -1340,10 +1343,10 @@ key, a click, or a menu-item"))
   '(menu-item "Introduction to Emacs Lisp" menu-bar-read-lispintro
              :help "Read the Introduction to Emacs Lisp Programming"))
 
-(define-key menu-bar-help-menu [describe-project]
+(define-key menu-bar-help-menu [about-gnu-project]
   '(menu-item "About GNU" describe-project
              :help "About the GNU System, GNU Project, and GNU/Linux"))
-(define-key menu-bar-help-menu [about]
+(define-key menu-bar-help-menu [about-emacs]
   '(menu-item "About Emacs" about-emacs
              :help "Display version number, copyright info, and basic help"))
 (define-key menu-bar-help-menu [sep4]
@@ -1354,7 +1357,7 @@ key, a click, or a menu-item"))
 (define-key menu-bar-help-menu [describe-copying]
   '(menu-item "Copying Conditions" describe-copying
              :help "Show the Emacs license (GPL)"))
-(define-key menu-bar-help-menu [describe-distribution]
+(define-key menu-bar-help-menu [getting-new-versions]
   '(menu-item "Getting New Versions" describe-distribution
              :help "How to get latest versions of Emacs"))
 (defun menu-bar-help-extra-packages ()
@@ -1366,10 +1369,10 @@ key, a click, or a menu-item"))
     (goto-address)))
 (define-key menu-bar-help-menu [sep2]
   '("--"))
-(define-key menu-bar-help-menu [more]
+(define-key menu-bar-help-menu [external-packages]
   '(menu-item "External Packages" menu-bar-help-extra-packages
              :help "Lisp packages distributed separately for use in Emacs"))
-(define-key menu-bar-help-menu [finder-by-keyword]
+(define-key menu-bar-help-menu [find-emacs-packages]
   '(menu-item "Find Emacs Packages" finder-by-keyword
              :help "Find packages and features by keyword"))
 (define-key menu-bar-help-menu [more-manuals]
@@ -1383,10 +1386,10 @@ key, a click, or a menu-item"))
   (list 'menu-item "Search Documentation" menu-bar-search-documentation-menu))
 (define-key menu-bar-help-menu [sep1]
   '("--"))
-(define-key menu-bar-help-menu [eliza]
+(define-key menu-bar-help-menu [emacs-psychotherapist]
   '(menu-item "Emacs Psychotherapist" doctor
              :help "Our doctor will help you feel better"))
-(define-key menu-bar-help-menu [report-emacs-bug]
+(define-key menu-bar-help-menu [send-emacs-bug-report]
   '(menu-item "Send Bug Report..." report-emacs-bug
              :help "Send e-mail to Emacs maintainers"))
 (define-key menu-bar-help-menu [emacs-known-problems]
@@ -1772,6 +1775,8 @@ See `menu-bar-mode' for more information."
       (menu-bar-mode (if (> (frame-parameter nil 'menu-bar-lines) 0) 0 1))
     (menu-bar-mode arg)))
 
+(declare-function x-menu-bar-open "term/x-win" (&optional frame))
+
 (defun menu-bar-open (&optional frame)
   "Start key navigation of the menu bar in FRAME.
 
index 2619e20e6f74e46248a6e943d8fa8d3c39ba93a1..f82859475a369297caff9b711c6463493b69f4ec 100644 (file)
@@ -1,3 +1,20 @@
+2007-12-02  Glenn Morris  <rgm@gnu.org>
+
+       * mh-mime.el (mail-strip-quoted-names): Autoload it.
+
+2007-11-17  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * mh-e.el (mh-xemacs-flag): Remove.
+       (mh-min-colors-defined-flag):
+       * mh-xface.el (mh-show-xface-function):
+       * mh-utils.el (mh-colors-available-p):
+       * mh-show.el (mh-show-mode):
+       * mh-gnus.el (mh-gnus-local-map-property):
+       * mh-folder.el (mh-folder-mode-map)
+       (mh-remove-xemacs-horizontal-scrollbar, mh-folder-mode):
+       * mh-comp.el (mh-insert-x-mailer): Replace uses of mh-xemacs-flag
+       with (featurep 'xemacs).
+
 2007-09-11  Bill Wohler  <wohler@newt.com>
 
        * mh-e.el (Version, mh-version): Add +cvs to version.
index bb2d1506adf4bb71934941a8c8e3afa211467cce..2dcc3d528258e69464bb217712c5265df4a936d4 100644 (file)
@@ -928,8 +928,8 @@ The versions of MH-E, Emacs, and MH are shown."
     (setq mh-x-mailer-string
           (format "MH-E %s; %s; %sEmacs %s"
                   mh-version mh-variant-in-use
-                  (if mh-xemacs-flag "X" "GNU ")
-                  (cond ((not mh-xemacs-flag)
+                  (if (featurep 'xemacs) "X" "GNU ")
+                  (cond ((not (featurep 'xemacs))
                          (string-match "[0-9]+\\.[0-9]+\\(\\.[0-9]+\\)?"
                                        emacs-version)
                          (match-string 0 emacs-version))
index faec4db35b7796acf7290169074ab0d996b05e0d..694541107018734298297fb1a4f683fd56591cde 100644 (file)
 (require 'mh-buffers)
 (require 'mh-compat)
 
-(eval-and-compile
-  (defvar mh-xemacs-flag (featurep 'xemacs)
-    "Non-nil means the current Emacs is XEmacs."))
-
 (mh-do-in-xemacs
   (require 'mh-xemacs))
 
@@ -3398,7 +3394,7 @@ consumed by `defface-mh'.")
 The :inherit keyword is available on all supported versions of
 GNU Emacs and XEmacs from at least 21.5.23 on.")
 
-(defvar mh-min-colors-defined-flag (and (not mh-xemacs-flag)
+(defvar mh-min-colors-defined-flag (and (not (featurep 'xemacs))
                                         (>= emacs-major-version 22))
   "Non-nil means `defface' supports min-colors display requirement.")
 
index 75cebfe519db35b0869e72f0b901a62166aa96cb..bc15d3eb1188e8f25a96565d55d991d05282d4a4 100644 (file)
@@ -351,7 +351,7 @@ annotation.")
   "\M-\t"       mh-prev-button)
 
 (cond
- (mh-xemacs-flag
+ ((featurep 'xemacs)
   (define-key mh-folder-mode-map [button2] 'mh-show-mouse))
  (t
   (define-key mh-folder-mode-map [mouse-2] 'mh-show-mouse)))
@@ -513,7 +513,7 @@ font-lock is done highlighting.")
 
 (defmacro mh-remove-xemacs-horizontal-scrollbar ()
   "Get rid of the horizontal scrollbar that XEmacs insists on putting in."
-  (when mh-xemacs-flag
+  (when (featurep 'xemacs)
     `(if (and (featurep 'scrollbar)
               (fboundp 'set-specifier))
          (set-specifier horizontal-scrollbar-visible-p nil
@@ -656,7 +656,7 @@ perform the operation on all messages in that region.
   (easy-menu-add mh-folder-folder-menu)
   (mh-inc-spool-make)
   (mh-set-help mh-folder-mode-help-messages)
-  (if (and mh-xemacs-flag
+  (if (and (featurep 'xemacs)
            font-lock-auto-fontify)
       (turn-on-font-lock)))             ; Force font-lock in XEmacs.
 
index 0624346ca05b8e7196b39101741d65c6f04a6401..e099c2e726be1c61ab5c4a79c2ed0b099b88eb11 100644 (file)
@@ -41,7 +41,7 @@
 ;; Copy of function from gnus-util.el.
 (defun-mh mh-gnus-local-map-property gnus-local-map-property (map)
   "Return a list suitable for a text property list specifying keymap MAP."
-  (cond (mh-xemacs-flag (list 'keymap map))
+  (cond ((featurep 'xemacs) (list 'keymap map))
         ((>= emacs-major-version 21) (list 'keymap map))
         (t (list 'local-map map))))
 
index 659ab47d0dbdf47266254a0ce0da1187df8ba0b1..10bfeb9c59aa549acacb91e6507cd00a4adc0a37 100644 (file)
@@ -60,6 +60,7 @@
 (autoload 'mail-decode-encoded-word-string "mail-parse")
 (autoload 'mail-header-parse-content-type "mail-parse")
 (autoload 'mail-header-strip "mail-parse")
+(autoload 'mail-strip-quoted-names "mail-utils")
 (autoload 'message-options-get "message")
 (autoload 'message-options-set "message")
 (autoload 'message-options-set-recipient "message")
index fd171107ac3133f7e2b64dfbf63847891f3718eb..c97715dabf3ebd02b0a19ffb9481eeda8e3a9149 100644 (file)
@@ -872,7 +872,7 @@ See also `mh-folder-mode'.
     (mh-gnus-article-highlight-citation))
    (t
     (setq font-lock-defaults '(mh-show-font-lock-keywords t))))
-  (if (and mh-xemacs-flag
+  (if (and (featurep 'xemacs)
            font-lock-auto-fontify)
       (turn-on-font-lock))
   (when mh-decode-mime-flag
index 5b618e35b87f058ebdf0ee271f63b9c6b2428197..da2ace3fd2cd59063fab0d9ee8c5ca0edcf588ef 100644 (file)
@@ -67,7 +67,7 @@ used in lieu of `search' in the CL package."
 ;;;###mh-autoload
 (defun mh-colors-available-p ()
   "Check if colors are available in the Emacs being used."
-  (or mh-xemacs-flag
+  (or (featurep 'xemacs)
       (let ((color-cells (mh-display-color-cells)))
         (and (numberp color-cells) (>= color-cells 8)))))
 
index 8445cf32ed1ea84dbf6bfca1180682c4d4b65226..a6a6efc0fb27a1b898247c66ffb6647472654e99 100644 (file)
@@ -36,7 +36,7 @@
 (autoload 'message-fetch-field "message")
 
 (defvar mh-show-xface-function
-  (cond ((and mh-xemacs-flag (locate-library "x-face") (not (featurep 'xface)))
+  (cond ((and (featurep 'xemacs) (locate-library "x-face") (not (featurep 'xface)))
          (load "x-face" t t)
          #'mh-face-display-function)
         ((>= emacs-major-version 21)
index 523588ec7c28cac8639e0ff4567bfabc7226160c..d7c5228945c1f1d280deace83ef0dff34b5d5187 100644 (file)
@@ -825,6 +825,7 @@ to use."
 ;; --- Default MS-Windows browser ---
 
 (defvar dos-windows-version)
+(declare-function w32-shell-execute "w32fns.c")    ;; Defined in C.
 
 (defun browse-url-default-windows-browser (url &optional new-window)
   (interactive (browse-url-interactive-arg "URL: "))
@@ -1283,6 +1284,10 @@ used instead of `browse-url-new-window-flag'."
 
 ;; --- W3 ---
 
+;; External.
+(declare-function w3-fetch-other-window "ext:w3m" (&optional url))
+(declare-function w3-fetch              "ext:w3m" (&optional url target))
+
 ;;;###autoload
 (defun browse-url-w3 (url &optional new-window)
   "Ask the w3 WWW browser to load URL.
diff --git a/lisp/net/dbus.el b/lisp/net/dbus.el
new file mode 100644 (file)
index 0000000..9221c52
--- /dev/null
@@ -0,0 +1,291 @@
+;;; -*- no-byte-compile: t; -*-
+;;; dbus.el --- Elisp bindings for D-Bus.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: Michael Albinus <michael.albinus@gmx.de>
+;; Keywords: comm, hardware
+
+;; 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, 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, see
+;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package provides language bindings for the D-Bus API.  D-Bus
+;; is a message bus system, a simple way for applications to talk to
+;; one another.  See <http://dbus.freedesktop.org/> for details.
+
+;; Low-level language bindings are implemented in src/dbusbind.c.
+
+;;; Code:
+
+(require 'xml)
+
+(defconst dbus-service-dbus "org.freedesktop.DBus"
+  "The bus name used to talk to the bus itself.")
+
+(defconst dbus-path-dbus "/org/freedesktop/DBus"
+  "The object path used to talk to the bus itself.")
+
+(defconst dbus-interface-dbus "org.freedesktop.DBus"
+  "The interface exported by the object with `dbus-service-dbus' and `dbus-path-dbus'.")
+
+(defconst dbus-interface-introspectable "org.freedesktop.DBus.Introspectable"
+  "The interface supported by introspectable objects.")
+
+\f
+;;; Hash table of registered functions.
+
+(defun dbus-hash-table= (x y)
+  "Compares keys X and Y in the hash table of registered functions for D-Bus.
+See `dbus-registered-functions-table' for a description of the hash table."
+  (and
+   (listp x) (listp y)
+   ;; Bus symbol, either :system or :session.
+   (symbolp (car x)) (symbolp (car y)) (equal (car x) (car y))
+   ;; Interface.
+   (or
+    (null (cadr x)) (null (cadr y)) ; wildcard
+    (and
+     (stringp (cadr x)) (stringp (cadr y)) (string-equal (cadr x) (cadr y))))
+   ;; Member.
+   (or
+    (null (caddr x)) (null (caddr y)) ; wildcard
+    (and
+     (stringp (caddr x)) (stringp (caddr y))
+     (string-equal (caddr x) (caddr y))))))
+
+(define-hash-table-test 'dbus-hash-table-test 'dbus-hash-table= 'sxhash)
+
+;; When we assume that interface and and member are always strings in
+;; the key, we could use `equal' as test function.  But we want to
+;; have also `nil' there, being a wildcard.
+(setq dbus-registered-functions-table
+      (make-hash-table :test 'dbus-hash-table-test))
+
+\f
+;;; D-Bus events.
+
+(defun dbus-check-event (event)
+  "Checks whether EVENT is a well formed D-Bus event.
+EVENT is a list which starts with symbol `dbus-event':
+
+     (dbus-event HANDLER BUS SERVICE PATH INTERFACE MEMBER &rest ARGS)
+
+HANDLER is the function which has been registered for this
+signal.  BUS identifies the D-Bus the signal is coming from.  It
+is either the symbol `:system' or the symbol `:session'.  SERVICE
+and PATH are the name and the object path of the D-Bus object
+emitting the signal.  INTERFACE and MEMBER denote the signal
+which has been sent.  ARGS are the arguments passed to HANDLER,
+when it is called during event handling in `dbus-handle-event'.
+
+This function raises a `dbus-error' signal in case the event is
+not well formed."
+  (when dbus-debug (message "DBus-Event %s" event))
+  (unless (and (listp event)
+              (eq (car event) 'dbus-event)
+              ;; Handler.
+              (functionp (nth 1 event))
+              ;; Bus symbol.
+              (symbolp (nth 2 event))
+              ;; Service.
+              (stringp (nth 3 event))
+              ;; Object path.
+              (stringp (nth 4 event))
+              ;; Interface.
+              (stringp (nth 5 event))
+              ;; Member.
+              (stringp (nth 6 event)))
+    (signal 'dbus-error (list "Not a valid D-Bus event" event))))
+
+;;;###autoload
+(defun dbus-handle-event (event)
+  "Handle events from the D-Bus.
+EVENT is a D-Bus event, see `dbus-check-event'.  HANDLER, being
+part of the event, is called with arguments ARGS."
+  (interactive "e")
+  ;; We don't want to raise an error, because this function is called
+  ;; in the event handling loop.
+  (condition-case nil
+      (progn
+       (dbus-check-event event)
+       (apply (cadr event) (nthcdr 7 event)))
+    (dbus-error)))
+
+(defun dbus-event-bus-name (event)
+  "Return the bus name the event is coming from.
+The result is either the symbol `:system' or the symbol `:session'.
+EVENT is a D-Bus event, see `dbus-check-event'.  This function
+raises a `dbus-error' signal in case the event is not well
+formed."
+  (dbus-check-event event)
+  (nth 2 event))
+
+(defun dbus-event-service-name (event)
+  "Return the name of the D-Bus object the event is coming from.
+The result is a string.  EVENT is a D-Bus event, see `dbus-check-event'.
+This function raises a `dbus-error' signal in case the event is
+not well formed."
+  (dbus-check-event event)
+  (nth 3 event))
+
+(defun dbus-event-path-name (event)
+  "Return the object path of the D-Bus object the event is coming from.
+The result is a string.  EVENT is a D-Bus event, see `dbus-check-event'.
+This function raises a `dbus-error' signal in case the event is
+not well formed."
+  (dbus-check-event event)
+  (nth 4 event))
+
+(defun dbus-event-interface-name (event)
+  "Return the interface name of the D-Bus object the event is coming from.
+The result is a string.  EVENT is a D-Bus event, see `dbus-check-event'.
+This function raises a `dbus-error' signal in case the event is
+not well formed."
+  (dbus-check-event event)
+  (nth 5 event))
+
+(defun dbus-event-member-name (event)
+  "Return the member name the event is coming from.
+It is either a signal name or a method name. The result is is a
+string.  EVENT is a D-Bus event, see `dbus-check-event'.  This
+function raises a `dbus-error' signal in case the event is not
+well formed."
+  (dbus-check-event event)
+  (nth 6 event))
+
+\f
+;;; D-Bus registered names.
+
+(defun dbus-list-activatable-names ()
+  "Return the D-Bus service names which can be activated as list.
+The result is a list of strings, which is nil when there are no
+activatable service names at all."
+  (condition-case nil
+      (dbus-call-method
+       :system "ListActivatableNames" dbus-service-dbus
+       dbus-path-dbus dbus-interface-dbus)
+    (dbus-error)))
+
+(defun dbus-list-names (bus)
+  "Return the service names registered at D-Bus BUS.
+The result is a list of strings, which is nil when there are no
+registered service names at all.  Well known names are strings like
+\"org.freedesktop.DBus\".  Names starting with \":\" are unique names
+for services."
+  (condition-case nil
+      (dbus-call-method
+       bus "ListNames" dbus-service-dbus dbus-path-dbus dbus-interface-dbus)
+    (dbus-error)))
+
+(defun dbus-list-known-names (bus)
+  "Retrieve all services which correspond to a known name in BUS.
+A service has a known name if it doesn't start with \":\"."
+  (let (result)
+    (dolist (name (dbus-list-names bus) result)
+      (unless (string-equal ":" (substring name 0 1))
+       (add-to-list 'result name 'append)))))
+
+(defun dbus-list-queued-owners (bus service)
+"Return the unique names registered at D-Bus BUS and queued for SERVICE.
+The result is a list of strings, or nil when there are no queued name
+owners service names at all."
+  (condition-case nil
+      (dbus-call-method
+       bus "ListQueuedOwners" dbus-service-dbus
+       dbus-path-dbus dbus-interface-dbus service)
+    (dbus-error)))
+
+(defun dbus-get-name-owner (bus service)
+  "Return the name owner of SERVICE registered at D-Bus BUS.
+The result is either a string, or nil if there is no name owner."
+  (condition-case nil
+      (dbus-call-method
+       bus "GetNameOwner" dbus-service-dbus
+       dbus-path-dbus dbus-interface-dbus service)
+    (dbus-error)))
+
+(defun dbus-introspect (bus service path)
+  "Return the introspection data of SERVICE in D-Bus BUS at object path PATH.
+The data are in XML format.
+
+Example:
+
+\(dbus-introspect
+  :system \"org.freedesktop.Hal\"
+  \"/org/freedesktop/Hal/devices/computer\"))"
+  (condition-case nil
+      (dbus-call-method
+       bus "Introspect" service path dbus-interface-introspectable)
+    (dbus-error)))
+
+(if nil ;; Must be reworked.  Shall we offer D-Bus signatures at all?
+(defun dbus-get-signatures (bus interface signal)
+  "Retrieve SIGNAL's type signatures from D-Bus.
+The result is a list of SIGNAL's type signatures.  Example:
+
+  \(\"s\" \"b\" \"ai\"\)
+
+This list represents 3 parameters of SIGNAL.  The first parameter
+is of type string, the second parameter is of type boolean, and
+the third parameter is of type array of integer.
+
+If INTERFACE or SIGNAL do not exist, or if they do not support
+the D-Bus method org.freedesktop.DBus.Introspectable.Introspect,
+the function returns nil."
+  (condition-case nil
+      (let ((introspect-xml
+            (with-temp-buffer
+              (insert (dbus-introspect bus interface))
+              (xml-parse-region (point-min) (point-max))))
+           node interfaces signals args result)
+       ;; Get the root node.
+       (setq node (xml-node-name introspect-xml))
+       ;; Get all interfaces.
+       (setq interfaces (xml-get-children node 'interface))
+       (while interfaces
+         (when (string-equal (xml-get-attribute (car interfaces) 'name)
+                             interface)
+           ;; That's the requested interface.  Check for signals.
+           (setq signals (xml-get-children (car interfaces) 'signal))
+           (while signals
+             (when (string-equal (xml-get-attribute (car signals) 'name)
+                                 signal)
+               ;; The signal we are looking for.
+               (setq args (xml-get-children (car signals) 'arg))
+               (while args
+                 (unless (xml-get-attribute (car args) 'type)
+                   ;; This shouldn't happen, let's escape.
+                   (signal 'dbus-error ""))
+                 ;; We append the signature.
+                 (setq
+                  result (append result
+                                 (list (xml-get-attribute (car args) 'type))))
+                 (setq args (cdr args)))
+               (setq signals nil))
+             (setq signals (cdr signals)))
+           (setq interfaces nil))
+         (setq interfaces (cdr interfaces)))
+       result)
+    ;; We ignore `dbus-error'.  There might be no introspectable interface.
+    (dbus-error nil)))
+) ;; (if nil ...
+
+(provide 'dbus)
+
+;; arch-tag: a47caf84-9162-4811-90cc-5d388e37b9bd
+;;; dbus.el ends here
similarity index 97%
rename from lisp/gnus/dig.el
rename to lisp/net/dig.el
index 9d62fdc9919504b559ca2fbfe839c43f64786da9..cee3a5c17cc48114c5d041f5db68472b20536ec8 100644 (file)
@@ -151,7 +151,10 @@ Buffer should contain output generated by `dig-invoke'."
         '(dig-font-lock-keywords t)))
   (when (featurep 'font-lock)
     (font-lock-set-defaults))
-  (gnus-run-mode-hooks 'dig-mode-hook))
+  (save-current-buffer
+    (if (fboundp 'run-mode-hooks)
+        (run-mode-hooks 'dig-mode-hook)
+      (run-hooks 'dig-mode-hook))))
 
 (defun dig-exit ()
   "Quit dig output buffer."
similarity index 54%
rename from lisp/gnus/dns.el
rename to lisp/net/dns.el
index 7910261125aadc7a1421a82bebaab089c650d1b6..9f8776ed709001b879a9d6f95d2ab784af330690 100644 (file)
@@ -1,6 +1,7 @@
 ;;; dns.el --- Domain Name Service lookups
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
+;;   Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: network
 
 ;;; Code:
 
-(eval-when-compile (require 'cl))
-
-(require 'mm-util)
-
 (defvar dns-timeout 5
   "How many seconds to wait when doing DNS queries.")
 
@@ -105,10 +102,11 @@ If nil, /etc/resolv.conf will be consulted.")
   (dns-write-bytes 0))
 
 (defun dns-read-string-name (string buffer)
-  (mm-with-unibyte-buffer
-    (insert string)
-    (goto-char (point-min))
-    (dns-read-name buffer)))
+  (let (default-enable-multibyte-characters)
+    (with-temp-buffer
+      (insert string)
+      (goto-char (point-min))
+      (dns-read-name buffer))))
 
 (defun dns-read-name (&optional buffer)
   (let ((ended nil)
@@ -188,71 +186,72 @@ If TCP-P, the first two bytes of the package with be the length field."
     (buffer-string)))
 
 (defun dns-read (packet)
-  (mm-with-unibyte-buffer
-    (let ((spec nil)
-         queries answers authorities additionals)
-      (insert packet)
-      (goto-char (point-min))
-      (push (list 'id (dns-read-bytes 2)) spec)
-      (let ((byte (dns-read-bytes 1)))
-       (push (list 'response-p (if (zerop (logand byte (lsh 1 7))) nil t))
-             spec)
-       (let ((opcode (logand byte (lsh 7 3))))
-         (push (list 'opcode
-                     (cond ((eq opcode 0) 'query)
-                           ((eq opcode 1) 'inverse-query)
-                           ((eq opcode 2) 'status)))
-               spec))
-       (push (list 'authoritative-p (if (zerop (logand byte (lsh 1 2)))
-                                        nil t)) spec)
-       (push (list 'truncated-p (if (zerop (logand byte (lsh 1 2))) nil t))
-             spec)
-       (push (list 'recursion-desired-p
-                   (if (zerop (logand byte (lsh 1 0))) nil t)) spec))
-      (let ((rc (logand (dns-read-bytes 1) 15)))
-       (push (list 'response-code
-                   (cond
-                    ((eq rc 0) 'no-error)
-                    ((eq rc 1) 'format-error)
-                    ((eq rc 2) 'server-failure)
-                    ((eq rc 3) 'name-error)
-                    ((eq rc 4) 'not-implemented)
-                    ((eq rc 5) 'refused)))
-             spec))
-      (setq queries (dns-read-bytes 2))
-      (setq answers (dns-read-bytes 2))
-      (setq authorities (dns-read-bytes 2))
-      (setq additionals (dns-read-bytes 2))
-      (let ((qs nil))
-       (dotimes (i queries)
-         (push (list (dns-read-name)
-                     (list 'type (dns-inverse-get (dns-read-bytes 2)
-                                                  dns-query-types))
-                     (list 'class (dns-inverse-get (dns-read-bytes 2)
-                                                   dns-classes)))
-               qs))
-       (push (list 'queries qs) spec))
-    (dolist (slot '(answers authorities additionals))
-      (let ((qs nil)
-           type)
-       (dotimes (i (symbol-value slot))
-         (push (list (dns-read-name)
-                     (list 'type
-                           (setq type (dns-inverse-get (dns-read-bytes 2)
-                                                       dns-query-types)))
-                     (list 'class (dns-inverse-get (dns-read-bytes 2)
-                                                   dns-classes))
-                     (list 'ttl (dns-read-bytes 4))
-                     (let ((length (dns-read-bytes 2)))
-                       (list 'data
-                             (dns-read-type
-                              (buffer-substring
-                               (point)
-                               (progn (forward-char length) (point)))
-                              type))))
-               qs))
-       (push (list slot qs) spec)))
-    (nreverse spec))))
+  (let (default-enable-multibyte-characters)
+    (with-temp-buffer
+      (let ((spec nil)
+            queries answers authorities additionals)
+        (insert packet)
+        (goto-char (point-min))
+        (push (list 'id (dns-read-bytes 2)) spec)
+        (let ((byte (dns-read-bytes 1)))
+          (push (list 'response-p (if (zerop (logand byte (lsh 1 7))) nil t))
+                spec)
+          (let ((opcode (logand byte (lsh 7 3))))
+            (push (list 'opcode
+                        (cond ((eq opcode 0) 'query)
+                              ((eq opcode 1) 'inverse-query)
+                              ((eq opcode 2) 'status)))
+                  spec))
+          (push (list 'authoritative-p (if (zerop (logand byte (lsh 1 2)))
+                                           nil t)) spec)
+          (push (list 'truncated-p (if (zerop (logand byte (lsh 1 2))) nil t))
+                spec)
+          (push (list 'recursion-desired-p
+                      (if (zerop (logand byte (lsh 1 0))) nil t)) spec))
+        (let ((rc (logand (dns-read-bytes 1) 15)))
+          (push (list 'response-code
+                      (cond
+                       ((eq rc 0) 'no-error)
+                       ((eq rc 1) 'format-error)
+                       ((eq rc 2) 'server-failure)
+                       ((eq rc 3) 'name-error)
+                       ((eq rc 4) 'not-implemented)
+                       ((eq rc 5) 'refused)))
+                spec))
+        (setq queries (dns-read-bytes 2))
+        (setq answers (dns-read-bytes 2))
+        (setq authorities (dns-read-bytes 2))
+        (setq additionals (dns-read-bytes 2))
+        (let ((qs nil))
+          (dotimes (i queries)
+            (push (list (dns-read-name)
+                        (list 'type (dns-inverse-get (dns-read-bytes 2)
+                                                     dns-query-types))
+                        (list 'class (dns-inverse-get (dns-read-bytes 2)
+                                                      dns-classes)))
+                  qs))
+          (push (list 'queries qs) spec))
+        (dolist (slot '(answers authorities additionals))
+          (let ((qs nil)
+                type)
+            (dotimes (i (symbol-value slot))
+              (push (list (dns-read-name)
+                          (list 'type
+                                (setq type (dns-inverse-get (dns-read-bytes 2)
+                                                            dns-query-types)))
+                          (list 'class (dns-inverse-get (dns-read-bytes 2)
+                                                        dns-classes))
+                          (list 'ttl (dns-read-bytes 4))
+                          (let ((length (dns-read-bytes 2)))
+                            (list 'data
+                                  (dns-read-type
+                                   (buffer-substring
+                                    (point)
+                                    (progn (forward-char length) (point)))
+                                   type))))
+                    qs))
+            (push (list slot qs) spec)))
+        (nreverse spec)))))
 
 (defun dns-read-int32 ()
   ;; Full 32 bit Integers can't be handled by Emacs.  If we use
@@ -264,38 +263,40 @@ If TCP-P, the first two bytes of the package with be the length field."
   (let ((buffer (current-buffer))
        (point (point)))
     (prog1
-       (mm-with-unibyte-buffer
-         (insert string)
-         (goto-char (point-min))
-         (cond
-          ((eq type 'A)
-           (let ((bytes nil))
-             (dotimes (i 4)
-               (push (dns-read-bytes 1) bytes))
-             (mapconcat 'number-to-string (nreverse bytes) ".")))
-          ((eq type 'AAAA)
-           (let (hextets)
-             (dotimes (i 8)
-               (push (dns-read-bytes 2) hextets))
-             (mapconcat (lambda (n) (format "%x" n)) (nreverse hextets) ":")))
-          ((eq type 'SOA)
-           (list (list 'mname (dns-read-name buffer))
-                 (list 'rname (dns-read-name buffer))
-                 (list 'serial (dns-read-int32))
-                 (list 'refresh (dns-read-int32))
-                 (list 'retry (dns-read-int32))
-                 (list 'expire (dns-read-int32))
-                 (list 'minimum (dns-read-int32))))
-          ((eq type 'SRV)
-           (list (list 'priority (dns-read-bytes 2))
-                 (list 'weight (dns-read-bytes 2))
-                 (list 'port (dns-read-bytes 2))
-                 (list 'target (dns-read-name buffer))))
-          ((eq type 'MX)
-           (cons (dns-read-bytes 2) (dns-read-name buffer)))
-          ((or (eq type 'CNAME) (eq type 'NS) (eq type 'PTR))
-           (dns-read-string-name string buffer))
-          (t string)))
+        (let (default-enable-multibyte-characters)
+          (with-temp-buffer
+            (insert string)
+            (goto-char (point-min))
+            (cond
+             ((eq type 'A)
+              (let ((bytes nil))
+                (dotimes (i 4)
+                  (push (dns-read-bytes 1) bytes))
+                (mapconcat 'number-to-string (nreverse bytes) ".")))
+             ((eq type 'AAAA)
+              (let (hextets)
+                (dotimes (i 8)
+                  (push (dns-read-bytes 2) hextets))
+                (mapconcat (lambda (n) (format "%x" n))
+                           (nreverse hextets) ":")))
+             ((eq type 'SOA)
+              (list (list 'mname (dns-read-name buffer))
+                    (list 'rname (dns-read-name buffer))
+                    (list 'serial (dns-read-int32))
+                    (list 'refresh (dns-read-int32))
+                    (list 'retry (dns-read-int32))
+                    (list 'expire (dns-read-int32))
+                    (list 'minimum (dns-read-int32))))
+             ((eq type 'SRV)
+              (list (list 'priority (dns-read-bytes 2))
+                    (list 'weight (dns-read-bytes 2))
+                    (list 'port (dns-read-bytes 2))
+                    (list 'target (dns-read-name buffer))))
+             ((eq type 'MX)
+              (cons (dns-read-bytes 2) (dns-read-name buffer)))
+             ((or (eq type 'CNAME) (eq type 'NS) (eq type 'PTR))
+              (dns-read-string-name string buffer))
+             (t string))))
       (goto-char point))))
 
 (defun dns-parse-resolv-conf ()
@@ -377,48 +378,51 @@ If REVERSEP, look up an IP address."
 
   (if (not dns-servers)
       (message "No DNS server configuration found")
-    (mm-with-unibyte-buffer
-      (let ((process (condition-case ()
-                        (dns-make-network-process (car dns-servers))
-                      (error
-                       (message "dns: Got an error while trying to talk to %s"
-                                (car dns-servers))
-                       nil)))
-           (tcp-p (and (not (fboundp 'make-network-process))
-                       (not (featurep 'xemacs))))
-           (step 100)
-           (times (* dns-timeout 1000))
-           (id (random 65000)))
-       (when process
-         (process-send-string
-          process
-          (dns-write `((id ,id)
-                       (opcode query)
-                       (queries ((,name (type ,type))))
-                       (recursion-desired-p t))
-                     tcp-p))
-         (while (and (zerop (buffer-size))
-                     (> times 0))
-           (sit-for (/ step 1000.0))
-           (accept-process-output process 0 step)
-           (decf times step))
-         (ignore-errors
-           (delete-process process))
-         (when (and tcp-p
-                    (>= (buffer-size) 2))
-           (goto-char (point-min))
-           (delete-region (point) (+ (point) 2)))
-         (when (and (>= (buffer-size) 2)
-                    ;; We had a time-out.
-                    (> times 0))
-           (let ((result (dns-read (buffer-string))))
-             (if fullp
-                 result
-               (let ((answer (car (dns-get 'answers result))))
-                 (when (eq type (dns-get 'type answer))
-                   (if (eq type 'TXT)
-                       (dns-get-txt-answer (dns-get 'answers result))
-                     (dns-get 'data answer))))))))))))
+    (let (default-enable-multibyte-characters)
+      (with-temp-buffer
+        (let ((process (condition-case ()
+                           (dns-make-network-process (car dns-servers))
+                         (error
+                          (message
+                           "dns: Got an error while trying to talk to %s"
+                           (car dns-servers))
+                          nil)))
+              (tcp-p (and (not (fboundp 'make-network-process))
+                          (not (featurep 'xemacs))))
+              (step 100)
+              (times (* dns-timeout 1000))
+              (id (random 65000)))
+          (when process
+            (process-send-string
+             process
+             (dns-write `((id ,id)
+                          (opcode query)
+                          (queries ((,name (type ,type))))
+                          (recursion-desired-p t))
+                        tcp-p))
+            (while (and (zerop (buffer-size))
+                        (> times 0))
+              (sit-for (/ step 1000.0))
+              (accept-process-output process 0 step)
+              (setq times (- times step)))
+            (condition-case nil
+                (delete-process process)
+              (error nil))
+            (when (and tcp-p
+                       (>= (buffer-size) 2))
+              (goto-char (point-min))
+              (delete-region (point) (+ (point) 2)))
+            (when (and (>= (buffer-size) 2)
+                       ;; We had a time-out.
+                       (> times 0))
+              (let ((result (dns-read (buffer-string))))
+                (if fullp
+                    result
+                  (let ((answer (car (dns-get 'answers result))))
+                    (when (eq type (dns-get 'type answer))
+                      (if (eq type 'TXT)
+                          (dns-get-txt-answer (dns-get 'answers result))
+                        (dns-get 'data answer)))))))))))))
 
 (provide 'dns)
 
index 58168778e3e0fc979c660bc6909aa17e2926bc15..60a57711d2a4f93b2b661dacfce0d7693d2fda84 100644 (file)
@@ -158,6 +158,11 @@ LOCATION is used as the address location for bbdb."
            (or state "")
            zip)))
 
+;; External.
+(declare-function bbdb-parse-phone-number "ext:bbdb-com"
+                  (string &optional number-type))
+(declare-function bbdb-string-trim "ext:bbdb" (string))
+
 (defun eudc-bbdbify-phone (phone location)
   "Parse PHONE into a vector compatible with BBDB.
 PHONE is either a string supposedly containing a phone number or
index 7e37d9d41230266be98c2313ceda248f38eac703..ef1379eee52af6c03d35d7103a73cc9b303ea4ce 100644 (file)
        eudc-bbdb-current-query)
       record)))
 
+;; External.
+(declare-function bbdb-phone-location   "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-phone-string     "ext:bbdb" (phone))
+(declare-function bbdb-record-phones    "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-address-streets  "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-address-city     "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-address-state    "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-address-zip      "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-address-location "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-record-addresses "ext:bbdb" t) ; via bbdb-defstruct
+(declare-function bbdb-records          "ext:bbdb"
+                  (&optional dont-check-disk already-in-db-buffer))
+
 (defun eudc-bbdb-extract-phones (record)
   (mapcar (function
           (lambda (phone)
 
 (defun eudc-bbdb-extract-addresses (record)
   (let (s c val)
-    (mapcar (function
-            (lambda (address)
-              (setq val (concat (unless (= 0 (length (setq s (bbdb-address-street1 address))))
-                                  (concat s "\n"))
-                                (unless (= 0 (length (setq s (bbdb-address-street2 address))))
-                                  (concat s "\n"))
-                                (unless (= 0 (length (setq s (bbdb-address-street3 address))))
-                                  (concat s "\n"))
-                                (progn
-                                  (setq c (bbdb-address-city address))
-                                  (setq s (bbdb-address-state address))
-                                  (if (and (> (length c) 0) (> (length s) 0))
-                                      (concat c ", " s " ")
-                                    (concat c " ")))
-                                (bbdb-address-zip-string address)))
-              (if eudc-bbdb-use-locations-as-attribute-names
-                  (cons (intern (bbdb-address-location address)) val)
-                (cons 'addresses (concat (bbdb-address-location address) "\n" val)))))
-           (bbdb-record-addresses record))))
+    (mapcar (lambda (address)
+              (setq c (bbdb-address-streets address))
+              (dotimes (n 3)
+                (unless (zerop (length (setq s (nth n c))))
+                  (setq val (concat val s "\n"))))
+              (setq c (bbdb-address-city address)
+                    s (bbdb-address-state address))
+              (setq val (concat val
+                                (if (and (> (length c) 0) (> (length s) 0))
+                                    (concat c ", " s)
+                                  c)
+                                " "
+                                (bbdb-address-zip address)))
+              (if eudc-bbdb-use-locations-as-attribute-names
+                  (cons (intern (bbdb-address-location address)) val)
+                (cons 'addresses (concat (bbdb-address-location address)
+                                         "\n" val))))
+            (bbdb-record-addresses record))))
 
 (defun eudc-bbdb-format-record-as-result (record)
   "Format the BBDB RECORD as a EUDC query result record.
similarity index 81%
rename from lisp/gnus/hmac-def.el
rename to lisp/net/hmac-def.el
index 58491ec4f4a1b659e66b2c8237de42dfde586dcf..bfff7282adfd9126a6bada21e8b9d81b55ff20ec 100644 (file)
@@ -1,25 +1,25 @@
 ;;; hmac-def.el --- A macro for defining HMAC functions.
 
-;; Copyright (C) 1999, 2001  Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2001, 2007  Free Software Foundation, Inc.
 
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
 ;; Keywords: HMAC, RFC 2104
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or
-;; (at your option) any later version.
+;; 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, or (at your option)
+;; any later version.
 
-;; This program is distributed in the hope that it will be useful,
+;; 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 this program; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
similarity index 80%
rename from lisp/gnus/hmac-md5.el
rename to lisp/net/hmac-md5.el
index 21fc91992ad7380d62e9157ae73a91d00bf35245..186708446f0dde441175b6b6b50e4e4b5ba5bbe0 100644 (file)
@@ -1,25 +1,25 @@
 ;;; hmac-md5.el --- Compute HMAC-MD5.
 
-;; Copyright (C) 1999, 2001  Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2001, 2007  Free Software Foundation, Inc.
 
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
 ;; Keywords: HMAC, RFC 2104, HMAC-MD5, MD5, KEYED-MD5, CRAM-MD5
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or
-;; (at your option) any later version.
+;; 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, or (at your option)
+;; any later version.
 
-;; This program is distributed in the hope that it will be useful,
+;; 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 this program; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
similarity index 99%
rename from lisp/gnus/imap.el
rename to lisp/net/imap.el
index 7643ef4a53dd3328d2eb18d467e137c3d567d194..8e41c68720b4baf20ba1d609dc0bb5c75a011260 100644 (file)
@@ -966,6 +966,13 @@ Returns t if login was successful, nil otherwise."
          (imap-capability nil buffer))
     mecs))
 
+(declare-function sasl-find-mechanism "sasl" (mechanism))
+(declare-function sasl-mechanism-name "sasl" (mechanism))
+(declare-function sasl-make-client    "sasl" (mechanism name service server))
+(declare-function sasl-next-step      "sasl" (client step))
+(declare-function sasl-step-data      "sasl" (step))
+(declare-function sasl-step-set-data  "sasl" (step data))
+
 (defun imap-sasl-auth-p (buffer)
   (and (condition-case ()
           (require 'sasl)
@@ -1526,10 +1533,11 @@ or 'unseen.  The IMAP command tag is returned."
     (imap-send-command (list "STATUS \""
                             (imap-utf7-encode mailbox)
                             "\" "
-                            (format "%s"
-                                    (if (listp items)
-                                        items
-                                      (list items)))))))
+                            (upcase
+                             (format "%s"
+                                     (if (listp items)
+                                         items
+                                       (list items))))))))
 
 (defun imap-mailbox-acl-get (&optional mailbox buffer)
   "Get ACL on mailbox from server in BUFFER."
@@ -2517,7 +2525,7 @@ Return nil if no complete line has arrived."
       (while (and (not (eq (char-after) ?\)))
                  (or (forward-char) t)
                  (looking-at "\\([A-Za-z]+\\) "))
-       (let ((token (match-string 1)))
+       (let ((token (upcase (match-string 1))))
          (goto-char (match-end 0))
          (cond ((string= token "MESSAGES")
                 (imap-mailbox-put 'messages (read (current-buffer)) mailbox))
index 8c4b0a08f5122151567cc63a41516536d201d4ce..da9182e7cdd7b18bcb40fa6ce798a9c9633cbdde 100644 (file)
   (if (fboundp 'point-at-eol)
       'point-at-eol
     'line-end-position))
-;; autoload encrypt
-
-(eval-and-compile
-  (autoload 'encrypt-find-model "encrypt")
-  (autoload 'encrypt-insert-file-contents "encrypt"))
 
 (defgroup netrc nil
  "Netrc configuration."
       (let ((tokens '("machine" "default" "login"
                      "password" "account" "macdef" "force"
                      "port"))
-           (encryption-model (encrypt-find-model file))
            alist elem result pair)
-
-       (if encryption-model
-           (encrypt-insert-file-contents file encryption-model)
-         (insert-file-contents file))
-
+       (insert-file-contents file)
        (goto-char (point-min))
        ;; Go through the file, line by line.
        (while (not (eobp))
@@ -190,8 +180,7 @@ MODE can be \"login\" or \"password\", suitable for passing to
     (setq type (or type 'tcp))
     (while (and (setq service (pop services))
                (not (and (= number (cadr service))
-                         (eq type (caddr service)))))
-      )
+                         (eq type (car (cddr service)))))))
     (car service)))
 
 (defun netrc-find-service-number (name &optional type)
@@ -200,8 +189,7 @@ MODE can be \"login\" or \"password\", suitable for passing to
     (setq type (or type 'tcp))
     (while (and (setq service (pop services))
                (not (and (string= name (car service))
-                         (eq type (caddr service)))))
-      )
+                         (eq type (car (cddr service)))))))
     (cadr service)))
 
 (provide 'netrc)
index 735d946346dd9615ee29460e957730d4493eca1e..32d2c43f2118db33a5ec5bb5dd75dd042b0e9197 100644 (file)
@@ -2600,6 +2600,9 @@ If URL is nil it is searched at point."
   (add-to-list 'newsticker-url-list (list name url nil nil nil) t)
   (customize-variable 'newsticker-url-list))
 
+;; External.
+(declare-function w3m-toggle-inline-image "ext:w3m" (&optional force no-cache))
+
 (defun newsticker-w3m-show-inline-images ()
   "Show inline images in visible text ranges.
 In-line images in invisible text ranges are hidden.  This function
@@ -4843,6 +4846,11 @@ The face is chosen according the values of NT-FACE and AGE."
 ;; ======================================================================
 ;;; HTML rendering
 ;; ======================================================================
+
+;; External.
+(declare-function htmlr-reset "ext:htmlr" ())
+(declare-function htmlr-step  "ext:htmlr" ())
+
 (defun newsticker-htmlr-render (pos1 pos2) ;
   "Replacement for `htmlr-render'.
 Renders the HTML code in the region POS1 to POS2 using htmlr."
similarity index 98%
rename from lisp/gnus/ntlm.el
rename to lisp/net/ntlm.el
index edea2c3048a7ce982a4824699bd1106198f20310..126f6688f0d64b261697ae1288407d7c141dfac6 100644 (file)
@@ -1,23 +1,26 @@
 ;;; ntlm.el --- NTLM (NT LanManager) authentication support
 
-;; Copyright (C) 2001 Taro Kawagishi
+;; Copyright (C) 2001, 2007  Free Software Foundation, Inc.
+
 ;; Author: Taro Kawagishi <tarok@transpulse.org>
 ;; Keywords: NTLM, SASL
 ;; Version: 1.00
 ;; Created: February 2001
 
-;; This program is free software; you can redistribute it and/or modify
+;; 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, or (at your option)
 ;; any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
similarity index 63%
rename from lisp/gnus/sasl-cram.el
rename to lisp/net/sasl-cram.el
index b8b1ced82ac87984c8e171bf75401591f0be2062..32f1e69f81fa9d7fe5c3dca5767a2027d34b77b0 100644 (file)
@@ -1,25 +1,25 @@
 ;;; sasl-cram.el --- CRAM-MD5 module for the SASL client framework
 
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2007  Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;;     Kenichi OKADA <okada@opaopa.org>
 ;; Keywords: SASL, CRAM-MD5
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or (at
-;; your option) any later version.
+;; 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, 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.
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
similarity index 87%
rename from lisp/gnus/sasl-digest.el
rename to lisp/net/sasl-digest.el
index c290c7524c8313db5bc2a31e6d80e9a29904f7c4..6c544518e7f1f424021d3e4ad167db4f32459b64 100644 (file)
@@ -1,28 +1,30 @@
 ;;; sasl-digest.el --- DIGEST-MD5 module for the SASL client framework
 
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2007  Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;;     Kenichi OKADA <okada@opaopa.org>
 ;; Keywords: SASL, DIGEST-MD5
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or (at
-;; your option) any later version.
+;; 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, 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.
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
+;;; Commentary:
+
 ;; This program is implemented from draft-leach-digest-sasl-05.txt.
 ;;
 ;; It is caller's responsibility to base64-decode challenges and
similarity index 87%
rename from lisp/gnus/sasl-ntlm.el
rename to lisp/net/sasl-ntlm.el
index 784b373c056817e30580abb5de76875a6b054213..cd8304db70ad9ff9cd10c48429424222ea01e16c 100644 (file)
@@ -1,24 +1,26 @@
 ;;; sasl-ntlm.el --- NTLM (NT Lan Manager) module for the SASL client framework
 
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2007  Free Software Foundation, Inc.
 
 ;; Author: Taro Kawagishi <tarok@transpulse.org>
 ;; Keywords: SASL, NTLM
 ;; Version: 1.00
 ;; Created: February 2001
 
-;; This program is free software; you can redistribute it and/or modify
+;; 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, or (at your option)
 ;; any later version.
-;;
-;; This program is distributed in the hope that it will be useful,
+
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
similarity index 92%
rename from lisp/gnus/sasl.el
rename to lisp/net/sasl.el
index d730dddcb2088aa21fecc600cbd8885945c0932b..9118d288da46d8ab38ab31c4b418a3363692efd4 100644 (file)
@@ -1,24 +1,24 @@
 ;;; sasl.el --- SASL client framework
 
-;; Copyright (C) 2000 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2007  Free Software Foundation, Inc.
 
 ;; Author: Daiki Ueno <ueno@unixuser.org>
 ;; Keywords: SASL
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or (at
-;; your option) any later version.
+;; 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, 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.
+;; 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 this program; see the file COPYING.  If not, write to the
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
index fd8e7ec59f27ca0f368842d27e609abdc7c5988e..b06c9db0396c979cbe27cd0dccebcf18e1585d99 100644 (file)
@@ -335,6 +335,19 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
     )
   )
 
+(declare-function socks-original-open-network-stream "socks") ; fset
+
+(defvar socks-override-functions nil
+  "*Whether to overwrite the open-network-stream function with the SOCKSified
+version.")
+
+(if (fboundp 'socks-original-open-network-stream)
+    nil                                ; Do nothing, we've been here already
+  (defalias 'socks-original-open-network-stream
+    (symbol-function 'open-network-stream))
+  (if socks-override-functions
+      (defalias 'open-network-stream 'socks-open-network-stream)))
+
 (defun socks-open-connection (server-info)
   (interactive)
   (save-excursion
@@ -473,17 +486,6 @@ If PATTERN is omitted, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
       (setq noproxy (cdr noproxy)))
     route))
 
-(defvar socks-override-functions nil
-  "*Whether to overwrite the open-network-stream function with the SOCKSified
-version.")
-
-(if (fboundp 'socks-original-open-network-stream)
-    nil                                ; Do nothing, we've been here already
-  (defalias 'socks-original-open-network-stream
-    (symbol-function 'open-network-stream))
-  (if socks-override-functions
-      (defalias 'open-network-stream 'socks-open-network-stream)))
-
 (defvar socks-services-file "/etc/services")
 (defvar socks-tcp-services (make-hash-table :size 13 :test 'equal))
 (defvar socks-udp-services (make-hash-table :size 13 :test 'equal))
index 104cb9912546c744e7c9aa91a877632d0f2c81ce..594212923c2dbe8a3ca62463cf92043a28fab05d 100644 (file)
@@ -85,26 +85,93 @@ and `gnutls-cli' (version 2.0.1) output."
 Each entry in the list is tried until a connection is successful.
 %h is replaced with server hostname, %p with port to connect to.
 The program should read input on stdin and write output to
-stdout.  Also see `tls-success' for what the program should output
-after successful negotiation."
-  :type '(repeat string)
+stdout.
+
+See `tls-checktrust' on how to check trusted root certs.
+
+Also see `tls-success' for what the program should output after
+successful negotiation."
+  :type
+  '(choice
+    (list :tag "Choose commands"
+         :value
+         ("gnutls-cli -p %p %h"
+          "gnutls-cli -p %p %h --protocols ssl3"
+          "openssl s_client -connect %h:%p -no_ssl2")
+         (set :inline t
+              ;; FIXME: add brief `:tag "..."' descriptions.
+              ;; (repeat :inline t :tag "Other" (string))
+              ;; See `tls-checktrust':
+              (const "gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p %p %h")
+              (const "gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p %p %h --protocols ssl3")
+              (const "openssl s_client -connect %h:%p -CAfile /etc/ssl/certs/ca-certificates.crt -no_ssl2")
+              ;; No trust check:
+              (const "gnutls-cli -p %p %h")
+              (const "gnutls-cli -p %p %h --protocols ssl3")
+              (const "openssl s_client -connect %h:%p -no_ssl2"))
+         (repeat :inline t :tag "Other" (string)))
+    (const :tag "Default list of commands"
+          ("gnutls-cli -p %p %h"
+           "gnutls-cli -p %p %h --protocols ssl3"
+           "openssl s_client -connect %h:%p -no_ssl2"))
+    (list :tag "List of commands"
+         (repeat :tag "Command" (string))))
   :version "22.1"
   :group 'tls)
 
 (defcustom tls-process-connection-type nil
-  "*Value for `process-connection-type' to use when starting TLS process."
+  "Value for `process-connection-type' to use when starting TLS process."
   :version "22.1"
   :type 'boolean
   :group 'tls)
 
 (defcustom tls-success "- Handshake was completed\\|SSL handshake has read "
-  "*Regular expression indicating completed TLS handshakes.
+  "Regular expression indicating completed TLS handshakes.
 The default is what GNUTLS's \"gnutls-cli\" or OpenSSL's
 \"openssl s_client\" outputs."
   :version "22.1"
   :type 'regexp
   :group 'tls)
 
+(defcustom tls-checktrust nil
+  "Indicate if certificates should be checked against trusted root certs.
+If this is `ask', the user can decide whether to accept an
+untrusted certificate.  You may have to adapt `tls-program' in
+order to make this feature work properly, i.e., to ensure that
+the external program knows about the root certificates you
+consider trustworthy, e.g.:
+
+\(setq tls-program
+      '(\"gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p %p %h\"
+       \"gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p %p %h --protocols ssl3\"
+       \"openssl s_client -connect %h:%p -CAfile /etc/ssl/certs/ca-certificates.crt -no_ssl2\"))"
+  :type '(choice (const :tag "Always" t)
+                (const :tag "Never" nil)
+                (const :tag "Ask" ask))
+  :version "23.0" ;; No Gnus
+  :group 'tls)
+
+(defcustom tls-untrusted
+  "- Peer's certificate is NOT trusted\\|Verify return code: \\([^0] \\|.[^ ]\\)"
+  "Regular expression indicating failure of TLS certificate verification.
+The default is what GNUTLS's \"gnutls-cli\" or OpenSSL's
+\"openssl s_client\" return in the event of unsuccessful
+verification."
+  :type 'regexp
+  :version "23.0" ;; No Gnus
+  :group 'tls)
+
+(defcustom tls-hostmismatch
+  "# The hostname in the certificate does NOT match"
+  "Regular expression indicating a host name mismatch in certificate.
+When the host name specified in the certificate doesn't match the
+name of the host you are connecting to, gnutls-cli issues a
+warning to this effect.  There is no such feature in openssl.  Set
+this to nil if you want to ignore host name mismatches."
+  :type 'regexp
+  :version "23.0" ;; No Gnus
+  :group 'tls)
+
 (defcustom tls-certtool-program (executable-find "certtool")
   "Name of  GnuTLS certtool.
 Used by `tls-certificate-information'."
@@ -141,7 +208,7 @@ Returns a subprocess-object to represent the connection.
 Input and output work as for subprocesses; `delete-process' closes it.
 Args are NAME BUFFER HOST PORT.
 NAME is name for process.  It is modified if necessary to make it unique.
-BUFFER is the buffer (or buffer-name) to associate with the process.
+BUFFER is the buffer (or buffer name) to associate with the process.
  Process output goes at end of that buffer, unless you specify
  an output stream or filter function to handle the output.
  BUFFER may be also nil, meaning that this process is not associated
@@ -177,25 +244,31 @@ Fourth arg PORT is an integer specifying a port to connect to."
              (sit-for 1)))
          (message "Opening TLS connection with `%s'...%s" cmd
                   (if done "done" "failed"))
-         (if (not done)
-             (delete-process process)
-           ;; advance point to after all informational messages that
-           ;; `openssl s_client' and `gnutls' print
-           (let ((start-of-data nil))
-             (while
-                 (not (setq start-of-data
-                            ;; the string matching `tls-end-of-info'
-                            ;; might come in separate chunks from
-                            ;; `accept-process-output', so start the
-                            ;; search where `tls-success' ended
-                            (save-excursion
-                              (if (re-search-forward tls-end-of-info nil t)
-                                  (match-end 0)))))
-               (accept-process-output process 1))
-             (if start-of-data
-                 ;; move point to start of client data
-                 (goto-char start-of-data)))
-           (setq done process))))
+         (if done
+             (setq done process)
+           (delete-process process))))
+      (when done
+       (save-excursion
+         (set-buffer buffer)
+         (when
+             (or
+              (and tls-checktrust
+                   (progn
+                     (goto-char (point-min))
+                     (re-search-forward tls-untrusted nil t))
+                   (or
+                    (and (not (eq tls-checktrust 'ask))
+                         (message "The certificate presented by `%s' is NOT trusted." host))
+                    (not (yes-or-no-p
+                          (format "The certificate presented by `%s' is NOT trusted. Accept anyway? " host)))))
+              (and tls-hostmismatch
+                   (progn
+                     (goto-char (point-min))
+                     (re-search-forward tls-hostmismatch nil t))
+                   (not (yes-or-no-p
+                         (format "Host name in certificate doesn't match `%s'. Connect anyway? " host)))))
+           (setq done nil)
+           (delete-process process))))
       (message "Opening TLS connection to `%s'...%s"
               host (if done "done" "failed")))
     (when use-temp-buffer
index a8b6bca44f2b8fcd40dd7c67fca73f8d69835540..c4edd2f3fa4e88714187f8ed02904cd59abd32c2 100644 (file)
@@ -152,6 +152,7 @@ pass to the OPERATION."
              (aset v 0 tramp-ftp-method)
              (tramp-set-connection-property v "started" t))
          nil))
+
        ;; If the second argument of `copy-file' or `rename-file' is a
        ;; remote file name but via FTP, ange-ftp doesn't check this.
        ;; We must copy it locally first, because there is no place in
@@ -163,8 +164,16 @@ pass to the OPERATION."
               (newname (cadr args))
               (tmpfile (tramp-compat-make-temp-file filename))
               (args (cddr args)))
-         (apply operation filename tmpfile args)
-         (rename-file tmpfile newname (car args))))
+         ;; We must set `ok-if-already-exists' to t in the first
+         ;; step, because the temp file has been created already.
+         (if (eq operation 'copy-file)
+             (apply operation filename tmpfile t (cdr args))
+           (apply operation filename tmpfile t))
+         (unwind-protect
+             (rename-file tmpfile newname (car args))
+           ;; Cleanup.
+           (ignore-errors (delete-file tmpfile)))))
+
        ;; Normally, the handlers must be discarded.
        (t (let* ((inhibit-file-name-handlers
                  (list 'tramp-file-name-handler
index 93fdea9ab272e80a6e2bf77598b75e8ee9432ca0..95959b15a7ce9e72203ff3cd89dab14f6db2326b 100644 (file)
@@ -83,7 +83,8 @@
 ;; be mandatory
 (if (featurep 'xemacs)
     (load "password" 'noerror)
-  (require 'password nil 'noerror))     ;from No Gnus, also in tar ball
+  (or (require 'password-cache nil 'noerror)
+      (require 'password nil 'noerror))) ; from No Gnus, also in tar ball
 
 (require 'shell)
 (require 'advice)
@@ -912,14 +913,6 @@ directories for POSIX compatible commands."
                  (const :tag "Default Directories" tramp-default-remote-path)
                  (string :tag "Directory"))))
 
-(defcustom tramp-terminal-type "dumb"
-  "*Value of TERM environment variable for logging in to remote host.
-Because Tramp wants to parse the output of the remote shell, it is easily
-confused by ANSI color escape sequences and suchlike.  Often, shell init
-files conditionalize this setup based on the TERM environment variable."
-  :group 'tramp
-  :type 'string)
-
 (defcustom tramp-remote-process-environment
   `("HISTFILE=$HOME/.tramp_history" "HISTSIZE=1" "LC_TIME=C"
     ,(concat "TERM=" tramp-terminal-type)
@@ -1425,6 +1418,18 @@ opening a connection to a remote host."
   :group 'tramp
   :type '(choice (const nil) (const t) (const pty)))
 
+(defcustom tramp-completion-reread-directory-timeout 10
+  "Defines seconds since last remote command before rereading a directory.
+A remote directory might have changed its contents.  In order to
+make it visible during file name completion in the minibuffer,
+Tramp flushes its cache and rereads the directory contents when
+more than `tramp-completion-reread-directory-timeout' seconds
+have been gone since last remote command execution.  A value of 0
+would require an immediate reread during filename completion, nil
+means to use always cached values for the directory contents."
+  :group 'tramp
+  :type '(choice (const nil) integer))
+
 ;;; Internal Variables:
 
 (defvar tramp-end-of-output
@@ -2807,6 +2812,16 @@ and gid of the corresponding user is taken.  Both parameters must be integers."
   "Like `file-name-all-completions' for Tramp files."
   (unless (save-match-data (string-match "/" filename))
     (with-parsed-tramp-file-name (expand-file-name directory) nil
+      ;; Flush the directory cache.  There could be changed directory
+      ;; contents.
+      (when (and (integerp tramp-completion-reread-directory-timeout)
+                (> (tramp-time-diff
+                    (current-time)
+                    (tramp-get-file-property
+                     v localname "last-completion" '(0 0 0)))
+                   tramp-completion-reread-directory-timeout))
+       (tramp-flush-file-property v localname))
+
       (all-completions
        filename
        (mapcar
@@ -2838,6 +2853,8 @@ and gid of the corresponding user is taken.  Both parameters must be integers."
                      (point) (tramp-compat-line-end-position))
                     result)))
 
+          (tramp-set-file-property
+           v localname "last-completion" (current-time))
           result)))))))
 
 ;; The following isn't needed for Emacs 20 but for 19.34?
@@ -4323,7 +4340,7 @@ ARGS are the arguments OPERATION has been called with."
    ; BUF
    ((member operation
            (list 'set-visited-file-modtime 'verify-visited-file-modtime
-                  ; Emacs 22 only
+                  ; since Emacs 22 only
                  'make-auto-save-file-name
                  ; XEmacs only
                  'backup-buffer))
@@ -5603,30 +5620,49 @@ seconds.  If not, it produces an error message with the given ERROR-ARGS."
   "Set up an interactive shell.
 Mainly sets the prompt and the echo correctly.  PROC is the shell
 process to set up.  VEC specifies the connection."
-  ;; It is useful to set the prompt in the following command because
-  ;; some people have a setting for $PS1 which /bin/sh doesn't know
-  ;; about and thus /bin/sh will display a strange prompt.  For
-  ;; example, if $PS1 has "${CWD}" in the value, then ksh will display
-  ;; the current working directory but /bin/sh will display a dollar
-  ;; sign.  The following command line sets $PS1 to a sane value, and
-  ;; works under Bourne-ish shells as well as csh-like shells.  Daniel
-  ;; Pittman reports that the unusual positioning of the single quotes
-  ;; makes it work under `rc', too.  We also unset the variable $ENV
-  ;; because that is read by some sh implementations (eg, bash when
-  ;; called as sh) on startup; this way, we avoid the startup file
-  ;; clobbering $PS1.  $PROMP_COMMAND is another way to set the prompt
-  ;; in /bin/bash, it must be discarded as well.
   (let ((tramp-end-of-output "$ "))
+    ;; It is useful to set the prompt in the following command because
+    ;; some people have a setting for $PS1 which /bin/sh doesn't know
+    ;; about and thus /bin/sh will display a strange prompt.  For
+    ;; example, if $PS1 has "${CWD}" in the value, then ksh will
+    ;; display the current working directory but /bin/sh will display
+    ;; a dollar sign.  The following command line sets $PS1 to a sane
+    ;; value, and works under Bourne-ish shells as well as csh-like
+    ;; shells.  Daniel Pittman reports that the unusual positioning of
+    ;; the single quotes makes it work under `rc', too.  We also unset
+    ;; the variable $ENV because that is read by some sh
+    ;; implementations (eg, bash when called as sh) on startup; this
+    ;; way, we avoid the startup file clobbering $PS1.  $PROMP_COMMAND
+    ;; is another way to set the prompt in /bin/bash, it must be
+    ;; discarded as well.
     (tramp-send-command
      vec
      (format
       "exec env 'ENV=' 'PROMPT_COMMAND=' 'PS1=$ ' PS2='' PS3='' %s"
       (tramp-get-method-parameter
        (tramp-file-name-method vec) 'tramp-remote-sh))
-     t))
+     t)
+
+    ;; Disable echo.
+    (tramp-message vec 5 "Setting up remote shell environment")
+    (tramp-send-command vec "stty -inlcr -echo kill '^U' erase '^H'" t)
+    ;; Check whether the echo has really been disabled.  Some
+    ;; implementations, like busybox of embedded GNU/Linux, don't
+    ;; support disabling.
+    (tramp-send-command vec "echo foo" t)
+    (with-current-buffer (process-buffer proc)
+      (goto-char (point-min))
+      (when (looking-at "echo foo")
+       (tramp-set-connection-property proc "remote-echo" t)
+       (tramp-message vec 5 "Remote echo still on. Ok.")
+       ;; Make sure backspaces and their echo are enabled and no line
+       ;; width magic interferes with them.
+       (tramp-send-command vec "stty icanon erase ^H cols 32767" t))))
+
   (tramp-message vec 5 "Setting shell prompt")
-  ;; Douglas Gray Stephens <DGrayStephens@slb.com> says that we must
-  ;; use "\n" here, not tramp-rsh-end-of-line.
+  ;; We can set $PS1 to `tramp-end-of-output' only when the echo has
+  ;; been disabled.  Otherwise, the echo of the command would be
+  ;; regarded as prompt already.
   (tramp-send-command
    vec
    (format "PROMPT_COMMAND=''; PS1='%s%s%s'; PS2=''; PS3=''"
@@ -5634,26 +5670,7 @@ process to set up.  VEC specifies the connection."
            tramp-end-of-output
           tramp-rsh-end-of-line)
    t)
-  ;; If the connection buffer is not empty, the remote shell is
-  ;; echoing, and the prompt has been detected through the echoed
-  ;; command.  We must reread for the real prompt.
-  (with-current-buffer (process-buffer proc)
-    (when (> (point-max) (point-min)) (tramp-wait-for-output proc)))
-  ;; Disable echo.
-  (tramp-message vec 5 "Setting up remote shell environment")
-  (tramp-send-command vec "stty -inlcr -echo kill '^U' erase '^H'" t)
-  ;; Check whether the echo has really been disabled.  Some
-  ;; implementations, like busybox of embedded GNU/Linux, don't
-  ;; support disabling.
-  (tramp-send-command vec "echo foo" t)
-  (with-current-buffer (process-buffer proc)
-    (goto-char (point-min))
-    (when (looking-at "echo foo")
-      (tramp-set-connection-property vec "remote-echo" t)
-      (tramp-message vec 5 "Remote echo still on. Ok.")
-      ;; Make sure backspaces and their echo are enabled and no line
-      ;; width magic interferes with them.
-      (tramp-send-command vec "stty icanon erase ^H cols 32767" t)))
+
   ;; Try to set up the coding system correctly.
   ;; CCC this can't be the right way to do it.  Hm.
   (tramp-message vec 5 "Determining coding system")
@@ -5685,11 +5702,30 @@ process to set up.  VEC specifies the connection."
        ;; stty, instead.
        (tramp-send-command vec "stty -onlcr" t))))
   (tramp-send-command vec "set +o vi +o emacs" t)
-  ;; Check whether the remote host suffers from buggy `send-process-string'.
-  ;; This is known for FreeBSD (see comment in `send_process', file process.c).
-  ;; I've tested sending 624 bytes successfully, sending 625 bytes failed.
-  ;; Emacs makes a hack when this host type is detected locally.  It cannot
-  ;; handle remote hosts, though.
+
+  ;; Check whether the output of "uname -sr" has been changed.  If
+  ;; yes, this is a strong indication that we must expire all
+  ;; connection properties.
+  (tramp-message vec 5 "Checking system information")
+  (let ((old-uname (tramp-get-connection-property vec "uname" nil))
+       (new-uname
+        (tramp-set-connection-property
+         vec "uname"
+         (tramp-send-command-and-read vec "echo \\\"`uname -sr`\\\""))))
+    (when (and (stringp old-uname) (not (string-equal old-uname new-uname)))
+      (funcall (symbol-function 'tramp-cleanup-connection) vec)
+      (signal
+       'quit
+       (list (format
+             "Connection reset, because remote host changed from `%s' to `%s'"
+             old-uname new-uname)))))
+
+  ;; Check whether the remote host suffers from buggy
+  ;; `send-process-string'.  This is known for FreeBSD (see comment in
+  ;; `send_process', file process.c).  I've tested sending 624 bytes
+  ;; successfully, sending 625 bytes failed.  Emacs makes a hack when
+  ;; this host type is detected locally.  It cannot handle remote
+  ;; hosts, though.
   (with-connection-property proc "chunksize"
     (cond
      ((and (integerp tramp-chunksize) (> tramp-chunksize 0))
@@ -5698,12 +5734,12 @@ process to set up.  VEC specifies the connection."
       (tramp-message
        vec 5 "Checking remote host type for `send-process-string' bug")
       (if (string-match
-          "^FreeBSD"
-          (with-connection-property vec "uname"
-            (tramp-send-command-and-read vec "echo \\\"`uname -sr`\\\"")))
+          "^FreeBSD" (tramp-get-connection-property vec "uname" ""))
          500 0))))
+
   ;; Set remote PATH variable.
   (tramp-set-remote-path vec)
+
   ;; Search for a good shell before searching for a command which
   ;; checks if a file exists. This is done because Tramp wants to use
   ;; "test foo; echo $?" to check if various conditions hold, and
@@ -5713,8 +5749,10 @@ process to set up.  VEC specifies the connection."
   ;; with buggy /bin/sh implementations will have a working bash or
   ;; ksh.  Whee...
   (tramp-find-shell vec)
+
   ;; Disable unexpected output.
   (tramp-send-command vec "mesg n; biff n" t)
+
   ;; Set the environment.
   (tramp-message vec 5 "Setting default environment")
   (let ((env (copy-sequence tramp-remote-process-environment))
@@ -6190,7 +6228,7 @@ is meant to be used from `tramp-maybe-open-connection' only.  The
 function waits for output unless NOOUTPUT is set."
   (unless neveropen (tramp-maybe-open-connection vec))
   (let ((p (tramp-get-connection-process vec)))
-    (when (tramp-get-connection-property vec "remote-echo" nil)
+    (when (tramp-get-connection-property p "remote-echo" nil)
       ;; We mark the command string that it can be erased in the output buffer.
       (tramp-set-connection-property p "check-remote-echo" t)
       (setq command (format "%s%s%s" tramp-echo-mark command tramp-echo-mark)))
@@ -6958,6 +6996,7 @@ If the `tramp-methods' entry does not exist, return NIL."
   (let ((bfn (buffer-file-name)))
     (when (and (stringp bfn)
               (tramp-tramp-file-p bfn)
+              (buffer-modified-p)
               (stringp buffer-auto-save-file-name)
               (not (equal bfn buffer-auto-save-file-name)))
       (unless (file-exists-p buffer-auto-save-file-name)
index 2de4fa025fd369a283eeabcf2567d66521e169d5..1841b51e3055356d7ae977d66aa9e1a4de889b7b 100644 (file)
@@ -969,9 +969,11 @@ INDENT indicates to put CS and CCS at the current indentation of
 the region rather than at left margin."
   ;;(assert (< beg end))
   (let ((no-empty (not (or (eq comment-empty-lines t)
-                          (and comment-empty-lines (zerop (length ce)))))))
+                          (and comment-empty-lines (zerop (length ce))))))
+       ce-sanitized)
     ;; Sanitize CE and CCE.
     (if (and (stringp ce) (string= "" ce)) (setq ce nil))
+    (setq ce-sanitized ce)
     (if (and (stringp cce) (string= "" cce)) (setq cce nil))
     ;; If CE is empty, multiline cannot be used.
     (unless ce (setq ccs nil cce nil))
@@ -988,7 +990,7 @@ the region rather than at left margin."
       (goto-char end)
       ;; If the end is not at the end of a line and the comment-end
       ;; is implicit (i.e. a newline), explicitly insert a newline.
-      (unless (or ce (eolp)) (insert "\n") (indent-according-to-mode))
+      (unless (or ce-sanitized (eolp)) (insert "\n") (indent-according-to-mode))
       (comment-with-narrowing beg end
        (let ((min-indent (point-max))
              (max-indent 0))
diff --git a/lisp/nxml/.gitignore b/lisp/nxml/.gitignore
new file mode 100644 (file)
index 0000000..f18ed02
--- /dev/null
@@ -0,0 +1,2 @@
+*.elc
+subdirs.el
diff --git a/lisp/nxml/TODO b/lisp/nxml/TODO
new file mode 100644 (file)
index 0000000..3e7d501
--- /dev/null
@@ -0,0 +1,468 @@
+* High priority
+
+** Command to insert an element template, including all required
+attributes and child elements.  When there's a choice of elements
+possible, we could insert a comment, and put an overlay on that
+comment that makes it behave like a button with a pop-up menu to
+select the appropriate choice.
+
+** Command to tag a region.  With a schema should complete using legal
+tags, but should work without a schema as well.
+
+** Provide a way to conveniently rename an element. With a schema should
+complete using legal tags, but should work without a schema as well.
+
+* Outlining
+
+** Implement C-c C-o C-q.
+
+** Install pre/post command hook for moving out of invisible section.
+
+** Put a modify hook on invisible sections that expands them.
+
+** Integrate dumb folding somehow.
+
+** An element should be able to be its own heading.
+
+** Optimize to avoid complete buffer scan on each command.
+
+** Make it work with HTML-style headings (i.e. level indicated by
+name of heading element rather than depth of section nesting).
+
+** Recognize root element as a section provided it has a title, even
+if it doesn't match section-element-name-regex.
+
+** Support for incremental search automatically making hidden text
+visible.
+
+** Allow title to be an attribute.
+
+** Command that says to recognize the tag at point as a section/heading.
+
+** Explore better ways to determine when an element is a section
+or a heading.
+
+** rng-next-error needs to either ignore invisible portion or reveal it
+(maybe use isearch oriented text properties).
+
+** Errors within hidden section should be highlighted by underlining the
+ellipsis.
+
+** Make indirect buffers work.
+
+** How should nxml-refresh outline recover from non well-formed tags?
+
+** Hide tags in title elements?
+
+** Use overlays instead of text properties for holding outline state?
+Necessary for indirect buffers to work?
+
+** Allow an outline to go in the speedbar.
+
+** Split up outlining manual section into subsections.
+
+** More detail in the manual about each outlining command.
+
+** More menu entries for hiding/showing?
+
+** Indication of many lines have been hidden?
+
+* Locating schemas
+
+** Should rng-validate-mode give the user an opportunity to specify a
+schema if there is currently none? Or should it at least give a hint
+to the user how to specify a non-vacuous schema?
+
+** Support for adding new schemas to schema-locating files. Add
+documentElement and namespace elements.
+
+** C-c C-w should be able to report current type id.
+
+** Implement doctypePublicId.
+
+** Implement typeIdBase.
+
+** Implement typeIdProcessingInstruction.
+
+** Support xml:base.
+
+** Implement group.
+
+** Find preferred prefix from schema-locating files.  Get rid of
+rng-preferred-prefix-alist.
+
+** Inserting document element with vacuous schema should complete using
+document elements declared in schema locating files, and set schema
+appropriately.
+
+** Add a ruleType attribute to the <include> element?
+
+** Allow processing instruction in prolog to contain the compact syntax
+schema directly.
+
+** Use RDDL to locate a schema based on the namespace URI.
+
+** Should not prompt to add redundant association to schema locating
+file.
+
+** Command to reload current schema.
+
+* Schema-sensitive features
+
+** Should filter dynamic markup possibilities using schema validity, by
+adding hook to nxml-mode.
+
+** Dynamic markup word should (at least optionally) be able to look in
+other buffers that are using nxml-mode.
+
+** Should clicking on Invalid move to next error if already on an error?
+
+** Take advantage of a:documentation. Needs change to schema format.
+
+** Provide feasible validation (as in Jing) toggle.
+
+** Save the validation state as a property on the error overlay to enable
+more detailed diagnosis.
+
+** Provide an Error Summary buffer showing all the validation errors.
+
+** Pop-up menu.  What is useful?  Tag a region (should be greyed out if
+the region is not balanced).  Suggestions based on error messages.
+
+** Have configurable list of namespace URIs so that we can provide
+namespace URI completion on extension elements or with schema-less
+documents.
+
+** Allow validation to handle XInclude.
+
+** ID/IDREF support.
+
+* Completion
+
+** Make it work with icomplete.  Only use a function to complete when
+some of the possible names have undeclared namespaces.
+
+** How should C-return in mixed text work?
+
+** When there's a vacuous schema, C-return after < will insert the
+end-tag.  Is this a bug or a feature?
+
+** After completing start-tag, ensure we don't get unhelpful message
+from validation
+
+** Syntax table for completion.
+
+** Should complete start-tag name with a space if namespace attributes
+are required.
+
+** When completing start-tag name with no prefix and it doesn't match
+should try to infer namespace from local name.
+
+** Should completion pay attention to characters after point?  If so,
+how?
+
+** When completing start-tag name, add required atts if only one required
+attribute.
+
+** When completing attribute name, add attribute value if only one value
+is possible.
+
+** After attribute-value completion, insert space after close delimiter
+if more attributes are required.
+
+** Complete on enumerated data values in elements.
+
+** When in context that allows only elements, should get tag
+completion without having to type < first.
+
+** When immediately after start-tag name, and name is valid and not
+prefix of any other name, should C-return complete on attribute names?
+
+** When completing attributes, more consistent to ignore all attributes
+after point.
+
+** Inserting attribute value completions needs to be sensitive to what
+delimiter is used so that it quotes the correct character.
+
+** Complete on encoding-names in XML decl.
+
+** Complete namespace declarations by searching for all namespaces
+mentioned in the schema.
+
+* Well-formed XML support
+
+** Deal better with Mule-UCS
+
+** Deal with UTF-8 BOM when reading.
+
+** Complete entity names.
+
+** Provide some support for entity names for MathML.
+
+** Command to repeat the last tag.
+
+** Support for changing between character references and characters.
+Need to check that context is one in which character references are
+allowed.  xmltok prolog parsing will need to distinguish parameter
+literals from other kinds of literal.
+
+** Provide a comment command to bind to M-; that works better than the
+normal one.
+
+** Make indenting in a multi-line comment work.
+
+** Structure view.  Separate buffer displaying element tree. Be able to
+navigate from structure view to document and vice-versa.
+
+** Flash matching >.
+
+** Smart selection command that selects increasingly large syntactically
+coherent chunks of XML.  If point is in an attribute value, first
+select complete value; then if command is repeated, select value plus
+delimiters, then select attribute name as well, then complete
+start-tag, then complete element, then enclosing element, etc.
+
+** ispell integration.
+
+** Block-level items in mixed content should be indented, e.g:
+  <para>This is list:
+    <ul>
+      <li>item</li>
+
+** Provide option to indent like this:
+
+**   <para>This is a paragraph
+    occupying multiple lines.</para>
+
+** Option to add make a / that closes a start-tag electrically insert a
+space for the XHTML guys.
+
+** C-M-q should work.
+
+* Datatypes
+
+** Figure out workaround for CJK characters with regexps.
+
+** Does category C contain Cn?
+
+** Do ENTITY datatype properly.
+
+* XML Parsing Library
+
+** Parameter entity parsing option, nil (never), t (always),
+unless-standalone (unless standalone="yes" in XML declaration).
+
+** When a file is currently being edited, there should be an option to
+use its buffer instead of the on-disk copy.
+
+* Handling all XML features
+
+** Provide better support for editing external general parsed entities.
+Perhaps provide a way to force ignoring undefined entities; maybe turn
+this on automatically with <?xml encoding=""?> (with no version
+pseudo-att).
+
+** Handle internal general entity declarations containing elements.
+
+** Handle external general entity declarations.
+
+** Handle default attribute declarations in internal subset.
+
+** Handle parameter entities (including DTD).
+
+* RELAX NG
+
+** Do complete schema checking, at least optionally.
+
+** Detect include/external loops during schema parse.
+
+** Coding system detection for schemas.  Should use utf-8/utf-16 per the
+spec. But also need to allow encodings other than UTF-8/16 to support
+CJK charsets that Emacs cannot represent in Unicode.
+
+* Catching XML errors
+
+** Check public identifiers.
+
+** Check default attribute values.
+
+* Performance
+
+** Explore whether overlay-recenter can cure overlays performance
+problems.
+
+** Cache schemas. Need to have list of files and mtimes.
+
+** Make it possible to reduce rng-validate-chunk-size significantly,
+perhaps to 500 bytes, without bad performance impact: don't do
+redisplay on every chunk; pass continue functions on other uses of
+rng-do-some-validation.
+
+** Cache after first tag.
+
+** Introduce a new name class that is a choice between names (so that
+we can use member)
+
+** intern-choice should simplify after patterns with same 1st/2nd args
+
+** Large numbers of overlays slow things down dramatically.  Represent
+errors using text properties.  This implies we cannot incrementally
+keep track of the number of errors, in order to determine validity.
+Instead, when validation completes, scan for any characters with an
+error text property; this seems to be fast enough even with large
+buffers. Problem with error at end of buffer, where there's no
+character; need special variable for this.  Need to merge face from
+font-lock with the error face: use :inherit attribute with list of two
+faces.  How do we avoid making rng-valid depend on nxml-mode?
+
+* Error recovery
+
+** Don't stop at newline in looking for close of start-tag.
+
+** Use indentation to guide recovery from mismatched end-tags
+
+** Don't keep parsing when currently not well-formed but previously
+well-formed
+
+** Try to recover from a bad start-tag by popping an open element if
+there was a mismatched end-tag unaccounted for.
+
+** Try to recover from a bad start-tag open on the hypothesis that there
+was an error in the namespace URI.
+
+** Better recovery from ill-formed XML declarations.
+
+* Useability improvements
+
+** Should print a "Parsing..." message during long movements.
+
+** Provide better position for reference to undefined pattern error.
+
+** Put Well-formed in the mode-line when validating against any-content.
+
+** Trim marking of illegal data for leading and trailing whitespace.
+
+** Show Invalid status as soon as we are sure it's invalid, rather than
+waiting for everything to be completely up to date.
+
+** When narrowed, Valid or Invalid status should probably consider only
+validity of narrowed region.
+
+* Bug fixes
+
+** Need to give an error for a document like: <foo/><![CDATA[  ]]>
+
+** Make nxml-forward-balanced-item work better for the prolog.
+
+** Make filling and indenting comments work in the prolog.
+
+** Should delete RNC Input buffers.
+
+** Figure out what regex use for NCName and use it consistently,
+
+** Should have not-well-formed tokens in ref.
+
+** Require version in XML declaration? Probably not because prevents
+use for external parsed entities. At least forbid standalone
+without version.
+
+** Reject schema that compiles to rng-not-allowed-ipattern.
+
+** Move point backwards on schema parse error so that it's on the right token.
+
+* Internal
+
+** Use rng-quote-string consistently.
+
+** Use parsing library for XML to texinfo conversion.
+
+** Rename xmltok.el to nxml-token.el.  Use nxml-t- prefix instead of
+xmltok-. Change nxml-t-type to nxml-t-token-type, nxml-t-start to
+nxml-t-token-start.
+
+** Can we set fill-prefix to nil and rely on indenting?
+
+** xmltok should make available replacement text of entities containing
+elements
+
+** In rng-valid, instead of using modification-hooks and
+insert-behind-hooks on dependent overlays, use same technique as
+nxml-mode.
+
+** Port to XEmacs.  Issues include: Unicode (XEmacs seems to be based on
+Mule-UCS); overlays/text properties vs extents; absence of
+fontification-functions hook.
+
+* Fontification
+
+** Allow face to depend on element qname, attribute qname, attribute
+value.  Use list with pairs of (R . F), where R specifies regexps and
+F specifies faces.  How can this list be made to depend on the
+document type?
+
+* Other
+
+** Support RELAX NG XML syntax (use XML parsing library).
+
+** Support W3C XML Schema (use XML parsing library).
+
+** Command to infer schema from current document (like trang).
+
+* Schemas
+
+** XSLT schema should take advantage of RELAX NG to express cooccurrence
+constraints on attributes (e.g. xsl:template).
+
+* Documentation
+
+** Move material from README to manual.
+
+** Document encodings.
+
+* Notes
+
+** How can we allow an error to be displayed on a different token from
+where it is detected?  In particular, for a missing closing ">" we
+will need to display it at the beginning of the following token.  At
+the moment, when we parse the following token the error overlay will
+get cleared.
+
+** How should rng-goto-next-error deal with narrowing?
+
+** Perhaps should merge errors having same start position even if they
+have different ends.
+
+** How to handle surrogates? One possibility is to be compatible with
+utf8.e: represent as sequence of 4 chars.  But utf-16 is incompatible
+with this.
+
+** Should we distinguish well-formedness errors from invalidity errors?
+(I think not: we may want to recover from a bad start-tag by implying
+an end-tag.)
+
+** Seems to be a bug with Emacs, where a mouse movement that causes
+help-echo text to appear counts as pending input but does not cause
+idle timer to be restarted.
+
+** Use XML to represent this file.
+
+** I had a TODO which said simply "split-string". What did I mean?
+
+** Investigate performance on large files all on one line.
+
+* CVS emacs issues
+
+** Take advantage of UTF-8 CJK support.
+
+** Supply a next-error-function.
+
+** Investigate this NEWS item "Emacs now tries to set up buffer coding
+systems for HTML/XML files automatically."
+
+** Take advantage of the pointer text property.
+
+** Leverage char-displayable-p.
+
+Local variables:
+mode: outline
+end:
diff --git a/lisp/nxml/nxml-enc.el b/lisp/nxml/nxml-enc.el
new file mode 100644 (file)
index 0000000..115db17
--- /dev/null
@@ -0,0 +1,173 @@
+;;; nxml-enc.el --- XML encoding auto-detection
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; User entry points are nxml-start-auto-coding and
+;; nxml-stop-auto-coding.  This is separate from nxml-mode, because
+;; this cannot be autoloaded.  It may use
+;; `xmltok-get-declared-encoding-position' which can be autoloaded.
+;; It's separate from rng-auto.el so it can be byte-compiled, and
+;; because it provides independent, useful functionality.
+
+;;; Code:
+
+(defvar nxml-file-name-ignore-case
+  (memq system-type '(vax-vms windows-nt)))
+
+(defvar nxml-cached-file-name-auto-coding-regexp nil)
+(defvar nxml-cached-auto-mode-alist nil)
+
+(defun nxml-file-name-auto-coding-regexp ()
+  "Return regexp for filenames for which XML auto-coding should be done."
+  (if (eq auto-mode-alist nxml-cached-auto-mode-alist)
+      nxml-cached-file-name-auto-coding-regexp
+    (let ((alist auto-mode-alist)
+         (case-fold-search nxml-file-name-ignore-case)
+         regexps)
+      (setq nxml-cached-auto-mode-alist alist)
+      (while alist
+       (when (eq (cdar alist) 'nxml-mode)
+         (setq regexps (cons (caar alist) regexps)))
+       (setq alist (cdr alist)))
+      (setq nxml-cached-file-name-auto-coding-regexp
+           (if (null (cdr regexps))
+               (car regexps)
+             (mapconcat (lambda (r)
+                          (concat "\\(?:" r "\\)"))
+                        regexps
+                        "\\|"))))))
+
+(defvar nxml-non-xml-set-auto-coding-function nil
+  "The function that `set-auto-coding-function' should call for non-XML files.")
+(defun nxml-set-auto-coding (file-name size)
+  (if (let ((case-fold-search nxml-file-name-ignore-case)
+           (regexp (nxml-file-name-auto-coding-regexp)))
+       (and regexp
+            (string-match regexp file-name)))
+      (nxml-set-xml-coding file-name size)
+    (and nxml-non-xml-set-auto-coding-function
+        (funcall nxml-non-xml-set-auto-coding-function file-name size))))
+
+(defun nxml-set-xml-coding (file-name size)
+  "Function to use as `set-auto-coding-function' when file is known to be XML."
+  (nxml-detect-coding-system (+ (point) (min size 1024))))
+
+(declare-function xmltok-get-declared-encoding-position "xmltok"
+                  (&optional limit))    ; autoloaded
+
+(defun nxml-detect-coding-system (limit)
+  (if (< limit (+ (point) 2))
+      (if (eq (char-after) 0) 'no-conversion 'utf-8)
+    (let ((first-two-chars (list (char-after)
+                                (char-after (1+ (point))))))
+      (cond ((equal first-two-chars '(#xFE #xFF))
+            (and (coding-system-p 'utf-16-be) 'utf-16-be))
+           ((equal first-two-chars '(#xFF #xFE))
+            (and (coding-system-p 'utf-16-le) 'utf-16-le))
+           ((memq 0 first-two-chars)
+            ;; Certainly not well-formed XML;
+            ;; perhaps UTF-16 without BOM.
+            ;; In any case, we can't handle it.
+            ;; no-conversion gives the user a chance to fix it.
+            'no-conversion)
+           ;; There are other things we might try here in the future
+           ;; eg UTF-8 BOM, UTF-16 with no BOM 
+           ;; translate to EBCDIC
+           (t
+            (let ((enc-pos (xmltok-get-declared-encoding-position limit)))
+              (cond ((consp enc-pos)
+                     (or (nxml-mime-charset-coding-system
+                          (buffer-substring-no-properties (car enc-pos)
+                                                          (cdr enc-pos)))
+                         ;; We have an encoding whose name we don't recognize.
+                         ;; What to do?
+                         ;; raw-text seems the best bet: since we got
+                         ;; the XML decl it must be a superset of ASCII,
+                         ;; so we don't need to go to no-conversion
+                         'raw-text))
+                    (enc-pos 'utf-8)
+                    ;; invalid XML declaration
+                    (t nil))))))))
+
+(defun nxml-mime-charset-coding-system (charset)
+  (let ((charset-sym (intern (downcase charset)))
+       (coding-systems (coding-system-list t))
+       coding-system ret)
+    (while (and coding-systems (not ret))
+      (setq coding-system (car coding-systems))
+      (if (eq (coding-system-get coding-system 'mime-charset)
+             charset-sym)
+         (setq ret coding-system)
+       (setq coding-systems (cdr coding-systems))))
+    ret))
+
+(defun nxml-start-auto-coding ()
+  "Do encoding auto-detection as specified in the XML standard.
+Applied to any files that `auto-mode-alist' says should be handled by
+`nxml-mode'."
+  (interactive)
+  (unless (eq set-auto-coding-function 'nxml-set-auto-coding)
+    (let ((inhibit-quit t))
+      (setq nxml-non-xml-set-auto-coding-function set-auto-coding-function)
+      (setq set-auto-coding-function 'nxml-set-auto-coding))))
+
+(defun nxml-stop-auto-coding ()
+  "Stop doing encoding auto-detection as specified in the XML standard."
+  (interactive)
+  (when (eq set-auto-coding-function 'nxml-set-auto-coding)
+    (let ((inhibit-quit t))
+      (setq set-auto-coding-function nxml-non-xml-set-auto-coding-function)
+      (setq nxml-non-xml-set-auto-coding-function nil))))
+
+(unless (coding-system-p 'us-ascii)
+  (make-coding-system
+   ;; Unicode Emacs uses ?- last time I looked
+   'us-ascii 2 ?-
+   "ISO 2022 based 7-bit encoding for ASCII (MIME:US-ASCII)"
+   '(ascii)
+   '((safe-charsets ascii)
+     (mime-charset . us-ascii))))
+
+;; Emacs 21.3.50 makes us-ascii an alias for iso-safe without
+;; giving it a mime-charset property.
+(unless (coding-system-get 'us-ascii 'mime-charset)
+  (coding-system-put 'us-ascii 'mime-charset 'us-ascii))
+
+;; Work around bug in Emacs 21.3
+
+(when (and (coding-system-p 'utf-16-le)
+          (eq (coding-system-get 'utf-16-le 'pre-write-conversion)
+              'utf-16-le-pre-write-conversion))
+  (coding-system-put 'utf-16-le 'pre-write-conversion nil))
+
+(when (and (coding-system-p 'utf-16-le)
+          (eq (coding-system-get 'utf-16-be 'pre-write-conversion)
+              'utf-16-be-pre-write-conversion))
+  (coding-system-put 'utf-16-be 'pre-write-conversion nil))
+
+(provide 'nxml-enc)
+
+;; arch-tag: c2436247-78f3-418c-8069-85dc5335d083
+;;; nxml-enc.el ends here
diff --git a/lisp/nxml/nxml-glyph.el b/lisp/nxml/nxml-glyph.el
new file mode 100644 (file)
index 0000000..47d7086
--- /dev/null
@@ -0,0 +1,421 @@
+;;; nxml-glyph.el --- glyph-handling for nxml-mode
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The entry point to this file is `nxml-glyph-display-string'.
+;; The current implementation is heuristic due to a lack of
+;; Emacs primitives necessary to implement it properly.  The user
+;; can tweak the heuristics using `nxml-glyph-set-hook'.
+
+;;; Code:
+
+(defconst nxml-ascii-glyph-set
+  [(#x0020 . #x007E)])
+
+(defconst nxml-latin1-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)])
+
+;; These were generated by using nxml-insert-target-repertoire-glyph-set
+;; on the TARGET[123] files in
+;; http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
+
+(defconst nxml-misc-fixed-1-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)
+   (#x0100 . #x017F)
+   #x018F #x0192
+   (#x0218 . #x021B)
+   #x0259
+   (#x02C6 . #x02C7)
+   (#x02D8 . #x02DD)
+   (#x0374 . #x0375)
+   #x037A #x037E
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   (#x0401 . #x040C)
+   (#x040E . #x044F)
+   (#x0451 . #x045C)
+   (#x045E . #x045F)
+   (#x0490 . #x0491)
+   (#x05D0 . #x05EA)
+   (#x1E02 . #x1E03)
+   (#x1E0A . #x1E0B)
+   (#x1E1E . #x1E1F)
+   (#x1E40 . #x1E41)
+   (#x1E56 . #x1E57)
+   (#x1E60 . #x1E61)
+   (#x1E6A . #x1E6B)
+   (#x1E80 . #x1E85)
+   (#x1EF2 . #x1EF3)
+   (#x2010 . #x2022)
+   #x2026 #x2030
+   (#x2039 . #x203A)
+   #x20AC #x2116 #x2122 #x2126
+   (#x215B . #x215E)
+   (#x2190 . #x2193)
+   #x2260
+   (#x2264 . #x2265)
+   (#x23BA . #x23BD)
+   (#x2409 . #x240D)
+   #x2424 #x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 #x252C #x2534 #x253C #x2592 #x25C6 #x266A #xFFFD]
+  "Glyph set for TARGET1 glyph repertoire of misc-fixed-* font.
+This repertoire is supported for the bold and oblique fonts.")
+
+(defconst nxml-misc-fixed-2-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)
+   (#x0100 . #x017F)
+   #x018F #x0192
+   (#x01FA . #x01FF)
+   (#x0218 . #x021B)
+   #x0259
+   (#x02C6 . #x02C7)
+   #x02C9
+   (#x02D8 . #x02DD)
+   (#x0300 . #x0311)
+   (#x0374 . #x0375)
+   #x037A #x037E
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   #x03D1
+   (#x03D5 . #x03D6)
+   #x03F1
+   (#x0401 . #x040C)
+   (#x040E . #x044F)
+   (#x0451 . #x045C)
+   (#x045E . #x045F)
+   (#x0490 . #x0491)
+   (#x05D0 . #x05EA)
+   (#x1E02 . #x1E03)
+   (#x1E0A . #x1E0B)
+   (#x1E1E . #x1E1F)
+   (#x1E40 . #x1E41)
+   (#x1E56 . #x1E57)
+   (#x1E60 . #x1E61)
+   (#x1E6A . #x1E6B)
+   (#x1E80 . #x1E85)
+   (#x1EF2 . #x1EF3)
+   (#x2010 . #x2022)
+   #x2026 #x2030
+   (#x2032 . #x2034)
+   (#x2039 . #x203A)
+   #x203C #x203E #x2044
+   (#x2070 . #x2071)
+   (#x2074 . #x208E)
+   (#x20A3 . #x20A4)
+   #x20A7 #x20AC
+   (#x20D0 . #x20D7)
+   #x2102 #x2105 #x2113
+   (#x2115 . #x2116)
+   #x211A #x211D #x2122 #x2124 #x2126 #x212E
+   (#x215B . #x215E)
+   (#x2190 . #x2195)
+   (#x21A4 . #x21A8)
+   (#x21D0 . #x21D5)
+   (#x2200 . #x2209)
+   (#x220B . #x220C)
+   #x220F
+   (#x2211 . #x2213)
+   #x2215
+   (#x2218 . #x221A)
+   (#x221D . #x221F)
+   #x2221
+   (#x2224 . #x222B)
+   #x222E #x223C #x2243 #x2245
+   (#x2248 . #x2249)
+   #x2259
+   (#x225F . #x2262)
+   (#x2264 . #x2265)
+   (#x226A . #x226B)
+   (#x2282 . #x228B)
+   #x2295 #x2297
+   (#x22A4 . #x22A7)
+   (#x22C2 . #x22C3)
+   #x22C5 #x2300 #x2302
+   (#x2308 . #x230B)
+   #x2310
+   (#x2320 . #x2321)
+   (#x2329 . #x232A)
+   (#x23BA . #x23BD)
+   (#x2409 . #x240D)
+   #x2424 #x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524 #x252C #x2534 #x253C
+   (#x254C . #x2573)
+   (#x2580 . #x25A1)
+   (#x25AA . #x25AC)
+   (#x25B2 . #x25B3)
+   #x25BA #x25BC #x25C4 #x25C6
+   (#x25CA . #x25CB)
+   #x25CF
+   (#x25D8 . #x25D9)
+   #x25E6
+   (#x263A . #x263C)
+   #x2640 #x2642 #x2660 #x2663
+   (#x2665 . #x2666)
+   (#x266A . #x266B)
+   (#xFB01 . #xFB02)
+   #xFFFD]
+  "Glyph set for TARGET2 glyph repertoire of the misc-fixed-* fonts.
+This repertoire is supported for the following fonts:
+5x7.bdf 5x8.bdf 6x9.bdf 6x10.bdf 6x12.bdf 7x13.bdf 7x14.bdf clR6x12.bdf")
+
+(defconst nxml-misc-fixed-3-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x00FF)
+   (#x0100 . #x01FF)
+   (#x0200 . #x0220)
+   (#x0222 . #x0233)
+   (#x0250 . #x02AD)
+   (#x02B0 . #x02EE)
+   (#x0300 . #x034F)
+   (#x0360 . #x036F)
+   (#x0374 . #x0375)
+   #x037A #x037E
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   (#x03D0 . #x03F6)
+   (#x0400 . #x0486)
+   (#x0488 . #x04CE)
+   (#x04D0 . #x04F5)
+   (#x04F8 . #x04F9)
+   (#x0500 . #x050F)
+   (#x0531 . #x0556)
+   (#x0559 . #x055F)
+   (#x0561 . #x0587)
+   (#x0589 . #x058A)
+   (#x05B0 . #x05B9)
+   (#x05BB . #x05C4)
+   (#x05D0 . #x05EA)
+   (#x05F0 . #x05F4)
+   (#x10D0 . #x10F8)
+   #x10FB
+   (#x1E00 . #x1E9B)
+   (#x1EA0 . #x1EF9)
+   (#x1F00 . #x1F15)
+   (#x1F18 . #x1F1D)
+   (#x1F20 . #x1F45)
+   (#x1F48 . #x1F4D)
+   (#x1F50 . #x1F57)
+   #x1F59 #x1F5B #x1F5D
+   (#x1F5F . #x1F7D)
+   (#x1F80 . #x1FB4)
+   (#x1FB6 . #x1FC4)
+   (#x1FC6 . #x1FD3)
+   (#x1FD6 . #x1FDB)
+   (#x1FDD . #x1FEF)
+   (#x1FF2 . #x1FF4)
+   (#x1FF6 . #x1FFE)
+   (#x2000 . #x200A)
+   (#x2010 . #x2027)
+   (#x202F . #x2052)
+   #x2057
+   (#x205F . #x2063)
+   (#x2070 . #x2071)
+   (#x2074 . #x208E)
+   (#x20A0 . #x20B1)
+   (#x20D0 . #x20EA)
+   (#x2100 . #x213A)
+   (#x213D . #x214B)
+   (#x2153 . #x2183)
+   (#x2190 . #x21FF)
+   (#x2200 . #x22FF)
+   (#x2300 . #x23CE)
+   (#x2400 . #x2426)
+   (#x2440 . #x244A)
+   (#x2500 . #x25FF)
+   (#x2600 . #x2613)
+   (#x2616 . #x2617)
+   (#x2619 . #x267D)
+   (#x2680 . #x2689)
+   (#x27E6 . #x27EB)
+   (#x27F5 . #x27FF)
+   (#x2A00 . #x2A06)
+   #x2A1D #x2A3F #x303F
+   (#xFB00 . #xFB06)
+   (#xFB13 . #xFB17)
+   (#xFB1D . #xFB36)
+   (#xFB38 . #xFB3C)
+   #xFB3E
+   (#xFB40 . #xFB41)
+   (#xFB43 . #xFB44)
+   (#xFB46 . #xFB4F)
+   (#xFE20 . #xFE23)
+   (#xFF61 . #xFF9F)
+   #xFFFD]
+  "Glyph set for TARGET3 glyph repertoire of the misc-fixed-* fonts.
+This repertoire is supported for the following fonts:
+6x13.bdf 8x13.bdf 9x15.bdf 9x18.bdf 10x20.bdf")
+  
+(defconst nxml-wgl4-glyph-set
+  [(#x0020 . #x007E)
+   (#x00A0 . #x017F)
+   #x0192
+   (#x01FA . #x01FF)
+   (#x02C6 . #x02C7)
+   #x02C9
+   (#x02D8 . #x02DB)
+   #x02DD
+   (#x0384 . #x038A)
+   #x038C
+   (#x038E . #x03A1)
+   (#x03A3 . #x03CE)
+   (#x0401 . #x040C)
+   (#x040E . #x044F)
+   (#x0451 . #x045C)
+   (#x045E . #x045F)
+   (#x0490 . #x0491)
+   (#x1E80 . #x1E85)
+   (#x1EF2 . #x1EF3)
+   (#x2013 . #x2015)
+   (#x2017 . #x201E)
+   (#x2020 . #x2022)
+   #x2026 #x2030
+   (#x2032 . #x2033)
+   (#x2039 . #x203A)
+   #x203C #x203E #x2044 #x207F
+   (#x20A3 . #x20A4)
+   #x20A7 #x20AC #x2105 #x2113 #x2116 #x2122 #x2126 #x212E
+   (#x215B . #x215E)
+   (#x2190 . #x2195)
+   #x21A8 #x2202 #x2206 #x220F
+   (#x2211 . #x2212)
+   #x2215
+   (#x2219 . #x221A)
+   (#x221E . #x221F)
+   #x2229 #x222B #x2248
+   (#x2260 . #x2261)
+   (#x2264 . #x2265)
+   #x2302 #x2310
+   (#x2320 . #x2321)
+   #x2500 #x2502 #x250C #x2510 #x2514 #x2518 #x251C #x2524
+   #x252C #x2534 #x253C
+   (#x2550 . #x256C)
+   #x2580 #x2584 #x2588 #x258C
+   (#x2590 . #x2593)
+   (#x25A0 . #x25A1)
+   (#x25AA . #x25AC)
+   #x25B2 #x25BA #x25BC #x25C4
+   (#x25CA . #x25CB)
+   #x25CF
+   (#x25D8 . #x25D9)
+   #x25E6
+   (#x263A . #x263C)
+   #x2640 #x2642 #x2660 #x2663
+   (#x2665 . #x2666)
+   (#x266A . #x266B)
+   (#xFB01 . #xFB02)]
+  "Glyph set corresponding to Windows Glyph List 4.")
+
+(defvar nxml-glyph-set-hook nil
+  "*Hook for determining the set of glyphs in a face.
+The hook will receive a single argument FACE.  If it can determine the
+set of glyphs representable by FACE, it must set the variable
+`nxml-glyph-set' and return non-nil.  Otherwise, it must return
+nil. The hook will be run until success.  The constants
+`nxml-ascii-glyph-set', `nxml-latin1-glyph-set',
+`nxml-misc-fixed-1-glyph-set', `nxml-misc-fixed-2-glyph-set',
+`nxml-misc-fixed-3-glyph-set' and `nxml-wgl4-glyph-set' are predefined
+for use by `nxml-glyph-set-hook'.")
+
+(defvar nxml-glyph-set nil
+  "Used by `nxml-glyph-set-hook' to return set of glyphs in a FACE.
+This should dynamically bound by any function that runs
+`nxml-glyph-set-hook'.  The value must be either nil representing an
+empty set or a vector. Each member of the vector is either a single
+integer or a cons (FIRST . LAST) representing the range of integers
+from FIRST to LAST.  An integer represents a glyph with that Unicode
+code-point.  The vector must be ordered.")
+
+(defun nxml-x-set-glyph-set (face)
+  (setq nxml-glyph-set
+       (if (equal (face-attribute face :family) "misc-fixed")
+           nxml-misc-fixed-3-glyph-set
+         nxml-wgl4-glyph-set)))
+
+(defun nxml-w32-set-glyph-set (face)
+  (setq nxml-glyph-set nxml-wgl4-glyph-set))
+
+(defun nxml-window-system-set-glyph-set (face)
+  (setq nxml-glyph-set nxml-latin1-glyph-set))
+
+(defun nxml-terminal-set-glyph-set (face)
+  (setq nxml-glyph-set nxml-ascii-glyph-set))
+
+(add-hook 'nxml-glyph-set-hook
+         (or (cdr (assq window-system
+                        '((x . nxml-x-set-glyph-set)
+                          (w32 . nxml-w32-set-glyph-set)
+                          (nil . nxml-terminal-set-glyph-set))))
+             'nxml-window-system-set-glyph-set)
+         t)
+
+;;;###autoload
+(defun nxml-glyph-display-string (n face)
+  "Return a string that can display a glyph for Unicode code-point N.
+FACE gives the face that will be used for displaying the string.
+Return nil if the face cannot display a glyph for N."
+  (let ((nxml-glyph-set nil))
+    (run-hook-with-args-until-success 'nxml-glyph-set-hook face)
+    (and nxml-glyph-set
+        (nxml-glyph-set-contains-p n nxml-glyph-set)
+        (let ((ch (decode-char 'ucs n)))
+          (and ch (string ch))))))
+      
+(defun nxml-glyph-set-contains-p (n v)
+  (let ((start 0)
+       (end (length v))
+       found mid mid-val mid-start-val mid-end-val)
+    (while (> end start)
+      (setq mid (+ start
+                  (/ (- end start) 2)))
+      (setq mid-val (aref v mid))
+      (if (consp mid-val)
+         (setq mid-start-val (car mid-val)
+               mid-end-val (cdr mid-val))
+       (setq mid-start-val mid-val
+             mid-end-val mid-val))
+      (cond ((and (<= mid-start-val n)
+                 (<= n mid-end-val))
+            (setq found t)
+            (setq start end))
+           ((< n mid-start-val)
+            (setq end mid))
+           (t
+            (setq start
+                  (if (eq start mid)
+                      end
+                    mid)))))
+    found))
+
+(provide 'nxml-glyph)
+
+;; arch-tag: 50985104-27c6-4241-8625-b11aa5685633
+;;; nxml-glyph.el ends here
diff --git a/lisp/nxml/nxml-maint.el b/lisp/nxml/nxml-maint.el
new file mode 100644 (file)
index 0000000..7df2bc9
--- /dev/null
@@ -0,0 +1,109 @@
+;;; nxml-maint.el --- commands for maintainers of nxml-*.el
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+;;; Generating files with Unicode char names.
+
+(require 'nxml-uchnm)
+
+(defun nxml-create-unicode-char-name-sets (file)
+  "Generate files containing char names from Unicode standard."
+  (interactive "fUnicodeData file: ")
+  (mapc (lambda (block)
+          (let ((nameset (nxml-unicode-block-char-name-set (nth 0 block))))
+            (save-excursion
+              (find-file (concat (get nameset 'nxml-char-name-set-file)
+                                 ".el"))
+              (erase-buffer)
+              (insert "(nxml-define-char-name-set '")
+              (prin1 nameset (current-buffer))
+              (insert "\n  '())\n")
+              (goto-char (- (point) 3)))))
+        nxml-unicode-blocks)
+  (save-excursion
+    (find-file file)
+    (goto-char (point-min))
+    (let ((blocks nxml-unicode-blocks)
+         code name)
+      (while (re-search-forward "^\\([0-9A-F]+\\);\\([^<;][^;]*\\);"
+                               nil
+                               t)
+       (setq code (string-to-number (match-string 1) 16))
+       (setq name (match-string 2))
+       (while (and blocks
+                   (> code (nth 2 (car blocks))))
+         (setq blocks (cdr blocks)))
+       (when (and (<= (nth 1 (car blocks)) code)
+                  (<= code (nth 2 (car blocks))))
+         (save-excursion
+           (find-file (concat (get (nxml-unicode-block-char-name-set
+                                    (nth 0 (car blocks)))
+                                   'nxml-char-name-set-file)
+                              ".el"))
+           (insert "(")
+           (prin1 name (current-buffer))
+           (insert (format " #x%04X)\n    " code))))))))
+
+;;; Parsing target repertoire files from ucs-fonts.
+;; This is for converting the TARGET? files in
+;; http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
+;; into a glyph set.
+
+(defun nxml-insert-target-repertoire-glyph-set (file var)
+  (interactive "fTarget file: \nSVariable name: ")
+  (let (lst head)
+    (save-excursion
+      (set-buffer (find-file-noselect file))
+      (goto-char (point-min))
+      (while (re-search-forward "^ *\\([a-FA-F0-9]\\{2\\}\\)[ \t]+" nil t)
+       (let ((row (match-string 1))
+             (eol (save-excursion (end-of-line) (point))))
+         (while (re-search-forward "\\([a-FA-F0-9]\\{2\\}\\)-\\([a-FA-F0-9]\\{2\\}\\)\\|\\([a-FA-F0-9]\\{2\\}\\)" eol t)
+           (setq lst
+                 (cons (if (match-beginning 3)
+                           (concat "#x" row (match-string 3))
+                       (concat "(#x" row (match-string 1)
+                               " . #x" row (match-string 2) ")"))
+                       lst))))))
+    (setq lst (nreverse lst))
+    (insert (format "(defconst %s\n  [" var))
+    (while lst
+      (setq head (car lst))
+      (setq lst (cdr lst))
+      (insert head)
+      (when (= (length head) 6)
+       (while (and lst (= (length (car lst)) 6))
+         (insert " ")
+         (insert (car lst))
+         (setq lst (cdr lst))))
+      (when lst (insert "\n   ")))
+    (insert "])\n")))
+
+(provide 'nxml-maint)
+
+;; arch-tag: 2cff6b55-12af-47db-90da-a91f782f435a
+;;; nxml-maint.el ends here
diff --git a/lisp/nxml/nxml-mode.el b/lisp/nxml/nxml-mode.el
new file mode 100644 (file)
index 0000000..42d1635
--- /dev/null
@@ -0,0 +1,2668 @@
+;;; nxml-mode.el --- a new XML mode
+
+;; Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; To use this include rng-auto.el in your .emacs.
+
+;; See nxml-rap.el for description of parsing strategy.
+
+;; The font locking here is independent of font-lock.el.  We want to
+;; do more sophisticated handling of changes and we want to use the
+;; same xmltok rather than regexps for parsing so that we parse
+;; consistently and correctly.
+
+;;; Code:
+
+(when (featurep 'mucs)
+  (error "nxml-mode is not compatible with Mule-UCS"))
+
+(require 'xmltok)
+(require 'nxml-enc)
+(require 'nxml-glyph)
+(require 'nxml-util)
+(require 'nxml-rap)
+(require 'nxml-outln)
+
+;;; Customization
+
+(defgroup nxml nil
+  "New XML editing mode"
+  :group 'languages
+  :group 'wp)
+
+(defgroup nxml-highlighting-faces nil
+  "Faces for XML syntax highlighting."
+  :group 'nxml
+  :group 'font-lock-highlighting-faces)
+
+(defcustom nxml-syntax-highlight-flag t
+  "*Non-nil means nxml-mode should perform syntax highlighting."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-char-ref-display-glyph-flag t
+  "*Non-nil means display glyph following character reference.
+The glyph is displayed in `nxml-glyph-face'.  The hook
+`nxml-glyph-set-hook' can be used to customize for which characters
+glyphs are displayed."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-mode-hook nil
+  "Hook run by command `nxml-mode'."
+  :group 'nxml
+  :type 'hook)
+
+(defcustom nxml-sexp-element-flag nil
+  "*Non-nil means sexp commands treat an element as a single expression."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-slash-auto-complete-flag nil
+  "*Non-nil means typing a slash automatically completes the end-tag.
+This is used by `nxml-electric-slash'."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-child-indent 2
+  "*Indentation for the children of an element relative to the start-tag.
+This only applies when the line or lines containing the start-tag contains
+nothing else other than that start-tag."
+  :group 'nxml
+  :type 'integer)
+
+(defcustom nxml-attribute-indent 4
+  "*Indentation for the attributes of an element relative to the start-tag.
+This only applies when the first attribute of a tag starts a line. In other
+cases, the first attribute on one line is indented the same as the first
+attribute on the previous line."
+  :group 'nxml
+  :type 'integer)
+
+(defvar nxml-fontify-chunk-size 500)
+
+(defcustom nxml-bind-meta-tab-to-complete-flag (not window-system)
+  "*Non-nil means bind M-TAB in `nxml-mode-map' to `nxml-complete'.
+C-return will be bound to `nxml-complete' in any case.
+M-TAB gets swallowed by many window systems/managers, and
+`documentation' will show M-TAB rather than C-return as the
+binding `rng-complete' when both are bound.  So it's better
+to bind M-TAB only when it will work."
+  :group 'nxml
+  :set (lambda (sym flag)
+        (set-default sym flag)
+        (when (and (boundp 'nxml-mode-map) nxml-mode-map)
+          (define-key nxml-mode-map "\M-\t" (and flag 'nxml-complete))))
+  :type 'boolean)
+
+(defcustom nxml-prefer-utf-16-to-utf-8-flag nil
+  "*Non-nil means prefer UTF-16 to UTF-8 when saving a buffer.
+This is used only when a buffer does not contain an encoding declaration
+and when its current `buffer-file-coding-system' specifies neither UTF-16
+nor UTF-8."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-prefer-utf-16-little-to-big-endian-flag (eq system-type
+                                                           'windows-nt)
+  "*Non-nil means prefer little-endian to big-endian byte-order for UTF-16.
+This is used only for saving a buffer; when reading the byte-order is
+auto-detected. It may be relevant both when there is no encoding declaration
+and when the encoding declaration specifies `UTF-16'."
+  :group 'nxml
+  :type 'boolean)
+
+(defcustom nxml-default-buffer-file-coding-system nil
+  "*Default value for `buffer-file-coding-system' for a buffer for a new file.
+Nil means use the default value of `buffer-file-coding-system' as normal.
+A buffer's `buffer-file-coding-system' affects what \\[nxml-insert-xml-declaration] inserts."
+  :group 'nxml
+  :type 'coding-system)
+
+(defcustom nxml-auto-insert-xml-declaration-flag nil
+  "*Non-nil means automatically insert an XML declaration in a new file.
+The XML declaration is inserted using `nxml-insert-xml-declaration'."
+  :group 'nxml
+  :type 'boolean)
+
+;; The following are the colors we use with a light background.
+;; The two blues have the same hue but contrasting saturation/value.
+;; The hue of the green is 120 degrees different from that of the
+;; blue.  The red used for highlighting errors is 120 degrees
+;; different again.  We use the light blue only for refs and
+;; delimiters, since these are short (long stretches in a light color
+;; would be too hard to read).  The dark blue is closest to black
+;; (which we use by default for text), so we use it for attribute
+;; values, which are similar to text.
+
+(defconst nxml-light-blue-color "#9292C9") ; hue 240
+(defconst nxml-dark-blue-color "#3A3A7B") ; hue 240
+(defconst nxml-green-color "#257A25") ; hue 120
+
+;; Similar principles apply with a dark background.  However,
+;; we switch green and blue, because darker blues are very hard to
+;; read (for me anyway) on a dark background.
+
+(defconst nxml-sky-blue-color "#ACACFC") ; hue 240
+(defconst nxml-dark-green-color "#00AD00") ; hue 120
+(defconst nxml-light-green-color "#70F170") ; hue 120
+
+(defface nxml-delimited-data-face
+  `((((class color) (background light)) (:foreground ,nxml-dark-blue-color))
+    (((class color) (background dark)) (:foreground ,nxml-light-green-color)))
+  "Face used to highlight data enclosed between delimiters.
+By default, this is inherited by `nxml-attribute-value-face'
+and `nxml-processing-instruction-content-face'."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-name-face
+  `((((class color) (background light)) (:foreground ,nxml-green-color))
+    (((class color) (background dark)) (:foreground ,nxml-sky-blue-color)))
+  "Face used to highlight various names.
+This includes element and attribute names, processing
+instruction targets and the CDATA keyword in a CDATA section.
+This is not used directly, but only via inheritance by other faces."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-ref-face
+  `((((class color) (background light)) (:foreground ,nxml-light-blue-color))
+    (((class color) (background dark)) (:foreground ,nxml-dark-green-color)))
+  "Face used to highlight character and entity references.
+This is not used directly, but only via inheritance by other faces."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-delimiter-face
+  `((((class color) (background light)) (:foreground ,nxml-light-blue-color))
+    (((class color) (background dark)) (:foreground ,nxml-dark-green-color))
+    (t (:bold t)))
+  "Face used to highlight delimiters.
+This is not used directly, but only via inheritance by other faces."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-text-face
+  nil
+  "Face used to highlight text."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-comment-content-face
+  '((t (:italic t)))
+  "Face used to highlight the content of comments."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-comment-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of comments, i.e <!-- and -->."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-processing-instruction-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of processing instructions, i.e <? and ?>."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-processing-instruction-target-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the target of processing instructions."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-processing-instruction-content-face
+  '((t (:inherit nxml-delimited-data-face)))
+  "Face used for the content of processing instructions."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-cdata-section-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of CDATA sections, i.e <![, [, and ]]>."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-cdata-section-CDATA-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the CDATA keyword in CDATA sections."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-cdata-section-content-face
+  '((t (:inherit nxml-text-face)))
+  "Face used for the content of CDATA sections."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-char-ref-number-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the number in character references.
+This includes ths `x' in hex references."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-char-ref-delimiter-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the delimiters of character references, i.e &# and ;."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-entity-ref-name-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the entity name in general entity references."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-entity-ref-delimiter-face
+  '((t (:inherit nxml-ref-face)))
+  "Face used for the delimiters of entity references, i.e & and ;."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-tag-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the angle brackets delimiting tags.
+`nxml-tag-slash-face' is used for slashes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-tag-slash-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for slashes in tags, both in end-tags and empty-elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-element-prefix-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the prefix of elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-element-colon-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the colon in element names."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-element-local-name-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the local name of elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-prefix-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the prefix of attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-colon-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the colon in attribute names."
+  :group 'nxml-highlighting-faces)
+  
+(defface nxml-attribute-local-name-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the local name of attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-xmlns-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for `xmlns' in namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-colon-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the colon in namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-prefix-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for the prefix declared in namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-value-face
+  '((t (:inherit nxml-delimited-data-face)))
+  "Face used for the value of attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-attribute-value-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of attribute values."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-value-face
+  '((t (:inherit nxml-attribute-value-face)))
+  "Face used for the value of namespace attributes."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-namespace-attribute-value-delimiter-face
+  '((t (:inherit nxml-attribute-value-delimiter-face)))
+  "Face used for the delimiters of namespace attribute values."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-prolog-literal-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of literals in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-prolog-literal-content-face
+  '((t (:inherit nxml-delimited-data-face)))
+  "Face used for the content of literals in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-prolog-keyword-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for keywords in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-markup-declaration-delimiter-face
+  '((t (:inherit nxml-delimiter-face)))
+  "Face used for the delimiters of markup declarations in the prolog.
+The delimiters are <! and >."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-hash-face
+  '((t (:inherit nxml-name-face)))
+  "Face used for # before a name in the prolog."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-glyph-face
+  '((((type x))
+     (:family
+      "misc-fixed"
+      :background
+      "light grey"
+      :foreground
+      "black"
+      :weight
+      normal 
+      :slant
+      normal))
+    (t
+     (:background
+      "light grey"
+      :foreground
+      "black"
+      :weight
+      normal 
+      :slant
+      normal)))
+  "Face used for glyph for char references."
+  :group 'nxml-highlighting-faces)
+
+;;; Global variables
+
+;; This is initialized in rng-auto.el.
+(defvar nxml-version nil
+  "*The version of nxml-mode that is being used.")
+
+(defvar nxml-prolog-regions nil
+  "List of regions in the prolog to be fontified.
+See the function `xmltok-forward-prolog' for more information.")
+(make-variable-buffer-local 'nxml-prolog-regions)
+
+(defvar nxml-last-fontify-end nil
+  "Position where fontification last ended.
+Nil if the buffer changed since the last fontification.")
+(make-variable-buffer-local 'nxml-last-fontify-end)
+
+(defvar nxml-degraded nil
+  "Non-nil if currently operating in degraded mode.
+Degraded mode is enabled when an internal error is encountered in the
+fontification or after-change functions.")
+(make-variable-buffer-local 'nxml-degraded)
+
+(defvar nxml-completion-hook nil
+  "Hook run by `nxml-complete'.
+This hook is run until success.")
+
+(defvar nxml-in-mixed-content-hook nil
+  "Hook to determine whether point is in mixed content.
+The hook is called without arguments.  It should return nil if it is
+definitely not mixed; non-nil otherwise.  The hook will be run until
+one of the functions returns nil.")
+
+(defvar nxml-mixed-scan-distance 4000
+  "Maximum distance from point to scan when checking for mixed content.")
+
+(defvar nxml-end-tag-indent-scan-distance 4000
+  "Maximum distance from point to scan backwards when indenting end-tag.")
+
+(defvar nxml-char-ref-extra-display t
+  "Non-nil means display extra information for character references.
+The extra information consists of a tooltip with the character name
+and, if `nxml-char-ref-display-glyph-flag' is non-nil, a glyph
+corresponding to the referenced character following the character
+reference.")
+(make-variable-buffer-local 'nxml-char-ref-extra-display)
+
+(defvar nxml-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\M-\C-u" 'nxml-backward-up-element)
+    (define-key map "\M-\C-d" 'nxml-down-element)
+    (define-key map "\M-\C-n" 'nxml-forward-element)
+    (define-key map "\M-\C-p" 'nxml-backward-element)
+    (define-key map "\M-{" 'nxml-backward-paragraph)
+    (define-key map "\M-}" 'nxml-forward-paragraph)
+    (define-key map "\M-h" 'nxml-mark-paragraph)
+    (define-key map "\C-c\C-f" 'nxml-finish-element)
+    (define-key map "\C-c\C-m" 'nxml-split-element)
+    (define-key map "\C-c\C-b" 'nxml-balanced-close-start-tag-block)
+    (define-key map "\C-c\C-i" 'nxml-balanced-close-start-tag-inline)
+    (define-key map "\C-c\C-x" 'nxml-insert-xml-declaration)
+    (define-key map "\C-c\C-d" 'nxml-dynamic-markup-word)
+    ;; u is for Unicode
+    (define-key map "\C-c\C-u" 'nxml-insert-named-char)
+    (define-key map "\C-c\C-o" nxml-outline-prefix-map)
+    (define-key map [S-mouse-2] 'nxml-mouse-hide-direct-text-content)
+    (define-key map "/" 'nxml-electric-slash)
+    (define-key map [C-return] 'nxml-complete) 
+    (when nxml-bind-meta-tab-to-complete-flag
+      (define-key map "\M-\t" 'nxml-complete))
+    map)
+  "Keymap for nxml-mode.")
+
+(defsubst nxml-set-face (start end face)
+  (when (and face (< start end))
+    (put-text-property start end 'face face)))
+
+(defun nxml-clear-face (start end)
+  (remove-text-properties start end '(face nil))
+  (nxml-clear-char-ref-extra-display start end))
+
+(defsubst nxml-set-fontified (start end)
+  (put-text-property start end 'fontified t))
+
+(defsubst nxml-clear-fontified (start end)
+  (remove-text-properties start end '(fontified nil)))
+
+;;;###autoload
+(defun nxml-mode ()
+  ;; We use C-c C-i instead of \\[nxml-balanced-close-start-tag-inline]
+  ;; because Emacs turns C-c C-i into C-c TAB which is hard to type and
+  ;; not mnemonic.
+  "Major mode for editing XML.
+
+Syntax highlighting is performed unless the variable
+`nxml-syntax-highlight-flag' is nil.
+
+\\[nxml-finish-element] finishes the current element by inserting an end-tag.
+C-c C-i closes a start-tag with `>' and then inserts a balancing end-tag
+leaving point between the start-tag and end-tag. 
+\\[nxml-balanced-close-start-tag-block] is similar but for block rather than inline elements:
+the start-tag, point, and end-tag are all left on separate lines.
+If `nxml-slash-auto-complete-flag' is non-nil, then inserting a `</'
+automatically inserts the rest of the end-tag.
+
+\\[nxml-complete] performs completion on the symbol preceding point.
+
+\\[nxml-dynamic-markup-word] uses the contents of the current buffer
+to choose a tag to put around the word preceding point.
+
+Sections of the document can be displayed in outline form.  The
+variable `nxml-section-element-name-regexp' controls when an element
+is recognized as a section.  The same key sequences that change
+visibility in outline mode are used except that they start with C-c C-o
+instead of C-c.
+
+Validation is provided by the related minor-mode `rng-validate-mode'.
+This also makes completion schema- and context- sensitive.  Element
+names, attribute names, attribute values and namespace URIs can all be
+completed. By default, `rng-validate-mode' is automatically enabled by
+`rng-nxml-mode-init' which is normally added to `nxml-mode-hook'. You
+can toggle it using \\[rng-validate-mode].
+
+\\[indent-for-tab-command] indents the current line appropriately.
+This can be customized using the variable `nxml-child-indent'
+and the variable `nxml-attribute-indent'.
+
+\\[nxml-insert-named-char] inserts a character reference using
+the character's name (by default, the Unicode name). \\[universal-argument] \\[nxml-insert-named-char]
+inserts the character directly.
+
+The Emacs commands that normally operate on balanced expressions will
+operate on XML markup items.  Thus \\[forward-sexp] will move forward
+across one markup item; \\[backward-sexp] will move backward across
+one markup item; \\[kill-sexp] will kill the following markup item;
+\\[mark-sexp] will mark the following markup item.  By default, each
+tag each treated as a single markup item; to make the complete element
+be treated as a single markup item, set the variable
+`nxml-sexp-element-flag' to t.  For more details, see the function
+`nxml-forward-balanced-item'.
+
+\\[nxml-backward-up-element] and \\[nxml-down-element] move up and down the element structure.
+
+Many aspects this mode can be customized using
+\\[customize-group] nxml RET."
+  (interactive)
+  (kill-all-local-variables)
+  (setq major-mode 'nxml-mode)
+  (setq mode-name "nXML")
+  ;; We'll determine the fill prefix ourselves
+  (make-local-variable 'adaptive-fill-mode)
+  (setq adaptive-fill-mode nil)
+  (make-local-variable 'forward-sexp-function)
+  (setq forward-sexp-function 'nxml-forward-balanced-item)
+  (make-local-variable 'indent-line-function)
+  (setq indent-line-function 'nxml-indent-line)
+  (make-local-variable 'fill-paragraph-function)
+  (setq fill-paragraph-function 'nxml-do-fill-paragraph)
+  ;; Comment support
+  ;; This doesn't seem to work too well;
+  ;; I think we should probably roll our own nxml-comment-dwim function.
+  (make-local-variable 'comment-indent-function)
+  (setq comment-indent-function 'nxml-indent-line)
+  (make-local-variable 'comment-start)
+  (setq comment-start "<!--")
+  (make-local-variable 'comment-start-skip)
+  (setq comment-start-skip "<!--[ \t\r\n]*")
+  (make-local-variable 'comment-end)
+  (setq comment-end "-->")
+  (make-local-variable 'comment-end-skip)
+  (setq comment-end-skip "[ \t\r\n]*-->")
+  (make-local-variable 'comment-line-break-function)
+  (setq comment-line-break-function 'nxml-newline-and-indent)
+  (use-local-map nxml-mode-map)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-clear-dependent-regions (point-min) (point-max))
+      (setq nxml-scan-end (copy-marker (point-min) nil))
+      (nxml-with-unmodifying-text-property-changes
+       (when nxml-syntax-highlight-flag
+         (nxml-clear-fontified (point-min) (point-max)))
+       (nxml-clear-inside (point-min) (point-max))
+       (nxml-with-invisible-motion
+         (nxml-scan-prolog)))))
+  (when nxml-syntax-highlight-flag
+    (add-hook 'fontification-functions 'nxml-fontify nil t))
+  (add-hook 'after-change-functions 'nxml-after-change nil t)
+  (add-hook 'write-contents-hooks 'nxml-prepare-to-save)
+  (when (not (and (buffer-file-name) (file-exists-p (buffer-file-name))))
+    (when (and nxml-default-buffer-file-coding-system
+              (not (local-variable-p 'buffer-file-coding-system)))
+      (setq buffer-file-coding-system nxml-default-buffer-file-coding-system))
+    (when nxml-auto-insert-xml-declaration-flag
+      (nxml-insert-xml-declaration)))
+  (run-hooks 'nxml-mode-hook))
+
+(defun nxml-degrade (context err)
+  (message "Internal nXML mode error in %s (%s), degrading"
+          context
+          (error-message-string err))
+  (ding)
+  (setq nxml-degraded t)
+  (setq nxml-prolog-end 1)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-unmodifying-text-property-changes
+       (nxml-clear-face (point-min) (point-max))
+       (nxml-set-fontified (point-min) (point-max))
+       (nxml-clear-inside (point-min) (point-max)))
+      (setq mode-name "nXML/degraded"))))
+
+;;; Change management
+
+(defun nxml-after-change (start end pre-change-length)
+  ;; Work around bug in insert-file-contents.
+  (when (> end (1+ (buffer-size)))
+    (setq start 1)
+    (setq end (1+ (buffer-size))))
+  (unless nxml-degraded
+    (condition-case err
+       (save-excursion
+         (save-restriction
+           (widen)
+           (save-match-data
+             (nxml-with-invisible-motion
+               (nxml-with-unmodifying-text-property-changes
+                 (nxml-after-change1 start end pre-change-length))))))
+      (error
+       (nxml-degrade 'nxml-after-change err)))))
+
+(defun nxml-after-change1 (start end pre-change-length)
+  (setq nxml-last-fontify-end nil)
+  (let ((pre-change-end (+ start pre-change-length)))
+    (setq start
+         (nxml-adjust-start-for-dependent-regions start
+                                                  end
+                                                  pre-change-length))
+    (when (<= start
+             ;; Add 2 so as to include the < and following char
+             ;; that start the instance, since changing these
+             ;; can change where the prolog ends.
+             (+ nxml-prolog-end 2))
+      ;; end must be extended to at least the end of the old prolog
+      (when (< pre-change-end nxml-prolog-end)
+       (setq end
+             ;; don't let end get out of range even if pre-change-length
+             ;; is bogus
+             (min (point-max)
+                  (+ end (- nxml-prolog-end pre-change-end)))))
+      (nxml-scan-prolog)))
+  (cond ((<= end nxml-prolog-end)
+        (setq end nxml-prolog-end)
+        (goto-char start)
+        ;; This is so that Emacs redisplay works
+        (setq start (line-beginning-position)))
+       ((and (<= start nxml-scan-end)
+             (> start (point-min))
+             (nxml-get-inside (1- start)))
+        ;; The closing delimiter might have been removed.
+        ;; So we may need to redisplay from the beginning
+        ;; of the token.
+        (goto-char (1- start))
+        (nxml-move-outside-backwards)
+        ;; This is so that Emacs redisplay works
+        (setq start (line-beginning-position))
+        (setq end (max (nxml-scan-after-change (point) end)
+                       end)))
+       (t
+        (goto-char start)
+        ;; This is both for redisplay and to move back
+        ;; past any incomplete opening delimiters
+        (setq start (line-beginning-position))
+        (setq end (max (nxml-scan-after-change start end)
+                       end))))
+  (when nxml-syntax-highlight-flag
+    (when (>= start end)
+      ;; Must clear at least one char so as to trigger redisplay.
+      (cond ((< start (point-max))
+            (setq end (1+ start)))
+           (t
+            (setq end (point-max))
+            (goto-char end)
+            (setq start (line-beginning-position)))))
+    (nxml-clear-fontified start end)))
+  
+;;; Encodings
+
+(defun nxml-insert-xml-declaration ()
+  "Insert an XML declaration at the beginning of buffer.
+The XML declaration will declare an encoding depending on the buffer's
+`buffer-file-coding-system'."
+  (interactive "*")
+  (let ((coding-system
+        (if (and buffer-file-coding-system
+                 (coding-system-p buffer-file-coding-system)
+                 (coding-system-get buffer-file-coding-system
+                                    'mime-charset))
+            buffer-file-coding-system
+          (nxml-choose-utf-coding-system))))
+    (goto-char (point-min))
+    (insert (format "<?xml version=\"1.0\" encoding=\"%s\"?>\n"
+                   (nxml-coding-system-name coding-system)))))
+
+(defun nxml-prepare-to-save ()
+  (unless (and (not enable-multibyte-characters)
+              (local-variable-p 'buffer-file-coding-system)
+              buffer-file-coding-system
+              (or (eq (coding-system-type buffer-file-coding-system) 5)
+                  (eq buffer-file-coding-system 'no-conversion)))
+    (save-excursion
+      (setq buffer-file-coding-system (nxml-select-coding-system))))
+  ;; nil from a function in `write-contents-hooks' means
+  ;; to continue and write the file as normal
+  nil)
+
+(defun nxml-select-coding-system ()
+  (let* ((suitable-coding-systems
+         (find-coding-systems-region (point-min) (point-max)))
+        (enc-pos (progn
+                   (goto-char (point-min))
+                   (xmltok-get-declared-encoding-position)))
+        (enc-name
+         (and (consp enc-pos)
+              (buffer-substring-no-properties (car enc-pos)
+                                              (cdr enc-pos))))
+        (coding-system
+         (cond (enc-name
+                (if (string= (downcase enc-name) "utf-16")
+                    (nxml-choose-utf-16-coding-system)
+                  (nxml-mime-charset-coding-system enc-name)))
+               (enc-pos (nxml-choose-utf-coding-system)))))
+    ;; Make sure we have a coding-system
+    (unless coding-system
+      (setq coding-system
+           (and (not buffer-read-only)
+                (nxml-choose-suitable-coding-system
+                 suitable-coding-systems)))
+      (let ((message
+            (if enc-name
+                (format "Unknown encoding %s" enc-name)
+              "XML declaration is not well-formed")))
+       (cond ((not coding-system)
+              (error "%s" message))
+             ((y-or-n-p
+               (concat message
+                       ". "
+                       (format (if enc-name
+                                   "Save with %s"
+                                 "Modify and save with encoding %s")
+                               (nxml-coding-system-name coding-system))
+                       " "))
+              (nxml-fix-encoding-declaration enc-pos coding-system))
+             (t (signal 'quit nil)))))
+    ;; Make sure it can encode all the characters in the buffer
+    (unless (or (memq (coding-system-base coding-system)
+                     suitable-coding-systems)
+               (equal suitable-coding-systems '(undecided)))
+      (let ((message
+            (nxml-unsuitable-coding-system-message coding-system
+                                                   enc-name)))
+       (setq coding-system
+             (and (not buffer-read-only)
+                  (nxml-choose-suitable-coding-system
+                   suitable-coding-systems)))
+       (cond ((not coding-system) (error "%s" message))
+             ((y-or-n-p (concat message
+                                (format ". Save with %s "
+                                        (nxml-coding-system-name
+                                         coding-system))))
+              (nxml-fix-encoding-declaration enc-pos coding-system))
+             (t (signal 'quit nil)))))
+    ;; Merge the newline type of our existing encoding
+    (let ((current-eol-type
+          (coding-system-eol-type buffer-file-coding-system)))
+      (when (and current-eol-type (integerp current-eol-type))
+       (setq coding-system
+             (coding-system-change-eol-conversion coding-system
+                                                  current-eol-type))))
+    coding-system))
+
+(defun nxml-unsuitable-coding-system-message (coding-system &optional enc-name)
+  (if (nxml-coding-system-unicode-p coding-system)
+      "Cannot translate some characters to Unicode"
+    (format "Cannot encode some characters with %s"
+           (or enc-name
+               (nxml-coding-system-name coding-system)))))
+
+(defconst nxml-utf-16-coding-systems (and (coding-system-p 'utf-16-be)
+                                         (coding-system-p 'utf-16-le)
+                                         '(utf-16-be utf-16-le)))
+
+(defconst nxml-utf-coding-systems (cons 'utf-8 nxml-utf-16-coding-systems))
+
+(defun nxml-coding-system-unicode-p (coding-system)
+  (nxml-coding-system-member (coding-system-base coding-system)
+                            nxml-utf-coding-systems))
+
+(defun nxml-coding-system-name (coding-system)
+  (setq coding-system (coding-system-base coding-system))
+  (symbol-name
+   (if (nxml-coding-system-member coding-system nxml-utf-16-coding-systems)
+       'utf-16
+     (or (coding-system-get coding-system 'mime-charset)
+        coding-system))))
+
+(defun nxml-fix-encoding-declaration (enc-pos coding-system)
+  (let ((charset (nxml-coding-system-name coding-system)))
+    (cond ((consp enc-pos)
+          (delete-region (car enc-pos) (cdr enc-pos))
+          (goto-char (car enc-pos))
+          (insert charset))
+         ((integerp enc-pos)
+          (goto-char enc-pos)
+          (insert " encoding=\"" charset ?\"))
+         (t
+          (goto-char (point-min))
+          (insert "<?xml version=\"1.0\" encoding=\""
+                  charset
+                  "\"?>\n")
+          (when (and (not enc-pos)
+                     (let ((case-fold-search t))
+                       (looking-at xmltok-bad-xml-decl-regexp)))
+            (delete-region (point) (match-end 0)))))))
+
+(defun nxml-choose-suitable-coding-system (suitable-coding-systems)
+  (let (ret coding-system)
+    (if (and buffer-file-coding-system
+            (memq (coding-system-base buffer-file-coding-system)
+                  suitable-coding-systems))
+       buffer-file-coding-system
+      (while (and suitable-coding-systems (not ret))
+       (setq coding-system (car suitable-coding-systems))
+       (if (coding-system-get coding-system 'mime-charset)
+           (setq ret coding-system)
+         (setq suitable-coding-systems (cdr suitable-coding-systems))))
+      ret)))
+
+(defun nxml-choose-utf-coding-system ()             
+  (let ((cur (and (local-variable-p 'buffer-file-coding-system)
+                 buffer-file-coding-system
+                 (coding-system-base buffer-file-coding-system))))
+    (cond ((car (nxml-coding-system-member cur nxml-utf-coding-systems)))
+         ((and nxml-prefer-utf-16-to-utf-8-flag
+               (coding-system-p 'utf-16-le)
+               (coding-system-p 'utf-16-be))
+          (if nxml-prefer-utf-16-little-to-big-endian-flag
+              'utf-16-le
+            'utf-16-be))
+         (t 'utf-8))))
+
+(defun nxml-choose-utf-16-coding-system ()
+  (let ((cur (and (local-variable-p 'buffer-file-coding-system)
+                 buffer-file-coding-system
+                 (coding-system-base buffer-file-coding-system))))
+    (cond ((car (nxml-coding-system-member cur nxml-utf-16-coding-systems)))
+         (nxml-prefer-utf-16-little-to-big-endian-flag
+          (and (coding-system-p 'utf-16-le) 'utf-16-le))
+         (t (and (coding-system-p 'utf-16-be) 'utf-16-be)))))
+
+(defun nxml-coding-system-member (coding-system coding-systems)
+  (let (ret)
+    (while (and coding-systems (not ret))
+      (if (coding-system-equal coding-system
+                              (car coding-systems))
+         (setq ret coding-systems)
+       (setq coding-systems (cdr coding-systems))))
+    ret))
+
+;;; Fontification
+
+(defun nxml-fontify (start)
+  (condition-case err
+      (save-excursion
+       (save-restriction
+         (widen)
+         (save-match-data
+           (nxml-with-invisible-motion
+             (nxml-with-unmodifying-text-property-changes
+               (if (or nxml-degraded
+                       ;; just in case we get called in the wrong buffer
+                       (not nxml-prolog-end))
+                   (nxml-set-fontified start (point-max))
+                 (nxml-fontify1 start)))))))
+    (error
+     (nxml-degrade 'nxml-fontify err))))
+
+(defun nxml-fontify1 (start)
+  (cond ((< start nxml-prolog-end)
+        (nxml-fontify-prolog)
+        (nxml-set-fontified (point-min)
+                            nxml-prolog-end))
+       (t
+        (goto-char start)
+        (when (not (eq nxml-last-fontify-end start))
+          (when (not (equal (char-after) ?\<))
+            (search-backward "<" nxml-prolog-end t))
+          (nxml-ensure-scan-up-to-date)
+          (nxml-move-outside-backwards))
+        (let ((start (point)))
+          (nxml-do-fontify (min (point-max)
+                                (+ start nxml-fontify-chunk-size)))
+          (setq nxml-last-fontify-end (point))
+          (nxml-set-fontified start nxml-last-fontify-end)))))
+
+(defun nxml-fontify-buffer ()
+  (interactive)
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-invisible-motion
+       (goto-char (point-min))
+       (nxml-with-unmodifying-text-property-changes
+         (nxml-fontify-prolog)
+         (goto-char nxml-prolog-end)
+         (nxml-do-fontify))))))
+
+(defun nxml-fontify-prolog ()
+  "Fontify the prolog.
+The buffer is assumed to be prepared for fontification.
+This does not set the fontified property, but it does clear
+faces appropriately."
+  (let ((regions nxml-prolog-regions))
+    (nxml-clear-face (point-min) nxml-prolog-end)
+    (while regions
+      (let ((region (car regions)))
+       (nxml-apply-fontify-rule (aref region 0)
+                                (aref region 1)
+                                (aref region 2)))
+      (setq regions (cdr regions)))))
+
+(defun nxml-do-fontify (&optional bound)
+  "Fontify at least as far as bound.
+Leave point after last fontified position."
+  (unless bound (setq bound (point-max)))
+  (let (xmltok-dependent-regions
+       xmltok-errors)
+    (while (and (< (point) bound)
+               (nxml-tokenize-forward))
+      (nxml-clear-face xmltok-start (point))
+      (nxml-apply-fontify-rule))))
+
+;; Vectors identify a substring of the token to be highlighted in some face.
+
+;; Token types returned by xmltok-forward.
+
+(put 'start-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [-1 nil nxml-tag-delimiter-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'partial-start-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'end-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [1 2 nxml-tag-slash-face]
+       [-1 nil nxml-tag-delimiter-face]
+       (element-qname . 2)))
+
+(put 'partial-end-tag
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [1 2 nxml-tag-slash-face]
+       (element-qname . 2)))
+
+(put 'empty-element
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [-2 -1 nxml-tag-slash-face]
+       [-1 nil nxml-tag-delimiter-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'partial-empty-element
+     'nxml-fontify-rule
+     '([nil 1 nxml-tag-delimiter-face]
+       [-1 nil nxml-tag-slash-face]
+       (element-qname . 1)
+       attributes))
+
+(put 'char-ref
+     'nxml-fontify-rule
+     '([nil 2 nxml-char-ref-delimiter-face]
+       [2 -1 nxml-char-ref-number-face]
+       [-1 nil nxml-char-ref-delimiter-face]
+       char-ref))
+
+(put 'entity-ref
+     'nxml-fontify-rule
+     '([nil 1 nxml-entity-ref-delimiter-face]
+       [1 -1 nxml-entity-ref-name-face]
+       [-1 nil nxml-entity-ref-delimiter-face]))
+
+(put 'comment
+     'nxml-fontify-rule
+     '([nil 4 nxml-comment-delimiter-face]
+       [4 -3 nxml-comment-content-face]
+       [-3 nil nxml-comment-delimiter-face]))
+
+(put 'processing-instruction
+     'nxml-fontify-rule
+     '([nil 2 nxml-processing-instruction-delimiter-face]
+       [-2 nil nxml-processing-instruction-delimiter-face]
+       processing-instruction-content))
+
+(put 'cdata-section
+     'nxml-fontify-rule
+     '([nil 3 nxml-cdata-section-delimiter-face] ; <![
+       [3 8 nxml-cdata-section-CDATA-face] ; CDATA
+       [8 9 nxml-cdata-section-delimiter-face] ; [
+       [9 -3 nxml-cdata-section-content-face] ; ]]>
+       [-3 nil nxml-cdata-section-delimiter-face]))
+
+(put 'data
+     'nxml-fontify-rule
+     '([nil nil nxml-text-face]))
+
+;; Prolog region types in list returned by xmltok-forward-prolog.
+
+(put 'xml-declaration
+     'nxml-fontify-rule
+     '([nil 2 nxml-processing-instruction-delimiter-face]
+       [2 5 nxml-processing-instruction-target-face]
+       [-2 nil nxml-processing-instruction-delimiter-face]))
+
+(put 'xml-declaration-attribute-name
+     'nxml-fontify-rule
+     '([nil nil nxml-attribute-local-name-face]))
+
+(put 'xml-declaration-attribute-value
+     'nxml-fontify-rule
+     '([nil 1 nxml-attribute-value-delimiter-face]
+       [1 -1 nxml-attribute-value-face]
+       [-1 nil nxml-attribute-value-delimiter-face]))
+
+(put 'processing-instruction-left
+     'nxml-fontify-rule
+     '([nil 2 nxml-processing-instruction-delimiter-face]
+       [2 nil nxml-processing-instruction-target-face]))
+
+(put 'processing-instruction-right
+     'nxml-fontify-rule
+     '([nil -2 nxml-processing-instruction-content-face]
+       [-2 nil nxml-processing-instruction-delimiter-face]))
+
+(put 'literal
+     'nxml-fontify-rule
+     '([nil 1 nxml-prolog-literal-delimiter-face]
+       [1 -1 nxml-prolog-literal-content-face]
+       [-1 nil nxml-prolog-literal-delimiter-face]))
+
+(put 'keyword
+     'nxml-fontify-rule
+     '([nil nil nxml-prolog-keyword-face]))
+
+(put 'markup-declaration-open
+     'nxml-fontify-rule
+     '([0 2 nxml-markup-declaration-delimiter-face]
+       [2 nil nxml-prolog-keyword-face]))
+
+(put 'markup-declaration-close
+     'nxml-fontify-rule
+     '([nil nil nxml-markup-declaration-delimiter-face]))
+
+(put 'internal-subset-open
+     'nxml-fontify-rule
+     '([nil nil nxml-markup-declaration-delimiter-face]))
+
+(put 'internal-subset-close
+     'nxml-fontify-rule
+     '([nil 1 nxml-markup-declaration-delimiter-face]
+       [-1 nil nxml-markup-declaration-delimiter-face]))
+
+(put 'hash-name
+     'nxml-fontify-rule
+     '([nil 1 nxml-hash-face]
+       [1 nil nxml-prolog-keyword-face]))
+
+(defun nxml-apply-fontify-rule (&optional type start end)
+  (let ((rule (get (or type xmltok-type) 'nxml-fontify-rule)))
+    (unless start (setq start xmltok-start))
+    (unless end (setq end (point)))
+    (while rule
+      (let* ((action (car rule)))
+       (setq rule (cdr rule))
+       (cond ((vectorp action)
+              (nxml-set-face (let ((offset (aref action 0)))
+                               (cond ((not offset) start)
+                                     ((< offset 0) (+ end offset))
+                                     (t (+ start offset))))
+                             (let ((offset (aref action 1)))
+                               (cond ((not offset) end)
+                                     ((< offset 0) (+ end offset))
+                                     (t (+ start offset))))
+                             (aref action 2)))
+             ((and (consp action)
+                   (eq (car action) 'element-qname))
+              (when xmltok-name-end ; maybe nil in partial-end-tag case
+                (nxml-fontify-qname (+ start (cdr action))
+                                    xmltok-name-colon
+                                    xmltok-name-end
+                                    'nxml-element-prefix-face
+                                    'nxml-element-colon-face
+                                    'nxml-element-local-name-face)))
+             ((eq action 'attributes)
+              (nxml-fontify-attributes))
+             ((eq action 'processing-instruction-content)
+              (nxml-set-face (+ start 2)
+                             xmltok-name-end
+                             'nxml-processing-instruction-target-face)
+              (nxml-set-face (save-excursion
+                               (goto-char xmltok-name-end)
+                               (skip-chars-forward " \t\r\n")
+                               (point))
+                             (- end 2)
+                             'nxml-processing-instruction-content-face))
+             ((eq action 'char-ref)
+              (nxml-char-ref-display-extra start
+                                           end
+                                           (xmltok-char-number start end)))
+             (t (error "Invalid nxml-fontify-rule action %s" action)))))))
+
+(defun nxml-fontify-attributes ()
+  (while xmltok-namespace-attributes
+    (nxml-fontify-attribute (car xmltok-namespace-attributes)
+                           'namespace)
+    (setq xmltok-namespace-attributes
+         (cdr xmltok-namespace-attributes)))
+  (while xmltok-attributes
+    (nxml-fontify-attribute (car xmltok-attributes))
+    (setq xmltok-attributes
+         (cdr xmltok-attributes))))
+
+(defun nxml-fontify-attribute (att &optional namespace-declaration)
+  (if namespace-declaration
+      (nxml-fontify-qname (xmltok-attribute-name-start att)
+                         (xmltok-attribute-name-colon att)
+                         (xmltok-attribute-name-end att)
+                         'nxml-namespace-attribute-xmlns-face
+                         'nxml-namespace-attribute-colon-face
+                         'nxml-namespace-attribute-prefix-face
+                         'nxml-namespace-attribute-xmlns-face)
+    (nxml-fontify-qname (xmltok-attribute-name-start att)
+                       (xmltok-attribute-name-colon att)
+                       (xmltok-attribute-name-end att)
+                       'nxml-attribute-prefix-face
+                       'nxml-attribute-colon-face
+                       'nxml-attribute-local-name-face))
+  (let ((start (xmltok-attribute-value-start att))
+       (end (xmltok-attribute-value-end att))
+       (refs (xmltok-attribute-refs att))
+       (delimiter-face (if namespace-declaration
+                           'nxml-namespace-attribute-value-delimiter-face
+                         'nxml-attribute-value-delimiter-face))
+       (value-face (if namespace-declaration
+                       'nxml-namespace-attribute-value-face
+                     'nxml-attribute-value-face)))
+    (when start
+      (nxml-set-face (1- start) start delimiter-face)
+      (nxml-set-face end (1+ end) delimiter-face)
+      (while refs
+       (let* ((ref (car refs))
+              (ref-type (aref ref 0))
+              (ref-start (aref ref 1))
+              (ref-end (aref ref 2)))
+         (nxml-set-face start ref-start value-face)
+         (nxml-apply-fontify-rule ref-type ref-start ref-end)
+         (setq start ref-end))
+       (setq refs (cdr refs)))
+      (nxml-set-face start end value-face))))
+
+(defun nxml-fontify-qname (start
+                          colon
+                          end
+                          prefix-face
+                          colon-face
+                          local-name-face
+                          &optional
+                          unprefixed-face)
+  (cond (colon (nxml-set-face start colon prefix-face)
+              (nxml-set-face colon (1+ colon) colon-face)
+              (nxml-set-face (1+ colon) end local-name-face))
+       (t (nxml-set-face start end (or unprefixed-face
+                                       local-name-face)))))
+
+;;; Editing
+
+(defun nxml-electric-slash (arg)
+  "Insert a slash.
+
+With a prefix ARG, do nothing other than insert the slash.
+
+Otherwise, if `nxml-slash-auto-complete-flag' is non-nil, insert the
+rest of the end-tag or empty-element if the slash is potentially part
+of an end-tag or the close of an empty-element.
+
+If the slash is part of an end-tag that is the first non-whitespace
+on the line, reindent the line."
+  (interactive "*P")
+  (nxml-ensure-scan-up-to-date)
+  (let* ((slash-pos (point))
+        (end-tag-p (and (eq (char-before slash-pos) ?<)
+                        (not (nxml-get-inside slash-pos))))
+        (at-indentation (save-excursion
+                          (back-to-indentation)
+                          (eq (point) (1- slash-pos)))))
+    (self-insert-command (prefix-numeric-value arg))
+    (unless arg
+      (if nxml-slash-auto-complete-flag
+         (if end-tag-p
+             (condition-case err
+                 (let ((start-tag-end
+                        (nxml-scan-element-backward (1- slash-pos) t)))
+                   (when start-tag-end
+                     (insert (xmltok-start-tag-qname) ">")
+                     ;; copy the indentation of the start-tag
+                     (when (and at-indentation
+                                (save-excursion
+                                  (goto-char xmltok-start)
+                                  (back-to-indentation)
+                                  (eq (point) xmltok-start)))
+                       (save-excursion
+                         (indent-line-to (save-excursion
+                                           (goto-char xmltok-start)
+                                           (current-column)))))))
+               (nxml-scan-error nil))
+           (when (and (eq (nxml-token-before) (point))
+                      (eq xmltok-type 'partial-empty-element))
+             (insert ">")))
+       (when (and end-tag-p at-indentation)
+         (nxml-indent-line))))))
+
+(defun nxml-balanced-close-start-tag-block ()
+  "Close the start-tag before point with `>' and insert a balancing end-tag.
+Point is left between the start-tag and the end-tag.
+If there is nothing but whitespace before the `<' that opens the
+start-tag, then put point on a blank line, and put the end-tag on
+another line aligned with the start-tag."
+  (interactive "*")
+  (nxml-balanced-close-start-tag 'block))
+
+(defun nxml-balanced-close-start-tag-inline ()
+  "Close the start-tag before point with `>' and insert a balancing end-tag.
+Point is left between the start-tag and the end-tag.
+No extra whitespace is inserted."
+  (interactive "*")
+  (nxml-balanced-close-start-tag 'inline))
+
+(defun nxml-balanced-close-start-tag (block-or-inline)
+  (let ((token-end (nxml-token-before))
+       (pos (1+ (point))))
+    (unless (or (eq xmltok-type 'partial-start-tag)
+               (and (memq xmltok-type '(start-tag
+                                        empty-element
+                                        partial-empty-element))
+                    (>= token-end pos)))
+      (error "Not in a start-tag"))
+    (insert "></"
+           (buffer-substring-no-properties (+ xmltok-start 1)
+                                           (min xmltok-name-end (point)))
+           ">")
+    (if (eq block-or-inline 'inline)
+       (goto-char pos)
+      (goto-char xmltok-start)
+      (back-to-indentation)
+      (if (= (point) xmltok-start)
+         (let ((indent (current-column)))
+         (goto-char pos)
+         (insert "\n")
+         (indent-line-to indent)
+         (goto-char pos)
+         (insert "\n")
+         (indent-line-to (+ nxml-child-indent indent)))
+       (goto-char pos)))))
+       
+(defun nxml-finish-element ()
+  "Finish the current element by inserting an end-tag."
+  (interactive "*")
+  (nxml-finish-element-1 nil))
+
+(defvar nxml-last-split-position nil
+  "Position where `nxml-split-element' split the current element.")
+
+(defun nxml-split-element ()
+  "Split the current element by inserting an end-tag and a start-tag.
+Point is left after the newly inserted start-tag.  When repeated,
+split immediately before the previously inserted start-tag and leave
+point unchanged."
+  (interactive "*")
+  (setq nxml-last-split-position
+       (if (and (eq last-command this-command)
+                nxml-last-split-position)
+           (save-excursion
+             (goto-char nxml-last-split-position)
+             (nxml-finish-element-1 t))
+         (nxml-finish-element-1 t))))
+
+(defun nxml-finish-element-1 (startp)
+  "Insert an end-tag for the current element and optionally a start-tag.
+The start-tag is inserted if STARTP is non-nil.  Return the position
+of the inserted start-tag or nil if none was inserted."
+  (interactive "*")
+  (let* ((token-end (nxml-token-before))
+        (start-tag-end
+         (save-excursion
+           (when (and (< (point) token-end)
+                      (memq xmltok-type
+                            '(cdata-section
+                              processing-instruction
+                              comment
+                              start-tag
+                              end-tag
+                              empty-element)))
+             (error "Point is inside a %s"
+                    (nxml-token-type-friendly-name xmltok-type)))
+           (nxml-scan-element-backward token-end t)))
+        (starts-line
+         (save-excursion
+           (unless (eq xmltok-type 'start-tag)
+             (error "No matching start-tag"))
+           (goto-char xmltok-start)
+           (back-to-indentation)
+           (eq (point) xmltok-start)))
+        (ends-line
+         (save-excursion
+           (goto-char start-tag-end)
+           (looking-at "[ \t\r\n]*$")))
+        (start-tag-indent (save-excursion
+                            (goto-char xmltok-start)
+                            (current-column)))
+        (qname (xmltok-start-tag-qname))
+        inserted-start-tag-pos)
+    (when (and starts-line ends-line)
+      ;; start-tag is on a line by itself
+      ;; => put the end-tag on a line by itself
+      (unless (<= (point)
+                 (save-excursion
+                   (back-to-indentation)
+                   (point)))
+       (insert "\n"))
+      (indent-line-to start-tag-indent))
+    (insert "</" qname ">")
+    (when startp
+      (when starts-line
+       (insert "\n")
+       (indent-line-to start-tag-indent))
+      (setq inserted-start-tag-pos (point))
+      (insert "<" qname ">")
+      (when (and starts-line ends-line)
+       (insert "\n")
+       (indent-line-to (save-excursion
+                         (goto-char xmltok-start)
+                         (forward-line 1)
+                         (back-to-indentation)
+                         (if (= (current-column)
+                                (+ start-tag-indent nxml-child-indent))
+                             (+ start-tag-indent nxml-child-indent)
+                           start-tag-indent)))))
+    inserted-start-tag-pos))
+
+;;; Indentation
+
+(defun nxml-indent-line ()
+  "Indent current line as XML."
+  (let ((indent (nxml-compute-indent))
+       (from-end (- (point-max) (point))))
+    (when indent
+      (beginning-of-line)
+      (let ((bol (point)))
+       (skip-chars-forward " \t")
+       (delete-region bol (point)))
+      (indent-to indent)
+      (when (> (- (point-max) from-end) (point))
+       (goto-char (- (point-max) from-end))))))
+
+(defun nxml-compute-indent ()
+  "Return the indent for the line containing point."
+  (or (nxml-compute-indent-from-matching-start-tag)
+      (nxml-compute-indent-from-previous-line)))
+
+(defun nxml-compute-indent-from-matching-start-tag ()
+  "Compute the indent for a line with an end-tag using the matching start-tag.
+When the line containing point ends with an end-tag and does not start
+in the middle of a token, return the indent of the line containing the
+matching start-tag, if there is one and it occurs at the beginning of
+its line.  Otherwise return nil."
+  (save-excursion
+    (back-to-indentation)
+    (let ((bol (point)))
+      (let ((inhibit-field-text-motion t))
+       (end-of-line))
+      (skip-chars-backward " \t")
+      (and (= (nxml-token-before) (point))
+          (memq xmltok-type '(end-tag partial-end-tag))
+          ;; start of line must not be inside a token
+          (or (= xmltok-start bol)
+              (save-excursion
+                (goto-char bol)
+                (nxml-token-after)
+                (= xmltok-start bol))
+              (eq xmltok-type 'data))
+          (condition-case err
+              (nxml-scan-element-backward
+               (point)
+               nil
+               (- (point)
+                  nxml-end-tag-indent-scan-distance))
+            (nxml-scan-error nil))
+          (< xmltok-start bol)
+          (progn
+            (goto-char xmltok-start)
+            (skip-chars-backward " \t")
+            (bolp))
+          (current-indentation)))))
+
+(defun nxml-compute-indent-from-previous-line ()
+  "Compute the indent for a line using the indentation of a previous line."
+  (save-excursion
+    (end-of-line)
+    (let ((eol (point))
+         bol prev-bol ref
+         before-context after-context)
+      (back-to-indentation)
+      (setq bol (point))
+      (catch 'indent
+       ;; Move backwards until the start of a non-blank line that is
+       ;; not inside a token.
+       (while (progn
+                (when (= (forward-line -1) -1)
+                  (throw 'indent 0))
+                (back-to-indentation)
+                (if (looking-at "[ \t]*$")
+                    t
+                  (or prev-bol
+                      (setq prev-bol (point)))
+                  (nxml-token-after)
+                  (not (or (= xmltok-start (point))
+                           (eq xmltok-type 'data))))))
+       (setq ref (point))
+       ;; Now scan over tokens until the end of the line to be indented.
+       ;; Determine the context before and after the beginning of the
+       ;; line.
+       (while (< (point) eol)
+         (nxml-tokenize-forward)
+         (cond ((<= bol xmltok-start)
+                (setq after-context
+                      (nxml-merge-indent-context-type after-context)))
+               ((and (<= (point) bol)
+                     (not (and (eq xmltok-type 'partial-start-tag)
+                               (= (point) bol))))
+                (setq before-context
+                      (nxml-merge-indent-context-type before-context)))
+               ((eq xmltok-type 'data)
+                (setq before-context
+                      (nxml-merge-indent-context-type before-context))
+                (setq after-context
+                      (nxml-merge-indent-context-type after-context)))
+               ;; If in the middle of a token that looks inline,
+               ;; then indent relative to the previous non-blank line
+               ((eq (nxml-merge-indent-context-type before-context)
+                    'mixed)
+                (goto-char prev-bol)
+                (throw 'indent (current-column)))
+               (t
+                (throw 'indent
+                       (nxml-compute-indent-in-token bol))))
+         (skip-chars-forward " \t\r\n"))
+       (goto-char ref)
+       (+ (current-column)
+          (* nxml-child-indent
+             (+ (if (eq before-context 'start-tag) 1 0)
+                (if (eq after-context 'end-tag) -1 0))))))))
+
+(defun nxml-merge-indent-context-type (context)
+  "Merge the indent context type CONTEXT with the token in `xmltok-type'.
+Return the merged indent context type.  An indent context type is
+either nil or one of the symbols start-tag, end-tag, markup, comment,
+mixed."
+  (cond ((memq xmltok-type '(start-tag partial-start-tag))
+        (if (memq context '(nil start-tag comment))
+            'start-tag
+          'mixed))
+       ((memq xmltok-type '(end-tag partial-end-tag))
+        (if (memq context '(nil end-tag comment))
+            'end-tag
+          'mixed))
+       ((eq xmltok-type 'comment)
+        (cond ((memq context '(start-tag end-tag comment))
+               context)
+              (context 'mixed)
+              (t 'comment)))
+       (context 'mixed)
+       (t 'markup)))
+
+(defun nxml-compute-indent-in-token (pos)
+  "Return the indent for a line that starts inside a token.
+POS is the position of the first non-whitespace character of the line.
+This expects the xmltok-* variables to be set up as by `xmltok-forward'."
+  (cond ((memq xmltok-type '(start-tag
+                            partial-start-tag
+                            empty-element
+                            partial-empty-element))
+        (nxml-compute-indent-in-start-tag pos))
+       ((eq xmltok-type 'comment)
+        (nxml-compute-indent-in-delimited-token pos "<!--" "-->"))
+       ((eq xmltok-type 'cdata-section)
+        (nxml-compute-indent-in-delimited-token pos "<![CDATA[" "]]>"))
+       ((eq xmltok-type 'processing-instruction)
+        (nxml-compute-indent-in-delimited-token pos "<?" "?>"))
+       (t
+        (goto-char pos)
+        (if (and (= (forward-line -1) 0)
+                 (< xmltok-start (point)))
+            (back-to-indentation)
+          (goto-char xmltok-start))
+        (current-column))))
+
+(defun nxml-compute-indent-in-start-tag (pos)
+  "Return the indent for a line that starts inside a start-tag.
+Also for a line that starts inside an empty element.
+POS is the position of the first non-whitespace character of the line.
+This expects the xmltok-* variables to be set up as by `xmltok-forward'."
+  (let ((value-boundary (nxml-attribute-value-boundary pos))
+       (off 0))
+    (if value-boundary
+       ;; inside an attribute value
+       (let ((value-start (car value-boundary))
+             (value-end (cdr value-boundary)))
+         (goto-char pos)
+         (forward-line -1)
+         (if (< (point) value-start)
+             (goto-char value-start)
+           (back-to-indentation)))
+      ;; outside an attribute value
+      (goto-char pos)
+      (while (and (= (forward-line -1) 0)
+                 (nxml-attribute-value-boundary (point))))
+      (cond ((<= (point) xmltok-start)
+            (goto-char xmltok-start)
+            (setq off nxml-attribute-indent)
+            (let ((atts (xmltok-merge-attributes)))
+              (when atts
+                (let* ((att (car atts))
+                       (start (xmltok-attribute-name-start att)))
+                  (when (< start pos)
+                    (goto-char start)
+                    (setq off 0))))))
+           (t
+            (back-to-indentation))))
+    (+ (current-column) off)))
+
+(defun nxml-attribute-value-boundary (pos)
+  "Return a pair (START . END) if POS is inside an attribute value.
+Otherwise return nil.  START and END are the positions of the start
+and end of the attribute value containing POS.  This expects the
+xmltok-* variables to be set up as by `xmltok-forward'."
+  (let ((atts (xmltok-merge-attributes))
+       att value-start value-end value-boundary)
+    (while atts
+      (setq att (car atts))
+      (setq value-start (xmltok-attribute-value-start att))
+      (setq value-end (xmltok-attribute-value-end att))
+      (cond ((and value-start (< pos value-start))
+            (setq atts nil))
+           ((and value-start value-end (<= pos value-end))
+            (setq value-boundary (cons value-start value-end))
+            (setq atts nil))
+           (t (setq atts (cdr atts)))))
+    value-boundary))
+            
+(defun nxml-compute-indent-in-delimited-token (pos open-delim close-delim)
+  "Return the indent for a line that starts inside a token with delimiters.
+OPEN-DELIM and CLOSE-DELIM are strings giving the opening and closing
+delimiters.  POS is the position of the first non-whitespace character
+of the line.  This expects the xmltok-* variables to be set up as by
+`xmltok-forward'."
+  (cond ((let ((end (+ pos (length close-delim))))
+          (and (<= end (point-max))
+               (string= (buffer-substring-no-properties pos end)
+                        close-delim)))
+        (goto-char xmltok-start))
+       ((progn
+          (goto-char pos)
+          (forward-line -1)
+          (<= (point) xmltok-start))
+        (goto-char (+ xmltok-start (length open-delim)))
+        (when (and (string= open-delim "<!--")
+                   (looking-at " "))
+          (goto-char (1+ (point)))))
+       (t (back-to-indentation)))
+  (current-column))
+
+;;; Completion
+
+(defun nxml-complete ()
+  "Perform completion on the symbol preceding point.
+
+Inserts as many characters as can be completed.  However, if not even
+one character can be completed, then a buffer with the possibilities
+is popped up and the symbol is read from the minibuffer with
+completion. If the symbol is complete, then any characters that must
+follow the symbol are also inserted.
+
+The name space used for completion and what is treated as a symbol
+depends on the context.  The contexts in which completion is performed
+depend on `nxml-completion-hook'."
+  (interactive)
+  (unless (run-hook-with-args-until-success 'nxml-completion-hook)
+    ;; Eventually we will complete on entity names here.
+    (ding)
+    (message "Cannot complete in this context")))
+
+;;; Movement
+
+(defun nxml-forward-balanced-item (&optional arg)
+  "Move forward across one balanced item.
+With ARG, do it that many times.  Negative arg -N means
+move backward across N balanced expressions.
+This is the equivalent of `forward-sexp' for XML.
+
+An element contains as items strings with no markup, tags, processing
+instructions, comments, CDATA sections, entity references and
+characters references. However, if the variable
+`nxml-sexp-element-flag' is non-nil, then an element is treated as a
+single markup item.  A start-tag contains an element name followed by
+one or more attributes.  An end-tag contains just an element name.  An
+attribute value literals contains strings with no markup, entity
+references and character references.  A processing instruction
+consists of a target and a content string.  A comment or a CDATA
+section contains a single string.  An entity reference contains a
+single name.  A character reference contains a character number."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (cond ((> arg 0)
+        (while (progn
+                 (nxml-forward-single-balanced-item)
+                 (> (setq arg (1- arg)) 0))))
+       ((< arg 0)
+        (while (progn
+                 (nxml-backward-single-balanced-item)
+                 (< (setq arg (1+ arg)) 0))))))
+
+(defun nxml-forward-single-balanced-item ()
+  (condition-case err
+      (goto-char (let ((end (nxml-token-after)))
+                  (save-excursion
+                    (while (eq xmltok-type 'space)
+                      (goto-char end)
+                      (setq end (nxml-token-after)))
+                    (cond ((/= (point) xmltok-start)
+                           (nxml-scan-forward-within end))
+                          ((and nxml-sexp-element-flag
+                                (eq xmltok-type 'start-tag))
+                           ;; can't ever return nil here
+                           (nxml-scan-element-forward xmltok-start))
+                          ((and nxml-sexp-element-flag
+                                (memq xmltok-type
+                                      '(end-tag partial-end-tag)))
+                           (error "Already at end of element"))
+                          (t end)))))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err)))))
+
+(defun nxml-backward-single-balanced-item ()
+  (condition-case err
+      (goto-char (let ((end (nxml-token-before)))
+                  (save-excursion
+                    (while (eq xmltok-type 'space)
+                      (goto-char xmltok-start)
+                      (setq end (nxml-token-before)))
+                    (cond ((/= (point) end)
+                           (nxml-scan-backward-within end))
+                          ((and nxml-sexp-element-flag
+                                (eq xmltok-type 'end-tag))
+                           ;; can't ever return nil here
+                           (nxml-scan-element-backward end)
+                           xmltok-start)
+                          ((and nxml-sexp-element-flag
+                                (eq xmltok-type 'start-tag))
+                           (error "Already at start of element"))
+                          (t xmltok-start)))))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err)))))
+
+(defun nxml-scan-forward-within (end)
+  (setq end (- end (nxml-end-delimiter-length xmltok-type)))
+  (when (<= end (point))
+    (error "Already at end of %s"
+          (nxml-token-type-friendly-name xmltok-type)))
+  (cond ((memq xmltok-type '(start-tag
+                            empty-element
+                            partial-start-tag
+                            partial-empty-element))
+        (if (< (point) xmltok-name-end)
+            xmltok-name-end
+          (let ((att (nxml-find-following-attribute)))
+            (cond ((not att) end)
+                  ((and (xmltok-attribute-value-start att)
+                        (<= (xmltok-attribute-value-start att)
+                            (point)))
+                   (nxml-scan-forward-in-attribute-value att))
+                  ((xmltok-attribute-value-end att)
+                   (1+ (xmltok-attribute-value-end att)))
+                  ((save-excursion
+                     (goto-char (xmltok-attribute-name-end att))
+                     (looking-at "[ \t\r\n]*="))
+                   (match-end 0))
+                  (t (xmltok-attribute-name-end att))))))
+       ((and (eq xmltok-type 'processing-instruction)
+             (< (point) xmltok-name-end))
+        xmltok-name-end)
+       (t end)))
+
+(defun nxml-scan-backward-within (end)
+  (setq xmltok-start
+       (+ xmltok-start
+          (nxml-start-delimiter-length xmltok-type)))
+  (when (<= (point) xmltok-start)
+    (error "Already at start of %s"
+          (nxml-token-type-friendly-name xmltok-type)))
+  (cond ((memq xmltok-type '(start-tag
+                            empty-element
+                            partial-start-tag
+                            partial-empty-element))
+        (let ((att (nxml-find-preceding-attribute)))
+          (cond ((not att) xmltok-start)
+                ((and (xmltok-attribute-value-start att)
+                      (<= (xmltok-attribute-value-start att)
+                          (point))
+                      (<= (point)
+                          (xmltok-attribute-value-end att)))
+                 (nxml-scan-backward-in-attribute-value att))
+                (t (xmltok-attribute-name-start att)))))
+       ((and (eq xmltok-type 'processing-instruction)
+             (let ((content-start (save-excursion
+                                    (goto-char xmltok-name-end)
+                                    (skip-chars-forward " \r\t\n")
+                                    (point))))
+               (and (< content-start (point))
+                    content-start))))
+       (t xmltok-start)))
+
+(defun nxml-scan-forward-in-attribute-value (att)
+  (when (= (point) (xmltok-attribute-value-end att))
+    (error "Already at end of attribute value"))
+  (let ((refs (xmltok-attribute-refs att))
+       ref)
+    (while refs
+      (setq ref (car refs))
+      (if (< (point) (aref ref 2))
+         (setq refs nil)
+       (setq ref nil)
+       (setq refs (cdr refs))))
+    (cond ((not ref)
+          (xmltok-attribute-value-end att))
+         ((< (point) (aref ref 1))
+          (aref ref 1))
+         ((= (point) (aref ref 1))
+          (aref ref 2))
+         (t
+          (let ((end (- (aref ref 2)
+                        (nxml-end-delimiter-length (aref ref 0)))))
+            (if (< (point) end)
+                end
+              (error "Already at end of %s"
+                     (nxml-token-type-friendly-name (aref ref 0)))))))))
+
+(defun nxml-scan-backward-in-attribute-value (att)
+  (when (= (point) (xmltok-attribute-value-start att))
+    (error "Already at start of attribute value"))
+  (let ((refs (reverse (xmltok-attribute-refs att)))
+       ref)
+    (while refs
+      (setq ref (car refs))
+      (if (< (aref ref 1) (point))
+         (setq refs nil)
+       (setq ref nil)
+       (setq refs (cdr refs))))
+    (cond ((not ref)
+          (xmltok-attribute-value-start att))
+         ((< (aref ref 2) (point))
+          (aref ref 2))
+         ((= (point) (aref ref 2))
+          (aref ref 1))
+         (t
+          (let ((start (+ (aref ref 1)
+                          (nxml-start-delimiter-length (aref ref 0)))))
+            (if (< start (point))
+                start
+              (error "Already at start of %s"
+                     (nxml-token-type-friendly-name (aref ref 0)))))))))
+
+(defun nxml-find-following-attribute ()
+  (let ((ret nil)
+       (atts (or xmltok-attributes xmltok-namespace-attributes))
+       (more-atts (and xmltok-attributes xmltok-namespace-attributes)))
+    (while atts
+      (let* ((att (car atts))
+            (name-start (xmltok-attribute-name-start att)))
+       (cond ((and (<= name-start (point))
+                   (xmltok-attribute-value-end att)
+                   ;; <= because end is before quote
+                   (<= (point) (xmltok-attribute-value-end att)))
+              (setq atts nil)
+              (setq ret att))
+             ((and (< (point) name-start)
+                   (or (not ret)
+                       (< name-start
+                          (xmltok-attribute-name-start ret))))
+              (setq ret att))))
+      (setq atts (cdr atts))
+      (unless atts
+       (setq atts more-atts)
+       (setq more-atts nil)))
+    ret))
+
+(defun nxml-find-preceding-attribute ()
+  (let ((ret nil)
+       (atts (or xmltok-attributes xmltok-namespace-attributes))
+       (more-atts (and xmltok-attributes xmltok-namespace-attributes)))
+    (while atts
+      (let* ((att (car atts))
+            (name-start (xmltok-attribute-name-start att)))
+       (cond ((and (< name-start (point))
+                   (xmltok-attribute-value-end att)
+                   ;; <= because end is before quote
+                   (<= (point) (xmltok-attribute-value-end att)))
+              (setq atts nil)
+              (setq ret att))
+             ((and (< name-start (point))
+                   (or (not ret)
+                       (< (xmltok-attribute-name-start ret)
+                          name-start)))
+              (setq ret att))))
+      (setq atts (cdr atts))
+      (unless atts
+       (setq atts more-atts)
+       (setq more-atts nil)))
+    ret))
+
+(defun nxml-up-element (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-backward-up-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point) (point-max)))
+         (let ((token-end (nxml-token-after)))
+           (goto-char (cond ((or (memq xmltok-type '(end-tag
+                                                     partial-end-tag))
+                                 (and (memq xmltok-type
+                                            '(empty-element
+                                              partial-empty-element))
+                                      (< xmltok-start (point))))
+                             token-end)
+                            ((nxml-scan-element-forward
+                              (if (and (eq xmltok-type 'start-tag)
+                                       (= (point) xmltok-start))
+                                  xmltok-start
+                                token-end)
+                              t))
+                            (t (error "No parent element")))))
+         (setq arg (1- arg)))
+      (nxml-scan-error
+       (goto-char (cadr err))
+       (apply 'error (cddr err))))))
+
+(defun nxml-backward-up-element (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-up-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point-min) (point)))
+         (let ((token-end (nxml-token-before)))
+           (goto-char (cond ((or (memq xmltok-type '(start-tag
+                                                     partial-start-tag))
+                                 (and (memq xmltok-type
+                                            '(empty-element
+                                              partial-empty-element))
+                                      (< (point) token-end)))
+                             xmltok-start)
+                            ((nxml-scan-element-backward
+                              (if (and (eq xmltok-type 'end-tag)
+                                       (= (point) token-end))
+                                  token-end
+                                xmltok-start)
+                              t)
+                             xmltok-start)
+                            (t (error "No parent element")))))
+         (setq arg (1- arg)))
+      (nxml-scan-error
+       (goto-char (cadr err))
+       (apply 'error (cddr err))))))
+
+(defun nxml-down-element (&optional arg)
+  "Move forward down into the content of an element.
+With ARG, do this that many times.
+Negative ARG means move backward but still down."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-backward-down-element (- arg))
+    (while (> arg 0)
+      (goto-char
+       (let ((token-end (nxml-token-after)))
+        (save-excursion
+          (goto-char token-end)
+          (while (progn
+                   (when (memq xmltok-type '(nil end-tag partial-end-tag))
+                     (error "No following start-tags in this element"))
+                   (not (memq xmltok-type '(start-tag partial-start-tag))))
+            (nxml-tokenize-forward))
+          (point))))
+      (setq arg (1- arg)))))
+
+(defun nxml-backward-down-element (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-down-element (- arg))
+    (while (> arg 0)
+      (goto-char
+        (save-excursion
+          (nxml-token-before)
+          (goto-char xmltok-start)
+          (while (progn
+                   (when (memq xmltok-type '(start-tag
+                                             partial-start-tag
+                                             prolog
+                                             nil))
+                     (error "No preceding end-tags in this element"))
+                   (not (memq xmltok-type '(end-tag partial-end-tag))))
+            (if (or (<= (point) nxml-prolog-end)
+                    (not (search-backward "<" nxml-prolog-end t)))
+                (setq xmltok-type nil)
+              (nxml-move-outside-backwards)
+              (xmltok-forward)))
+          xmltok-start))
+      (setq arg (1- arg)))))
+
+(defun nxml-forward-element (&optional arg)
+  "Move forward over one element.
+With ARG, do it that many times.
+Negative ARG means move backward."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-backward-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point) (point-max)))
+         (goto-char
+          (or (nxml-scan-element-forward (nxml-token-before))
+              (error "No more elements")))
+         (setq arg (1- arg)))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err))))))
+
+(defun nxml-backward-element (&optional arg)
+  "Move backward over one element.
+With ARG, do it that many times.
+Negative ARG means move forward."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (if (< arg 0)
+      (nxml-forward-element (- arg))
+    (condition-case err
+       (while (and (> arg 0)
+                   (< (point-min) (point)))
+         (goto-char
+          (or (and (nxml-scan-element-backward (progn
+                                                 (nxml-token-after)
+                                                 xmltok-start))
+                   xmltok-start)
+              (error "No preceding elements")))
+         (setq arg (1- arg)))
+    (nxml-scan-error
+     (goto-char (cadr err))
+     (apply 'error (cddr err))))))
+
+(defun nxml-mark-token-after ()
+  (interactive)
+  (push-mark (nxml-token-after) nil t)
+  (goto-char xmltok-start)
+  (message "Marked %s" xmltok-type))
+
+;;; Paragraphs
+
+(defun nxml-mark-paragraph ()
+  "Put point at beginning of this paragraph, mark at end.
+The paragraph marked is the one that contains point or follows point."
+  (interactive)
+  (nxml-forward-paragraph)
+  (push-mark nil t t)
+  (nxml-backward-paragraph))
+
+(defun nxml-forward-paragraph (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (cond ((< arg 0)
+        (nxml-backward-paragraph (- arg)))
+       ((> arg 0)
+        (forward-line 0)
+        (while (and (nxml-forward-single-paragraph)
+                    (> (setq arg (1- arg)) 0))))))
+
+(defun nxml-backward-paragraph (&optional arg)
+  (interactive "p")
+  (or arg (setq arg 1))
+  (cond ((< arg 0)
+        (nxml-forward-paragraph (- arg)))
+       ((> arg 0)
+        (unless (bolp)
+          (let ((inhibit-field-text-motion t))
+            (end-of-line)))
+        (while (and (nxml-backward-single-paragraph)
+                    (> (setq arg (1- arg)) 0))))))
+
+(defun nxml-forward-single-paragraph ()
+  "Move forward over a single paragraph.
+Return nil at end of buffer, t otherwise."
+  (let* ((token-end (nxml-token-after))
+        (offset (- (point) xmltok-start))
+        pos had-data)
+    (goto-char token-end)
+    (while (and (< (point) (point-max))
+               (not (setq pos
+                          (nxml-paragraph-end-pos had-data offset))))
+      (when (nxml-token-contains-data-p offset)
+       (setq had-data t))
+      (nxml-tokenize-forward)
+      (setq offset 0))
+    (when pos (goto-char pos))))
+
+(defun nxml-backward-single-paragraph ()
+  "Move backward over a single paragraph.
+Return nil at start of buffer, t otherwise."
+  (let* ((token-end (nxml-token-before))
+        (offset (- token-end (point)))
+        (last-tag-pos xmltok-start)
+        pos had-data last-data-pos)
+    (goto-char token-end)
+    (unless (setq pos (nxml-paragraph-start-pos nil offset))
+      (setq had-data (nxml-token-contains-data-p nil offset))
+      (goto-char xmltok-start)
+      (while (and (not pos) (< (point-min) (point)))
+       (cond ((search-backward "<" nxml-prolog-end t)
+              (nxml-move-outside-backwards)
+              (save-excursion
+                (while (< (point) last-tag-pos)
+                  (xmltok-forward)
+                  (when (and (not had-data) (nxml-token-contains-data-p))
+                    (setq pos nil)
+                    (setq last-data-pos xmltok-start))
+                  (let ((tem (nxml-paragraph-start-pos had-data 0)))
+                    (when tem (setq pos tem)))))
+              (when (and (not had-data) last-data-pos (not pos))
+                (setq had-data t)
+                (save-excursion
+                  (while (< (point) last-data-pos)
+                    (xmltok-forward))
+                  (let ((tem (nxml-paragraph-start-pos had-data 0)))
+                    (when tem (setq pos tem)))))
+              (setq last-tag-pos (point)))
+             (t (goto-char (point-min))))))
+    (when pos (goto-char pos))))
+
+(defun nxml-token-contains-data-p (&optional start end)
+  (setq start (+ xmltok-start (or start 0)))
+  (setq end (- (point) (or end 0)))
+  (when (eq xmltok-type 'cdata-section)
+    (setq start (max start (+ xmltok-start 9)))
+    (setq end (min end (- (point) 3))))
+  (or (and (eq xmltok-type 'data)
+          (eq start xmltok-start)
+          (eq end (point)))
+      (eq xmltok-type 'char-ref)
+      (and (memq xmltok-type '(data cdata-section))
+          (< start end)
+          (save-excursion
+            (goto-char start)
+            (re-search-forward "[^ \t\r\n]" end t)))))
+
+(defun nxml-paragraph-end-pos (had-data offset)
+  "Return the position of the paragraph end if contained in the current token.
+Return nil if the current token does not contain the paragraph end.
+Only characters after OFFSET from the start of the token are eligible.
+HAD-DATA says whether there have been non-whitespace data characters yet."
+  (cond ((not had-data)
+        (cond ((memq xmltok-type '(data cdata-section))
+               (save-excursion
+                 (let ((end (point)))
+                   (goto-char (+ xmltok-start
+                                 (max (if (eq xmltok-type 'cdata-section)
+                                          9
+                                        0)
+                                      offset)))
+                   (and (re-search-forward "[^ \t\r\n]" end t)
+                        (re-search-forward "^[ \t]*$" end t)
+                        (match-beginning 0)))))
+              ((and (eq xmltok-type 'comment)
+                    (nxml-token-begins-line-p)
+                    (nxml-token-ends-line-p))
+               (save-excursion
+                 (let ((end (point)))
+                   (goto-char (+ xmltok-start (max 4 offset)))
+                   (when (re-search-forward "[^ \t\r\n]" (- end 3) t)
+                     (if (re-search-forward "^[ \t]*$" end t)
+                         (match-beginning 0)
+                       (goto-char (- end 3))
+                       (skip-chars-backward " \t")
+                       (unless (bolp)
+                         (beginning-of-line 2))
+                       (point))))))))
+       ((memq xmltok-type '(data space cdata-section))
+        (save-excursion
+          (let ((end (point)))
+            (goto-char (+ xmltok-start offset))
+            (and (re-search-forward "^[ \t]*$" end t)
+                 (match-beginning 0)))))
+       ((and (memq xmltok-type '(start-tag 
+                                 end-tag
+                                 empty-element
+                                 comment
+                                 processing-instruction
+                                 entity-ref))
+             (nxml-token-begins-line-p)
+             (nxml-token-ends-line-p))
+        (save-excursion
+          (goto-char xmltok-start)
+          (skip-chars-backward " \t")
+          (point)))
+       ((and (eq xmltok-type 'end-tag)
+             (looking-at "[ \t]*$")
+             (not (nxml-in-mixed-content-p t)))
+        (save-excursion
+          (or (search-forward "\n" nil t) 
+              (point-max))))))
+
+(defun nxml-paragraph-start-pos (had-data offset)
+  "Return the position of the paragraph start if contained in the current token.
+Return nil if the current token does not contain the paragraph start.
+Only characters before OFFSET from the end of the token are eligible.
+HAD-DATA says whether there have been non-whitespace data characters yet."
+  (cond ((not had-data)
+        (cond ((memq xmltok-type '(data cdata-section))
+               (save-excursion
+                 (goto-char (- (point)
+                               (max (if (eq xmltok-type 'cdata-section)
+                                        3
+                                      0)
+                                    offset)))
+                 (and (re-search-backward "[^ \t\r\n]" xmltok-start t)
+                      (re-search-backward "^[ \t]*$" xmltok-start t)
+                      (match-beginning 0))))
+              ((and (eq xmltok-type 'comment)
+                    (nxml-token-ends-line-p)
+                    (nxml-token-begins-line-p))
+               (save-excursion
+                 (goto-char (- (point) (max 3 offset)))
+                 (when (and (< (+ xmltok-start 4) (point))
+                            (re-search-backward "[^ \t\r\n]"
+                                                (+ xmltok-start 4)
+                                                t))
+                   (if (re-search-backward "^[ \t]*$" xmltok-start t)
+                       (match-beginning 0)
+                     (goto-char xmltok-start)
+                     (if (looking-at "<!--[ \t]*\n")
+                         (match-end 0)
+                       (skip-chars-backward " \t")
+                       (point))))))))
+       ((memq xmltok-type '(data space cdata-section))
+        (save-excursion
+          (goto-char (- (point) offset))
+          (and (re-search-backward "^[ \t]*$" xmltok-start t)
+               (match-beginning 0))))
+       ((and (memq xmltok-type '(start-tag 
+                                 end-tag
+                                 empty-element
+                                 comment
+                                 processing-instruction
+                                 entity-ref))
+             (nxml-token-ends-line-p)
+             (nxml-token-begins-line-p))
+        (or (search-forward "\n" nil t) 
+            (point-max)))
+       ((and (eq xmltok-type 'start-tag)
+             (nxml-token-begins-line-p)
+             (not (save-excursion
+                    (goto-char xmltok-start)
+                    (nxml-in-mixed-content-p nil))))
+        (save-excursion
+          (goto-char xmltok-start)
+          (skip-chars-backward " \t")
+          ;; include any blank line before
+          (or (and (eq (char-before) ?\n)
+                   (save-excursion
+                     (goto-char (1- (point)))
+                     (skip-chars-backward " \t")
+                     (and (bolp) (point))))
+              (point))))))
+
+(defun nxml-token-ends-line-p () (looking-at "[ \t]*$"))
+
+(defun nxml-token-begins-line-p ()
+  (save-excursion
+    (goto-char xmltok-start)
+    (skip-chars-backward " \t")
+    (bolp)))
+
+(defun nxml-in-mixed-content-p (endp)
+  "Return non-nil if point is in mixed content.
+Point must be after an end-tag or before a start-tag.
+ENDP is t in the former case, nil in the latter."
+  (let (matching-tag-pos)
+    (cond ((not (run-hook-with-args-until-failure
+                'nxml-in-mixed-content-hook))
+          nil)
+         ;; See if the matching tag does not start or end a line.
+         ((condition-case err
+              (progn
+                (setq matching-tag-pos
+                      (xmltok-save
+                        (if endp
+                            (and (nxml-scan-element-backward (point))
+                                 xmltok-start)
+                          (nxml-scan-element-forward (point)))))
+                (and matching-tag-pos
+                     (save-excursion
+                       (goto-char matching-tag-pos)
+                       (not (if endp
+                                (progn
+                                  (skip-chars-backward " \t")
+                                  (bolp))
+                              (looking-at "[ \t]*$"))))))
+            (nxml-scan-error nil))
+          t)
+         ;; See if there's data at the same level.
+         ((let (start end)
+            (if endp
+                (setq start matching-tag-pos
+                      end (point))
+              (setq start (point)
+                    end matching-tag-pos))
+            (save-excursion
+              (or (when start
+                    (goto-char start)
+                    (nxml-preceding-sibling-data-p))
+                  (when end
+                    (goto-char end)
+                    (nxml-following-sibling-data-p)))))
+          t)
+         ;; Otherwise, treat as not mixed
+         (t nil))))
+
+(defun nxml-preceding-sibling-data-p ()
+  "Return non-nil if there is a previous sibling that is data."
+  (let ((lim (max (- (point) nxml-mixed-scan-distance)
+                 nxml-prolog-end))
+       (level 0)
+       found end)
+    (xmltok-save
+      (save-excursion
+       (while (and (< lim (point))
+                   (>= level 0)
+                   (not found)
+                   (progn
+                     (setq end (point))
+                     (search-backward "<" lim t)))
+         (nxml-move-outside-backwards)
+         (save-excursion
+           (xmltok-forward)
+           (let ((prev-level level))
+             (cond ((eq xmltok-type 'end-tag)
+                    (setq level (1+ level)))
+                   ((eq xmltok-type 'start-tag)
+                    (setq level (1- level))))
+             (when (eq prev-level 0)
+               (while (and (< (point) end) (not found))
+                 (xmltok-forward)
+                 (when (memq xmltok-type '(data cdata-section char-ref))
+                   (setq found t)))))))))
+    found))
+
+(defun nxml-following-sibling-data-p ()
+  (let ((lim (min (+ (point) nxml-mixed-scan-distance)
+                 (point-max)))
+       (level 0)
+       found)
+    (xmltok-save
+      (save-excursion
+       (while (and (< (point) lim)
+                   (>= level 0)
+                   (nxml-tokenize-forward)
+                   (not found))
+         (cond ((eq xmltok-type 'start-tag)
+                (setq level (1+ level)))
+               ((eq xmltok-type 'end-tag)
+                (setq level (1- level)))
+               ((and (eq level 0)
+                     (memq xmltok-type '(data cdata-section char-ref)))
+                (setq found t))))))
+    found))
+
+;;; Filling
+
+(defun nxml-do-fill-paragraph (arg)
+  (let (fill-paragraph-function
+       fill-prefix
+       start end)
+    (save-excursion
+      (nxml-forward-paragraph)
+      (setq end (point))
+      (nxml-backward-paragraph)
+      (skip-chars-forward " \t\r\n")
+      (setq start (point))
+      (beginning-of-line)
+      (setq fill-prefix (buffer-substring-no-properties (point) start))
+      (when (and (not (nxml-get-inside (point)))
+                (looking-at "[ \t]*<!--"))
+       (setq fill-prefix (concat fill-prefix "     ")))
+      (fill-region-as-paragraph start end arg))
+    (skip-line-prefix fill-prefix)
+    fill-prefix))
+    
+(defun nxml-newline-and-indent (soft)
+  (delete-horizontal-space)
+  (if soft (insert-and-inherit ?\n) (newline 1))
+  (nxml-indent-line))
+
+
+;;; Dynamic markup
+
+(defvar nxml-dynamic-markup-prev-pos nil)
+(defvar nxml-dynamic-markup-prev-lengths nil)
+(defvar nxml-dynamic-markup-prev-found-marker nil)
+(defvar nxml-dynamic-markup-prev-start-tags (make-hash-table :test 'equal))
+
+(defun nxml-dynamic-markup-word ()
+  "Dynamically markup the word before point.
+This attempts to find a tag to put around the word before point based
+on the contents of the current buffer. The end-tag will be inserted at
+point.  The start-tag will be inserted at or before the beginning of
+the word before point; the contents of the current buffer is used to
+decide where.
+
+It works in a similar way to \\[dabbrev-expand]. It searches first
+backwards from point, then forwards from point for an element whose
+content is a string which matches the contents of the buffer before
+point and which includes at least the word before point. It then
+copies the start- and end-tags from that element and uses them to
+surround the matching string before point.
+
+Repeating \\[nxml-dynamic-markup-word] immediately after successful
+\\[nxml-dynamic-markup-word] removes the previously inserted markup
+and attempts to find another possible way to do the markup."
+  (interactive "*")
+  (let (search-start-pos done)
+    (if (and (integerp nxml-dynamic-markup-prev-pos)
+            (= nxml-dynamic-markup-prev-pos (point))
+            (eq last-command this-command)
+            nxml-dynamic-markup-prev-lengths)
+       (let* ((end-tag-open-pos
+               (- nxml-dynamic-markup-prev-pos
+                  (nth 2 nxml-dynamic-markup-prev-lengths)))
+              (start-tag-close-pos
+               (- end-tag-open-pos
+                  (nth 1 nxml-dynamic-markup-prev-lengths)))
+              (start-tag-open-pos
+               (- start-tag-close-pos
+                  (nth 0 nxml-dynamic-markup-prev-lengths))))
+         (delete-region end-tag-open-pos nxml-dynamic-markup-prev-pos)
+         (delete-region start-tag-open-pos start-tag-close-pos)
+         (setq search-start-pos
+               (marker-position nxml-dynamic-markup-prev-found-marker)))
+      (clrhash nxml-dynamic-markup-prev-start-tags))
+    (setq nxml-dynamic-markup-prev-pos nil)
+    (setq nxml-dynamic-markup-prev-lengths nil)
+    (setq nxml-dynamic-markup-prev-found-marker nil)
+    (goto-char
+     (save-excursion
+       (let* ((pos (point))
+             (word (progn
+                     (backward-word 1)
+                     (unless (< (point) pos)
+                       (error "No word to markup"))
+                     (buffer-substring-no-properties (point) pos)))
+             (search (concat word "</"))
+             done)
+        (when search-start-pos
+          (goto-char search-start-pos))
+        (while (and (not done)
+                    (or (and (< (point) pos)
+                             (or (search-backward search nil t)
+                                 (progn (goto-char pos) nil)))
+                        (search-forward search nil t)))
+          (goto-char (- (match-end 0) 2))
+          (setq done (nxml-try-copy-markup pos)))
+        (or done
+            (error (if (zerop (hash-table-count
+                               nxml-dynamic-markup-prev-start-tags))
+                       "No possible markup found for `%s'"
+                     "No more markup possibilities found for `%s'")
+                   word)))))))
+
+(defun nxml-try-copy-markup (word-end-pos)
+  (save-excursion
+    (let ((end-tag-pos (point)))
+      (when (and (not (nxml-get-inside end-tag-pos))
+                (search-backward "<" nil t)
+                (not (nxml-get-inside (point))))
+       (xmltok-forward)
+       (when (and (eq xmltok-type 'start-tag)
+                  (< (point) end-tag-pos))
+         (let* ((start-tag-close-pos (point))
+                (start-tag
+                 (buffer-substring-no-properties xmltok-start
+                                                 start-tag-close-pos))
+                (words
+                 (nreverse
+                  (split-string
+                   (buffer-substring-no-properties start-tag-close-pos
+                                                   end-tag-pos)
+                   "[ \t\r\n]+"))))
+           (goto-char word-end-pos)
+           (while (and words
+                       (re-search-backward (concat
+                                            (regexp-quote (car words))
+                                            "\\=")
+                                           nil
+                                           t))
+             (setq words (cdr words))
+             (skip-chars-backward " \t\r\n"))
+           (when (and (not words)
+                      (progn
+                        (skip-chars-forward " \t\r\n")
+                        (not (gethash (cons (point) start-tag)
+                                      nxml-dynamic-markup-prev-start-tags)))
+                      (or (< end-tag-pos (point))
+                          (< word-end-pos xmltok-start)))
+             (setq nxml-dynamic-markup-prev-found-marker
+                   (copy-marker end-tag-pos t))
+             (puthash (cons (point) start-tag)
+                      t
+                      nxml-dynamic-markup-prev-start-tags)
+             (setq nxml-dynamic-markup-prev-lengths
+                   (list (- start-tag-close-pos xmltok-start)
+                         (-  word-end-pos (point))
+                         (+ (- xmltok-name-end xmltok-start) 2)))
+             (let ((name (xmltok-start-tag-qname)))
+               (insert start-tag)
+               (goto-char (+ word-end-pos
+                             (- start-tag-close-pos xmltok-start)))
+               (insert "</" name ">")
+               (setq nxml-dynamic-markup-prev-pos (point))))))))))
+                                                          
+
+;;; Character names
+
+(defvar nxml-char-name-ignore-case nil)
+
+(defvar nxml-char-name-alist nil
+  "Alist of character names.
+Each member of the list has the form (NAME CODE . NAMESET),
+where NAME is a string naming a character, NAMESET is a symbol
+identifying a set of names and CODE is an integer specifying the
+Unicode scalar value of the named character.
+The NAME will only be used for completion if NAMESET has
+a non-nil `nxml-char-name-set-enabled' property.
+If NAMESET does does not have `nxml-char-name-set-defined' property,
+then it must have a `nxml-char-name-set-file' property and `load'
+will be applied to the value of this property if the nameset
+is enabled.")
+
+(defvar nxml-char-name-table (make-hash-table :test 'eq)
+  "Hash table for mapping char codes to names.
+Each key is a Unicode scalar value.
+Each value is a list of pairs of the form (NAMESET . NAME),
+where NAMESET is a symbol identifying a set of names,
+and NAME is a string naming a character.")
+
+(defvar nxml-autoload-char-name-set-list nil
+  "List of char namesets that can be autoloaded.")
+
+(defun nxml-enable-char-name-set (nameset)    
+  (put nameset 'nxml-char-name-set-enabled t))
+
+(defun nxml-disable-char-name-set (nameset)    
+  (put nameset 'nxml-char-name-set-enabled nil))
+
+(defun nxml-char-name-set-enabled-p (nameset)
+  (get nameset 'nxml-char-name-set-enabled))
+
+(defun nxml-autoload-char-name-set (nameset file)
+  (unless (memq nameset nxml-autoload-char-name-set-list)
+    (setq nxml-autoload-char-name-set-list
+         (cons nameset nxml-autoload-char-name-set-list)))
+  (put nameset 'nxml-char-name-set-file file))
+
+(defun nxml-define-char-name-set (nameset alist)
+  "Define a set of character names.
+NAMESET is a symbol identifying the set.
+Alist is a list where each member has the form (NAME CODE),
+where NAME is a string naming a character and code
+is an integer giving the Unicode scalar value of the character."
+  (when (get nameset 'nxml-char-name-set-defined)
+    (error "Nameset `%s' already defined" nameset))
+  (let ((iter alist))
+    (while iter
+      (let* ((name-code (car iter))
+            (name (car name-code))
+            (code (cadr name-code)))
+       (puthash code
+                (cons (cons nameset name)
+                      (gethash code nxml-char-name-table))
+                nxml-char-name-table))
+      (setcdr (cdr (car iter)) nameset)
+      (setq iter (cdr iter))))
+  (setq nxml-char-name-alist
+       (nconc alist nxml-char-name-alist))
+  (put nameset 'nxml-char-name-set-defined t))
+
+(defun nxml-get-char-name (code)
+  (mapc 'nxml-maybe-load-char-name-set nxml-autoload-char-name-set-list)
+  (let ((names (gethash code nxml-char-name-table))
+       name)
+    (while (and names (not name))
+      (if (nxml-char-name-set-enabled-p (caar names))
+         (setq name (cdar names))
+       (setq names (cdr names))))
+    name))
+
+(defvar nxml-named-char-history nil)
+
+(defun nxml-insert-named-char (arg)
+  "Insert a character using its name.
+The name is read from the minibuffer.
+Normally, inserts the character as a numeric character reference.
+With a prefix argument, inserts the character directly."
+  (interactive "*P")
+  (mapc 'nxml-maybe-load-char-name-set nxml-autoload-char-name-set-list)
+  (let ((name
+        (let ((completion-ignore-case nxml-char-name-ignore-case))
+          (completing-read "Character name: "
+                           nxml-char-name-alist
+                           (lambda (member)
+                             (get (cddr member) 'nxml-char-name-set-enabled))
+                           t
+                           nil
+                           'nxml-named-char-history)))
+       (alist nxml-char-name-alist)
+       elt code)
+    (while (and alist (not code))
+      (setq elt (assoc name alist))
+      (if (get (cddr elt) 'nxml-char-name-set-enabled)
+         (setq code (cadr elt))
+       (setq alist (cdr (member elt alist)))))
+    (when code
+      (insert (if arg
+                 (or (decode-char 'ucs code)
+                     (error "Character %x is not supported by Emacs"
+                            code))
+               (format "&#x%X;" code))))))
+  
+(defun nxml-maybe-load-char-name-set (sym)
+  (when (and (get sym 'nxml-char-name-set-enabled)
+            (not (get sym 'nxml-char-name-set-defined))
+            (stringp (get sym 'nxml-char-name-set-file)))
+    (load (get sym 'nxml-char-name-set-file))))
+
+(defun nxml-toggle-char-ref-extra-display (arg)
+  "*Toggle the display of extra information for character references."
+  (interactive "P")
+  (let ((new (if (null arg)
+                (not nxml-char-ref-extra-display)
+              (> (prefix-numeric-value arg) 0))))
+    (when (not (eq new nxml-char-ref-extra-display))
+      (setq nxml-char-ref-extra-display new)
+      (save-excursion
+       (save-restriction
+         (widen)
+         (if nxml-char-ref-extra-display
+             (nxml-with-unmodifying-text-property-changes
+               (nxml-clear-fontified (point-min) (point-max)))
+           (nxml-clear-char-ref-extra-display (point-min) (point-max))))))))
+
+(put 'nxml-char-ref 'evaporate t)
+
+(defun nxml-char-ref-display-extra (start end n)
+  (when nxml-char-ref-extra-display
+    (let ((name (nxml-get-char-name n))
+         (glyph-string (and nxml-char-ref-display-glyph-flag
+                            (nxml-glyph-display-string n 'nxml-glyph-face)))
+         ov)
+    (when (or name glyph-string)
+      (setq ov (make-overlay start end nil t))
+      (overlay-put ov 'category 'nxml-char-ref)
+      (when name
+       (overlay-put ov 'help-echo name))
+      (when glyph-string
+       (overlay-put ov
+                    'after-string
+                    (propertize glyph-string 'face 'nxml-glyph-face)))))))
+
+(defun nxml-clear-char-ref-extra-display (start end)
+  (let ((ov (overlays-in start end)))
+    (while ov
+      (when (eq (overlay-get (car ov) 'category) 'nxml-char-ref)
+       (delete-overlay (car ov)))
+      (setq ov (cdr ov)))))
+
+;;; Versioning
+
+(defun nxml-version ()
+  "Show the version of nXML mode that is being used."
+  (interactive)
+  (if nxml-version
+      (message "nXML mode version %s" nxml-version)
+    (message "nXML mode version unknown")))
+
+
+(defun nxml-start-delimiter-length (type)
+  (or (get type 'nxml-start-delimiter-length)
+      0))
+                       
+(put 'cdata-section 'nxml-start-delimiter-length 9)
+(put 'comment 'nxml-start-delimiter-length 4)
+(put 'processing-instruction 'nxml-start-delimiter-length 2)
+(put 'start-tag 'nxml-start-delimiter-length 1)
+(put 'empty-element 'nxml-start-delimiter-length 1)
+(put 'partial-empty-element 'nxml-start-delimiter-length 1)
+(put 'entity-ref 'nxml-start-delimiter-length 1)
+(put 'char-ref 'nxml-start-delimiter-length 2)
+
+(defun nxml-end-delimiter-length (type)
+  (or (get type 'nxml-end-delimiter-length)
+      0))
+                       
+(put 'cdata-section 'nxml-end-delimiter-length 3)
+(put 'comment 'nxml-end-delimiter-length 3)
+(put 'processing-instruction 'nxml-end-delimiter-length 2)
+(put 'start-tag 'nxml-end-delimiter-length 1)
+(put 'empty-element 'nxml-end-delimiter-length 2)
+(put 'partial-empty-element 'nxml-end-delimiter-length 1)
+(put 'entity-ref 'nxml-end-delimiter-length 1)
+(put 'char-ref 'nxml-end-delimiter-length 1)
+
+(defun nxml-token-type-friendly-name (type)
+  (or (get type 'nxml-friendly-name)
+      (symbol-name type)))
+
+(put 'cdata-section 'nxml-friendly-name "CDATA section")
+(put 'processing-instruction 'nxml-friendly-name "processing instruction")
+(put 'entity-ref 'nxml-friendly-name "entity reference")
+(put 'char-ref 'nxml-friendly-name "character reference")
+
+(provide 'nxml-mode)
+
+;; arch-tag: 8603bc5f-1ef9-4021-b223-322fb2ca708e
+;;; nxml-mode.el ends here
diff --git a/lisp/nxml/nxml-ns.el b/lisp/nxml/nxml-ns.el
new file mode 100644 (file)
index 0000000..0d1b154
--- /dev/null
@@ -0,0 +1,151 @@
+;;; nxml-ns.el --- XML namespace processing
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file uses a prefix of `nxml-ns'.
+
+;;; Code:
+
+(require 'nxml-util)
+
+(defvar nxml-ns-state nil
+  "Contains the state of namespace processing.  The state
+is never modified destructively and so can be saved and restored
+without copying.
+
+The value is a stack represented by a list. The list has length N + 1
+where N is the number of open elements.  Each member of the list
+represents the bindings in effect for a particular element.  Each
+member is itself a list whose car is the default namespace
+\(a symbol or nil) and whose cdr is an alist of (PREFIX . NS) pairs
+where PREFIX is a string (never nil) and NS is the namespace URI
+symbol.")
+
+(defconst nxml-ns-initial-state
+  (list (list nil (cons "xml" nxml-xml-namespace-uri)))
+  "A list to be used as the initial value of nxml-ns-state.  This
+represents the state with no open elements and with the default
+namespace bindings (no default namespace and only the xml prefix bound).")
+
+(defsubst nxml-ns-state () nxml-ns-state)
+
+(defsubst nxml-ns-set-state (state)
+  (setq nxml-ns-state state))
+
+(defsubst nxml-ns-state-equal (state)
+  (equal nxml-ns-state state))
+
+(defmacro nxml-ns-save (&rest body)
+  `(let ((nxml-ns-state nxml-ns-initial-state))
+     ,@body))
+
+(put 'nxml-ns-save 'lisp-indent-function 0)
+(def-edebug-spec nxml-ns-save t)
+
+(defun nxml-ns-init ()
+  (setq nxml-ns-state nxml-ns-initial-state))
+
+(defun nxml-ns-push-state ()
+  "Change the state by starting a new element. Namespace declarations
+are inherited from the parent state."
+  (setq nxml-ns-state (cons (car nxml-ns-state) nxml-ns-state)))
+
+(defun nxml-ns-pop-state ()
+  "Change the state by ending an element.  The behaviour is undefined
+if there is no open element."
+  (setq nxml-ns-state (cdr nxml-ns-state)))
+
+(defun nxml-ns-get-prefix (prefix)
+  "Return the symbol for namespace bound to PREFIX, or nil if PREFIX
+is unbound. PREFIX is a string, never nil."
+  (let ((binding (assoc prefix (cdar nxml-ns-state))))
+    (and binding (cdr binding))))
+
+(defun nxml-ns-set-prefix (prefix ns)
+  "Change the binding of PREFIX. PREFIX is a string (never nil).  NS
+is a symbol (never nil). The change will be in effect until the end of
+the current element."
+  (setq nxml-ns-state
+       (let ((bindings (car nxml-ns-state)))
+         (cons (cons (car bindings)
+                     (cons (cons prefix ns) (cdr bindings)))
+               (cdr nxml-ns-state)))))
+
+(defun nxml-ns-get-default ()
+  "Return the current default namespace as a symbol, or nil
+if there is no default namespace."
+  (caar nxml-ns-state))
+
+(defun nxml-ns-set-default (ns)
+  "Changes the current default namespace.  The change
+will be in effect until the end of the current element.
+NS is a symbol or nil."
+  (setq nxml-ns-state
+       (cons (cons ns (cdar nxml-ns-state))
+             (cdr nxml-ns-state))))
+
+(defun nxml-ns-get-context ()
+  (car nxml-ns-state))
+
+(defun nxml-ns-prefixes-for (ns &optional attributep)
+  (let ((current (car nxml-ns-state))
+       prefixes)
+    (when (if attributep
+             (not ns)
+           (eq (car current) ns))
+      (setq prefixes '(nil)))
+    (setq current (cdr current))
+    (while (let ((binding (rassq ns current)))
+            (when binding
+              (when (eq (nxml-ns-get-prefix (car binding)) ns)
+                (add-to-list 'prefixes
+                             (car binding)))
+              (setq current
+                    (cdr (member binding current))))))
+    prefixes))
+
+(defun nxml-ns-prefix-for (ns)
+  (car (rassq ns (cdar nxml-ns-state))))
+
+(defun nxml-ns-changed-prefixes ()
+  (let ((old (cadr nxml-ns-state))
+       (new (car nxml-ns-state))
+       changed)
+    (if (eq old new)
+       nil
+      (unless (eq (car new) (car old))
+       (setq changed '(nil)))
+      (setq new (cdr new))
+      (setq old (cdr old))
+      (while (not (eq new old))
+       (setq changed
+             (cons (caar new) changed))
+       (setq new (cdr new))))
+    changed))
+    
+(provide 'nxml-ns)
+
+;; arch-tag: 5968e4b7-fb37-46ce-8621-c65db9793028
+;;; nxml-ns.el ends here
diff --git a/lisp/nxml/nxml-outln.el b/lisp/nxml/nxml-outln.el
new file mode 100644 (file)
index 0000000..841e0e7
--- /dev/null
@@ -0,0 +1,1043 @@
+;;; nxml-outln.el --- outline support for nXML mode
+
+;; Copyright (C) 2004, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; A section can be in one of three states
+;; 1. display normally; this displays each child section
+;; according to its state; anything not part of child sections is also
+;; displayed normally
+;; 2. display just the title specially; child sections are not displayed
+;; regardless of their state; anything not part of child sections is
+;; not displayed
+;; 3. display the title specially and display child sections
+;; according to their state; anything not part of the child section is
+;; not displayed
+;; The state of a section is determined by the value of the
+;; nxml-outline-state text property of the < character that starts
+;; the section.
+;; For state 1 the value is nil or absent.
+;; For state 2 it is the symbol hide-children.
+;; For state 3 it is t.
+;; The special display is achieved by using overlays.  The overlays
+;; are computed from the nxml-outline-state property by
+;; `nxml-refresh-outline'. There overlays all have a category property
+;; with an nxml-outline-display property with value t.
+;;
+;; For a section to be recognized as such, the following conditions must
+;; be satisfied:
+;; - its start-tag must occur at the start of a line (possibly indented)
+;; - its local name must match `nxml-section-element-name-regexp'
+;; - it must have a heading element; a heading element is an
+;; element whose name matches `nxml-heading-element-name-regexp',
+;; and that occurs as, or as a descendant of, the first child element
+;; of the section
+;;
+;; XXX What happens if an nxml-outline-state property is attached to a
+;; character that doesn't start a section element?
+;;
+;; An outlined section (an section with a non-nil nxml-outline-state
+;; property) can be displayed in either single-line or multi-line
+;; form.  Single-line form is used when the outline state is hide-children
+;; or there are no child sections; multi-line form is used otherwise.
+;; There are two flavors of single-line form: with children and without.
+;; The with-childen flavor is used when there are child sections.
+;; Single line with children looks like
+;;    <+section>A section title...</>
+;; Single line without children looks like
+;;    <-section>A section title...</>
+;; Multi line looks likes
+;;    <-section>A section title...
+;;    [child sections displayed here]
+;;    </-section>
+;; The indent of an outlined section is computed relative to the
+;; outermost containing outlined element.  The indent of the
+;; outermost containing element comes from the non-outlined
+;; indent of the section start-tag.
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-util)
+(require 'nxml-rap)
+
+(defcustom nxml-section-element-name-regexp
+  "article\\|\\(sub\\)*section\\|chapter\\|div\\|appendix\\|part\\|preface\\|reference\\|simplesect\\|bibliography\\|bibliodiv\\|glossary\\|glossdiv"
+  "*Regular expression matching the name of elements used as sections.
+An XML element is treated as a section if:
+
+- its local name (that is, the name without the prefix) matches
+this regexp;
+
+- either its first child element or a descendant of that first child
+element has a local name matching the variable
+`nxml-heading-element-name-regexp'; and
+
+- its start-tag occurs at the beginning of a line (possibly indented)."
+  :group 'nxml
+  :type 'regexp)
+
+(defcustom nxml-heading-element-name-regexp "title\\|head"
+  "*Regular expression matching the name of elements used as headings.
+An XML element is only recognized as a heading if it occurs as or
+within the first child of an element that is recognized as a section.
+See the variable `nxml-section-element-name-regexp' for more details."
+  :group 'nxml
+  :type 'regexp)
+
+(defcustom nxml-outline-child-indent 2
+  "*Indentation in an outline for child element relative to parent element."
+  :group 'nxml
+  :type 'integer)
+
+(defface nxml-heading-face
+  '((t (:weight bold)))
+  "Face used for the contents of abbreviated heading elements."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-outline-indicator-face
+  '((t (:inherit default)))
+  "Face used for `+' or `-' before element names in outlines."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-outline-active-indicator-face
+  '((t (:box t :inherit nxml-outline-indicator-face)))
+  "Face used for clickable `+' or `-' before element names in outlines."
+  :group 'nxml-highlighting-faces)
+
+(defface nxml-outline-ellipsis-face
+  '((t (:bold t :inherit default)))
+  "Face used for `...' in outlines."
+  :group 'nxml-highlighting-faces)
+
+(defvar nxml-heading-scan-distance 1000
+  "Maximum distance from section to scan for heading.")
+
+(defvar nxml-outline-prefix-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-a" 'nxml-show-all)
+    (define-key map "\C-t" 'nxml-hide-all-text-content)
+    (define-key map "\C-r" 'nxml-refresh-outline)
+    (define-key map "\C-c" 'nxml-hide-direct-text-content)
+    (define-key map "\C-e" 'nxml-show-direct-text-content)
+    (define-key map "\C-d" 'nxml-hide-subheadings)
+    (define-key map "\C-s" 'nxml-show)
+    (define-key map "\C-k" 'nxml-show-subheadings)
+    (define-key map "\C-l" 'nxml-hide-text-content)
+    (define-key map "\C-i" 'nxml-show-direct-subheadings)
+    (define-key map "\C-o" 'nxml-hide-other)
+    map))
+
+;;; Commands for changing visibility
+
+(defun nxml-show-all ()
+  "Show all elements in the buffer normally."
+  (interactive)
+  (nxml-with-unmodifying-text-property-changes
+    (remove-text-properties (point-min)
+                           (point-max)
+                           '(nxml-outline-state nil)))
+  (nxml-outline-set-overlay nil (point-min) (point-max)))
+
+(defun nxml-hide-all-text-content ()
+  "Hide all text content in the buffer.
+Anything that is in a section but is not a heading will be hidden.
+The visibility of headings at any level will not be changed. See the
+variable `nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-transform-buffer-outline '((nil . t))))
+
+(defun nxml-show-direct-text-content ()
+  "Show the text content that is directly part of the section containing point.
+Each subsection will be shown according to its individual state, which
+will not be changed. The section containing point is the innermost
+section that contains the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-outline-pre-adjust-point)
+  (nxml-set-outline-state (nxml-section-start-position) nil)
+  (nxml-refresh-outline)
+  (nxml-outline-adjust-point))
+
+(defun nxml-show-direct-subheadings ()
+  "Show the immediate subheadings of the section containing point.
+The section containing point is the innermost section that contains
+the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (let ((pos (nxml-section-start-position)))
+    (when (eq (nxml-get-outline-state pos) 'hide-children)
+      (nxml-set-outline-state pos t)))
+  (nxml-refresh-outline)
+  (nxml-outline-adjust-point))
+
+(defun nxml-hide-direct-text-content ()
+  "Hide the text content that is directly part of the section containing point.
+The heading of the section will remain visible.  The state of
+subsections will not be changed.  The section containing point is the
+innermost section that contains the character following point. See the
+variable `nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (let ((pos (nxml-section-start-position)))
+    (when (null (nxml-get-outline-state pos))
+      (nxml-set-outline-state pos t)))
+  (nxml-refresh-outline)
+  (nxml-outline-adjust-point))
+
+(defun nxml-hide-subheadings ()
+  "Hide the subheadings that are part of the section containing point.
+The text content will also be hidden, leaving only the heading of the
+section itself visible.  The state of the subsections will also be
+changed to hide their headings, so that \\[nxml-show-direct-text-content]
+would show only the heading of the subsections. The section containing
+point is the innermost section that contains the character following
+point.  See the variable `nxml-section-element-name-regexp' for more
+details on how to customize which elements are recognized as sections
+and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((nil . hide-children)
+                                   (t . hide-children))))
+
+(defun nxml-show ()
+  "Show the section containing point normally, without hiding anything.
+This includes everything in the section at any level.  The section
+containing point is the innermost section that contains the character
+following point.  See the variable `nxml-section-element-name-regexp'
+for more details on how to customize which elements are recognized as
+sections and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((hide-children . nil)
+                                   (t . nil))))
+
+(defun nxml-hide-text-content ()
+  "Hide text content at all levels in the section containing point.
+The section containing point is the innermost section that contains
+the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((nil . t))))
+
+(defun nxml-show-subheadings ()
+  "Show the subheadings at all levels of the section containing point.
+The visibility of the text content at all levels in the section is not
+changed.  The section containing point is the innermost section that
+contains the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (nxml-transform-subtree-outline '((hide-children . t))))
+
+(defun nxml-hide-other ()
+  "Hide text content other than that directly in the section containing point.
+Hide headings other than those of ancestors of that section and their
+immediate subheadings.  The section containing point is the innermost
+section that contains the character following point. See the variable
+`nxml-section-element-name-regexp' for more details on how to
+customize which elements are recognized as sections and headings."
+  (interactive)
+  (let ((nxml-outline-state-transform-exceptions nil))
+    (save-excursion
+      (while (and (condition-case err
+                     (nxml-back-to-section-start)
+                   (nxml-outline-error (nxml-report-outline-error
+                                        "Couldn't find containing section: %s"
+                                        err)))
+                 (progn
+                   (when (and nxml-outline-state-transform-exceptions
+                              (null (nxml-get-outline-state (point))))
+                     (nxml-set-outline-state (point) t))
+                   (setq nxml-outline-state-transform-exceptions
+                         (cons (point)
+                               nxml-outline-state-transform-exceptions))
+                   (< nxml-prolog-end (point))))
+       (goto-char (1- (point)))))
+    (nxml-transform-buffer-outline '((nil . hide-children)
+                                    (t . hide-children)))))
+
+;; These variables are dynamically bound.  They are use to pass information to
+;; nxml-section-tag-transform-outline-state.
+
+(defvar nxml-outline-state-transform-exceptions nil)
+(defvar nxml-target-section-pos nil)
+(defvar nxml-depth-in-target-section nil)
+(defvar nxml-outline-state-transform-alist nil)
+
+(defun nxml-transform-buffer-outline (alist)
+  (let ((nxml-target-section-pos nil)
+       (nxml-depth-in-target-section 0)
+       (nxml-outline-state-transform-alist alist)
+       (nxml-outline-display-section-tag-function
+        'nxml-section-tag-transform-outline-state))
+    (nxml-refresh-outline))
+  (nxml-outline-adjust-point))
+
+(defun nxml-transform-subtree-outline (alist)
+  (let ((nxml-target-section-pos (nxml-section-start-position))
+       (nxml-depth-in-target-section nil)
+       (nxml-outline-state-transform-alist alist)
+       (nxml-outline-display-section-tag-function
+        'nxml-section-tag-transform-outline-state))
+    (nxml-refresh-outline))
+  (nxml-outline-adjust-point))
+
+(defun nxml-outline-pre-adjust-point ()
+  (cond ((and (< (point-min) (point))
+             (get-char-property (1- (point)) 'invisible)
+             (not (get-char-property (point) 'invisible))
+             (let ((str (or (get-char-property (point) 'before-string)
+                            (get-char-property (point) 'display))))
+               (and (stringp str)
+                    (>= (length str) 3)
+                    (string= (substring str 0 3) "..."))))
+        ;; The ellipsis is a display property on a visible character
+        ;; following an invisible region. The position of the event
+        ;; will be the position before that character. We want to
+        ;; move point to the other side of the invisible region, i.e.
+        ;; following the last visible character before that invisible
+        ;; region.
+        (goto-char (previous-single-char-property-change (1- (point))
+                                                         'invisible)))
+       ((and (< (point) (point-max))
+             (get-char-property (point) 'display)
+             (get-char-property (1+ (point)) 'invisible))
+        (goto-char (next-single-char-property-change (1+ (point))
+                                                     'invisible)))
+       ((and (< (point) (point-max))
+             (get-char-property (point) 'invisible))
+        (goto-char (next-single-char-property-change (point)
+                                                     'invisible)))))
+
+(defun nxml-outline-adjust-point ()
+  "Adjust point after showing or hiding elements."
+  (when (and (get-char-property (point) 'invisible)
+            (< (point-min) (point))
+            (get-char-property (1- (point)) 'invisible))
+    (goto-char (previous-single-char-property-change (point)
+                                                    'invisible
+                                                    nil
+                                                    nxml-prolog-end))))
+
+(defun nxml-transform-outline-state (section-start-pos)
+  (let* ((old-state
+         (nxml-get-outline-state section-start-pos))
+        (change (assq old-state
+                      nxml-outline-state-transform-alist)))
+    (when change
+      (nxml-set-outline-state section-start-pos
+                             (cdr change)))))
+  
+(defun nxml-section-tag-transform-outline-state (startp
+                                                section-start-pos
+                                                &optional
+                                                heading-start-pos)
+  (if (not startp)
+      (setq nxml-depth-in-target-section
+           (and nxml-depth-in-target-section
+                (> nxml-depth-in-target-section 0)
+                (1- nxml-depth-in-target-section)))
+    (cond (nxml-depth-in-target-section
+          (setq nxml-depth-in-target-section
+                (1+ nxml-depth-in-target-section)))
+         ((= section-start-pos nxml-target-section-pos)
+          (setq nxml-depth-in-target-section 0)))
+    (when (and nxml-depth-in-target-section
+              (not (member section-start-pos
+                           nxml-outline-state-transform-exceptions)))
+      (nxml-transform-outline-state section-start-pos))))
+
+(defun nxml-get-outline-state (pos)
+  (get-text-property pos 'nxml-outline-state))
+
+(defun nxml-set-outline-state (pos state)
+  (nxml-with-unmodifying-text-property-changes
+    (if state
+       (put-text-property pos (1+ pos) 'nxml-outline-state state)
+      (remove-text-properties pos (1+ pos) '(nxml-outline-state nil)))))
+
+;;; Mouse interface
+
+(defun nxml-mouse-show-direct-text-content (event)
+  "Do the same as \\[nxml-show-direct-text-content] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-show-direct-text-content)))
+
+(defun nxml-mouse-hide-direct-text-content (event)
+  "Do the same as \\[nxml-hide-direct-text-content] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-hide-direct-text-content)))
+
+(defun nxml-mouse-hide-subheadings (event)
+  "Do the same as \\[nxml-hide-subheadings] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-hide-subheadings)))
+
+(defun nxml-mouse-show-direct-subheadings (event)
+  "Do the same as \\[nxml-show-direct-subheadings] from a mouse click."
+  (interactive "e")
+  (and (nxml-mouse-set-point event)
+       (nxml-show-direct-subheadings)))
+
+(defun nxml-mouse-set-point (event)
+  (mouse-set-point event)
+  (and nxml-prolog-end t))
+
+;; Display
+
+(defsubst nxml-token-start-tag-p ()
+  (or (eq xmltok-type 'start-tag)
+      (eq xmltok-type 'partial-start-tag)))
+
+(defsubst nxml-token-end-tag-p ()
+  (or (eq xmltok-type 'end-tag)
+      (eq xmltok-type 'partial-end-tag)))
+
+(defun nxml-refresh-outline () 
+  "Refresh the outline to correspond to the current XML element structure."
+  (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    (kill-local-variable 'line-move-ignore-invisible)
+    (make-local-variable 'line-move-ignore-invisible)
+    (condition-case err
+       (nxml-outline-display-rest nil nil nil)
+      (nxml-outline-error
+       (nxml-report-outline-error "Cannot display outline: %s" err)))))
+
+(defvar nxml-outline-display-section-tag-function nil)
+
+(defun nxml-outline-display-rest (outline-state start-tag-indent tag-qnames)
+  "Display up to and including the end of the current element.
+OUTLINE-STATE can be nil, t, hide-children.  START-TAG-INDENT is the
+indent of the start-tag of the current element, or nil if no
+containing element has a non-nil OUTLINE-STATE.  TAG-QNAMES is a list
+of the qnames of the open elements.  Point is after the title content.
+Leave point after the closing end-tag Return t if we had a
+non-transparent child section."
+  (let ((last-pos (point))
+       (transparent-depth 0)
+       ;; don't want ellipsis before root element
+       (had-children (not tag-qnames)))
+    (while
+       (cond ((not (nxml-section-tag-forward))
+              (if (null tag-qnames)
+                  nil
+                (nxml-outline-error "missing end-tag %s"
+                                    (car tag-qnames))))
+             ;; section end-tag
+             ((nxml-token-end-tag-p)
+              (when nxml-outline-display-section-tag-function
+                (funcall nxml-outline-display-section-tag-function
+                         nil
+                         xmltok-start))
+              (let ((qname (xmltok-end-tag-qname)))
+                (unless tag-qnames
+                  (nxml-outline-error "extra end-tag %s" qname))
+                (unless (string= (car tag-qnames) qname)
+                  (nxml-outline-error "mismatched end-tag; expected %s, got %s"
+                                      (car tag-qnames)
+                                      qname)))
+              (cond ((> transparent-depth 0)
+                     (setq transparent-depth (1- transparent-depth))
+                     (setq tag-qnames (cdr tag-qnames))
+                     t)
+                    ((not outline-state)
+                     (nxml-outline-set-overlay nil last-pos (point))
+                     nil)
+                    ((or (not had-children)
+                         (eq outline-state 'hide-children))
+                     (nxml-outline-display-single-line-end-tag last-pos)
+                     nil)
+                    (t
+                     (nxml-outline-display-multi-line-end-tag last-pos
+                                                              start-tag-indent)
+                     nil)))
+             ;; section start-tag
+             (t
+              (let* ((qname (xmltok-start-tag-qname))
+                     (section-start-pos xmltok-start)
+                     (heading-start-pos
+                      (and (or nxml-outline-display-section-tag-function
+                               (not (eq outline-state 'had-children))
+                               (not had-children))
+                           (nxml-token-starts-line-p)
+                           (nxml-heading-start-position))))
+                (when nxml-outline-display-section-tag-function
+                  (funcall nxml-outline-display-section-tag-function
+                           t
+                           section-start-pos
+                           heading-start-pos))
+                (setq tag-qnames (cons qname tag-qnames))
+                (if (or (not heading-start-pos)
+                        (and (eq outline-state 'hide-children)
+                             (setq had-children t)))
+                    (setq transparent-depth (1+ transparent-depth))
+                  (nxml-display-section last-pos
+                                        section-start-pos
+                                        heading-start-pos
+                                        start-tag-indent
+                                        outline-state
+                                        had-children
+                                        tag-qnames)
+                  (setq had-children t)
+                  (setq tag-qnames (cdr tag-qnames))
+                  (setq last-pos (point))))
+              t)))
+    had-children))
+
+(defconst nxml-highlighted-less-than
+  (propertize "<" 'face 'nxml-tag-delimiter-face))
+
+(defconst nxml-highlighted-greater-than
+  (propertize ">" 'face 'nxml-tag-delimiter-face))
+
+(defconst nxml-highlighted-colon
+  (propertize ":" 'face 'nxml-element-colon-face))
+
+(defconst nxml-highlighted-slash
+  (propertize "/" 'face 'nxml-tag-slash-face))
+
+(defconst nxml-highlighted-ellipsis
+  (propertize "..." 'face 'nxml-outline-ellipsis-face))
+
+(defconst nxml-highlighted-empty-end-tag
+  (concat nxml-highlighted-ellipsis
+         nxml-highlighted-less-than
+         nxml-highlighted-slash
+         nxml-highlighted-greater-than))
+
+(defconst nxml-highlighted-inactive-minus
+  (propertize "-" 'face 'nxml-outline-indicator-face))
+
+(defconst nxml-highlighted-active-minus
+  (propertize "-" 'face 'nxml-outline-active-indicator-face))
+
+(defconst nxml-highlighted-active-plus
+  (propertize "+" 'face 'nxml-outline-active-indicator-face))
+
+(defun nxml-display-section (last-pos
+                            section-start-pos
+                            heading-start-pos
+                            parent-indent
+                            parent-outline-state
+                            had-children
+                            tag-qnames)
+  (let* ((section-start-pos-bol
+         (save-excursion
+           (goto-char section-start-pos)
+           (skip-chars-backward " \t")
+           (point)))
+        (outline-state (nxml-get-outline-state section-start-pos))
+        (newline-before-section-start-category
+         (cond ((and (not had-children) parent-outline-state)
+                'nxml-outline-display-ellipsis)
+                (outline-state 'nxml-outline-display-show)
+                (t nil))))
+    (nxml-outline-set-overlay (and parent-outline-state
+                                  'nxml-outline-display-hide)
+                             last-pos
+                             (1- section-start-pos-bol)
+                             nil
+                             t)
+    (if outline-state
+      (let* ((indent (if parent-indent
+                        (+ parent-indent nxml-outline-child-indent)
+                      (save-excursion
+                        (goto-char section-start-pos)
+                        (current-column))))
+            start-tag-overlay)
+       (nxml-outline-set-overlay newline-before-section-start-category
+                                 (1- section-start-pos-bol)
+                                 section-start-pos-bol
+                                 t)
+       (nxml-outline-set-overlay 'nxml-outline-display-hide
+                                 section-start-pos-bol
+                                 section-start-pos)
+       (setq start-tag-overlay
+           (nxml-outline-set-overlay 'nxml-outline-display-show
+                                     section-start-pos
+                                     (1+ section-start-pos)
+                                     t))
+       ;; line motion commands don't work right if start-tag-overlay
+       ;; covers multiple lines
+       (nxml-outline-set-overlay 'nxml-outline-display-hide
+                                 (1+ section-start-pos)
+                                 heading-start-pos)
+       (goto-char heading-start-pos)
+       (nxml-end-of-heading)
+       (nxml-outline-set-overlay 'nxml-outline-display-heading
+                                 heading-start-pos
+                                 (point))
+       (let* ((had-children
+               (nxml-outline-display-rest outline-state
+                                          indent
+                                          tag-qnames)))
+         (overlay-put start-tag-overlay
+                      'display
+                      (concat
+                       ;; indent
+                       (make-string indent ?\ )
+                       ;; <
+                       nxml-highlighted-less-than
+                       ;; + or - indicator
+                       (cond ((not had-children)
+                              nxml-highlighted-inactive-minus)
+                             ((eq outline-state 'hide-children)
+                              (overlay-put start-tag-overlay
+                                           'category
+                                           'nxml-outline-display-hiding-tag)
+                              nxml-highlighted-active-plus)
+                             (t
+                              (overlay-put start-tag-overlay
+                                           'category
+                                           'nxml-outline-display-showing-tag)
+                              nxml-highlighted-active-minus))
+                       ;; qname
+                       (nxml-highlighted-qname (car tag-qnames))
+                       ;; >
+                       nxml-highlighted-greater-than))))
+      ;; outline-state nil
+      (goto-char heading-start-pos)
+      (nxml-end-of-heading)
+      (nxml-outline-set-overlay newline-before-section-start-category
+                               (1- section-start-pos-bol)
+                               (point)
+                               t)
+      (nxml-outline-display-rest outline-state
+                                (and parent-indent
+                                     (+ parent-indent
+                                        nxml-outline-child-indent))
+                                tag-qnames))))
+
+(defun nxml-highlighted-qname (qname)
+  (let ((colon (string-match ":" qname)))
+    (if colon
+       (concat (propertize (substring qname 0 colon)
+                           'face
+                           'nxml-element-prefix-face)
+               nxml-highlighted-colon
+               (propertize (substring qname (1+ colon))
+                           'face
+                           'nxml-element-local-name-face))
+      (propertize qname
+                 'face
+                 'nxml-element-local-name-face))))
+
+(defun nxml-outline-display-single-line-end-tag (last-pos)
+  (nxml-outline-set-overlay 'nxml-outline-display-hide
+                           last-pos
+                           xmltok-start
+                           nil
+                           t)
+  (overlay-put (nxml-outline-set-overlay 'nxml-outline-display-show
+                                        xmltok-start
+                                        (point)
+                                        t)
+              'display
+              nxml-highlighted-empty-end-tag))
+    
+(defun nxml-outline-display-multi-line-end-tag (last-pos start-tag-indent)
+  (let ((indentp (save-excursion
+                  (goto-char last-pos)
+                  (skip-chars-forward " \t")
+                  (and (eq (char-after) ?\n)
+                       (progn
+                         (goto-char (1+ (point)))
+                         (nxml-outline-set-overlay nil last-pos (point))
+                         (setq last-pos (point))
+                         (goto-char xmltok-start)
+                         (beginning-of-line)
+                         t))))
+       end-tag-overlay)
+    (nxml-outline-set-overlay 'nxml-outline-display-hide
+                             last-pos
+                             xmltok-start
+                             nil
+                             t)
+    (setq end-tag-overlay
+         (nxml-outline-set-overlay 'nxml-outline-display-showing-tag
+                                   xmltok-start
+                                   (point)
+                                   t))
+    (overlay-put end-tag-overlay
+                'display
+                (concat (if indentp
+                            (make-string start-tag-indent ?\ )
+                          "")
+                        nxml-highlighted-less-than
+                        nxml-highlighted-slash
+                        nxml-highlighted-active-minus
+                        (nxml-highlighted-qname (xmltok-end-tag-qname))
+                        nxml-highlighted-greater-than))))
+
+(defvar nxml-outline-show-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map "\C-m" 'nxml-show-direct-text-content)
+    (define-key map [mouse-2] 'nxml-mouse-show-direct-text-content)
+    map))
+
+(defvar nxml-outline-show-help "mouse-2: show")
+
+(put 'nxml-outline-display-show 'nxml-outline-display t)
+(put 'nxml-outline-display-show 'evaporate t)
+(put 'nxml-outline-display-show 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-show 'help-echo nxml-outline-show-help)
+
+(put 'nxml-outline-display-hide 'nxml-outline-display t)
+(put 'nxml-outline-display-hide 'evaporate t)
+(put 'nxml-outline-display-hide 'invisible t)
+(put 'nxml-outline-display-hide 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-hide 'help-echo nxml-outline-show-help)
+
+(put 'nxml-outline-display-ellipsis 'nxml-outline-display t)
+(put 'nxml-outline-display-ellipsis 'evaporate t)
+(put 'nxml-outline-display-ellipsis 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-ellipsis 'help-echo nxml-outline-show-help)
+(put 'nxml-outline-display-ellipsis 'before-string nxml-highlighted-ellipsis)
+
+(put 'nxml-outline-display-heading 'keymap nxml-outline-show-map)
+(put 'nxml-outline-display-heading 'help-echo nxml-outline-show-help)
+(put 'nxml-outline-display-heading 'nxml-outline-display t)
+(put 'nxml-outline-display-heading 'evaporate t)
+(put 'nxml-outline-display-heading 'face 'nxml-heading-face)
+
+(defvar nxml-outline-hiding-tag-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [mouse-1] 'nxml-mouse-show-direct-subheadings)
+    (define-key map [mouse-2] 'nxml-mouse-show-direct-text-content)
+    (define-key map "\C-m" 'nxml-show-direct-text-content)
+    map))
+
+(defvar nxml-outline-hiding-tag-help
+  "mouse-1: show subheadings, mouse-2: show text content")
+
+(put 'nxml-outline-display-hiding-tag 'nxml-outline-display t)
+(put 'nxml-outline-display-hiding-tag 'evaporate t)
+(put 'nxml-outline-display-hiding-tag 'keymap nxml-outline-hiding-tag-map)
+(put 'nxml-outline-display-hiding-tag 'help-echo nxml-outline-hiding-tag-help)
+
+(defvar nxml-outline-showing-tag-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [mouse-1] 'nxml-mouse-hide-subheadings)
+    (define-key map [mouse-2] 'nxml-mouse-show-direct-text-content)
+    (define-key map "\C-m" 'nxml-show-direct-text-content)
+    map))
+
+(defvar nxml-outline-showing-tag-help
+  "mouse-1: hide subheadings, mouse-2: show text content")
+
+(put 'nxml-outline-display-showing-tag 'nxml-outline-display t)
+(put 'nxml-outline-display-showing-tag 'evaporate t)
+(put 'nxml-outline-display-showing-tag 'keymap nxml-outline-showing-tag-map)
+(put 'nxml-outline-display-showing-tag
+     'help-echo
+     nxml-outline-showing-tag-help)
+
+(defun nxml-outline-set-overlay (category
+                                start
+                                end
+                                &optional
+                                front-advance
+                                rear-advance)
+  "Replace any nxml-outline-display overlays between START and END.
+Overlays are removed if they overlay the region between START and END,
+and have a non-nil nxml-outline-display property (typically via their
+category). If CATEGORY is non-nil, they will be replaced with a new overlay
+with that category from START to END. If CATEGORY is nil, no new
+overlay will be created."
+  (when (< start end)
+    (let ((overlays (overlays-in start end))
+         overlay)
+      (while overlays
+       (setq overlay (car overlays))
+       (setq overlays (cdr overlays))
+       (when (overlay-get overlay 'nxml-outline-display)
+         (delete-overlay overlay))))
+    (and category
+        (let ((overlay (make-overlay start
+                                     end
+                                     nil
+                                     front-advance
+                                     rear-advance)))
+          (overlay-put overlay 'category category)
+          (setq line-move-ignore-invisible t)
+          overlay))))
+
+(defun nxml-end-of-heading ()
+  "Move from the start of the content of the heading to the end.
+Do not move past the end of the line."
+  (let ((pos (condition-case err
+                (and (nxml-scan-element-forward (point) t)
+                     xmltok-start)
+              nil)))
+    (end-of-line)
+    (skip-chars-backward " \t")
+    (cond ((not pos)
+          (setq pos (nxml-token-before))
+          (when (eq xmltok-type 'end-tag)
+            (goto-char pos)))
+         ((< pos (point))
+          (goto-char pos)))
+    (skip-chars-backward " \t")
+    (point)))
+
+;;; Navigating section structure
+
+(defun nxml-token-starts-line-p ()
+  (save-excursion
+    (goto-char xmltok-start)
+    (skip-chars-backward " \t")
+    (bolp)))
+
+(defvar nxml-cached-section-tag-regexp nil)
+(defvar nxml-cached-section-element-name-regexp nil)
+
+(defsubst nxml-make-section-tag-regexp ()
+  (if (eq nxml-cached-section-element-name-regexp
+         nxml-section-element-name-regexp)
+      nxml-cached-section-tag-regexp
+    (nxml-make-section-tag-regexp-1)))
+
+(defun nxml-make-section-tag-regexp-1 ()
+  (setq nxml-cached-section-element-name-regexp nil)
+  (setq nxml-cached-section-tag-regexp
+       (concat "</?\\("
+               "\\(" xmltok-ncname-regexp ":\\)?"
+               nxml-section-element-name-regexp
+               "\\)[ \t\r\n>]"))
+  (setq nxml-cached-section-element-name-regexp
+       nxml-section-element-name-regexp)
+  nxml-cached-section-tag-regexp)
+
+(defun nxml-section-tag-forward ()
+  "Move forward past the first tag that is a section start- or end-tag.
+Return xmltok-type for tag.
+If no tag found, return nil and move to the end of the buffer."
+  (let ((case-fold-search nil)
+       (tag-regexp (nxml-make-section-tag-regexp))
+       match-end)
+    (when (< (point) nxml-prolog-end)
+      (goto-char nxml-prolog-end))
+    (while (cond ((not (re-search-forward tag-regexp nil 'move))
+                 (setq xmltok-type nil)
+                 nil)
+                ((progn
+                   (goto-char (match-beginning 0))
+                   (setq match-end (match-end 0))
+                   (nxml-ensure-scan-up-to-date)
+                   (let ((end (nxml-inside-end (point))))
+                     (when end
+                       (goto-char end)
+                       t))))
+                ((progn
+                   (xmltok-forward)
+                   (and (memq xmltok-type '(start-tag
+                                            partial-start-tag
+                                            end-tag
+                                            partial-end-tag))
+                        ;; just in case wildcard matched non-name chars
+                        (= xmltok-name-end (1- match-end))))
+                 nil)
+                (t))))
+    xmltok-type)
+        
+(defun nxml-section-tag-backward ()
+  "Move backward to the end of a tag that is a section start- or end-tag.
+The position of the end of the tag must be <= point
+Point is at the end of the tag.  `xmltok-start' is the start."
+  (let ((case-fold-search nil)
+       (start (point))
+       (tag-regexp (nxml-make-section-tag-regexp))
+       match-end)
+    (if (< (point) nxml-prolog-end)
+       (progn
+         (goto-char (point-min))
+         nil)
+      (while (cond ((not (re-search-backward tag-regexp
+                                            nxml-prolog-end
+                                            'move))
+                   (setq xmltok-type nil)
+                   (goto-char (point-min))
+                   nil)
+                  ((progn
+                     (goto-char (match-beginning 0))
+                     (setq match-end (match-end 0))
+                     (nxml-ensure-scan-up-to-date)
+                     (let ((pos (nxml-inside-start (point))))
+                       (when pos
+                         (goto-char (1- pos))
+                         t))))
+                  ((progn
+                     (xmltok-forward)
+                     (and (<= (point) start)
+                          (memq xmltok-type '(start-tag
+                                              partial-start-tag
+                                              end-tag
+                                              partial-end-tag))
+                          ;; just in case wildcard matched non-name chars
+                          (= xmltok-name-end (1- match-end))))
+                   nil)
+                  (t (goto-char xmltok-start)
+                     t)))
+      xmltok-type)))
+
+(defun nxml-section-start-position ()
+  "Return the position of the start of the section containing point.
+Signal an error on failure."
+  (condition-case err
+      (save-excursion (if (nxml-back-to-section-start)
+                         (point)
+                       (error "Not in section")))
+    (nxml-outline-error
+     (nxml-report-outline-error "Couldn't determine containing section: %s"
+                               err))))
+
+(defun nxml-back-to-section-start (&optional invisible-ok)
+  "Try to move back to the start of the section containing point.
+The start of the section must be <= point.
+Only visible sections are included unless INVISIBLE-OK is non-nil.
+If found, return t.  Otherwise move to point-min and return nil.
+If unbalanced section tags are found, signal an `nxml-outline-error'."
+  (when (or (nxml-after-section-start-tag)
+           (nxml-section-tag-backward))
+    (let (open-tags found)
+      (while (let (section-start-pos)
+              (setq section-start-pos xmltok-start)
+              (if (nxml-token-end-tag-p)
+                  (setq open-tags (cons (xmltok-end-tag-qname)
+                                        open-tags))
+                (if (not open-tags)
+                    (when (and (nxml-token-starts-line-p)
+                               (or invisible-ok
+                                   (not (get-char-property section-start-pos
+                                                           'invisible)))
+                               (nxml-heading-start-position))
+                      (setq found t))
+                  (let ((qname (xmltok-start-tag-qname)))
+                    (unless (string= (car open-tags) qname)
+                      (nxml-outline-error "mismatched end-tag"))
+                    (setq open-tags (cdr open-tags)))))
+              (goto-char section-start-pos)
+              (and (not found)
+                   (nxml-section-tag-backward))))
+      found)))
+
+(defun nxml-after-section-start-tag ()
+  "If the character after point is in a section start-tag, move after it.
+Return the token type.  Otherwise return nil.
+Set up variables like `xmltok-forward'."
+  (let ((pos (nxml-token-after))
+       (case-fold-search nil))
+   (when (and (memq xmltok-type '(start-tag partial-start-tag))
+             (save-excursion
+               (goto-char xmltok-start)
+               (looking-at (nxml-make-section-tag-regexp))))
+     (goto-char pos)
+     xmltok-type)))
+
+(defun nxml-heading-start-position ()
+  "Return the position of the start of the content of a heading element.
+Adjust the position to be after initial leading whitespace.
+Return nil if no heading element is found.  Requires point to be
+immediately after the section's start-tag."
+  (let ((depth 0)
+       (heading-regexp (concat "\\`\\("
+                               nxml-heading-element-name-regexp
+                               "\\)\\'"))
+       
+       (section-regexp (concat "\\`\\("
+                               nxml-section-element-name-regexp
+                               "\\)\\'"))
+       (start (point))
+       found)
+    (save-excursion
+      (while (and (xmltok-forward)
+                 (cond ((memq xmltok-type '(end-tag partial-end-tag))
+                        (and (not (string-match section-regexp
+                                                (xmltok-end-tag-local-name)))
+                             (> depth 0)
+                             (setq depth (1- depth))))
+                       ;; XXX Not sure whether this is a good idea
+                       ;;((eq xmltok-type 'empty-element)
+                       ;; nil)
+                       ((not (memq xmltok-type
+                                   '(start-tag partial-start-tag)))
+                        t)
+                       ((string-match section-regexp
+                                      (xmltok-start-tag-local-name))
+                        nil)
+                       ((string-match heading-regexp
+                                      (xmltok-start-tag-local-name))
+                        (skip-chars-forward " \t\r\n")
+                        (setq found (point))
+                        nil)
+                       (t
+                        (setq depth (1+ depth))
+                        t))
+                 (<= (- (point) start) nxml-heading-scan-distance))))
+    found))
+
+;;; Error handling
+
+(defun nxml-report-outline-error (msg err)
+  (error msg (apply 'format (cdr err))))
+
+(defun nxml-outline-error (&rest args)
+  (signal 'nxml-outline-error args))
+
+(put 'nxml-outline-error
+     'error-conditions
+     '(error nxml-error nxml-outline-error))
+
+(put 'nxml-outline-error
+     'error-message
+     "Cannot create outline of buffer that is not well-formed")
+
+;;; Debugging
+
+(defun nxml-debug-overlays ()
+  (interactive)
+  (let ((overlays (nreverse (overlays-in (point-min) (point-max))))
+       overlay)
+    (while overlays
+      (setq overlay (car overlays))
+      (setq overlays (cdr overlays))
+      (when (overlay-get overlay 'nxml-outline-display)
+       (message "overlay %s: %s...%s (%s)"
+                (overlay-get overlay 'category)
+                (overlay-start overlay)
+                (overlay-end overlay)
+                (overlay-get overlay 'display))))))
+
+(provide 'nxml-outln)
+
+;; arch-tag: 1f1b7454-e573-4cd7-a505-d9dc64eef828
+;;; nxml-outln.el ends here
diff --git a/lisp/nxml/nxml-parse.el b/lisp/nxml/nxml-parse.el
new file mode 100644 (file)
index 0000000..267c18c
--- /dev/null
@@ -0,0 +1,323 @@
+;;; nxml-parse.el --- XML parser, sharing infrastructure with nxml-mode
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Entry point is `nxml-parse-file'.
+
+;;; Code:
+
+(require 'nxml-util)
+(require 'xmltok)
+(require 'nxml-enc)
+(require 'nxml-ns)
+
+(defvar nxml-parse-file-name nil)
+
+(defvar nxml-validate-function nil
+  "Nil or a function to be called by `nxml-parse-file' to perform validation.
+The function will be called once for each start-tag or end-tag.  The
+function is passed two arguments TEXT and START-TAG.  For a start-tag,
+START-TAG is a list (NAME ATTRIBUTES) where NAME and ATTRIBUTES are in
+the same form as returned by `nxml-parse-file.  For an end-tag,
+START-TAG is nil.  TEXT is a string containing the text immediately
+preceding the tag, or nil if there was no such text.  An empty element
+is treated as a start-tag followed by an end-tag.
+
+For a start-tag, the namespace state will be the state after
+processing the namespace declarations in the start-tag. For an
+end-tag, the namespace state will be the state before popping the
+namespace declarations for the corresponding start-tag.
+
+The function must return nil if no error is detected or a
+cons (MESSAGE . LOCATION) where MESSAGE is a string containing
+an error message and LOCATION indicates what caused the error
+as follows:
+
+- nil indicates the tag as whole caused it; this is always allowed;
+
+- text indicates the text caused it; this is allowed only if
+TEXT is non-nil;
+
+- tag-close indicates the close of the tag caused it; this is
+allowed only if START-TAG is non-nil;
+
+- (attribute-name . N) indicates that the name of the Nth attribute
+caused it; N counts from 0; this is allowed only if START-TAG is non-nil
+and N must be less than the number of attributes;
+
+- (attribute-value . N) indicates that the value of the Nth attribute
+caused it; N counts from 0; this is allowed only if START-TAG is non-nil
+and N must be less than the number of attributes.")
+
+(defun nxml-parse-file (file)
+  "Parse the XML document in FILE and return it as a list.
+An XML element is represented as a list (NAME ATTRIBUTES . CHILDREN).
+NAME is either a string, in the case where the name does not have a
+namespace, or a cons (NAMESPACE . LOCAL-NAME), where NAMESPACE is a
+symbol and LOCAL-NAME is a string, in the case where the name does
+have a namespace. NAMESPACE is a keyword whose name is `:URI', where
+URI is the namespace name.  ATTRIBUTES is an alist of attributes where
+each attribute has the form (NAME . VALUE), where NAME has the same
+form as an element name, and VALUE is a string.  A namespace
+declaration is represented as an attribute whose name is
+\(:http://www.w3.org/2000/xmlns/ . LOCAL-NAME).  CHILDREN is a list
+containing strings and child elements; CHILDREN never contains two
+consecutive strings and never contains an empty string.  Processing
+instructions and comments are not represented.  The return value is a
+list representing the document element.
+
+If the XML document is not well-formed, an error having the condition
+`nxml-file-parse-error' will be signaled; the error data will be a
+list of the \(FILE POSITION MESSAGE), where POSITION is an integer
+specifying the position where the error was detected, and MESSAGE is a
+string describing the error.
+
+The current contents of FILE will be parsed even if there is a
+modified buffer currently visiting FILE.
+
+If the variable `nxml-validation-function' is non-nil, it will be
+called twice for each element, and any reported error will be signaled
+in the same way as well-formedness error."
+  (save-excursion
+    (set-buffer (nxml-parse-find-file file))
+    (unwind-protect
+       (let ((nxml-parse-file-name file))
+         (nxml-parse-instance))
+      (kill-buffer nil))))
+
+(defun nxml-parse-find-file (file)
+  (save-excursion
+    (set-buffer (get-buffer-create " *nXML Parse*"))
+    (erase-buffer)
+    (let ((set-auto-coding-function 'nxml-set-xml-coding))
+      (insert-file-contents file))
+    (current-buffer)))
+      
+(defun nxml-parse-instance ()
+  (let (xmltok-dtd)
+    (xmltok-save
+      (xmltok-forward-prolog)
+      (nxml-check-xmltok-errors)
+      (nxml-ns-save
+       (nxml-parse-instance-1)))))
+
+(defun nxml-parse-instance-1 ()
+  (let* ((top (cons nil nil))
+        ;; tail is a cons cell, whose cdr is nil
+        ;; additional elements will destructively appended to tail
+        (tail top)
+        ;; stack of tails one for each open element
+        tail-stack
+        ;; list of QNames of open elements
+        open-element-tags
+        ;; list of strings buffering a text node, in reverse order
+        text
+        ;; position of beginning of first (in buffer) string in text
+        text-pos)
+    (while (xmltok-forward)
+      (nxml-check-xmltok-errors)
+      (cond ((memq xmltok-type '(start-tag end-tag empty-element))
+            (when text
+              (setq text (apply 'concat (nreverse text)))
+              (setcdr tail (cons text nil))
+              (setq tail (cdr tail)))
+            (when (not (eq xmltok-type 'end-tag))
+              (when (and (not open-element-tags)
+                         (not (eq tail top)))
+                (nxml-parse-error nil "Multiple top-level elements"))
+              (setq open-element-tags
+                    (cons (xmltok-start-tag-qname)
+                          open-element-tags))
+              (nxml-ns-push-state)
+              (let ((tag (nxml-parse-start-tag)))
+                (nxml-validate-tag text text-pos tag)
+                (setq text nil)
+                (setcdr tail (cons tag nil))
+                (setq tail (cdr tail))
+                (setq tail-stack (cons tail tail-stack))
+                (setq tail (last tag))))
+            (when (not (eq xmltok-type 'start-tag))
+              (or (eq xmltok-type 'empty-element)
+                  (equal (car open-element-tags)
+                         (xmltok-end-tag-qname))
+                  (if open-element-tags
+                      (nxml-parse-error nil
+                                        "Unbalanced end-tag; expected </%s>"
+                                        (car open-element-tags))
+                    (nxml-parse-error nil "Extra end-tag")))
+              (nxml-validate-tag text text-pos nil)
+              (setq text nil)
+              (nxml-ns-pop-state)
+              (setq open-element-tags (cdr open-element-tags))
+              (setq tail (car tail-stack))
+              (setq tail-stack (cdr tail-stack)))
+            (setq text-pos nil))
+           ((memq xmltok-type '(space data entity-ref char-ref cdata-section))
+            (cond (open-element-tags
+                   (unless text-pos
+                     (setq text-pos xmltok-start))
+                   (setq text
+                         (cons (nxml-current-text-string) text)))
+                  ((not (eq xmltok-type 'space))
+                   (nxml-parse-error
+                    nil
+                    "%s at top-level"
+                    (cdr (assq xmltok-type
+                               '((data . "Text characters")
+                                 (entity-ref . "Entity reference")
+                                 (char-ref . "Character reference")
+                                 (cdata-section . "CDATA section"))))))))))
+    (unless (cdr top)
+      (nxml-parse-error (point-max) "Missing document element"))
+    (cadr top)))
+
+(defun nxml-parse-start-tag ()
+  (let (parsed-attributes
+       parsed-namespace-attributes
+       atts att prefixes prefix ns value name)
+    (setq atts xmltok-namespace-attributes)
+    (while atts
+      (setq att (car atts))
+      (setq value (or (xmltok-attribute-value att)
+                     (nxml-parse-error nil "Invalid attribute value")))
+      (setq ns (nxml-make-namespace value))
+      (setq prefix (and (xmltok-attribute-prefix att)
+                       (xmltok-attribute-local-name att)))
+      (cond ((member prefix prefixes)
+            (nxml-parse-error nil "Duplicate namespace declaration"))
+           ((not prefix)
+            (nxml-ns-set-default ns))
+           (ns
+            (nxml-ns-set-prefix prefix ns))
+           (t (nxml-parse-error nil "Cannot undeclare namespace prefix")))
+      (setq prefixes (cons prefix prefixes))
+      (setq parsed-namespace-attributes
+           (cons (cons (nxml-make-name nxml-xmlns-namespace-uri
+                                       (xmltok-attribute-local-name att))
+                       value)
+                 parsed-namespace-attributes))
+      (setq atts (cdr atts)))
+    (setq name
+         (nxml-make-name
+          (let ((prefix (xmltok-start-tag-prefix)))
+            (if prefix
+                (or (nxml-ns-get-prefix prefix)
+                    (nxml-parse-error (1+ xmltok-start)
+                                      "Prefix `%s' undeclared"
+                                      prefix))
+              (nxml-ns-get-default)))
+          (xmltok-start-tag-local-name)))
+    (setq atts xmltok-attributes)
+    (while atts
+      (setq att (car atts))
+      (setq ns
+           (let ((prefix (xmltok-attribute-prefix att)))
+             (and prefix
+                  (or (nxml-ns-get-prefix prefix)
+                      (nxml-parse-error (xmltok-attribute-name-start att)
+                                        "Prefix `%s' undeclared"
+                                        prefix)))))
+      (setq parsed-attributes
+           (let ((nm (nxml-make-name ns
+                                     (xmltok-attribute-local-name att))))
+             (when (assoc nm parsed-attributes)
+               (nxml-parse-error (xmltok-attribute-name-start att)
+                                 "Duplicate attribute"))
+             (cons (cons nm (or (xmltok-attribute-value att)
+                                (nxml-parse-error nil "Invalid attribute value")))
+                   parsed-attributes)))
+      (setq atts (cdr atts)))
+    ;; We want to end up with the attributes followed by the
+    ;; the namespace attributes in the same order as
+    ;; xmltok-attributes and xmltok-namespace-attributes respectively.
+    (when parsed-namespace-attributes
+      (setq parsed-attributes
+           (nconc parsed-namespace-attributes parsed-attributes)))
+    (list name (nreverse parsed-attributes))))
+
+(defun nxml-validate-tag (text text-pos tag)
+  (when nxml-validate-function
+    (let ((err (funcall nxml-validate-function text tag))
+         pos)
+      (when err
+       (setq pos (nxml-validate-error-position (cdr err)
+                                               (and text text-pos)
+                                               tag))
+       (or pos (error "Incorrect return value from %s"
+                      nxml-validate-function))
+       (nxml-parse-error pos (car err))))))
+
+(defun nxml-validate-error-position (location text-pos tag)
+  (cond ((null location) xmltok-start)
+       ((eq location 'text)  text-pos)
+       ((eq location 'tag-close)
+        (and tag (- (point) (if (eq xmltok-type 'empty-element ) 2 1))))
+       ((consp location)
+        (let ((att (nth (cdr location) xmltok-attributes)))
+          (when (not att)
+            (setq att (nth (- (cdr location) (length xmltok-attributes))
+                           xmltok-namespace-attributes)))
+          (cond ((not att))
+                ((eq (car location) 'attribute-name)
+                 (xmltok-attribute-name-start att))
+                ((eq (car location) 'attribute-value)
+                 (xmltok-attribute-value-start att)))))))
+
+(defun nxml-make-name (ns local-name)
+  (if ns
+      (cons ns local-name)
+    local-name))
+
+(defun nxml-current-text-string ()
+  (cond ((memq xmltok-type '(space data))
+        (buffer-substring-no-properties xmltok-start
+                                        (point)))
+       ((eq xmltok-type 'cdata-section)
+        (buffer-substring-no-properties (+ xmltok-start 9)
+                                        (- (point) 3)))
+       ((memq xmltok-type '(char-ref entity-ref))
+        (unless xmltok-replacement
+          (nxml-parse-error nil
+                            (if (eq xmltok-type 'char-ref)
+                                "Reference to unsupported Unicode character"
+                              "Unresolvable entity reference")))
+        xmltok-replacement)))
+
+(defun nxml-parse-error (position &rest args)
+  (nxml-signal-file-parse-error nxml-parse-file-name
+                               (or position xmltok-start)
+                               (apply 'format args)))
+
+(defun nxml-check-xmltok-errors ()
+  (when xmltok-errors
+    (let ((err (car (last xmltok-errors))))
+      (nxml-signal-file-parse-error nxml-parse-file-name
+                                   (xmltok-error-start err)
+                                   (xmltok-error-message err)))))
+
+(provide 'nxml-parse)
+
+;; arch-tag: fc19639b-1bff-4673-9992-f539da89ba1e
+;;; nxml-parse.el ends here
diff --git a/lisp/nxml/nxml-rap.el b/lisp/nxml/nxml-rap.el
new file mode 100644 (file)
index 0000000..907812b
--- /dev/null
@@ -0,0 +1,473 @@
+;;; nxml-rap.el --- low-level support for random access parsing for nXML mode
+
+;; Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This uses xmltok.el to do XML parsing. The fundamental problem is
+;; how to handle changes. We don't want to maintain a complete parse
+;; tree.  We also don't want to reparse from the start of the document
+;; on every keystroke.  However, it is not possible in general to
+;; parse an XML document correctly starting at a random point in the
+;; middle.  The main problems are comments, CDATA sections and
+;; processing instructions: these can all contain things that are
+;; indistinguishable from elements. Literals in the prolog are also a
+;; problem.  Attribute value literals are not a problem because
+;; attribute value literals cannot contain less-than signs.
+;;
+;; Our strategy is to keep track of just the problematic things.
+;; Specifically, we keep track of all comments, CDATA sections and
+;; processing instructions in the instance.  We do this by marking all
+;; except the first character of these with a non-nil nxml-inside text
+;; property. The value of the nxml-inside property is comment,
+;; cdata-section or processing-instruction.  The first character does
+;; not have the nxml-inside property so we can find the beginning of
+;; the construct by looking for a change in a text property value
+;; (Emacs provides primitives for this).  We use text properties
+;; rather than overlays, since the implementation of overlays doesn't
+;; look like it scales to large numbers of overlays in a buffer.
+;;
+;; We don't in fact track all these constructs, but only track them in
+;; some initial part of the instance. The variable `nxml-scan-end'
+;; contains the limit of where we have scanned up to for them.
+;;
+;; Thus to parse some random point in the file we first ensure that we
+;; have scanned up to that point.  Then we search backwards for a
+;; <. Then we check whether the < has an nxml-inside property. If it
+;; does we go backwards to first character that does not have an
+;; nxml-inside property (this character must be a <).  Then we start
+;; parsing forward from the < we have found.
+;;
+;; The prolog has to be parsed specially, so we also keep track of the
+;; end of the prolog in `nxml-prolog-end'. The prolog is reparsed on
+;; every change to the prolog.  This won't work well if people try to
+;; edit huge internal subsets. Hopefully that will be rare.
+;;
+;; We keep track of the changes by adding to the buffer's
+;; after-change-functions hook.  Scanning is also done as a
+;; prerequisite to fontification by adding to fontification-functions
+;; (in the same way as jit-lock).  This means that scanning for these
+;; constructs had better be quick.  Fortunately it is. Firstly, the
+;; typical proportion of comments, CDATA sections and processing
+;; instructions is small relative to other things.  Secondly, to scan
+;; we just search for the regexp <[!?].
+;;
+;; One problem is unclosed comments, processing instructions and CDATA
+;; sections.  Suppose, for example, we encounter a <!-- but there's no
+;; matching -->.  This is not an unexpected situation if the user is
+;; creating a comment. It is not helpful to treat the whole of the
+;; file starting from the <!-- onwards as a single unclosed comment
+;; token. Instead we treat just the <!-- as a piece of not well-formed
+;; markup and continue.  The problem is that if at some later stage a
+;; --> gets added to the buffer after the unclosed <!--, we will need
+;; to reparse the buffer starting from the <!--.  We need to keep
+;; track of these reparse dependencies; they are called dependent
+;; regions in the code.
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-util)
+
+(defvar nxml-prolog-end nil
+  "Integer giving position following end of the prolog.")
+(make-variable-buffer-local 'nxml-prolog-end)
+
+(defvar nxml-scan-end nil
+  "Marker giving position up to which we have scanned.
+nxml-scan-end must be >= nxml-prolog-end.  Furthermore, nxml-scan-end
+must not an inside position in the following sense. A position is
+inside if the following character is a part of, but not the first
+character of, a CDATA section, comment or processing instruction.
+Furthermore all positions >= nxml-prolog-end and < nxml-scan-end that
+are inside positions must have a non-nil nxml-inside property whose
+value is a symbol specifying what it is inside. Any characters with a
+non-nil fontified property must have position < nxml-scan-end and the
+correct face. Dependent regions must also be established for any
+unclosed constructs starting before nxml-scan-end.
+There must be no nxml-inside properties after nxml-scan-end.")
+(make-variable-buffer-local 'nxml-scan-end)
+
+(defsubst nxml-get-inside (pos)
+  (get-text-property pos 'nxml-inside))
+
+(defsubst nxml-clear-inside (start end)
+  (remove-text-properties start end '(nxml-inside nil)))
+
+(defsubst nxml-set-inside (start end type)
+  (put-text-property start end 'nxml-inside type))
+
+(defun nxml-inside-end (pos)
+  "Return the end of the inside region containing POS.
+Return nil if the character at POS is not inside."
+  (if (nxml-get-inside pos)
+      (or (next-single-property-change pos 'nxml-inside)
+         (point-max))
+    nil))
+
+(defun nxml-inside-start (pos)
+  "Return the start of the inside region containing POS.
+Return nil if the character at POS is not inside."
+  (if (nxml-get-inside pos)
+      (or (previous-single-property-change (1+ pos) 'nxml-inside)
+         (point-min))
+    nil))
+
+;;; Change management
+
+(defun nxml-scan-after-change (start end)
+  "Restore `nxml-scan-end' invariants after a change.
+The change happened between START and END.
+Return position after which lexical state is unchanged.
+END must be > nxml-prolog-end."
+  (if (>= start nxml-scan-end)
+      nxml-scan-end
+    (goto-char start)
+    (nxml-move-outside-backwards)
+    (setq start (point))
+    (let ((inside-remove-start start)
+         xmltok-errors
+         xmltok-dependent-regions)
+      (while (or (when (xmltok-forward-special (min end nxml-scan-end))
+                  (when (memq xmltok-type
+                              '(comment
+                                cdata-section
+                                processing-instruction))
+                    (nxml-clear-inside inside-remove-start
+                                       (1+ xmltok-start))
+                    (nxml-set-inside (1+ xmltok-start)
+                                     (point)
+                                     xmltok-type)
+                    (setq inside-remove-start (point)))
+                  (if (< (point) (min end nxml-scan-end))
+                      t
+                    (setq end (point))
+                    nil))
+                ;; The end of the change was inside but is now outside.
+                ;; Imagine something really weird like
+                ;; <![CDATA[foo <!-- bar ]]> <![CDATA[ stuff --> <!-- ]]> -->
+                ;; and suppose we deleted "<![CDATA[f"
+                (let ((inside-end (nxml-inside-end end)))
+                  (when inside-end
+                    (setq end inside-end)
+                    t))))
+      (nxml-clear-inside inside-remove-start end)
+      (nxml-clear-dependent-regions start end)
+      (nxml-mark-parse-dependent-regions))
+    (when (> end nxml-scan-end)
+      (set-marker nxml-scan-end end))
+    end))
+
+;; n-s-p only called from nxml-mode.el, where this variable is defined.
+(defvar nxml-prolog-regions)
+
+(defun nxml-scan-prolog ()
+  (goto-char (point-min))
+  (let (xmltok-dtd
+       xmltok-errors
+       xmltok-dependent-regions)
+    (setq nxml-prolog-regions (xmltok-forward-prolog))
+    (setq nxml-prolog-end (point))
+    (nxml-clear-inside (point-min) nxml-prolog-end)
+    (nxml-clear-dependent-regions (point-min) nxml-prolog-end)
+    (nxml-mark-parse-dependent-regions))
+  (when (< nxml-scan-end nxml-prolog-end)
+    (set-marker nxml-scan-end nxml-prolog-end)))
+
+
+;;; Dependent regions
+
+(defun nxml-adjust-start-for-dependent-regions (start end pre-change-length)
+  (let ((overlays (overlays-in (1- start) start))
+       (adjusted-start start))
+    (while overlays
+      (let* ((overlay (car overlays))
+            (ostart (overlay-start overlay)))
+       (when (and (eq (overlay-get overlay 'category) 'nxml-dependent)
+                  (< ostart adjusted-start))
+         (let ((funargs (overlay-get overlay 'nxml-funargs)))
+           (when (apply (car funargs)
+                        (append (list start
+                                      end
+                                      pre-change-length
+                                      ostart
+                                      (overlay-end overlay))
+                                (cdr funargs)))
+             (setq adjusted-start ostart)))))
+      (setq overlays (cdr overlays)))
+    adjusted-start))
+                 
+(defun nxml-mark-parse-dependent-regions ()
+  (while xmltok-dependent-regions
+    (apply 'nxml-mark-parse-dependent-region
+          (car xmltok-dependent-regions))
+    (setq xmltok-dependent-regions
+         (cdr xmltok-dependent-regions))))
+
+(defun nxml-mark-parse-dependent-region (fun start end &rest args)
+  (let ((overlay (make-overlay start end nil t t)))
+    (overlay-put overlay 'category 'nxml-dependent)
+    (overlay-put overlay 'nxml-funargs (cons fun args))))
+
+(put 'nxml-dependent 'evaporate t)
+
+(defun nxml-clear-dependent-regions (start end)
+  (let ((overlays (overlays-in start end)))
+    (while overlays
+      (let* ((overlay (car overlays))
+            (category (overlay-get overlay 'category)))
+       (when (and (eq category 'nxml-dependent)
+                  (<= start (overlay-start overlay)))
+         (delete-overlay overlay)))
+      (setq overlays (cdr overlays)))))
+
+;;; Random access parsing
+
+(defun nxml-token-after ()
+  "Return the position after the token containing the char after point.
+Sets up the variables `xmltok-type', `xmltok-start',
+`xmltok-name-end', `xmltok-name-colon', `xmltok-attributes',
+`xmltok-namespace-attributes' in the same was as does
+`xmltok-forward'.  The prolog will be treated as a single token with
+type `prolog'."
+  (let ((pos (point)))
+    (if (< pos nxml-prolog-end)
+       (progn
+         (setq xmltok-type 'prolog
+               xmltok-start (point-min))
+         (min nxml-prolog-end (point-max)))
+      (nxml-ensure-scan-up-to-date)
+      (if (nxml-get-inside pos)
+         (save-excursion
+           (nxml-move-outside-backwards)
+           (xmltok-forward)
+           (point))
+       (save-excursion
+         (if (or (eq (char-after) ?<)
+                     (search-backward "<"
+                                      (max (point-min) nxml-prolog-end)
+                                      t))
+             (nxml-move-outside-backwards)
+           (goto-char (if (<= (point-min) nxml-prolog-end)
+                          nxml-prolog-end
+                        (or (nxml-inside-end (point-min))
+                            (point-min)))))
+         (while (and (nxml-tokenize-forward)
+                     (<= (point) pos)))
+         (point))))))
+
+(defun nxml-token-before ()
+  "Return the position after the token containing the char before point.
+Sets variables like `nxml-token-after'."
+  (if (/= (point-min) (point))
+      (save-excursion
+       (goto-char (1- (point)))
+       (nxml-token-after))
+    (setq xmltok-start (point))
+    (setq xmltok-type nil)
+    (point)))
+
+(defun nxml-tokenize-forward ()
+  (let (xmltok-dependent-regions
+       xmltok-errors)
+    (when (and (xmltok-forward)
+              (> (point) nxml-scan-end))
+      (cond ((memq xmltok-type '(comment
+                                cdata-section
+                                processing-instruction))
+            (nxml-with-unmodifying-text-property-changes
+              (nxml-set-inside (1+ xmltok-start) (point) xmltok-type)))
+           (xmltok-dependent-regions
+            (nxml-mark-parse-dependent-regions)))
+      (set-marker nxml-scan-end (point)))
+    xmltok-type))
+
+(defun nxml-move-outside-backwards ()
+  "Move point to first character of the containing special thing.
+Leave point unmoved if it is not inside anything special."
+  (let ((start (nxml-inside-start (point))))
+    (when start
+      (goto-char (1- start))
+      (when (nxml-get-inside (point))
+       (error "Char before inside-start at %s had nxml-inside property %s"
+              (point)
+              (nxml-get-inside (point)))))))
+
+(defun nxml-ensure-scan-up-to-date ()
+  (let ((pos (point)))
+    (when (< nxml-scan-end pos)
+      (save-excursion
+       (goto-char nxml-scan-end)
+       (let (xmltok-errors
+             xmltok-dependent-regions)
+         (while (when (xmltok-forward-special pos)
+                  (when (memq xmltok-type
+                              '(comment
+                                processing-instruction
+                                cdata-section))
+                    (nxml-with-unmodifying-text-property-changes
+                      (nxml-set-inside (1+ xmltok-start)
+                                       (point)
+                                       xmltok-type)))
+                  (if (< (point) pos)
+                      t
+                    (setq pos (point))
+                    nil)))
+         (nxml-clear-dependent-regions nxml-scan-end pos)
+         (nxml-mark-parse-dependent-regions)
+         (set-marker nxml-scan-end pos))))))
+
+;;; Element scanning
+
+(defun nxml-scan-element-forward (from &optional up)
+  "Scan forward from FROM over a single balanced element.
+Point must between tokens.  Return the position of the end of the tag
+that ends the element. `xmltok-start' will contain the position of the
+start of the tag. If UP is non-nil, then scan past end-tag of element
+containing point.  If no element is found, return nil.  If a
+well-formedness error prevents scanning, signal an nxml-scan-error.
+Point is not moved."
+  (let ((open-tags (and up t))
+       found)
+    (save-excursion
+      (goto-char from)
+      (while (cond ((not (nxml-tokenize-forward))
+                   (when (consp open-tags)
+                     (nxml-scan-error (cadr open-tags)
+                                      "Start-tag has no end-tag"))
+                   nil)
+                  ((eq xmltok-type 'start-tag)
+                   (setq open-tags
+                         (cons (xmltok-start-tag-qname)
+                               (cons xmltok-start
+                                     open-tags)))
+                   t)
+                  ((eq xmltok-type 'end-tag)
+                   (cond ((not open-tags) nil)
+                         ((not (consp open-tags)) (setq found (point)) nil)
+                         ((not (string= (car open-tags)
+                                        (xmltok-end-tag-qname)))
+                          (nxml-scan-error (+ 2 xmltok-start)
+                                           "Mismatched end-tag; \
+expected `%s'"
+                                           (car open-tags)))
+                         ((setq open-tags (cddr open-tags)) t)
+                         (t (setq found (point)) nil)))
+                  ((memq xmltok-type '(empty-element
+                                       partial-empty-element))
+                   (if open-tags
+                       t
+                     (setq found (point))
+                     nil))
+                  ((eq xmltok-type 'partial-end-tag)
+                   (cond ((not open-tags) nil)
+                         ((not (consp open-tags)) (setq found (point)) nil)
+                         ((setq open-tags (cddr open-tags)) t)
+                         (t (setq found (point)) nil)))
+                  ((eq xmltok-type 'partial-start-tag)
+                   (nxml-scan-error xmltok-start
+                                    "Missing `>'"))
+                  (t t))))
+    found))
+
+(defun nxml-scan-element-backward (from &optional up bound)
+  "Scan backward from FROM over a single balanced element.
+Point must between tokens.  Return the position of the end of the tag
+that starts the element. `xmltok-start' will contain the position of
+the start of the tag.  If UP is non-nil, then scan past start-tag of
+element containing point.  If BOUND is non-nil, then don't scan back
+past BOUND.  If no element is found, return nil.  If a well-formedness
+error prevents scanning, signal an nxml-scan-error.  Point is not
+moved."
+  (let ((open-tags (and up t))
+       token-end found)
+    (save-excursion
+      (goto-char from)
+      (while (cond ((or (< (point) nxml-prolog-end)
+                       (not (search-backward "<"
+                                             (max (or bound 0)
+                                                  nxml-prolog-end)
+                                             t)))
+                   (when (and (consp open-tags) (not bound))
+                     (nxml-scan-error (cadr open-tags)
+                                      "End-tag has no start-tag"))
+                   nil)
+                  ((progn
+                     (nxml-move-outside-backwards)
+                     (save-excursion
+                       (nxml-tokenize-forward)
+                       (setq token-end (point)))
+                     (eq xmltok-type 'end-tag))
+                   (setq open-tags
+                         (cons (xmltok-end-tag-qname)
+                               (cons xmltok-start open-tags)))
+                   t)
+                  ((eq xmltok-type 'start-tag)
+                   (cond ((not open-tags) nil)
+                         ((not (consp open-tags))
+                          (setq found token-end)
+                          nil)
+                         ((and (car open-tags)
+                               (not (string= (car open-tags)
+                                             (xmltok-start-tag-qname))))
+                          (nxml-scan-error (1+ xmltok-start)
+                                           "Mismatched start-tag; \
+expected `%s'"
+                                           (car open-tags)))
+                         ((setq open-tags (cddr open-tags)) t)
+                         (t (setq found token-end) nil)))
+                  ((memq xmltok-type '(empty-element
+                                       partial-empty-element))
+                   (if open-tags
+                       t
+                     (setq found token-end)
+                     nil))
+                  ((eq xmltok-type 'partial-end-tag)
+                   (setq open-tags
+                         (cons nil (cons xmltok-start open-tags)))
+                   t)
+                  ((eq xmltok-type 'partial-start-tag)
+                   ;; if we have only a partial-start-tag
+                   ;; then it's unlikely that there's a matching
+                   ;; end-tag, so it's probably not helpful
+                   ;; to treat it as a complete start-tag
+                   (nxml-scan-error xmltok-start
+                                    "Missing `>'"))
+                  (t t))))
+    found))
+
+(defun nxml-scan-error (&rest args)
+  (signal 'nxml-scan-error args))
+
+(put 'nxml-scan-error
+     'error-conditions
+     '(error nxml-error nxml-scan-error))
+
+(put 'nxml-scan-error
+     'error-message
+     "Scan over element that is not well-formed")
+
+(provide 'nxml-rap)
+
+;; arch-tag: cba241ec-4c59-4ef3-aa51-2cf92b3dd24f
+;;; nxml-rap.el ends here
diff --git a/lisp/nxml/nxml-uchnm.el b/lisp/nxml/nxml-uchnm.el
new file mode 100644 (file)
index 0000000..9514a7d
--- /dev/null
@@ -0,0 +1,259 @@
+;;; nxml-uchnm.el --- support for Unicode standard cha names in nxml-mode
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This enables the use of the character names defined in the Unicode
+;; Standard.  The use of the names can be controlled on a per-block
+;; basis, so as both to reduce memory usage and loading time,
+;; and to make completion work better.
+;; The main entry point is `nxml-enable-unicode-char-name-sets'.  Typically,
+;; this is added to `nxml-mode-hook' (rng-auto.el does this already).
+;; To customize the blocks for which names are used
+
+;;; Code:
+
+(require 'nxml-mode)
+
+(defconst nxml-unicode-blocks
+  '(("Basic Latin" #x0000 #x007F)
+    ("Latin-1 Supplement" #x0080 #x00FF)
+    ("Latin Extended-A" #x0100 #x017F)
+    ("Latin Extended-B" #x0180 #x024F)
+    ("IPA Extensions" #x0250 #x02AF)
+    ("Spacing Modifier Letters" #x02B0 #x02FF)
+    ("Combining Diacritical Marks" #x0300 #x036F)
+    ("Greek and Coptic" #x0370 #x03FF)
+    ("Cyrillic" #x0400 #x04FF)
+    ("Cyrillic Supplementary" #x0500 #x052F)
+    ("Armenian" #x0530 #x058F)
+    ("Hebrew" #x0590 #x05FF)
+    ("Arabic" #x0600 #x06FF)
+    ("Syriac" #x0700 #x074F)
+    ("Thaana" #x0780 #x07BF)
+    ("Devanagari" #x0900 #x097F)
+    ("Bengali" #x0980 #x09FF)
+    ("Gurmukhi" #x0A00 #x0A7F)
+    ("Gujarati" #x0A80 #x0AFF)
+    ("Oriya" #x0B00 #x0B7F)
+    ("Tamil" #x0B80 #x0BFF)
+    ("Telugu" #x0C00 #x0C7F)
+    ("Kannada" #x0C80 #x0CFF)
+    ("Malayalam" #x0D00 #x0D7F)
+    ("Sinhala" #x0D80 #x0DFF)
+    ("Thai" #x0E00 #x0E7F)
+    ("Lao" #x0E80 #x0EFF)
+    ("Tibetan" #x0F00 #x0FFF)
+    ("Myanmar" #x1000 #x109F)
+    ("Georgian" #x10A0 #x10FF)
+    ("Hangul Jamo" #x1100 #x11FF)
+    ("Ethiopic" #x1200 #x137F)
+    ("Cherokee" #x13A0 #x13FF)
+    ("Unified Canadian Aboriginal Syllabics" #x1400 #x167F)
+    ("Ogham" #x1680 #x169F)
+    ("Runic" #x16A0 #x16FF)
+    ("Tagalog" #x1700 #x171F)
+    ("Hanunoo" #x1720 #x173F)
+    ("Buhid" #x1740 #x175F)
+    ("Tagbanwa" #x1760 #x177F)
+    ("Khmer" #x1780 #x17FF)
+    ("Mongolian" #x1800 #x18AF)
+    ("Latin Extended Additional" #x1E00 #x1EFF)
+    ("Greek Extended" #x1F00 #x1FFF)
+    ("General Punctuation" #x2000 #x206F)
+    ("Superscripts and Subscripts" #x2070 #x209F)
+    ("Currency Symbols" #x20A0 #x20CF)
+    ("Combining Diacritical Marks for Symbols" #x20D0 #x20FF)
+    ("Letterlike Symbols" #x2100 #x214F)
+    ("Number Forms" #x2150 #x218F)
+    ("Arrows" #x2190 #x21FF)
+    ("Mathematical Operators" #x2200 #x22FF)
+    ("Miscellaneous Technical" #x2300 #x23FF)
+    ("Control Pictures" #x2400 #x243F)
+    ("Optical Character Recognition" #x2440 #x245F)
+    ("Enclosed Alphanumerics" #x2460 #x24FF)
+    ("Box Drawing" #x2500 #x257F)
+    ("Block Elements" #x2580 #x259F)
+    ("Geometric Shapes" #x25A0 #x25FF)
+    ("Miscellaneous Symbols" #x2600 #x26FF)
+    ("Dingbats" #x2700 #x27BF)
+    ("Miscellaneous Mathematical Symbols-A" #x27C0 #x27EF)
+    ("Supplemental Arrows-A" #x27F0 #x27FF)
+    ("Braille Patterns" #x2800 #x28FF)
+    ("Supplemental Arrows-B" #x2900 #x297F)
+    ("Miscellaneous Mathematical Symbols-B" #x2980 #x29FF)
+    ("Supplemental Mathematical Operators" #x2A00 #x2AFF)
+    ("CJK Radicals Supplement" #x2E80 #x2EFF)
+    ("Kangxi Radicals" #x2F00 #x2FDF)
+    ("Ideographic Description Characters" #x2FF0 #x2FFF)
+    ("CJK Symbols and Punctuation" #x3000 #x303F)
+    ("Hiragana" #x3040 #x309F)
+    ("Katakana" #x30A0 #x30FF)
+    ("Bopomofo" #x3100 #x312F)
+    ("Hangul Compatibility Jamo" #x3130 #x318F)
+    ("Kanbun" #x3190 #x319F)
+    ("Bopomofo Extended" #x31A0 #x31BF)
+    ("Katakana Phonetic Extensions" #x31F0 #x31FF)
+    ("Enclosed CJK Letters and Months" #x3200 #x32FF)
+    ("CJK Compatibility" #x3300 #x33FF)
+    ("CJK Unified Ideographs Extension A" #x3400 #x4DBF)
+    ;;("CJK Unified Ideographs" #x4E00 #x9FFF)
+    ("Yi Syllables" #xA000 #xA48F)
+    ("Yi Radicals" #xA490 #xA4CF)
+    ;;("Hangul Syllables" #xAC00 #xD7AF)
+    ;;("High Surrogates" #xD800 #xDB7F)
+    ;;("High Private Use Surrogates" #xDB80 #xDBFF)
+    ;;("Low Surrogates" #xDC00 #xDFFF)
+    ;;("Private Use Area" #xE000 #xF8FF)
+    ;;("CJK Compatibility Ideographs" #xF900 #xFAFF)
+    ("Alphabetic Presentation Forms" #xFB00 #xFB4F)
+    ("Arabic Presentation Forms-A" #xFB50 #xFDFF)
+    ("Variation Selectors" #xFE00 #xFE0F)
+    ("Combining Half Marks" #xFE20 #xFE2F)
+    ("CJK Compatibility Forms" #xFE30 #xFE4F)
+    ("Small Form Variants" #xFE50 #xFE6F)
+    ("Arabic Presentation Forms-B" #xFE70 #xFEFF)
+    ("Halfwidth and Fullwidth Forms" #xFF00 #xFFEF)
+    ("Specials" #xFFF0 #xFFFF)
+    ("Old Italic" #x10300 #x1032F)
+    ("Gothic" #x10330 #x1034F)
+    ("Deseret" #x10400 #x1044F)
+    ("Byzantine Musical Symbols" #x1D000 #x1D0FF)
+    ("Musical Symbols" #x1D100 #x1D1FF)
+    ("Mathematical Alphanumeric Symbols" #x1D400 #x1D7FF)
+    ;;("CJK Unified Ideographs Extension B" #x20000 #x2A6DF)
+    ;;("CJK Compatibility Ideographs Supplement" #x2F800 #x2FA1F)
+    ("Tags" #xE0000 #xE007F)
+    ;;("Supplementary Private Use Area-A" #xF0000 #xFFFFF)
+    ;;("Supplementary Private Use Area-B" #x100000 #x10FFFF)
+    )
+  "List of Unicode blocks.
+For each block there is a list (NAME FIRST LAST), where
+NAME is a string giving the offical name of the block,
+FIRST is the first code-point and LAST is the last code-point.
+Blocks containing only characters with algorithmic names or no names
+are omitted.")
+
+(defun nxml-unicode-block-char-name-set (name)
+  "Return a symbol for a block whose offical Unicode name is NAME.
+The symbol is generated by downcasing and replacing each space
+by a hyphen."
+  (intern (replace-regexp-in-string " " "-" (downcase name))))
+
+;; This is intended to be a superset of the coverage
+;; of existing standard entity sets.
+(defvar nxml-enabled-unicode-blocks-default
+  '(basic-latin
+    latin-1-supplement
+    latin-extended-a
+    latin-extended-b
+    ipa-extensions
+    spacing-modifier-letters
+    combining-diacritical-marks
+    greek-and-coptic
+    cyrillic
+    general-punctuation
+    superscripts-and-subscripts
+    currency-symbols
+    combining-diacritical-marks-for-symbols
+    letterlike-symbols
+    number-forms
+    arrows
+    mathematical-operators
+    miscellaneous-technical
+    control-pictures
+    optical-character-recognition
+    enclosed-alphanumerics
+    box-drawing
+    block-elements
+    geometric-shapes
+    miscellaneous-symbols
+    dingbats
+    miscellaneous-mathematical-symbols-a
+    supplemental-arrows-a
+    supplemental-arrows-b
+    miscellaneous-mathematical-symbols-b
+    supplemental-mathematical-operators
+    cjk-symbols-and-punctuation
+    alphabetic-presentation-forms
+    variation-selectors
+    small-form-variants
+    specials
+    mathematical-alphanumeric-symbols)
+  "Default value for `nxml-enabled-unicode-blocks'.")
+
+(mapc (lambda (block)
+        (nxml-autoload-char-name-set
+         (nxml-unicode-block-char-name-set (car block))
+         (expand-file-name
+          (format "nxml/%05X-%05X"
+                  (nth 1 block)
+                  (nth 2 block))
+          data-directory)))
+      nxml-unicode-blocks)
+
+(defvar nxml-enable-unicode-char-name-sets-flag nil)
+
+(defcustom nxml-enabled-unicode-blocks nxml-enabled-unicode-blocks-default
+  "List of Unicode blocks for which Unicode character names are enabled.
+Each block is identified by a symbol derived from the name
+of the block by downcasing and replacing each space by a hyphen."
+  :group 'nxml
+  :set (lambda (sym value)
+        (set-default 'nxml-enabled-unicode-blocks value)
+        (when nxml-enable-unicode-char-name-sets-flag
+          (nxml-enable-unicode-char-name-sets-1)))
+  :type (cons 'set
+             (mapcar (lambda (block)
+                       `(const :tag ,(format "%s (%04X-%04X)"
+                                             (nth 0 block)
+                                             (nth 1 block)
+                                             (nth 2 block))
+                               ,(nxml-unicode-block-char-name-set
+                                 (nth 0 block))))
+                     nxml-unicode-blocks)))
+
+;;;###autoload
+(defun nxml-enable-unicode-char-name-sets ()
+  "Enable the use of Unicode standard names for characters.
+The Unicode blocks for which names are enabled is controlled by
+the variable `nxml-enabled-unicode-blocks'."
+  (interactive)
+  (setq nxml-char-name-ignore-case t)
+  (setq nxml-enable-unicode-char-name-sets-flag t)
+  (nxml-enable-unicode-char-name-sets-1))
+
+(defun nxml-enable-unicode-char-name-sets-1 ()
+  (mapc (lambda (block)
+          (nxml-disable-char-name-set
+           (nxml-unicode-block-char-name-set (car block))))
+        nxml-unicode-blocks)
+  (mapc (lambda (nameset)
+          (nxml-enable-char-name-set nameset))
+        nxml-enabled-unicode-blocks))
+
+(provide 'nxml-uchnm)
+
+;; arch-tag: 440248c3-b604-467c-8b50-e83662c659a3
+;;; nxml-uchnm.el ends here
diff --git a/lisp/nxml/nxml-util.el b/lisp/nxml/nxml-util.el
new file mode 100644 (file)
index 0000000..73b8354
--- /dev/null
@@ -0,0 +1,103 @@
+;;; nxml-util.el --- utility functions for nxml-*.el
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun nxml-make-namespace (str)
+  "Return a symbol for the namespace URI STR.
+STR must be a string. If STR is the empty string, return nil.
+Otherwise, return the symbol whose name is STR prefixed with a colon."
+  (if (string-equal str "")
+      nil
+    (intern (concat ":" str))))
+
+(defun nxml-namespace-name (ns)
+  "Return the namespace URI corresponding to the symbol NS.
+This is the inverse of `nxml-make-namespace'."
+  (and ns (substring (symbol-name ns) 1)))
+
+(defconst nxml-xml-namespace-uri 
+  (nxml-make-namespace "http://www.w3.org/XML/1998/namespace"))
+
+(defconst nxml-xmlns-namespace-uri
+  (nxml-make-namespace "http://www.w3.org/2000/xmlns/"))
+
+(defmacro nxml-with-unmodifying-text-property-changes (&rest body)
+  "Evaluate BODY without any text property changes modifying the buffer.
+Any text properties changes happen as usual but the changes are not treated as
+modifications to the buffer."
+  (let ((modified (make-symbol "modified")))
+    `(let ((,modified (buffer-modified-p))
+          (inhibit-read-only t)
+          (inhibit-modification-hooks t)
+          (buffer-undo-list t)
+          (deactivate-mark nil)
+          ;; Apparently these avoid file locking problems.
+          (buffer-file-name nil)
+          (buffer-file-truename nil))
+       (unwind-protect
+          (progn ,@body)
+        (unless ,modified
+          (restore-buffer-modified-p nil))))))
+
+(put 'nxml-with-unmodifying-text-property-changes 'lisp-indent-function 0)
+(def-edebug-spec nxml-with-unmodifying-text-property-changes t)
+
+(defmacro nxml-with-invisible-motion (&rest body)
+  "Evaluate body without calling any point motion hooks."
+  `(let ((inhibit-point-motion-hooks t))
+     ,@body))
+
+(put 'nxml-with-invisible-motion 'lisp-indent-function 0)
+(def-edebug-spec nxml-with-invisible-motion t)
+
+(defun nxml-display-file-parse-error (err)
+  (let* ((filename (nth 1 err))
+        (buffer (find-file-noselect filename))
+        (pos (nth 2 err))
+        (message (nth 3 err)))
+    (pop-to-buffer buffer)
+    ;; What's the right thing to do if the buffer's modified?
+    ;; The position in the saved file could be completely different.
+    (goto-char (if (buffer-modified-p) 1 pos))
+    (error "%s" message)))
+
+(defun nxml-signal-file-parse-error (file pos message &optional error-symbol)
+  (signal (or error-symbol 'nxml-file-parse-error)
+         (list file pos message)))
+
+(put 'nxml-file-parse-error
+     'error-conditions
+     '(error nxml-file-parse-error))
+
+(put 'nxml-parse-file-error
+     'error-message
+     "Error parsing file")
+
+(provide 'nxml-util)
+
+;; arch-tag: 7d3b3af4-de2b-4410-bf67-94d64824324b
+;;; nxml-util.el ends here
diff --git a/lisp/nxml/rng-cmpct.el b/lisp/nxml/rng-cmpct.el
new file mode 100644 (file)
index 0000000..a83af6a
--- /dev/null
@@ -0,0 +1,941 @@
+;;; rng-cmpct.el --- parsing of RELAX NG Compact Syntax schemas
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This parses a RELAX NG Compact Syntax schema into the form
+;; specified in rng-pttrn.el.
+;;
+;; RELAX NG Compact Syntax is specified by
+;;    http://relaxng.org/compact.html
+;;
+;; This file uses the prefix "rng-c-".
+
+;;; Code:
+
+(require 'nxml-util)
+(require 'rng-util)
+(require 'rng-uri)
+(require 'rng-pttrn)
+
+;;;###autoload
+(defun rng-c-load-schema (filename)
+  "Load a schema in RELAX NG compact syntax from FILENAME.
+Return a pattern."
+  (rng-c-parse-file filename))
+
+;;; Error handling
+
+(put 'rng-c-incorrect-schema
+     'error-conditions
+     '(error rng-error nxml-file-parse-error rng-c-incorrect-schema))
+
+(put 'rng-c-incorrect-schema
+     'error-message
+     "Incorrect schema")
+
+(defun rng-c-signal-incorrect-schema (filename pos message)
+  (nxml-signal-file-parse-error filename
+                               pos
+                               message
+                               'rng-c-incorrect-schema))
+
+;;; Lexing
+
+(defconst rng-c-keywords
+  '("attribute"
+    "default"
+    "datatypes"
+    "div"
+    "element"
+    "empty"
+    "external"
+    "grammar"
+    "include"
+    "inherit"
+    "list"
+    "mixed"
+    "namespace"
+    "notAllowed"
+    "parent"
+    "start"
+    "string"
+    "text"
+    "token")
+  "List of strings that are keywords in the compact syntax.")
+
+(defconst rng-c-anchored-keyword-re
+  (concat "\\`\\(" (regexp-opt rng-c-keywords) "\\)\\'")
+  "Regular expression to match a keyword in the compact syntax.")
+
+(defvar rng-c-syntax-table nil
+  "Syntax table for parsing the compact syntax.")
+
+(if rng-c-syntax-table
+    ()
+  (setq rng-c-syntax-table (make-syntax-table))
+  (modify-syntax-entry ?# "<" rng-c-syntax-table)
+  (modify-syntax-entry ?\n ">" rng-c-syntax-table)
+  (modify-syntax-entry ?- "w" rng-c-syntax-table)
+  (modify-syntax-entry ?. "w" rng-c-syntax-table)
+  (modify-syntax-entry ?_ "w" rng-c-syntax-table)
+  (modify-syntax-entry ?: "_" rng-c-syntax-table))
+
+(defconst rng-c-literal-1-re
+  "'\\(''\\([^']\\|'[^']\\|''[^']\\)*''\\|[^'\n]*\\)'"
+  "Regular expression to match a single-quoted literal.")
+
+(defconst rng-c-literal-2-re
+  (replace-regexp-in-string "'" "\"" rng-c-literal-1-re)
+  "Regular expression to match a double-quoted literal.")
+
+(defconst rng-c-ncname-re "\\w+")
+
+(defconst rng-c-anchored-ncname-re
+  (concat "\\`" rng-c-ncname-re "\\'"))
+
+(defconst rng-c-token-re
+  (concat "[&|]=" "\\|"
+         "[][()|&,*+?{}~=-]" "\\|"
+         rng-c-literal-1-re "\\|"
+         rng-c-literal-2-re "\\|"
+         rng-c-ncname-re "\\(:\\(\\*\\|" rng-c-ncname-re "\\)\\)?" "\\|"
+         "\\\\" rng-c-ncname-re "\\|"
+         ">>")
+  "Regular expression to match a token in the compact syntax.")
+
+(defun rng-c-init-buffer ()
+  (setq case-fold-search nil) ; automatically becomes buffer-local when set
+  (set-buffer-multibyte t)
+  (set-syntax-table rng-c-syntax-table))
+
+(defvar rng-c-current-token nil)
+(make-variable-buffer-local 'rng-c-current-token)
+
+(defun rng-c-advance ()
+  (cond ((looking-at rng-c-token-re)
+        (setq rng-c-current-token (match-string 0))
+        (goto-char (match-end 0))
+        (forward-comment (point-max)))
+       ((= (point) (point-max))
+        (setq rng-c-current-token ""))
+       (t (rng-c-error "Invalid token"))))
+
+(defconst rng-c-anchored-datatype-name-re
+  (concat "\\`" rng-c-ncname-re ":"  rng-c-ncname-re "\\'"))
+
+(defsubst rng-c-current-token-keyword-p ()
+  (string-match rng-c-anchored-keyword-re rng-c-current-token))
+
+(defsubst rng-c-current-token-prefixed-name-p ()
+  (string-match rng-c-anchored-datatype-name-re rng-c-current-token))
+
+(defsubst rng-c-current-token-literal-p ()
+  (string-match "\\`['\"]" rng-c-current-token))
+
+(defsubst rng-c-current-token-quoted-identifier-p ()
+  (string-match "\\`\\\\" rng-c-current-token))
+
+(defsubst rng-c-current-token-ncname-p ()
+  (string-match rng-c-anchored-ncname-re rng-c-current-token))
+
+(defsubst rng-c-current-token-ns-name-p ()
+  (let ((len (length rng-c-current-token)))
+    (and (> len 0)
+        (= (aref rng-c-current-token (- len 1)) ?*))))
+
+;;; Namespaces
+
+(defvar rng-c-inherit-namespace nil)
+
+(defvar rng-c-default-namespace nil)
+
+(defvar rng-c-default-namespace-declared nil)
+
+(defvar rng-c-namespace-decls nil
+  "Alist of namespace declarations.")
+
+(defconst rng-c-no-namespace nil)
+
+(defun rng-c-declare-standard-namespaces ()
+  (setq rng-c-namespace-decls
+       (cons (cons "xml" nxml-xml-namespace-uri)
+             rng-c-namespace-decls))
+  (when (and (not rng-c-default-namespace-declared)
+            rng-c-inherit-namespace)
+    (setq rng-c-default-namespace rng-c-inherit-namespace)))
+
+(defun rng-c-expand-name (prefixed-name)
+  (let ((i (string-match ":" prefixed-name)))
+    (rng-make-name (rng-c-lookup-prefix (substring prefixed-name
+                                                  0
+                                                  i))
+                  (substring prefixed-name (+ i 1)))))
+
+(defun rng-c-lookup-prefix (prefix)
+  (let ((binding (assoc prefix rng-c-namespace-decls)))
+    (or binding (rng-c-error "Undefined prefix %s" prefix))
+    (cdr binding)))
+
+(defun rng-c-unqualified-namespace (attribute)
+  (if attribute
+      rng-c-no-namespace
+    rng-c-default-namespace))
+
+(defun rng-c-make-context ()
+  (cons rng-c-default-namespace rng-c-namespace-decls))
+
+;;; Datatypes
+
+(defconst rng-string-datatype
+  (rng-make-datatype rng-builtin-datatypes-uri "string"))
+
+(defconst rng-token-datatype
+  (rng-make-datatype rng-builtin-datatypes-uri "token"))
+
+(defvar rng-c-datatype-decls nil
+  "Alist of datatype declarations.
+Contains a list of pairs (PREFIX . URI) where PREFIX is a string
+and URI is a symbol.")
+
+(defun rng-c-declare-standard-datatypes ()
+  (setq rng-c-datatype-decls
+       (cons (cons "xsd" rng-xsd-datatypes-uri)
+             rng-c-datatype-decls)))
+
+(defun rng-c-lookup-datatype-prefix (prefix)
+  (let ((binding (assoc prefix rng-c-datatype-decls)))
+    (or binding (rng-c-error "Undefined prefix %s" prefix))
+    (cdr binding)))
+
+(defun rng-c-expand-datatype (prefixed-name)
+  (let ((i (string-match ":" prefixed-name)))
+    (rng-make-datatype
+     (rng-c-lookup-datatype-prefix (substring prefixed-name 0 i))
+     (substring prefixed-name (+ i 1)))))
+
+;;; Grammars
+
+(defvar rng-c-current-grammar nil)
+(defvar rng-c-parent-grammar nil)
+
+(defun rng-c-make-grammar ()
+  (make-hash-table :test 'equal))
+
+(defconst rng-c-about-override-slot 0)
+(defconst rng-c-about-combine-slot 1)
+
+(defun rng-c-lookup-create (name grammar)
+  "Return a def object for NAME.  A def object is a pair
+\(ABOUT . REF) where REF is returned by `rng-make-ref'.  ABOUT is a
+two-element vector [OVERRIDE COMBINE].  COMBINE is either nil, choice
+or interleave.  OVERRIDE is either nil, require or t."
+  (let ((def (gethash name grammar)))
+    (if def
+       def
+      (progn 
+       (setq def (cons (vector nil nil) (rng-make-ref name)))
+       (puthash name def grammar)
+       def))))
+
+(defun rng-c-make-ref (name)
+  (or rng-c-current-grammar
+      (rng-c-error "Reference not in a grammar"))
+  (cdr (rng-c-lookup-create name rng-c-current-grammar)))
+
+(defun rng-c-make-parent-ref (name)
+  (or rng-c-parent-grammar
+      (rng-c-error "Reference to non-existent parent grammar"))
+  (cdr (rng-c-lookup-create name rng-c-parent-grammar)))
+
+(defvar rng-c-overrides nil
+  "Contains a list of (NAME . DEF) pairs.")
+
+(defun rng-c-merge-combine (def combine name)
+  (let* ((about (car def))
+        (current-combine (aref about rng-c-about-combine-slot)))
+    (if combine
+       (if current-combine
+           (or (eq combine current-combine)
+               (rng-c-error "Inconsistent combine for %s" name))
+         (aset about rng-c-about-combine-slot combine))
+      current-combine)))
+
+(defun rng-c-prepare-define (name combine in-include)
+  (let* ((def (rng-c-lookup-create name rng-c-current-grammar))
+        (about (car def))
+        (overridden (aref about rng-c-about-override-slot)))
+    (and in-include
+        (setq rng-c-overrides (cons (cons name def) rng-c-overrides)))
+    (cond (overridden (and (eq overridden 'require)
+                          (aset about rng-c-about-override-slot t))
+                     nil)
+         (t (setq combine (rng-c-merge-combine def combine name))
+            (and (rng-ref-get (cdr def))
+                 (not combine)
+                 (rng-c-error "Duplicate definition of %s" name))
+            def))))
+
+(defun rng-c-start-include (overrides)
+  (mapcar (lambda (name-def)
+           (let* ((def (cdr name-def))
+                  (about (car def))
+                  (save (aref about rng-c-about-override-slot)))
+             (aset about rng-c-about-override-slot 'require)
+             (cons save name-def)))
+         overrides))
+
+(defun rng-c-end-include (overrides)
+  (mapcar (lambda (o)
+           (let* ((saved (car o))
+                  (name-def (cdr o))
+                  (name (car name-def))
+                  (def (cdr name-def))
+                  (about (car def)))
+             (and (eq (aref about rng-c-about-override-slot) 'require)
+                  (rng-c-error "Definition of %s in include did not override definition in included file" name))
+             (aset about rng-c-about-override-slot saved)))
+         overrides))
+
+(defun rng-c-define (def value)
+  (and def
+       (let ((current-value (rng-ref-get (cdr def))))
+        (rng-ref-set (cdr def)
+                     (if current-value
+                         (if (eq (aref (car def) rng-c-about-combine-slot)
+                                 'choice)
+                             (rng-make-choice (list current-value value))
+                           (rng-make-interleave (list current-value value)))
+                       value)))))
+
+(defun rng-c-finish-grammar ()
+  (maphash (lambda (key def)
+            (or (rng-ref-get (cdr def))
+                (rng-c-error "Reference to undefined pattern %s" key)))
+          rng-c-current-grammar)
+  (rng-ref-get (cdr (or (gethash 'start rng-c-current-grammar)
+                       (rng-c-error "No definition of start")))))
+
+;;; Parsing
+
+(defvar rng-c-escape-positions nil)
+(make-variable-buffer-local 'rng-c-escape-positions)
+
+(defvar rng-c-file-name nil)
+(make-variable-buffer-local 'rng-c-file-name)
+
+(defvar rng-c-file-index nil)
+
+(defun rng-c-parse-file (filename &optional context)
+  (save-excursion
+    (set-buffer (get-buffer-create (rng-c-buffer-name context)))
+    (erase-buffer)
+    (rng-c-init-buffer)
+    (setq rng-c-file-name
+         (car (insert-file-contents filename)))
+    (setq rng-c-escape-positions nil)
+    (rng-c-process-escapes)
+    (rng-c-parse-top-level context)))
+
+(defun rng-c-buffer-name (context)
+  (concat " *RNC Input"
+         (if context
+             (concat "<"
+                     (number-to-string (setq rng-c-file-index
+                                             (1+ rng-c-file-index)))
+                     ">*")
+           (setq rng-c-file-index 1)
+           "*")))
+
+(defun rng-c-process-escapes ()
+  ;; Check for any nuls, since we will use nul chars
+  ;; for internal purposes.
+  (let ((pos (search-forward "\C-@" nil t)))
+    (and pos
+        (rng-c-error "Nul character found (binary file?)")))
+  (let ((offset 0))
+    (while (re-search-forward "\\\\x+{\\([0-9a-fA-F]+\\)}"
+                             (point-max)
+                             t)
+      (let* ((ch (decode-char 'ucs (string-to-number (match-string 1) 16))))
+       (if (and ch (> ch 0))
+           (let ((begin (match-beginning 0))
+                 (end (match-end 0)))
+             (delete-region begin end)
+             ;; Represent an escaped newline by nul, so
+             ;; that we can distinguish it from a literal newline.
+             ;; We will translate it back into a real newline later.
+             (insert (if (eq ch ?\n) 0 ch))
+             (setq offset (+ offset (- end begin 1)))
+             (setq rng-c-escape-positions
+                   (cons (cons (point) offset)
+                         rng-c-escape-positions)))
+         (rng-c-error "Invalid character escape")))))
+  (goto-char 1))
+
+(defun rng-c-translate-position (pos)
+  (let ((tem rng-c-escape-positions))
+    (while (and tem
+               (> (caar tem) pos))
+      (setq tem (cdr tem)))
+    (if tem
+       (+ pos (cdar tem))
+      pos)))
+
+(defun rng-c-error (&rest args)
+  (rng-c-signal-incorrect-schema rng-c-file-name
+                                (rng-c-translate-position (point))
+                                (apply 'format args)))
+
+(defun rng-c-parse-top-level (context)
+  (let ((rng-c-namespace-decls nil)
+       (rng-c-default-namespace nil)
+       (rng-c-datatype-decls nil))
+    (goto-char (point-min))
+    (forward-comment (point-max))
+    (rng-c-advance)
+    (rng-c-parse-decls)
+    (let ((p (if (eq context 'include)
+                (if (rng-c-implicit-grammar-p)
+                    (rng-c-parse-grammar-body "")
+                  (rng-c-parse-included-grammar))
+              (if (rng-c-implicit-grammar-p)
+                  (rng-c-parse-implicit-grammar)
+                (rng-c-parse-pattern)))))
+      (or (string-equal rng-c-current-token "")
+         (rng-c-error "Unexpected characters after pattern"))
+      p)))
+
+(defun rng-c-parse-included-grammar ()
+  (or (string-equal rng-c-current-token "grammar")
+      (rng-c-error "Included schema is not a grammar"))
+  (rng-c-advance)
+  (rng-c-expect "{")
+  (rng-c-parse-grammar-body "}"))
+
+(defun rng-c-implicit-grammar-p ()
+  (or (and (or (rng-c-current-token-prefixed-name-p)
+              (rng-c-current-token-quoted-identifier-p)
+              (and (rng-c-current-token-ncname-p)
+                   (not (rng-c-current-token-keyword-p))))
+          (looking-at "\\["))
+      (and (string-equal rng-c-current-token "[")
+          (rng-c-parse-lead-annotation)
+          nil)
+      (member rng-c-current-token '("div" "include" ""))
+      (looking-at "[|&]?=")))
+
+(defun rng-c-parse-decls ()
+  (setq rng-c-default-namespace-declared nil)
+  (while (progn
+          (let ((binding
+                 (assoc rng-c-current-token
+                        '(("namespace" . rng-c-parse-namespace)
+                          ("datatypes" . rng-c-parse-datatypes)
+                          ("default" . rng-c-parse-default)))))
+            (if binding
+                (progn
+                  (rng-c-advance)
+                  (funcall (cdr binding))
+                  t)
+              nil))))
+  (rng-c-declare-standard-datatypes)
+  (rng-c-declare-standard-namespaces))
+
+(defun rng-c-parse-datatypes ()
+  (let ((prefix (rng-c-parse-identifier-or-keyword)))
+    (or (not (assoc prefix rng-c-datatype-decls))
+       (rng-c-error "Duplicate datatypes declaration for prefix %s" prefix))
+    (rng-c-expect "=")
+    (setq rng-c-datatype-decls
+         (cons (cons prefix
+                     (rng-make-datatypes-uri (rng-c-parse-literal)))
+               rng-c-datatype-decls))))
+    
+(defun rng-c-parse-namespace ()
+  (rng-c-declare-namespace nil
+                          (rng-c-parse-identifier-or-keyword)))
+
+(defun rng-c-parse-default ()
+  (rng-c-expect "namespace")
+  (rng-c-declare-namespace t 
+                          (if (string-equal rng-c-current-token "=")
+                              nil
+                            (rng-c-parse-identifier-or-keyword))))
+
+(defun rng-c-declare-namespace (declare-default prefix)
+  (rng-c-expect "=")
+  (let ((ns (cond ((string-equal rng-c-current-token "inherit")
+                  (rng-c-advance)
+                  rng-c-inherit-namespace)
+                 (t
+                  (nxml-make-namespace (rng-c-parse-literal))))))
+    (and prefix
+        (or (not (assoc prefix rng-c-namespace-decls))
+            (rng-c-error "Duplicate namespace declaration for prefix %s"
+                         prefix))
+        (setq rng-c-namespace-decls
+              (cons (cons prefix ns) rng-c-namespace-decls)))
+    (and declare-default
+        (or (not rng-c-default-namespace-declared)
+            (rng-c-error "Duplicate default namespace declaration"))
+        (setq rng-c-default-namespace-declared t)
+        (setq rng-c-default-namespace ns))))
+
+(defun rng-c-parse-implicit-grammar ()
+  (let* ((rng-c-parent-grammar rng-c-current-grammar)
+        (rng-c-current-grammar (rng-c-make-grammar)))
+    (rng-c-parse-grammar-body "")
+    (rng-c-finish-grammar)))
+
+(defun rng-c-parse-grammar-body (close-token &optional in-include)
+  (while (not (string-equal rng-c-current-token close-token))
+    (cond ((rng-c-current-token-keyword-p)
+          (let ((kw (intern rng-c-current-token)))
+            (cond ((eq kw 'start)
+                   (rng-c-parse-define 'start in-include))
+                  ((eq kw 'div)
+                   (rng-c-advance)
+                   (rng-c-parse-div in-include))
+                  ((eq kw 'include)
+                   (and in-include
+                        (rng-c-error "Nested include"))
+                   (rng-c-advance)
+                   (rng-c-parse-include))
+                  (t (rng-c-error "Invalid grammar keyword")))))
+         ((rng-c-current-token-ncname-p)
+          (if (looking-at "\\[")
+              (rng-c-parse-annotation-element)
+            (rng-c-parse-define rng-c-current-token
+                                in-include)))
+         ((rng-c-current-token-quoted-identifier-p)
+          (if (looking-at "\\[")
+              (rng-c-parse-annotation-element)
+            (rng-c-parse-define (substring rng-c-current-token 1)
+                                in-include)))
+         ((rng-c-current-token-prefixed-name-p)
+          (rng-c-parse-annotation-element))
+         ((string-equal rng-c-current-token "[")
+          (rng-c-parse-lead-annotation)
+          (and (string-equal rng-c-current-token close-token)
+               (rng-c-error "Missing annotation subject"))
+          (and (looking-at "\\[")
+               (rng-c-error "Leading annotation applied to annotation")))
+         (t (rng-c-error "Invalid grammar content"))))
+  (or (string-equal rng-c-current-token "")
+      (rng-c-advance)))
+
+(defun rng-c-parse-div (in-include)
+  (rng-c-expect "{")
+  (rng-c-parse-grammar-body "}" in-include))
+
+(defun rng-c-parse-include ()
+  (let* ((filename (rng-c-expand-file (rng-c-parse-literal)))
+        (rng-c-inherit-namespace (rng-c-parse-opt-inherit))
+        overrides)
+    (cond ((string-equal rng-c-current-token "{")
+          (rng-c-advance)
+          (let ((rng-c-overrides nil))
+            (rng-c-parse-grammar-body "}" t)
+            (setq overrides rng-c-overrides))
+          (setq overrides (rng-c-start-include overrides))
+          (rng-c-parse-file filename 'include)
+          (rng-c-end-include overrides))
+         (t (rng-c-parse-file filename 'include)))))
+
+(defun rng-c-parse-define (name in-include)
+  (rng-c-advance)
+  (let ((assign (assoc rng-c-current-token
+                      '(("=" . nil)
+                        ("|=" . choice)
+                        ("&=" . interleave)))))
+    (or assign
+       (rng-c-error "Expected assignment operator"))
+    (rng-c-advance)
+    (let ((ref (rng-c-prepare-define name (cdr assign) in-include)))
+      (rng-c-define ref (rng-c-parse-pattern)))))
+
+(defvar rng-c-had-except nil)
+
+(defun rng-c-parse-pattern ()
+  (let* ((rng-c-had-except nil)
+        (p (rng-c-parse-repeated))
+        (op (assoc rng-c-current-token
+                   '(("|" . rng-make-choice)
+                     ("," . rng-make-group)
+                     ("&" . rng-make-interleave)))))
+    (if op
+       (if rng-c-had-except
+           (rng-c-error "Parentheses required around pattern using -")
+         (let* ((patterns (cons p nil))
+                (tail patterns)
+                (connector rng-c-current-token))
+           (while (progn
+                    (rng-c-advance)
+                    (let ((newcdr (cons (rng-c-parse-repeated) nil)))
+                      (setcdr tail newcdr)
+                      (setq tail newcdr))
+                    (string-equal rng-c-current-token connector)))
+           (funcall (cdr op) patterns)))
+      p)))
+
+(defun rng-c-parse-repeated ()
+  (let ((p (rng-c-parse-follow-annotations
+           (rng-c-parse-primary)))
+       (op (assoc rng-c-current-token
+                  '(("*" . rng-make-zero-or-more)
+                    ("+" . rng-make-one-or-more)
+                    ("?" . rng-make-optional)))))
+    (if op
+       (if rng-c-had-except
+           (rng-c-error "Parentheses required around pattern using -")
+         (rng-c-parse-follow-annotations
+          (progn
+            (rng-c-advance)
+            (funcall (cdr op) p))))
+      p)))
+
+(defun rng-c-parse-primary ()
+  "Parse a primary expression.  The current token must be the first
+token of the expression.  After parsing the current token should be
+token following the primary expression."
+  (cond ((rng-c-current-token-keyword-p)
+        (let ((parse-function (get (intern rng-c-current-token)
+                                   'rng-c-pattern)))
+          (or parse-function
+              (rng-c-error "Keyword %s does not introduce a pattern"
+                           rng-c-current-token))
+          (rng-c-advance)
+          (funcall parse-function)))
+       ((rng-c-current-token-ncname-p)
+        (rng-c-advance-with (rng-c-make-ref rng-c-current-token)))
+       ((string-equal rng-c-current-token "(")
+        (rng-c-advance)
+        (let ((p (rng-c-parse-pattern)))
+          (rng-c-expect ")")
+          p))
+       ((rng-c-current-token-prefixed-name-p)
+        (let ((name (rng-c-expand-datatype rng-c-current-token)))
+          (rng-c-advance)
+          (rng-c-parse-data name)))
+       ((rng-c-current-token-literal-p)
+        (rng-make-value rng-token-datatype (rng-c-parse-literal) nil))
+       ((rng-c-current-token-quoted-identifier-p)
+        (rng-c-advance-with
+         (rng-c-make-ref (substring rng-c-current-token 1))))
+       ((string-equal rng-c-current-token "[")
+        (rng-c-parse-lead-annotation)
+        (rng-c-parse-primary))
+       (t (rng-c-error "Invalid pattern"))))
+
+(defun rng-c-parse-parent ()
+  (and (rng-c-current-token-keyword-p)
+       (rng-c-error "Keyword following parent was not quoted"
+                   rng-c-current-token))
+  (rng-c-make-parent-ref (rng-c-parse-identifier-or-keyword)))
+
+(defun rng-c-parse-literal ()
+  (rng-c-fix-escaped-newlines
+   (apply 'concat (rng-c-parse-literal-segments))))
+
+(defun rng-c-parse-literal-segments ()
+  (let ((str (rng-c-parse-literal-segment)))
+    (cons str
+         (cond ((string-equal rng-c-current-token "~")
+                (rng-c-advance)
+                (rng-c-parse-literal-segments))
+               (t nil)))))
+
+(defun rng-c-parse-literal-segment ()
+  (or (rng-c-current-token-literal-p)
+      (rng-c-error "Expected a literal"))
+  (rng-c-advance-with
+   (let ((n (if (and (>= (length rng-c-current-token) 6)
+                    (eq (aref rng-c-current-token 0)
+                        (aref rng-c-current-token 1)))
+               3
+             1)))
+     (substring rng-c-current-token n (- n)))))
+
+(defun rng-c-fix-escaped-newlines (str)
+  (let ((pos 0))
+    (while (progn
+            (let ((n (string-match "\C-@" str pos)))
+              (and n
+                   (aset str n ?\n)
+                   (setq pos (1+ n)))))))
+  str)
+
+(defun rng-c-parse-identifier-or-keyword ()
+  (cond ((rng-c-current-token-ncname-p)
+        (rng-c-advance-with rng-c-current-token))
+       ((rng-c-current-token-quoted-identifier-p)
+        (rng-c-advance-with (substring rng-c-current-token 1)))
+       (t (rng-c-error "Expected identifier or keyword"))))
+   
+(put 'string 'rng-c-pattern 'rng-c-parse-string)
+(put 'token 'rng-c-pattern 'rng-c-parse-token)
+(put 'element 'rng-c-pattern 'rng-c-parse-element)
+(put 'attribute 'rng-c-pattern 'rng-c-parse-attribute)
+(put 'list 'rng-c-pattern 'rng-c-parse-list)
+(put 'mixed 'rng-c-pattern 'rng-c-parse-mixed)
+(put 'text 'rng-c-pattern 'rng-c-parse-text)
+(put 'empty 'rng-c-pattern 'rng-c-parse-empty)
+(put 'notAllowed 'rng-c-pattern 'rng-c-parse-not-allowed)
+(put 'grammar 'rng-c-pattern 'rng-c-parse-grammar)
+(put 'parent 'rng-c-pattern 'rng-c-parse-parent)
+(put 'external 'rng-c-pattern 'rng-c-parse-external)
+
+(defun rng-c-parse-element ()
+  (let ((name-class (rng-c-parse-name-class nil)))
+    (rng-c-expect "{")
+    (let ((pattern (rng-c-parse-pattern)))
+      (rng-c-expect "}")
+      (rng-make-element name-class pattern))))
+
+(defun rng-c-parse-attribute ()
+  (let ((name-class (rng-c-parse-name-class 'attribute)))
+    (rng-c-expect "{")
+    (let ((pattern (rng-c-parse-pattern)))
+      (rng-c-expect "}")
+      (rng-make-attribute name-class pattern))))
+
+(defun rng-c-parse-name-class (attribute)
+  (let* ((rng-c-had-except nil)
+        (name-class
+         (rng-c-parse-follow-annotations
+          (rng-c-parse-primary-name-class attribute))))
+    (if (string-equal rng-c-current-token "|")
+       (let* ((name-classes (cons name-class nil))
+              (tail name-classes))
+         (or (not rng-c-had-except)
+             (rng-c-error "Parentheses required around name-class using - operator"))
+         (while (progn
+                  (rng-c-advance)
+                  (let ((newcdr
+                         (cons (rng-c-parse-follow-annotations
+                                (rng-c-parse-primary-name-class attribute))
+                               nil)))
+                    (setcdr tail newcdr)
+                    (setq tail newcdr))
+                  (string-equal rng-c-current-token "|")))
+         (rng-make-choice-name-class name-classes))
+      name-class)))
+         
+(defun rng-c-parse-primary-name-class (attribute)
+  (cond ((rng-c-current-token-ncname-p)
+        (rng-c-advance-with
+         (rng-make-name-name-class
+          (rng-make-name (rng-c-unqualified-namespace attribute)
+                         rng-c-current-token))))
+       ((rng-c-current-token-prefixed-name-p)
+        (rng-c-advance-with
+         (rng-make-name-name-class
+          (rng-c-expand-name rng-c-current-token))))
+       ((string-equal rng-c-current-token "*")
+        (let ((except (rng-c-parse-opt-except-name-class attribute)))
+          (if except
+              (rng-make-any-name-except-name-class except)
+            (rng-make-any-name-name-class))))
+       ((rng-c-current-token-ns-name-p)
+        (let* ((ns
+                (rng-c-lookup-prefix (substring rng-c-current-token
+                                                0
+                                                -2)))
+               (except (rng-c-parse-opt-except-name-class attribute)))
+          (if except
+              (rng-make-ns-name-except-name-class ns except)
+            (rng-make-ns-name-name-class ns))))
+       ((string-equal rng-c-current-token "(")
+        (rng-c-advance)
+        (let ((name-class (rng-c-parse-name-class attribute)))
+          (rng-c-expect ")")
+          name-class))
+       ((rng-c-current-token-quoted-identifier-p)
+        (rng-c-advance-with
+         (rng-make-name-name-class
+          (rng-make-name (rng-c-unqualified-namespace attribute)
+                         (substring rng-c-current-token 1)))))
+       ((string-equal rng-c-current-token "[")
+        (rng-c-parse-lead-annotation)
+        (rng-c-parse-primary-name-class attribute))
+       (t (rng-c-error "Bad name class"))))
+
+(defun rng-c-parse-opt-except-name-class (attribute)
+  (rng-c-advance)
+  (and (string-equal rng-c-current-token "-")
+       (or (not rng-c-had-except)
+          (rng-c-error "Parentheses required around name-class using - operator"))
+       (setq rng-c-had-except t)
+       (progn
+        (rng-c-advance)
+        (rng-c-parse-primary-name-class attribute))))
+
+(defun rng-c-parse-mixed ()
+  (rng-c-expect "{")
+  (let ((pattern (rng-make-mixed (rng-c-parse-pattern))))
+    (rng-c-expect "}")
+    pattern))
+
+(defun rng-c-parse-list ()
+  (rng-c-expect "{")
+  (let ((pattern (rng-make-list (rng-c-parse-pattern))))
+    (rng-c-expect "}")
+    pattern))
+
+(defun rng-c-parse-text ()
+  (rng-make-text))
+
+(defun rng-c-parse-empty ()
+  (rng-make-empty))
+
+(defun rng-c-parse-not-allowed ()
+  (rng-make-not-allowed))
+
+(defun rng-c-parse-string ()
+  (rng-c-parse-data rng-string-datatype))
+
+(defun rng-c-parse-token ()
+  (rng-c-parse-data rng-token-datatype))
+
+(defun rng-c-parse-data (name)
+  (if (rng-c-current-token-literal-p)
+      (rng-make-value name
+                     (rng-c-parse-literal)
+                     (and (car name)
+                          (rng-c-make-context)))
+    (let ((params (rng-c-parse-optional-params)))
+      (if (string-equal rng-c-current-token "-")
+         (progn
+           (if rng-c-had-except
+               (rng-c-error "Parentheses required around pattern using -")
+             (setq rng-c-had-except t))
+           (rng-c-advance)
+           (rng-make-data-except name
+                                 params
+                                 (rng-c-parse-primary)))
+       (rng-make-data name params)))))
+
+(defun rng-c-parse-optional-params ()
+  (and (string-equal rng-c-current-token "{")
+       (let* ((head (cons nil nil))
+             (tail head))
+        (rng-c-advance)
+        (while (not (string-equal rng-c-current-token "}"))
+          (and (string-equal rng-c-current-token "[")
+               (rng-c-parse-lead-annotation))
+          (let ((name (rng-c-parse-identifier-or-keyword)))
+            (rng-c-expect "=")
+            (let ((newcdr (cons (cons (intern name)
+                                      (rng-c-parse-literal))
+                                nil)))
+              (setcdr tail newcdr)
+              (setq tail newcdr))))
+        (rng-c-advance)
+        (cdr head))))
+
+(defun rng-c-parse-external ()
+  (let* ((filename (rng-c-expand-file (rng-c-parse-literal)))
+        (rng-c-inherit-namespace (rng-c-parse-opt-inherit)))
+    (rng-c-parse-file filename 'external)))
+
+(defun rng-c-expand-file (uri)
+  (condition-case err
+      (rng-uri-file-name (rng-uri-resolve uri
+                                         (rng-file-name-uri rng-c-file-name)))
+    (rng-uri-error
+     (rng-c-error (cadr err)))))
+
+(defun rng-c-parse-opt-inherit ()
+  (cond ((string-equal rng-c-current-token "inherit")
+        (rng-c-advance)
+        (rng-c-expect "=")
+        (rng-c-lookup-prefix (rng-c-parse-identifier-or-keyword)))
+       (t rng-c-default-namespace)))
+
+(defun rng-c-parse-grammar ()
+  (rng-c-expect "{")
+  (let* ((rng-c-parent-grammar rng-c-current-grammar)
+        (rng-c-current-grammar (rng-c-make-grammar)))
+    (rng-c-parse-grammar-body "}")
+    (rng-c-finish-grammar)))
+
+(defun rng-c-parse-lead-annotation ()
+  (rng-c-parse-annotation-body)
+  (and (string-equal rng-c-current-token "[")
+       (rng-c-error "Multiple leading annotations")))
+
+(defun rng-c-parse-follow-annotations (obj)
+  (while (string-equal rng-c-current-token ">>")
+    (rng-c-advance)
+    (if (rng-c-current-token-prefixed-name-p)
+       (rng-c-advance)
+      (rng-c-parse-identifier-or-keyword))
+    (rng-c-parse-annotation-body t))
+  obj)
+
+(defun rng-c-parse-annotation-element ()
+  (rng-c-advance)
+  (rng-c-parse-annotation-body t))
+
+;; XXX need stricter checking of attribute names
+;; XXX don't allow attributes after text
+
+(defun rng-c-parse-annotation-body (&optional allow-text)
+  "Current token is [.  Parse up to matching ]. Current token after
+parse is token following ]."
+  (or (string-equal rng-c-current-token "[")
+      (rng-c-error "Expected ["))
+  (rng-c-advance)
+  (while (not (string-equal rng-c-current-token "]"))
+    (cond ((rng-c-current-token-literal-p)
+          (or allow-text
+              (rng-c-error "Out of place text within annotation"))
+          (rng-c-parse-literal))
+         (t
+          (if (rng-c-current-token-prefixed-name-p)
+              (rng-c-advance)
+            (rng-c-parse-identifier-or-keyword))
+          (cond ((string-equal rng-c-current-token "[")
+                 (rng-c-parse-annotation-body t))
+                ((string-equal rng-c-current-token "=")
+                 (rng-c-advance)
+                 (rng-c-parse-literal))
+                (t (rng-c-error "Expected = or ["))))))
+  (rng-c-advance))
+            
+(defun rng-c-advance-with (pattern)
+  (rng-c-advance)
+  pattern)
+
+(defun rng-c-expect (str)
+  (or (string-equal rng-c-current-token str)
+      (rng-c-error "Expected `%s' but got `%s'" str rng-c-current-token))
+  (rng-c-advance))
+
+(provide 'rng-cmpct)
+
+;;; rng-cmpct.el
+
+;; arch-tag: 90395eb1-283b-4146-bbc1-6d6ef1704e57
diff --git a/lisp/nxml/rng-dt.el b/lisp/nxml/rng-dt.el
new file mode 100644 (file)
index 0000000..2ed8e19
--- /dev/null
@@ -0,0 +1,67 @@
+;;; rng-dt.el --- datatype library interface for RELAX NG
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'rng-util)
+
+(defvar rng-dt-error-reporter nil)
+
+(defun rng-dt-error (string &rest objs)
+  (if rng-dt-error-reporter
+      (apply rng-dt-error-reporter (cons string objs))
+    nil))
+
+(defvar rng-dt-namespace-context-getter nil
+  "A list used by datatype libraries to expand names.  The car of the
+list is a symbol which is the name of a function.  This function is
+applied to the cdr of the list.  The function must return a list whose
+car is the default namespace and whose cdr is an alist of (PREFIX
+. NAMESPACE) pairs, where PREFIX is a string and NAMESPACE is a
+symbol.  This must be dynamically bound before calling a datatype
+library.")
+
+(defsubst rng-dt-make-value (dt str)
+  (apply (car dt) (cons str (cdr dt))))
+
+(defun rng-dt-builtin-compile (name params)
+  (cond ((eq name 'string)
+        (if (null params)
+            '(t identity)
+          (rng-dt-error "The string datatype does not take any parameters")))
+       ((eq name 'token)
+        (if (null params)
+            '(t rng-collapse-space)
+          (rng-dt-error "The token datatype does not take any parameters")))
+       (t
+        (rng-dt-error "There is no built-in datatype %s" name))))
+
+(put (rng-make-datatypes-uri "") 'rng-dt-compile 'rng-dt-builtin-compile)
+
+(provide 'rng-dt)
+
+;; arch-tag: 1dca90f1-8dae-4dd4-b61f-fade4452c014
+;;; rng-dt.el ends here
diff --git a/lisp/nxml/rng-loc.el b/lisp/nxml/rng-loc.el
new file mode 100644 (file)
index 0000000..fd56c4b
--- /dev/null
@@ -0,0 +1,551 @@
+;;; rng-loc.el --- locate the schema to use for validation
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'nxml-util)
+(require 'nxml-parse)
+(require 'rng-parse)
+(require 'rng-uri)
+(require 'rng-util)
+(require 'xmltok)
+
+(defvar rng-current-schema-file-name nil
+  "Filename of schema being used for current buffer.
+Nil if using a vacuous schema.")
+(make-variable-buffer-local 'rng-current-schema-file-name)
+
+(defvar rng-schema-locating-files-default nil
+  "Default value for variable `rng-schema-locating-files'.")
+
+(defvar rng-schema-locating-file-schema-file nil
+  "File containing schema for schema locating files.")
+
+(defvar rng-schema-locating-file-schema nil
+  "Schema for schema locating files or nil if not yet loaded.")
+
+(defcustom rng-schema-locating-files rng-schema-locating-files-default
+  "*List of schema locating files."
+  :type '(repeat file)
+  :group 'relax-ng)
+
+(defvar rng-schema-loader-alist nil
+  "Alist of schema extensions vs schema loader functions.")
+
+(defvar rng-cached-document-element nil)
+
+(defvar rng-document-type-history nil)
+
+(defun rng-set-document-type (type-id)
+  (interactive (list (rng-read-type-id)))
+  (condition-case err
+      (when (not (string= type-id ""))
+       (let ((schema-file (rng-locate-schema-file type-id)))
+         (unless schema-file
+           (error "Could not locate schema for type id `%s'" type-id))
+         (rng-set-schema-file-1 schema-file))
+       (rng-save-schema-location-1 t type-id)
+       (rng-what-schema))
+    (nxml-file-parse-error
+     (nxml-display-file-parse-error err))))
+
+(defun rng-read-type-id ()
+  (condition-case err
+      (let ((type-ids (rng-possible-type-ids))
+           (completion-ignore-case nil))
+       (completing-read "Document type id: "
+                        (mapcar (lambda (x) (cons x nil))
+                                type-ids)
+                        nil
+                        t
+                        nil
+                        'rng-document-type-history))
+    (nxml-file-parse-error
+     (nxml-display-file-parse-error err))))
+
+(defun rng-set-schema-file (filename)
+  "Set the schema for the current buffer to the schema in FILENAME.
+FILENAME must be the name of a file containing a schema.
+The extension of FILENAME is used to determine what kind of schema it
+is.  The variable `rng-schema-loader-alist' maps from schema
+extensions to schema loader functions. The function
+`rng-c-load-schema' is the loader for RELAX NG compact syntax.  The
+association is between the buffer and the schema: the association is
+lost when the buffer is killed."
+  (interactive "fSchema file: ")
+  (condition-case err
+      (progn
+       (rng-set-schema-file-1 filename)
+       (rng-save-schema-location-1 t))
+    (nxml-file-parse-error
+     (nxml-display-file-parse-error err))))
+
+(defun rng-set-vacuous-schema ()
+  "Set the schema for the current buffer to allow any well-formed XML."
+  (interactive)
+  (rng-set-schema-file-1 nil)
+  (rng-what-schema))
+
+(defun rng-set-schema-file-1 (filename)
+  (setq filename (and filename (expand-file-name filename)))
+  (setq rng-current-schema
+       (if filename
+           (rng-load-schema filename)
+         rng-any-element))
+  (setq rng-current-schema-file-name filename)
+  (run-hooks 'rng-schema-change-hook))
+  
+(defun rng-load-schema (filename)
+  (let* ((extension (file-name-extension filename))
+        (loader (cdr (assoc extension rng-schema-loader-alist))))
+    (or loader
+       (if extension
+           (error "No schema loader available for file extension `%s'"
+                  extension)
+         (error "No schema loader available for null file extension")))
+    (funcall loader filename)))
+
+(defun rng-what-schema ()
+  "Display a message saying what schema `rng-validate-mode' is using."
+  (interactive)
+  (if rng-current-schema-file-name
+      (message "Using schema %s" 
+              (abbreviate-file-name rng-current-schema-file-name))
+    (message "Using vacuous schema")))
+
+(defun rng-auto-set-schema (&optional no-display-error)
+  "Set the schema for this buffer based on the buffer's contents and file-name."
+  (interactive)
+  (condition-case err
+      (progn
+       (rng-set-schema-file-1 (rng-locate-schema-file))
+       (rng-what-schema))
+    (nxml-file-parse-error
+     (if no-display-error
+        (error "%s at position %s in %s"
+               (nth 3 err)
+               (nth 2 err)
+               (abbreviate-file-name (nth 1 err)))
+       (nxml-display-file-parse-error err)))))
+
+(defun rng-locate-schema-file (&optional type-id)
+  "Return the file-name of the schema to use for the current buffer.
+Return nil if no schema could be located.
+If TYPE-ID is non-nil, then locate the schema for this TYPE-ID."
+  (let* ((rng-cached-document-element nil)
+        (schema
+         (if type-id
+             (cons type-id nil)
+           (rng-locate-schema-file-using rng-schema-locating-files)))
+        files type-ids)
+    (while (consp schema)
+      (setq files rng-schema-locating-files)
+      (setq type-id (car schema))
+      (setq schema nil)
+      (when (member type-id type-ids)
+       (error "Type-id loop for type-id `%s'" type-id))
+      (setq type-ids (cons type-id type-ids))
+      (while (and files (not schema))
+       (setq schema
+             (rng-locate-schema-file-from-type-id type-id
+                                                  (car files)))
+       (setq files (cdr files))))
+    (and schema
+        (rng-uri-file-name schema))))
+
+(defun rng-possible-type-ids ()
+  "Return a list of the known type IDs."
+  (let ((files rng-schema-locating-files)
+       type-ids)
+    (while files
+      (setq type-ids (rng-possible-type-ids-using (car files) type-ids))
+      (setq files (cdr files)))
+    (rng-uniquify-equal (sort type-ids 'string<))))
+
+(defun rng-locate-schema-file-using (files)
+  "Locate a schema using the schema locating files FILES.
+FILES is a list of file-names.
+Return either a URI, a list (TYPE-ID) where TYPE-ID is a string
+or nil."
+  (let (rules
+       ;; List of types that override normal order-based
+       ;; priority, most important first
+       preferred-types
+       ;; Best result found so far; same form as return value.
+       best-so-far)
+    (while (and (progn
+                 (while (and (not rules) files)
+                   (setq rules (rng-get-parsed-schema-locating-file
+                                (car files)))
+                   (setq files (cdr files)))
+                 rules)
+               (or (not best-so-far) preferred-types))
+      (let* ((rule (car rules))
+            (rule-type (car rule))
+            (rule-matcher (get rule-type 'rng-rule-matcher)))
+       (setq rules (cdr rules))
+       (cond (rule-matcher
+              (when (and (or (not best-so-far)
+                             (memq rule-type preferred-types)))
+                         (setq best-so-far
+                               (funcall rule-matcher (cdr rule)))
+                         preferred-types)
+                (setq preferred-types
+                      (nbutlast preferred-types
+                                (length (memq rule-type preferred-types)))))
+             ((eq rule-type 'applyFollowingRules)
+              (when (not best-so-far)
+                (let ((prefer (cdr (assq 'ruleType (cdr rule)))))
+                  (when (and prefer
+                             (not (memq (setq prefer (intern prefer))
+                                        preferred-types)))
+                    (setq preferred-types
+                          (nconc preferred-types (list prefer)))))))
+             ((eq rule-type 'include)
+              (let ((uri (cdr (assq 'rules (cdr rule)))))
+                (when uri
+                  (setq rules
+                        (append (rng-get-parsed-schema-locating-file
+                                 (rng-uri-file-name uri))
+                                rules))))))))
+    best-so-far))
+
+(put 'documentElement 'rng-rule-matcher 'rng-match-document-element-rule)
+(put 'namespace 'rng-rule-matcher 'rng-match-namespace-rule)
+(put 'uri 'rng-rule-matcher 'rng-match-uri-rule)
+(put 'transformURI 'rng-rule-matcher 'rng-match-transform-uri-rule)
+(put 'default 'rng-rule-matcher 'rng-match-default-rule)
+
+(defun rng-match-document-element-rule (props)
+  (let ((document-element (rng-document-element))
+       (prefix (cdr (assq 'prefix props)))
+       (local-name (cdr (assq 'localName props))))
+    (and (or (not prefix)
+            (if (= (length prefix) 0)
+                (not (nth 1 document-element))
+              (string= prefix (nth 1 document-element))))
+        (or (not local-name)
+            (string= local-name
+                     (nth 2 document-element)))
+        (rng-match-default-rule props))))
+
+(defun rng-match-namespace-rule (props)
+  (let ((document-element (rng-document-element))
+       (ns (cdr (assq 'ns props))))
+    (and document-element
+        ns
+        (eq (nth 0 document-element)
+            (if (string= ns "")
+                nil
+              (nxml-make-namespace ns)))
+        (rng-match-default-rule props))))
+
+(defun rng-document-element ()
+  "Return a list (NS PREFIX LOCAL-NAME).
+NS is t if the document has a non-nil, but not otherwise known namespace."
+  (or rng-cached-document-element
+      (setq rng-cached-document-element
+           (save-excursion
+             (save-restriction
+               (widen)
+               (goto-char (point-min))
+               (let (xmltok-dtd)
+                 (xmltok-save
+                  (xmltok-forward-prolog)
+                  (xmltok-forward)
+                  (when (memq xmltok-type '(start-tag
+                                            partial-start-tag
+                                            empty-element
+                                            partial-empty-element))
+                    (list (rng-get-start-tag-namespace)
+                          (xmltok-start-tag-prefix)
+                          (xmltok-start-tag-local-name))))))))))
+
+(defun rng-get-start-tag-namespace ()
+  (let ((prefix (xmltok-start-tag-prefix))
+       namespace att value)
+    (while xmltok-namespace-attributes
+      (setq att (car xmltok-namespace-attributes))
+      (setq xmltok-namespace-attributes (cdr xmltok-namespace-attributes))
+      (when (if prefix
+               (and (xmltok-attribute-prefix att)
+                    (string= (xmltok-attribute-local-name att)
+                             prefix))
+             (not (xmltok-attribute-prefix att)))
+       (setq value (xmltok-attribute-value att))
+       (setq namespace (if value (nxml-make-namespace value) t))))
+    (if (and prefix (not namespace))
+       t
+      namespace)))
+
+(defun rng-match-transform-uri-rule (props)
+  (let ((from-pattern (cdr (assq 'fromPattern props)))
+       (to-pattern (cdr (assq 'toPattern props)))
+       (file-name (buffer-file-name)))
+    (and file-name
+        (setq file-name (expand-file-name file-name))
+        (rng-file-name-matches-uri-pattern-p file-name from-pattern)
+        (condition-case ()
+            (let ((new-file-name
+                   (replace-match
+                    (save-match-data
+                      (rng-uri-pattern-file-name-replace-match to-pattern))
+                    t
+                    nil
+                    file-name)))
+              (and (file-name-absolute-p new-file-name)
+                   (file-exists-p new-file-name)
+                   (rng-file-name-uri new-file-name)))
+            (rng-uri-error nil)))))
+
+(defun rng-match-uri-rule (props)
+  (let ((resource (cdr (assq 'resource props)))
+       (pattern (cdr (assq 'pattern props)))
+       (file-name (buffer-file-name)))
+    (and file-name
+        (setq file-name (expand-file-name file-name))
+        (cond (resource
+               (condition-case ()
+                   (eq (compare-strings (rng-uri-file-name resource)
+                                        0
+                                        nil
+                                        (expand-file-name file-name)
+                                        0
+                                        nil
+                                        nxml-file-name-ignore-case)
+                       t)
+                 (rng-uri-error nil)))
+              (pattern
+               (rng-file-name-matches-uri-pattern-p file-name
+                                                    pattern)))
+        (rng-match-default-rule props))))
+
+(defun rng-file-name-matches-uri-pattern-p (file-name pattern)
+  (condition-case ()
+      (and (let ((case-fold-search nxml-file-name-ignore-case))
+            (string-match (rng-uri-pattern-file-name-regexp pattern)
+                          file-name))
+          t)
+    (rng-uri-error nil)))
+
+(defun rng-match-default-rule (props)
+  (or (cdr (assq 'uri props))
+      (let ((type-id (cdr (assq 'typeId props))))
+       (and type-id
+            (cons (rng-collapse-space type-id) nil)))))
+
+(defun rng-possible-type-ids-using (file type-ids)
+  (let ((rules (rng-get-parsed-schema-locating-file file))
+       rule)
+    (while rules
+      (setq rule (car rules))
+      (setq rules (cdr rules))
+      (cond ((eq (car rule) 'typeId)
+            (let ((id (cdr (assq 'id (cdr rule)))))
+              (when id
+                (setq type-ids
+                      (cons (rng-collapse-space id)
+                            type-ids)))))
+           ((eq (car rule) 'include)
+            (let ((uri (cdr (assq 'rules (cdr rule)))))
+              (when uri
+                (setq type-ids
+                      (rng-possible-type-ids-using
+                       (rng-get-parsed-schema-locating-file
+                        (rng-uri-file-name uri))
+                       type-ids)))))))
+    type-ids))
+
+(defun rng-locate-schema-file-from-type-id (type-id file)
+  "Locate the schema for type id TYPE-ID using schema locating file FILE.
+Return either a URI, a list (TYPE-ID) where TYPE-ID is a string
+or nil."
+  (let ((rules (rng-get-parsed-schema-locating-file file))
+       schema rule)
+    (while (and rules (not schema))
+      (setq rule (car rules))
+      (setq rules (cdr rules))
+      (cond ((and (eq (car rule) 'typeId)
+                 (let ((id (assq 'id (cdr rule))))
+                   (and id
+                        (string= (rng-collapse-space (cdr id)) type-id))))
+            (setq schema (rng-match-default-rule (cdr rule))))
+           ((eq (car rule) 'include)
+            (let ((uri (cdr (assq 'rules (cdr rule)))))
+              (when uri
+                (setq schema
+                      (rng-locate-schema-file-from-type-id
+                       type-id
+                       (rng-uri-file-name uri))))))))
+    schema))
+
+(defvar rng-schema-locating-file-alist nil)
+
+(defun rng-get-parsed-schema-locating-file (file)
+  "Return a list of rules for the schema locating file FILE."
+  (setq file (expand-file-name file))
+  (let ((cached (assoc file rng-schema-locating-file-alist))
+       (mtime (nth 5 (file-attributes file)))
+       parsed)
+    (cond ((not mtime)
+          (when cached
+            (setq rng-schema-locating-file-alist
+                  (delq cached rng-schema-locating-file-alist)))
+          nil)
+         ((and cached (equal (nth 1 cached) mtime))
+          (nth 2 cached))
+         (t
+          (setq parsed (rng-parse-schema-locating-file file))
+          (if cached
+              (setcdr cached (list mtime parsed))
+            (setq rng-schema-locating-file-alist
+                  (cons (list file mtime parsed)
+                        rng-schema-locating-file-alist)))
+          parsed))))
+  
+(defconst rng-locate-namespace-uri
+  (nxml-make-namespace "http://thaiopensource.com/ns/locating-rules/1.0"))
+
+(defun rng-parse-schema-locating-file (file)
+  "Return list of rules.
+Each rule has the form (TYPE (ATTR . VAL) ...), where
+TYPE is a symbol for the element name, ATTR is a symbol for the attribute
+and VAL is a string for the value.
+Attribute values representing URIs are made absolute and xml:base
+attributes are removed."
+  (when (and (not rng-schema-locating-file-schema)
+            rng-schema-locating-file-schema-file)
+    (setq rng-schema-locating-file-schema
+         (rng-load-schema rng-schema-locating-file-schema-file)))
+  (let* ((element
+         (if rng-schema-locating-file-schema
+             (rng-parse-validate-file rng-schema-locating-file-schema
+                                      file)
+           (nxml-parse-file file)))
+        (children (cddr element))
+        (base-uri (rng-file-name-uri file))
+        child name rules atts att props prop-name prop-value)
+    (when (equal (car element)
+                (cons rng-locate-namespace-uri "locatingRules"))
+      (while children
+       (setq child (car children))
+       (setq children (cdr children))
+       (when (consp child)
+         (setq name (car child))
+         (when (eq (car name) rng-locate-namespace-uri)
+           (setq atts (cadr child))
+           (setq props nil)
+           (while atts
+             (setq att (car atts))
+             (when (stringp (car att))
+               (setq prop-name (intern (car att)))
+               (setq prop-value (cdr att))
+               (when (memq prop-name '(uri rules resource))
+                 (setq prop-value
+                       (rng-uri-resolve prop-value base-uri)))
+               (setq props (cons (cons prop-name prop-value)
+                                 props)))
+             (setq atts (cdr atts)))
+           (setq rules
+                 (cons (cons (intern (cdr name)) (nreverse props))
+                       rules))))))
+    (nreverse rules)))
+
+(defun rng-save-schema-location ()
+  "Save the association between the buffer's file and the current schema.
+This ensures that the schema that is currently being used will be used
+if the file is edited in a future session.  The association will be
+saved to the first writable file in `rng-schema-locating-files'."
+  (interactive)
+  (rng-save-schema-location-1 nil))
+
+(defun rng-save-schema-location-1 (prompt &optional type-id)
+  (unless (or rng-current-schema-file-name type-id)
+    (error "Buffer is using a vacuous schema"))
+  (let ((files rng-schema-locating-files)
+       (document-file-name (buffer-file-name))
+       (schema-file-name rng-current-schema-file-name)
+       file)
+    (while (and files (not file))
+      (if (file-writable-p (car files))
+         (setq file (expand-file-name (car files)))
+       (setq files (cdr files))))
+    (cond ((not file)
+          (if prompt
+              nil
+            (error "No writable schema locating file configured")))
+         ((not document-file-name)
+          (if prompt
+              nil
+            (error "Buffer does not have a filename")))
+         ((and prompt
+               (not (y-or-n-p (format "Save %s to %s "
+                                      (if type-id
+                                          "type identifier"
+                                        "schema location")
+                                      file)))))
+         (t
+          (save-excursion
+            (set-buffer (find-file-noselect file))
+            (let ((modified (buffer-modified-p)))
+              (if (> (buffer-size) 0)
+                  (let (xmltok-dtd)
+                    (goto-char (point-min))
+                    (xmltok-save
+                      (xmltok-forward-prolog)
+                      (xmltok-forward)
+                      (unless (eq xmltok-type 'start-tag)
+                        (error "Locating file `%s' invalid" file))))
+                (insert "<?xml version=\"1.0\"?>\n"
+                        "<locatingRules xmlns=\""
+                        (nxml-namespace-name rng-locate-namespace-uri)
+                        "\">")
+                (let ((pos (point)))
+                  (insert "\n</locatingRules>\n")
+                  (goto-char pos)))
+              (insert "\n")
+              (insert (let ((locating-file-uri (rng-file-name-uri file)))
+                        (format "<uri resource=\"%s\" %s=\"%s\"/>"
+                                (rng-escape-string
+                                 (rng-relative-uri
+                                  (rng-file-name-uri document-file-name)
+                                  locating-file-uri))
+                                (if type-id "typeId" "uri")
+                                (rng-escape-string
+                                 (or type-id
+                                     (rng-relative-uri
+                                      (rng-file-name-uri schema-file-name)
+                                      locating-file-uri))))))
+              (indent-according-to-mode)
+              (when (or (not modified)
+                        (y-or-n-p (format "Save file %s "
+                                          (buffer-file-name))))
+                (save-buffer))))))))
+
+(provide 'rng-loc)
+
+;; arch-tag: 725cf968-37a2-418b-b47b-d5209871a9ab
+;;; rng-loc.el ends here
diff --git a/lisp/nxml/rng-maint.el b/lisp/nxml/rng-maint.el
new file mode 100644 (file)
index 0000000..c4cf0fd
--- /dev/null
@@ -0,0 +1,354 @@
+;;; rng-maint.el --- commands for RELAX NG maintainers
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-mode)
+(require 'texnfo-upd)
+
+(defvar rng-dir (file-name-directory load-file-name))
+
+(defconst rng-autoload-modules
+  '(xmltok
+    nxml-mode
+    nxml-uchnm
+    nxml-glyph
+    rng-cmpct
+    rng-maint
+    rng-valid
+    rng-xsd
+    rng-nxml))
+
+;;;###autoload
+(defun rng-update-autoloads ()
+  "Update the autoloads in rng-auto.el."
+  (interactive)
+  (let* ((generated-autoload-file (expand-file-name "rng-auto.el"
+                                                   rng-dir)))
+    (mapcar (lambda (x)
+             (update-file-autoloads
+              (expand-file-name (concat (symbol-name x) ".el") rng-dir)))
+           rng-autoload-modules)))
+
+
+(defconst rng-compile-modules
+  '(xmltok
+    nxml-util
+    nxml-enc
+    nxml-glyph
+    nxml-rap
+    nxml-outln
+    nxml-mode
+    nxml-uchnm
+    nxml-ns
+    nxml-parse
+    nxml-maint
+    xsd-regexp
+    rng-util
+    rng-dt
+    rng-xsd
+    rng-uri
+    rng-pttrn
+    rng-cmpct
+    rng-match
+    rng-parse
+    rng-loc
+    rng-valid
+    rng-nxml
+    rng-maint))
+
+;;;###autoload
+(defun rng-byte-compile-load ()
+  "Byte-compile and load all of the RELAX NG library in an appropriate order."
+  (interactive)
+  (mapcar (lambda (x)
+           (byte-compile-file (expand-file-name (concat (symbol-name x) ".el")
+                                                rng-dir)
+                              t))
+         rng-compile-modules))
+
+
+;;; Conversion from XML to texinfo.
+;; This is all a hack and is just enough to make the conversion work.
+;; It's not intended for public use.
+
+(defvar rng-manual-base "nxml-mode")
+(defvar rng-manual-xml (concat rng-manual-base ".xml"))
+(defvar rng-manual-texi (concat rng-manual-base ".texi"))
+(defvar rng-manual-info (concat rng-manual-base ".info"))
+
+;;;###autoload
+(defun rng-format-manual ()
+  "Create manual.texi from manual.xml."
+  (interactive)
+  (let ((xml-buf (find-file-noselect (expand-file-name rng-manual-xml
+                                                      rng-dir)))
+       (texi-buf (find-file-noselect (expand-file-name rng-manual-texi
+                                                       rng-dir))))
+    (save-excursion
+      (set-buffer texi-buf)
+      (erase-buffer)
+      (let ((standard-output texi-buf))
+       (princ (format "\\input texinfo @c -*- texinfo -*-\n\
+@c %%**start of header\n\
+@setfilename %s\n\
+@settitle \n\
+@c %%**end of header\n" rng-manual-info))
+       (set-buffer xml-buf)
+       (goto-char (point-min))
+       (xmltok-save
+         (xmltok-forward-prolog)
+         (rng-process-tokens))
+       (princ "\n@bye\n"))
+      (set-buffer texi-buf)
+      (rng-manual-fixup)
+      (texinfo-insert-node-lines (point-min) (point-max) t)
+      (texinfo-all-menus-update)
+      (save-buffer))))
+
+(defun rng-manual-fixup ()
+  (goto-char (point-min))
+  (search-forward "@top ")
+  (let ((pos (point)))
+    (search-forward "\n")
+    (let ((title (buffer-substring-no-properties pos (1- (point)))))
+      (goto-char (point-min))
+      (search-forward "@settitle ")
+      (insert title)
+      (search-forward "@node")
+      (goto-char (match-beginning 0))
+      (insert "@dircategory Emacs\n"
+             "@direntry\n* "
+             title
+             ": ("
+             rng-manual-info
+             ").\n@end direntry\n\n"))))
+
+(defvar rng-manual-inline-elements '(kbd key samp code var emph uref point))
+
+(defun rng-process-tokens ()
+  (let ((section-depth 0)
+       ;; stack of per-element space treatment
+       ;; t means keep, nil means discard, fill means no blank lines
+       (keep-space-stack (list nil))
+       (ignore-following-newline nil)
+       (want-blank-line nil)
+       name startp endp data keep-space-for-children)
+    (while (xmltok-forward)
+      (cond ((memq xmltok-type '(start-tag empty-element end-tag))
+            (setq startp (memq xmltok-type '(start-tag empty-element)))
+            (setq endp (memq xmltok-type '(end-tag empty-element)))
+            (setq name (intern (if startp
+                                   (xmltok-start-tag-qname)
+                                 (xmltok-end-tag-qname))))
+            (setq keep-space-for-children nil)
+            (setq ignore-following-newline nil)
+            (cond ((memq name rng-manual-inline-elements)
+                   (when startp
+                     (when want-blank-line
+                       (rng-manual-output-force-blank-line)
+                       (when (eq want-blank-line 'noindent)
+                         (princ "@noindent\n"))
+                       (setq want-blank-line nil))
+                     (setq keep-space-for-children t)
+                     (princ (format "@%s{" name)))
+                   (when endp (princ "}")))
+                  ((eq name 'ulist)
+                   (when startp
+                     (rng-manual-output-force-blank-line)
+                     (setq want-blank-line nil)
+                     (princ "@itemize @bullet\n"))
+                   (when endp
+                     (rng-manual-output-force-new-line)
+                     (setq want-blank-line 'noindent)
+                     (princ "@end itemize\n")))
+                  ((eq name 'item)
+                   (rng-manual-output-force-new-line)
+                   (setq want-blank-line endp)
+                   (when startp (princ "@item\n")))
+                  ((memq name '(example display))
+                   (when startp
+                     (setq ignore-following-newline t)
+                     (rng-manual-output-force-blank-line)
+                     (setq want-blank-line nil)
+                     (setq keep-space-for-children t)
+                     (princ (format "@%s\n" name)))
+                   (when endp
+                     (rng-manual-output-force-new-line)
+                     (setq want-blank-line 'noindent)
+                     (princ (format "@end %s\n" name))))
+                  ((eq name 'para)
+                   (rng-manual-output-force-new-line)
+                   (when startp
+                     (when want-blank-line
+                       (setq want-blank-line t))
+                     (setq keep-space-for-children 'fill))
+                   (when endp (setq want-blank-line t)))
+                  ((eq name 'section)
+                   (when startp
+                     (rng-manual-output-force-blank-line)
+                     (when (eq section-depth 0)
+                       (princ "@node Top\n"))
+                     (princ "@")
+                     (princ (nth section-depth '(top
+                                                 chapter
+                                                 section
+                                                 subsection
+                                                 subsubsection)))
+                     (princ " ")
+                     (setq want-blank-line nil)
+                     (setq section-depth (1+ section-depth)))
+                   (when endp
+                     (rng-manual-output-force-new-line)
+                     (setq want-blank-line nil)
+                     (setq section-depth (1- section-depth))))
+                  ((eq name 'title)
+                   (when startp
+                     (setq keep-space-for-children 'fill))
+                   (when endp
+                     (setq want-blank-line t)
+                     (princ "\n"))))
+            (when startp
+              (setq keep-space-stack (cons keep-space-for-children
+                                           keep-space-stack)))
+            (when endp
+              (setq keep-space-stack (cdr keep-space-stack))))
+           ((memq xmltok-type '(data
+                                space
+                                char-ref
+                                entity-ref
+                                cdata-section))
+            (setq data nil)
+            (cond ((memq xmltok-type '(data space))
+                   (setq data (buffer-substring-no-properties xmltok-start
+                                                              (point))))
+                  ((and (memq xmltok-type '(char-ref entity-ref))
+                        xmltok-replacement)
+                   (setq data xmltok-replacement))
+                  ((eq xmltok-type 'cdata-section)
+                   (setq data
+                         (buffer-substring-no-properties (+ xmltok-start 9)
+                                                         (- (point) 3)))))
+            (when (and data (car keep-space-stack))
+              (setq data (replace-regexp-in-string "[@{}]"
+                                                   "@\\&"
+                                                   data
+                                                   t))
+              (when ignore-following-newline
+                (setq data (replace-regexp-in-string "\\`\n" "" data t)))
+              (setq ignore-following-newline nil)
+;;            (when (eq (car keep-space-stack) 'fill)
+;;              (setq data (replace-regexp-in-string "\n" " " data t)))
+              (when (eq want-blank-line 'noindent)
+                (setq data (replace-regexp-in-string "\\`\n*" "" data t)))
+              (when (> (length data) 0)
+                (when want-blank-line
+                  (rng-manual-output-force-blank-line)
+                  (when (eq want-blank-line 'noindent)
+                    (princ "@noindent\n"))
+                  (setq want-blank-line nil))
+                (princ data))))
+            ))))
+
+(defun rng-manual-output-force-new-line ()
+  (save-excursion
+    (set-buffer standard-output)
+    (unless (eq (char-before) ?\n)
+      (insert ?\n))))
+
+(defun rng-manual-output-force-blank-line ()
+  (save-excursion
+    (set-buffer standard-output)
+    (if (eq (char-before) ?\n)
+       (unless (eq (char-before (1- (point))) ?\n)
+         (insert ?\n))
+      (insert "\n\n"))))
+
+;;; Versioning
+
+;;;###autoload
+(defun rng-write-version ()
+  (find-file "VERSION")
+  (erase-buffer)
+  (insert nxml-version "\n")
+  (save-buffer))
+
+;;; Timing
+
+(defun rng-time-to-float (time)
+  (+ (* (nth 0 time) 65536.0)
+     (nth 1 time)
+     (/ (nth 2 time) 1000000.0)))
+
+(defun rng-time-function (function &rest args)
+  (let* ((start (current-time))
+        (val (apply function args))
+        (end (current-time)))
+    (message "%s ran in %g seconds"
+            function
+            (- (rng-time-to-float end)
+               (rng-time-to-float start)))
+    val))
+
+(defun rng-time-tokenize-buffer ()
+  (interactive)
+  (rng-time-function 'rng-tokenize-buffer))
+
+(defun rng-tokenize-buffer ()
+  (save-excursion
+    (goto-char (point-min))
+    (xmltok-save
+      (xmltok-forward-prolog)
+      (while (xmltok-forward)))))
+
+(defun rng-time-validate-buffer ()
+  (interactive)
+  (rng-time-function 'rng-validate-buffer))
+
+(defvar rng-error-count)
+(defvar rng-validate-up-to-date-end)
+(declare-function rng-clear-cached-state "rng-valid" (start end))
+(declare-function rng-clear-overlays "rng-valid" (beg end))
+(declare-function rng-clear-conditional-region "rng-valid" ())
+(declare-function rng-do-some-validation "rng-valid"
+                  (&optional continue-p-function))
+
+(defun rng-validate-buffer ()
+  (save-restriction
+    (widen)
+    (nxml-with-unmodifying-text-property-changes
+      (rng-clear-cached-state (point-min) (point-max)))
+    ;; 1+ to clear empty overlays at (point-max)
+    (rng-clear-overlays (point-min) (1+ (point-max))))
+  (setq rng-validate-up-to-date-end 1)
+  (rng-clear-conditional-region)
+  (setq rng-error-count 0)
+  (while (rng-do-some-validation
+         (lambda () t))))
+
+;; arch-tag: 4b8c6143-daac-4888-9c61-9bea6f935f17
+;;; rng-maint.el ends here
diff --git a/lisp/nxml/rng-match.el b/lisp/nxml/rng-match.el
new file mode 100644 (file)
index 0000000..eb79d99
--- /dev/null
@@ -0,0 +1,1742 @@
+;;; rng-match.el --- matching of RELAX NG patterns against XML events
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This uses the algorithm described in
+;;   http://www.thaiopensource.com/relaxng/derivative.html
+;;
+;; The schema to be used is contained in the variable
+;; rng-current-schema.  It has the form described in the file
+;; rng-pttrn.el.
+;;
+;;; Code:
+
+(require 'rng-pttrn)
+(require 'rng-util)
+(require 'rng-dt)
+
+(defvar rng-not-allowed-ipattern nil)
+(defvar rng-empty-ipattern nil)
+(defvar rng-text-ipattern nil)
+
+(defvar rng-compile-table nil)
+
+(defvar rng-being-compiled nil
+  "Contains a list of ref patterns currently being compiled.
+Used to detect illegal recursive references.")
+
+(defvar rng-ipattern-table nil)
+
+(defvar rng-last-ipattern-index nil)
+
+(defvar rng-match-state nil
+  "An ipattern representing the current state of validation.")
+
+;;; Inline functions
+
+(defsubst rng-update-match-state (new-state)
+  (if (and (eq new-state rng-not-allowed-ipattern)
+          (not (eq rng-match-state rng-not-allowed-ipattern)))
+      nil
+    (setq rng-match-state new-state)
+    t))
+
+;;; Interned patterns
+
+(eval-when-compile
+  (defun rng-ipattern-slot-accessor-name (slot-name)
+    (intern (concat "rng-ipattern-get-"
+                   (symbol-name slot-name))))
+  
+  (defun rng-ipattern-slot-setter-name (slot-name)
+    (intern (concat "rng-ipattern-set-"
+                   (symbol-name slot-name)))))
+
+(defmacro rng-ipattern-defslot (slot-name index)
+  `(progn
+     (defsubst ,(rng-ipattern-slot-accessor-name slot-name) (ipattern)
+       (aref ipattern ,index))
+     (defsubst ,(rng-ipattern-slot-setter-name slot-name) (ipattern value)
+       (aset ipattern ,index value))))
+
+(rng-ipattern-defslot type 0)
+(rng-ipattern-defslot index 1)
+(rng-ipattern-defslot name-class 2)
+(rng-ipattern-defslot datatype 2)
+(rng-ipattern-defslot after 2)
+(rng-ipattern-defslot child 3)
+(rng-ipattern-defslot value-object 3)
+(rng-ipattern-defslot nullable 4)
+(rng-ipattern-defslot memo-text-typed 5)
+(rng-ipattern-defslot memo-map-start-tag-open-deriv 6)
+(rng-ipattern-defslot memo-map-start-attribute-deriv 7)
+(rng-ipattern-defslot memo-start-tag-close-deriv 8)
+(rng-ipattern-defslot memo-text-only-deriv 9)
+(rng-ipattern-defslot memo-mixed-text-deriv 10)
+(rng-ipattern-defslot memo-map-data-deriv 11)
+(rng-ipattern-defslot memo-end-tag-deriv 12)
+
+(defconst rng-memo-map-alist-max 10)
+
+(defsubst rng-memo-map-get (key mm)
+  "Return the value associated with KEY in memo-map MM."
+  (let ((found (assoc key mm)))
+    (if found
+       (cdr found)
+      (and mm
+          (let ((head (car mm)))
+            (and (hash-table-p head)
+                 (gethash key head)))))))
+
+(defun rng-memo-map-add (key value mm &optional weakness)
+  "Associate KEY with VALUE in memo-map MM and return the new memo-map.
+The new memo-map may or may not be a different object from MM.
+
+Alists are better for small maps. Hash tables are better for large
+maps.  A memo-map therefore starts off as an alist and switches to a
+hash table for large memo-maps. A memo-map is always a list.  An empty
+memo-map is represented by nil. A large memo-map is represented by a
+list containing just a hash-table.  A small memo map is represented by
+a list whose cdr is an alist and whose car is the number of entries in
+the alist. The complete memo-map can be passed to assoc without
+problems: assoc ignores any members that are not cons cells.  There is
+therefore minimal overhead in successful lookups on small lists
+\(which is the most common case)."
+  (if (null mm)
+      (list 1 (cons key value))
+    (let ((head (car mm)))
+      (cond ((hash-table-p head)
+            (puthash key value head)
+            mm)
+           ((>= head rng-memo-map-alist-max)
+            (let ((ht (make-hash-table :test 'equal
+                                       :weakness weakness
+                                       :size (* 2 rng-memo-map-alist-max))))
+              (setq mm (cdr mm))
+              (while mm
+                (setq head (car mm))
+                (puthash (car head) (cdr head) ht)
+                (setq mm (cdr mm)))
+              (cons ht nil)))
+           (t (cons (1+ head)
+                    (cons (cons key value)
+                          (cdr mm))))))))
+            
+(defsubst rng-make-ipattern (type index name-class child nullable)
+  (vector type index name-class child nullable
+         ;; 5 memo-text-typed
+         'unknown
+         ;; 6 memo-map-start-tag-open-deriv
+         nil
+         ;; 7 memo-map-start-attribute-deriv
+         nil
+         ;; 8 memo-start-tag-close-deriv
+         nil
+         ;; 9 memo-text-only-deriv
+         nil
+         ;; 10 memo-mixed-text-deriv
+         nil
+         ;; 11 memo-map-data-deriv
+         nil
+         ;; 12 memo-end-tag-deriv
+         nil))
+
+(defun rng-ipattern-maybe-init ()
+  (unless rng-ipattern-table
+    (setq rng-ipattern-table (make-hash-table :test 'equal))
+    (setq rng-last-ipattern-index -1)))
+
+(defun rng-ipattern-clear ()
+  (when rng-ipattern-table
+    (clrhash rng-ipattern-table))
+  (setq rng-last-ipattern-index -1))
+
+(defsubst rng-gen-ipattern-index ()
+  (setq rng-last-ipattern-index (1+ rng-last-ipattern-index)))
+
+(defun rng-put-ipattern (key type name-class child nullable)
+  (let ((ipattern
+        (rng-make-ipattern type
+                           (rng-gen-ipattern-index)
+                           name-class
+                           child
+                           nullable)))
+    (puthash key ipattern rng-ipattern-table)
+    ipattern))
+
+(defun rng-get-ipattern (key)
+  (gethash key rng-ipattern-table))
+
+(or rng-not-allowed-ipattern
+    (setq rng-not-allowed-ipattern
+         (rng-make-ipattern 'not-allowed -3 nil nil nil)))
+
+(or rng-empty-ipattern
+    (setq rng-empty-ipattern
+         (rng-make-ipattern 'empty -2 nil nil t)))
+
+(or rng-text-ipattern
+    (setq rng-text-ipattern
+         (rng-make-ipattern 'text -1 nil nil t)))
+
+(defconst rng-const-ipatterns
+  (list rng-not-allowed-ipattern
+       rng-empty-ipattern
+       rng-text-ipattern))
+
+(defun rng-intern-after (child after)
+  (if (eq child rng-not-allowed-ipattern)
+      rng-not-allowed-ipattern
+    (let ((key (list 'after
+                    (rng-ipattern-get-index child)
+                    (rng-ipattern-get-index after))))
+      (or (rng-get-ipattern key)
+         (rng-put-ipattern key
+                           'after
+                           after
+                           child
+                           nil)))))
+  
+(defun rng-intern-attribute (name-class ipattern)
+  (if (eq ipattern rng-not-allowed-ipattern)
+      rng-not-allowed-ipattern
+    (let ((key (list 'attribute
+                    name-class
+                    (rng-ipattern-get-index ipattern))))
+      (or (rng-get-ipattern key)
+         (rng-put-ipattern key
+                           'attribute
+                           name-class
+                           ipattern
+                           nil)))))
+
+(defun rng-intern-data (dt matches-anything)
+  (let ((key (list 'data dt)))
+    (or (rng-get-ipattern key)
+       (let ((ipattern (rng-put-ipattern key
+                                         'data
+                                         dt
+                                         nil
+                                         matches-anything)))
+         (rng-ipattern-set-memo-text-typed ipattern
+                                           (not matches-anything))
+         ipattern))))
+
+(defun rng-intern-data-except (dt ipattern)
+  (let ((key (list 'data-except dt ipattern)))
+    (or (rng-get-ipattern key)
+       (rng-put-ipattern key
+                         'data-except
+                         dt
+                         ipattern
+                         nil))))
+
+(defun rng-intern-value (dt obj)
+  (let ((key (list 'value dt obj)))
+    (or (rng-get-ipattern key)
+       (rng-put-ipattern key
+                         'value
+                         dt
+                         obj
+                         nil))))
+
+(defun rng-intern-one-or-more (ipattern)
+  (or (rng-intern-one-or-more-shortcut ipattern)
+      (let ((key (cons 'one-or-more
+                      (list (rng-ipattern-get-index ipattern)))))
+       (or (rng-get-ipattern key)
+           (rng-put-ipattern key
+                             'one-or-more
+                             nil
+                             ipattern
+                             (rng-ipattern-get-nullable ipattern))))))
+
+(defun rng-intern-one-or-more-shortcut (ipattern)
+  (cond ((eq ipattern rng-not-allowed-ipattern)
+        rng-not-allowed-ipattern)
+       ((eq ipattern rng-empty-ipattern)
+        rng-empty-ipattern)
+       ((eq (rng-ipattern-get-type ipattern) 'one-or-more)
+        ipattern)
+       (t nil)))
+
+(defun rng-intern-list (ipattern)
+  (if (eq ipattern rng-not-allowed-ipattern)
+      rng-not-allowed-ipattern
+    (let ((key (cons 'list
+                    (list (rng-ipattern-get-index ipattern)))))
+      (or (rng-get-ipattern key)
+         (rng-put-ipattern key
+                           'list
+                           nil
+                           ipattern
+                           nil)))))
+
+(defun rng-intern-group (ipatterns)
+  "Return a ipattern for the list of group members in IPATTERNS."
+  (or (rng-intern-group-shortcut ipatterns)
+      (let* ((tem (rng-normalize-group-list ipatterns))
+            (normalized (cdr tem)))
+       (or (rng-intern-group-shortcut normalized)
+           (let ((key (cons 'group
+                            (mapcar 'rng-ipattern-get-index normalized))))
+             (or (rng-get-ipattern key)
+                 (rng-put-ipattern key
+                                   'group
+                                   nil
+                                   normalized
+                                   (car tem))))))))
+
+(defun rng-intern-group-shortcut (ipatterns)
+  "Try to shortcut interning a group list.  If successful, return the
+interned pattern.  Otherwise return nil."
+  (while (and ipatterns
+             (eq (car ipatterns) rng-empty-ipattern))
+    (setq ipatterns (cdr ipatterns)))
+  (if ipatterns
+      (let ((ret (car ipatterns)))
+       (if (eq ret rng-not-allowed-ipattern)
+           rng-not-allowed-ipattern
+         (setq ipatterns (cdr ipatterns))
+         (while (and ipatterns ret)
+           (let ((tem (car ipatterns)))
+             (cond ((eq tem rng-not-allowed-ipattern)
+                    (setq ret tem)
+                    (setq ipatterns nil))
+                   ((eq tem rng-empty-ipattern)
+                    (setq ipatterns (cdr ipatterns)))
+                   (t
+                    ;; Stop here rather than continuing
+                    ;; looking for not-allowed patterns.
+                    ;; We do a complete scan elsewhere.
+                    (setq ret nil)))))
+         ret))
+    rng-empty-ipattern))
+
+(defun rng-normalize-group-list (ipatterns)
+  "Normalize a list containing members of a group.
+Expands nested groups, removes empty members, handles notAllowed.
+Returns a pair whose car says whether the list is nullable and whose
+cdr is the normalized list."
+  (let ((nullable t)
+       (result nil)
+       member)
+    (while ipatterns
+      (setq member (car ipatterns))
+      (setq ipatterns (cdr ipatterns))
+      (when nullable
+       (setq nullable (rng-ipattern-get-nullable member)))
+      (cond ((eq (rng-ipattern-get-type member) 'group)
+            (setq result
+                  (nconc (reverse (rng-ipattern-get-child member))
+                         result)))
+           ((eq member rng-not-allowed-ipattern)
+            (setq result (list rng-not-allowed-ipattern))
+            (setq ipatterns nil))
+           ((not (eq member rng-empty-ipattern))
+            (setq result (cons member result)))))
+    (cons nullable (nreverse result))))
+
+(defun rng-intern-interleave (ipatterns)
+  (or (rng-intern-group-shortcut ipatterns)
+      (let* ((tem (rng-normalize-interleave-list ipatterns))
+            (normalized (cdr tem)))
+       (or (rng-intern-group-shortcut normalized)
+           (let ((key (cons 'interleave
+                            (mapcar 'rng-ipattern-get-index normalized))))
+             (or (rng-get-ipattern key)
+                 (rng-put-ipattern key
+                                   'interleave
+                                   nil
+                                   normalized
+                                   (car tem))))))))
+
+(defun rng-normalize-interleave-list (ipatterns)
+  "Normalize a list containing members of an interleave.
+Expands nested groups, removes empty members, handles notAllowed.
+Returns a pair whose car says whether the list is nullable and whose
+cdr is the normalized list."
+  (let ((nullable t)
+       (result nil)
+       member)
+    (while ipatterns
+      (setq member (car ipatterns))
+      (setq ipatterns (cdr ipatterns))
+      (when nullable
+       (setq nullable (rng-ipattern-get-nullable member)))
+      (cond ((eq (rng-ipattern-get-type member) 'interleave)
+            (setq result
+                  (append (rng-ipattern-get-child member)
+                           result)))
+           ((eq member rng-not-allowed-ipattern)
+            (setq result (list rng-not-allowed-ipattern))
+            (setq ipatterns nil))
+           ((not (eq member rng-empty-ipattern))
+            (setq result (cons member result)))))
+    (cons nullable (sort result 'rng-compare-ipattern))))
+
+;; Would be cleaner if this didn't modify IPATTERNS.
+
+(defun rng-intern-choice (ipatterns)
+  "Return a choice ipattern for the list of choices in IPATTERNS.
+May alter IPATTERNS."
+  (or (rng-intern-choice-shortcut ipatterns)
+      (let* ((tem (rng-normalize-choice-list ipatterns))
+            (normalized (cdr tem)))
+       (or (rng-intern-choice-shortcut normalized)
+           (rng-intern-choice1 normalized (car tem))))))
+
+(defun rng-intern-optional (ipattern)
+  (cond ((rng-ipattern-get-nullable ipattern) ipattern)
+       ((eq ipattern rng-not-allowed-ipattern) rng-empty-ipattern)
+       (t (rng-intern-choice1
+           ;; This is sorted since the empty pattern
+           ;; is before everything except not allowed.
+           ;; It cannot have a duplicate empty pattern,
+           ;; since it is not nullable.
+           (cons rng-empty-ipattern
+                 (if (eq (rng-ipattern-get-type ipattern) 'choice)
+                     (rng-ipattern-get-child ipattern)
+                   (list ipattern)))
+           t))))
+
+
+(defun rng-intern-choice1 (normalized nullable)
+  (let ((key (cons 'choice
+                  (mapcar 'rng-ipattern-get-index normalized))))
+    (or (rng-get-ipattern key)
+       (rng-put-ipattern key
+                         'choice
+                         nil
+                         normalized
+                         nullable))))
+                                           
+(defun rng-intern-choice-shortcut (ipatterns)
+  "Try to shortcut interning a choice list.  If successful, return the
+interned pattern.  Otherwise return nil."
+  (while (and ipatterns
+             (eq (car ipatterns)
+                 rng-not-allowed-ipattern))
+    (setq ipatterns (cdr ipatterns)))
+  (if ipatterns
+      (let ((ret (car ipatterns)))
+       (setq ipatterns (cdr ipatterns))
+       (while (and ipatterns ret)
+         (or (eq (car ipatterns) rng-not-allowed-ipattern)
+             (eq (car ipatterns) ret)
+             (setq ret nil))
+         (setq ipatterns (cdr ipatterns)))
+       ret)
+    rng-not-allowed-ipattern))
+
+(defun rng-normalize-choice-list (ipatterns)
+  "Normalize a list of choices, expanding nested choices, removing
+not-allowed members, sorting by index and removing duplicates.  Return
+a pair whose car says whether the list is nullable and whose cdr is
+the normalized list."
+  (let ((sorted t)
+       (nullable nil)
+       (head (cons nil ipatterns)))
+    (let ((tail head)
+         (final-tail nil)
+         (prev-index -100)
+         (cur ipatterns)
+         member)
+      ;; the cdr of tail is always cur
+      (while cur
+       (setq member (car cur))
+       (or nullable
+           (setq nullable (rng-ipattern-get-nullable member)))
+       (cond ((eq (rng-ipattern-get-type member) 'choice)
+              (setq final-tail
+                    (append (rng-ipattern-get-child member)
+                            final-tail))
+              (setq cur (cdr cur))
+              (setq sorted nil)
+              (setcdr tail cur))
+             ((eq member rng-not-allowed-ipattern)
+              (setq cur (cdr cur))
+              (setcdr tail cur))
+             (t
+              (if (and sorted
+                       (let ((cur-index (rng-ipattern-get-index member)))
+                         (if (>= prev-index cur-index)
+                             (or (= prev-index cur-index) ; will remove it
+                                 (setq sorted nil)) ; won't remove it
+                           (setq prev-index cur-index)
+                           ;; won't remove it
+                           nil)))
+                  (progn
+                    ;; remove it
+                    (setq cur (cdr cur))
+                    (setcdr tail cur))
+                ;; don't remove it
+                (setq tail cur)
+                (setq cur (cdr cur))))))
+      (setcdr tail final-tail))
+    (setq head (cdr head))
+    (cons nullable
+         (if sorted
+             head
+           (rng-uniquify-eq (sort head 'rng-compare-ipattern))))))
+
+(defun rng-compare-ipattern (p1 p2)
+  (< (rng-ipattern-get-index p1)
+     (rng-ipattern-get-index p2)))
+
+;;; Name classes
+
+(defsubst rng-name-class-contains (nc nm)
+  (if (consp nc)
+      (equal nm nc)
+    (rng-name-class-contains1 nc nm)))
+
+(defun rng-name-class-contains1 (nc nm)
+  (let ((type (aref nc 0)))
+    (cond ((eq type 'any-name) t)
+         ((eq type 'any-name-except)
+          (not (rng-name-class-contains (aref nc 1) nm)))
+         ((eq type 'ns-name)
+          (eq (car nm) (aref nc 1)))
+         ((eq type 'ns-name-except)
+          (and (eq (car nm) (aref nc 1))
+               (not (rng-name-class-contains (aref nc 2) nm))))
+         ((eq type 'choice)
+          (let ((choices (aref nc 1))
+                (ret nil))
+            (while choices
+              (if (rng-name-class-contains (car choices) nm)
+                  (progn
+                    (setq choices nil)
+                    (setq ret t))
+                (setq choices (cdr choices))))
+            ret)))))
+
+(defun rng-name-class-possible-names (nc accum)
+  "Return a list of possible names that nameclass NC can match.
+
+Each possible name should be returned as a (NAMESPACE . LOCAL-NAME)
+pair, where NAMESPACE is a symbol or nil and LOCAL-NAME is a string.
+nil for NAMESPACE matches the absent namespace.  ACCUM is a list of
+names which should be appended to the returned list. The returned list
+may contain duplicates."
+  (if (consp nc)
+      (cons nc accum)
+    (when (eq (aref nc 0) 'choice)
+      (let ((members (aref nc 1)) member)
+       (while members
+         (setq member (car members))
+         (setq accum
+               (if (consp member)
+                   (cons member accum)
+                 (rng-name-class-possible-names member
+                                                accum)))
+         (setq members (cdr members)))))
+    accum))
+
+;;; Debugging utilities
+
+(defun rng-ipattern-to-string (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (concat (rng-ipattern-to-string
+                   (rng-ipattern-get-child ipattern))
+                  " </> "
+                  (rng-ipattern-to-string
+                   (rng-ipattern-get-after ipattern))))
+         ((eq type 'element)
+          (concat "element "
+                  (rng-name-class-to-string
+                   (rng-ipattern-get-name-class ipattern))
+                  ;; we can get cycles with elements so don't print it out
+                  " {...}"))
+         ((eq type 'attribute)
+          (concat "attribute "
+                  (rng-name-class-to-string
+                   (rng-ipattern-get-name-class ipattern))
+                  " { "
+                  (rng-ipattern-to-string
+                   (rng-ipattern-get-child ipattern))
+                  " } "))
+         ((eq type 'empty) "empty")
+         ((eq type 'text) "text")
+         ((eq type 'not-allowed) "notAllowed")
+         ((eq type 'one-or-more)
+          (concat (rng-ipattern-to-string
+                   (rng-ipattern-get-child ipattern))
+                  "+"))
+         ((eq type 'choice)
+          (concat "("
+                  (mapconcat 'rng-ipattern-to-string
+                             (rng-ipattern-get-child ipattern)
+                             " | ")
+                  ")"))
+         ((eq type 'group)
+          (concat "("
+                  (mapconcat 'rng-ipattern-to-string
+                             (rng-ipattern-get-child ipattern)
+                             ", ")
+                  ")"))
+         ((eq type 'interleave)
+          (concat "("
+                  (mapconcat 'rng-ipattern-to-string
+                             (rng-ipattern-get-child ipattern)
+                             " & ")
+                  ")"))
+         (t (symbol-name type)))))
+
+(defun rng-name-class-to-string (nc)
+  (if (consp nc)
+      (cdr nc)
+    (let ((type (aref nc 0)))
+      (cond ((eq type 'choice)
+            (mapconcat 'rng-name-class-to-string
+                       (aref nc 1)
+                       "|"))
+           (t (concat (symbol-name type) "*"))))))
+
+
+;;; Compiling
+
+(defun rng-compile-maybe-init ()
+  (unless rng-compile-table
+    (setq rng-compile-table (make-hash-table :test 'eq))))
+
+(defun rng-compile-clear ()
+  (when rng-compile-table
+    (clrhash rng-compile-table)))
+
+(defun rng-compile (pattern)
+  (or (gethash pattern rng-compile-table)
+      (let ((ipattern (apply (get (car pattern) 'rng-compile)
+                            (cdr pattern))))
+       (puthash pattern ipattern rng-compile-table)
+       ipattern)))
+
+(put 'empty 'rng-compile 'rng-compile-empty)
+(put 'text 'rng-compile 'rng-compile-text)
+(put 'not-allowed 'rng-compile 'rng-compile-not-allowed)
+(put 'element 'rng-compile 'rng-compile-element)
+(put 'attribute 'rng-compile 'rng-compile-attribute)
+(put 'choice 'rng-compile 'rng-compile-choice)
+(put 'optional 'rng-compile 'rng-compile-optional)
+(put 'group 'rng-compile 'rng-compile-group)
+(put 'interleave 'rng-compile 'rng-compile-interleave)
+(put 'ref 'rng-compile 'rng-compile-ref)
+(put 'one-or-more 'rng-compile 'rng-compile-one-or-more)
+(put 'zero-or-more 'rng-compile 'rng-compile-zero-or-more)
+(put 'mixed 'rng-compile 'rng-compile-mixed)
+(put 'data 'rng-compile 'rng-compile-data)
+(put 'data-except 'rng-compile 'rng-compile-data-except)
+(put 'value 'rng-compile 'rng-compile-value)
+(put 'list 'rng-compile 'rng-compile-list)
+
+(defun rng-compile-not-allowed () rng-not-allowed-ipattern)
+(defun rng-compile-empty () rng-empty-ipattern)
+(defun rng-compile-text () rng-text-ipattern)
+
+(defun rng-compile-element (name-class pattern)
+  ;; don't intern
+  (rng-make-ipattern 'element
+                    (rng-gen-ipattern-index)
+                    (rng-compile-name-class name-class)
+                    pattern            ; compile lazily
+                    nil))
+
+(defun rng-element-get-child (element)
+  (let ((tem (rng-ipattern-get-child element)))
+    (if (vectorp tem)
+       tem
+      (rng-ipattern-set-child element (rng-compile tem)))))
+
+(defun rng-compile-attribute (name-class pattern)
+  (rng-intern-attribute (rng-compile-name-class name-class)
+                       (rng-compile pattern)))
+
+(defun rng-compile-ref (pattern name)
+  (and (memq pattern rng-being-compiled)
+       (rng-compile-error "Reference loop on symbol %s" name))
+  (setq rng-being-compiled
+       (cons pattern rng-being-compiled))
+  (unwind-protect
+      (rng-compile pattern)
+    (setq rng-being-compiled
+         (cdr rng-being-compiled))))
+          
+(defun rng-compile-one-or-more (pattern)
+  (rng-intern-one-or-more (rng-compile pattern)))
+
+(defun rng-compile-zero-or-more (pattern)
+  (rng-intern-optional
+   (rng-intern-one-or-more (rng-compile pattern))))
+
+(defun rng-compile-optional (pattern)
+  (rng-intern-optional (rng-compile pattern)))
+
+(defun rng-compile-mixed (pattern)
+  (rng-intern-interleave (cons rng-text-ipattern
+                              (list (rng-compile pattern)))))
+
+(defun rng-compile-list (pattern)
+  (rng-intern-list (rng-compile pattern)))
+
+(defun rng-compile-choice (&rest patterns)
+  (rng-intern-choice (mapcar 'rng-compile patterns)))
+
+(defun rng-compile-group (&rest patterns)
+  (rng-intern-group (mapcar 'rng-compile patterns)))
+
+(defun rng-compile-interleave (&rest patterns)
+  (rng-intern-interleave (mapcar 'rng-compile patterns)))
+
+(defun rng-compile-dt (name params)
+  (let ((rng-dt-error-reporter 'rng-compile-error))
+    (funcall (let ((uri (car name)))
+              (or (get uri 'rng-dt-compile)
+                  (rng-compile-error "Unknown datatype library %s" uri)))
+            (cdr name)
+            params)))
+
+(defun rng-compile-data (name params)
+  (let ((dt (rng-compile-dt name params)))
+    (rng-intern-data (cdr dt) (car dt))))
+
+(defun rng-compile-data-except (name params pattern)
+  (rng-intern-data-except (cdr (rng-compile-dt name params))
+                         (rng-compile pattern)))
+
+(defun rng-compile-value (name str context)
+  (let* ((dt (cdr (rng-compile-dt name '())))
+        (rng-dt-namespace-context-getter (list 'identity context))
+        (obj (rng-dt-make-value dt str)))
+    (if obj
+       (rng-intern-value dt obj)
+      (rng-compile-error "Value %s is not a valid instance of the datatype %s"
+                        str
+                        name))))
+      
+(defun rng-compile-name-class (nc)
+  (let ((type (car nc)))
+    (cond ((eq type 'name) (nth 1 nc))
+         ((eq type 'any-name) [any-name])
+         ((eq type 'any-name-except)
+          (vector 'any-name-except
+                  (rng-compile-name-class (nth 1 nc))))
+         ((eq type 'ns-name)
+          (vector 'ns-name (nth 1 nc)))
+         ((eq type 'ns-name-except)
+          (vector 'ns-name-except
+                  (nth 1 nc)
+                  (rng-compile-name-class (nth 2 nc))))
+         ((eq type 'choice)
+          (vector 'choice
+                  (mapcar 'rng-compile-name-class (cdr nc))))
+         (t (error "Bad name-class type %s" type)))))
+
+;;; Searching patterns
+
+;; We write this non-recursively to avoid hitting max-lisp-eval-depth
+;; on large schemas.
+
+(defun rng-map-element-attribute (function pattern accum &rest args)
+  (let ((searched (make-hash-table :test 'eq))
+       type todo patterns)
+    (while (progn
+            (setq type (car pattern))
+            (cond ((memq type '(element attribute))
+                   (setq accum
+                         (apply function
+                                (cons pattern
+                                      (cons accum args))))
+                   (setq pattern (nth 2 pattern)))
+                  ((eq type 'ref)
+                   (setq pattern (nth 1 pattern))
+                   (if (gethash pattern searched)
+                       (setq pattern nil)
+                     (puthash pattern t searched)))
+                  ((memq type '(choice group interleave))
+                   (setq todo (cons (cdr pattern) todo))
+                   (setq pattern nil))
+                  ((memq type '(one-or-more
+                                zero-or-more
+                                optional
+                                mixed))
+                   (setq pattern (nth 1 pattern)))
+                  (t (setq pattern nil)))
+            (cond (pattern)
+                  (patterns
+                   (setq pattern (car patterns))
+                   (setq patterns (cdr patterns))
+                   t)
+                  (todo
+                   (setq patterns (car todo))
+                   (setq todo (cdr todo))
+                   (setq pattern (car patterns))
+                   (setq patterns (cdr patterns))
+                   t))))
+    accum))
+
+(defun rng-find-element-content-pattern (pattern accum name)
+  (if (and (eq (car pattern) 'element)
+          (rng-search-name name (nth 1 pattern)))
+      (cons (rng-compile (nth 2 pattern)) accum)
+    accum))
+
+(defun rng-search-name (name nc)
+  (let ((type (car nc)))
+    (cond ((eq type 'name)
+          (equal (cadr nc) name))
+         ((eq type 'choice)
+          (let ((choices (cdr nc))
+                (found nil))
+            (while (and choices (not found))
+              (if (rng-search-name name (car choices))
+                  (setq found t)
+                (setq choices (cdr choices))))
+            found))
+         (t nil))))
+
+(defun rng-find-name-class-uris (nc accum)
+  (let ((type (car nc)))
+    (cond ((eq type 'name)
+          (rng-accum-namespace-uri (car (nth 1 nc)) accum))
+         ((memq type '(ns-name ns-name-except))
+          (rng-accum-namespace-uri (nth 1 nc) accum))
+         ((eq type 'choice)
+          (let ((choices (cdr nc)))
+            (while choices
+              (setq accum
+                    (rng-find-name-class-uris (car choices) accum))
+              (setq choices (cdr choices))))
+          accum)
+         (t accum))))
+
+(defun rng-accum-namespace-uri (ns accum)
+  (if (and ns (not (memq ns accum)))
+      (cons ns accum)
+    accum))
+
+;;; Derivatives
+
+(defun rng-ipattern-text-typed-p (ipattern)
+  (let ((memo (rng-ipattern-get-memo-text-typed ipattern)))
+    (if (eq memo 'unknown)
+       (rng-ipattern-set-memo-text-typed
+        ipattern
+        (rng-ipattern-compute-text-typed-p ipattern))
+      memo)))
+
+(defun rng-ipattern-compute-text-typed-p (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (let ((cur (rng-ipattern-get-child ipattern))
+                (ret nil))
+            (while (and cur (not ret))
+              (if (rng-ipattern-text-typed-p (car cur))
+                  (setq ret t)
+                (setq cur (cdr cur))))
+            ret))
+         ((eq type 'group)
+          (let ((cur (rng-ipattern-get-child ipattern))
+                (ret nil)
+                member)
+            (while (and cur (not ret))
+              (setq member (car cur))
+              (if (rng-ipattern-text-typed-p member)
+                  (setq ret t))
+              (setq cur
+                    (and (rng-ipattern-get-nullable member)
+                         (cdr cur))))
+            ret))
+         ((eq type 'after)
+          (rng-ipattern-text-typed-p (rng-ipattern-get-child ipattern)))
+         (t (and (memq type '(value list data data-except)) t)))))
+                                                  
+(defun rng-start-tag-open-deriv (ipattern nm)
+  (or (rng-memo-map-get
+       nm
+       (rng-ipattern-get-memo-map-start-tag-open-deriv ipattern))
+      (rng-ipattern-memo-start-tag-open-deriv
+       ipattern
+       nm 
+       (rng-compute-start-tag-open-deriv ipattern nm))))
+                                                            
+(defun rng-ipattern-memo-start-tag-open-deriv (ipattern nm deriv)
+  (or (memq ipattern rng-const-ipatterns)
+      (rng-ipattern-set-memo-map-start-tag-open-deriv
+       ipattern
+       (rng-memo-map-add nm
+                        deriv
+                        (rng-ipattern-get-memo-map-start-tag-open-deriv
+                         ipattern))))
+  deriv)
+
+(defun rng-compute-start-tag-open-deriv (ipattern nm)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-transform-choice `(lambda (p)
+                                   (rng-start-tag-open-deriv p ',nm))
+                                ipattern))
+         ((eq type 'element)
+          (if (rng-name-class-contains
+               (rng-ipattern-get-name-class ipattern)
+               nm)
+              (rng-intern-after (rng-element-get-child ipattern)
+                                rng-empty-ipattern)
+            rng-not-allowed-ipattern))
+         ((eq type 'group)
+          (rng-transform-group-nullable
+           `(lambda (p) (rng-start-tag-open-deriv p ',nm))
+           'rng-cons-group-after 
+           ipattern))
+         ((eq type 'interleave)
+          (rng-transform-interleave-single
+           `(lambda (p) (rng-start-tag-open-deriv p ',nm))
+           'rng-subst-interleave-after
+           ipattern))
+         ((eq type 'one-or-more)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-group (list p ,(rng-intern-optional ipattern))))
+           (rng-start-tag-open-deriv (rng-ipattern-get-child ipattern)
+                                     nm)))
+         ((eq type 'after)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-after p
+                                ,(rng-ipattern-get-after ipattern)))
+           (rng-start-tag-open-deriv (rng-ipattern-get-child ipattern)
+                                     nm)))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-start-attribute-deriv (ipattern nm)
+  (or (rng-memo-map-get
+       nm
+       (rng-ipattern-get-memo-map-start-attribute-deriv ipattern))
+      (rng-ipattern-memo-start-attribute-deriv
+       ipattern
+       nm 
+       (rng-compute-start-attribute-deriv ipattern nm))))
+                                                            
+(defun rng-ipattern-memo-start-attribute-deriv (ipattern nm deriv)
+  (or (memq ipattern rng-const-ipatterns)
+      (rng-ipattern-set-memo-map-start-attribute-deriv
+       ipattern
+       (rng-memo-map-add
+       nm
+       deriv
+       (rng-ipattern-get-memo-map-start-attribute-deriv ipattern))))
+  deriv)
+
+(defun rng-compute-start-attribute-deriv (ipattern nm)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-transform-choice `(lambda (p)
+                                   (rng-start-attribute-deriv p ',nm))
+                                ipattern))
+         ((eq type 'attribute)
+          (if (rng-name-class-contains
+               (rng-ipattern-get-name-class ipattern)
+               nm)
+              (rng-intern-after (rng-ipattern-get-child ipattern)
+                                rng-empty-ipattern)
+            rng-not-allowed-ipattern))
+         ((eq type 'group)
+          (rng-transform-interleave-single
+           `(lambda (p) (rng-start-attribute-deriv p ',nm))
+           'rng-subst-group-after 
+           ipattern))
+         ((eq type 'interleave)
+          (rng-transform-interleave-single
+           `(lambda (p) (rng-start-attribute-deriv p ',nm))
+           'rng-subst-interleave-after
+           ipattern))
+         ((eq type 'one-or-more)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-group (list p ,(rng-intern-optional ipattern))))
+           (rng-start-attribute-deriv (rng-ipattern-get-child ipattern)
+                                      nm)))
+         ((eq type 'after)
+          (rng-apply-after
+           `(lambda (p)
+              (rng-intern-after p ,(rng-ipattern-get-after ipattern)))
+           (rng-start-attribute-deriv (rng-ipattern-get-child ipattern)
+                                      nm)))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-cons-group-after (x y)
+  (rng-apply-after `(lambda (p) (rng-intern-group (cons p ',y)))
+                  x))
+
+(defun rng-subst-group-after (new old list)
+  (rng-apply-after `(lambda (p)
+                     (rng-intern-group (rng-substq p ,old ',list)))
+                  new))
+
+(defun rng-subst-interleave-after (new old list)
+  (rng-apply-after `(lambda (p)
+                     (rng-intern-interleave (rng-substq p ,old ',list)))
+                  new))
+
+(defun rng-apply-after (f ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-intern-after
+           (rng-ipattern-get-child ipattern)
+           (funcall f
+                    (rng-ipattern-get-after ipattern))))
+         ((eq type 'choice)
+          (rng-transform-choice `(lambda (x) (rng-apply-after ,f x))
+                                ipattern))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-start-tag-close-deriv (ipattern)
+  (or (rng-ipattern-get-memo-start-tag-close-deriv ipattern)
+      (rng-ipattern-set-memo-start-tag-close-deriv
+       ipattern
+       (rng-compute-start-tag-close-deriv ipattern))))
+
+(defconst rng-transform-map
+  '((choice . rng-transform-choice)
+    (group . rng-transform-group)
+    (interleave . rng-transform-interleave)
+    (one-or-more . rng-transform-one-or-more)
+    (after . rng-transform-after-child)))
+
+(defun rng-compute-start-tag-close-deriv (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern)))
+    (if (eq type 'attribute)
+       rng-not-allowed-ipattern
+      (let ((transform (assq type rng-transform-map)))
+       (if transform
+           (funcall (cdr transform)
+                    'rng-start-tag-close-deriv
+                    ipattern)
+         ipattern)))))
+
+(defun rng-ignore-attributes-deriv (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern)))
+    (if (eq type 'attribute)
+       rng-empty-ipattern
+      (let ((transform (assq type rng-transform-map)))
+       (if transform
+           (funcall (cdr transform)
+                    'rng-ignore-attributes-deriv
+                    ipattern)
+         ipattern)))))
+  
+(defun rng-text-only-deriv (ipattern)
+  (or (rng-ipattern-get-memo-text-only-deriv ipattern)
+      (rng-ipattern-set-memo-text-only-deriv
+       ipattern
+       (rng-compute-text-only-deriv ipattern))))
+
+(defun rng-compute-text-only-deriv (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern)))
+    (if (eq type 'element)
+       rng-not-allowed-ipattern
+      (let ((transform (assq type
+                            '((choice . rng-transform-choice)
+                              (group . rng-transform-group)
+                              (interleave . rng-transform-interleave)
+                              (one-or-more . rng-transform-one-or-more)
+                              (after . rng-transform-after-child)))))
+       (if transform
+           (funcall (cdr transform)
+                    'rng-text-only-deriv
+                    ipattern)
+         ipattern)))))
+
+(defun rng-mixed-text-deriv (ipattern)
+  (or (rng-ipattern-get-memo-mixed-text-deriv ipattern)
+      (rng-ipattern-set-memo-mixed-text-deriv
+       ipattern
+       (rng-compute-mixed-text-deriv ipattern))))
+
+(defun rng-compute-mixed-text-deriv (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'text) ipattern)
+         ((eq type 'after)
+          (rng-transform-after-child 'rng-mixed-text-deriv
+                                     ipattern))
+         ((eq type 'choice)
+          (rng-transform-choice 'rng-mixed-text-deriv
+                                ipattern))
+         ((eq type 'one-or-more)
+          (rng-intern-group
+           (list (rng-mixed-text-deriv
+                  (rng-ipattern-get-child ipattern))
+                 (rng-intern-optional ipattern))))
+         ((eq type 'group)
+          (rng-transform-group-nullable
+           'rng-mixed-text-deriv
+           (lambda (x y) (rng-intern-group (cons x y)))
+           ipattern))
+         ((eq type 'interleave)
+          (rng-transform-interleave-single
+           'rng-mixed-text-deriv
+           (lambda (new old list) (rng-intern-interleave
+                                   (rng-substq new old list)))
+           ipattern))
+         ((and (eq type 'data)
+               (not (rng-ipattern-get-memo-text-typed ipattern)))
+          ipattern)
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-end-tag-deriv (ipattern)
+  (or (rng-ipattern-get-memo-end-tag-deriv ipattern)
+      (rng-ipattern-set-memo-end-tag-deriv
+       ipattern
+       (rng-compute-end-tag-deriv ipattern))))
+
+(defun rng-compute-end-tag-deriv (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-intern-choice
+           (mapcar 'rng-end-tag-deriv
+                   (rng-ipattern-get-child ipattern))))
+         ((eq type 'after)
+          (if (rng-ipattern-get-nullable
+               (rng-ipattern-get-child ipattern))
+              (rng-ipattern-get-after ipattern)
+            rng-not-allowed-ipattern))
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-data-deriv (ipattern value)
+  (or (rng-memo-map-get value
+                       (rng-ipattern-get-memo-map-data-deriv ipattern))
+      (and (rng-memo-map-get
+           (cons value (rng-namespace-context-get-no-trace))
+           (rng-ipattern-get-memo-map-data-deriv ipattern))
+          (rng-memo-map-get
+           (cons value (apply (car rng-dt-namespace-context-getter)
+                              (cdr rng-dt-namespace-context-getter)))
+           (rng-ipattern-get-memo-map-data-deriv ipattern)))
+      (let* ((used-context (vector nil))
+            (rng-dt-namespace-context-getter
+             (cons 'rng-namespace-context-tracer
+                   (cons used-context
+                         rng-dt-namespace-context-getter)))
+            (deriv (rng-compute-data-deriv ipattern value)))
+       (rng-ipattern-memo-data-deriv ipattern
+                                     value
+                                     (aref used-context 0)
+                                     deriv))))
+
+(defun rng-namespace-context-tracer (used getter &rest args)
+  (let ((context (apply getter args)))
+    (aset used 0 context)
+    context))
+
+(defun rng-namespace-context-get-no-trace ()
+  (let ((tem rng-dt-namespace-context-getter))
+    (while (and tem (eq (car tem) 'rng-namespace-context-tracer))
+      (setq tem (cddr tem)))
+    (apply (car tem) (cdr tem))))
+
+(defconst rng-memo-data-deriv-max-length 80
+  "Don't memoize data-derivs for values longer than this.")
+
+(defun rng-ipattern-memo-data-deriv (ipattern value context deriv)
+  (or (memq ipattern rng-const-ipatterns)
+      (> (length value) rng-memo-data-deriv-max-length)
+      (rng-ipattern-set-memo-map-data-deriv
+       ipattern
+       (rng-memo-map-add (if context (cons value context) value)
+                        deriv
+                        (rng-ipattern-get-memo-map-data-deriv ipattern)
+                        t)))
+  deriv)
+
+(defun rng-compute-data-deriv (ipattern value)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'text) ipattern)
+         ((eq type 'choice)
+          (rng-transform-choice `(lambda (p) (rng-data-deriv p ,value))
+                                ipattern))
+         ((eq type 'group)
+          (rng-transform-group-nullable
+           `(lambda (p) (rng-data-deriv p ,value))
+           (lambda (x y) (rng-intern-group (cons x y)))
+           ipattern))
+         ((eq type 'one-or-more)
+          (rng-intern-group (list (rng-data-deriv
+                                   (rng-ipattern-get-child ipattern)
+                                   value)
+                                  (rng-intern-optional ipattern))))
+         ((eq type 'after)
+          (let ((child (rng-ipattern-get-child ipattern)))
+            (if (or (rng-ipattern-get-nullable
+                     (rng-data-deriv child value))
+                    (and (rng-ipattern-get-nullable child)
+                         (rng-blank-p value)))
+                (rng-ipattern-get-after ipattern)
+              rng-not-allowed-ipattern)))
+         ((eq type 'data)
+          (if (rng-dt-make-value (rng-ipattern-get-datatype ipattern)
+                                 value)
+              rng-empty-ipattern
+            rng-not-allowed-ipattern))
+         ((eq type 'data-except)
+          (if (and (rng-dt-make-value (rng-ipattern-get-datatype ipattern)
+                                      value)
+                   (not (rng-ipattern-get-nullable
+                         (rng-data-deriv
+                          (rng-ipattern-get-child ipattern)
+                          value))))
+              rng-empty-ipattern
+            rng-not-allowed-ipattern))
+         ((eq type 'value)
+          (if (equal (rng-dt-make-value (rng-ipattern-get-datatype ipattern)
+                                        value)
+                     (rng-ipattern-get-value-object ipattern))
+              rng-empty-ipattern
+            rng-not-allowed-ipattern))
+         ((eq type 'list)
+          (let ((tokens (split-string value))
+                (state (rng-ipattern-get-child ipattern)))
+            (while (and tokens
+                        (not (eq state rng-not-allowed-ipattern)))
+              (setq state (rng-data-deriv state (car tokens)))
+              (setq tokens (cdr tokens)))
+            (if (rng-ipattern-get-nullable state)
+                rng-empty-ipattern
+              rng-not-allowed-ipattern)))
+         ;; don't think interleave can occur
+         ;; since we do text-only-deriv first
+         (t rng-not-allowed-ipattern))))
+
+(defun rng-transform-multi (f ipattern interner)
+  (let* ((members (rng-ipattern-get-child ipattern))
+        (transformed (mapcar f members)))
+    (if (rng-members-eq members transformed)
+       ipattern
+      (funcall interner transformed))))
+
+(defun rng-transform-choice (f ipattern)
+  (rng-transform-multi f ipattern 'rng-intern-choice))
+
+(defun rng-transform-group (f ipattern)
+  (rng-transform-multi f ipattern 'rng-intern-group))
+
+(defun rng-transform-interleave (f ipattern)
+  (rng-transform-multi f ipattern 'rng-intern-interleave))
+
+(defun rng-transform-one-or-more (f ipattern)
+  (let* ((child (rng-ipattern-get-child ipattern))
+        (transformed (funcall f child)))
+    (if (eq child transformed)
+       ipattern
+      (rng-intern-one-or-more transformed))))
+
+(defun rng-transform-after-child (f ipattern)
+  (let* ((child (rng-ipattern-get-child ipattern))
+        (transformed (funcall f child)))
+    (if (eq child transformed)
+       ipattern
+      (rng-intern-after transformed
+                       (rng-ipattern-get-after ipattern)))))
+
+(defun rng-transform-interleave-single (f subster ipattern)
+  (let ((children (rng-ipattern-get-child ipattern))
+       found)
+    (while (and children (not found))
+      (let* ((child (car children))
+            (transformed (funcall f child)))
+       (if (eq transformed rng-not-allowed-ipattern)
+           (setq children (cdr children))
+         (setq found
+               (funcall subster
+                        transformed
+                        child
+                        (rng-ipattern-get-child ipattern))))))
+    (or found
+       rng-not-allowed-ipattern)))
+
+(defun rng-transform-group-nullable (f conser ipattern)
+  "Given a group x1,...,xn,y1,...,yn where the xs are all
+nullable and y1 isn't, return a choice
+  (conser f(x1) x2,...,xm,y1,...,yn)
+  |(conser f(x2) x3,...,xm,y1,...,yn)
+  |...
+  |(conser f(xm) y1,...,yn)
+  |(conser f(y1) y2,...,yn)"
+  (rng-intern-choice
+   (rng-transform-group-nullable-gen-choices
+    f
+    conser
+    (rng-ipattern-get-child ipattern))))
+
+(defun rng-transform-group-nullable-gen-choices (f conser members)
+  (let ((head (car members))
+       (tail (cdr members)))
+    (if tail
+       (cons (funcall conser (funcall f head) tail)
+             (if (rng-ipattern-get-nullable head)
+                 (rng-transform-group-nullable-gen-choices f conser tail)
+               nil))
+      (list (funcall f head)))))
+
+(defun rng-members-eq (list1 list2)
+  (while (and list1
+             list2
+             (eq (car list1) (car list2)))
+    (setq list1 (cdr list1))
+    (setq list2 (cdr list2)))
+  (and (null list1) (null list2)))
+    
+
+(defun rng-ipattern-after (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'choice)
+          (rng-transform-choice 'rng-ipattern-after ipattern))
+         ((eq type 'after)
+          (rng-ipattern-get-after ipattern))
+         ((eq  type 'not-allowed)
+          ipattern)
+         (t (error "Internal error in rng-ipattern-after: unexpected type %s" type)))))
+
+(defun rng-unknown-start-tag-open-deriv (ipattern)
+  (rng-intern-after (rng-compile rng-any-content) ipattern))
+
+(defun rng-ipattern-optionalize-elements (ipattern)
+  (let* ((type (rng-ipattern-get-type ipattern))
+        (transform (assq type rng-transform-map)))
+    (cond (transform
+          (funcall (cdr transform)
+                   'rng-ipattern-optionalize-elements
+                   ipattern))
+         ((eq type 'element)
+          (rng-intern-optional ipattern))
+         (t ipattern))))
+
+(defun rng-ipattern-empty-before-p (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (eq (rng-ipattern-get-child ipattern) rng-empty-ipattern))
+         ((eq type 'choice)
+          (let ((members (rng-ipattern-get-child ipattern))
+                (ret t))
+            (while (and members ret)
+              (or (rng-ipattern-empty-before-p (car members))
+                  (setq ret nil))
+              (setq members (cdr members)))
+            ret))
+         (t nil))))
+
+(defun rng-ipattern-possible-start-tags (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-possible-start-tags
+           (rng-ipattern-get-child ipattern)
+           accum))
+         ((memq type '(choice interleave))
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-start-tags (car members)
+                                                      accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'group)
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-start-tags (car members)
+                                                      accum))
+              (setq members
+                    (and (rng-ipattern-get-nullable (car members))
+                         (cdr members)))))
+          accum)
+         ((eq type 'element)
+          (if (eq (rng-element-get-child ipattern) rng-not-allowed-ipattern)
+              accum
+            (rng-name-class-possible-names
+             (rng-ipattern-get-name-class ipattern)
+             accum)))
+         ((eq type 'one-or-more)
+          (rng-ipattern-possible-start-tags
+           (rng-ipattern-get-child ipattern)
+           accum))
+         (t accum))))
+
+(defun rng-ipattern-start-tag-possible-p (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((memq type '(after one-or-more))
+          (rng-ipattern-start-tag-possible-p
+           (rng-ipattern-get-child ipattern)))
+         ((memq type '(choice interleave))
+          (let ((members (rng-ipattern-get-child ipattern))
+                (possible nil))
+            (while (and members (not possible))
+              (setq possible
+                    (rng-ipattern-start-tag-possible-p (car members)))
+              (setq members (cdr members)))
+            possible))
+         ((eq type 'group)
+          (let ((members (rng-ipattern-get-child ipattern))
+                (possible nil))
+            (while (and members (not possible))
+              (setq possible
+                    (rng-ipattern-start-tag-possible-p (car members)))
+              (setq members
+                    (and (rng-ipattern-get-nullable (car members))
+                         (cdr members))))
+            possible))
+         ((eq type 'element)
+          (not (eq (rng-element-get-child ipattern)
+                   rng-not-allowed-ipattern)))
+         (t nil))))
+
+(defun rng-ipattern-possible-attributes (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-possible-attributes (rng-ipattern-get-child ipattern)
+                                            accum))
+         ((memq type '(choice interleave group))
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-attributes (car members)
+                                                      accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'attribute)
+          (rng-name-class-possible-names
+           (rng-ipattern-get-name-class ipattern)
+           accum))
+         ((eq type 'one-or-more)
+          (rng-ipattern-possible-attributes
+           (rng-ipattern-get-child ipattern)
+           accum))
+         (t accum))))
+
+(defun rng-ipattern-possible-values (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-possible-values (rng-ipattern-get-child ipattern)
+                                        accum))
+         ((eq type 'choice)
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-possible-values (car members)
+                                                  accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'value)
+          (let ((value-object (rng-ipattern-get-value-object ipattern)))
+            (if (stringp value-object)
+                (cons value-object accum)
+              accum)))
+         (t accum))))
+
+(defun rng-ipattern-required-element (ipattern)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((memq type '(after one-or-more))
+          (rng-ipattern-required-element (rng-ipattern-get-child ipattern)))
+         ((eq type 'choice)
+          (let* ((members (rng-ipattern-get-child ipattern))
+                 (required (rng-ipattern-required-element (car members))))
+            (while (and required
+                        (setq members (cdr members)))
+              (unless (equal required
+                             (rng-ipattern-required-element (car members)))
+                  (setq required nil)))
+            required))
+         ((eq type 'group)
+          (let ((members (rng-ipattern-get-child ipattern))
+                required)
+            (while (and (not (setq required
+                                   (rng-ipattern-required-element
+                                    (car members))))
+                        (rng-ipattern-get-nullable (car members))
+                        (setq members (cdr members))))
+            required))
+         ((eq type 'interleave)
+          (let ((members (rng-ipattern-get-child ipattern))
+                required)
+            (while members
+              (let ((tem (rng-ipattern-required-element (car members))))
+                (cond ((not tem)
+                       (setq members (cdr members)))
+                      ((not required)
+                       (setq required tem)
+                       (setq members (cdr members)))
+                      ((equal required tem)
+                       (setq members (cdr members)))
+                      (t
+                       (setq required nil)
+                       (setq members nil)))))
+            required))
+         ((eq type 'element)
+          (let ((nc (rng-ipattern-get-name-class ipattern)))
+            (and (consp nc)
+                 (not (eq (rng-element-get-child ipattern)
+                          rng-not-allowed-ipattern))
+                 nc))))))
+
+(defun rng-ipattern-required-attributes (ipattern accum)
+  (let ((type (rng-ipattern-get-type ipattern)))
+    (cond ((eq type 'after)
+          (rng-ipattern-required-attributes (rng-ipattern-get-child ipattern)
+                                            accum))
+         ((memq type '(interleave group))
+          (let ((members (rng-ipattern-get-child ipattern)))
+            (while members
+              (setq accum
+                    (rng-ipattern-required-attributes (car members)
+                                                      accum))
+              (setq members (cdr members))))
+          accum)
+         ((eq type 'choice)
+          (let ((members (rng-ipattern-get-child ipattern))
+                in-all in-this new-in-all)
+            (setq in-all
+                  (rng-ipattern-required-attributes (car members)
+                                                    nil))
+            (while (and in-all (setq members (cdr members)))
+              (setq in-this
+                    (rng-ipattern-required-attributes (car members) nil))
+              (setq new-in-all nil)
+              (while in-this
+                (when (member (car in-this) in-all)
+                  (setq new-in-all
+                        (cons (car in-this) new-in-all)))
+                (setq in-this (cdr in-this)))
+              (setq in-all new-in-all))
+            (append in-all accum)))
+         ((eq type 'attribute)
+          (let ((nc (rng-ipattern-get-name-class ipattern)))
+            (if (consp nc)
+                (cons nc accum)
+              accum)))
+         ((eq type 'one-or-more)
+          (rng-ipattern-required-attributes (rng-ipattern-get-child ipattern)
+                                            accum))
+         (t accum))))
+
+(defun rng-compile-error (&rest args)
+  (signal 'rng-compile-error
+         (list (apply 'format args))))
+
+(put 'rng-compile-error
+     'error-conditions
+     '(error rng-error rng-compile-error))
+
+(put 'rng-compile-error
+     'error-message
+     "Incorrect schema")
+
+
+;;; External API
+
+(defsubst rng-match-state () rng-match-state)
+
+(defsubst rng-set-match-state (state)
+  (setq rng-match-state state))
+      
+(defsubst rng-match-state-equal (state)
+  (eq state rng-match-state))
+
+(defun rng-schema-changed ()
+  (rng-ipattern-clear)
+  (rng-compile-clear))
+
+(defun rng-match-init-buffer ()
+  (make-local-variable 'rng-compile-table)
+  (make-local-variable 'rng-ipattern-table)
+  (make-local-variable 'rng-last-ipattern-index))
+
+(defun rng-match-start-document ()
+  (rng-ipattern-maybe-init)
+  (rng-compile-maybe-init)
+  (add-hook 'rng-schema-change-hook 'rng-schema-changed nil t)
+  (setq rng-match-state (rng-compile rng-current-schema)))
+
+(defun rng-match-start-tag-open (name)
+  (rng-update-match-state (rng-start-tag-open-deriv rng-match-state
+                                                   name)))
+
+(defun rng-match-attribute-name (name)
+  (rng-update-match-state (rng-start-attribute-deriv rng-match-state
+                                                    name)))
+
+(defun rng-match-attribute-value (value)
+  (rng-update-match-state (rng-data-deriv rng-match-state
+                                         value)))
+
+(defun rng-match-element-value (value)
+  (and (rng-update-match-state (rng-text-only-deriv rng-match-state))
+       (rng-update-match-state (rng-data-deriv rng-match-state
+                                              value))))
+
+(defun rng-match-start-tag-close ()
+  (rng-update-match-state (rng-start-tag-close-deriv rng-match-state)))
+
+(defun rng-match-mixed-text ()
+  (rng-update-match-state (rng-mixed-text-deriv rng-match-state)))
+
+(defun rng-match-end-tag ()
+  (rng-update-match-state (rng-end-tag-deriv rng-match-state)))
+
+(defun rng-match-after ()
+  (rng-update-match-state
+   (rng-ipattern-after rng-match-state)))
+
+(defun rng-match-out-of-context-start-tag-open (name)
+  (let* ((found (rng-map-element-attribute 'rng-find-element-content-pattern
+                                          rng-current-schema
+                                          nil
+                                          name))
+        (content-pattern (if found
+                             (rng-intern-choice found)
+                           rng-not-allowed-ipattern)))
+    (rng-update-match-state
+     (rng-intern-after content-pattern rng-match-state))))
+
+(defun rng-match-possible-namespace-uris ()
+  "Return a list of all the namespace URIs used in the current schema.
+The absent URI is not included, so the result is always list of symbols."
+  (rng-map-element-attribute (lambda (pattern accum)
+                              (rng-find-name-class-uris (nth 1 pattern)
+                                                        accum))
+                            rng-current-schema
+                            nil))
+
+(defun rng-match-unknown-start-tag-open ()
+  (rng-update-match-state
+   (rng-unknown-start-tag-open-deriv rng-match-state)))
+
+(defun rng-match-optionalize-elements ()
+  (rng-update-match-state
+   (rng-ipattern-optionalize-elements rng-match-state)))
+
+(defun rng-match-ignore-attributes ()
+  (rng-update-match-state
+   (rng-ignore-attributes-deriv rng-match-state)))
+
+(defun rng-match-text-typed-p ()
+  (rng-ipattern-text-typed-p rng-match-state))
+
+(defun rng-match-empty-content ()
+  (if (rng-match-text-typed-p)
+      (rng-match-element-value "")
+    (rng-match-end-tag)))
+
+(defun rng-match-empty-before-p ()
+  "Return non-nil if what can be matched before an end-tag is empty.
+In other words, return non-nil if the pattern for what can be matched
+for an end-tag is equivalent to empty."
+  (rng-ipattern-empty-before-p rng-match-state))
+
+(defun rng-match-infer-start-tag-namespace (local-name)
+  (let ((ncs (rng-ipattern-possible-start-tags rng-match-state nil))
+       (nc nil)
+       (ns nil))
+    (while ncs
+      (setq nc (car ncs))
+      (if (and (equal (cdr nc) local-name)
+              (symbolp (car nc)))
+         (cond ((not ns)
+                ;; first possible namespace
+                (setq ns (car nc))
+                (setq ncs (cdr ncs)))
+               ((equal ns (car nc))
+                ;; same as first namespace
+                (setq ncs (cdr ncs)))
+               (t
+                ;; more than one possible namespace
+                (setq ns nil)
+                (setq ncs nil)))
+       (setq ncs (cdr ncs))))
+    ns))
+
+(defun rng-match-nullable-p ()
+  (rng-ipattern-get-nullable rng-match-state))
+
+(defun rng-match-possible-start-tag-names ()
+  "Return a list of possible names that would be valid for start-tags.
+
+Each possible name is returned as a (NAMESPACE . LOCAL-NAME) pair,
+where NAMESPACE is a symbol or nil (meaning the absent namespace) and
+LOCAL-NAME is a string. The returned list may contain duplicates."
+  (rng-ipattern-possible-start-tags rng-match-state nil))
+
+;; This is no longer used.  It might be useful so leave it in for now.
+(defun rng-match-start-tag-possible-p ()
+  "Return non-nil if a start-tag is possible."
+  (rng-ipattern-start-tag-possible-p rng-match-state))
+
+(defun rng-match-possible-attribute-names ()
+  "Return a list of possible names that would be valid for attributes.
+
+See the function `rng-match-possible-start-tag-names' for
+more information."
+  (rng-ipattern-possible-attributes rng-match-state nil))
+
+(defun rng-match-possible-value-strings ()
+  "Return a list of strings that would be valid as content.
+The list may contain duplicates. Typically, the list will not
+be exhaustive."
+  (rng-ipattern-possible-values rng-match-state nil))
+
+(defun rng-match-required-element-name ()
+  "Return the name of an element which must occur, or nil if none."
+  (rng-ipattern-required-element rng-match-state))
+
+(defun rng-match-required-attribute-names ()
+  "Return a list of names of attributes which must all occur."
+  (rng-ipattern-required-attributes rng-match-state nil))
+
+(defmacro rng-match-save (&rest body)
+  (let ((state (make-symbol "state")))
+    `(let ((,state rng-match-state))
+       (unwind-protect
+          (progn ,@body)
+        (setq rng-match-state ,state)))))
+
+(put 'rng-match-save 'lisp-indent-function 0)
+(def-edebug-spec rng-match-save t)
+
+(defmacro rng-match-with-schema (schema &rest body)
+  `(let ((rng-current-schema ,schema)
+        rng-match-state
+        rng-compile-table
+        rng-ipattern-table
+        rng-last-ipattern-index)
+     (rng-ipattern-maybe-init)
+     (rng-compile-maybe-init)
+     (setq rng-match-state (rng-compile rng-current-schema))
+     ,@body))
+
+(put 'rng-match-with-schema 'lisp-indent-function 1)
+(def-edebug-spec rng-match-with-schema t)
+
+(provide 'rng-match)
+    
+;; arch-tag: c8c50733-edcf-49fb-85e2-0aac8749b7f8
+;;; rng-match.el ends here
diff --git a/lisp/nxml/rng-nxml.el b/lisp/nxml/rng-nxml.el
new file mode 100644 (file)
index 0000000..0e65dc0
--- /dev/null
@@ -0,0 +1,594 @@
+;;; rng-nxml.el --- make nxml-mode take advantage of rng-validate-mode
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'easymenu)
+(require 'xmltok)
+(require 'nxml-util)
+(require 'nxml-ns)
+(require 'rng-match)
+(require 'rng-util)
+(require 'rng-valid)
+(require 'nxml-mode)
+(require 'rng-loc)
+
+(defcustom rng-nxml-auto-validate-flag t
+  "*Non-nil means automatically turn on validation with nxml-mode."
+  :type 'boolean
+  :group 'relax-ng)
+
+(defvar rng-preferred-prefix-alist-default nil
+  "Default value for variable `rng-preferred-prefix-alist'.")
+
+(defcustom rng-preferred-prefix-alist rng-preferred-prefix-alist-default
+  "*Alist of namespaces vs preferred prefixes."
+  :type '(repeat (cons :tag "With"
+                      (string :tag "this namespace URI")
+                      (string :tag "use this prefix")))
+  :group 'relax-ng)
+
+(defvar rng-complete-end-tags-after-< t
+  "*Non-nil means immediately after < complete on end-tag names.
+Complete on start-tag names regardless.")
+
+(defvar rng-nxml-easy-menu
+  '("XML"
+    ["Show Outline Only" nxml-hide-all-text-content]
+    ["Show Everything" nxml-show-all]
+    "---"
+    ["Validation" rng-validate-mode
+     :style toggle
+     :selected rng-validate-mode]
+    "---"
+    ("Set Schema"
+     ["Automatically" rng-auto-set-schema]
+     ("For Document Type"
+      :filter (lambda (menu)
+               (mapcar (lambda (type-id)
+                         (vector type-id
+                                 (list 'rng-set-document-type
+                                       type-id)))
+                       (rng-possible-type-ids))))
+     ["Any Well-Formed XML" rng-set-vacuous-schema]
+     ["File..." rng-set-schema-file])
+    ["Show Schema Location" rng-what-schema]
+    ["Save Schema Location" rng-save-schema-location :help
+     "Save the location of the schema currently being used for this buffer"]
+    "---"
+    ["First Error" rng-first-error :active rng-validate-mode]
+    ["Next Error" rng-next-error :active rng-validate-mode]
+    "---"
+    ["Customize nXML" (customize-group 'nxml)]
+    "---"
+    ["Show nXML Version" nxml-version]))
+
+;;;###autoload
+(defun rng-nxml-mode-init ()
+  "Initialize `nxml-mode' to take advantage of `rng-validate-mode'.
+This is typically called from `nxml-mode-hook'.
+Validation will be enabled if `rng-nxml-auto-validate-flag' is non-nil."
+  (interactive)
+  (define-key nxml-mode-map "\C-c\C-v" 'rng-validate-mode)
+  (define-key nxml-mode-map "\C-c\C-s\C-w" 'rng-what-schema)
+  (define-key nxml-mode-map "\C-c\C-s\C-a" 'rng-auto-set-schema-and-validate)
+  (define-key nxml-mode-map "\C-c\C-s\C-f" 'rng-set-schema-file-and-validate)
+  (define-key nxml-mode-map "\C-c\C-s\C-l" 'rng-save-schema-location)
+  (define-key nxml-mode-map "\C-c\C-s\C-t" 'rng-set-document-type-and-validate)
+  (define-key nxml-mode-map "\C-c\C-n" 'rng-next-error)
+  (easy-menu-define rng-nxml-menu nxml-mode-map
+    "Menu for nxml-mode used with rng-validate-mode."
+    rng-nxml-easy-menu)
+  (setq mode-line-process
+       '(rng-validate-mode (:eval (rng-compute-mode-line-string))))
+  (cond (rng-nxml-auto-validate-flag
+        (rng-validate-mode 1)
+        (add-hook 'nxml-completion-hook 'rng-complete nil t)
+        (add-hook 'nxml-in-mixed-content-hook 'rng-in-mixed-content-p nil t))
+       (t
+        (rng-validate-mode 0)
+        (remove-hook 'nxml-completion-hook 'rng-complete t)
+        (remove-hook 'nxml-in-mixed-content-hook 'rng-in-mixed-content-p t))))
+
+(defvar rng-tag-history nil)
+(defvar rng-attribute-name-history nil)
+(defvar rng-attribute-value-history nil)
+
+(defvar rng-complete-target-names nil)
+(defvar rng-complete-name-attribute-flag nil)
+(defvar rng-complete-extra-strings nil)
+
+(defun rng-complete ()
+  "Complete the string before point using the current schema.
+Return non-nil if in a context it understands."
+  (interactive)
+  (and rng-validate-mode
+       (let ((lt-pos (save-excursion (search-backward "<" nil t)))
+            xmltok-dtd)
+        (and lt-pos
+             (= (rng-set-state-after lt-pos) lt-pos)
+             (or (rng-complete-tag lt-pos)
+                 (rng-complete-end-tag lt-pos)
+                 (rng-complete-attribute-name lt-pos)
+                 (rng-complete-attribute-value lt-pos))))))
+
+(defconst rng-in-start-tag-name-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "<\\(?:w\\(?::w?\\)?\\)?\\="
+   t
+   t))
+
+(defun rng-complete-tag (lt-pos)
+  (let (rng-complete-extra-strings)
+    (when (and (= lt-pos (1- (point)))
+              rng-complete-end-tags-after-<
+              rng-open-elements
+              (not (eq (car rng-open-elements) t))
+              (or rng-collecting-text
+                  (rng-match-save
+                    (rng-match-end-tag))))
+      (setq rng-complete-extra-strings
+           (cons (concat "/"
+                         (if (caar rng-open-elements)
+                             (concat (caar rng-open-elements)
+                                     ":"
+                                     (cdar rng-open-elements))
+                           (cdar rng-open-elements)))
+                 rng-complete-extra-strings)))
+    (when (save-excursion
+           (re-search-backward rng-in-start-tag-name-regex
+                               lt-pos
+                               t))
+      (and rng-collecting-text (rng-flush-text))
+      (let ((completion
+            (let ((rng-complete-target-names
+                   (rng-match-possible-start-tag-names))
+                  (rng-complete-name-attribute-flag nil))
+              (rng-complete-before-point (1+ lt-pos)
+                                         'rng-complete-qname-function
+                                         "Tag: "
+                                         nil
+                                         'rng-tag-history)))
+           name)
+       (when completion
+         (cond ((rng-qname-p completion)
+                (setq name (rng-expand-qname completion
+                                             t
+                                             'rng-start-tag-expand-recover))
+                (when (and name
+                           (rng-match-start-tag-open name)
+                           (or (not (rng-match-start-tag-close))
+                               ;; need a namespace decl on the root element
+                               (and (car name)
+                                    (not rng-open-elements))))
+                  ;; attributes are required
+                  (insert " ")))
+               ((member completion rng-complete-extra-strings)
+                (insert ">")))))
+      t)))
+
+(defconst rng-in-end-tag-name-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "</\\(?:w\\(?::w?\\)?\\)?\\="
+   t
+   t))
+
+(defun rng-complete-end-tag (lt-pos)
+  (when (save-excursion
+         (re-search-backward rng-in-end-tag-name-regex
+                             lt-pos
+                             t))
+    (cond ((or (not rng-open-elements)
+              (eq (car rng-open-elements) t))
+          (message "No matching start-tag")
+          (ding))
+         (t
+          (let ((start-tag-name
+                 (if (caar rng-open-elements)
+                     (concat (caar rng-open-elements)
+                             ":"
+                             (cdar rng-open-elements))
+                   (cdar rng-open-elements)))
+                (end-tag-name
+                 (buffer-substring-no-properties (+ (match-beginning 0) 2)
+                                                 (point))))
+            (cond ((or (> (length end-tag-name)
+                          (length start-tag-name))
+                       (not (string= (substring start-tag-name
+                                                0
+                                                (length end-tag-name))
+                                     end-tag-name)))
+                   (message "Expected end-tag %s"
+                            (rng-quote-string
+                             (concat "</" start-tag-name ">")))
+                   (ding))
+                  (t
+                   (delete-region (- (point) (length end-tag-name))
+                                  (point))
+                   (insert start-tag-name ">")
+                   (when (not (or rng-collecting-text
+                                  (rng-match-end-tag)))
+                     (message "Element %s is incomplete"
+                              (rng-quote-string start-tag-name))))))))
+    t))
+
+(defconst rng-in-attribute-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "<w\\(?::w\\)?\
+\\(?:[ \t\r\n]+w\\(?::w\\)?[ \t\r\n]*=\
+[ \t\r\n]*\\(?:\"[^\"]*\"\\|'[^']*'\\)\\)*\
+[ \t\r\n]+\\(\\(?:w\\(?::w?\\)?\\)?\\)\\="
+   t
+   t))
+
+(defvar rng-undeclared-prefixes nil)
+
+(defun rng-complete-attribute-name (lt-pos)
+  (when (save-excursion
+         (re-search-backward rng-in-attribute-regex lt-pos t))
+    (let ((attribute-start (match-beginning 1))
+         rng-undeclared-prefixes)
+      (and (rng-adjust-state-for-attribute lt-pos
+                                          attribute-start)
+          (let ((rng-complete-target-names
+                 (rng-match-possible-attribute-names))
+                (rng-complete-extra-strings
+                 (mapcar (lambda (prefix)
+                           (if prefix
+                               (concat "xmlns:" prefix)
+                             "xmlns"))
+                         rng-undeclared-prefixes))
+                (rng-complete-name-attribute-flag t))
+            (rng-complete-before-point attribute-start
+                                       'rng-complete-qname-function
+                                       "Attribute: "
+                                       nil
+                                       'rng-attribute-name-history))
+          (insert "=\"")))
+    t))
+
+(defconst rng-in-attribute-value-regex
+  (replace-regexp-in-string
+   "w"
+   xmltok-ncname-regexp
+   "<w\\(?::w\\)?\
+\\(?:[ \t\r\n]+w\\(?::w\\)?[ \t\r\n]*=\
+[ \t\r\n]*\\(?:\"[^\"]*\"\\|'[^']*'\\)\\)*\
+[ \t\r\n]+\\(w\\(:w\\)?\\)[ \t\r\n]*=[ \t\r\n]*\
+\\(\"[^\"]*\\|'[^']*\\)\\="
+   t
+   t))
+
+(defun rng-complete-attribute-value (lt-pos)
+  (when (save-excursion
+         (re-search-backward rng-in-attribute-value-regex lt-pos t))
+    (let ((name-start (match-beginning 1))
+         (name-end (match-end 1))
+         (colon (match-beginning 2))
+         (value-start (1+ (match-beginning 3))))
+      (and (rng-adjust-state-for-attribute lt-pos
+                                          name-start)
+          (if (string= (buffer-substring-no-properties name-start
+                                                       (or colon name-end))
+                       "xmlns")
+              (rng-complete-before-point
+               value-start
+               (rng-strings-to-completion-alist
+                (rng-possible-namespace-uris
+                 (and colon
+                      (buffer-substring-no-properties (1+ colon) name-end))))
+               "Namespace URI: "
+               nil
+               'rng-namespace-uri-history)
+            (rng-adjust-state-for-attribute-value name-start
+                                                  colon
+                                                  name-end)
+            (rng-complete-before-point
+             value-start
+             (rng-strings-to-completion-alist
+              (rng-match-possible-value-strings))
+             "Value: "
+             nil
+             'rng-attribute-value-history))
+          (insert (char-before value-start))))
+    t))
+
+(defun rng-possible-namespace-uris (prefix)
+  (let ((ns (if prefix (nxml-ns-get-prefix prefix)
+             (nxml-ns-get-default))))
+    (if (and ns (memq prefix (nxml-ns-changed-prefixes)))
+       (list (nxml-namespace-name ns))
+      (mapcar 'nxml-namespace-name
+             (delq nxml-xml-namespace-uri
+                   (rng-match-possible-namespace-uris))))))
+
+(defconst rng-qname-regexp
+  (concat "\\`"
+         xmltok-ncname-regexp
+         "\\(?:" ":" xmltok-ncname-regexp "\\)" "?" "\\'"))
+
+(defun rng-qname-p (string)
+  (and (string-match rng-qname-regexp string) t))
+
+(defun rng-expand-qname (qname &optional defaultp recover-fun)
+  (setq qname (rng-split-qname qname))
+  (let ((prefix (car qname)))
+    (if prefix
+       (let ((ns (nxml-ns-get-prefix qname)))
+         (cond (ns (cons ns (cdr qname)))
+               (recover-fun (funcall recover-fun prefix (cdr qname)))))
+      (cons (and defaultp (nxml-ns-get-default)) (cdr qname)))))
+
+(defun rng-start-tag-expand-recover (prefix local-name)
+  (let ((ns (rng-match-infer-start-tag-namespace local-name)))
+    (and ns
+        (cons ns local-name))))
+
+(defun rng-split-qname (qname)
+  (if (string-match ":" qname)
+      (cons (substring qname 0 (match-beginning 0))
+           (substring qname (match-end 0)))
+    (cons nil qname)))
+
+(defun rng-in-mixed-content-p ()
+  "Return non-nil if point is in mixed content.
+Return nil only if point is definitely not in mixed content.
+If unsure, return non-nil."
+  (if (eq rng-current-schema rng-any-element)
+      t
+    (rng-set-state-after)
+    (rng-match-mixed-text)))
+
+(defun rng-set-state-after (&optional pos)
+  "Set the state for after parsing the first token with endpoint >= POS.
+This does not change the xmltok state or point.  However, it does
+set `xmltok-dtd'. Returns the position of the end of the token."
+  (unless pos (setq pos (point)))
+  (when (< rng-validate-up-to-date-end pos)
+    (message "Parsing...")
+    (while (and (rng-do-some-validation)
+               (< rng-validate-up-to-date-end pos))
+      ;; Display percentage validated.
+      (force-mode-line-update)
+      ;; Force redisplay but don't allow idle timers to run.
+      (let ((timer-idle-list nil))
+       (sit-for 0)))
+    (message "Parsing...done"))
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-invisible-motion
+       (if (= pos 1)
+           (rng-set-initial-state)
+         (let ((state (get-text-property (1- pos) 'rng-state)))
+           (cond (state
+                  (rng-restore-state state)
+                  (goto-char pos))
+                 (t
+                  (let ((start (previous-single-property-change pos
+                                                                'rng-state)))
+                    (cond (start
+                           (rng-restore-state (get-text-property (1- start)
+                                                                 'rng-state))
+                           (goto-char start))
+                          (t (rng-set-initial-state))))))))
+       (xmltok-save
+         (if (= (point) 1)
+             (xmltok-forward-prolog)
+           (setq xmltok-dtd rng-dtd))
+         (cond ((and (< pos (point))
+                     ;; This handles the case where the prolog ends
+                     ;; with a < without any following name-start
+                     ;; character. This will be treated by the parser
+                     ;; as part of the prolog, but we want to treat
+                     ;; it as the start of the instance.
+                     (eq (char-after pos) ?<)
+                     (<= (point)
+                         (save-excursion
+                           (goto-char (1+ pos))
+                           (skip-chars-forward " \t\r\n")
+                           (point))))
+                pos)
+               ((< (point) pos)
+                (let ((rng-dt-namespace-context-getter
+                       '(nxml-ns-get-context))
+                      (rng-parsing-for-state t))
+                  (rng-forward pos))
+                (point))
+               (t pos)))))))
+
+(defun rng-adjust-state-for-attribute (lt-pos start)
+  (xmltok-save
+    (save-excursion
+      (goto-char lt-pos)
+      (when (memq (xmltok-forward)
+                 '(start-tag
+                   partial-start-tag
+                   empty-element
+                   partial-empty-element))
+       (when (< start (point))
+         (setq xmltok-namespace-attributes
+               (rng-prune-attribute-at start
+                                       xmltok-namespace-attributes))
+         (setq xmltok-attributes
+               (rng-prune-attribute-at start
+                                       xmltok-attributes)))
+       (let ((rng-parsing-for-state t)
+             (rng-dt-namespace-context-getter '(nxml-ns-get-context)))
+         (rng-process-start-tag 'stop)
+         (rng-find-undeclared-prefixes)
+         t)))))
+       
+(defun rng-find-undeclared-prefixes ()
+  ;; Start with the newly effective namespace declarations.
+  ;; (Includes declarations added during recovery.)
+  (setq rng-undeclared-prefixes (nxml-ns-changed-prefixes))
+  (let ((iter xmltok-attributes)
+       (ns-state (nxml-ns-state))
+       att)
+    ;; Add namespace prefixes used in this tag,
+    ;; but not declared in the parent.
+    (nxml-ns-pop-state)
+    (while iter
+      (setq att (car iter))
+      (let ((prefix (xmltok-attribute-prefix att)))
+       (when (and prefix
+                  (not (member prefix rng-undeclared-prefixes))
+                  (not (nxml-ns-get-prefix prefix)))
+         (setq rng-undeclared-prefixes
+               (cons prefix rng-undeclared-prefixes))))
+      (setq iter (cdr iter)))
+    (nxml-ns-set-state ns-state)
+    ;; Remove namespace prefixes explicitly declared.
+    (setq iter xmltok-namespace-attributes)
+    (while iter
+      (setq att (car iter))
+      (setq rng-undeclared-prefixes
+           (delete (and (xmltok-attribute-prefix att)
+                        (xmltok-attribute-local-name att))
+                 rng-undeclared-prefixes))
+      (setq iter (cdr iter)))))
+
+(defun rng-prune-attribute-at (start atts)
+  (when atts
+    (let ((cur atts))
+      (while (if (eq (xmltok-attribute-name-start (car cur)) start)
+                (progn
+                  (setq atts (delq (car cur) atts))
+                  nil)
+              (setq cur (cdr cur)))))
+    atts))
+
+(defun rng-adjust-state-for-attribute-value (name-start
+                                            colon
+                                            name-end)
+  (let* ((prefix (if colon
+                    (buffer-substring-no-properties name-start colon)
+                  nil))
+        (local-name (buffer-substring-no-properties (if colon
+                                                        (1+ colon)
+                                                      name-start)
+                                                    name-end))
+        (ns (and prefix (nxml-ns-get-prefix prefix))))
+    (and (or (not prefix) ns)
+        (rng-match-attribute-name (cons ns local-name)))))
+
+(defun rng-complete-qname-function (string predicate flag)
+  (let ((alist (mapcar (lambda (name) (cons name nil))
+                      (rng-generate-qname-list string))))
+    (cond ((not flag)
+          (try-completion string alist predicate))
+         ((eq flag t)
+          (all-completions string alist predicate))
+         ((eq flag 'lambda)
+          (and (assoc string alist) t)))))
+
+(defun rng-generate-qname-list (&optional string)
+  (let ((forced-prefix (and string
+                           (string-match ":" string)
+                           (> (match-beginning 0) 0)
+                           (substring string
+                                      0
+                                      (match-beginning 0))))
+       (namespaces (mapcar 'car rng-complete-target-names))
+       ns-prefixes-alist ns-prefixes iter ns prefer)
+    (while namespaces
+      (setq ns (car namespaces))
+      (when ns
+       (setq ns-prefixes-alist
+             (cons (cons ns (nxml-ns-prefixes-for
+                             ns
+                             rng-complete-name-attribute-flag))
+                   ns-prefixes-alist)))
+      (setq namespaces (delq ns (cdr namespaces))))
+    (setq iter ns-prefixes-alist)
+    (while iter
+      (setq ns-prefixes (car iter))
+      (setq ns (car ns-prefixes))
+      (when (null (cdr ns-prefixes))
+       ;; No declared prefix for the namespace
+       (if forced-prefix
+           ;; If namespace non-nil and prefix undeclared,
+           ;; use forced prefix.
+           (when (and ns
+                      (not (nxml-ns-get-prefix forced-prefix)))
+             (setcdr ns-prefixes (list forced-prefix)))
+         (setq prefer (rng-get-preferred-unused-prefix ns))
+         (when prefer
+           (setcdr ns-prefixes (list prefer)))
+         ;; Unless it's an attribute with a non-nil namespace,
+         ;; allow no prefix for this namespace.
+         (unless rng-complete-name-attribute-flag
+           (setcdr ns-prefixes (cons nil (cdr ns-prefixes))))))
+      (setq iter (cdr iter)))
+    (rng-uniquify-equal
+     (sort (apply 'append
+                 (cons rng-complete-extra-strings
+                       (mapcar (lambda (name)
+                                 (if (car name)
+                                     (mapcar (lambda (prefix)
+                                               (if prefix
+                                                   (concat prefix
+                                                           ":"
+                                                           (cdr name))
+                                                 (cdr name)))
+                                       (cdr (assoc (car name)
+                                                   ns-prefixes-alist)))
+                                   (list (cdr name))))
+                               rng-complete-target-names)))
+          'string<))))
+       
+(defun rng-get-preferred-unused-prefix (ns)
+  (let ((ns-prefix (assoc (symbol-name ns) rng-preferred-prefix-alist))
+       iter prefix)
+    (when ns-prefix
+      (setq prefix (cdr ns-prefix))
+      (when (nxml-ns-get-prefix prefix)
+       ;; try to find an unused prefix
+       (setq iter (memq ns-prefix rng-preferred-prefix-alist))
+       (while (and iter
+                   (setq ns-prefix (assoc ns iter)))
+         (if (nxml-ns-get-prefix (cdr ns-prefix))
+             (setq iter (memq ns-prefix iter))
+           (setq prefix (cdr ns-prefix))
+           nil))))
+    prefix))
+
+(defun rng-strings-to-completion-alist (strings)
+  (mapcar (lambda (s) (cons s s))
+         (rng-uniquify-equal (sort (mapcar 'rng-escape-string strings)
+                                   'string<))))
+
+(provide 'rng-nxml)
+
+;; arch-tag: bec0d6ed-6be1-4540-9c2c-6f56e8e55d8b
+;;; rng-nxml.el ends here
diff --git a/lisp/nxml/rng-parse.el b/lisp/nxml/rng-parse.el
new file mode 100644 (file)
index 0000000..e9d10e0
--- /dev/null
@@ -0,0 +1,107 @@
+;;; rng-parse.el --- parse an XML file and validate it against a schema
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This combines the validation machinery in rng-match.el with the
+;; parser in nxml-parse.el by using the `nxml-validate-function' hook.
+
+;;; Code:
+
+(require 'nxml-parse)
+(require 'rng-match)
+(require 'rng-dt)
+
+(defvar rng-parse-prev-was-start-tag nil)
+
+(defun rng-parse-validate-file (schema file)
+  "Parse and validate the XML document in FILE and return it as a list.
+The returned list has the same form as that returned by
+`nxml-parse-file'.  SCHEMA is a list representing the schema to use
+for validation, such as returned by the function `rng-c-load-schema'.
+If the XML document is invalid with respect to schema, an error will
+be signaled in the same way as when it is not well-formed."
+  (save-excursion
+    (set-buffer (nxml-parse-find-file file))
+    (unwind-protect
+       (let ((nxml-parse-file-name file)
+             (nxml-validate-function 'rng-parse-do-validate)
+             (rng-dt-namespace-context-getter '(nxml-ns-get-context))
+             rng-parse-prev-was-start-tag)
+         ;; We don't simply call nxml-parse-file, because
+         ;; we want to do rng-match-with-schema in the same
+         ;; buffer in which we will call the other rng-match-* functions.
+         (rng-match-with-schema schema
+           (nxml-parse-instance)))
+      (kill-buffer nil))))
+
+(defun rng-parse-do-validate (text start-tag)
+  (cond ((and (let ((tem rng-parse-prev-was-start-tag))
+               (setq rng-parse-prev-was-start-tag (and start-tag t))
+               tem)
+             (not start-tag)
+             (rng-match-text-typed-p))
+        (unless (rng-match-element-value (or text ""))
+          (cons "Invalid data" (and text 'text))))
+       ((and text
+             (not (rng-blank-p text))
+             (not (rng-match-mixed-text)))
+        (cons "Text not allowed" 'text))
+       ((not start-tag)
+        (unless (rng-match-end-tag)
+          (cons "Missing elements" nil)))
+       ((not (rng-match-start-tag-open
+              (rng-parse-to-match-name (car start-tag))))
+        (cons "Element not allowed" nil))
+       (t
+        (let ((atts (cadr start-tag))
+              (i 0)
+              att err)
+          (while (and atts (not err))
+            (setq att (car atts))
+            (when (not (and (consp (car att))
+                            (eq (caar att) nxml-xmlns-namespace-uri)))
+              (setq err
+                    (cond ((not (rng-match-attribute-name
+                                 (rng-parse-to-match-name (car att))))
+                           (cons "Attribute not allowed"
+                                 (cons 'attribute-name i)))
+                          ((not (rng-match-attribute-value (cdr att)))
+                           (cons "Invalid attribute value"
+                                 (cons 'attribute-value i))))))
+            (setq atts (cdr atts))
+            (setq i (1+ i)))
+          (or err
+              (unless (rng-match-start-tag-close)
+                (cons "Missing attributes" 'tag-close)))))))
+
+(defun rng-parse-to-match-name (name)
+  (if (consp name)
+      name
+    (cons nil name)))
+
+(provide 'rng-parse)
+
+;; arch-tag: 8f14f533-b687-4dc0-9cd7-617ead856981
+;;; rng-parse.el ends here
diff --git a/lisp/nxml/rng-pttrn.el b/lisp/nxml/rng-pttrn.el
new file mode 100644 (file)
index 0000000..2ed8794
--- /dev/null
@@ -0,0 +1,192 @@
+;;; rng-pttrn.el --- RELAX NG patterns
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; pattern ::=
+;;   (ref <pattern> <local-name>)
+;;   | (choice <pattern> <pattern> ...)
+;;   | (group <pattern> <pattern> ...)
+;;   | (interleave <pattern> <pattern> ...)
+;;   | (zero-or-more <pattern>)
+;;   | (one-or-more <pattern>)
+;;   | (optional <pattern>)
+;;   | (mixed <pattern>)
+;;   | (value <datatype> <string> <context>)
+;;   | (data <datatype> <params>)
+;;   | (data-except <datatype> <params> <pattern>)
+;;   | (list <pattern>)
+;;   | (element <name-class> <pattern>)
+;;   | (attribute <name-class> <pattern>)
+;;   | (text)
+;;   | (empty)
+;;   | (not-allowed)
+;;
+;; params ::=
+;;   ((<param-name> . <param-value> ) ...)
+;; param-name ::= <symbol>
+;; param-value ::= <string>
+;;
+;; name-class ::=
+;;   (name <name>)
+;;   | (any-name)
+;;   | (any-name-except <name-class>)
+;;   | (ns-name <ns>)
+;;   | (ns-name-except <ns> <name-class>)
+;;   | (choice <name-class> <name-class> ...)
+;;
+;; name ::= (<ns> . <local-name>)
+;; ns ::= nil | <symbol>
+;; local-name ::= <string>
+;; datatype ::= (<datatype-uri> . <datatype-local-name>)
+;; datatype-uri ::= nil | <symbol>
+;; datatype-local-name ::= <symbol>
+
+;;; Code:
+
+(defvar rng-schema-change-hook nil
+  "Hook to be run after `rng-current-schema' changes.")
+
+(defvar rng-current-schema nil
+  "Pattern to be used as schema for the current buffer.")
+(make-variable-buffer-local 'rng-current-schema)
+
+(defun rng-make-ref (name)
+  (list 'ref nil name))
+
+(defun rng-ref-set (ref pattern)
+  (setcar (cdr ref) pattern))
+
+(defun rng-ref-get (ref) (cadr ref))
+
+(defun rng-make-choice (patterns)
+  (cons 'choice patterns))
+
+(defun rng-make-group (patterns)
+  (cons 'group patterns))
+
+(defun rng-make-interleave (patterns)
+  (cons 'interleave patterns))
+
+(defun rng-make-zero-or-more (pattern)
+  (list 'zero-or-more pattern))
+
+(defun rng-make-one-or-more (pattern)
+  (list 'one-or-more pattern))
+
+(defun rng-make-optional (pattern)
+  (list 'optional pattern))
+
+(defun rng-make-mixed (pattern)
+  (list 'mixed pattern))
+
+(defun rng-make-value (datatype str context)
+  (list 'value datatype str context))
+
+(defun rng-make-data (name params)
+  (list 'data name params))
+
+(defun rng-make-data-except (name params pattern)
+  (list 'data-except name params pattern))
+
+(defun rng-make-list (pattern)
+  (list 'list pattern))
+
+(defun rng-make-element (name-class pattern)
+  (list 'element name-class pattern))
+
+(defun rng-make-attribute (name-class pattern)
+  (list 'attribute name-class pattern))
+
+(defun rng-make-text ()
+  '(text))
+
+(defun rng-make-empty ()
+  '(empty))
+
+(defun rng-make-not-allowed ()
+  '(not-allowed))
+
+(defun rng-make-any-name-name-class ()
+  '(any-name))
+
+(defun rng-make-any-name-except-name-class (name-class)
+  (list 'any-name-except name-class))
+
+(defun rng-make-ns-name-name-class (ns)
+  (list 'ns-name ns))
+
+(defun rng-make-ns-name-except-name-class (ns name-class)
+  (list 'ns-name-except ns name-class))
+
+(defun rng-make-name-name-class (name)
+  (list 'name name))
+
+(defun rng-make-choice-name-class (name-classes)
+  (cons 'choice name-classes))
+
+(defconst rng-any-content
+  (let* ((ref (rng-make-ref "any-content"))
+        (pattern (rng-make-zero-or-more
+                   (rng-make-choice
+                    (list
+                     (rng-make-text)
+                     (rng-make-attribute (rng-make-any-name-name-class)
+                                         (rng-make-text))
+                     (rng-make-element (rng-make-any-name-name-class)
+                                       ref))))))
+    (rng-ref-set ref pattern)
+    pattern)
+  "A pattern that matches the attributes and content of any element.")
+
+(defconst rng-any-element
+  (let* ((ref (rng-make-ref "any-element"))
+        (pattern
+         (rng-make-element
+          (rng-make-any-name-name-class)
+          (rng-make-zero-or-more
+           (rng-make-choice
+            (list
+             (rng-make-text)
+             (rng-make-attribute (rng-make-any-name-name-class)
+                                 (rng-make-text))
+             ref))))))
+    (rng-ref-set ref pattern)
+    pattern)
+  "A pattern that matches any element.")
+
+;;; Names
+
+(defun rng-make-name (ns local-name)
+  (cons ns local-name))
+
+;;; Datatypes
+
+(defun rng-make-datatype (uri local-name)
+  (cons uri (intern local-name)))
+
+(provide 'rng-pttrn)
+
+;; arch-tag: 9418e269-ddd4-4037-861f-ff903f48f008
+;;; rng-pttrn.el ends here
diff --git a/lisp/nxml/rng-uri.el b/lisp/nxml/rng-uri.el
new file mode 100644 (file)
index 0000000..f18012a
--- /dev/null
@@ -0,0 +1,358 @@
+;;; rng-uri.el --- URI parsing and manipulation
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun rng-file-name-uri (f)
+  "Return a URI for the filename F.
+Multibyte characters are left as is. Use `rng-uri-escape-multibyte' to
+escape them using %HH."
+  (setq f (expand-file-name f))
+  (let ((url
+        (replace-regexp-in-string "[\000-\032\177<>#%\"{}|\\^[]`%?;]"
+                                  'rng-percent-encode
+                                  f)))
+    (concat "file:"
+           (if (and (> (length url) 0)
+                    (= (aref url 0) ?/))
+               "//"
+             "///")
+           url)))
+
+(defun rng-uri-escape-multibyte (uri)
+  "Escape multibyte characters in URI."
+  (replace-regexp-in-string "[:nonascii:]"
+                           'rng-percent-encode
+                           (encode-coding-string uri 'utf-8)))
+
+(defun rng-percent-encode (str)
+  (apply 'concat
+        (mapcar (lambda (ch)
+                  (format "%%%x%x" (/ ch 16) (% ch 16)))
+                (string-to-list str))))
+
+
+(defun rng-uri-file-name (uri)
+  "Return the filename represented by a URI.
+Signal an error if URI is not a valid file URL."
+  (rng-uri-file-name-1 uri nil))
+
+(defun rng-uri-pattern-file-name-regexp (pattern)
+  "Return a regexp for filenames represented by URIs that match PATTERN."
+  (rng-uri-file-name-1 pattern 'match))
+
+(defun rng-uri-pattern-file-name-replace-match (pattern)
+  (rng-uri-file-name-1 pattern 'replace))
+
+;; pattern is either nil or match or replace
+(defun rng-uri-file-name-1 (uri pattern)
+  (unless (string-match "\\`\\(?:[^%]\\|%[0-9a-fA-F]{2}\\)*\\'" uri)
+    (rng-uri-error "Bad escapes in URI `%s'" uri))
+  (setq uri (rng-uri-unescape-multibyte uri))
+  (let* ((components
+         (or (rng-uri-split uri)
+             (rng-uri-error "Cannot split URI `%s' into its components" uri)))
+        (scheme (nth 0 components))
+        (authority (nth 1 components))
+        (path (nth 2 components))
+        (absolutep (string-match "\\`/" path))
+        (query (nth 3 components))
+        (fragment-id (nth 4 components)))
+    (cond ((not scheme)
+          (unless pattern
+            (rng-uri-error "URI `%s' does not have a scheme" uri)))
+         ((not (string= (downcase scheme) "file"))
+          (rng-uri-error "URI `%s' does not use the `file:' scheme" uri)))
+    (when (not (member authority
+                      (cons system-name '(nil "" "localhost"))))
+      (rng-uri-error "URI `%s' does not start with `file:///' or `file://localhost/'"
+            uri))
+    (when query
+      (rng-uri-error "`?' not escaped in file URI `%s'" uri))
+    (when fragment-id
+      (rng-uri-error "URI `%s' has a fragment identifier" uri))
+    (when (string-match ";" path)
+      (rng-uri-error "`;' not escaped in URI `%s'" uri))
+    (when (string-match "%2[fF]" path) ;; 2f is hex code of slash
+      (rng-uri-error "Escaped slash in URI `%s'" uri))
+    (when (and (eq system-type 'windows-nt)
+              absolutep
+              (file-name-absolute-p (substring path 1)))
+      (setq path (substring path 1)))
+    (when (and pattern (string-match "\\`\\./" path))
+      (setq path (substring path 2)))
+    (setq path 
+         (cond ((eq pattern 'match)
+                (rng-uri-unescape-unibyte-match path))
+               ((eq pattern 'replace)
+                (rng-uri-unescape-unibyte-replace path 2))
+               (t
+                (rng-uri-unescape-unibyte path))))
+    (when (string-match "\000" path)
+      (rng-uri-error "URI `%s' has NUL character in path" uri))
+    (when (eq pattern 'match)
+      (setq path
+           (concat (if absolutep
+                       "\\(\\)"
+                     "\\(\\(?:[^/]*/\\)*\\)")
+                   path)))
+    (cond ((eq pattern 'match)
+          (concat "\\`" path "\\'"))
+         ((and (eq pattern 'replace)
+               (not absolutep))
+          (concat "\\1" path))
+         (t path))))
+
+(defun rng-uri-error (&rest args)
+  (signal 'rng-uri-error (list (apply 'format args))))
+
+(put 'rng-uri-error 'error-conditions '(error rng-uri-error))
+(put 'rng-uri-error 'error-message "Invalid URI")
+
+(defun rng-uri-split (str)
+  (and (string-match "\\`\\(?:\\([^:/?#]+\\):\\)?\
+\\(?://\\([^/?#]*\\)\\)?\
+\\([^?#]*\\)\
+\\(?:\\?\\([^#]*\\)\\)?\
+\\(?:#\\(\\(?:.\\|\n\\)*\\)\\)?\\'"
+                    str)
+       (list (match-string 1 str)
+            (match-string 2 str)
+            (match-string 3 str)
+            (match-string 4 str)
+            (match-string 5 str))))
+
+(defun rng-uri-join (scheme authority path &optional query fragment-id)
+  (when path
+    (let (parts)
+      (when fragment-id
+       (setq parts (list "#" fragment-id)))
+      (when query
+       (setq parts
+             (cons "?"
+                   (cons query parts))))
+      (setq parts (cons path parts))
+      (when authority
+       (setq parts
+             (cons "//"
+                   (cons authority parts))))
+      (when scheme
+       (setq parts
+             (cons scheme
+                   (cons ":" parts))))
+      (apply 'concat parts))))
+                       
+(defun rng-uri-resolve (uri-ref base-uri)
+  "Resolve a possibly relative URI reference into absolute form.
+URI-REF is the URI reference to be resolved.
+BASE-URI is the base URI to use for resolving it.
+The algorithm is specified by RFC 2396.
+If there is some problem with URI-REF or BASE-URI, then
+URI-REF will be returned."
+  (let* ((components (rng-uri-split uri-ref))
+        (scheme (nth 0 components))
+        (authority (nth 1 components))
+        (path (nth 2 components))
+        (query (nth 3 components))
+        (fragment-id (nth 4 components))
+        (base-components (rng-uri-split base-uri)))
+    (if (or (not components)
+           scheme
+           (not base-components)
+           (not (nth 0 base-components)))
+       uri-ref
+      (setq scheme (nth 0 base-components))
+      (when (not authority)
+       (setq authority (nth 1 base-components))
+       (if (and (equal path "") (not query))
+           ;; Handle same document reference by returning
+           ;; same URI (RFC 2396bis does this too).
+           (setq path (nth 2 base-components)
+                 query (nth 3 base-components))
+         (setq path (rng-resolve-path path (nth 2 base-components)))))
+      (rng-uri-join scheme
+                   authority
+                   path
+                   query
+                   fragment-id))))
+
+;; See RFC 2396 5.2, steps 5 and 6
+(defun rng-resolve-path (path base-path)
+  ;; Step 5
+  (if (or (string-match "\\`/" path)
+         (not (string-match "\\`/" base-path)))
+      path
+    ;; Step 6
+    ;; (a), (b)
+    (let ((segments (rng-split-path path))
+         (base-segments (rng-split-path base-path)))
+      (if (> (length base-segments) 1)
+         (setq segments (nconc (nbutlast base-segments)
+                               segments))
+       (setcar segments
+               (concat (car base-segments) (car segments))))
+      ;; (d)
+      (let ((last-segment (last segments)))
+       (when (equal (car last-segment) ".")
+         (setcar last-segment "")))
+      ;; (c)
+      (setq segments (delete "." segments))
+      ;; (e)
+      (let (iter matched)
+       (while (progn
+                (setq matched nil)
+                (setq iter (cdr segments))
+                (while (and iter (not matched))
+                  (if (or (not (equal (cadr iter) ".."))
+                          (equal (car iter) ".."))
+                      (setq iter (cdr iter))
+                    (setcar iter nil)
+                    (setcar (cdr iter)
+                            ;; (f)
+                            (if (cddr iter) nil ""))
+                    (setq matched t)
+                    (setq segments (delq nil segments))))
+                matched)))
+      (rng-join-path segments))))
+
+(defun rng-relative-uri (full base)
+  "Return a URI that relative to BASE is equivalent to FULL.
+The returned URI will be relative if possible.
+Both FULL and BASE must be absolute URIs."
+  (let* ((components (rng-uri-split full))
+        (scheme (nth 0 components))
+        (authority (nth 1 components))
+        (path (nth 2 components))
+        (query (nth 3 components))
+        (fragment-id (nth 4 components))
+        (base-components (rng-uri-split base)))
+    (if (and components
+            base-components
+            scheme
+            (equal scheme
+                   (nth 0 base-components)))
+       (progn
+         (setq scheme nil)
+         (when (and authority
+                    (equal authority
+                           (nth 1 base-components)))
+           (setq authority nil)
+           (setq path (rng-relative-path path (nth 2 base-components))))
+         (rng-uri-join scheme authority path query fragment-id))
+      full)))
+
+(defun rng-relative-path (path base-path)
+  (let ((segments (rng-split-path path))
+       (base-segments (rng-split-path base-path)))
+    (when (> (length base-segments) 1)
+      (setq base-segments (nbutlast base-segments)))
+    (if (or (member "." segments)
+           (member ".." segments)
+           (member "." base-segments)
+           (member ".." base-segments))
+       path
+      (while (and segments
+                 base-segments
+                 (string= (car segments)
+                          (car base-segments)))
+       (setq segments (cdr segments))
+       (setq base-segments (cdr base-segments)))
+      (while base-segments
+       (setq base-segments (cdr base-segments))
+       (setq segments (cons ".." segments)))
+      (when (equal (car segments) "")
+       (setq segments (cons "." segments)))
+      (rng-join-path segments))))
+
+(defun rng-split-path (path)
+  (let ((start 0)
+       segments)
+    (while (string-match "/" path start)
+      (setq segments (cons (substring path start (match-beginning 0))
+                          segments))
+      (setq start (match-end 0)))
+    (nreverse (cons (substring path start) segments))))
+
+(defun rng-join-path (segments)
+  (and segments
+       (mapconcat 'identity segments "/")))
+
+(defun rng-uri-unescape-multibyte (str)
+  (replace-regexp-in-string "\\(?:%[89a-fA-F][0-9a-fA-F]\\)+"
+                           'rng-multibyte-percent-decode
+                           str))
+
+(defun rng-multibyte-percent-decode (str)
+  (decode-coding-string  (apply 'string
+                               (mapcar (lambda (h) (string-to-number h 16))
+                                       (split-string str "%")))
+                        'utf-8))
+    
+(defun rng-uri-unescape-unibyte (str)
+  (replace-regexp-in-string "%[0-7][0-9a-fA-F]"
+                           (lambda (h)
+                             (string-to-number (substring h 1) 16))
+                           str
+                           t
+                           t))
+
+(defun rng-uri-unescape-unibyte-match (str)
+  (replace-regexp-in-string "%[0-7][0-9a-fA-F]\\|[^%]"
+                           (lambda (match)
+                             (if (string= match "*")
+                                 "\\([^/]*\\)"
+                               (regexp-quote
+                                (if (= (length match) 1)
+                                    match
+                                  (string-to-number (substring match 1)
+                                                    16)))))
+                           str
+                           t
+                           t))
+
+(defun rng-uri-unescape-unibyte-replace (str next-match-index)
+  (replace-regexp-in-string
+   "%[0-7][0-9a-fA-F]\\|[^%]"
+   (lambda (match)
+     (if (string= match "*")
+        (let ((n next-match-index))
+          (setq next-match-index (1+ n))
+          (format "\\%s" n))
+       (let ((ch (if (= (length match) 1)
+                    (aref match 0)
+                  (string-to-number (substring match 1)
+                                    16))))
+        (if (eq ch ?\\)
+            (string ?\\ ?\\)
+          (string ch)))))
+     str
+     t
+     t))
+
+(provide 'rng-uri)
+
+;; arch-tag: c7b7b8b8-61d1-48ec-82bc-7001c70b2e9d
+;;; rng-uri.el ends here
diff --git a/lisp/nxml/rng-util.el b/lisp/nxml/rng-util.el
new file mode 100644 (file)
index 0000000..7ae75f8
--- /dev/null
@@ -0,0 +1,175 @@
+;;; rng-util.el --- utility functions for RELAX NG library
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(defun rng-make-datatypes-uri (uri)
+  (if (string-equal uri "")
+      ;; The spec doesn't say to do this, but it's perfectly conformant
+      ;; and better than using nil, I think.
+      'http://relaxng.org/ns/structure/1.0
+    (intern uri)))
+
+(defconst rng-xsd-datatypes-uri
+  (rng-make-datatypes-uri "http://www.w3.org/2001/XMLSchema-datatypes"))
+
+(defconst rng-builtin-datatypes-uri (rng-make-datatypes-uri ""))
+
+(defun rng-uniquify-eq (list)
+  "Destructively remove any element from LIST that is eq to
+its predecessor."
+  (and list
+       (let ((head list))
+        (while (cdr head)
+          (if (eq (car head) (cadr head))
+              (setcdr head (cddr head)))
+          (setq head (cdr head)))
+        list)))
+
+(defun rng-uniquify-equal (list)
+  "Destructively remove any element from LIST that is equal to
+its predecessor."
+  (and list
+       (let ((head list))
+        (while (cdr head)
+          (if (equal (car head) (cadr head))
+              (setcdr head (cddr head)))
+          (setq head (cdr head)))
+        list)))
+
+(defun rng-blank-p (str) (string-match "\\`[ \t\n\r]*\\'" str))
+
+(defun rng-substq (new old list)
+  "Replace first member of LIST (if any) that is eq to OLD by NEW.
+LIST is not modified."
+  (cond ((null list) nil)
+       ((eq (car list) old)
+        (cons new (cdr list)))
+       (t
+        (let ((tail (cons (car list)
+                          nil))
+              (rest (cdr list)))
+          (setq list tail)
+          (while rest
+            (let ((item (car rest)))
+              (setq rest (cdr rest))
+              (cond ((eq item old)
+                     (setcdr tail
+                             (cons new rest))
+                     (setq rest nil))
+                    (t
+                     (setq tail
+                           (setcdr tail
+                                   (cons item nil))))))))
+        list)))
+
+(defun rng-complete-before-point (start table prompt &optional predicate hist)
+  "Complete text between START and point.
+Replaces the text between START and point with a string chosen using a
+completion table and, when needed, input read from the user with the
+minibuffer.
+Returns the new string if either a complete and unique completion was
+determined automatically or input was read from the user. Otherwise,
+returns nil.
+TABLE is an alist, a symbol bound to a function or an obarray as with
+the function `completing-read'.
+PROMPT is the string to prompt with if user input is needed.
+PREDICATE is nil or a function as with `completing-read'.
+HIST, if non-nil, specifies a history list as with `completing-read'."
+  (let* ((orig (buffer-substring-no-properties start (point)))
+        (completion (try-completion orig table predicate)))
+    (cond ((not completion)
+          (if (string= orig "")
+              (message "No completions available")
+            (message "No completion for %s" (rng-quote-string orig)))
+          (ding)
+          nil)
+         ((eq completion t) orig)
+         ((not (string= completion orig))
+          (delete-region start (point))
+          (insert completion)
+          (cond ((not (rng-completion-exact-p completion table predicate))
+                 (message "Incomplete")
+                 nil)
+                ((eq (try-completion completion table predicate) t)
+                 completion)
+                (t
+                 (message "Complete but not unique")
+                 nil)))
+         (t
+          (setq completion
+                (let ((saved-minibuffer-setup-hook
+                       (default-value 'minibuffer-setup-hook)))
+                  (add-hook 'minibuffer-setup-hook
+                            'minibuffer-completion-help
+                            t)
+                  (unwind-protect
+                      (completing-read prompt
+                                       table
+                                       predicate
+                                       nil
+                                       orig
+                                       hist)
+                    (setq-default minibuffer-setup-hook
+                                  saved-minibuffer-setup-hook))))
+          (delete-region start (point))
+          (insert completion)
+          completion))))
+
+(defun rng-completion-exact-p (string table predicate)
+  (cond ((symbolp table)
+        (funcall table string predicate 'lambda))
+       ((vectorp table)
+        (intern-soft string table))
+       (t (assoc string table))))
+
+(defun rng-quote-string (s)
+  (concat "\"" s "\""))
+
+(defun rng-escape-string (s)
+  (replace-regexp-in-string "[&\"<>]"
+                           (lambda (match)
+                             (cdr (assoc match
+                                         '(("&" . "&amp;")
+                                           ("\"" . "&quot;")
+                                           (">" . "&gt;")
+                                           ("<" . "&lt;")))))
+                           s
+                           t))
+
+(defun rng-collapse-space (string)
+  (setq string
+       (replace-regexp-in-string "[ \t\r\n]+" " " string t t))
+  (when (string-match "\\` " string)
+    (setq string (substring string 1)))
+  (when (string-match " \\'" string)
+    (setq string (substring string 0 -1)))
+  string)
+
+(provide 'rng-util)
+
+;; arch-tag: 2dc233e0-5e7a-488f-bfc4-5909512dbaf0
+;;; rng-util.el ends here
diff --git a/lisp/nxml/rng-valid.el b/lisp/nxml/rng-valid.el
new file mode 100644 (file)
index 0000000..183fb25
--- /dev/null
@@ -0,0 +1,1470 @@
+;;; rng-valid.el --- real-time validation of XML using RELAX NG
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; For usage information, see the documentation for rng-validate-mode.
+;;
+;; This file provides a minor mode that continually validates a buffer
+;; against a RELAX NG schema. The validation state is used to support
+;; schema-sensitive editing as well as validation. Validation is
+;; performed while Emacs is idle.  XML parsing is done using
+;; xmltok.el. This file is responsible for checking that end-tags
+;; match their start-tags.  Namespace processing is handled by
+;; nxml-ns.el. The RELAX NG Compact Syntax schema is parsed into
+;; internal form by rng-cmpct.el.  This internal form is described by
+;; rng-pttrn.el.  Validation of the document by matching against this
+;; internal form is done by rng-match.el. Handling of W3C XML Schema
+;; datatypes is delegated by rng-match.el to rng-xsd.el.  The minor
+;; mode is intended to be used in conjunction with the nxml major
+;; mode, but does not have to be.
+;;
+;; The major responsibility of this file is to allow validation to
+;; happen incrementally.  If a buffer has been validated and is then
+;; changed, we can often revalidate it without having to completely
+;; parse and validate it from start to end.  As we parse and validate
+;; the buffer, we periodically cache the state.  The state has three
+;; components: the stack of open elements, the namespace processing
+;; state and the RELAX NG validation state. The state is cached as the
+;; value of the rng-state text property on the closing greater-than of
+;; tags (but at intervals, not on every tag).  We keep track of the
+;; position up to which cached state is known to be correct by adding
+;; a function to the buffer's after-change-functions. This is stored
+;; in the rng-validate-up-to-date-end variable.  The first way in
+;; which we make validation incremental is obvious: we start
+;; validation from the first cached state before
+;; rng-validate-up-to-date-end.
+;;
+;; To make this work efficiently, we have to be able to copy the
+;; current parsing and validation state efficiently.  We do this by
+;; minimizing destructive changes to the objects storing the state.
+;; When state is changed, we use the old state to create new objects
+;; representing the new state rather than destructively modifying the
+;; objects representing the old state. Copying the state is just a
+;; matter of making a list of three objects, one for each component of
+;; the state; the three objects themselves can be shared and do not
+;; need to be copied.
+;;
+;; There's one other idea that is used to make validation incremental.
+;; Suppose we have a buffer that's 4000 bytes long and suppose we
+;; validated it, caching state at positions 1000, 2000 and 3000.  Now
+;; suppose we make a change at position 1500 inserting 100 characters.
+;; rng-validate-up-to-date-end will be changed to 1500.  When Emacs
+;; becomes idle and we revalidate, validation will restart using the
+;; cached state at position 1000.  However, we take advantage of the
+;; cached state beyond rng-validate-up-to-date-end as follows.  When
+;; our validation reaches position 2100 (the current position of the
+;; character that was at 2000), we compare our current state with the
+;; cached state.  If they are the same, then we can stop parsing
+;; immediately and set rng-validate-up-to-date-end to the end of the
+;; buffer: we already know that the state cached at position 3100 is
+;; correct.  If they are not the same, then we have to continue
+;; parsing.  After the change, but before revalidation, we call the
+;; region from 1600 to the end of the buffer "conditionally
+;; up-to-date".
+;;
+;; As well as the cached parsing and validation state, we also keep
+;; track of the errors in the file.  Errors are stored as overlays
+;; with a category of rng-error.  The number of such overlays in the
+;; buffer must always be equal to rng-error-count.
+
+;;; Code:
+
+(require 'xmltok)
+(require 'nxml-enc)
+(require 'nxml-util)
+(require 'nxml-ns)
+(require 'rng-match)
+(require 'rng-util)
+(require 'rng-loc)
+
+;;; Customizable variables
+
+(defgroup relax-ng nil
+  "Validation of XML using RELAX NG."
+  :group 'wp
+  :group 'nxml
+  :group 'languages)
+
+(defface rng-error-face '((t (:underline "red")))
+  "Face for highlighting XML errors."
+  :group 'relax-ng)
+
+(defcustom rng-state-cache-distance 2000
+  "*Distance in characters between each parsing and validation state cache."
+  :type 'integer
+  :group 'relax-ng)
+
+(defcustom rng-validate-chunk-size 8000
+  "*Number of characters in a RELAX NG validation chunk.
+A validation chunk will be the smallest chunk that is at least this
+size and ends with a tag.  After validating a chunk, validation will
+continue only if Emacs is still idle."
+  :type 'integer
+  :group 'relax-ng)
+
+(defcustom rng-validate-delay 1.5
+  "*Time in seconds that Emacs must be idle before starting a full validation.
+A full validation continues until either validation is up to date
+or Emacs is no longer idle."
+  :type 'number
+  :group 'relax-ng)
+
+(defcustom rng-validate-quick-delay 0.3
+  "*Time in seconds that Emacs must be idle before starting a quick validation.
+A quick validation validates at most one chunk."
+  :type 'number
+  :group 'relax-ng)
+
+;; Global variables
+
+(defvar rng-validate-timer nil)
+(make-variable-buffer-local 'rng-validate-timer)
+;; ensure that we can cancel the timer even after a kill-all-local-variables
+(put 'rng-validate-timer 'permanent-local t)
+
+(defvar rng-validate-quick-timer nil)
+(make-variable-buffer-local 'rng-validate-quick-timer)
+;; ensure that we can cancel the timer even after a kill-all-local-variables
+(put 'rng-validate-quick-timer 'permanent-local t)
+
+(defvar rng-error-count nil
+  "Number of errors in the current buffer.  Always equal to number of
+overlays with category rng-error.")
+(make-variable-buffer-local 'rng-error-count)
+
+(defvar rng-message-overlay nil
+  "Overlay in this buffer whose help-echo property was last printed.
+Nil if none.")
+(make-variable-buffer-local 'rng-message-overlay)
+
+(defvar rng-message-overlay-inhibit-point nil
+  "Position at which message from overlay should be inhibited.
+If point is equal to this and the error overlay around
+point is `rng-message-overlay', then the `help-echo' property
+of the error overlay should not be printed with `message'.")
+(make-variable-buffer-local 'rng-message-overlay-inhibit-point)
+
+(defvar rng-message-overlay-current nil
+  "Non-nil if `rng-message-overlay' is still the current message.")
+(make-variable-buffer-local 'rng-message-overlay-current)
+
+(defvar rng-open-elements nil
+  "Stack of names of open elements represented as a list.
+Each member of the list is either t or a (PREFIX . LOCAL-NAME) pair.
+\(PREFIX . LOCAL-NAME) is pushed for a start-tag; t is pushed
+for a mismatched end-tag.")
+
+(defvar rng-pending-contents nil
+  "Text content of current element that has yet to be processed.
+Value is a list of segments (VALUE START END) positions in reverse
+order.  VALUE is a string or nil.  If VALUE is nil, then the value is
+the string between START and END.  A segment can also be nil
+indicating an unresolvable entity or character reference.")
+
+(defvar rng-collecting-text nil)
+
+(defvar rng-validate-up-to-date-end nil
+  "Last position where validation is known to be up to date.")
+(make-variable-buffer-local 'rng-validate-up-to-date-end)
+
+(defvar rng-conditional-up-to-date-start nil
+  "Marker for the start of the conditionally up-to-date region.
+Nil if there is no conditionally up-to-date region.  The conditionally
+up-to-date region must be such that for any cached state S with
+position P in the conditionally up-to-date region, if at some point it
+is determined that S becomes correct for P, then all states with
+position >= P in the conditionally up to date region must also then be
+correct and all errors between P and the end of the region must then
+be correctly marked.")
+(make-variable-buffer-local 'rng-conditional-up-to-date-start)
+
+(defvar rng-conditional-up-to-date-end nil
+  "Marker for the end of the conditionally up-to-date region.
+Nil if there is no conditionally up-to-date region.  See the variable
+`rng-conditional-up-to-date-start'.")
+(make-variable-buffer-local 'rng-conditional-up-to-date-end)
+
+(defvar rng-parsing-for-state nil
+  "Non-nil means we are currently parsing just to compute the state.
+Should be dynamically bound.")
+
+(defvar rng-validate-mode nil)
+(make-variable-buffer-local 'rng-validate-mode)
+
+(defvar rng-dtd nil)
+(make-variable-buffer-local 'rng-dtd)
+
+;;;###autoload
+(defun rng-validate-mode (&optional arg no-change-schema)
+  "Minor mode performing continual validation against a RELAX NG schema.
+
+Checks whether the buffer is a well-formed XML 1.0 document,
+conforming to the XML Namespaces Recommendation and valid against a
+RELAX NG schema. The mode-line indicates whether it is or not.  Any
+parts of the buffer that cause it not to be are considered errors and
+are highlighted with `rng-error-face'. A description of each error is
+available as a tooltip.  \\[rng-next-error] goes to the next error
+after point. Clicking mouse-1 on the word `Invalid' in the mode-line
+goes to the first error in the buffer. If the buffer changes, then it
+will be automatically rechecked when Emacs becomes idle; the
+rechecking will be paused whenever there is input pending..
+
+By default, uses a vacuous schema that allows any well-formed XML
+document. A schema can be specified explictly using
+\\[rng-set-schema-file-and-validate], or implicitly based on the buffer's
+file name or on the root element name.  In each case the schema must
+be a RELAX NG schema using the compact schema \(such schemas
+conventionally have a suffix of `.rnc').  The variable
+`rng-schema-locating-files' specifies files containing rules
+to use for finding the schema."
+  (interactive "P")
+  (setq rng-validate-mode
+       (if (null arg)
+           (not rng-validate-mode)
+         (> (prefix-numeric-value arg) 0)))
+  (save-restriction
+    (widen)
+    (nxml-with-unmodifying-text-property-changes
+      (rng-clear-cached-state (point-min) (point-max)))
+    ;; 1+ to clear empty overlays at (point-max)
+    (rng-clear-overlays (point-min) (1+ (point-max))))
+  (setq rng-validate-up-to-date-end 1)
+  (rng-clear-conditional-region)
+  (setq rng-error-count 0)
+  ;; do this here to avoid infinite loop if we set the schema
+  (remove-hook 'rng-schema-change-hook 'rng-validate-clear t)
+  (cond (rng-validate-mode
+        (unwind-protect
+            (save-excursion
+              ;; An error can change the current buffer
+              (when (or (not rng-current-schema)
+                        (and (eq rng-current-schema rng-any-element)
+                             (not no-change-schema)))
+                (rng-auto-set-schema t)))
+          (unless rng-current-schema (rng-set-schema-file-1 nil))
+          (add-hook 'rng-schema-change-hook 'rng-validate-clear nil t)
+          (add-hook 'after-change-functions 'rng-after-change-function nil t)
+          (add-hook 'kill-buffer-hook 'rng-kill-timers nil t)
+          (add-hook 'echo-area-clear-hook 'rng-echo-area-clear-function nil t)
+          (add-hook 'post-command-hook 'rng-maybe-echo-error-at-point nil t)
+          (rng-match-init-buffer)
+          (rng-activate-timers)
+          ;; Start validating right away if the buffer is visible.
+          ;; If it's not visible, don't do this, because the user
+          ;; won't get any progress indication. When the user finds
+          ;; a new file, then the buffer won't be visible
+          ;; when this is invoked.
+          (when (get-buffer-window (current-buffer) 'visible)
+            (rng-validate-while-idle (current-buffer)))))
+       (t
+        (rng-cancel-timers)
+        (force-mode-line-update)
+        (remove-hook 'kill-buffer-hook 'rng-cancel-timers t)
+        (remove-hook 'post-command-hook 'rng-maybe-echo-error-at-point t)
+        (remove-hook 'echo-area-clear-hook 'rng-echo-area-clear-function t)
+        (remove-hook 'after-change-functions 'rng-after-change-function t))))
+
+(defun rng-set-schema-file-and-validate (filename)
+  "Sets the schema and turns on `rng-validate-mode' if not already on.
+The schema is set like `rng-set-schema'."
+  (interactive "fSchema file: ")
+  (rng-set-schema-file filename)
+  (or rng-validate-mode (rng-validate-mode)))
+
+(defun rng-set-document-type-and-validate (type-id)
+  (interactive (list (rng-read-type-id)))
+  (and (rng-set-document-type type-id)
+       (or rng-validate-mode (rng-validate-mode))))
+    
+(defun rng-auto-set-schema-and-validate ()
+  "Set the schema for this buffer automatically and turn on `rng-validate-mode'.
+The schema is set like `rng-auto-set-schema'."
+  (interactive)
+  (rng-auto-set-schema)
+  (or rng-validate-mode (rng-validate-mode)))
+
+(defun rng-after-change-function (start end pre-change-len)
+  ;; Work around bug in insert-file-contents.
+  (when (> end (1+ (buffer-size)))
+    (setq start 1)
+    (setq end (1+ (buffer-size))))
+  (setq rng-message-overlay-inhibit-point nil)
+  (nxml-with-unmodifying-text-property-changes
+    (rng-clear-cached-state start end))
+  ;; rng-validate-up-to-date-end holds the position before the change
+  ;; Adjust it to reflect the change.
+  (if (< start rng-validate-up-to-date-end)
+      (setq rng-validate-up-to-date-end
+           (if (<= (+ start pre-change-len) rng-validate-up-to-date-end)
+               (+ rng-validate-up-to-date-end
+                  (- end start pre-change-len))
+             start)))
+  ;; Adjust the conditional zone
+  (cond (rng-conditional-up-to-date-start
+        (when (< rng-conditional-up-to-date-start end)
+          (if (< end rng-conditional-up-to-date-end)
+              (set-marker rng-conditional-up-to-date-start end)
+            (rng-clear-conditional-region))))
+       ((< end rng-validate-up-to-date-end)
+        (setq rng-conditional-up-to-date-end
+              (copy-marker rng-validate-up-to-date-end nil))
+        (setq rng-conditional-up-to-date-start
+              (copy-marker end t))))
+  ;; Adjust rng-validate-up-to-date-end
+  (if (< start rng-validate-up-to-date-end)
+      (setq rng-validate-up-to-date-end start))
+  ;; Must make rng-validate-up-to-date-end < point-max
+  ;; (unless the buffer is empty).
+  ;; otherwise validate-prepare will say there's nothing to do.
+  ;; Don't use (point-max) because we may be narrowed.
+  (if (> rng-validate-up-to-date-end (buffer-size))
+      (setq rng-validate-up-to-date-end
+           (max 1 (1- rng-validate-up-to-date-end))))
+  ;; Arrange to revalidate
+  (rng-activate-timers)
+  ;; Need to do this after activating the timer
+  (force-mode-line-update))
+
+(defun rng-compute-mode-line-string ()
+  (cond (rng-validate-timer
+        (concat " Validated:"
+                (number-to-string
+                 ;; Use floor rather than round because we want
+                 ;; to show 99% rather than 100% for changes near
+                 ;; the end.
+                 (floor (if (eq (buffer-size) 0)
+                            0.0
+                          (/ (* (- rng-validate-up-to-date-end 1) 100.0)
+                             (buffer-size)))))
+                "%%"))
+       ((> rng-error-count 0)
+        (concat " "
+                (propertize "Invalid"
+                            'help-echo "mouse-1: go to first error"
+                            'local-map (make-mode-line-mouse-map
+                                        'mouse-1
+                                        'rng-mouse-first-error))))
+       (t " Valid")))
+   
+(defun rng-cancel-timers ()
+  (let ((inhibit-quit t))
+    (when rng-validate-timer
+      (cancel-timer rng-validate-timer)
+      (setq rng-validate-timer nil))
+    (when rng-validate-quick-timer
+      (cancel-timer rng-validate-quick-timer)
+      (setq rng-validate-quick-timer nil))))
+
+(defun rng-kill-timers ()
+  ;; rng-validate-timer and rng-validate-quick-timer have the
+  ;; permanent-local property, so that the timers can be
+  ;; cancelled even after changing mode.
+  ;; This function takes care of cancelling the timers and
+  ;; then killing the local variables.
+  (when (local-variable-p 'rng-validate-timer)
+    (when rng-validate-timer
+      (cancel-timer rng-validate-timer))
+    (kill-local-variable 'rng-validate-timer))
+  (when (local-variable-p 'rng-validate-quick-timer)
+    (when rng-validate-quick-timer
+      (cancel-timer rng-validate-quick-timer))
+    (kill-local-variable 'rng-validate-quick-timer)))
+      
+(defun rng-activate-timers ()
+  (unless rng-validate-timer
+    (let ((inhibit-quit t))
+      (setq rng-validate-timer
+           (run-with-idle-timer rng-validate-delay
+                                t
+                                'rng-validate-while-idle
+                                (current-buffer)))
+      (setq rng-validate-quick-timer
+           (run-with-idle-timer rng-validate-quick-delay
+                                t
+                                'rng-validate-quick-while-idle
+                                (current-buffer))))))
+
+(defun rng-validate-clear ()
+  (rng-validate-mode 1 t))
+
+;; These two variables are dynamically bound and used
+;; to pass information between rng-validate-while-idle
+;; and rng-validate-while-idle-continue-p.
+
+(defvar rng-validate-display-point nil)
+(defvar rng-validate-display-modified-p nil)
+
+(defun rng-validate-while-idle-continue-p ()
+  ;; input-pending-p and sit-for run timers that are
+  ;; ripe.  Binding timer-idle-list to nil prevents
+  ;; this.  If we don't do this, then any ripe timers
+  ;; will get run, and we won't get any chance to
+  ;; validate until Emacs becomes idle again or until
+  ;; the other lower priority timers finish (which
+  ;; can take a very long time in the case of
+  ;; jit-lock).
+  (let ((timer-idle-list nil))
+    (and (not (input-pending-p))
+        ;; Fake rng-validate-up-to-date-end so that the mode line
+        ;; shows progress.  Also use this to save point.
+        (let ((rng-validate-up-to-date-end (point)))
+          (goto-char rng-validate-display-point)
+          (when (not rng-validate-display-modified-p)
+            (restore-buffer-modified-p nil))
+          (force-mode-line-update)
+          (let ((continue (sit-for 0)))
+            (goto-char rng-validate-up-to-date-end)
+            continue)))))
+
+;; Calling rng-do-some-validation once with a continue-p function, as
+;; opposed to calling it repeatedly, helps on initial validation of a
+;; large buffer with lots of errors.  The overlays for errors will all
+;; get added when rng-do-some-validation returns and won't slow the
+;; validation process down.
+
+(defun rng-validate-while-idle (buffer)
+  (with-current-buffer buffer
+    (if rng-validate-mode
+       (if (let ((rng-validate-display-point (point))
+                 (rng-validate-display-modified-p (buffer-modified-p)))
+             (rng-do-some-validation 'rng-validate-while-idle-continue-p))
+           (force-mode-line-update)
+         (rng-validate-done))
+      ;; must have done kill-all-local-variables
+      (rng-kill-timers))))
+
+(defun rng-validate-quick-while-idle (buffer)
+  (with-current-buffer buffer
+    (if rng-validate-mode
+       (if (rng-do-some-validation)
+           (force-mode-line-update)
+         (rng-validate-done))
+      ;; must have done kill-all-local-variables
+      (rng-kill-timers))))
+
+(defun rng-validate-done ()
+  (when (or (not (current-message))
+           (rng-current-message-from-error-overlay-p))
+    (rng-error-overlay-message (or (rng-error-overlay-after (point)) 
+                                  (rng-error-overlay-after (1- (point))))))
+  (rng-cancel-timers)
+  (force-mode-line-update))
+
+(defun rng-do-some-validation (&optional continue-p-function)
+  "Do some validation work. Return t if more to do, nil otherwise."
+  (save-excursion
+    (save-restriction
+      (widen)
+      (nxml-with-invisible-motion
+       (condition-case err
+           (and (rng-validate-prepare)
+                (let ((rng-dt-namespace-context-getter '(nxml-ns-get-context)))
+                  (nxml-with-unmodifying-text-property-changes
+                    (rng-do-some-validation-1 continue-p-function))))
+         ;; errors signalled from a function run by an idle timer
+         ;; are ignored; if we don't catch them, validation
+         ;; will get mysteriously stuck at a single place
+         (rng-compile-error
+          (message "Incorrect schema. %s" (nth 1 err))
+          (rng-validate-mode 0)
+          nil)
+         (error
+          (message "Internal error in rng-validate-mode triggered at buffer position %d. %s"
+                   (point)
+                   (error-message-string err))
+          (rng-validate-mode 0)
+          nil))))))
+
+(defun rng-validate-prepare ()
+  "Prepare to do some validation, initializing point and the state.
+Return t if there is work to do, nil otherwise."
+  (cond ((= rng-validate-up-to-date-end (point-min))
+        (rng-set-initial-state)
+        t)
+       ((= rng-validate-up-to-date-end (point-max))
+        nil)
+       (t (let ((state (get-text-property (1- rng-validate-up-to-date-end)
+                                          'rng-state)))
+            (cond (state
+                   (rng-restore-state state)
+                   (goto-char rng-validate-up-to-date-end))
+                  (t
+                   (let ((pos (previous-single-property-change
+                               rng-validate-up-to-date-end
+                               'rng-state)))
+                     (cond (pos
+                            (rng-restore-state
+                             (or (get-text-property (1- pos) 'rng-state)
+                                 (error "Internal error: state null")))
+                            (goto-char pos))
+                           (t (rng-set-initial-state))))))))))
+
+
+(defun rng-do-some-validation-1 (&optional continue-p-function)
+  (let ((limit (+ rng-validate-up-to-date-end
+                 rng-validate-chunk-size))
+       (remove-start rng-validate-up-to-date-end)
+       (next-cache-point (+ (point) rng-state-cache-distance))
+       (continue t)
+       (xmltok-dtd rng-dtd)
+       have-remaining-chars
+       xmltok-type
+       xmltok-start
+       xmltok-name-colon
+       xmltok-name-end
+       xmltok-replacement
+       xmltok-attributes
+       xmltok-namespace-attributes
+       xmltok-dependent-regions
+       xmltok-errors)
+    (when (= (point) 1)
+      (let ((regions (xmltok-forward-prolog)))
+       (rng-clear-overlays 1 (point))
+       (while regions
+         (when (eq (aref (car regions) 0) 'encoding-name)
+           (rng-process-encoding-name (aref (car regions) 1)
+                                      (aref (car regions) 2)))
+         (setq regions (cdr regions))))
+      (unless (equal rng-dtd xmltok-dtd)
+       (rng-clear-conditional-region))
+      (setq rng-dtd xmltok-dtd))
+    (while continue
+      (setq have-remaining-chars (rng-forward))
+      (let ((pos (point)))
+       (setq continue
+             (and have-remaining-chars
+                  (or (< pos limit)
+                      (and continue-p-function
+                           (funcall continue-p-function)
+                           (setq limit (+ limit rng-validate-chunk-size))
+                           t))))
+       (cond ((and rng-conditional-up-to-date-start
+                   ;; > because we are getting the state from (1- pos)
+                   (> pos rng-conditional-up-to-date-start)
+                   (< pos rng-conditional-up-to-date-end)
+                   (rng-state-matches-current (get-text-property (1- pos)
+                                                                 'rng-state)))
+              (when (< remove-start (1- pos))
+                (rng-clear-cached-state remove-start (1- pos)))
+              ;; sync up with cached validation state
+              (setq continue nil)
+              ;; do this before settting rng-validate-up-to-date-end
+              ;; in case we get a quit
+              (rng-mark-xmltok-errors)
+              (rng-mark-xmltok-dependent-regions)
+              (setq rng-validate-up-to-date-end
+                    (marker-position rng-conditional-up-to-date-end))
+              (rng-clear-conditional-region)
+              (setq have-remaining-chars
+                    (< rng-validate-up-to-date-end (point-max))))
+             ((or (>= pos next-cache-point)
+                  (not continue))
+              (setq next-cache-point (+ pos rng-state-cache-distance))
+              (rng-clear-cached-state remove-start pos)
+              (when have-remaining-chars
+                (rng-cache-state (1- pos)))
+              (setq remove-start pos)
+              (unless continue
+                ;; if we have just blank chars skip to the end
+                (when have-remaining-chars
+                  (skip-chars-forward " \t\r\n")
+                  (when (= (point) (point-max))
+                    (rng-clear-overlays pos (point))
+                    (rng-clear-cached-state pos (point))
+                    (setq have-remaining-chars nil)
+                    (setq pos (point))))
+                (when (not have-remaining-chars)
+                  (rng-process-end-document))
+                (rng-mark-xmltok-errors)
+                (rng-mark-xmltok-dependent-regions)
+                (setq rng-validate-up-to-date-end pos)
+                (when rng-conditional-up-to-date-end
+                  (cond ((<= rng-conditional-up-to-date-end pos)
+                         (rng-clear-conditional-region))
+                        ((< rng-conditional-up-to-date-start pos)
+                         (set-marker rng-conditional-up-to-date-start
+                                     pos)))))))))
+    have-remaining-chars))
+    
+(defun rng-clear-conditional-region ()
+  (when rng-conditional-up-to-date-start
+    (set-marker rng-conditional-up-to-date-start nil)
+    (setq rng-conditional-up-to-date-start nil))
+  (when rng-conditional-up-to-date-end
+    (set-marker rng-conditional-up-to-date-end nil)
+    (setq rng-conditional-up-to-date-end nil)))
+
+(defun rng-clear-cached-state (start end)
+  "Clear cached state between START and END."
+  (remove-text-properties start end '(rng-state nil)))
+
+(defun rng-cache-state (pos)
+  "Save the current state in a text property on the character at pos."
+  (put-text-property pos
+                    (1+ pos)
+                    'rng-state
+                    (rng-get-state)))
+
+(defun rng-state-matches-current (state)
+  (and state
+       (rng-match-state-equal (car state))
+       (nxml-ns-state-equal (nth 1 state))
+       (equal (nth 2 state) rng-open-elements)))
+
+(defun rng-get-state ()
+  (list (rng-match-state)
+       (nxml-ns-state)
+       rng-open-elements))
+
+(defun rng-restore-state (state)
+  (rng-set-match-state (car state))
+  (setq state (cdr state))
+  (nxml-ns-set-state (car state))
+  (setq rng-open-elements (cadr state))
+  (setq rng-pending-contents nil)
+  (setq rng-collecting-text (rng-match-text-typed-p)))
+
+(defun rng-set-initial-state ()
+  (nxml-ns-init)
+  (rng-match-start-document)
+  (setq rng-open-elements nil)
+  (setq rng-pending-contents nil)
+  (goto-char (point-min)))
+
+(defun rng-clear-overlays (beg end)
+  (unless rng-parsing-for-state
+    (let ((overlays (overlays-in beg end)))
+      (while overlays
+       (let* ((overlay (car overlays))
+              (category (overlay-get overlay 'category)))
+         (cond ((eq category 'rng-error)
+                (let ((inhibit-quit t))
+                  (when (eq overlay rng-message-overlay)
+                    (rng-error-overlay-message nil))
+                  (delete-overlay overlay)
+                  ;; rng-error-count could be nil
+                  ;; if overlays left over from a previous use
+                  ;; of rng-validate-mode that ended with a change of mode
+                  (when rng-error-count
+                    (setq rng-error-count (1- rng-error-count)))))
+               ((and (eq category 'rng-dependent)
+                     (<= beg (overlay-start overlay)))
+                (delete-overlay overlay))))
+       (setq overlays (cdr overlays))))))
+
+;;; Dependent regions
+
+(defun rng-mark-xmltok-dependent-regions ()
+  (while xmltok-dependent-regions
+    (apply 'rng-mark-xmltok-dependent-region
+          (car xmltok-dependent-regions))
+    (setq xmltok-dependent-regions
+         (cdr xmltok-dependent-regions))))
+
+(defun rng-mark-xmltok-dependent-region (fun start end &rest args)
+  (let ((overlay (make-overlay start end nil t t)))
+    (overlay-put overlay 'category 'rng-dependent)
+    (overlay-put overlay 'rng-funargs (cons fun args))))
+
+(put 'rng-dependent 'evaporate t)
+(put 'rng-dependent 'modification-hooks '(rng-dependent-region-changed))
+(put 'rng-dependent 'insert-behind-hooks '(rng-dependent-region-changed))
+
+(defun rng-dependent-region-changed (overlay
+                                    after-p
+                                    change-start
+                                    change-end
+                                    &optional pre-change-length)
+  (when (and after-p
+            ;; Emacs sometimes appears to call deleted overlays
+            (overlay-start overlay)
+            (let ((funargs (overlay-get overlay 'rng-funargs)))
+              (save-match-data
+                (save-excursion
+                  (save-restriction
+                    (widen)
+                    (apply (car funargs)
+                           (append (list change-start
+                                         change-end
+                                         pre-change-length
+                                         (overlay-start overlay)
+                                         (overlay-end overlay))
+                                   (cdr funargs))))))))
+    (rng-after-change-function (overlay-start overlay)
+                              change-end
+                              (+ pre-change-length
+                                 (- (overlay-start overlay)
+                                    change-start)))
+    (delete-overlay overlay)))
+
+;;; Error state
+
+(defun rng-mark-xmltok-errors ()
+  (while xmltok-errors
+    (let ((err (car xmltok-errors)))
+      (rng-mark-not-well-formed (xmltok-error-message err)
+                               (xmltok-error-start err)
+                               (xmltok-error-end err)))
+    (setq xmltok-errors (cdr xmltok-errors))))
+
+(defun rng-mark-invalid (message beg end)
+  (rng-mark-error message beg end))
+
+(defun rng-mark-not-well-formed (message beg end)
+  ;; Don't try to validate further
+  ;;(rng-set-match-state rng-not-allowed-ipattern)
+  (rng-mark-error message beg end))
+
+(defun rng-mark-error (message beg end)
+  (unless rng-parsing-for-state
+    (let ((overlays (overlays-in beg end)))
+      (while (and overlays message)
+       (let ((o (car overlays)))
+         (when (and (eq (overlay-get o 'category) 'rng-error)
+                    (= (overlay-start o) beg)
+                    (= (overlay-end o) end))
+           (overlay-put o
+                        'help-echo
+                        (concat (overlay-get o 'help-echo)
+                                "\n"
+                                message))
+           (setq message nil)))
+       (setq overlays (cdr overlays))))
+    (when message
+      (let ((inhibit-quit t))
+       (setq rng-error-count (1+ rng-error-count))
+       (let ((overlay
+              (make-overlay beg end nil t
+                            ;; Need to make the rear delimiter advance
+                            ;; with the front delimiter when the overlay
+                            ;; is empty, otherwise the front delimiter
+                            ;; will move past the rear delimiter.
+                            (= beg end))))
+         ;; Ensure when we have two overlapping messages, the help-echo
+         ;; of the one that starts first is shown
+         (overlay-put overlay 'priority beg)
+         (overlay-put overlay 'category 'rng-error)
+         (overlay-put overlay 'help-echo message))))))
+
+(put 'rng-error 'face 'rng-error-face)
+(put 'rng-error 'modification-hooks '(rng-error-modified))
+
+;; If we don't do this, then the front delimiter can move
+;; past the end delimiter.
+(defun rng-error-modified (overlay after-p beg end &optional pre-change-len)
+  (when (and after-p
+            (overlay-start overlay)    ; check not deleted
+            (>= (overlay-start overlay)
+                (overlay-end overlay)))
+    (let ((inhibit-quit t))
+      (delete-overlay overlay)
+      (setq rng-error-count (1- rng-error-count)))))
+
+(defun rng-echo-area-clear-function ()
+  (setq rng-message-overlay-current nil))
+
+;;; Error navigation
+            
+(defun rng-maybe-echo-error-at-point ()
+  (when (or (not (current-message))
+           (rng-current-message-from-error-overlay-p))
+    (rng-error-overlay-message (rng-error-overlay-after (point)))))
+
+(defun rng-error-overlay-after (pos)
+  (let ((overlays (overlays-in pos (1+ pos)))
+       (best nil))
+    (while overlays
+      (let ((overlay (car overlays)))
+       (when (and (eq (overlay-get overlay 'category)
+                      'rng-error)
+                  (or (not best)
+                      (< (overlay-start best)
+                         (overlay-start overlay))))
+         (setq best overlay)))
+      (setq overlays (cdr overlays)))
+    best))
+
+(defun rng-first-error ()
+  "Go to the first validation error.
+Turn on `rng-validate-mode' if it is not already on."
+  (interactive)
+  (or rng-validate-mode (rng-validate-mode))
+  (when (and (eq rng-validate-up-to-date-end 1)
+            (< rng-validate-up-to-date-end (point-max)))
+    (rng-do-some-validation))
+  (let ((err (rng-find-next-error-overlay (1- (point-min)))))
+    (if err
+       (rng-goto-error-overlay err)
+      (let ((pos (save-excursion
+                  (goto-char (point-min))
+                  (rng-next-error 1))))
+       (when pos
+         (goto-char pos))))))
+
+(defun rng-mouse-first-error (event)
+  "Go to the first validation error from a mouse click."
+  (interactive "e")
+  (select-window (posn-window (event-start event)))
+  (rng-first-error))
+
+(defun rng-next-error (arg)
+  "Go to the next validation error after point.
+Turn on `rng-validate-mode' if it is not already on.
+A prefix ARG specifies how many errors to move. A negative ARG
+moves backwards. Just \\[universal-argument] as a prefix
+means goto the first error."
+  (interactive "P")
+  (if (consp arg)
+      (rng-first-error)
+    (or rng-validate-mode (rng-validate-mode))
+    (setq arg (prefix-numeric-value arg))
+    (if (< arg 0)
+       (rng-previous-error-1 (- arg))
+      (rng-next-error-1 arg))))
+
+(defun rng-previous-error (arg)
+  "Go to the previous validation error before point.
+Turn on `rng-validate-mode' if it is not already on.
+A prefix ARG specifies how many errors to move. A negative ARG
+moves forwards. Just \\[universal-argument] as a prefix
+means goto the first error."
+  (interactive "P")
+  (if (consp arg)
+      (rng-first-error)
+    (or rng-validate-mode (rng-validate-mode))
+    (setq arg (prefix-numeric-value arg))
+    (if (< arg 0)
+       (rng-next-error-1 (- arg))
+      (rng-previous-error-1 arg))))
+
+(defun rng-next-error-1 (arg)
+  (let* ((pos (point))
+        err last-err)
+    (while (and (> arg 0)
+               (setq err (rng-find-next-error-overlay pos)))
+      (setq arg (1- arg))
+      (setq last-err err)
+      (setq pos (overlay-start err)))
+    (when (> arg 0)
+      (setq pos (max pos (1- rng-validate-up-to-date-end)))      
+      (when (< rng-validate-up-to-date-end (point-max))
+       (message "Parsing...")
+       (while (let ((more-to-do (rng-do-some-validation)))
+                (while (and (> arg 0)
+                            (setq err (rng-find-next-error-overlay pos)))
+                  (setq arg (1- arg))
+                  (setq last-err err)
+                  (setq pos (overlay-start err)))
+                (when (and (> arg 0)
+                           more-to-do
+                           (< rng-validate-up-to-date-end (point-max)))
+                  ;; Display percentage validated.
+                  (force-mode-line-update)
+                  ;; Force redisplay but don't allow idle timers to run.
+                  (let ((timer-idle-list nil))
+                    (sit-for 0))
+                  (setq pos
+                        (max pos (1- rng-validate-up-to-date-end)))
+                  t)))))
+    (if last-err
+       (rng-goto-error-overlay last-err)
+      (message "No more errors")
+      nil)))
+
+(defun rng-previous-error-1 (arg)
+  (let* ((pos (point))
+        err last-err)
+    (while (and (> arg 0)
+               (setq err (rng-find-previous-error-overlay pos)))
+      (setq pos (overlay-start err))
+      (setq last-err err)
+      (setq arg (1- arg)))
+    (when (and (> arg 0)
+              (< rng-validate-up-to-date-end (min pos (point-max))))
+      (message "Parsing...")
+      (while (and (rng-do-some-validation)
+                 (< rng-validate-up-to-date-end (min pos (point-max))))
+       (force-mode-line-update)
+       ;; Force redisplay but don't allow idle timers to run.
+       (let ((timer-idle-list nil))
+         (sit-for 0)))
+      (while (and (> arg 0)
+                 (setq err (rng-find-previous-error-overlay pos)))
+       (setq pos (overlay-start err))
+       (setq last-err err)
+       (setq arg (1- arg))))
+    (if last-err
+       (rng-goto-error-overlay last-err)
+      (message "No previous errors")
+      nil)))
+      
+(defun rng-goto-error-overlay (err)
+  "Goto the start of error overlay ERR and print its message."
+  (goto-char (overlay-start err))
+  (setq rng-message-overlay-inhibit-point nil)
+  (rng-error-overlay-message err))
+
+(defun rng-error-overlay-message (err)
+  (if err
+      (unless (or (and (eq rng-message-overlay-inhibit-point (point))
+                      (eq rng-message-overlay err))
+                 (= (point-max) 1))
+       (message "%s" (overlay-get err 'help-echo))
+       (setq rng-message-overlay-current t)
+       (setq rng-message-overlay-inhibit-point (point)))
+    (when (rng-current-message-from-error-overlay-p)
+      (message nil))
+    (setq rng-message-overlay-inhibit-point nil))
+  (setq rng-message-overlay err))
+
+(defun rng-current-message-from-error-overlay-p ()
+  (and rng-message-overlay-current
+       rng-message-overlay
+       (equal (overlay-get rng-message-overlay 'help-echo)
+             (current-message))))
+
+(defun rng-find-next-error-overlay (pos)
+  "Return the overlay for the next error starting after POS.
+Return nil if there is no such overlay or it is out of date.
+Do not do any additional validation."
+  (when rng-error-count
+    (let (done found overlays)
+      (while (not done)
+       (cond (overlays
+              (let ((overlay (car overlays)))
+                (setq overlays (cdr overlays))
+                (when (and (eq (overlay-get overlay 'category) 'rng-error)
+                           ;; Is it the first?
+                           (= (overlay-start overlay) pos)
+                           ;; Is it up to date?
+                           (<= (overlay-end overlay)
+                               rng-validate-up-to-date-end))
+                  (setq done t)
+                  (setq found overlay))))
+             ((or (= pos (point-max))
+                  (> (setq pos (next-overlay-change pos))
+                     rng-validate-up-to-date-end))
+              (setq done t))
+             (t (setq overlays (overlays-in pos (1+ pos))))))
+      found)))
+
+(defun rng-find-previous-error-overlay (pos)
+  "Return the overlay for the last error starting before POS.
+Return nil if there is no such overlay or it is out of date.
+Do not do any additional validation."
+  (when (and rng-error-count
+            (<= pos rng-validate-up-to-date-end))
+    (let (done found overlays)
+      (while (not done)
+       (cond (overlays
+              (let ((overlay (car overlays)))
+                (setq overlays (cdr overlays))
+                (when (and (eq (overlay-get overlay 'category) 'rng-error)
+                           ;; Is it the first?
+                           (= (overlay-start overlay) pos))
+                  (setq done t)
+                  (setq found overlay))))
+             ((= pos (point-min))
+              (setq done t))
+             (t
+              (setq pos (previous-overlay-change pos))
+              (setq overlays (overlays-in pos (1+ pos))))))
+      found)))
+
+;;; Parsing
+
+(defun rng-forward (&optional limit)
+  "Move forward over one or more tokens updating the state.
+If LIMIT is nil, stop after tags.
+If LIMIT is non-nil, stop when end of last token parsed is >= LIMIT.
+Return nil at end of buffer, t otherwise."
+  (let (type)
+    (while (progn
+            (setq type (xmltok-forward))
+            (rng-clear-overlays xmltok-start (point))
+            (let ((continue
+                   (cond ((eq type 'start-tag)
+                          (rng-process-start-tag 'start-tag)
+                          nil)
+                         ((eq type 'end-tag)
+                          (rng-process-end-tag)
+                          nil)
+                         ((eq type 'empty-element)
+                          (rng-process-start-tag 'empty-element)
+                          nil)
+                         ((eq type 'space)
+                          (rng-process-text xmltok-start nil t)
+                          t)
+                         ((eq type 'data)
+                          (rng-process-text xmltok-start nil nil)
+                          t)
+                         ((memq type '(entity-ref char-ref))
+                          (cond (xmltok-replacement
+                                 (rng-process-text xmltok-start
+                                                   nil
+                                                   'maybe
+                                                   xmltok-replacement))
+                                ((eq type 'char-ref)
+                                 (rng-process-unknown-char))
+                                (t
+                                 (rng-process-unknown-entity)))
+                          t)
+                         ((eq type 'cdata-section)
+                          (rng-process-text (+ xmltok-start 9) ; "<![CDATA["
+                                            (- (point) 3) ; "]]>"
+                                            'maybe)
+                          t)
+                         ((eq type 'partial-start-tag)
+                          (rng-process-start-tag 'partial-start-tag)
+                          t)
+                         ((eq type 'partial-empty-element)
+                          (rng-process-start-tag 'empty-element)
+                          t)
+                         ((eq type 'partial-end-tag)
+                          (rng-process-end-tag 'partial)
+                          t)
+                         (t type))))
+              (if limit
+                  (< (point) limit)
+                continue))))
+    (and type t)))
+
+(defun rng-process-start-tag (tag-type)
+  "TAG-TYPE is `start-tag' for a start-tag, `empty-element' for
+an empty element.  partial-empty-element should be passed
+as empty-element."
+  (and rng-collecting-text (rng-flush-text))
+  (setq rng-collecting-text nil)
+  (setq rng-pending-contents nil)
+  (rng-process-namespaces)
+  (let ((tag (rng-process-tag-name)))
+    (rng-process-attributes)
+    ;; set the state appropriately
+    (cond ((eq tag-type 'empty-element)
+          (rng-process-start-tag-close)
+          ;; deal with missing content with empty element
+          (when (not (rng-match-empty-content))
+            (rng-match-after)
+            (rng-mark-start-tag-close "Empty content not allowed"))
+          (nxml-ns-pop-state))
+         ((eq tag-type 'start-tag)
+          (rng-process-start-tag-close)
+          (setq rng-collecting-text (rng-match-text-typed-p))
+          (rng-push-tag tag))
+         ((eq tag-type 'partial-start-tag)
+          (rng-process-start-tag-close)
+          (rng-match-after)
+          (nxml-ns-pop-state)))))
+
+(defun rng-process-namespaces ()
+  (let ((nsatts xmltok-namespace-attributes)
+       prefixes)
+    (nxml-ns-push-state)
+    (while nsatts
+      (let* ((att (car nsatts))
+            (value (xmltok-attribute-value att)))
+       (when value
+         (let ((ns (nxml-make-namespace value))
+               (prefix (and (xmltok-attribute-prefix att)
+                            (xmltok-attribute-local-name att))))
+           (cond ((member prefix prefixes)
+                  (rng-mark-invalid "Duplicate namespace declaration"
+                                    (xmltok-attribute-name-start att)
+                                    (xmltok-attribute-name-end att)))
+                 ((not prefix)
+                  (nxml-ns-set-default ns))
+                 (ns
+                  (nxml-ns-set-prefix prefix ns))
+                 (t
+                  ;; cannot have xmlns:foo=""
+                  (rng-mark-invalid "Namespace prefix cannot be undeclared"
+                                    (1- (xmltok-attribute-value-start att))
+                                    (1+ (xmltok-attribute-value-end att)))))
+           (setq prefixes (cons prefix prefixes)))))
+      (setq nsatts (cdr nsatts)))))
+
+(defun rng-process-tag-name ()
+  (let* ((prefix (xmltok-start-tag-prefix))
+        (local-name (xmltok-start-tag-local-name))
+        (name
+         (if prefix
+             (let ((ns (nxml-ns-get-prefix prefix)))
+               (cond (ns (cons ns local-name))
+                     ((and (setq ns
+                                 (rng-match-infer-start-tag-namespace
+                                  local-name))
+                           (rng-match-start-tag-open (cons ns local-name)))
+                      (nxml-ns-set-prefix prefix ns)
+                      (rng-mark-start-tag-close "Missing xmlns:%s=\"%s\""
+                                                prefix
+                                                (nxml-namespace-name ns))
+                      nil)
+                     (t
+                      (rng-recover-bad-element-prefix)
+                      nil)))
+           (cons (nxml-ns-get-default) local-name))))
+    (when (and name
+              (not (rng-match-start-tag-open name)))
+      (unless (and (not (car name))
+                  (let ((ns (rng-match-infer-start-tag-namespace (cdr name))))
+                    (and ns
+                         (rng-match-start-tag-open (cons ns local-name))
+                         (progn
+                           (nxml-ns-set-default ns)
+                           ;; XXX need to check we don't have xmlns=""
+                           (rng-mark-start-tag-close "Missing xmlns=\"%s\""
+                                                     (nxml-namespace-name ns))
+                           t))))
+       (rng-recover-start-tag-open name)))
+    (cons prefix local-name)))
+
+(defun rng-process-attributes ()
+  (let ((atts xmltok-attributes)
+       names)
+    (while atts
+      (let* ((att (car atts))
+            (prefix (xmltok-attribute-prefix att))
+            (local-name (xmltok-attribute-local-name att))
+            (name
+             (if prefix
+                 (let ((ns (nxml-ns-get-prefix prefix)))
+                   (and ns
+                        (cons ns local-name)))
+               (cons nil local-name))))
+       (cond ((not name)
+              (rng-recover-bad-attribute-prefix att))
+             ((member name names)
+              (rng-recover-duplicate-attribute-name att))
+             ((not (rng-match-attribute-name name))
+              (rng-recover-attribute-name att))
+             ((rng-match-text-typed-p)
+              (let ((value (xmltok-attribute-value att)))
+                (if value
+                    (or (rng-match-attribute-value value)
+                        (rng-recover-attribute-value att))
+                  (rng-match-after))))
+             (t (or (rng-match-end-tag)
+                    (error "Internal error:\
+ invalid on untyped attribute value"))))
+       (setq names (cons name names)))
+      (setq atts (cdr atts)))))
+
+(defun rng-process-start-tag-close ()
+  ;; deal with missing attributes
+  (unless (rng-match-start-tag-close)
+    (rng-mark-start-tag-close (rng-missing-attributes-message))
+    (rng-match-ignore-attributes)))
+
+(defun rng-mark-start-tag-close (&rest args)
+  (when (not (eq xmltok-type 'partial-start-tag))
+    (rng-mark-invalid (apply 'format args)
+                     (- (point)
+                        (if (eq xmltok-type 'empty-element)
+                            2
+                          1))
+                     (point))))
+
+(defun rng-recover-bad-element-prefix ()
+  (rng-mark-invalid "Prefix not declared"
+                   (1+ xmltok-start)
+                   xmltok-name-colon)
+  (rng-match-unknown-start-tag-open))
+
+(defun rng-recover-bad-attribute-prefix (att)
+  (rng-mark-invalid "Prefix not declared"
+                   (xmltok-attribute-name-start att)
+                   (xmltok-attribute-name-colon att)))
+
+(defun rng-recover-duplicate-attribute-name (att)
+  (rng-mark-invalid "Duplicate attribute"
+                   (xmltok-attribute-name-start att)
+                   (xmltok-attribute-name-end att)))
+
+(defun rng-recover-start-tag-open (name)
+  (let ((required (rng-match-required-element-name)))
+    (cond ((and required
+               (rng-match-start-tag-open required)
+               (rng-match-after)
+               (rng-match-start-tag-open name))
+          (rng-mark-invalid (concat "Missing element "
+                                    (rng-quote-string
+                                     (rng-name-to-string required)))
+                            xmltok-start
+                            (1+ xmltok-start)))
+         ((and (rng-match-optionalize-elements)
+               (rng-match-start-tag-open name))
+          (rng-mark-invalid "Required elements missing"
+                            xmltok-start
+                            (1+ xmltok-start)))
+         ((rng-match-out-of-context-start-tag-open name)
+          (rng-mark-invalid "Element not allowed in this context"
+                            (1+ xmltok-start)
+                            xmltok-name-end))
+         (t
+          (rng-match-unknown-start-tag-open)
+          (rng-mark-invalid "Unknown element"
+                            (1+ xmltok-start)
+                            xmltok-name-end)))))
+
+(defun rng-recover-attribute-value (att)
+  (let ((start (xmltok-attribute-value-start att))
+       (end (xmltok-attribute-value-end att)))
+    (if (= start end)
+       (rng-mark-invalid "Empty attribute value invalid" start (1+ end))
+      (rng-mark-invalid "Attribute value invalid" start end)))
+  (rng-match-after))
+
+(defun rng-recover-attribute-name (att)
+  (rng-mark-invalid "Attribute not allowed"
+                   (xmltok-attribute-name-start att)
+                   (xmltok-attribute-name-end att)))
+
+(defun rng-missing-attributes-message ()
+  (let ((required-attributes
+        (rng-match-required-attribute-names)))
+    (cond ((not required-attributes)
+          "Required attributes missing")
+         ((not (cdr required-attributes))
+          (concat "Missing attribute "
+                  (rng-quote-string
+                   (rng-name-to-string (car required-attributes) t))))
+         (t
+          (concat "Missing attributes "
+                  (mapconcat (lambda (nm)
+                               (rng-quote-string
+                                (rng-name-to-string nm t)))
+                             required-attributes
+                             ", "))))))
+      
+(defun rng-process-end-tag (&optional partial)
+  (cond ((not rng-open-elements)
+        (rng-mark-not-well-formed "Extra end-tag"
+                                  xmltok-start
+                                  (point)))
+       ((or partial
+            (equal (cons (xmltok-end-tag-prefix)
+                         (xmltok-end-tag-local-name))
+                   (car rng-open-elements)))
+        (rng-end-element))
+       (t (rng-recover-mismatched-end-tag))))
+
+(defun rng-end-element ()
+  (if rng-collecting-text
+      (let ((contents (rng-contents-string)))
+       (cond ((not contents) (rng-match-after))
+             ((not (rng-match-element-value contents))
+              (let* ((region (rng-contents-region)))
+                (if (not region)
+                    (rng-mark-invalid "Empty content not allowed"
+                                      xmltok-start
+                                      (+ xmltok-start 2))
+                  (rng-mark-invalid "Invalid data"
+                                    (car region)
+                                    (cdr region))))
+              (rng-match-after)))
+       (setq rng-collecting-text nil)
+       (setq rng-pending-contents nil))
+    (unless (rng-match-end-tag)
+       (rng-mark-invalid (rng-missing-element-message)
+                        xmltok-start
+                        (+ xmltok-start 2))
+       (rng-match-after)))
+  (nxml-ns-pop-state)
+  (when (eq (car rng-open-elements) t)
+    (rng-pop-tag))
+  (rng-pop-tag))
+
+(defun rng-missing-element-message ()
+  (let ((element (rng-match-required-element-name)))
+    (if element
+       (concat "Missing element "
+               (rng-quote-string (rng-name-to-string element)))
+      "Required child elements missing")))
+
+(defun rng-recover-mismatched-end-tag ()
+  (let* ((name (cons (xmltok-end-tag-prefix)
+                    (xmltok-end-tag-local-name))))
+    (cond ((member name (cdr rng-open-elements))
+          (let* ((suppress-error (eq (car rng-open-elements) t))
+                 missing top)
+            (while (progn
+                     (setq top (car rng-open-elements))
+                     (rng-pop-tag)
+                     (unless (eq top t)
+                       (setq missing (cons top missing))
+                       (nxml-ns-pop-state)
+                       (rng-match-after))
+                     (not (equal top name))))
+            (unless suppress-error
+              (rng-mark-missing-end-tags (cdr missing)))))
+         ((rng-match-empty-before-p)
+          (rng-mark-mismatched-end-tag)
+          (rng-end-element))
+         (t (rng-mark-mismatched-end-tag)
+            (setq rng-open-elements
+                  (cons t rng-open-elements))))))
+
+(defun rng-mark-missing-end-tags (missing)
+  (rng-mark-not-well-formed
+   (format "Missing end-tag%s %s"
+          (if (null (cdr missing)) "" "s")
+          (mapconcat (lambda (name)
+                       (rng-quote-string
+                        (if (car name)
+                            (concat (car name)
+                                    ":"
+                                    (cdr name))
+                          (cdr name))))
+                     missing
+                     ", "))
+   xmltok-start
+   (+ xmltok-start 2)))
+
+(defun rng-mark-mismatched-end-tag ()
+  (rng-mark-not-well-formed "Mismatched end-tag"
+                           (+ xmltok-start 2)
+                           xmltok-name-end))
+
+(defun rng-push-tag (prefix-local-name)
+  (setq rng-open-elements
+       (cons prefix-local-name rng-open-elements)))
+
+(defun rng-pop-tag ()
+  (setq rng-open-elements (cdr rng-open-elements)))
+
+(defun rng-contents-string ()
+  (let ((contents rng-pending-contents))
+    (cond ((not contents) "")
+         ((memq nil contents) nil)
+         ((not (cdr contents))
+          (rng-segment-string (car contents)))
+         (t (apply 'concat
+                   (nreverse (mapcar 'rng-segment-string
+                                     contents)))))))
+
+(defun rng-segment-string (segment)
+  (or (car segment)
+      (apply 'buffer-substring-no-properties
+            (cdr segment))))
+
+(defun rng-segment-blank-p (segment)
+  (if (car segment)
+      (rng-blank-p (car segment))
+    (apply 'rng-region-blank-p
+          (cdr segment))))
+
+(defun rng-contents-region ()
+  (if (null rng-pending-contents)
+      nil
+    (let* ((contents rng-pending-contents)
+          (head (cdar contents))
+          (start (car head))
+          (end (cadr head)))
+      (while (setq contents (cdr contents))
+       (setq start (car (cdar contents))))
+      (cons start end))))
+
+(defun rng-process-text (start end whitespace &optional value)
+  "Process characters between position START and END as text.
+END nil means point. WHITESPACE t means known to be whitespace, nil
+means known not to be, anything else means unknown whether whitespace
+or not. END must not be nil if WHITESPACE is neither t nor nil.
+VALUE is a string or nil; nil means the value is equal to the
+string between START and END."
+  (cond (rng-collecting-text
+        (setq rng-pending-contents (cons (list value start (or end (point)))
+                                         rng-pending-contents)))
+       ((not (or (and whitespace
+                      (or (eq whitespace t)
+                          (if value
+                              (rng-blank-p value)
+                            (rng-region-blank-p start end))))
+                 (rng-match-mixed-text)))
+        (rng-mark-invalid "Text not allowed" start (or end (point))))))
+
+(defun rng-process-unknown-char ()
+  (when rng-collecting-text
+    (setq rng-pending-contents
+         (cons nil rng-pending-contents))))
+
+(defun rng-process-unknown-entity ()
+  (rng-process-unknown-char)
+  (rng-match-optionalize-elements))
+
+(defun rng-region-blank-p (beg end)
+  (save-excursion
+    (goto-char beg)
+    (= (skip-chars-forward " \n\r\t" end)
+       (- end beg))))
+
+(defun rng-flush-text ()
+  (while rng-pending-contents
+    (let ((segment (car rng-pending-contents)))
+      (unless (or (rng-segment-blank-p segment)
+                 (rng-match-mixed-text))
+       (let ((region (cdr segment)))
+         (rng-mark-invalid "In this context text cannot be mixed with elements"
+                           (car region)
+                           (cadr region)))))
+    (setq rng-pending-contents (cdr rng-pending-contents))))
+
+(defun rng-process-end-document ()
+  ;; this is necessary to clear empty overlays at (point-max)
+  (rng-clear-overlays (point) (point))
+  (let ((start (save-excursion
+                (skip-chars-backward " \t\r\n")
+                (point))))
+    (cond (rng-open-elements
+          (unless (eq (car rng-open-elements) t)
+            (rng-mark-not-well-formed "Missing end-tag"
+                                      start
+                                      (point))))
+         ((not (rng-match-nullable-p))
+          (rng-mark-not-well-formed "No document element"
+                                    start
+                                    (point))))))
+
+(defun rng-process-encoding-name (beg end)
+  (unless (let ((charset (buffer-substring-no-properties beg end)))
+           (or (nxml-mime-charset-coding-system charset)
+               (string= (downcase charset) "utf-16")))
+    (rng-mark-not-well-formed "Unsupported encoding" beg end)))
+
+(defun rng-name-to-string (name &optional attributep)
+  (let ((ns (car name))
+       (local-name (cdr name)))
+    (if (or (not ns)
+           (and (not attributep)
+                (eq (nxml-ns-get-default) ns)))
+       local-name
+      (let ((prefix (nxml-ns-prefix-for ns)))
+       (if prefix
+           (concat prefix ":" local-name)
+         (concat "{" (symbol-name ns) "}" local-name))))))
+
+(provide 'rng-valid)
+
+;; arch-tag: 7dd846d3-519d-4a6d-8107-4ff0024a60ef
+;;; rng-valid.el ends here
diff --git a/lisp/nxml/rng-xsd.el b/lisp/nxml/rng-xsd.el
new file mode 100644 (file)
index 0000000..782627c
--- /dev/null
@@ -0,0 +1,861 @@
+;;; rng-xsd.el --- W3C XML Schema datatypes library for RELAX NG
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, RelaxNG
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; The main entry point is `rng-xsd-compile'. The validator
+;; knows to use this for the datatype library with URI
+;; http://www.w3.org/2001/XMLSchema-datatypes because it
+;; is the value of the rng-dt-compile property on that URI
+;; as a symbol.
+;;
+;; W3C XML Schema Datatypes are specified by
+;;   http://www.w3.org/TR/xmlschema-2/
+;; Guidelines for using them with RELAX NG are described in
+;;   http://relaxng.org/xsd.html
+
+;;; Code:
+
+(require 'rng-dt)
+(require 'rng-util)
+(require 'xsd-regexp)
+
+;;;###autoload
+(put 'http://www.w3.org/2001/XMLSchema-datatypes
+     'rng-dt-compile
+     'rng-xsd-compile)
+
+;;;###autoload
+(defun rng-xsd-compile (name params)
+  "Provides W3C XML Schema as a RELAX NG datatypes library. NAME is a
+symbol giving the local name of the datatype.  PARAMS is a list of
+pairs (PARAM-NAME . PARAM-VALUE) where PARAM-NAME is a symbol giving
+the name of the parameter and PARAM-VALUE is a string giving its
+value.  If NAME or PARAMS are invalid, it calls rng-dt-error passing
+it arguments in the same style as format; the value from rng-dt-error
+will be returned.  Otherwise, it returns a list.  The first member of
+the list is t if any string is a legal value for the datatype and nil
+otherwise.  The second argument is a symbol; this symbol will be
+called as a function passing it a string followed by the remaining
+members of the list.  The function must return an object representing
+the value of the datatype that was represented by the string, or nil
+if the string is not a representation of any value. The object
+returned can be any convenient non-nil value, provided that, if two
+strings represent the same value, the returned objects must be equal."
+  (let ((convert (get name 'rng-xsd-convert)))
+    (if (not convert)
+       (rng-dt-error "There is no XSD datatype named %s" name)
+      (rng-xsd-compile1 name params convert))))
+
+;;; Parameters
+
+(defun rng-xsd-compile1 (name params convert)
+  (if (null params)
+      (cons (equal convert '(identity))
+           (cond ((eq name 'string) convert)
+                 ((eq name 'normalizedString)
+                  (cons 'rng-xsd-replace-space convert))
+                 ((and (not (eq name 'string))
+                       (or (memq 'identity convert)
+                           (memq 'rng-xsd-convert-any-uri convert)
+                           (memq 'rng-xsd-check-pattern convert)))
+                  (cons 'rng-xsd-collapse-space convert))
+                 (t convert)))
+    (let* ((param (car params))
+          (param-name (car param))
+          (param-value (cdr param)))
+      (cond ((memq param-name
+                  '(minExclusive maxExclusive minInclusive maxInclusive))
+            (let ((limit (apply (car convert)
+                                (cons param-value
+                                      (cdr convert))))
+                  (less-than-fun (get name 'rng-xsd-less-than)))
+              (cond ((not limit)
+                     (rng-dt-error "Minimum value %s is not valid"
+                                   param-value))
+                    ((not less-than-fun)
+                     (rng-dt-error "Values of type %s are not ordered"
+                                   param-name))
+                    (t
+                     (rng-xsd-compile1 name
+                                       (cdr params)
+                                       (cons (get param-name
+                                                  'rng-xsd-check)
+                                             (cons less-than-fun
+                                                   (cons limit convert))))))))
+           ((memq param-name '(length minLength maxLength))
+            (let ((limit (rng-xsd-string-to-non-negative-integer param-value))
+                  (length-fun (get name 'rng-xsd-length)))
+              (cond ((not limit)
+                     (rng-dt-error "Length %s is not valid" param-value))
+                    ((not length-fun)
+                     (rng-dt-error "Values of type %s do not have a length"
+                                   param-name))
+                    (t
+                     (rng-xsd-compile1 name
+                                       (cdr params)
+                                       (cons (get param-name
+                                                  'rng-xsd-check)
+                                             (cons length-fun
+                                                   (cons limit convert))))))))
+           ((memq param-name '(fractionDigits totalDigits))
+            (let ((n (rng-xsd-string-to-non-negative-integer param-value)))
+              (cond ((not n)
+                     (rng-dt-error "Number of digits %s is not valid"
+                                   param-value))
+                    (t
+                     (rng-xsd-compile1 name
+                                       (cdr params)
+                                       (cons (get param-name
+                                                  'rng-xsd-check)
+                                             (cons n convert)))))))
+           ((eq param-name 'pattern)
+            (condition-case err
+                (rng-xsd-compile1 name
+                                  (cdr params)
+                                  (cons 'rng-xsd-check-pattern
+                                        (cons (concat
+                                               "\\`"
+                                               (xsdre-translate param-value)
+                                               "\\'")
+                                              convert)))
+              (xsdre-invalid-regexp
+               (rng-dt-error "Invalid regular expression (%s)"
+                             (nth 1 err)))))
+           ((memq param-name '(enumeration whiteSpace))
+            (rng-dt-error "Facet %s cannot be used in RELAX NG" param-name))
+           (t (rng-dt-error "Unknown facet %s" param-name))))))
+         
+(defun rng-xsd-string-to-non-negative-integer (str)
+  (and (rng-xsd-convert-integer str)
+       (let ((n (string-to-number str)))
+        (and (integerp n)
+             (>= n 0)
+             n))))
+
+(defun rng-xsd-collapse-space (str convert &rest args)
+  (apply convert (cons (mapconcat 'identity (split-string str "[ \t\n\r]+")
+                                 " ")
+                      args)))
+
+(defun rng-xsd-replace-space (str convert &rest args)
+  (apply convert
+        (cons (let ((i 0)
+                    copied)
+                (while (and (setq i (string-match "[\r\n\t]" str i))
+                            (or copied (setq copied (copy-sequence str)))
+                            (aset copied i 32)
+                            (setq i (1+ i))))
+                (or copied str))
+              args)))
+
+(put 'minExclusive 'rng-xsd-check 'rng-xsd-check-min-exclusive)
+(put 'minInclusive 'rng-xsd-check 'rng-xsd-check-min-inclusive)
+(put 'maxExclusive 'rng-xsd-check 'rng-xsd-check-max-exclusive)
+(put 'maxInclusive 'rng-xsd-check 'rng-xsd-check-max-inclusive)
+(put 'length 'rng-xsd-check 'rng-xsd-check-length)
+(put 'minLength 'rng-xsd-check 'rng-xsd-check-min-length)
+(put 'maxLength 'rng-xsd-check 'rng-xsd-check-max-length)
+(put 'fractionDigits 'rng-xsd-check 'rng-xsd-check-fraction-digits)
+(put 'totalDigits 'rng-xsd-check 'rng-xsd-check-total-digits)
+
+(defun rng-xsd-check-min-exclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (funcall less-than-fun limit obj)
+        obj)))
+
+(defun rng-xsd-check-min-inclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (or (funcall less-than-fun limit obj)
+            (equal limit obj))
+        obj)))
+
+(defun rng-xsd-check-max-exclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (funcall less-than-fun obj limit)
+        obj)))
+
+(defun rng-xsd-check-max-inclusive (str less-than-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (or (funcall less-than-fun obj limit)
+            (equal obj limit))
+        obj)))
+
+(defun rng-xsd-check-min-length (str length-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (>= (funcall length-fun obj) limit)
+        obj)))
+
+(defun rng-xsd-check-max-length (str length-fun limit convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (<= (funcall length-fun obj) limit)
+        obj)))
+
+(defun rng-xsd-check-length (str length-fun len convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (= (funcall length-fun obj) len)
+        obj)))
+
+(defun rng-xsd-check-fraction-digits (str n convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (<= (length (aref obj 2)) n)
+        obj)))
+
+(defun rng-xsd-check-total-digits (str n convert &rest args)
+  (let ((obj (apply convert (cons str args))))
+    (and obj
+        (<= (+ (length (aref obj 1))
+               (length (aref obj 2)))
+            n)
+        obj)))
+
+(defun rng-xsd-check-pattern (str regexp convert &rest args)
+  (and (string-match regexp str)
+       (apply convert (cons str args))))
+
+  
+(defun rng-xsd-convert-boolean (string)
+  (and (string-match "\\`[ \t\n\r]*\\(?:\\(true\\|1\\)\\|false\\|0\\)[ \t\n\r]*\\'" string)
+       (if (match-beginning 1) 'true 'false)))
+
+(defun rng-xsd-convert-decimal (string)
+  "Convert a string representing a decimal to an object representing
+its values.  A decimal value is represented by a vector [SIGN
+INTEGER-DIGITS FRACTION-DIGITS] where SIGN is 1 or -1, INTEGER-DIGITS
+is a string containing zero or more digits, with no leading zero, and
+FRACTION-DIGITS is a string containing zero or more digits with no
+trailing digits.  For example, -0021.0430 would be represented by [-1
+\"21\" \"043\"]."
+  (and (string-match "\\`[ \t\n\r]*\\([-+]\\)?\\(0*\\([1-9][0-9]*\\)?\\(\\.\\([0-9]*[1-9]\\)?0*\\)?\\)[ \t\n\r]*\\'" string)
+       (let ((digits (match-string 2 string)))
+        (and (not (string= digits "."))
+             (not (string= digits ""))))
+       (let ((integer-digits (match-string 3 string)))
+        (vector (if (and (equal (match-string 1 string) "-")
+                         ;; Normalize -0 to 0
+                         integer-digits)
+                    -1
+                  1)
+                (or integer-digits "")
+                (or (match-string 5 string) "")))))
+
+(defun rng-xsd-convert-integer (string)
+  (and (string-match "\\`[ \t\n\r]*\\([-+]\\)?\\(?:0*\\([1-9][0-9]*\\)\\|0+\\)[ \t\n\r]*\\'" string)
+       (let ((integer-digits (match-string 2 string)))
+        (vector (if (and (equal (match-string 1 string) "-")
+                         ;; Normalize -0 to 0
+                         integer-digits)
+                    -1
+                  1)
+                (or integer-digits "")
+                ""))))
+
+(defun rng-xsd-decimal< (n1 n2)
+  (< (rng-xsd-compare-decimal n1 n2) 0))
+
+(defun rng-xsd-compare-decimal (n1 n2)
+  "Return a < 0, 0, > 0 according as n1 < n2, n1 = n2 or n1 > n2."
+  (let* ((sign1 (aref n1 0))
+        (sign2 (aref n2 0))
+        (sign (- sign1 sign2)))
+    (if (= sign 0)
+       (* sign1
+          (let* ((int1 (aref n1 1))
+                 (int2 (aref n2 1))
+                 (len1 (length int1))
+                 (len2 (length int2))
+                 (lencmp (- len1 len2)))
+            (if (eq lencmp 0)
+                (if (string= int1 int2)
+                    (rng-xsd-strcmp (aref n1 2) (aref n2 2))
+                  (rng-xsd-strcmp int1 int2))
+              lencmp)))
+      sign)))
+
+(defconst rng-xsd-float-regexp
+  (concat "\\`[ \r\n\t]*\\(?:"
+         "\\("
+         "[-+]?\\(?:[0-9]+\\(?:\\.[0-9]*\\)?\\|\\.[0-9]+\\)"
+         "\\(?:[eE][-+]?[0-9]+\\)?"
+         "\\)"
+         "\\|\\(INF\\)"
+         "\\|\\(-INF\\)"
+         "\\|\\(NaN\\)"
+         "\\)[ \r\n\t]*\\'"))
+
+(defun rng-xsd-convert-float (string)
+  (cond ((not (string-match rng-xsd-float-regexp string)) nil)
+       ((match-beginning 1)
+        (float (string-to-number (match-string 1 string))))
+       ((match-beginning 2) 1.0e+INF)
+       ((match-beginning 3) -1.0e+INF)
+       ;; Don't use a NaN float because we want NaN to be equal to NaN
+       ((match-beginning 4) 'NaN)))
+        
+(defun rng-xsd-float< (f1 f2)
+  (and (not (eq f1 'NaN))
+       (not (eq f2 'NaN))
+       (< f1 f2)))
+  
+(defun rng-xsd-convert-token (string regexp)
+  (and (string-match regexp string)
+       (match-string 1 string)))
+
+(defun rng-xsd-convert-hex-binary (string)
+  (and (string-match "\\`[ \r\n\t]*\\(\\(?:[0-9A-Fa-f][0-9A-Fa-f]\\)*\\)[ \r\n\t]*\\'"
+                    string)
+       (downcase (match-string 1 string))))
+
+(defun rng-xsd-hex-binary-length (obj)
+  (/ (length obj) 2))
+
+(defconst rng-xsd-base64-binary-regexp
+  (let ((S "[ \t\r\n]*")
+       (B04 "[AQgw]")
+       (B16 "[AEIMQUYcgkosw048]")
+       (B64 "[A-Za-z0-9+/]"))
+    (concat "\\`" S "\\(?:\\(?:" B64 S "\\)\\{4\\}\\)*"
+           "\\(?:" B64 S B64 S B16 S "=" S 
+           "\\|" B64 S B04 S "=" S "=" S "\\)?\\'")))
+
+(defun rng-xsd-convert-base64-binary (string)
+  (and (string-match rng-xsd-base64-binary-regexp string)
+       (replace-regexp-in-string "[ \t\r\n]+" "" string t t)))
+
+(defun rng-xsd-base64-binary-length (obj)
+  (let ((n (* (/ (length obj) 4) 3)))
+    (if (and (> n 0)
+            (string= (substring obj -1) "="))
+       (- n (if (string= (substring obj -2) "==")
+                2
+              1))
+      n)))
+
+(defun rng-xsd-convert-any-uri (string)
+  (and (string-match "\\`\\(?:[^%]\\|%[0-9a-fA-F][0-9a-fA-F]\\)?*\\'" string)
+       (string-match "\\`[^#]*\\(?:#[^#]*\\)?\\'" string)
+       (string-match "\\`\\(?:[a-zA-Z][-+.A-Za-z0-9]*:.+\\|[^:]*\\(?:[#/?].*\\)?\\)\\'" string)
+       string))
+
+(defun rng-xsd-make-date-time-regexp (template)
+  "Returns a regular expression matching a ISO 8601 date/time. The
+template is a string with Y standing for years field, M standing for
+months, D standing for day of month, T standing for a literal T, t
+standing for time and - standing for a literal hyphen.  A time zone is
+always allowed at the end. Regardless of the fields appearing in the
+template, the regular expression will have twelve groups matching the
+year sign, year, month, day of month, hours, minutes, integer seconds,
+fractional seconds (including leading period), time zone, time zone
+sign, time zone hours, time zone minutes."
+  (let ((i 0)
+       (len (length template))
+       (parts nil)
+       first last c)
+    (while (< i len)
+      (setq c (aref template i))
+      (setq parts
+           (cons (cond ((eq c ?Y)
+                        (setq first 0)
+                        (setq last 1)
+                        "\\(-\\)?\\(\\(?:[1-9][0-9]*\\)?[0-9]\\{4\\}\\)")
+                       ((eq c ?M)
+                        (or first
+                            (setq first 2))
+                        (setq last 2)
+                        "\\([0-9][0-9]\\)")
+                       ((eq c ?D)
+                        (or first
+                            (setq first 3))
+                        (setq last 3)
+                        "\\([0-9][0-9]\\)")
+                       ((eq c ?t)
+                        (or first
+                            (setq first 4))
+                        (setq last 7)
+                        "\\([0-9][0-9]\\):\\([0-9][0-9]\\):\\([0-9][0-9]\\)\\(\\.[0-9]*\\)?")
+                       (t (string c)))
+                 parts))
+      (setq i (1+ i)))
+    (while (< last 7)
+      (setq last (1+ last))
+      ;; Add dummy fields that can never much but keep the group
+      ;; numbers uniform.
+      (setq parts (cons "\\(\\'X\\)?" parts)))
+    (setq parts (cons "\\(Z\\|\\([-+]\\)\\([0-9][0-9]\\):\\([0-5][0-9]\\)\\)?[ \t\n\r]*\\'"
+                     parts))
+    (setq parts (cons "\\`[ \t\n\r]*" (nreverse parts)))
+    (while (> first 0)
+      (setq first (1- first))
+      (setq parts (cons "\\(X\\)?" parts)))
+    (apply 'concat parts)))
+
+(defconst rng-xsd-seconds-per-day (* 24 60 60))
+(defconst rng-xsd-days-in-month [31 28 31 30 31 30 31 31 30 31 30 31])
+
+(defun rng-xsd-days-in-month (year month)
+  (if (and (= month 2) (rng-xsd-leap-year-p year))
+      29
+    (aref rng-xsd-days-in-month (1- month))))
+
+(defconst rng-xsd-months-to-days
+  (let ((v (make-vector 12 nil))
+       (total 0)
+       (i 0))
+    (while (< i 12)
+      (setq total (+ total (aref rng-xsd-days-in-month i)))
+      (aset v i total)
+      (setq i (1+ i)))
+    v))
+          
+(defun rng-xsd-convert-date-time (string regexp)
+  "Converts an XML Schema date/time to a list.  Returns nil if
+invalid.  REGEXP is a regexp for parsing the date time as returned by
+`rng-xsd-make-date-time-regexp'. The list has 4 members (HAS-TIME-ZONE
+DAY SECOND SECOND-FRACTION), where HAS-TIME-ZONE is t or nil depending
+on whether a time zone was specified, DAY is an integer giving a day
+number (with Jan 1 1AD being day 1), SECOND is the second within that
+day, and SECOND-FRACTION is a float giving the fractional part of the
+second."
+  (and (string-match regexp string)
+       (let ((year-sign (match-string 1 string))
+            (year (match-string 2 string))
+            (month (match-string 3 string))
+            (day (match-string 4 string))
+            (hour (match-string 5 string))
+            (minute (match-string 6 string))
+            (second (match-string 7 string))
+            (second-fraction (match-string 8 string))
+            (has-time-zone (match-string 9 string))
+            (time-zone-sign (match-string 10 string))
+            (time-zone-hour (match-string 11 string))
+            (time-zone-minute (match-string 12 string)))
+        (setq year-sign (if year-sign -1 1))
+        (setq year
+              (if year
+                  (* year-sign
+                     (string-to-number year))
+                2000))
+        (setq month
+              (if month (string-to-number month) 1))
+        (setq day
+              (if day (string-to-number day) 1))
+        (setq hour
+              (if hour (string-to-number hour) 0))
+        (setq minute
+              (if minute (string-to-number minute) 0))
+        (setq second
+              (if second (string-to-number second) 0))
+        (setq second-fraction
+              (if second-fraction
+                  (float (string-to-number second-fraction))
+                0.0))
+        (setq has-time-zone (and has-time-zone t))
+        (setq time-zone-sign
+              (if (equal time-zone-sign "-") -1 1))
+        (setq time-zone-hour
+              (if time-zone-hour (string-to-number time-zone-hour) 0))
+        (setq time-zone-minute
+              (if time-zone-minute (string-to-number time-zone-minute) 0))
+        (and (>= month 1)
+             (<= month 12)
+             (>= day 1)
+             (<= day (rng-xsd-days-in-month year month))
+             (<= hour 23)
+             (<= minute 59)
+             (<= second 60)            ; leap second
+             (<= time-zone-hour 23)
+             (<= time-zone-minute 59)
+             (cons has-time-zone
+                   (rng-xsd-add-seconds
+                    (list (rng-xsd-date-to-days year month day)
+                          (rng-xsd-time-to-seconds hour minute second)
+                          second-fraction)
+                    (* (rng-xsd-time-to-seconds time-zone-hour
+                                                time-zone-minute
+                                                0)
+                       (- time-zone-sign))))))))
+
+(defun rng-xsd-leap-year-p (year)
+  (and (= (% year 4) 0)
+       (or (/= (% year 100) 0)
+          (= (% year 400) 0))))
+
+(defun rng-xsd-time-to-seconds (hour minute second)
+  (+ (* (+ (* hour 60)
+          minute)
+       60)
+     second))
+
+(defconst rng-xsd-max-tz (rng-xsd-time-to-seconds 14 0 0))
+
+(defun rng-xsd-date-time< (dt1 dt2)
+  (cond ((eq (car dt1) (car dt2))
+        (rng-xsd-number-list< (cdr dt1) (cdr dt2)))
+       ((car dt1)
+        (rng-xsd-number-list< (cdr dt1)
+                              (rng-xsd-add-seconds (cdr dt2)
+                                                   (- rng-xsd-max-tz))))
+       (t
+        (rng-xsd-number-list< (rng-xsd-add-seconds (cdr dt1)
+                                                   rng-xsd-max-tz)
+                              (cdr dt2)))))
+
+(defun rng-xsd-add-seconds (date offset)
+  (let ((day (nth 0 date))
+       (second (+ (nth 1 date) offset))
+       (fraction (nth 2 date)))
+    (cond ((< second 0)
+          (list (1- day)
+                (+ second rng-xsd-seconds-per-day)
+                fraction))
+         ((>= second rng-xsd-seconds-per-day)
+          (list (1+ day)
+                (- second rng-xsd-seconds-per-day)
+                fraction))
+         (t (list day second fraction)))))
+
+(defun rng-xsd-number-list< (numbers1 numbers2)
+  (while (and numbers1 (= (car numbers1) (car numbers2)))
+    (setq numbers1 (cdr numbers1))
+    (setq numbers2 (cdr numbers2)))
+  (and numbers1
+       (< (car numbers1) (car numbers2))))
+       
+(defun rng-xsd-date-to-days (year month day)
+  "Return a unique day number where Jan 1 1 AD is day 1"
+  (if (> year 0)                       ; AD
+      (+ (rng-xsd-days-in-years (- year 1))
+        (rng-xsd-day-number-in-year year month day))
+    (- (+ (- (rng-xsd-days-in-years (- 3 year))
+            (rng-xsd-days-in-years 3))
+         (- (if (rng-xsd-leap-year-p year) 366 365)
+            (rng-xsd-day-number-in-year year month day))))))
+
+(defun rng-xsd-days-in-years (years)
+  "The number of days in YEARS years where the first year is 1AD."
+  (+ (* 365 years)
+     (/ years 4)
+     (- (/ years 100))
+     (/ years 400)))
+
+(defun rng-xsd-day-number-in-year (year month day)
+  (+ (if (= month 1)
+        0
+        (aref rng-xsd-months-to-days (- month 2)))
+     day
+     (if (and (> month 2)
+             (rng-xsd-leap-year-p year))
+        1
+       0)))
+
+(defconst rng-xsd-duration-regexp
+    "\\`[ \t\r\n]*\\(-\\)?P\
+\\([0-9]+Y\\)?\\([0-9]+M\\)?\\([0-9]+D\\)?\
+\\(?:T\\([0-9]+H\\)?\\([0-9]+M\\)?\
+\\(\\([0-9]+\\(?:\\.[0-9]*\\)?\\|\\.[0-9]+\\)S\\)?\\)?\
+[ \t\r\n]*\\'")
+
+
+(defun rng-xsd-convert-duration (string)
+  (and (string-match rng-xsd-duration-regexp string)
+       (let ((last (substring string -1)))
+        (not (or (string= last "P")
+                 (string= last "T"))))
+       ;; years months days hours minutes seconds
+       (let ((v (make-vector 6 0))
+            (sign (if (match-beginning 1) -1 1))
+            (i 0))
+        (while (< i 6)
+          (let ((start (match-beginning (+ i 2))))
+            (when start
+              (aset v i (* sign
+                           (string-to-number 
+                            (substring string
+                                       start
+                                       (1- (match-end (+ i 2)))))))))
+          (setq i (1+ i)))
+        ;; Force seconds to be float so that equal works properly.
+        (aset v 5 (float (aref v 5)))
+        v)))
+        
+(defconst rng-xsd-min-seconds-per-month (* 28 rng-xsd-seconds-per-day))
+
+(defun rng-xsd-duration< (d1 d2)
+  (let* ((months1 (rng-xsd-duration-months d1))
+        (months2 (rng-xsd-duration-months d2))
+        (seconds1 (rng-xsd-duration-seconds d1))
+        (seconds2 (rng-xsd-duration-seconds d2)))
+    (cond ((< months1 months2)
+          (if (< (- seconds1 seconds2) rng-xsd-min-seconds-per-month)
+              t
+            (rng-xsd-months-seconds< months1 seconds1 months2 seconds2)))
+         ((> months1 months2)
+          (if (< (- seconds2 seconds1) rng-xsd-min-seconds-per-month)
+              nil
+            (rng-xsd-months-seconds< months1 seconds1 months2 seconds2)))
+         (t (< seconds1 seconds2)))))
+
+(defconst xsd-duration-reference-dates
+  '((1696 . 9) (1697 . 2) (1903 . 3) (1903 . 7)))
+
+(defun rng-xsd-months-seconds< (months1 seconds1 months2 seconds2)
+  (let ((ret t)
+       (ref-dates xsd-duration-reference-dates))
+    (while (let* ((ref-date (car ref-dates))
+                 (ref-year (car ref-date))
+                 (ref-month (cdr ref-date)))
+            (unless (< (+ (rng-xsd-month-seconds months1
+                                                 ref-year
+                                                 ref-month)
+                          seconds1)
+                       (+ (rng-xsd-month-seconds months2
+                                                 ref-year
+                                                 ref-month)
+                          seconds2))
+                (setq ret nil))
+            (and ret
+                 (setq ref-dates (cdr ref-dates)))))
+    ret))
+
+
+(defun rng-xsd-month-seconds (months ref-year ref-month)
+  "Return the seconds in a number of months starting on a reference date.
+Returns a floating point number."
+  (* (rng-xsd-month-days (abs months) ref-year ref-month)
+     (float rng-xsd-seconds-per-day)
+     (if (< months 0) -1.0 1.0)))
+
+(defconst rng-xsd-years-per-gregorian-cycle 400)
+(defconst rng-xsd-months-per-gregorian-cycle
+  (* rng-xsd-years-per-gregorian-cycle 12))
+(defconst rng-xsd-leap-years-per-gregorian-cycle (- 100 (- 4 1)))
+(defconst rng-xsd-days-per-gregorian-cycle
+  (+ (* 365 rng-xsd-years-per-gregorian-cycle)
+     rng-xsd-leap-years-per-gregorian-cycle))
+
+(defun rng-xsd-month-days (months ref-year ref-month)
+  "Return the days in a number of months starting on a reference date.
+MONTHS must be an integer >= 0."
+  (let ((days 0))
+    (setq months (mod months rng-xsd-months-per-gregorian-cycle))
+    ;; This may be rather slow, but it is highly unlikely
+    ;; ever to be used in real life.
+    (while (> months 0)
+      (setq days
+           (+ (rng-xsd-days-in-month ref-year ref-month)
+              days))
+      (setq ref-month
+           (if (eq ref-month 12)
+               (progn
+                 (setq ref-year (1+ ref-year))
+                 1)
+             (1+ ref-month)))
+      (setq months (1- months)))
+    (+ (* (/ months rng-xsd-months-per-gregorian-cycle)
+         rng-xsd-days-per-gregorian-cycle)
+       days)))
+    
+(defun rng-xsd-duration-months (d)
+  (+ (* (aref d 0) 12)
+     (aref d 1)))
+
+(defun rng-xsd-duration-seconds (d)
+  (+ (* (+ (* (+ (* (aref d 2)
+                   24.0)
+                (aref d 3))
+             60.0)
+          (aref d 4))
+       60.0)
+     (aref d 5)))
+       
+(defun rng-xsd-convert-qname (string)
+  (and (string-match "\\`[ \r\n\t]*\\([_[:alpha:]][-._[:alnum:]]*\\(:[_[:alpha:]][-._[:alnum:]]*\\)?\\)[ \r\n\t]*\\'" string)
+       (let ((colon (match-beginning 2))
+            (context (apply (car rng-dt-namespace-context-getter)
+                            (cdr rng-dt-namespace-context-getter))))
+        (if colon
+            (let* ((prefix (substring string
+                                      (match-beginning 1)
+                                      colon))
+                   (binding (assoc prefix (cdr context))))
+              (and binding
+                   (cons (cdr binding)
+                         (substring string
+                                    (1+ colon)
+                                    (match-end 1)))))
+          (cons (car context)
+                (match-string 1 string))))))
+                    
+(defun rng-xsd-convert-list (string convert &rest args)
+  (let* ((tokens (split-string string "[ \t\n\r]+"))
+        (tem tokens))
+    (while tem
+      (let ((obj (apply convert
+                       (cons (car tem) args))))
+       (cond (obj
+              (setcar tem obj)
+              (setq tem (cdr tem)))
+             (t
+              (setq tokens nil)
+              (setq tem nil)))))
+    ;; Fortuitously this returns nil if the list is empty
+    ;; which is what we want since the list types
+    ;; have to have one or more members.
+    tokens))
+
+(defun rng-xsd-strcmp (s1 s2)
+  (cond ((string= s1 s2) 0)
+       ((string< s1 s2) -1)
+       (t 1)))
+
+(put 'string 'rng-xsd-convert '(identity))
+(put 'string 'rng-xsd-length 'length)
+(put 'string 'rng-xsd-matches-anything t)
+
+(put 'normalizedString 'rng-xsd-convert '(identity))
+(put 'normalizedString 'rng-xsd-length 'length)
+(put 'normalizedString 'rng-xsd-matches-anything t)
+
+(put 'token 'rng-xsd-convert '(identity))
+(put 'token 'rng-xsd-length 'length)
+(put 'token 'rng-xsd-matches-anything t)
+
+(put 'hexBinary 'rng-xsd-convert '(rng-xsd-convert-hex-binary))
+(put 'hexBinary 'rng-xsd-length 'rng-xsd-hex-binary-length)
+
+(put 'base64Binary 'rng-xsd-convert '(rng-xsd-convert-base64-binary))
+(put 'base64Binary 'rng-xsd-length 'rng-xsd-base64-binary-length)
+
+(put 'boolean 'rng-xsd-convert '(rng-xsd-convert-boolean))
+
+(put 'float 'rng-xsd-convert '(rng-xsd-convert-float))
+(put 'float 'rng-xsd-less-than 'rng-xsd-float<)
+
+(put 'double 'rng-xsd-convert '(rng-xsd-convert-float))
+(put 'double 'rng-xsd-less-than 'rng-xsd-float<)
+
+(put 'decimal 'rng-xsd-convert '(rng-xsd-convert-decimal))
+(put 'decimal 'rng-xsd-less-than 'rng-xsd-decimal<)
+
+(put 'integer 'rng-xsd-convert '(rng-xsd-convert-integer))
+(put 'integer 'rng-xsd-less-than 'rng-xsd-decimal<)
+
+(defun rng-xsd-def-integer-type (name min max)
+  (put name 'rng-xsd-less-than 'rng-xsd-decimal<)
+  (put name
+       'rng-xsd-convert 
+       (cdr (rng-xsd-compile 'integer
+                            (append (and min `((minInclusive . ,min)))
+                                    (and max `((maxInclusive . ,max))))))))
+
+(defun rng-xsd-def-token-type (name regexp)
+  (put name 'rng-xsd-convert (list 'rng-xsd-convert-token
+                                  (concat "\\`[\r\n\t ]*\\("
+                                          regexp
+                                          "\\)[\r\n\t ]*\\'")))
+  (put name 'rng-xsd-length 'length))
+
+(rng-xsd-def-token-type 'NMTOKEN "[-.:_[:alnum:]]+")
+(rng-xsd-def-token-type 'Name "[:_[:alpha:]][-.:_[:alnum:]]*")
+(rng-xsd-def-token-type 'NCName "[_[:alpha:]][-._[:alnum:]]*")
+(rng-xsd-def-token-type 'language
+                       "[a-zA-Z]\\{1,8\\}\\(?:-[a-zA-Z0-9]\\{1,8\\}\\)*")
+
+(put 'ENTITY 'rng-xsd-convert (get 'NCName 'rng-xsd-convert))
+(put 'ENTITY 'rng-xsd-length 'length)
+(put 'ID 'rng-xsd-convert (get 'NCName 'rng-xsd-convert))
+(put 'ID 'rng-xsd-length 'length)
+(put 'IDREF 'rng-xsd-convert (get 'NCName 'rng-xsd-convert))
+(put 'IDREF 'rng-xsd-length 'length)
+
+(defun rng-xsd-def-list-type (name member-name)
+  (put name 'rng-xsd-convert (cons 'rng-xsd-convert-list
+                                  (get member-name 'rng-xsd-convert)))
+  (put name 'rng-xsd-length 'length))
+
+(rng-xsd-def-list-type 'NMTOKENS 'NMTOKEN)
+(rng-xsd-def-list-type 'IDREFS 'IDREF)
+(rng-xsd-def-list-type 'ENTITIES 'ENTITY)
+
+(put 'anyURI 'rng-xsd-convert '(rng-xsd-convert-any-uri))
+(put 'anyURI 'rng-xsd-length 'length)
+
+(put 'QName 'rng-xsd-convert '(rng-xsd-convert-qname))
+(put 'NOTATION 'rng-xsd-convert '(rng-xsd-convert-qname))
+
+(defconst rng-xsd-long-max "9223372036854775807")
+(defconst rng-xsd-long-min "-9223372036854775808")
+(defconst rng-xsd-int-max "2147483647")
+(defconst rng-xsd-int-min "-2147483648")
+(defconst rng-xsd-short-max "32767")
+(defconst rng-xsd-short-min "-32768")
+(defconst rng-xsd-byte-max "127")
+(defconst rng-xsd-byte-min "-128")
+(defconst rng-xsd-unsigned-long-max "18446744073709551615")
+(defconst rng-xsd-unsigned-int-max "4294967295")
+(defconst rng-xsd-unsigned-short-max "65535")
+(defconst rng-xsd-unsigned-byte-max "255")
+
+(rng-xsd-def-integer-type 'nonNegativeInteger "0" nil)
+(rng-xsd-def-integer-type 'positiveInteger "1" nil)
+(rng-xsd-def-integer-type 'nonPositiveInteger nil "0")
+(rng-xsd-def-integer-type 'negativeInteger nil "-1")
+(rng-xsd-def-integer-type 'long rng-xsd-long-min rng-xsd-long-max)
+(rng-xsd-def-integer-type 'int rng-xsd-int-min rng-xsd-int-max)
+(rng-xsd-def-integer-type 'short rng-xsd-short-min rng-xsd-short-max)
+(rng-xsd-def-integer-type 'byte rng-xsd-byte-min rng-xsd-byte-max)
+(rng-xsd-def-integer-type 'unsignedLong "0" rng-xsd-unsigned-long-max)
+(rng-xsd-def-integer-type 'unsignedInt "0" rng-xsd-unsigned-int-max)
+(rng-xsd-def-integer-type 'unsignedShort "0" rng-xsd-unsigned-short-max)
+(rng-xsd-def-integer-type 'unsignedByte "0" rng-xsd-unsigned-byte-max)
+
+(defun rng-xsd-def-date-time-type (name template)
+  (put name 'rng-xsd-convert (list 'rng-xsd-convert-date-time
+                                  (rng-xsd-make-date-time-regexp template)))
+  (put name 'rng-xsd-less-than 'rng-xsd-date-time<))
+
+(rng-xsd-def-date-time-type 'dateTime "Y-M-DTt")
+(rng-xsd-def-date-time-type 'time "t")
+(rng-xsd-def-date-time-type 'date "Y-M-D")
+(rng-xsd-def-date-time-type 'gYearMonth "Y-M")
+(rng-xsd-def-date-time-type 'gYear "Y")
+(rng-xsd-def-date-time-type 'gMonthDay "--M-D")
+(rng-xsd-def-date-time-type 'gDay "---D")
+(rng-xsd-def-date-time-type 'gMonth "--M")
+
+(put 'duration 'rng-xsd-convert '(rng-xsd-convert-duration))
+(put 'duration 'rng-xsd-less-than 'rng-xsd-duration<)
+
+(provide 'rng-xsd)
+
+;; arch-tag: 6b05510e-a5bb-4b99-8618-4660d00d0abb
+;;; rng-xsd.el ends here
diff --git a/lisp/nxml/test.invalid.xml b/lisp/nxml/test.invalid.xml
new file mode 100644 (file)
index 0000000..87a0031
--- /dev/null
@@ -0,0 +1,11 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>An invalid document</title>
+  </head>
+  <body>
+    <p>This XHTML document is <span class="#foo">invalid</span>.</p>
+  </body>
+</html>
+
+<!-- arch-tag: 8127c8be-d617-46f5-bdf2-c9159a417c38
+     (do not change this comment) -->
diff --git a/lisp/nxml/test.valid.xml b/lisp/nxml/test.valid.xml
new file mode 100644 (file)
index 0000000..c11380a
--- /dev/null
@@ -0,0 +1,11 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>A valid document</title>
+  </head>
+  <body>
+    <p>This is a valid, albeit boring, XHTML document.</p>
+  </body>
+</html>
+
+<!-- arch-tag: 6f7701be-ec51-48d0-bb63-38ed564718d6
+     (do not change this comment) -->
diff --git a/lisp/nxml/xmltok.el b/lisp/nxml/xmltok.el
new file mode 100644 (file)
index 0000000..add55bf
--- /dev/null
@@ -0,0 +1,1928 @@
+;;; xmltok.el --- XML tokenization
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This implements an XML 1.0 parser. It also implements the XML
+;; Namespaces Recommendation.  It is designed to be conforming, but it
+;; works a bit differently from a normal XML parser. An XML document
+;; consists of the prolog and an instance.  The prolog is parsed as a
+;; single unit using `xmltok-forward-prolog'.  The instance is
+;; considered as a sequence of tokens, where a token is something like
+;; a start-tag, a comment, a chunk of data or a CDATA section. The
+;; tokenization of the instance is stateless: the tokenization of one
+;; part of the instance does not depend on tokenization of the
+;; preceding part of the instance.  This allows the instance to be
+;; parsed incrementally.  The main entry point is `xmltok-forward':
+;; this can be called at any point in the instance provided it is
+;; between tokens.  The other entry point is `xmltok-forward-special'
+;; which skips over tokens other comments, processing instructions or
+;; CDATA sections (i.e. the constructs in an instance that can contain
+;; less than signs that don't start a token).
+;;
+;; This is a non-validating XML 1.0 processor.  It does not resolve
+;; parameter entities (including the external DTD subset) and it does
+;; not resolve external general entities.
+;;
+;; It is non-conformant by design in the following respects.
+;;
+;; 1. It expects the client to detect aspects of well-formedness that
+;; are not internal to a single token, specifically checking that
+;; end-tags match start-tags and that the instance contains exactly
+;; one element.
+;;
+;; 2. It expects the client to detect duplicate attributes.  Detection
+;; of duplicate attributes after expansion of namespace prefixes
+;; requires the namespace processing state.  Detection of duplicate
+;; attributes before expansion of namespace prefixes does not, but is
+;; redundant given that the client will do detection of duplicate
+;; attributes after expansion of namespace prefixes.
+;;
+;; 3. It allows the client to recover from well-formedness errors.
+;; This is essential for use in applications where the document is
+;; being parsed during the editing process.
+;;
+;; 4. It does not support documents that do not conform to the lexical
+;; requirements of the XML Namespaces Recommendation (e.g. a document
+;; with a colon in an entity name).
+;;
+;; There are also a number of things that have not yet been
+;; implemented that make it non-conformant.
+;;
+;; 1. It does not implement default attributes.  ATTLIST declarations
+;; are parsed, but no checking is done on the content of attribute
+;; value literals specifying default attribute values, and default
+;; attribute values are not reported to the client.
+;;
+;; 2. It does not implement internal entities containing elements. If
+;; an internal entity is referenced and parsing its replacement text
+;; yields one or more tags, then it will skip the reference and
+;; report this to the client.
+;;
+;; 3. It does not check the syntax of public identifiers in the DTD.
+;;
+;; 4. It allows some non-ASCII characters in certain situations where
+;; it should not.  For example, it only enforces XML 1.0's
+;; restrictions on name characters strictly for ASCII characters.  The
+;; problem here is XML's character model is based squarely on Unicode,
+;; whereas Emacs's is not (as of version 21).  It is not clear what
+;; the right thing to do is.
+
+;;; Code:
+
+(defvar xmltok-type nil)
+(defvar xmltok-start nil)
+(defvar xmltok-name-colon nil)
+(defvar xmltok-name-end nil)
+(defvar xmltok-replacement nil
+  "String containing replacement for a character or entity reference.")
+
+(defvar xmltok-attributes nil
+  "List containing attributes of last scanned element.
+Each member of the list is a vector representing an attribute, which
+can be accessed using the functions `xmltok-attribute-name-start',
+`xmltok-attribute-name-colon', `xmltok-attribute-name-end',
+`xmltok-attribute-value-start', `xmltok-attribute-value-end',
+`xmltok-attribute-raw-normalized-value', `xmltok-attribute-refs'.")
+
+(defvar xmltok-namespace-attributes nil
+  "List containing namespace declarations of last scanned element.
+List has same format as `xmltok-attributes'.")
+
+(defvar xmltok-dtd nil
+  "Information about the DTD used by `xmltok-forward'.
+`xmltok-forward-prolog' sets this up.
+
+It consists of an alist of general entity names vs definitions.  The
+first member of the alist is t if references to entities not in the
+alist are well-formed \(e.g. because there's an external subset that
+wasn't parsed).
+
+Each general entity name is a string. The definition is either nil, a
+symbol, a string, a cons cell.  If the definition is nil, then it
+means that it's an internal entity but the result of parsing it is
+unknown.  If it is a symbol, then the symbol is either `unparsed',
+meaning the entity is an unparsed entity, `external', meaning the
+entity is or references an external entity, `element', meaning the
+entity includes one or more elements, or `not-well-formed', meaning
+the replacement text is not well-formed.  If the definition is a
+string, then the replacement text of the entity is that string; this
+happens only during the parsing of the prolog. If the definition is a
+cons cell \(ER . AR), then ER specifies the string that results from
+referencing the entity in element content and AR is either nil,
+meaning the replacement text included a <, or a string which is the
+normalized attribute value.")
+
+(defvar xmltok-dependent-regions nil
+  "List of descriptors of regions that a parsed token depends on.
+
+A token depends on a region if the region occurs after the token and a
+change in the region may require the token to be reparsed.  This only
+happens with markup that is not well-formed.  For example, if a <?
+occurs without a matching ?>, then the <? is returned as a
+not-well-formed token.  However, this token is dependent on region
+from the end of the token to the end of the buffer: if this ever
+contains ?> then the buffer must be reparsed from the <?.
+
+A region descriptor is a list (FUN START END ARG ...), where FUN is a
+function to be called when the region changes, START and END are
+integers giving the start and end of the region, and ARG... are
+additional arguments to be passed to FUN.  FUN will be called with 5
+arguments followed by the additional arguments if any: the position of
+the start of the changed area in the region, the position of the end
+of the changed area in the region, the length of the changed area
+before the change, the position of the start of the region, the
+position of the end of the region. FUN must return non-nil if the
+region needs reparsing.  FUN will be called in a save-excursion with
+match-data saved.
+
+`xmltok-forward', `xmltok-forward-special' and `xmltok-forward-prolog'
+may add entries to the beginning of this list, but will not clear it.
+`xmltok-forward' and `xmltok-forward-special' will only add entries
+when returning tokens of type not-well-formed.")
+
+(defvar xmltok-errors nil
+  "List of errors detected by `xmltok-forward' and `xmltok-forward-prolog'.
+When `xmltok-forward' and `xmltok-forward-prolog' detect a
+well-formedness error, they will add an entry to the beginning of this
+list.  Each entry is a vector [MESSAGE START END], where MESSAGE is a
+string giving the error message and START and END are integers
+indicating the position of the error.")
+
+(defmacro xmltok-save (&rest body)
+  `(let (xmltok-type
+        xmltok-start
+        xmltok-name-colon
+        xmltok-name-end
+        xmltok-replacement
+        xmltok-attributes
+        xmltok-namespace-attributes
+        xmltok-dependent-regions
+        xmltok-errors)
+     ,@body))
+
+(put 'xmltok-save 'lisp-indent-function 0)
+(def-edebug-spec xmltok-save t)
+
+(defsubst xmltok-attribute-name-start (att)
+  (aref att 0))
+
+(defsubst xmltok-attribute-name-colon (att)
+  (aref att 1))
+
+(defsubst xmltok-attribute-name-end (att)
+  (aref att 2))
+
+(defsubst xmltok-attribute-value-start (att)
+  (aref att 3))
+
+(defsubst xmltok-attribute-value-end (att)
+  (aref att 4))
+
+(defsubst xmltok-attribute-raw-normalized-value (att)
+  "Return an object representing the normalized value of ATT.
+This can t indicating that the normalized value is the same as the
+buffer substring from the start to the end of the value or nil
+indicating that the value is not well-formed or a string."
+  (aref att 5))
+
+(defsubst xmltok-attribute-refs (att)
+  "Return a list of the entity and character references in ATT.
+Each member is a vector [TYPE START END] where TYPE is either char-ref
+or entity-ref and START and END are integers giving the start and end
+of the reference. Nested entity references are not included in the list."
+  (aref att 6))
+
+(defun xmltok-attribute-prefix (att)
+  (let ((colon (xmltok-attribute-name-colon att)))
+    (and colon
+        (buffer-substring-no-properties (xmltok-attribute-name-start att)
+                                        colon))))
+
+(defun xmltok-attribute-local-name (att)
+  (let ((colon (xmltok-attribute-name-colon att)))
+    (buffer-substring-no-properties (if colon
+                                       (1+ colon)
+                                     (xmltok-attribute-name-start att))
+                                   (xmltok-attribute-name-end att))))
+
+(defun xmltok-attribute-value (att)
+  (let ((rnv (xmltok-attribute-raw-normalized-value att)))
+    (and rnv
+        (if (stringp rnv)
+            rnv
+          (buffer-substring-no-properties (xmltok-attribute-value-start att)
+                                          (xmltok-attribute-value-end att))))))
+
+(defun xmltok-start-tag-prefix ()
+  (and xmltok-name-colon
+       (buffer-substring-no-properties (1+ xmltok-start)
+                                      xmltok-name-colon)))
+
+(defun xmltok-start-tag-local-name ()
+  (buffer-substring-no-properties (1+ (or xmltok-name-colon
+                                         xmltok-start))
+                                 xmltok-name-end))
+
+(defun xmltok-end-tag-prefix ()
+  (and xmltok-name-colon
+       (buffer-substring-no-properties (+ 2 xmltok-start)
+                                      xmltok-name-colon)))
+
+(defun xmltok-end-tag-local-name ()
+  (buffer-substring-no-properties (if xmltok-name-colon
+                                     (1+ xmltok-name-colon)
+                                   (+ 2 xmltok-start))
+                                 xmltok-name-end))
+
+(defun xmltok-start-tag-qname ()
+  (buffer-substring-no-properties (+ xmltok-start 1) xmltok-name-end))
+
+(defun xmltok-end-tag-qname ()
+  (buffer-substring-no-properties (+ xmltok-start 2) xmltok-name-end))
+
+(defsubst xmltok-make-attribute (name-begin
+                                name-colon
+                                name-end
+                                &optional
+                                value-begin
+                                value-end
+                                raw-normalized-value)
+  "Make an attribute.  RAW-NORMALIZED-VALUE is nil if the value is
+not well-formed, t if the normalized value is the string between
+VALUE-BEGIN and VALUE-END, otherwise a STRING giving the value."
+  (vector name-begin
+         name-colon
+         name-end
+         value-begin
+         value-end
+         raw-normalized-value
+         nil))
+
+(defsubst xmltok-error-message (err)
+  (aref err 0))
+
+(defsubst xmltok-error-start (err)
+  (aref err 1))
+
+(defsubst xmltok-error-end (err)
+  (aref err 2))
+
+(defsubst xmltok-make-error (message start end)
+  (vector message start end))
+
+(defun xmltok-add-error (message &optional start end)
+  (setq xmltok-errors
+       (cons (xmltok-make-error message
+                                (or start xmltok-start)
+                                (or end (point)))
+             xmltok-errors)))
+
+(defun xmltok-add-dependent (fun &optional start end &rest args)
+  (setq xmltok-dependent-regions
+       (cons (cons fun
+                   (cons (or start xmltok-start)
+                         (cons (or end (point-max))
+                               args)))
+             xmltok-dependent-regions)))
+
+(defun xmltok-forward ()
+  (setq xmltok-start (point))
+  (let* ((case-fold-search nil)
+        (space-count (skip-chars-forward " \t\r\n"))
+        (ch (char-after)))
+    (cond ((eq ch ?\<)
+          (cond ((> space-count 0)
+                 (setq xmltok-type 'space))
+                (t
+                 (goto-char (1+ (point)))
+                 (xmltok-scan-after-lt))))
+         ((eq ch ?\&)
+          (cond ((> space-count 0)
+                 (setq xmltok-type 'space))
+                (t
+                 (goto-char (1+ (point)))
+                 (xmltok-scan-after-amp
+                  (lambda (start end)
+                    (xmltok-handle-entity start end))))))
+         ((re-search-forward "[<&]\\|\\(]]>\\)" nil t)
+          (cond ((not (match-beginning 1))
+                 (goto-char (match-beginning 0))
+                 ;; must have got a non-space char
+                 (setq xmltok-type 'data))
+                ((= (match-beginning 1) xmltok-start)
+                 (xmltok-add-error "Found `]]>' not closing a CDATA section")
+                 (setq xmltok-type 'not-well-formed))
+                (t
+                 (goto-char (match-beginning 0))
+                 (setq xmltok-type
+                       (if (= (point) (+ xmltok-start space-count))
+                           'space
+                         'data)))))
+         ((eq ch nil)
+          (setq xmltok-type
+                (if (> space-count 0)
+                    'space
+                  nil)))
+         (t
+          (goto-char (point-max))
+          (setq xmltok-type 'data)))))
+
+(defun xmltok-forward-special (bound)
+  "Scan forward past the first special token starting at or after point.
+Return nil if there is no special token that starts before BOUND.
+CDATA sections, processing instructions and comments (and indeed
+anything starting with < following by ? or !) count
+as special.  Return the type of the token."
+  (when (re-search-forward "<[?!]" (1+ bound) t)
+    (setq xmltok-start (match-beginning 0))
+    (goto-char (1+ xmltok-start))
+    (let ((case-fold-search nil))
+      (xmltok-scan-after-lt))))
+
+(eval-when-compile
+
+  ;; A symbolic regexp is represented by a list whose CAR is the string
+  ;; containing the regexp and whose cdr is a list of symbolic names
+  ;; for the groups in the string.
+
+  ;; Construct a symbolic regexp from a regexp.
+  (defun xmltok-r (str)
+    (cons str nil))
+
+  ;; Concatenate zero of more regexps and symbolic regexps.
+  (defun xmltok+ (&rest args)
+    (let (strs names)
+      (while args
+       (let ((arg (car args)))
+         (if (stringp arg)
+             (setq strs (cons arg strs))
+           (setq strs (cons (car arg) strs))
+           (setq names (cons (cdr arg) names)))
+         (setq args (cdr args))))
+      (cons (apply 'concat (nreverse strs))
+           (apply 'append (nreverse names))))))
+
+(eval-when-compile
+  ;; Make a symbolic group named NAME from the regexp R.
+  ;; R may be a symbolic regexp or an ordinary regexp.
+  (defmacro xmltok-g (name &rest r)
+    (let ((sym (make-symbol "r")))
+      `(let ((,sym (xmltok+ ,@r)))
+        (if (stringp ,sym)
+            (cons (concat "\\(" ,sym "\\)") (cons ',name nil))
+          (cons (concat "\\(" (car ,sym) "\\)") (cons ',name (cdr ,sym)))))))
+
+  (defun xmltok-p (&rest r) (xmltok+ "\\(?:" 
+                                    (apply 'xmltok+ r)
+                                    "\\)"))
+
+  ;; Get the group index of ELEM in a LIST of symbols.
+  (defun xmltok-get-index (elem list)
+    (or elem
+       (error "Missing group name"))
+    (let ((found nil)
+         (i 1))
+      (while list
+       (cond ((eq elem (car list))
+              (setq found i)
+              (setq list nil))
+             (t
+              (setq i (1+ i))
+              (setq list (cdr list)))))
+      (or found
+         (error "Bad group name %s" elem))))
+
+  ;; Define a macro SYM using a symbolic regexp R.
+  ;; SYM can be called in three ways:
+  ;; (SYM regexp)
+  ;;   expands to the regexp in R
+  ;; (SYM start G)
+  ;;   expands to
+  ;;   (match-beginning N)
+  ;;   where N is the group index of G in R.
+  ;; (SYM end G)
+  ;;   expands to
+  ;;   (match-end N)
+  ;;   where N is the group index of G in R.
+  (defmacro xmltok-defregexp (sym r)
+    `(defalias ',sym
+       (let ((r ,r))
+        `(macro lambda (action &optional group-name)
+                (cond ((eq action 'regexp)
+                       ,(car r))
+                      ((or (eq action 'start) (eq action 'beginning))
+                       (list 'match-beginning (xmltok-get-index group-name
+                                                                ',(cdr r))))
+                      ((eq action 'end)
+                       (list 'match-end (xmltok-get-index group-name
+                                                          ',(cdr r))))
+                      ((eq action 'string)
+                       (list 'match-string
+                             (xmltok-get-index group-name ',(cdr r))))
+                      ((eq action 'string-no-properties)
+                       (list 'match-string-no-properties
+                             (xmltok-get-index group-name ',(cdr r))))
+                      (t (error "Invalid action: %s" action))))))))
+  
+
+(eval-when-compile
+  (let* ((or "\\|")
+        (open "\\(?:")
+        (gopen "\\(")
+        (close "\\)")
+        (name-start-char "[_[:alpha:]]")
+        (name-continue-not-start-char "[-.[:digit:]]")
+        (name-continue-char "[-._[:alnum:]]")
+        (* "*")
+        (+ "+")
+        (opt "?")
+        (question "\\?")
+        (s "[ \r\t\n]")
+        (s+ (concat s +))
+        (s* (concat s *))
+        (ncname (concat name-start-char name-continue-char *))
+        (entity-ref
+         (xmltok+ (xmltok-g entity-name ncname)
+                  (xmltok-g entity-ref-close ";") opt))
+        (decimal-ref
+         (xmltok+ (xmltok-g decimal "[0-9]" +)
+                  (xmltok-g decimal-ref-close ";") opt))
+        (hex-ref
+         (xmltok+ "x" open
+                  (xmltok-g hex "[0-9a-fA-F]" +)
+                  (xmltok-g hex-ref-close ";") opt
+                  close opt))
+        (char-ref
+         (xmltok+ (xmltok-g number-sign "#")
+                  open decimal-ref or hex-ref close opt))
+        (start-tag-close
+         (xmltok+ open (xmltok-g start-tag-close s* ">")
+                  or open (xmltok-g empty-tag-slash s* "/")
+                  (xmltok-g empty-tag-close ">") opt close
+                  or (xmltok-g start-tag-s s+)
+                  close))
+        (start-tag
+         (xmltok+ (xmltok-g start-tag-name
+                            ncname (xmltok-g start-tag-colon ":" ncname) opt)
+                  start-tag-close opt))
+        (end-tag
+         (xmltok+ (xmltok-g end-tag-slash "/")
+                  open (xmltok-g end-tag-name
+                                 ncname
+                                 (xmltok-g end-tag-colon ":" ncname) opt)
+                  (xmltok-g end-tag-close s* ">") opt
+                  close opt))
+        (comment
+         (xmltok+ (xmltok-g markup-declaration "!")
+                  (xmltok-g comment-first-dash "-"
+                            (xmltok-g comment-open "-") opt) opt))
+        (cdata-section
+         (xmltok+ "!"
+                 (xmltok-g marked-section-open "\\[")
+                 open "C"
+                 open "D"
+                 open "A"
+                 open "T"
+                 open "A"
+                 (xmltok-g cdata-section-open "\\[" ) opt
+                 close opt             ; A
+                 close opt             ; T
+                 close opt             ; A
+                 close opt             ; D
+                 close opt))           ; C
+        (processing-instruction
+         (xmltok-g processing-instruction-question question)))
+
+    (xmltok-defregexp xmltok-ncname  (xmltok+ open ncname close))
+
+    (xmltok-defregexp xmltok-after-amp
+                     (xmltok+ entity-ref or char-ref))
+    (xmltok-defregexp xmltok-after-lt
+                     (xmltok+ start-tag
+                              or end-tag
+                              ;; cdata-section must come before comment
+                              ;; because we treat <! as a comment
+                              ;; and Emacs doesn't do fully greedy matching
+                              ;; by default
+                              or cdata-section
+                              or comment
+                              or processing-instruction))
+    (xmltok-defregexp
+     xmltok-attribute
+     (let* ((lit1
+            (xmltok+ "'"
+                     "[^<'&\r\n\t]*"
+                     (xmltok-g complex1 "[&\r\n\t][^<']*") opt
+                     "'"))
+           (lit2 (cons (replace-regexp-in-string "'" "\"" (car lit1))
+                       '(complex2)))
+           (literal (xmltok-g literal lit1 or lit2))
+           (name (xmltok+ open (xmltok-g xmlns "xmlns") or ncname close
+                          (xmltok-g colon ":" ncname) opt)))
+       (xmltok+ (xmltok-g name name)
+                s* "="
+                ;; If the literal isn't followed by what it should be,
+                ;; then the closing delimiter is probably really the
+                ;; opening delimiter of another literal, so don't
+                ;; absorb the literal in this case.
+                open s* literal start-tag-close close opt)))
+    (xmltok-defregexp
+     xmltok-xml-declaration
+     (let* ((literal-content "[-._:a-zA-Z0-9]+")
+           (literal
+            (concat open "\"" literal-content "\""
+                    or "'" literal-content "'" close))
+           (version-att
+            (xmltok+ open
+                     s+ (xmltok-g version-name "version")
+                     s* "="
+                     s* (xmltok-g version-value literal)
+                     close opt))
+           (encoding-att
+            (xmltok+ open
+                     s+ (xmltok-g encoding-name "encoding")
+                     s* "="
+                     s* (xmltok-g encoding-value literal)
+                     close opt))
+          (yes-no
+           (concat open "yes" or "no" close))
+          (standalone-att
+           (xmltok+ open
+                    s+ (xmltok-g standalone-name "standalone")
+                    s* "="
+                    s* (xmltok-g standalone-value
+                                 "\"" yes-no "\"" or "'" yes-no "'")
+                    close opt)))
+       (xmltok+ "<" question "xml"
+               version-att
+               encoding-att
+               standalone-att
+               s* question ">")))
+    (xmltok-defregexp
+     xmltok-prolog
+     (let* ((single-char (xmltok-g single-char "[[|,(\"'>]"))
+           (internal-subset-close (xmltok-g internal-subset-close
+                                            "][ \t\r\n]*>"))
+           (starts-with-close-paren
+            (xmltok-g close-paren
+                      ")"
+                      (xmltok-p
+                       (xmltok-g close-paren-occur "[+?]")
+                       or
+                       (xmltok-g close-paren-star "\\*"))
+                      opt))
+           (starts-with-percent
+            (xmltok-g percent
+                      "%" (xmltok-g param-entity-ref
+                                    ncname
+                                    (xmltok-g param-entity-ref-close
+                                              ";") opt) opt))
+           (starts-with-nmtoken-not-name
+            (xmltok-g nmtoken
+                      (xmltok-p name-continue-not-start-char or ":")
+                      (xmltok-p name-continue-char or ":") *))
+           (nmtoken-after-colon
+            (xmltok+
+             (xmltok-p name-continue-not-start-char or ":")
+             (xmltok-p name-continue-char or ":") *
+             or
+             name-start-char
+             name-continue-char *
+             ":"
+             (xmltok-p name-continue-char or ":") *))
+           (after-ncname
+            (xmltok+ (xmltok-g ncname-nmtoken
+                               ":" (xmltok-p nmtoken-after-colon))
+                     or (xmltok-p (xmltok-g colon ":" ncname)
+                                  (xmltok-g colon-name-occur "[?+*]") opt)
+                     or (xmltok-g ncname-occur "[?+*]")
+                     or (xmltok-g ncname-colon ":")))
+           (starts-with-name
+            (xmltok-g name ncname (xmltok-p after-ncname) opt))
+           (starts-with-hash
+            (xmltok-g pound
+                      "#" (xmltok-g hash-name ncname)))
+           (markup-declaration
+            (xmltok-g markup-declaration
+                      "!" (xmltok-p (xmltok-g comment-first-dash "-"
+                                              (xmltok-g comment-open "-") opt)
+                                    or (xmltok-g named-markup-declaration
+                                                ncname)) opt))
+           (after-lt
+            (xmltok+ markup-declaration
+                     or (xmltok-g processing-instruction-question
+                                  question)
+                     or (xmltok-g instance-start
+                                  ncname)))
+           (starts-with-lt (xmltok-g less-than "<" (xmltok-p after-lt) opt)))
+       (xmltok+ starts-with-lt
+               or single-char
+               or starts-with-close-paren
+               or starts-with-percent
+               or starts-with-name
+               or starts-with-nmtoken-not-name
+               or starts-with-hash
+               or internal-subset-close)))))
+
+(defconst xmltok-ncname-regexp (xmltok-ncname regexp))
+
+(defun xmltok-scan-after-lt ()
+  (cond ((not (looking-at (xmltok-after-lt regexp)))
+        (xmltok-add-error "`<' that is not markup must be entered as `&lt;'")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (goto-char (match-end 0))
+        (cond ((xmltok-after-lt start start-tag-close)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-attributes nil)
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-type 'start-tag))
+              ((xmltok-after-lt start end-tag-close)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end end-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start end-tag-colon))
+               (setq xmltok-type 'end-tag))
+              ((xmltok-after-lt start start-tag-s)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-attributes nil)
+               (xmltok-scan-attributes)
+               xmltok-type)
+              ((xmltok-after-lt start empty-tag-close)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-attributes nil)
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-type 'empty-element))
+              ((xmltok-after-lt start cdata-section-open)
+               (setq xmltok-type
+                     (if (search-forward "]]>" nil t)
+                         'cdata-section
+                       (xmltok-add-error "No closing ]]>")
+                       (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                                             nil
+                                             nil
+                                             "]]>")
+                       'not-well-formed)))
+              ((xmltok-after-lt start processing-instruction-question)
+               (xmltok-scan-after-processing-instruction-open))
+              ((xmltok-after-lt start comment-open)
+               (xmltok-scan-after-comment-open))
+              ((xmltok-after-lt start empty-tag-slash)
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-attributes nil)
+               (setq xmltok-namespace-attributes nil)
+               (xmltok-add-error "Expected `/>'" (1- (point)))
+               (setq xmltok-type 'partial-empty-element))
+              ((xmltok-after-lt start start-tag-name)
+               (xmltok-add-error "Missing `>'"
+                                 nil
+                                 (1+ xmltok-start))
+               (setq xmltok-name-end
+                     (xmltok-after-lt end start-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start start-tag-colon))
+               (setq xmltok-namespace-attributes nil)
+               (setq xmltok-attributes nil)
+               (setq xmltok-type 'partial-start-tag))
+              ((xmltok-after-lt start end-tag-name)
+               (setq xmltok-name-end (xmltok-after-lt end end-tag-name))
+               (setq xmltok-name-colon
+                     (xmltok-after-lt start end-tag-colon))
+               (cond ((and (not xmltok-name-colon)
+                           (eq (char-after) ?:))
+                      (goto-char (1+ (point)))
+                      (xmltok-add-error "Expected name following `:'"
+                                        (1- (point))))
+                     (t
+                      (xmltok-add-error "Missing `>'"
+                                        nil
+                                        (1+ xmltok-start))))
+               (setq xmltok-type 'partial-end-tag))
+              ((xmltok-after-lt start end-tag-slash)
+               (xmltok-add-error "Expected name following `</'")
+               (setq xmltok-name-end nil)
+               (setq xmltok-name-colon nil)
+               (setq xmltok-type 'partial-end-tag))
+              ((xmltok-after-lt start marked-section-open)
+               (xmltok-add-error "Expected `CDATA[' after `<!['"
+                                 xmltok-start
+                                 (+ 3 xmltok-start))
+               (setq xmltok-type 'not-well-formed))
+              ((xmltok-after-lt start comment-first-dash)
+               (xmltok-add-error "Expected `-' after `<!-'"
+                                 xmltok-start
+                                 (+ 3 xmltok-start))
+               (setq xmltok-type 'not-well-formed))
+              ((xmltok-after-lt start markup-declaration)
+               (xmltok-add-error "Expected `[CDATA[' or `--' after `<!'"
+                                 xmltok-start
+                                 (+ 2 xmltok-start))
+               (setq xmltok-type 'not-well-formed))
+              (t
+               (xmltok-add-error "Not well-formed")
+               (setq xmltok-type 'not-well-formed))))))
+
+;; XXX This should be unified with
+;; xmltok-scan-prolog-after-processing-instruction-open
+;; XXX maybe should include rest of line (up to any <,>) in unclosed PI
+(defun xmltok-scan-after-processing-instruction-open ()
+  (cond ((not (search-forward "?>" nil t))
+        (xmltok-add-error "No closing ?>"
+                          xmltok-start
+                          (+ xmltok-start 2))
+        (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                              nil
+                              nil
+                              "?>")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (cond ((not (save-excursion
+                      (goto-char (+ 2 xmltok-start))
+                      (and (looking-at (xmltok-ncname regexp))
+                           (setq xmltok-name-end (match-end 0)))))
+               (setq xmltok-name-end (+ xmltok-start 2))
+               (xmltok-add-error "<? not followed by name"
+                                 (+ xmltok-start 2)
+                                 (+ xmltok-start 3)))
+              ((not (or (memq (char-after xmltok-name-end)
+                              '(?\n ?\t ?\r ? ))
+                        (= xmltok-name-end (- (point) 2))))
+               (xmltok-add-error "Target not followed by whitespace"
+                                 xmltok-name-end
+                                 (1+ xmltok-name-end)))
+              ((and (= xmltok-name-end (+ xmltok-start 5))
+                    (save-excursion
+                      (goto-char (+ xmltok-start 2))
+                      (let ((case-fold-search t))
+                        (looking-at "xml"))))
+               (xmltok-add-error "Processing instruction target is xml"
+                                 (+ xmltok-start 2)
+                                 (+ xmltok-start 5))))
+        (setq xmltok-type 'processing-instruction))))
+               
+(defun xmltok-scan-after-comment-open ()
+  (setq xmltok-type
+       (cond ((not (search-forward "--" nil t))
+              (xmltok-add-error "No closing -->")
+              (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                                    nil
+                                    nil
+                                    ;; not --> because
+                                    ;; -- is not allowed
+                                    ;; in comments in XML
+                                    "--")
+              'not-well-formed)
+             ((eq (char-after) ?>)
+              (goto-char (1+ (point)))
+              'comment)
+             (t
+              (xmltok-add-dependent
+               'xmltok-semi-closed-reparse-p
+               nil
+               (point)
+               "--"
+               2)
+              ;; just include the <!-- in the token
+              (goto-char (+ xmltok-start 4))
+              ;; Need do this after the goto-char because
+              ;; marked error should just apply to <!--
+              (xmltok-add-error "First following `--' not followed by `>'")
+              'not-well-formed))))
+
+(defun xmltok-scan-attributes ()
+  (let ((recovering nil)
+       (atts-needing-normalization nil))
+    (while (cond ((or (looking-at (xmltok-attribute regexp))
+                     ;; use non-greedy group
+                     (when (looking-at (concat "[^<>\n]+?"
+                                               (xmltok-attribute regexp)))
+                       (unless recovering
+                         (xmltok-add-error "Malformed attribute"
+                                           (point)
+                                           (save-excursion
+                                             (goto-char (xmltok-attribute start
+                                                                          name))
+                                             (skip-chars-backward "\r\n\t ")
+                                             (point))))
+                       t))
+                 (setq recovering nil)
+                 (goto-char (match-end 0))
+                 (let ((att (xmltok-add-attribute)))
+                   (when att
+                     (setq atts-needing-normalization
+                           (cons att atts-needing-normalization))))
+                 (cond ((xmltok-attribute start start-tag-s) t)
+                       ((xmltok-attribute start start-tag-close)
+                        (setq xmltok-type 'start-tag)
+                        nil)
+                       ((xmltok-attribute start empty-tag-close)
+                        (setq xmltok-type 'empty-element)
+                        nil)
+                       ((xmltok-attribute start empty-tag-slash)
+                        (setq xmltok-type 'partial-empty-element)
+                        (xmltok-add-error "Expected `/>'"
+                                          (1- (point)))
+                        nil)
+                       ((looking-at "[ \t\r\n]*[\"']")
+                        (goto-char (match-end 0))
+                        (xmltok-add-error "Missing closing delimiter"
+                                          (1- (point)))
+                        (setq recovering t)
+                        t)
+                       ((looking-at "[ \t]*\\([^ \t\r\n\"'=<>/]+\\)[ \t\r\n/>]")
+                        (goto-char (match-end 1))
+                        (xmltok-add-error "Attribute value not quoted"
+                                          (match-beginning 1))
+                        (setq recovering t)
+                        t)
+                       (t
+                        (xmltok-add-error "Missing attribute value"
+                                          (1- (point)))
+                        (setq recovering t)
+                        t)))
+                ((looking-at "[^<>\n]*/>")
+                 (let ((start (point)))
+                   (goto-char (match-end 0))
+                   (unless recovering
+                     (xmltok-add-error "Malformed empty-element"
+                                       start
+                                       (- (point) 2))))
+                 (setq xmltok-type 'empty-element)
+                 nil)
+                ((looking-at "[^<>\n]*>")
+                 (let ((start (point)))
+                   (goto-char (match-end 0))
+                   (unless recovering
+                     (xmltok-add-error "Malformed start-tag"
+                                       start
+                                       (1- (point)))))
+                 (setq xmltok-type 'start-tag)
+                 nil)
+                (t
+                 (when recovering
+                   (skip-chars-forward "^<>\n"))
+                 (xmltok-add-error "Missing `>'"
+                                   xmltok-start
+                                   (1+ xmltok-start))
+                 (setq xmltok-type 'partial-start-tag)
+                 nil)))
+    (while atts-needing-normalization
+      (xmltok-normalize-attribute (car atts-needing-normalization))
+      (setq atts-needing-normalization (cdr atts-needing-normalization))))
+  (setq xmltok-attributes
+       (nreverse xmltok-attributes))
+  (setq xmltok-namespace-attributes
+       (nreverse xmltok-namespace-attributes)))
+
+(defun xmltok-add-attribute ()
+  "Return the attribute if it needs normalizing, otherwise nil."
+  (let* ((needs-normalizing nil)
+        (att
+         (if (xmltok-attribute start literal)
+             (progn
+               (setq needs-normalizing
+                     (or (xmltok-attribute start complex1)
+                         (xmltok-attribute start complex2)))
+               (xmltok-make-attribute (xmltok-attribute start name)
+                                      (xmltok-attribute start colon)
+                                      (xmltok-attribute end name)
+                                      (1+ (xmltok-attribute start literal))
+                                      (1- (xmltok-attribute end literal))
+                                      (not needs-normalizing)))
+          (xmltok-make-attribute (xmltok-attribute start name)
+                                 (xmltok-attribute start colon)
+                                 (xmltok-attribute end name)))))
+    (if (xmltok-attribute start xmlns)
+       (setq xmltok-namespace-attributes
+             (cons att xmltok-namespace-attributes))
+      (setq xmltok-attributes
+           (cons att xmltok-attributes)))
+    (and needs-normalizing
+        att)))
+        
+(defun xmltok-normalize-attribute (att)
+  (let ((end (xmltok-attribute-value-end att))
+       (well-formed t)
+       (value-parts nil)
+       (refs nil))
+    (save-excursion
+      (goto-char (xmltok-attribute-value-start att))
+      (while (progn
+              (let ((n (skip-chars-forward "^\r\t\n&" end)))
+                (when (> n 0)
+                  (setq value-parts
+                        (cons (buffer-substring-no-properties (- (point) n)
+                                                              (point))
+                              value-parts))))
+              (when (< (point) end)
+                (goto-char (1+ (point)))
+                (cond ((eq (char-before) ?\&)
+                       (let ((xmltok-start (1- (point)))
+                              xmltok-type xmltok-replacement)
+                         (xmltok-scan-after-amp
+                          (lambda (start end)
+                            (xmltok-handle-entity start end t)))
+                         (cond ((or (eq xmltok-type 'char-ref)
+                                    (eq xmltok-type 'entity-ref))
+                                (setq refs
+                                      (cons (vector xmltok-type
+                                                    xmltok-start
+                                                    (point))
+                                            refs))
+                                (if xmltok-replacement
+                                    (setq value-parts
+                                          (cons xmltok-replacement
+                                                value-parts))
+                                  (setq well-formed nil)))
+                               (t (setq well-formed nil)))))
+                      (t (setq value-parts
+                               (cons " " value-parts)))))
+              (< (point) end))))
+    (when well-formed
+      (aset att 5 (apply 'concat (nreverse value-parts))))
+    (aset att 6 (nreverse refs))))
+
+(defun xmltok-scan-after-amp (entity-handler)
+  (cond ((not (looking-at (xmltok-after-amp regexp)))
+        (xmltok-add-error "`&' that is not markup must be entered as `&amp;'")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (goto-char (match-end 0))
+        (cond ((xmltok-after-amp start entity-ref-close)
+               (funcall entity-handler
+                        (xmltok-after-amp start entity-name)
+                        (xmltok-after-amp end entity-name))
+               (setq xmltok-type 'entity-ref))
+              ((xmltok-after-amp start decimal-ref-close)
+               (xmltok-scan-char-ref (xmltok-after-amp start decimal)
+                                     (xmltok-after-amp end decimal)
+                                     10))
+              ((xmltok-after-amp start hex-ref-close)
+               (xmltok-scan-char-ref (xmltok-after-amp start hex)
+                                     (xmltok-after-amp end hex)
+                                     16))
+              ((xmltok-after-amp start number-sign)
+               (xmltok-add-error "Missing character number")
+               (setq xmltok-type 'not-well-formed))
+              (t
+               (xmltok-add-error "Missing closing `;'")
+               (setq xmltok-type 'not-well-formed))))))
+
+(defconst xmltok-entity-error-messages
+  '((unparsed . "Referenced entity is unparsed")
+    (not-well-formed . "Referenced entity is not well-formed")
+    (external nil . "Referenced entity is external")
+    (element nil . "Referenced entity contains <")))
+
+(defun xmltok-handle-entity (start end &optional attributep)
+  (let* ((name (buffer-substring-no-properties start end))
+        (name-def (assoc name xmltok-dtd))
+        (def (cdr name-def)))
+    (cond ((setq xmltok-replacement (and (consp def)
+                                        (if attributep
+                                            (cdr def)
+                                          (car def)))))
+         ((null name-def)
+          (unless (eq (car xmltok-dtd) t)
+            (xmltok-add-error "Referenced entity has not been defined"
+                              start
+                              end)))
+         ((and attributep (consp def))
+          (xmltok-add-error "Referenced entity contains <"
+                            start
+                            end))
+         (t
+          (let ((err (cdr (assq def xmltok-entity-error-messages))))
+            (when (consp err)
+              (setq err (if attributep (cdr err) (car err))))
+            (when err
+              (xmltok-add-error err start end)))))))
+
+(defun xmltok-scan-char-ref (start end base)
+  (setq xmltok-replacement
+       (let ((n (string-to-number (buffer-substring-no-properties start end)
+                               base)))
+         (cond ((and (integerp n) (xmltok-valid-char-p n))
+                (setq n (xmltok-unicode-to-char n))
+                (and n (string n)))
+               (t
+                (xmltok-add-error "Invalid character code" start end)
+                nil))))
+  (setq xmltok-type 'char-ref))
+
+(defun xmltok-char-number (start end)
+  (let* ((base (if (eq (char-after (+ start 2)) ?x)
+                  16
+                10))
+        (n (string-to-number
+            (buffer-substring-no-properties (+ start (if (= base 16) 3 2))
+                                            (1- end))
+            base)))
+    (and (integerp n)
+        (xmltok-valid-char-p n)
+        n)))
+
+(defun xmltok-unclosed-reparse-p (change-start
+                                 change-end
+                                 pre-change-length
+                                 start
+                                 end
+                                 delimiter)
+  (let ((len-1 (1- (length delimiter))))
+    (goto-char (max start (- change-start len-1)))
+    (search-forward delimiter (min end (+ change-end len-1)) t)))
+
+;; Handles a <!-- with the next -- not followed by >
+
+(defun xmltok-semi-closed-reparse-p (change-start
+                                    change-end
+                                    pre-change-length
+                                    start
+                                    end
+                                    delimiter
+                                    delimiter-length)
+  (or (<= (- end delimiter-length) change-end)
+      (xmltok-unclosed-reparse-p change-start
+                                change-end
+                                pre-change-length
+                                start
+                                end
+                                delimiter)))
+
+(defun xmltok-valid-char-p (n)
+  "Return non-nil if n is the Unicode code of a valid XML character."
+  (cond ((< n #x20) (memq n '(#xA #xD #x9)))
+       ((< n #xD800) t)
+       ((< n #xE000) nil)
+       ((< n #xFFFE) t)
+       (t (and (> n #xFFFF)
+               (< n #x110000)))))
+
+(defun xmltok-unicode-to-char (n)
+  "Return the character corresponding to Unicode scalar value N.
+Return nil if unsupported in Emacs."
+  (decode-char 'ucs n))
+
+;;; Prolog parsing
+
+(defvar xmltok-contains-doctype nil)
+(defvar xmltok-doctype-external-subset-flag nil)
+(defvar xmltok-internal-subset-start nil)
+(defvar xmltok-had-param-entity-ref nil)
+(defvar xmltok-prolog-regions nil)
+(defvar xmltok-standalone nil
+  "Non-nil if there was an XML declaration specifying standalone=\"yes\",")
+(defvar xmltok-markup-declaration-doctype-flag nil)
+
+(defconst xmltok-predefined-entity-alist
+  '(("lt" "<" . "<")
+    ("gt" ">" . ">")
+    ("amp" "&" . "&")
+    ("apos" "'" . "'")
+    ("quot" "\"" . "\"")))
+
+(defun xmltok-forward-prolog ()
+  "Move forward to the end of the XML prolog.
+
+Returns a list of vectors [TYPE START END] where TYPE is a symbol and
+START and END are integers giving the start and end of the region of
+that type.  TYPE can be one of xml-declaration,
+xml-declaration-attribute-name, xml-declaration-attribute-value,
+comment, processing-instruction-left, processing-instruction-right,
+markup-declaration-open.  markup-declaration-close,
+internal-subset-open, internal-subset-close, hash-name, keyword,
+literal, encoding-name.
+Adds to `xmltok-errors' and `xmltok-dependent-regions' as appropriate."
+  (let ((case-fold-search nil)
+       xmltok-start
+       xmltok-type
+       xmltok-prolog-regions
+       xmltok-contains-doctype
+       xmltok-internal-subset-start
+       xmltok-had-param-entity-ref
+       xmltok-standalone
+       xmltok-doctype-external-subset-flag
+       xmltok-markup-declaration-doctype-flag)
+    (setq xmltok-dtd xmltok-predefined-entity-alist)
+    (xmltok-scan-xml-declaration)
+    (xmltok-next-prolog-token)
+    (while (condition-case err
+              (when (xmltok-parse-prolog-item)
+                (xmltok-next-prolog-token))
+            (xmltok-markup-declaration-parse-error
+             (xmltok-skip-markup-declaration))))
+    (when xmltok-internal-subset-start
+      (xmltok-add-error "No closing ]"
+                       (1- xmltok-internal-subset-start)
+                       xmltok-internal-subset-start))
+    (xmltok-parse-entities)
+    ;; XXX prune dependent-regions for those entirely in prolog
+    (nreverse xmltok-prolog-regions)))
+
+(defconst xmltok-bad-xml-decl-regexp
+  "[ \t\r\n]*<\\?xml\\(?:[ \t\r\n]\\|\\?>\\)")
+
+;;;###autoload
+(defun xmltok-get-declared-encoding-position (&optional limit)
+  "Return the position of the encoding in the XML declaration at point.
+If there is a well-formed XML declaration starting at point and it
+contains an encoding declaration, then return (START . END)
+where START and END are the positions of the start and the end
+of the encoding name; if there is no encoding declaration return
+the position where and encoding declaration could be inserted.
+If there is XML that is not well-formed that looks like an XML declaration,
+return nil.  Otherwise, return t.
+If LIMIT is non-nil, then do not consider characters beyond LIMIT."
+  (cond ((let ((case-fold-search nil))
+          (and (looking-at (xmltok-xml-declaration regexp))
+               (or (not limit) (<= (match-end 0) limit))))
+        (let ((end (xmltok-xml-declaration end encoding-value)))
+          (if end
+              (cons (1+ (xmltok-xml-declaration start encoding-value))
+                    (1- end))
+            (or (xmltok-xml-declaration end version-value)
+                (+ (point) 5)))))
+       ((not (let ((case-fold-search t))
+               (looking-at xmltok-bad-xml-decl-regexp))))))
+               
+(defun xmltok-scan-xml-declaration ()
+  (when (looking-at (xmltok-xml-declaration regexp))
+    (xmltok-add-prolog-region 'xml-declaration (point) (match-end 0))
+    (goto-char (match-end 0))
+    (when (xmltok-xml-declaration start version-name)
+      (xmltok-add-prolog-region 'xml-declaration-attribute-name
+                               (xmltok-xml-declaration start version-name)
+                               (xmltok-xml-declaration end version-name))
+      (let ((start (xmltok-xml-declaration start version-value))
+           (end (xmltok-xml-declaration end version-value)))
+       (xmltok-add-prolog-region 'xml-declaration-attribute-value
+                                 start
+                                 end)))
+    ;; XXX need to check encoding name
+    ;; Should start with letter, not contain colon
+    (when (xmltok-xml-declaration start encoding-name)
+      (xmltok-add-prolog-region 'xml-declaration-attribute-name
+                               (xmltok-xml-declaration start encoding-name)
+                               (xmltok-xml-declaration end encoding-name))
+      (let ((start (xmltok-xml-declaration start encoding-value))
+           (end (xmltok-xml-declaration end encoding-value)))
+       (xmltok-add-prolog-region 'encoding-name
+                                 (1+ start)
+                                 (1- end))
+       (xmltok-add-prolog-region 'xml-declaration-attribute-value
+                                 start
+                                 end)))
+    (when (xmltok-xml-declaration start standalone-name)
+      (xmltok-add-prolog-region 'xml-declaration-attribute-name
+                               (xmltok-xml-declaration start standalone-name)
+                               (xmltok-xml-declaration end standalone-name))
+      (let ((start (xmltok-xml-declaration start standalone-value))
+           (end (xmltok-xml-declaration end standalone-value)))
+       (xmltok-add-prolog-region 'xml-declaration-attribute-value
+                                 start
+                                 end)
+       (setq xmltok-standalone
+             (string= (buffer-substring-no-properties (1+ start) (1- end))
+                      "yes"))))
+    t))
+
+(defconst xmltok-markup-declaration-alist
+  '(("ELEMENT" . xmltok-parse-element-declaration)
+    ("ATTLIST" . xmltok-parse-attlist-declaration)
+    ("ENTITY" . xmltok-parse-entity-declaration)
+    ("NOTATION" . xmltok-parse-notation-declaration)))
+
+(defun xmltok-parse-prolog-item ()
+  (cond ((eq xmltok-type 'comment)
+        (xmltok-add-prolog-region 'comment
+                                  xmltok-start
+                                  (point))
+        t)
+       ((eq xmltok-type 'processing-instruction))
+       ((eq xmltok-type 'named-markup-declaration)
+        (setq xmltok-markup-declaration-doctype-flag nil)
+        (xmltok-add-prolog-region 'markup-declaration-open
+                                  xmltok-start
+                                  (point))
+        (let* ((name (buffer-substring-no-properties
+                      (+ xmltok-start 2)
+                      (point)))
+               (fun (cdr (assoc name xmltok-markup-declaration-alist))))
+          (cond (fun
+                 (unless xmltok-internal-subset-start
+                   (xmltok-add-error
+                    "Declaration allowed only in internal subset"))
+                 (funcall fun))
+                ((string= name "DOCTYPE")
+                 (xmltok-parse-doctype))
+                (t
+                 (xmltok-add-error "Unknown markup declaration"
+                                   (+ xmltok-start 2))
+                 (xmltok-next-prolog-token)
+                 (xmltok-markup-declaration-parse-error))))
+        t)
+       ((or (eq xmltok-type 'end-prolog)
+            (not xmltok-type))
+        nil)
+       ((eq xmltok-type 'internal-subset-close)
+        (xmltok-add-prolog-region 'internal-subset-close
+                                  xmltok-start
+                                  (1+ xmltok-start))
+        (xmltok-add-prolog-region 'markup-declaration-close
+                                  (1- (point))
+                                  (point))
+        (if xmltok-internal-subset-start
+            (setq xmltok-internal-subset-start nil)
+          (xmltok-add-error "]> outside internal subset"))
+        t)
+       ((eq xmltok-type 'param-entity-ref)
+        (if xmltok-internal-subset-start
+            (setq xmltok-had-param-entity-ref t)
+          (xmltok-add-error "Parameter entity reference outside document type declaration"))
+        t)
+       ;; If we don't do this, we can get thousands of errors when
+       ;; a plain text file is parsed.
+       ((not xmltok-internal-subset-start)
+        (when (let ((err (car xmltok-errors)))
+                (or (not err)
+                    (<= (xmltok-error-end err) xmltok-start)))
+          (goto-char xmltok-start))
+        nil)
+       ((eq xmltok-type 'not-well-formed) t)
+       (t
+        (xmltok-add-error "Token allowed only inside markup declaration")
+        t)))
+
+(defun xmltok-parse-doctype ()
+  (setq xmltok-markup-declaration-doctype-flag t)
+  (xmltok-next-prolog-token)
+  (when xmltok-internal-subset-start
+    (xmltok-add-error "DOCTYPE declaration not allowed in internal subset")
+    (xmltok-markup-declaration-parse-error))
+  (when xmltok-contains-doctype
+    (xmltok-add-error "Duplicate DOCTYPE declaration")
+    (xmltok-markup-declaration-parse-error))
+  (setq xmltok-contains-doctype t)
+  (xmltok-require-token 'name 'prefixed-name)
+  (xmltok-require-next-token "SYSTEM" "PUBLIC" ?\[ ?>)
+  (cond ((eq xmltok-type ?\[)
+        (setq xmltok-internal-subset-start (point)))
+       ((eq xmltok-type ?>))
+       (t
+        (setq xmltok-doctype-external-subset-flag t)
+        (xmltok-parse-external-id)
+        (xmltok-require-token ?\[ ?>)
+        (when (eq xmltok-type ?\[)
+          (setq xmltok-internal-subset-start (point))))))
+
+(defun xmltok-parse-attlist-declaration ()
+  (xmltok-require-next-token 'prefixed-name 'name)
+  (while (progn
+          (xmltok-require-next-token ?> 'name 'prefixed-name)
+          (if (eq xmltok-type ?>)
+              nil
+            (xmltok-require-next-token ?\(
+                                       "CDATA"
+                                       "ID"
+                                       "IDREF"
+                                       "IDREFS"
+                                       "ENTITY"
+                                       "ENTITIES"
+                                       "NMTOKEN"
+                                       "NMTOKENS"
+                                       "NOTATION")
+            (cond ((eq xmltok-type ?\()
+                   (xmltok-parse-nmtoken-group))
+                  ((string= (xmltok-current-token-string)
+                            "NOTATION")
+                   (xmltok-require-next-token ?\()
+                   (xmltok-parse-nmtoken-group)))
+            (xmltok-require-next-token "#IMPLIED"
+                                       "#REQUIRED"
+                                       "#FIXED"
+                                       'literal)
+            (when (string= (xmltok-current-token-string) "#FIXED")
+              (xmltok-require-next-token 'literal))
+            t))))
+                  
+(defun xmltok-parse-nmtoken-group ()
+  (while (progn
+          (xmltok-require-next-token 'nmtoken 'prefixed-name 'name)
+          (xmltok-require-next-token ?| ?\))
+          (eq xmltok-type ?|))))
+
+(defun xmltok-parse-element-declaration ()
+  (xmltok-require-next-token 'name 'prefixed-name)
+  (xmltok-require-next-token "EMPTY" "ANY" ?\()
+  (when (eq xmltok-type ?\()
+    (xmltok-require-next-token "#PCDATA"
+                              'name
+                              'prefixed-name
+                              'name-occur
+                              ?\()
+    (cond ((eq xmltok-type 'hash-name)
+          (xmltok-require-next-token ?| ?\) 'close-paren-star)
+          (while (eq xmltok-type ?|)
+            (xmltok-require-next-token 'name 'prefixed-name)
+            (xmltok-require-next-token 'close-paren-star ?|)))
+         (t (xmltok-parse-model-group))))
+  (xmltok-require-next-token ?>))
+
+(defun xmltok-parse-model-group ()
+  (xmltok-parse-model-group-member)
+  (xmltok-require-next-token ?|
+                            ?,
+                            ?\)
+                            'close-paren-star
+                            'close-paren-occur)
+  (when (memq xmltok-type '(?, ?|))
+    (let ((connector xmltok-type))
+      (while (progn
+              (xmltok-next-prolog-token)
+              (xmltok-parse-model-group-member)
+              (xmltok-require-next-token connector
+                                         ?\)
+                                         'close-paren-star
+                                         'close-paren-occur)
+              (eq xmltok-type connector))))))
+                                         
+(defun xmltok-parse-model-group-member ()
+  (xmltok-require-token 'name
+                       'prefixed-name
+                       'name-occur
+                       ?\()
+  (when (eq xmltok-type ?\()
+    (xmltok-next-prolog-token)
+    (xmltok-parse-model-group)))
+    
+(defun xmltok-parse-entity-declaration ()
+  (let (paramp name)
+    (xmltok-require-next-token 'name ?%)
+    (when (eq xmltok-type ?%)
+      (setq paramp t)
+      (xmltok-require-next-token 'name))
+    (setq name (xmltok-current-token-string))
+    (xmltok-require-next-token 'literal "SYSTEM" "PUBLIC")
+    (cond ((eq xmltok-type 'literal)
+          (let ((replacement (xmltok-parse-entity-value)))
+            (unless paramp
+              (xmltok-define-entity name replacement)))
+          (xmltok-require-next-token ?>))
+         (t
+          (xmltok-parse-external-id)
+          (if paramp
+              (xmltok-require-token ?>)
+            (xmltok-require-token ?> "NDATA")
+            (if (eq xmltok-type ?>)
+                (xmltok-define-entity name 'external)
+              (xmltok-require-next-token 'name)
+              (xmltok-require-next-token ?>)
+              (xmltok-define-entity name 'unparsed)))))))
+
+(defun xmltok-define-entity (name value)
+  (when (and (or (not xmltok-had-param-entity-ref)
+                xmltok-standalone)
+            (not (assoc name xmltok-dtd)))
+    (setq xmltok-dtd
+         (cons (cons name value) xmltok-dtd))))
+  
+(defun xmltok-parse-entity-value ()
+  (let ((lim (1- (point)))
+       (well-formed t)
+       value-parts
+       start)
+    (save-excursion
+      (goto-char (1+ xmltok-start))
+      (setq start (point))
+      (while (progn
+              (skip-chars-forward "^%&" lim)
+              (when (< (point) lim)
+                (goto-char (1+ (point)))
+                (cond ((eq (char-before) ?%)
+                       (xmltok-add-error "Parameter entity references are not allowed in the internal subset"
+                                         (1- (point))
+                                         (point))
+                       (setq well-formed  nil))
+                      (t
+                       (let ((xmltok-start (1- (point)))
+                              xmltok-type xmltok-replacement)
+                         (xmltok-scan-after-amp (lambda (start end)))
+                         (cond ((eq xmltok-type 'char-ref)
+                                (setq value-parts
+                                      (cons (buffer-substring-no-properties
+                                             start
+                                             xmltok-start)
+                                            value-parts))
+                                (setq value-parts
+                                      (cons xmltok-replacement
+                                            value-parts))
+                                (setq start (point)))
+                               ((eq xmltok-type 'not-well-formed)
+                                (setq well-formed nil))))))
+                t))))
+    (if (not well-formed)
+       nil
+      (apply 'concat
+            (nreverse (cons (buffer-substring-no-properties start lim)
+                            value-parts))))))
+                    
+(defun xmltok-parse-notation-declaration ()
+  (xmltok-require-next-token 'name)
+  (xmltok-require-next-token "SYSTEM" "PUBLIC")
+  (let ((publicp (string= (xmltok-current-token-string) "PUBLIC")))
+    (xmltok-require-next-token 'literal)
+    (cond (publicp
+          (xmltok-require-next-token 'literal ?>)
+          (unless (eq xmltok-type ?>)
+            (xmltok-require-next-token ?>)))
+         (t (xmltok-require-next-token ?>)))))
+
+(defun xmltok-parse-external-id ()
+  (xmltok-require-token "SYSTEM" "PUBLIC")
+  (let ((publicp (string= (xmltok-current-token-string) "PUBLIC")))
+    (xmltok-require-next-token 'literal)
+    (when publicp
+      (xmltok-require-next-token 'literal)))
+  (xmltok-next-prolog-token))
+
+(defun xmltok-require-next-token (&rest types)
+  (xmltok-next-prolog-token)
+  (apply 'xmltok-require-token types))
+
+(defun xmltok-require-token (&rest types)
+  ;; XXX Generate a more helpful error message
+  (while (and (not (let ((type (car types)))
+                    (if (stringp (car types))
+                        (string= (xmltok-current-token-string) type)
+                      (eq type xmltok-type))))
+             (setq types (cdr types))))
+  (unless types
+    (when (and xmltok-type
+              (not (eq xmltok-type 'not-well-formed)))
+      (xmltok-add-error "Unexpected token"))
+    (xmltok-markup-declaration-parse-error))
+  (let ((region-type (xmltok-prolog-region-type (car types))))
+    (when region-type
+      (xmltok-add-prolog-region region-type
+                               xmltok-start
+                               (point)))))
+
+(defun xmltok-current-token-string ()
+  (buffer-substring-no-properties xmltok-start (point)))
+
+(put 'xmltok-markup-declaration-parse-error
+     'error-conditions
+     '(error xmltok-markup-declaration-parse-error))
+
+(put 'xmltok-markup-declaration-parse-error
+     'error-message
+     "Syntax error in markup declaration")
+
+(defun xmltok-markup-declaration-parse-error ()
+  (signal 'xmltok-markup-declaration-parse-error nil))
+
+(defun xmltok-skip-markup-declaration ()
+  (while (cond ((eq xmltok-type ?>)
+               (xmltok-next-prolog-token)
+               nil)
+              ((and xmltok-markup-declaration-doctype-flag
+                    (eq xmltok-type ?\[))
+               (setq xmltok-internal-subset-start (point))
+               (xmltok-next-prolog-token)
+               nil)
+              ((memq xmltok-type '(nil
+                                   end-prolog
+                                   named-markup-declaration
+                                   comment
+                                   processing-instruction))
+               nil)
+              ((and xmltok-internal-subset-start
+                    (eq xmltok-type 'internal-subset-close))
+               nil)
+              (t (xmltok-next-prolog-token) t)))
+  xmltok-type)
+
+(defun xmltok-prolog-region-type (required)
+  (cond ((cdr (assq xmltok-type
+                   '((literal . literal)
+                     (?> . markup-declaration-close)
+                     (?\[ . internal-subset-open)
+                     (hash-name . hash-name)))))
+       ((and (stringp required) (eq xmltok-type 'name))
+        'keyword)))
+        
+;; Return new token type.
+                                   
+(defun xmltok-next-prolog-token ()
+  (skip-chars-forward " \t\r\n")
+  (setq xmltok-start (point))
+  (cond ((not (and (looking-at (xmltok-prolog regexp))
+                  (goto-char (match-end 0))))
+        (let ((ch (char-after)))
+          (cond (ch
+                 (goto-char (1+ (point)))
+                 (xmltok-add-error "Illegal char in prolog")
+                 (setq xmltok-type 'not-well-formed))
+                (t (setq xmltok-type nil)))))
+       ((or (xmltok-prolog start ncname-occur)
+            (xmltok-prolog start colon-name-occur))
+        (setq xmltok-name-end (1- (point)))
+        (setq xmltok-name-colon (xmltok-prolog start colon))
+        (setq xmltok-type 'name-occur))
+       ((xmltok-prolog start colon)
+        (setq xmltok-name-end (point))
+        (setq xmltok-name-colon (xmltok-prolog start colon))
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name"))
+        (setq xmltok-type 'prefixed-name))
+       ((or (xmltok-prolog start ncname-nmtoken)
+            (xmltok-prolog start ncname-colon))
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name token"))
+        (setq xmltok-type 'nmtoken))
+       ((xmltok-prolog start name)     
+        (setq xmltok-name-end (point))
+        (setq xmltok-name-colon nil)
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name"))
+        (setq xmltok-type 'name))
+       ((xmltok-prolog start hash-name)        
+        (setq xmltok-name-end (point))
+        (unless (looking-at "[ \t\r\n>)|%]")
+          (xmltok-add-error "Missing space after name"))
+        (setq xmltok-type 'hash-name))
+       ((xmltok-prolog start processing-instruction-question)
+        (xmltok-scan-prolog-after-processing-instruction-open))
+       ((xmltok-prolog start comment-open)
+        ;; XXX if not-well-formed, ignore some stuff
+        (xmltok-scan-after-comment-open))
+       ((xmltok-prolog start named-markup-declaration)
+        (setq xmltok-type 'named-markup-declaration))
+       ((xmltok-prolog start instance-start)
+        (goto-char xmltok-start)
+        (setq xmltok-type 'end-prolog))
+       ((xmltok-prolog start close-paren-star)
+        (setq xmltok-type 'close-paren-star))
+       ((xmltok-prolog start close-paren-occur)
+        (setq xmltok-type 'close-paren-occur))
+       ((xmltok-prolog start close-paren)
+        (unless (looking-at "[ \t\r\n>,|)]")
+          (xmltok-add-error "Missing space after )"))
+        (setq xmltok-type ?\)))
+       ((xmltok-prolog start single-char)
+        (let ((ch (char-before)))
+          (cond ((memq ch '(?\" ?\'))
+                 (xmltok-scan-prolog-literal))
+                (t (setq xmltok-type ch)))))
+       ((xmltok-prolog start percent)
+        (cond ((xmltok-prolog start param-entity-ref-close)
+               (setq xmltok-name-end (1- (point)))
+               (setq xmltok-type 'param-entity-ref))
+              ((xmltok-prolog start param-entity-ref)
+               (xmltok-add-error "Missing ;")
+               (setq xmltok-name-end (point))
+               (setq xmltok-type 'param-entity-ref))
+              ((looking-at "[ \t\r\n%]")
+               (setq xmltok-type ?%))
+              (t
+               (xmltok-add-error "Expected name after %")
+               (setq xmltok-type 'not-well-formed))))
+       ((xmltok-prolog start nmtoken)
+        (unless (looking-at "[ \t\r\n>),|[%]")
+          (xmltok-add-error "Missing space after name token"))
+        (setq xmltok-type 'nmtoken))
+       ((xmltok-prolog start internal-subset-close)
+        (setq xmltok-type 'internal-subset-close))
+       ((xmltok-prolog start pound)
+        (xmltok-add-error "Expected name after #")
+        (setq xmltok-type 'not-well-formed))
+       ((xmltok-prolog start markup-declaration)
+        (xmltok-add-error "Expected name or -- after <!")
+        (setq xmltok-type 'not-well-formed))
+       ((xmltok-prolog start comment-first-dash)
+        (xmltok-add-error "Expected <!--")
+        (setq xmltok-type 'not-well-formed))
+       ((xmltok-prolog start less-than)
+        (xmltok-add-error "Incomplete markup")
+        (setq xmltok-type 'not-well-formed))
+       (t (error "Unhandled token in prolog %s"
+                 (match-string-no-properties 0)))))
+
+(defun xmltok-scan-prolog-literal ()
+  (let* ((delim (string (char-before)))
+        (safe-end (save-excursion
+                    (skip-chars-forward (concat "^<>[]" delim))
+                    (point)))
+        (end (save-excursion
+               (goto-char safe-end)
+               (search-forward delim nil t))))
+    (or (cond ((not end)
+              (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                                    nil
+                                    nil
+                                    delim)
+              nil)
+             ((save-excursion
+                (goto-char end)
+                (looking-at "[ \t\r\n>%[]"))
+              (goto-char end)
+              (setq xmltok-type 'literal))
+             ((eq (1+ safe-end) end)
+              (goto-char end)
+              (xmltok-add-error (format "Missing space after %s" delim)
+                                safe-end)
+              (setq xmltok-type 'literal))
+             (t
+              (xmltok-add-dependent 'xmltok-semi-closed-reparse-p
+                                    xmltok-start
+                                    (1+ end)
+                                    delim
+                                    1)
+              nil))
+       (progn
+         (xmltok-add-error (format "Missing closing %s" delim))
+         (goto-char safe-end)
+         (skip-chars-backward " \t\r\n")
+         (setq xmltok-type 'not-well-formed)))))
+
+(defun xmltok-scan-prolog-after-processing-instruction-open ()
+  (cond ((not (search-forward "?>" nil t))
+        (xmltok-add-error "No closing ?>"
+                          xmltok-start
+                          (+ xmltok-start 2))
+        (xmltok-add-dependent 'xmltok-unclosed-reparse-p
+                              nil
+                              nil
+                              "?>")
+        (setq xmltok-type 'not-well-formed))
+       (t
+        (let* ((end (point))
+               (target
+                (save-excursion
+                  (goto-char (+ xmltok-start 2))
+                  (and (looking-at (xmltok-ncname regexp))
+                       (or (memq (char-after (match-end 0))
+                                 '(?\n ?\t ?\r ? ))
+                           (= (match-end 0) (- end 2)))
+                       (match-string-no-properties 0)))))
+          (cond ((not target)
+                 (xmltok-add-error "\
+Processing instruction does not start with a name"
+                                   (+ xmltok-start 2)
+                                   (+ xmltok-start 3)))
+                ((not (and (= (length target) 3)
+                           (let ((case-fold-search t))
+                             (string-match "xml" target)))))
+                ((= xmltok-start 1)
+                 (xmltok-add-error "Invalid XML declaration"
+                                   xmltok-start
+                                   (point)))
+                ((save-excursion
+                   (goto-char xmltok-start)
+                   (looking-at (xmltok-xml-declaration regexp)))
+                 (xmltok-add-error "XML declaration not at beginning of file"
+                                   xmltok-start
+                                   (point)))
+                (t
+                 (xmltok-add-error "Processing instruction has target of xml"
+                                   (+ xmltok-start 2)
+                                   (+ xmltok-start 5))))
+          (xmltok-add-prolog-region 'processing-instruction-left
+                                    xmltok-start
+                                    (+ xmltok-start
+                                       2
+                                       (if target
+                                           (length target)
+                                         0)))
+          (xmltok-add-prolog-region 'processing-instruction-right
+                                    (if target
+                                        (save-excursion
+                                          (goto-char (+ xmltok-start
+                                                        (length target)
+                                                        2))
+                                          (skip-chars-forward " \t\r\n")
+                                          (point))
+                                      (+ xmltok-start 2))
+                                    (point)))
+        (setq xmltok-type 'processing-instruction))))
+
+(defun xmltok-parse-entities ()
+  (let ((todo xmltok-dtd))
+    (when (and (or xmltok-had-param-entity-ref
+                  xmltok-doctype-external-subset-flag)
+              (not xmltok-standalone))
+      (setq xmltok-dtd (cons t xmltok-dtd)))
+    (while todo
+      (xmltok-parse-entity (car todo))
+      (setq todo (cdr todo)))))
+  
+(defun xmltok-parse-entity (name-def)
+  (let ((def (cdr name-def))
+       ;; in case its value is buffer local 
+       (xmltok-dtd xmltok-dtd)
+       buf)
+    (when (stringp def)
+      (if (string-match "\\`[^&<\t\r\n]*\\'" def)
+         (setcdr name-def (cons def def))
+       (setcdr name-def 'not-well-formed) ; avoid infinite expansion loops
+       (setq buf (get-buffer-create
+                  (format " *Entity %s*" (car name-def))))
+       (save-excursion
+         (set-buffer buf)
+         (erase-buffer)
+         (insert def)
+         (goto-char (point-min))
+         (setcdr name-def
+                 (xmltok-parse-entity-replacement)))
+       (kill-buffer buf)))))
+
+(defun xmltok-parse-entity-replacement ()
+  (let ((def (cons "" "")))
+    (while (let* ((start (point))
+                 (found (re-search-forward "[<&\t\r\n]\\|]]>" nil t))
+                 (ch (and found (char-before)))
+                 (str (buffer-substring-no-properties
+                       start
+                       (if found
+                           (match-beginning 0)
+                         (point-max)))))
+            (setq def
+                  (xmltok-append-entity-def def
+                                            (cons str str)))
+            (cond ((not found) nil)
+                  ((eq ch ?>)
+                   (setq def 'not-well-formed)
+                   nil)
+                  ((eq ch ?<)
+                   (xmltok-save
+                     (setq xmltok-start (1- (point)))
+                     (xmltok-scan-after-lt)
+                     (setq def
+                           (xmltok-append-entity-def
+                            def
+                            (cond ((memq xmltok-type
+                                         '(start-tag
+                                           end-tag
+                                           empty-element))
+                                   'element)
+                                  ((memq xmltok-type
+                                         '(comment
+                                           processing-instruction))
+                                   (cons "" nil))
+                                  ((eq xmltok-type
+                                       'cdata-section)
+                                   (cons (buffer-substring-no-properties
+                                          (+ xmltok-start 9)
+                                          (- (point) 3))
+                                         nil))
+                                  (t 'not-well-formed)))))
+                   t)
+                  ((eq ch ?&)
+                   (let ((xmltok-start (1- (point)))
+                         xmltok-type
+                         xmltok-replacement
+                         xmltok-errors)
+                     (xmltok-scan-after-amp 'xmltok-handle-nested-entity)
+                     (cond ((eq xmltok-type 'entity-ref)
+                            (setq def
+                                  (xmltok-append-entity-def
+                                   def
+                                   xmltok-replacement)))
+                           ((eq xmltok-type 'char-ref)
+                            (setq def
+                                  (xmltok-append-entity-def
+                                   def
+                                   (if xmltok-replacement
+                                        (cons xmltok-replacement
+                                              xmltok-replacement)
+                                     (and xmltok-errors 'not-well-formed)))))
+                           (t
+                            (setq def 'not-well-formed))))
+                   t)
+                  (t
+                   (setq def
+                         (xmltok-append-entity-def
+                          def
+                          (cons (match-string-no-properties 0)
+                                " ")))
+                   t))))
+    def))
+
+(defun xmltok-handle-nested-entity (start end)
+  (let* ((name-def (assoc (buffer-substring-no-properties start end)
+                         xmltok-dtd))
+        (def (cdr name-def)))
+    (when (stringp def)
+      (xmltok-parse-entity name-def)
+      (setq def (cdr name-def)))
+    (setq xmltok-replacement
+         (cond ((null name-def)
+                (if (eq (car xmltok-dtd) t)
+                    nil
+                  'not-well-formed))
+               ((eq def 'unparsed) 'not-well-formed)
+               (t def)))))
+    
+(defun xmltok-append-entity-def (d1 d2)
+  (cond ((consp d1)
+        (if (consp d2)
+            (cons (concat (car d1) (car d2))
+                  (and (cdr d1)
+                       (cdr d2)
+                       (concat (cdr d1) (cdr d2))))
+          d2))
+       ((consp d2) d1)
+       (t
+        (let ((defs '(not-well-formed external element)))
+          (while (not (or (eq (car defs) d1)
+                          (eq (car defs) d2)))
+            (setq defs (cdr defs)))
+          (car defs)))))
+
+(defun xmltok-add-prolog-region (type start end)
+  (setq xmltok-prolog-regions
+       (cons (vector type start end)
+             xmltok-prolog-regions)))
+
+(defun xmltok-merge-attributes ()
+  "Return a list merging `xmltok-attributes' and 'xmltok-namespace-attributes'.
+The members of the merged list are in order of occurrence in the
+document.  The list may share list structure with `xmltok-attributes'
+and `xmltok-namespace-attributes'."
+  (cond ((not xmltok-namespace-attributes)
+        xmltok-attributes)
+       ((not xmltok-attributes)
+        xmltok-namespace-attributes)
+       (t
+        (let ((atts1 xmltok-attributes)
+              (atts2 xmltok-namespace-attributes)
+              merged)
+          (while (and atts1 atts2)
+            (cond ((< (xmltok-attribute-name-start (car atts1))
+                      (xmltok-attribute-name-start (car atts2)))
+                   (setq merged (cons (car atts1) merged))
+                   (setq atts1 (cdr atts1)))
+                  (t
+                   (setq merged (cons (car atts2) merged))
+                   (setq atts2 (cdr atts2)))))
+          (setq merged (nreverse merged))
+          (cond (atts1 (setq merged (nconc merged atts1)))
+                (atts2 (setq merged (nconc merged atts2))))
+          merged))))
+
+;;; Testing
+
+(defun xmltok-forward-test ()
+  (interactive)
+  (if (xmltok-forward)
+      (message "Scanned %s" xmltok-type)
+    (message "Scanned nothing")))
+
+(defun xmltok-next-prolog-token-test ()
+  (interactive)
+  (if (xmltok-next-prolog-token)
+      (message "Scanned %s"
+              (if (integerp xmltok-type)
+                  (string xmltok-type)
+                xmltok-type))
+    (message "Scanned end of file")))
+
+(provide 'xmltok)
+
+;; arch-tag: 747e5f3a-6fc3-4f8d-bd96-89f05aa99f5e
+;;; xmltok.el ends here
diff --git a/lisp/nxml/xsd-regexp.el b/lisp/nxml/xsd-regexp.el
new file mode 100644 (file)
index 0000000..a698ce7
--- /dev/null
@@ -0,0 +1,2124 @@
+;;; xsd-regexp.el --- translate W3C XML Schema regexps to Emacs regexps
+
+;; Copyright (C) 2003, 2007 Free Software Foundation, Inc.
+
+;; Author: James Clark
+;; Keywords: XML, regexp
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This handles the regular expressions in the syntax defined by:
+;; W3C XML Schema Part 2: Datatypes
+;; <http://www.w3.org/TR/xmlschema-2/#regexs>
+;;
+;; The main entry point is `xsdre-translate'.
+;;
+;; The features of XSD regexps that make this non-trivial are:
+;;
+;; - \p{PROP} escape for matching characters that have various
+;;   Unicode-defined properties
+;; - character class subtraction:, e.g. [\p{L}-[abc]] matches
+;;   any character in the L category other than a, b and c.
+;;
+;; We compute the set of Unicode characters denoted by each XSD
+;; char-class as a list of ranges.  The regexp generated for a
+;; single escape can be large (several thousand characters).
+;;
+;; XSD has non-traditional rules about when characters must be
+;; and can be quoted with \.  These are quite different from
+;; the Emacs rules.
+;;
+;; The semantics of XSD regexps are defined in terms of Unicode.
+;; Non-Unicode characters are not allowed in regular expressions and
+;; will not match against the generated regular expressions.  A
+;; Unicode character means a character in one of the Mule charsets
+;; ascii, latin-iso8859-1, mule-unicode-0100-24ff,
+;; mule-unicode-2500-33ff, mule-unicode-e000-ffff, eight-bit-control
+;; or a character translateable to such a character (i.e a character
+;; for which `encode-char' will return non-nil).
+;;
+;; Using unify-8859-on-decoding-mode is probably a good idea here
+;; (and generally with XML and other Unicode-oriented formats).
+;;
+;; Unfortunately, this means that this package is currently useless
+;; for CJK characters, since there's no mule-unicode charset for the
+;; CJK ranges of Unicode.  We should devise a workaround for this
+;; until the fabled Unicode version of Emacs makes an appearance.
+
+;;; Code:
+
+(defun xsdre-translate (regexp)
+  "Translate a W3C XML Schema Datatypes regexp to an Emacs regexp.
+Returns a string.  REGEXP is a string. If REGEXP is not a valid XSD
+regexp, signal an `xsdre-invalid-regexp' condition."
+  (xsdre-from-symbolic
+   (xsdre-to-symbolic regexp)))
+
+(defvar xsdre-test-history nil)
+
+(defun xsdre-test-regexp ()
+  (interactive)
+  (while
+      (let* ((str (read-from-minibuffer "Regexp: "
+                                       nil
+                                       nil
+                                       nil
+                                       'xsdre-test-history))
+            (symbolic
+             (xsdre-to-symbolic str)))
+       (with-output-to-temp-buffer "*XSD Regexp Test*"
+         (princ "XSD regexp: ")
+         (princ str)
+         (princ "\n")
+         (princ "Symbolic: ")
+         (princ "\n")
+         (pp symbolic)
+         (princ "\n")
+         (princ "Emacs regexp: ")
+         (princ (xsdre-from-symbolic symbolic)))
+       t)))
+
+;;; Range lists
+
+(defsubst xsdre-make-range (first last)
+  "Return a representation of a range of integers.
+If the range contains a single integer, it is represented by that integer.
+Otherwise, it is represented by a (FIRST . LAST) pair."
+  (if (= first last)
+      first
+    (cons first last)))
+
+(defsubst xsdre-range-first (r)
+  "Return the first integer in a range."
+  (if (consp r) (car r) r))
+
+(defsubst xsdre-range-last (r)
+  "Return the last integer in a range."
+  (if (consp r) (cdr r) r))
+
+(defun xsdre-make-range-list (list)
+  "Make a range-list from a list of ranges.
+A range-list represents a set of integers by a list of ranges in a
+canonical form, in which ranges are in increasing order, and adjacent
+ranges are merged wherever possible."
+  (when list
+    (setq list 
+         (sort list 'xsdre-range-less-than))
+    (let* ((next (cdr list))
+          (tail list)
+          (head (car list))
+          (first (xsdre-range-first head))
+          (last (xsdre-range-last head)))
+      (while next
+       (setq head (car next))
+       (when (> (xsdre-range-last head) last)
+         (if (<= (xsdre-range-first head) (1+ last))
+             (setq last (xsdre-range-last head))
+           (setcar tail (xsdre-make-range first last))
+           (setcdr tail next)
+           (setq tail next)
+           (setq first (xsdre-range-first head))
+           (setq last (xsdre-range-last head))))
+       (setq next (cdr next)))
+      (setcar tail (xsdre-make-range first last))
+      (setcdr tail nil)
+      list)))
+    
+
+(defun xsdre-range-list-union (range-lists)
+  "Return a range-list the union of a list of range-lists."
+  (xsdre-make-range-list (apply 'append range-lists)))
+
+(defun xsdre-range-list-difference (orig subtract)
+  "Return a range-list for the difference of two range-lists."
+  (when orig
+    (let (new head next first last)
+      (while orig
+       (setq head (car orig))
+       (setq first (xsdre-range-first head))
+       (setq last (xsdre-range-last head))
+       (while (and subtract
+                   (< (xsdre-range-last (car subtract)) first))
+         (setq subtract (cdr subtract)))
+       (while (and subtract
+                   (<= first last)
+                   (<= (xsdre-range-first (car subtract)) last))
+         (when (< first (xsdre-range-first (car subtract)))
+           (setq new
+                 (cons (xsdre-make-range 
+                        first
+                        (1- (xsdre-range-first (car subtract))))
+                       new)))
+         (if (< (xsdre-range-last (car subtract)) last)
+             (progn
+               (setq first (1+ (xsdre-range-last (car subtract))))
+               (setq subtract (cdr subtract)))
+           (setq first (1+ last))))
+       (when (<= first last)
+         (setq new (cons (xsdre-make-range first last) new)))
+       (setq orig (cdr orig)))
+      (nreverse new))))
+
+(defun xsdre-range-less-than (r1 r2)
+  "Return non-nil if range R1 is less than range R2."
+  (or (< (xsdre-range-first r1) (xsdre-range-first r2))
+      (and (= (xsdre-range-first r1) (xsdre-range-first r2))
+          (< (xsdre-range-last r1) (xsdre-range-last r2)))))
+
+(defun xsdre-check-range-list (range-list)
+  "Check that range-list is a range-list.
+Signal an error if it is not."
+  (let ((last nil))
+    (while range-list
+      (unless (consp range-list)
+       (error "Range list not a list"))
+      (let ((head (car range-list)))
+       (unless (or (integerp head)
+                   (and (consp head)
+                        (integerp (car head))
+                        (integerp (cdr head))))
+         (error "Bad range %s" head))
+       (when (and last
+                  (not (< (1+ last) (xsdre-range-first head))))
+         (error "Ranges not strictly increasing"))
+       (setq last (xsdre-range-last head)))
+      (setq range-list (cdr range-list))))
+  t)
+       
+;;; Compiling symbolic regexps to Emacs regexps
+
+(defun xsdre-from-symbolic (re)
+  "Return an Emacs regexp for the symbolic regexp RE."
+  (apply 'concat
+        (nreverse (xsdre-compile-regexp re nil))))
+
+(defun xsdre-compile-regexp (re accum)
+  "Return a Emacs regular expression for the symbolic regexp RE.
+Returns a list of strings whose head is the regexp for RE
+and whose tail is ACCUM."
+  (cond ((not (consp re))
+        (xsdre-compile-char-class re accum))
+       ((eq (car re) 'choice)
+        (setq accum (cons "\\(?:" accum))
+        (let ((choices (cdr re)))
+          (while choices
+            (setq accum
+                  (xsdre-compile-regexp (car choices)
+                                        accum))
+            (setq choices (cdr choices))
+            (when choices
+              (setq accum
+                    (cons "\\|" accum)))))
+        (cons "\\)" accum))
+       ((eq (car re) 'sequence)
+        (let ((members (cdr re)))
+          (while members
+            (setq accum (xsdre-compile-regexp (car members)
+                                              accum))
+            (setq members (cdr members))))
+        accum)
+       ((eq (car re) 'repeat)
+        (let* ((sub (nth 1 re))
+               (lower (nth 2 re))
+               (upper (nth 3 re))
+               (need-paren (and (consp sub)
+                                (eq (car sub) 'sequence))))
+          (when need-paren
+            (setq accum (cons "\\(?:" accum)))
+          (setq accum
+                (xsdre-compile-regexp sub accum))
+          (when need-paren
+            (setq accum (cons "\\)" accum)))
+          (cond ((not upper)
+                 (cond ((eq lower 0)
+                        (cons "*" accum))
+                       ((eq lower 1)
+                        (cons "+" accum))
+                       (t
+                        (cons (concat "\\{"
+                                      (number-to-string lower)
+                                      ",\\}")
+                              accum))))
+                ((eq lower upper)
+                 (cons (concat "\\{"
+                               (number-to-string lower)
+                               "\\}")
+                       accum))
+                ((and (eq lower 0) (eq upper 1))
+                 (cons "?" accum))
+                (t
+                 (cons (concat "\\{"
+                               (number-to-string lower)
+                               ","
+                               (number-to-string upper)
+                               "\\}")
+                       accum)))))
+       (t (xsdre-compile-char-class re accum))))
+
+(defun xsdre-compile-char-class (cc accum)
+  "Return a Emacs regular expression for the symbolic character class CC.
+Returns a list of strings whose head is the regexp for CC
+and whose tail is ACCUM."
+  (cons (if (integerp cc)
+           (xsdre-compile-single-char cc)
+         (let ((ranges (xsdre-range-list-mule-intersection
+                        (xsdre-char-class-to-range-list cc))))
+           (cond ((null ranges) "\001-\000")
+                 ((and (null (cdr ranges))
+                       (= (xsdre-range-first (car ranges))
+                          (xsdre-range-last (car ranges))))
+                  (xsdre-compile-single-char
+                   (xsdre-range-first (car ranges))))
+                 (t (xsdre-range-list-to-char-alternative ranges)))))
+       accum))
+             
+(defun xsdre-compile-single-char (ch)
+  (if (memq ch '(?. ?* ?+ ?? ?\[ ?\] ?^ ?$ ?\\))
+      (string ?\\ ch)
+    (string (decode-char 'ucs ch))))
+  
+(defun xsdre-char-class-to-range-list (cc)
+  "Return a range-list for a symbolic char-class."
+  (cond ((integerp cc) (list cc))
+       ((symbolp cc)
+        (or (get cc 'xsdre-ranges)
+            (xsdre-char-class-to-range-list (get cc 'xsdre-char-class))))
+       ((integerp (car cc))
+        (if (= (car cc) (cdr cc))
+            (car cc)
+          cc))
+       ((eq (car cc) 'union)
+        (xsdre-range-list-union (mapcar 'xsdre-char-class-to-range-list
+                                        (cdr cc))))
+       ((eq (car cc) 'difference)
+        (xsdre-range-list-difference
+         (xsdre-char-class-to-range-list (nth 1 cc))
+         (xsdre-char-class-to-range-list (nth 2 cc))))
+       ((eq (car cc) 'range)
+        (list (xsdre-make-range (nth 1 cc) (nth 2 cc))))
+       (t (error "Internal error in XSD regexp compilation: \
+unknown char-class %s" cc))))
+
+(defconst xsdre-mule-char-set-ranges
+  '((0 . 127)
+    (128 . 159)
+    (160 . 255)
+    (#x0100 . #x24ff)
+    (#x2500 . #x33ff)
+    (#xe000 . #xffff))
+  "List of ranges for the Mule character sets containing Unicode characters.")
+
+(defun xsdre-range-list-mule-intersection (range-list)
+  "Return the intersection of RANGE-LIST with the mule-supported ranges.
+Also split ranges so that no range spans more that one mule charset."
+  (when range-list
+    (let* ((char-set-ranges (cdr xsdre-mule-char-set-ranges))
+          (mule-ranges nil)
+          (char-set-first (caar xsdre-mule-char-set-ranges))
+          (char-set-last (cdar xsdre-mule-char-set-ranges))
+          (range (car range-list))
+          (first (xsdre-range-first range))
+          (last (xsdre-range-last range)))
+      (setq range-list (cdr range-list))
+      (while (progn
+              (cond ((> first last)
+                     (if (null range-list)
+                         nil
+                       (setq range (car range-list))
+                       (setq first (xsdre-range-first range))
+                       (setq last (xsdre-range-last range))
+                       (setq range-list (cdr range-list))
+                       t))
+                    ((< char-set-last first)
+                     (if (null char-set-ranges)
+                         nil
+                       (setq char-set-first (caar char-set-ranges))
+                       (setq char-set-last (cdar char-set-ranges))
+                       (setq char-set-ranges (cdr char-set-ranges))
+                       t))
+                    ((< first char-set-first)
+                     (setq first char-set-first))
+                    ;; Now we know that
+                    ;; first <= last
+                    ;; first <= char-set-last
+                    ;; first >= char-set-first
+                    ((<= last char-set-last)
+                     (setq mule-ranges
+                           (cons (xsdre-make-range first last)
+                                 mule-ranges))
+                     (setq first (1+ last))
+                     t)
+                    (t
+                     (setq mule-ranges
+                           (cons (xsdre-make-range first char-set-last)
+                                 mule-ranges))
+                     (setq first (1+ char-set-last))
+                     t))))
+      (nreverse mule-ranges))))
+
+(defun xsdre-range-list-to-char-alternative (range-list)
+  "Return a char alternative for a range-list.
+RANGE-LIST must contain more than integer.
+The char alternative is a string containing an Emacs regexp
+consisting of a single char alternative delimited with []."
+  (let (range caret close-bracket hyphen chars first last)
+    (while range-list
+      (setq range (car range-list))
+      (setq first (xsdre-range-first range))
+      (setq last (xsdre-range-last range))
+      (while (and (cond ((eq first ?^)
+                        (setq caret t)
+                        (setq first (1+ first)))
+                       ((eq first ?-)
+                        (setq hyphen t)
+                        (setq first (1+ first)))
+                       ((eq first ?\])
+                        (setq close-bracket t)
+                        (setq first (1+ first))))
+                 (<= first last)))
+      (when (<= first last)
+       (setq chars
+             (cons first chars))
+       (when (< first last)
+         (setq chars
+               (if (and (eq last (1+ first))
+                        (not (eq last ?-)))
+                   (cons last chars)
+                 (cons last (cons ?- chars))))))
+      (setq range-list (cdr range-list)))
+    (setq chars
+         (mapcar (lambda (c)
+                   (decode-char 'ucs c))
+                 chars))
+    (when caret
+      (setq chars (cons ?^ chars)))
+    (when hyphen
+      (setq chars (cons ?- chars)))
+    (setq chars (cons ?\] chars))
+    (setq chars (nreverse chars))
+    (when close-bracket
+      (setq chars (cons ?\] chars)))
+    (when (equal chars '(?^ ?- ?\]))
+      (setq chars '(?- ?^ ?\])))
+    (setq chars (cons ?\[ chars))
+    (apply 'string chars)))
+      
+;;; Parsing
+
+(defvar xsdre-current-regexp nil
+  "List of characters remaining to be parsed. Dynamically bound.")
+
+(defun xsdre-to-symbolic (str)
+  "Convert a W3C XML Schema datatypes regexp to a symbolic form.
+
+The symbolic form has the following structure:
+
+REGEXP ::=
+  (sequence REGEXP ...)
+  | (choice REGEXP ...)
+  | (repeat REGEXP MIN MAX)
+  | CHAR-CLASS
+
+CHAR-CLASS ::=
+  CHAR
+  | SYMBOLIC-CHAR-CLASS
+  | RANGE
+  | (union CHAR-CLASS ...)
+  | (difference CHAR-CLASS CHAR-CLASS)
+
+RANGE ::= (range LOWER UPPER)
+
+MIN ::= INTEGER
+MAX ::= INTEGER | nil
+CHAR ::= UNICODE
+LOWER ::= UNICODE
+UPPER ::= UNICODE
+SYMBOLIC-CHAR-CLASS ::= SYMBOL
+
+where UNICODE is a integer specifying a Unicode code-point and
+SYMBOLIC-CHAR-CLASS is a symbol which has either a `xsdre-char-class'
+property whose value is a CHAR-CLASS, or a `xsdre-ranges' property
+whose value is a range-list."
+  (let ((xsdre-current-regexp (string-to-list str)))
+    (condition-case err
+       (let ((symbolic (xsdre-parse-regexp)))
+         (if xsdre-current-regexp
+             (xsdre-parse-error "Unexpected %c" (car xsdre-current-regexp))
+           symbolic))
+      (xsdre-parse-error
+       (signal 'xsdre-invalid-regexp
+              (list (apply 'format (cdr err))
+                    (- (length str)
+                       (length xsdre-current-regexp))))))))
+
+(put 'xsdre-invalid-regexp
+     'error-conditions
+     '(error xsdre-invalid-regexp))
+
+(put 'xsdre-invalid-regexp
+     'error-message
+     "Invalid W3C XML Schema Datatypes regular expression")
+
+(defun xsdre-parse-regexp ()
+  (let ((branches nil))
+    (while (progn
+            (setq branches (cons (xsdre-parse-branch) branches))
+            (when (eq (car xsdre-current-regexp) ?|)
+              (xsdre-advance)
+              t)))
+    (if (null (cdr branches))
+       (car branches)
+      (cons 'choice (nreverse branches)))))
+
+(defun xsdre-parse-branch ()
+  (let (items)
+    (while (let ((item (xsdre-try-parse-atom)))
+            (when item
+              (let ((quantifier (xsdre-try-parse-quantifier)))
+                (when quantifier
+                  (setq item
+                        (list 'repeat
+                              item
+                              (car quantifier)
+                              (cdr quantifier)))))
+              (setq items (cons item items)))))
+    (cond ((null items) '(sequence))
+         ((null (cdr items)) (car items))
+         (t (cons 'sequence (nreverse items))))))
+
+(defun xsdre-try-parse-quantifier ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond ((eq ch ?*) (xsdre-advance) '(0 . nil))
+         ((eq ch ?+) (xsdre-advance) '(1 . nil))
+         ((eq ch ??) (xsdre-advance) '(0 . 1))
+         ((eq ch ?{)
+          (xsdre-advance)
+          (let ((lower (xsdre-parse-bound)))
+            (setq ch (car xsdre-current-regexp))
+            (cond ((eq ch ?})
+                   (xsdre-advance)
+                   (cons lower lower))
+                  ((eq ch ?,)
+                   (xsdre-advance)
+                   (cond ((eq (car xsdre-current-regexp) ?})
+                          (xsdre-advance)
+                          (cons lower nil))
+                         (t
+                          (let ((upper (xsdre-parse-bound)))
+                            (xsdre-expect ?})
+                            (cons lower upper)))))
+                  (t (xsdre-parse-error "Expected , or }")))))
+         (t nil))))
+                       
+(defun xsdre-parse-bound ()
+  (let ((n 0))
+    (while (progn
+            (let* ((ch (car xsdre-current-regexp))
+                   (digit (memq ch '(?9 ?8 ?7 ?6 ?5 ?4 ?3 ?2 ?1 ?0))))
+              (unless digit
+                (xsdre-parse-error "Expected a digit"))
+              (setq n (+ (* n 10)
+                         (length (cdr digit)))))
+            (xsdre-advance)
+            (not (memq (car xsdre-current-regexp) '(?} ?,)))))
+    n))
+       
+
+(defun xsdre-try-parse-atom ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond  ((memq ch '(nil ?? ?* ?+ ?\) ?\{ ?\} ?| ?\])) nil)
+          ((eq ch ?\\)
+           (xsdre-advance)
+           (xsdre-parse-escape))
+          ((eq ch ?\()
+           (xsdre-advance)
+           (let ((ret (xsdre-parse-regexp)))
+             (xsdre-expect ?\))
+             ret))
+          ((eq ch ?\[)
+           (xsdre-parse-char-class))
+          ((eq ch ?.)
+           (xsdre-advance)
+           'dot)
+          (t
+           (let ((uc (encode-char ch 'ucs)))
+             (unless uc
+               (xsdre-parse-error "%c is not a Unicode character" ch))
+             (xsdre-advance) uc)))))
+
+(defun xsdre-parse-char-class ()
+  (xsdre-advance)
+  (let (compl members ret)
+    (when (eq (car xsdre-current-regexp) ?^)
+      (setq compl t)
+      (xsdre-advance))
+    (while (let ((member (xsdre-parse-char-class-member))
+                uc1 uc2)
+            (cond ((eq (car xsdre-current-regexp) ?\-)
+                   (xsdre-advance)
+                   (cond ((eq (car xsdre-current-regexp) ?\[)
+                          (setq members (cons member members))
+                          nil)
+                         ((not (integerp member))
+                          (xsdre-parse-error "Lower bound is not a single character"))
+                         ((not (setq uc1
+                                     (encode-char member 'ucs)))
+                          (xsdre-parse-error "Lower bound %c is not a Unicode character"
+                                 member))
+                         (t
+                          (let ((upper (xsdre-parse-char-class-member)))
+                            (unless (integerp upper)
+                              (xsdre-parse-error "Upper bound is not a single character"))
+                            (unless (setq uc2
+                                          (encode-char upper 'ucs))
+                              (xsdre-parse-error "Upper bound %c is not a Unicode character" upper))
+                            (setq members
+                                  (cons (list 'range uc1 uc2)
+                                        members)))
+                          (not (eq (car xsdre-current-regexp) ?\])))))
+                  (t (setq members (cons member members))
+                     (not (eq (car xsdre-current-regexp) ?\]))))))
+    (setq members (nreverse members))
+    (if (null (cdr members))
+       (setq ret (car members))
+      (setq ret (cons 'union members)))
+    (when compl
+      (setq ret (list 'difference 'any ret)))
+    (when (eq (car xsdre-current-regexp) ?\[)
+      (setq ret
+           (list 'difference ret (xsdre-parse-char-class))))
+    (xsdre-expect ?\])
+    ret))
+
+(defun xsdre-parse-char-class-member ()
+  (let ((ch (car xsdre-current-regexp)))
+    (cond ((null ch)
+          (xsdre-parse-error "Expected ]"))
+         ((eq ch ?\\)
+          (xsdre-advance)
+          (xsdre-parse-escape))
+         ((memq ch '(?\[ ?\] ?-))
+          (xsdre-parse-error "%c must be quoted in a character class" ch))
+         (t (xsdre-advance) ch))))
+
+(defconst xsdre-single-escape
+  '((?s . space)
+    (?i . name-initial)
+    (?c . name-continue)
+    (?d . digit)
+    (?w . word)))
+
+(defun xsdre-parse-escape ()
+  (let ((ch (car xsdre-current-regexp)))
+    (xsdre-advance)
+    (cond ((memq ch '(?\\ ?| ?. ?- ?^ ?* ?+ ?( ?) ?{ ?} ?[ ?])) ch)
+         ((eq ch ?r) ?\r)
+         ((eq ch ?n) ?\n)
+         ((eq ch ?t) ?\t)
+         ((cdr (assq ch xsdre-single-escape)))
+         ((let ((positive
+                 (cdr (assq (downcase ch) xsdre-single-escape))))
+            (and positive
+                 (list 'difference 'any positive))))
+         ((eq ch ?p) (xsdre-parse-prop))
+         ((eq ch ?P) (list 'difference 'any (xsdre-parse-prop)))
+         (t (if ch
+                (xsdre-parse-error "Missing char after \\")
+              (xsdre-parse-error "Bad escape %c" ch))))))
+       
+(defun xsdre-parse-prop ()
+  (xsdre-expect ?{)
+  (let ((name nil))
+    (while (not (eq (car xsdre-current-regexp) ?\}))
+      (unless xsdre-current-regexp
+       (xsdre-parse-error "Expected ?"))
+      (setq name (cons (car xsdre-current-regexp)
+                      name))
+      (xsdre-advance))
+    (xsdre-advance)
+    (setq name (nreverse name))
+    (cond ((null name) (xsdre-parse-error "Empty property name"))
+         ((null (cdr name))
+          (let ((category (intern (string (car name)))))
+            (unless (get category 'xsdre-unicode-category)
+              (xsdre-parse-error "%s is not a category" category))
+            category))
+         ((null (cddr name))
+          (let ((category (intern (string (car name) (cadr name)))))
+            (unless (get category 'xsdre-unicode-category)
+              (xsdre-parse-error "%s is not a category" category))
+            category))
+         ((not (and (eq (car name) ?I)
+                    (eq (cadr name) ?s)))
+          (xsdre-parse-error "Block name does not start with Is"))
+         (t
+          (let ((block (intern (apply 'string (cddr name)))))
+            (unless (get block 'xsdre-unicode-block)
+              (xsdre-parse-error "%s is not a block name" block))
+            block)))))
+
+(defun xsdre-expect (ch)
+  (if (eq (car xsdre-current-regexp) ch)
+      (xsdre-advance)
+    (xsdre-parse-error "Expected %c" ch)))
+    
+(defun xsdre-advance ()
+  (setq xsdre-current-regexp
+       (cdr xsdre-current-regexp)))
+
+(defun xsdre-parse-error (&rest args)
+  (signal 'xsdre-parse-error args))
+
+;; This error condition is used only internally.
+
+(put 'xsdre-parse-error
+     'error-conditions
+     '(error xsdre-parse-error))
+
+(put 'xsdre-parse-error
+     'error-message
+     "Internal error in parsing XSD regexp")
+     
+;;; Character class data
+
+(put 'dot 'xsdre-char-class '(difference any (union #xA #xD)))
+(put 'digit 'xsdre-char-class 'Nd)
+(put 'word 'xsdre-char-class '(difference any (union P Z C)))
+(put 'space 'xsdre-char-class '(union #x9 #xA #xD #x20))
+(put 'any 'xsdre-ranges '((#x0 . #x10FFFF)))
+
+(defconst xsdre-gen-categories
+  '(Lu Ll Lt Lm Lo Mn Mc Me Nd Nl No Pc Pd
+       Ps Pe Pi Pf Po Zs Zl Zp Sm Sc Sk So Cc Cf Co))
+
+(defun xsdre-gen-categories (file)
+  "Use a UnicodeData file to generate code to initialize Unicode categories.
+Code is inserted into the current buffer."
+  (interactive "fUnicodeData file: ")
+  (save-excursion
+    (set-buffer (find-file-noselect file))
+    (goto-char (point-min))
+    (mapc (lambda (x) (put x 'xsdre-ranges nil)) xsdre-gen-categories)
+    (while (re-search-forward "^\\([0-9A-Fa-f]*\\);[^;]*;\\([A-Z][a-z]\\);"
+                             nil
+                             t)
+      (let* ((sym (intern (match-string-no-properties 2)))
+            (code (string-to-number (match-string-no-properties 1)
+                                    16))
+            (ranges (get sym 'xsdre-ranges))
+            (last-range (car ranges))
+            (forced-range (string= (buffer-substring-no-properties
+                                    (- (match-beginning 2) 6)
+                                    (1- (match-beginning 2)))
+                                   "Last>")))
+       (cond ((and (integerp last-range)
+                   (or forced-range
+                       (eq code (1+ last-range))))
+              (put sym
+                   'xsdre-ranges
+                   (cons (cons last-range code)
+                         (cdr ranges))))
+             ((and (consp last-range)
+                   (or forced-range
+                       (eq code (1+ (cdr last-range)))))
+              (put sym
+                   'xsdre-ranges
+                   (cons (cons (car last-range) code)
+                         (cdr ranges))))
+             (t
+              (put sym 'xsdre-ranges (cons code ranges))))))
+    (mapc (lambda (x)
+            (put x
+                 'xsdre-ranges
+                 (nreverse (get x 'xsdre-ranges)))
+            nil)
+          xsdre-gen-categories))
+  (mapc (lambda (x)
+          (let ((start (point)))
+            (pp (list 'xsdre-def-primitive-category
+                      (list 'quote x)
+                      (list 'quote (get x 'xsdre-ranges)))
+                (current-buffer))
+            (save-excursion
+              (goto-char start)
+              (down-list 2)
+              (while (condition-case err
+                         (progn 
+                           (forward-sexp)
+                           t)
+                       (error nil))
+                (when (and (< 70 (current-column))
+                           (not (looking-at ")")))
+                  (insert "\n")
+                  (lisp-indent-line))))))
+        xsdre-gen-categories))
+
+(defun xsdre-def-primitive-category (sym ranges)
+  (put sym 'xsdre-ranges ranges)
+  (put sym 'xsdre-unicode-category t))
+
+;;; Blocks
+
+(defun xsdre-def-block (sym ranges)
+  (put sym 'xsdre-ranges ranges)
+  (put sym 'xsdre-unicode-block t))
+
+(xsdre-def-block 'BasicLatin '((#x0000 . #x007F)))
+(xsdre-def-block 'Latin-1Supplement '((#x0080 . #x00FF)))
+(xsdre-def-block 'LatinExtended-A '((#x0100 . #x017F)))
+(xsdre-def-block 'LatinExtended-B '((#x0180 . #x024F)))
+(xsdre-def-block 'IPAExtensions '((#x0250 . #x02AF)))
+(xsdre-def-block 'SpacingModifierLetters '((#x02B0 . #x02FF)))
+(xsdre-def-block 'CombiningDiacriticalMarks '((#x0300 . #x036F)))
+(xsdre-def-block 'Greek '((#x0370 . #x03FF)))
+(xsdre-def-block 'Cyrillic '((#x0400 . #x04FF)))
+(xsdre-def-block 'Armenian '((#x0530 . #x058F)))
+(xsdre-def-block 'Hebrew '((#x0590 . #x05FF)))
+(xsdre-def-block 'Arabic '((#x0600 . #x06FF)))
+(xsdre-def-block 'Syriac '((#x0700 . #x074F)))
+(xsdre-def-block 'Thaana '((#x0780 . #x07BF)))
+(xsdre-def-block 'Devanagari '((#x0900 . #x097F)))
+(xsdre-def-block 'Bengali '((#x0980 . #x09FF)))
+(xsdre-def-block 'Gurmukhi '((#x0A00 . #x0A7F)))
+(xsdre-def-block 'Gujarati '((#x0A80 . #x0AFF)))
+(xsdre-def-block 'Oriya '((#x0B00 . #x0B7F)))
+(xsdre-def-block 'Tamil '((#x0B80 . #x0BFF)))
+(xsdre-def-block 'Telugu '((#x0C00 . #x0C7F)))
+(xsdre-def-block 'Kannada '((#x0C80 . #x0CFF)))
+(xsdre-def-block 'Malayalam '((#x0D00 . #x0D7F)))
+(xsdre-def-block 'Sinhala '((#x0D80 . #x0DFF)))
+(xsdre-def-block 'Thai '((#x0E00 . #x0E7F)))
+(xsdre-def-block 'Lao '((#x0E80 . #x0EFF)))
+(xsdre-def-block 'Tibetan '((#x0F00 . #x0FFF)))
+(xsdre-def-block 'Myanmar '((#x1000 . #x109F)))
+(xsdre-def-block 'Georgian '((#x10A0 . #x10FF)))
+(xsdre-def-block 'HangulJamo '((#x1100 . #x11FF)))
+(xsdre-def-block 'Ethiopic '((#x1200 . #x137F)))
+(xsdre-def-block 'Cherokee '((#x13A0 . #x13FF)))
+(xsdre-def-block 'UnifiedCanadianAboriginalSyllabics '((#x1400 . #x167F)))
+(xsdre-def-block 'Ogham '((#x1680 . #x169F)))
+(xsdre-def-block 'Runic '((#x16A0 . #x16FF)))
+(xsdre-def-block 'Khmer '((#x1780 . #x17FF)))
+(xsdre-def-block 'Mongolian '((#x1800 . #x18AF)))
+(xsdre-def-block 'LatinExtendedAdditional '((#x1E00 . #x1EFF)))
+(xsdre-def-block 'GreekExtended '((#x1F00 . #x1FFF)))
+(xsdre-def-block 'GeneralPunctuation '((#x2000 . #x206F)))
+(xsdre-def-block 'SuperscriptsandSubscripts '((#x2070 . #x209F)))
+(xsdre-def-block 'CurrencySymbols '((#x20A0 . #x20CF)))
+(xsdre-def-block 'CombiningMarksforSymbols '((#x20D0 . #x20FF)))
+(xsdre-def-block 'LetterlikeSymbols '((#x2100 . #x214F)))
+(xsdre-def-block 'NumberForms '((#x2150 . #x218F)))
+(xsdre-def-block 'Arrows '((#x2190 . #x21FF)))
+(xsdre-def-block 'MathematicalOperators '((#x2200 . #x22FF)))
+(xsdre-def-block 'MiscellaneousTechnical '((#x2300 . #x23FF)))
+(xsdre-def-block 'ControlPictures '((#x2400 . #x243F)))
+(xsdre-def-block 'OpticalCharacterRecognition '((#x2440 . #x245F)))
+(xsdre-def-block 'EnclosedAlphanumerics '((#x2460 . #x24FF)))
+(xsdre-def-block 'BoxDrawing '((#x2500 . #x257F)))
+(xsdre-def-block 'BlockElements '((#x2580 . #x259F)))
+(xsdre-def-block 'GeometricShapes '((#x25A0 . #x25FF)))
+(xsdre-def-block 'MiscellaneousSymbols '((#x2600 . #x26FF)))
+(xsdre-def-block 'Dingbats '((#x2700 . #x27BF)))
+(xsdre-def-block 'BraillePatterns '((#x2800 . #x28FF)))
+(xsdre-def-block 'CJKRadicalsSupplement '((#x2E80 . #x2EFF)))
+(xsdre-def-block 'KangxiRadicals '((#x2F00 . #x2FDF)))
+(xsdre-def-block 'IdeographicDescriptionCharacters '((#x2FF0 . #x2FFF)))
+(xsdre-def-block 'CJKSymbolsandPunctuation '((#x3000 . #x303F)))
+(xsdre-def-block 'Hiragana '((#x3040 . #x309F)))
+(xsdre-def-block 'Katakana '((#x30A0 . #x30FF)))
+(xsdre-def-block 'Bopomofo '((#x3100 . #x312F)))
+(xsdre-def-block 'HangulCompatibilityJamo '((#x3130 . #x318F)))
+(xsdre-def-block 'Kanbun '((#x3190 . #x319F)))
+(xsdre-def-block 'BopomofoExtended '((#x31A0 . #x31BF)))
+(xsdre-def-block 'EnclosedCJKLettersandMonths '((#x3200 . #x32FF)))
+(xsdre-def-block 'CJKCompatibility '((#x3300 . #x33FF)))
+(xsdre-def-block 'CJKUnifiedIdeographsExtensionA '((#x3400 . #x4DB5)))
+(xsdre-def-block 'CJKUnifiedIdeographs '((#x4E00 . #x9FFF)))
+(xsdre-def-block 'YiSyllables '((#xA000 . #xA48F)))
+(xsdre-def-block 'YiRadicals '((#xA490 . #xA4CF)))
+(xsdre-def-block 'HangulSyllables '((#xAC00 . #xD7A3)))
+;;(xsdre-def-block 'HighSurrogates '((#xD800 . #xDB7F)))
+;;(xsdre-def-block 'HighPrivateUseSurrogates '((#xDB80 . #xDBFF)))
+;;(xsdre-def-block 'LowSurrogates '((#xDC00 . #xDFFF)))
+(xsdre-def-block 'CJKCompatibilityIdeographs '((#xF900 . #xFAFF)))
+(xsdre-def-block 'AlphabeticPresentationForms '((#xFB00 . #xFB4F)))
+(xsdre-def-block 'ArabicPresentationForms-A '((#xFB50 . #xFDFF)))
+(xsdre-def-block 'CombiningHalfMarks '((#xFE20 . #xFE2F)))
+(xsdre-def-block 'CJKCompatibilityForms '((#xFE30 . #xFE4F)))
+(xsdre-def-block 'SmallFormVariants '((#xFE50 . #xFE6F)))
+(xsdre-def-block 'ArabicPresentationForms-B '((#xFE70 . #xFEFE)))
+(xsdre-def-block 'Specials '((#xFEFF . #xFEFF)))
+(xsdre-def-block 'HalfwidthandFullwidthForms '((#xFF00 . #xFFEF)))
+(xsdre-def-block 'Specials '((#xFFF0 . #xFFFD)))
+(xsdre-def-block 'OldItalic '((#x10300 . #x1032F)))
+(xsdre-def-block 'Gothic '((#x10330 . #x1034F)))
+(xsdre-def-block 'Deseret '((#x10400 . #x1044F)))
+(xsdre-def-block 'ByzantineMusicalSymbols '((#x1D000 . #x1D0FF)))
+(xsdre-def-block 'MusicalSymbols '((#x1D100 . #x1D1FF)))
+(xsdre-def-block 'MathematicalAlphanumericSymbols '((#x1D400 . #x1D7FF)))
+(xsdre-def-block 'CJKUnifiedIdeographsExtensionB '((#x20000 . #x2A6D6)))
+(xsdre-def-block 'CJKCompatibilityIdeographsSupplement '((#x2F800 . #x2FA1F)))
+(xsdre-def-block 'Tags '((#xE0000 . #xE007F)))
+(xsdre-def-block 'PrivateUse '((#xE000 . #xF8FF)
+                              (#xF0000 . #xFFFFD)
+                              (#x100000 . #x10FFFD)))
+
+;;; Categories
+
+;;; Derived categories
+
+(defun xsdre-def-derived-category (sym char-class)
+  (put sym 'xsdre-char-class char-class)
+  (put sym 'xsdre-unicode-category t))
+
+(xsdre-def-derived-category 'L '(union Lu Ll Lt Lm Lo))
+(xsdre-def-derived-category 'M '(union Mn Mc Me))
+(xsdre-def-derived-category 'N '(union Nd Nl No))
+(xsdre-def-derived-category 'P '(union Pc Pd Ps Pe Pi Pf Po))
+(xsdre-def-derived-category 'Z '(union Zs Zl Zp))
+(xsdre-def-derived-category 'S '(union Sm Sc Sk So))
+(xsdre-def-derived-category 'C '(union Cc Cf Co Cn))
+(xsdre-def-derived-category 'Cn '(difference any
+                                            (union L M N P Z S Cc Cf Co)))
+
+(xsdre-def-primitive-category
+ 'name-initial
+ '(#x003a
+   (#x0041 . #x005a)
+   #x005f
+   (#x0061 . #x007a)
+   (#x00c0 . #x00d6)
+   (#x00d8 . #x00f6)
+   (#x00f8 . #x0131)
+   (#x0134 . #x013e)
+   (#x0141 . #x0148)
+   (#x014a . #x017e)
+   (#x0180 . #x01c3)
+   (#x01cd . #x01f0)
+   (#x01f4 . #x01f5)
+   (#x01fa . #x0217)
+   (#x0250 . #x02a8)
+   (#x02bb . #x02c1)
+   #x0386
+   (#x0388 . #x038a)
+   #x038c
+   (#x038e . #x03a1)
+   (#x03a3 . #x03ce)
+   (#x03d0 . #x03d6)
+   #x03da
+   #x03dc
+   #x03de
+   #x03e0
+   (#x03e2 . #x03f3)
+   (#x0401 . #x040c)
+   (#x040e . #x044f)
+   (#x0451 . #x045c)
+   (#x045e . #x0481)
+   (#x0490 . #x04c4)
+   (#x04c7 . #x04c8)
+   (#x04cb . #x04cc)
+   (#x04d0 . #x04eb)
+   (#x04ee . #x04f5)
+   (#x04f8 . #x04f9)
+   (#x0531 . #x0556)
+   #x0559
+   (#x0561 . #x0586)
+   (#x05d0 . #x05ea)
+   (#x05f0 . #x05f2)
+   (#x0621 . #x063a)
+   (#x0641 . #x064a)
+   (#x0671 . #x06b7)
+   (#x06ba . #x06be)
+   (#x06c0 . #x06ce)
+   (#x06d0 . #x06d3)
+   #x06d5
+   (#x06e5 . #x06e6)
+   (#x0905 . #x0939)
+   #x093d
+   (#x0958 . #x0961)
+   (#x0985 . #x098c)
+   (#x098f . #x0990)
+   (#x0993 . #x09a8)
+   (#x09aa . #x09b0)
+   #x09b2
+   (#x09b6 . #x09b9)
+   (#x09dc . #x09dd)
+   (#x09df . #x09e1)
+   (#x09f0 . #x09f1)
+   (#x0a05 . #x0a0a)
+   (#x0a0f . #x0a10)
+   (#x0a13 . #x0a28)
+   (#x0a2a . #x0a30)
+   (#x0a32 . #x0a33)
+   (#x0a35 . #x0a36)
+   (#x0a38 . #x0a39)
+   (#x0a59 . #x0a5c)
+   #x0a5e
+   (#x0a72 . #x0a74)
+   (#x0a85 . #x0a8b)
+   #x0a8d
+   (#x0a8f . #x0a91)
+   (#x0a93 . #x0aa8)
+   (#x0aaa . #x0ab0)
+   (#x0ab2 . #x0ab3)
+   (#x0ab5 . #x0ab9)
+   #x0abd
+   #x0ae0
+   (#x0b05 . #x0b0c)
+   (#x0b0f . #x0b10)
+   (#x0b13 . #x0b28)
+   (#x0b2a . #x0b30)
+   (#x0b32 . #x0b33)
+   (#x0b36 . #x0b39)
+   #x0b3d
+   (#x0b5c . #x0b5d)
+   (#x0b5f . #x0b61)
+   (#x0b85 . #x0b8a)
+   (#x0b8e . #x0b90)
+   (#x0b92 . #x0b95)
+   (#x0b99 . #x0b9a)
+   #x0b9c
+   (#x0b9e . #x0b9f)
+   (#x0ba3 . #x0ba4)
+   (#x0ba8 . #x0baa)
+   (#x0bae . #x0bb5)
+   (#x0bb7 . #x0bb9)
+   (#x0c05 . #x0c0c)
+   (#x0c0e . #x0c10)
+   (#x0c12 . #x0c28)
+   (#x0c2a . #x0c33)
+   (#x0c35 . #x0c39)
+   (#x0c60 . #x0c61)
+   (#x0c85 . #x0c8c)
+   (#x0c8e . #x0c90)
+   (#x0c92 . #x0ca8)
+   (#x0caa . #x0cb3)
+   (#x0cb5 . #x0cb9)
+   #x0cde
+   (#x0ce0 . #x0ce1)
+   (#x0d05 . #x0d0c)
+   (#x0d0e . #x0d10)
+   (#x0d12 . #x0d28)
+   (#x0d2a . #x0d39)
+   (#x0d60 . #x0d61)
+   (#x0e01 . #x0e2e)
+   #x0e30
+   (#x0e32 . #x0e33)
+   (#x0e40 . #x0e45)
+   (#x0e81 . #x0e82)
+   #x0e84
+   (#x0e87 . #x0e88)
+   #x0e8a
+   #x0e8d
+   (#x0e94 . #x0e97)
+   (#x0e99 . #x0e9f)
+   (#x0ea1 . #x0ea3)
+   #x0ea5
+   #x0ea7
+   (#x0eaa . #x0eab)
+   (#x0ead . #x0eae)
+   #x0eb0
+   (#x0eb2 . #x0eb3)
+   #x0ebd
+   (#x0ec0 . #x0ec4)
+   (#x0f40 . #x0f47)
+   (#x0f49 . #x0f69)
+   (#x10a0 . #x10c5)
+   (#x10d0 . #x10f6)
+   #x1100
+   (#x1102 . #x1103)
+   (#x1105 . #x1107)
+   #x1109
+   (#x110b . #x110c)
+   (#x110e . #x1112)
+   #x113c
+   #x113e
+   #x1140
+   #x114c
+   #x114e
+   #x1150
+   (#x1154 . #x1155)
+   #x1159
+   (#x115f . #x1161)
+   #x1163
+   #x1165
+   #x1167
+   #x1169
+   (#x116d . #x116e)
+   (#x1172 . #x1173)
+   #x1175
+   #x119e
+   #x11a8
+   #x11ab
+   (#x11ae . #x11af)
+   (#x11b7 . #x11b8)
+   #x11ba
+   (#x11bc . #x11c2)
+   #x11eb
+   #x11f0
+   #x11f9
+   (#x1e00 . #x1e9b)
+   (#x1ea0 . #x1ef9)
+   (#x1f00 . #x1f15)
+   (#x1f18 . #x1f1d)
+   (#x1f20 . #x1f45)
+   (#x1f48 . #x1f4d)
+   (#x1f50 . #x1f57)
+   #x1f59
+   #x1f5b
+   #x1f5d
+   (#x1f5f . #x1f7d)
+   (#x1f80 . #x1fb4)
+   (#x1fb6 . #x1fbc)
+   #x1fbe
+   (#x1fc2 . #x1fc4)
+   (#x1fc6 . #x1fcc)
+   (#x1fd0 . #x1fd3)
+   (#x1fd6 . #x1fdb)
+   (#x1fe0 . #x1fec)
+   (#x1ff2 . #x1ff4)
+   (#x1ff6 . #x1ffc)
+   #x2126
+   (#x212a . #x212b)
+   #x212e
+   (#x2180 . #x2182)
+   #x3007
+   (#x3021 . #x3029)
+   (#x3041 . #x3094)
+   (#x30a1 . #x30fa)
+   (#x3105 . #x312c)
+   (#x4e00 . #x9fa5)
+   (#xac00 . #xd7a3)))
+
+(xsdre-def-derived-category 'name-continue '(union name-initial
+                                                  name-continue-not-initial))
+                         
+(xsdre-def-primitive-category 
+ 'name-continue-not-initial
+ '((#x002d . #x002e)
+   (#x0030 . #x0039)
+   #x00b7
+   (#x02d0 . #x02d1)
+   (#x0300 . #x0345)
+   (#x0360 . #x0361)
+   #x0387
+   (#x0483 . #x0486)
+   (#x0591 . #x05a1)
+   (#x05a3 . #x05b9)
+   (#x05bb . #x05bd)
+   #x05bf
+   (#x05c1 . #x05c2)
+   #x05c4
+   #x0640
+   (#x064b . #x0652)
+   (#x0660 . #x0669)
+   #x0670
+   (#x06d6 . #x06dc)
+   (#x06dd . #x06df)
+   (#x06e0 . #x06e4)
+   (#x06e7 . #x06e8)
+   (#x06ea . #x06ed)
+   (#x06f0 . #x06f9)
+   (#x0901 . #x0903)
+   #x093c
+   (#x093e . #x094c)
+   #x094d
+   (#x0951 . #x0954)
+   (#x0962 . #x0963)
+   (#x0966 . #x096f)
+   (#x0981 . #x0983)
+   #x09bc
+   (#x09be . #x09bf)
+   (#x09c0 . #x09c4)
+   (#x09c7 . #x09c8)
+   (#x09cb . #x09cd)
+   #x09d7
+   (#x09e2 . #x09e3)
+   (#x09e6 . #x09ef)
+   #x0a02
+   #x0a3c
+   (#x0a3e . #x0a42)
+   (#x0a47 . #x0a48)
+   (#x0a4b . #x0a4d)
+   (#x0a66 . #x0a6f)
+   (#x0a70 . #x0a71)
+   (#x0a81 . #x0a83)
+   #x0abc
+   (#x0abe . #x0ac5)
+   (#x0ac7 . #x0ac9)
+   (#x0acb . #x0acd)
+   (#x0ae6 . #x0aef)
+   (#x0b01 . #x0b03)
+   #x0b3c
+   (#x0b3e . #x0b43)
+   (#x0b47 . #x0b48)
+   (#x0b4b . #x0b4d)
+   (#x0b56 . #x0b57)
+   (#x0b66 . #x0b6f)
+   (#x0b82 . #x0b83)
+   (#x0bbe . #x0bc2)
+   (#x0bc6 . #x0bc8)
+   (#x0bca . #x0bcd)
+   #x0bd7
+   (#x0be7 . #x0bef)
+   (#x0c01 . #x0c03)
+   (#x0c3e . #x0c44)
+   (#x0c46 . #x0c48)
+   (#x0c4a . #x0c4d)
+   (#x0c55 . #x0c56)
+   (#x0c66 . #x0c6f)
+   (#x0c82 . #x0c83)
+   (#x0cbe . #x0cc4)
+   (#x0cc6 . #x0cc8)
+   (#x0cca . #x0ccd)
+   (#x0cd5 . #x0cd6)
+   (#x0ce6 . #x0cef)
+   (#x0d02 . #x0d03)
+   (#x0d3e . #x0d43)
+   (#x0d46 . #x0d48)
+   (#x0d4a . #x0d4d)
+   #x0d57
+   (#x0d66 . #x0d6f)
+   #x0e31
+   (#x0e34 . #x0e3a)
+   (#x0e46 . #x0e4e)
+   (#x0e50 . #x0e59)
+   #x0eb1
+   (#x0eb4 . #x0eb9)
+   (#x0ebb . #x0ebc)
+   #x0ec6
+   (#x0ec8 . #x0ecd)
+   (#x0ed0 . #x0ed9)
+   (#x0f18 . #x0f19)
+   (#x0f20 . #x0f29)
+   #x0f35
+   #x0f37
+   #x0f39
+   (#x0f3e . #x0f3f)
+   (#x0f71 . #x0f84)
+   (#x0f86 . #x0f8b)
+   (#x0f90 . #x0f95)
+   #x0f97
+   (#x0f99 . #x0fad)
+   (#x0fb1 . #x0fb7)
+   #x0fb9
+   (#x20d0 . #x20dc)
+   #x20e1
+   #x3005
+   (#x302a . #x302f)
+   (#x3031 . #x3035)
+   #x3099
+   #x309a
+   (#x309d . #x309e)
+   (#x30fc . #x30fe)))
+
+;;; Auto-generated section.
+
+;; The rest of the file was auto-generated by doing M-x xsdre-gen-categories
+;; on UnicodeData-3.1.0.txt available from
+;; http://www.unicode.org/Public/3.1-Update/UnicodeData-3.1.0.txt
+
+(xsdre-def-primitive-category 'Lu
+                             '((65 . 90)
+                               (192 . 214)
+                               (216 . 222)
+                               256 258 260 262 264 266 268 270 272 274 276
+                               278 280 282 284 286 288 290 292 294 296 298
+                               300 302 304 306 308 310 313 315 317 319 321
+                               323 325 327 330 332 334 336 338 340 342 344
+                               346 348 350 352 354 356 358 360 362 364 366
+                               368 370 372 374
+                               (376 . 377)
+                               379 381
+                               (385 . 386)
+                               388
+                               (390 . 391)
+                               (393 . 395)
+                               (398 . 401)
+                               (403 . 404)
+                               (406 . 408)
+                               (412 . 413)
+                               (415 . 416)
+                               418 420
+                               (422 . 423)
+                               425 428
+                               (430 . 431)
+                               (433 . 435)
+                               437
+                               (439 . 440)
+                               444 452 455 458 461 463 465 467 469 471 473
+                               475 478 480 482 484 486 488 490 492 494 497
+                               500
+                               (502 . 504)
+                               506 508 510 512 514 516 518 520 522 524 526
+                               528 530 532 534 536 538 540 542 546 548 550
+                               552 554 556 558 560 562 902
+                               (904 . 906)
+                               908
+                               (910 . 911)
+                               (913 . 929)
+                               (931 . 939)
+                               (978 . 980)
+                               986 988 990 992 994 996 998 1000 1002 1004
+                               1006 1012
+                               (1024 . 1071)
+                               1120 1122 1124 1126 1128 1130 1132 1134 1136
+                               1138 1140 1142 1144 1146 1148 1150 1152 1164
+                               1166 1168 1170 1172 1174 1176 1178 1180 1182
+                               1184 1186 1188 1190 1192 1194 1196 1198 1200
+                               1202 1204 1206 1208 1210 1212 1214
+                               (1216 . 1217)
+                               1219 1223 1227 1232 1234 1236 1238 1240 1242
+                               1244 1246 1248 1250 1252 1254 1256 1258 1260
+                               1262 1264 1266 1268 1272
+                               (1329 . 1366)
+                               (4256 . 4293)
+                               7680 7682 7684 7686 7688 7690 7692 7694 7696
+                               7698 7700 7702 7704 7706 7708 7710 7712 7714
+                               7716 7718 7720 7722 7724 7726 7728 7730 7732
+                               7734 7736 7738 7740 7742 7744 7746 7748 7750
+                               7752 7754 7756 7758 7760 7762 7764 7766 7768
+                               7770 7772 7774 7776 7778 7780 7782 7784 7786
+                               7788 7790 7792 7794 7796 7798 7800 7802 7804
+                               7806 7808 7810 7812 7814 7816 7818 7820 7822
+                               7824 7826 7828 7840 7842 7844 7846 7848 7850
+                               7852 7854 7856 7858 7860 7862 7864 7866 7868
+                               7870 7872 7874 7876 7878 7880 7882 7884 7886
+                               7888 7890 7892 7894 7896 7898 7900 7902 7904
+                               7906 7908 7910 7912 7914 7916 7918 7920 7922
+                               7924 7926 7928
+                               (7944 . 7951)
+                               (7960 . 7965)
+                               (7976 . 7983)
+                               (7992 . 7999)
+                               (8008 . 8013)
+                               8025 8027 8029 8031
+                               (8040 . 8047)
+                               (8120 . 8123)
+                               (8136 . 8139)
+                               (8152 . 8155)
+                               (8168 . 8172)
+                               (8184 . 8187)
+                               8450 8455
+                               (8459 . 8461)
+                               (8464 . 8466)
+                               8469
+                               (8473 . 8477)
+                               8484 8486 8488
+                               (8490 . 8493)
+                               (8496 . 8497)
+                               8499
+                               (65313 . 65338)
+                               (66560 . 66597)
+                               (119808 . 119833)
+                               (119860 . 119885)
+                               (119912 . 119937)
+                               119964
+                               (119966 . 119967)
+                               119970
+                               (119973 . 119974)
+                               (119977 . 119980)
+                               (119982 . 119989)
+                               (120016 . 120041)
+                               (120068 . 120069)
+                               (120071 . 120074)
+                               (120077 . 120084)
+                               (120086 . 120092)
+                               (120120 . 120121)
+                               (120123 . 120126)
+                               (120128 . 120132)
+                               120134
+                               (120138 . 120144)
+                               (120172 . 120197)
+                               (120224 . 120249)
+                               (120276 . 120301)
+                               (120328 . 120353)
+                               (120380 . 120405)
+                               (120432 . 120457)
+                               (120488 . 120512)
+                               (120546 . 120570)
+                               (120604 . 120628)
+                               (120662 . 120686)
+                               (120720 . 120744)))
+(xsdre-def-primitive-category 'Ll
+                             '((97 . 122)
+                               170 181 186
+                               (223 . 246)
+                               (248 . 255)
+                               257 259 261 263 265 267 269 271 273 275 277
+                               279 281 283 285 287 289 291 293 295 297 299
+                               301 303 305 307 309
+                               (311 . 312)
+                               314 316 318 320 322 324 326
+                               (328 . 329)
+                               331 333 335 337 339 341 343 345 347 349 351
+                               353 355 357 359 361 363 365 367 369 371 373
+                               375 378 380
+                               (382 . 384)
+                               387 389 392
+                               (396 . 397)
+                               402 405
+                               (409 . 411)
+                               414 417 419 421 424
+                               (426 . 427)
+                               429 432 436 438
+                               (441 . 442)
+                               (445 . 447)
+                               454 457 460 462 464 466 468 470 472 474
+                               (476 . 477)
+                               479 481 483 485 487 489 491 493
+                               (495 . 496)
+                               499 501 505 507 509 511 513 515 517 519 521
+                               523 525 527 529 531 533 535 537 539 541 543
+                               547 549 551 553 555 557 559 561 563
+                               (592 . 685)
+                               912
+                               (940 . 974)
+                               (976 . 977)
+                               (981 . 983)
+                               987 989 991 993 995 997 999 1001 1003 1005
+                             
+                               (1007 . 1011)
+                               1013
+                               (1072 . 1119)
+                               1121 1123 1125 1127 1129 1131 1133 1135 1137
+                               1139 1141 1143 1145 1147 1149 1151 1153 1165
+                               1167 1169 1171 1173 1175 1177 1179 1181 1183
+                               1185 1187 1189 1191 1193 1195 1197 1199 1201
+                               1203 1205 1207 1209 1211 1213 1215 1218 1220
+                               1224 1228 1233 1235 1237 1239 1241 1243 1245
+                               1247 1249 1251 1253 1255 1257 1259 1261 1263
+                               1265 1267 1269 1273
+                               (1377 . 1415)
+                               7681 7683 7685 7687 7689 7691 7693 7695 7697
+                               7699 7701 7703 7705 7707 7709 7711 7713 7715
+                               7717 7719 7721 7723 7725 7727 7729 7731 7733
+                               7735 7737 7739 7741 7743 7745 7747 7749 7751
+                               7753 7755 7757 7759 7761 7763 7765 7767 7769
+                               7771 7773 7775 7777 7779 7781 7783 7785 7787
+                               7789 7791 7793 7795 7797 7799 7801 7803 7805
+                               7807 7809 7811 7813 7815 7817 7819 7821 7823
+                               7825 7827
+                               (7829 . 7835)
+                               7841 7843 7845 7847 7849 7851 7853 7855 7857
+                               7859 7861 7863 7865 7867 7869 7871 7873 7875
+                               7877 7879 7881 7883 7885 7887 7889 7891 7893
+                               7895 7897 7899 7901 7903 7905 7907 7909 7911
+                               7913 7915 7917 7919 7921 7923 7925 7927 7929
+                             
+                               (7936 . 7943)
+                               (7952 . 7957)
+                               (7968 . 7975)
+                               (7984 . 7991)
+                               (8000 . 8005)
+                               (8016 . 8023)
+                               (8032 . 8039)
+                               (8048 . 8061)
+                               (8064 . 8071)
+                               (8080 . 8087)
+                               (8096 . 8103)
+                               (8112 . 8116)
+                               (8118 . 8119)
+                               8126
+                               (8130 . 8132)
+                               (8134 . 8135)
+                               (8144 . 8147)
+                               (8150 . 8151)
+                               (8160 . 8167)
+                               (8178 . 8180)
+                               (8182 . 8183)
+                               8319 8458
+                               (8462 . 8463)
+                               8467 8495 8500 8505
+                               (64256 . 64262)
+                               (64275 . 64279)
+                               (65345 . 65370)
+                               (66600 . 66637)
+                               (119834 . 119859)
+                               (119886 . 119892)
+                               (119894 . 119911)
+                               (119938 . 119963)
+                               (119990 . 119993)
+                               119995
+                               (119997 . 120000)
+                               (120002 . 120003)
+                               (120005 . 120015)
+                               (120042 . 120067)
+                               (120094 . 120119)
+                               (120146 . 120171)
+                               (120198 . 120223)
+                               (120250 . 120275)
+                               (120302 . 120327)
+                               (120354 . 120379)
+                               (120406 . 120431)
+                               (120458 . 120483)
+                               (120514 . 120538)
+                               (120540 . 120545)
+                               (120572 . 120596)
+                               (120598 . 120603)
+                               (120630 . 120654)
+                               (120656 . 120661)
+                               (120688 . 120712)
+                               (120714 . 120719)
+                               (120746 . 120770)
+                               (120772 . 120777)))
+(xsdre-def-primitive-category 'Lt
+                             '(453 456 459 498
+                                   (8072 . 8079)
+                                   (8088 . 8095)
+                                   (8104 . 8111)
+                                   8124 8140 8188))
+(xsdre-def-primitive-category 'Lm
+                             '((688 . 696)
+                               (699 . 705)
+                               (720 . 721)
+                               (736 . 740)
+                               750 890 1369 1600
+                               (1765 . 1766)
+                               3654 3782 6211 12293
+                               (12337 . 12341)
+                               (12445 . 12446)
+                               (12540 . 12542)
+                               65392
+                               (65438 . 65439)))
+(xsdre-def-primitive-category 'Lo
+                             '(443
+                               (448 . 451)
+                               (1488 . 1514)
+                               (1520 . 1522)
+                               (1569 . 1594)
+                               (1601 . 1610)
+                               (1649 . 1747)
+                               1749
+                               (1786 . 1788)
+                               1808
+                               (1810 . 1836)
+                               (1920 . 1957)
+                               (2309 . 2361)
+                               2365 2384
+                               (2392 . 2401)
+                               (2437 . 2444)
+                               (2447 . 2448)
+                               (2451 . 2472)
+                               (2474 . 2480)
+                               2482
+                               (2486 . 2489)
+                               (2524 . 2525)
+                               (2527 . 2529)
+                               (2544 . 2545)
+                               (2565 . 2570)
+                               (2575 . 2576)
+                               (2579 . 2600)
+                               (2602 . 2608)
+                               (2610 . 2611)
+                               (2613 . 2614)
+                               (2616 . 2617)
+                               (2649 . 2652)
+                               2654
+                               (2674 . 2676)
+                               (2693 . 2699)
+                               2701
+                               (2703 . 2705)
+                               (2707 . 2728)
+                               (2730 . 2736)
+                               (2738 . 2739)
+                               (2741 . 2745)
+                               2749 2768 2784
+                               (2821 . 2828)
+                               (2831 . 2832)
+                               (2835 . 2856)
+                               (2858 . 2864)
+                               (2866 . 2867)
+                               (2870 . 2873)
+                               2877
+                               (2908 . 2909)
+                               (2911 . 2913)
+                               (2949 . 2954)
+                               (2958 . 2960)
+                               (2962 . 2965)
+                               (2969 . 2970)
+                               2972
+                               (2974 . 2975)
+                               (2979 . 2980)
+                               (2984 . 2986)
+                               (2990 . 2997)
+                               (2999 . 3001)
+                               (3077 . 3084)
+                               (3086 . 3088)
+                               (3090 . 3112)
+                               (3114 . 3123)
+                               (3125 . 3129)
+                               (3168 . 3169)
+                               (3205 . 3212)
+                               (3214 . 3216)
+                               (3218 . 3240)
+                               (3242 . 3251)
+                               (3253 . 3257)
+                               3294
+                               (3296 . 3297)
+                               (3333 . 3340)
+                               (3342 . 3344)
+                               (3346 . 3368)
+                               (3370 . 3385)
+                               (3424 . 3425)
+                               (3461 . 3478)
+                               (3482 . 3505)
+                               (3507 . 3515)
+                               3517
+                               (3520 . 3526)
+                               (3585 . 3632)
+                               (3634 . 3635)
+                               (3648 . 3653)
+                               (3713 . 3714)
+                               3716
+                               (3719 . 3720)
+                               3722 3725
+                               (3732 . 3735)
+                               (3737 . 3743)
+                               (3745 . 3747)
+                               3749 3751
+                               (3754 . 3755)
+                               (3757 . 3760)
+                               (3762 . 3763)
+                               3773
+                               (3776 . 3780)
+                               (3804 . 3805)
+                               3840
+                               (3904 . 3911)
+                               (3913 . 3946)
+                               (3976 . 3979)
+                               (4096 . 4129)
+                               (4131 . 4135)
+                               (4137 . 4138)
+                               (4176 . 4181)
+                               (4304 . 4342)
+                               (4352 . 4441)
+                               (4447 . 4514)
+                               (4520 . 4601)
+                               (4608 . 4614)
+                               (4616 . 4678)
+                               4680
+                               (4682 . 4685)
+                               (4688 . 4694)
+                               4696
+                               (4698 . 4701)
+                               (4704 . 4742)
+                               4744
+                               (4746 . 4749)
+                               (4752 . 4782)
+                               4784
+                               (4786 . 4789)
+                               (4792 . 4798)
+                               4800
+                               (4802 . 4805)
+                               (4808 . 4814)
+                               (4816 . 4822)
+                               (4824 . 4846)
+                               (4848 . 4878)
+                               4880
+                               (4882 . 4885)
+                               (4888 . 4894)
+                               (4896 . 4934)
+                               (4936 . 4954)
+                               (5024 . 5108)
+                               (5121 . 5740)
+                               (5743 . 5750)
+                               (5761 . 5786)
+                               (5792 . 5866)
+                               (6016 . 6067)
+                               (6176 . 6210)
+                               (6212 . 6263)
+                               (6272 . 6312)
+                               (8501 . 8504)
+                               12294
+                               (12353 . 12436)
+                               (12449 . 12538)
+                               (12549 . 12588)
+                               (12593 . 12686)
+                               (12704 . 12727)
+                               (13312 . 19893)
+                               (19968 . 40869)
+                               (40960 . 42124)
+                               (44032 . 55203)
+                               (63744 . 64045)
+                               64285
+                               (64287 . 64296)
+                               (64298 . 64310)
+                               (64312 . 64316)
+                               64318
+                               (64320 . 64321)
+                               (64323 . 64324)
+                               (64326 . 64433)
+                               (64467 . 64829)
+                               (64848 . 64911)
+                               (64914 . 64967)
+                               (65008 . 65019)
+                               (65136 . 65138)
+                               65140
+                               (65142 . 65276)
+                               (65382 . 65391)
+                               (65393 . 65437)
+                               (65440 . 65470)
+                               (65474 . 65479)
+                               (65482 . 65487)
+                               (65490 . 65495)
+                               (65498 . 65500)
+                               (66304 . 66334)
+                               (66352 . 66377)
+                               (131072 . 173782)
+                               (194560 . 195101)))
+(xsdre-def-primitive-category 'Mn
+                             '((768 . 846)
+                               (864 . 866)
+                               (1155 . 1158)
+                               (1425 . 1441)
+                               (1443 . 1465)
+                               (1467 . 1469)
+                               1471
+                               (1473 . 1474)
+                               1476
+                               (1611 . 1621)
+                               1648
+                               (1750 . 1756)
+                               (1759 . 1764)
+                               (1767 . 1768)
+                               (1770 . 1773)
+                               1809
+                               (1840 . 1866)
+                               (1958 . 1968)
+                               (2305 . 2306)
+                               2364
+                               (2369 . 2376)
+                               2381
+                               (2385 . 2388)
+                               (2402 . 2403)
+                               2433 2492
+                               (2497 . 2500)
+                               2509
+                               (2530 . 2531)
+                               2562 2620
+                               (2625 . 2626)
+                               (2631 . 2632)
+                               (2635 . 2637)
+                               (2672 . 2673)
+                               (2689 . 2690)
+                               2748
+                               (2753 . 2757)
+                               (2759 . 2760)
+                               2765 2817 2876 2879
+                               (2881 . 2883)
+                               2893 2902 2946 3008 3021
+                               (3134 . 3136)
+                               (3142 . 3144)
+                               (3146 . 3149)
+                               (3157 . 3158)
+                               3263 3270
+                               (3276 . 3277)
+                               (3393 . 3395)
+                               3405 3530
+                               (3538 . 3540)
+                               3542 3633
+                               (3636 . 3642)
+                               (3655 . 3662)
+                               3761
+                               (3764 . 3769)
+                               (3771 . 3772)
+                               (3784 . 3789)
+                               (3864 . 3865)
+                               3893 3895 3897
+                               (3953 . 3966)
+                               (3968 . 3972)
+                               (3974 . 3975)
+                               (3984 . 3991)
+                               (3993 . 4028)
+                               4038
+                               (4141 . 4144)
+                               4146
+                               (4150 . 4151)
+                               4153
+                               (4184 . 4185)
+                               (6071 . 6077)
+                               6086
+                               (6089 . 6099)
+                               6313
+                               (8400 . 8412)
+                               8417
+                               (12330 . 12335)
+                               (12441 . 12442)
+                               64286
+                               (65056 . 65059)
+                               (119143 . 119145)
+                               (119163 . 119170)
+                               (119173 . 119179)
+                               (119210 . 119213)))
+(xsdre-def-primitive-category 'Mc
+                             '(2307
+                               (2366 . 2368)
+                               (2377 . 2380)
+                               (2434 . 2435)
+                               (2494 . 2496)
+                               (2503 . 2504)
+                               (2507 . 2508)
+                               2519
+                               (2622 . 2624)
+                               2691
+                               (2750 . 2752)
+                               2761
+                               (2763 . 2764)
+                               (2818 . 2819)
+                               2878 2880
+                               (2887 . 2888)
+                               (2891 . 2892)
+                               2903 2947
+                               (3006 . 3007)
+                               (3009 . 3010)
+                               (3014 . 3016)
+                               (3018 . 3020)
+                               3031
+                               (3073 . 3075)
+                               (3137 . 3140)
+                               (3202 . 3203)
+                               3262
+                               (3264 . 3268)
+                               (3271 . 3272)
+                               (3274 . 3275)
+                               (3285 . 3286)
+                               (3330 . 3331)
+                               (3390 . 3392)
+                               (3398 . 3400)
+                               (3402 . 3404)
+                               3415
+                               (3458 . 3459)
+                               (3535 . 3537)
+                               (3544 . 3551)
+                               (3570 . 3571)
+                               (3902 . 3903)
+                               3967 4140 4145 4152
+                               (4182 . 4183)
+                               (6068 . 6070)
+                               (6078 . 6085)
+                               (6087 . 6088)
+                               (119141 . 119142)
+                               (119149 . 119154)))
+(xsdre-def-primitive-category 'Me
+                             '((1160 . 1161)
+                               (1757 . 1758)
+                               (8413 . 8416)
+                               (8418 . 8419)))
+(xsdre-def-primitive-category 'Nd
+                             '((48 . 57)
+                               (1632 . 1641)
+                               (1776 . 1785)
+                               (2406 . 2415)
+                               (2534 . 2543)
+                               (2662 . 2671)
+                               (2790 . 2799)
+                               (2918 . 2927)
+                               (3047 . 3055)
+                               (3174 . 3183)
+                               (3302 . 3311)
+                               (3430 . 3439)
+                               (3664 . 3673)
+                               (3792 . 3801)
+                               (3872 . 3881)
+                               (4160 . 4169)
+                               (4969 . 4977)
+                               (6112 . 6121)
+                               (6160 . 6169)
+                               (65296 . 65305)
+                               (120782 . 120831)))
+(xsdre-def-primitive-category 'Nl
+                             '((5870 . 5872)
+                               (8544 . 8579)
+                               12295
+                               (12321 . 12329)
+                               (12344 . 12346)
+                               66378))
+(xsdre-def-primitive-category 'No
+                             '((178 . 179)
+                               185
+                               (188 . 190)
+                               (2548 . 2553)
+                               (3056 . 3058)
+                               (3882 . 3891)
+                               (4978 . 4988)
+                               8304
+                               (8308 . 8313)
+                               (8320 . 8329)
+                               (8531 . 8543)
+                               (9312 . 9371)
+                               9450
+                               (10102 . 10131)
+                               (12690 . 12693)
+                               (12832 . 12841)
+                               (12928 . 12937)
+                               (66336 . 66339)))
+(xsdre-def-primitive-category 'Pc
+                             '(95
+                               (8255 . 8256)
+                               12539
+                               (65075 . 65076)
+                               (65101 . 65103)
+                               65343 65381))
+(xsdre-def-primitive-category 'Pd
+                             '(45 173 1418 6150
+                                  (8208 . 8213)
+                                  12316 12336
+                                  (65073 . 65074)
+                                  65112 65123 65293))
+(xsdre-def-primitive-category 'Ps
+                             '(40 91 123 3898 3900 5787 8218 8222 8261 8317
+                                  8333 9001 12296 12298 12300 12302 12304
+                                  12308 12310 12312 12314 12317 64830 65077
+                                  65079 65081 65083 65085 65087 65089 65091
+                                  65113 65115 65117 65288 65339 65371 65378))
+(xsdre-def-primitive-category 'Pe
+                             '(41 93 125 3899 3901 5788 8262 8318 8334 9002
+                                  12297 12299 12301 12303 12305 12309 12311
+                                  12313 12315
+                                  (12318 . 12319)
+                                  64831 65078 65080 65082 65084 65086 65088
+                                  65090 65092 65114 65116 65118 65289 65341
+                                  65373 65379))
+(xsdre-def-primitive-category 'Pi
+                             '(171 8216
+                                   (8219 . 8220)
+                                   8223 8249))
+(xsdre-def-primitive-category 'Pf
+                             '(187 8217 8221 8250))
+(xsdre-def-primitive-category 'Po
+                             '((33 . 35)
+                               (37 . 39)
+                               42 44
+                               (46 . 47)
+                               (58 . 59)
+                               (63 . 64)
+                               92 161 183 191 894 903
+                               (1370 . 1375)
+                               1417 1470 1472 1475
+                               (1523 . 1524)
+                               1548 1563 1567
+                               (1642 . 1645)
+                               1748
+                               (1792 . 1805)
+                               (2404 . 2405)
+                               2416 3572 3663
+                               (3674 . 3675)
+                               (3844 . 3858)
+                               3973
+                               (4170 . 4175)
+                               4347
+                               (4961 . 4968)
+                               (5741 . 5742)
+                               (5867 . 5869)
+                               (6100 . 6106)
+                               6108
+                               (6144 . 6149)
+                               (6151 . 6154)
+                               (8214 . 8215)
+                               (8224 . 8231)
+                               (8240 . 8248)
+                               (8251 . 8254)
+                               (8257 . 8259)
+                               (8264 . 8269)
+                               (12289 . 12291)
+                               65072
+                               (65097 . 65100)
+                               (65104 . 65106)
+                               (65108 . 65111)
+                               (65119 . 65121)
+                               65128
+                               (65130 . 65131)
+                               (65281 . 65283)
+                               (65285 . 65287)
+                               65290 65292
+                               (65294 . 65295)
+                               (65306 . 65307)
+                               (65311 . 65312)
+                               65340 65377 65380))
+(xsdre-def-primitive-category 'Zs
+                             '(32 160 5760
+                                  (8192 . 8203)
+                                  8239 12288))
+(xsdre-def-primitive-category 'Zl
+                             '(8232))
+(xsdre-def-primitive-category 'Zp
+                             '(8233))
+(xsdre-def-primitive-category 'Sm
+                             '(43
+                               (60 . 62)
+                               124 126 172 177 215 247 8260
+                               (8314 . 8316)
+                               (8330 . 8332)
+                               (8592 . 8596)
+                               (8602 . 8603)
+                               8608 8611 8614 8622
+                               (8654 . 8655)
+                               8658 8660
+                               (8704 . 8945)
+                               (8968 . 8971)
+                               (8992 . 8993)
+                               9655 9665 9839 64297 65122
+                               (65124 . 65126)
+                               65291
+                               (65308 . 65310)
+                               65372 65374 65506
+                               (65513 . 65516)
+                               120513 120539 120571 120597 120629 120655
+                               120687 120713 120745 120771))
+(xsdre-def-primitive-category 'Sc
+                             '(36
+                               (162 . 165)
+                               (2546 . 2547)
+                               3647 6107
+                               (8352 . 8367)
+                               65129 65284
+                               (65504 . 65505)
+                               (65509 . 65510)))
+(xsdre-def-primitive-category 'Sk
+                             '(94 96 168 175 180 184
+                                  (697 . 698)
+                                  (706 . 719)
+                                  (722 . 735)
+                                  (741 . 749)
+                                  (884 . 885)
+                                  (900 . 901)
+                                  8125
+                                  (8127 . 8129)
+                                  (8141 . 8143)
+                                  (8157 . 8159)
+                                  (8173 . 8175)
+                                  (8189 . 8190)
+                                  (12443 . 12444)
+                                  65342 65344 65507))
+(xsdre-def-primitive-category 'So
+                             '((166 . 167)
+                               169 174 176 182 1154 1769
+                               (1789 . 1790)
+                               2554 2928
+                               (3841 . 3843)
+                               (3859 . 3863)
+                               (3866 . 3871)
+                               3892 3894 3896
+                               (4030 . 4037)
+                               (4039 . 4044)
+                               4047
+                               (8448 . 8449)
+                               (8451 . 8454)
+                               (8456 . 8457)
+                               8468
+                               (8470 . 8472)
+                               (8478 . 8483)
+                               8485 8487 8489 8494 8498 8506
+                               (8597 . 8601)
+                               (8604 . 8607)
+                               (8609 . 8610)
+                               (8612 . 8613)
+                               (8615 . 8621)
+                               (8623 . 8653)
+                               (8656 . 8657)
+                               8659
+                               (8661 . 8691)
+                               (8960 . 8967)
+                               (8972 . 8991)
+                               (8994 . 9000)
+                               (9003 . 9083)
+                               (9085 . 9114)
+                               (9216 . 9254)
+                               (9280 . 9290)
+                               (9372 . 9449)
+                               (9472 . 9621)
+                               (9632 . 9654)
+                               (9656 . 9664)
+                               (9666 . 9719)
+                               (9728 . 9747)
+                               (9753 . 9838)
+                               (9840 . 9841)
+                               (9985 . 9988)
+                               (9990 . 9993)
+                               (9996 . 10023)
+                               (10025 . 10059)
+                               10061
+                               (10063 . 10066)
+                               10070
+                               (10072 . 10078)
+                               (10081 . 10087)
+                               10132
+                               (10136 . 10159)
+                               (10161 . 10174)
+                               (10240 . 10495)
+                               (11904 . 11929)
+                               (11931 . 12019)
+                               (12032 . 12245)
+                               (12272 . 12283)
+                               12292
+                               (12306 . 12307)
+                               12320
+                               (12342 . 12343)
+                               (12350 . 12351)
+                               (12688 . 12689)
+                               (12694 . 12703)
+                               (12800 . 12828)
+                               (12842 . 12867)
+                               (12896 . 12923)
+                               12927
+                               (12938 . 12976)
+                               (12992 . 13003)
+                               (13008 . 13054)
+                               (13056 . 13174)
+                               (13179 . 13277)
+                               (13280 . 13310)
+                               (42128 . 42145)
+                               (42148 . 42163)
+                               (42165 . 42176)
+                               (42178 . 42180)
+                               42182 65508 65512
+                               (65517 . 65518)
+                               (65532 . 65533)
+                               (118784 . 119029)
+                               (119040 . 119078)
+                               (119082 . 119140)
+                               (119146 . 119148)
+                               (119171 . 119172)
+                               (119180 . 119209)
+                               (119214 . 119261)))
+(xsdre-def-primitive-category 'Cc
+                             '((0 . 31)
+                               (127 . 159)))
+(xsdre-def-primitive-category 'Cf
+                             '(1807
+                               (6155 . 6158)
+                               (8204 . 8207)
+                               (8234 . 8238)
+                               (8298 . 8303)
+                               65279
+                               (65529 . 65531)
+                               (119155 . 119162)
+                               917505
+                               (917536 . 917631)))
+(xsdre-def-primitive-category 'Co
+                             '((57344 . 63743)
+                               (983040 . 1048573)
+                               (1048576 . 1114109)))
+
+(provide 'xsd-regexp)
+
+;; arch-tag: bf990d61-a26c-4fd3-b578-56a5640729da
+;;; xsd-regexp.el ends here
index e2fb338242fd50161010dab2cbfed9b2b6a11006..f34427c3140f335de46cb06abbdc34f0617c0a44 100644 (file)
 
 (require 'font-lock)
 
+(declare-function msdos-long-file-names "msdos.c")
+
 ;; Make sure fast-lock.el is supported.
 (if (and (eq system-type 'ms-dos) (not (msdos-long-file-names)))
     (error "`fast-lock' was written for long file name systems"))
index 2465ea4eabd39afb49253ce6da591d395ab8735b..7e2663ed903776d4e0f4ff31c35e2c556c23adb9 100644 (file)
 
 (defun ml-message (&rest args) (message "%s" (apply 'concat args)))
 
-(defun kill-to-end-of-line ()
-  (ml-prefix-argument-loop
-    (if (eolp)
-       (kill-region (point) (1+ (point)))
-      (kill-region (point) (if (search-forward ?\n nil t)
-                              (1- (point)) (point-max))))))
-
 (defun set-auto-fill-hook (arg)
   (setq auto-fill-function (intern arg)))
 
       (setq count (1+ count)))))
 
 (defun ml-next-page ()
-  (previous-page (- (ml-prefix-argument))))
+  (ml-previous-page (- (ml-prefix-argument))))
 
 (defun page-next-window (&optional arg)
   (let ((count (or arg (ml-prefix-argument))))
index bca9ea4824a15c0c5aa4b51dbd887f452a8b10fd..df1d386c77ffdc7ccce0ef7338917ecf23d25729 100644 (file)
@@ -272,19 +272,6 @@ Type \\[describe-mode] once reading news to get a list of rnews commands."
       (news-push (cons news-current-news-group news-current-certifiable)
                 news-current-certifications))))
 
-(defun news-set-minor-modes ()
-  "Creates a minor mode list that has group name, total articles,
-and attribute for current article."
-  (setq news-minor-modes (list (cons 'foo
-                                    (concat news-current-message-number
-                                            "/"
-                                            news-total-current-group
-                                            (news-get-attribute-string)))))
-  ;; Detect Emacs versions 18.16 and up, which display
-  ;; directly from news-minor-modes by using a list for mode-name.
-  (or (boundp 'minor-mode-alist)
-      (setq minor-modes news-minor-modes)))
-
 (defun news-set-message-counters ()
   "Scan through current news-groups filelist to figure out how many messages
 are there. Set counters for use with minor mode display."
similarity index 86%
rename from lisp/gnus/password.el
rename to lisp/password-cache.el
index 32ab76052d90f2e095bd61fc1c0da8b698a2c1a9..eeaa31b9a3105cdd3e69e6ee3f98f9a0b29ab51d 100644 (file)
@@ -1,6 +1,7 @@
-;;; password.el --- Read passwords from user, possibly using a password cache.
+;;; password-cache.el --- Read passwords, possibly using a password cache.
 
-;; Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007
+;;   Free Software Foundation, Inc.
 
 ;; Author: Simon Josefsson <simon@josefsson.org>
 ;; Created: 2003-12-21
 ;; (password-cache-add "test" "foo")
 ;;  => nil
 
-;; Note the previous two can be replaced with:
-;; (password-read-and-add "Password? " "test")
-;; ;; Minibuffer prompt for password.
-;; => "foo"
-;; ;; "foo" is now cached with key "test"
-
-
 ;; (password-read "Password? " "test")
 ;; ;; No minibuffer prompt
 ;;  => "foo"
@@ -59,9 +53,6 @@
 
 ;;; Code:
 
-(eval-when-compile
-  (require 'cl))
-
 (defcustom password-cache t
   "Whether to cache passwords."
   :group 'password
@@ -96,14 +87,20 @@ The variable `password-cache' control whether the cache is used."
 (defun password-read-and-add (prompt &optional key)
   "Read password, for use with KEY, from user, or from cache if wanted.
 Then store the password in the cache.  Uses `password-read' and
-`password-cache-add'.
-Custom variables `password-cache' and `password-cache-expiry'
-regulate cache behavior."
+`password-cache-add'.  Custom variables `password-cache' and
+`password-cache-expiry' regulate cache behavior.
+
+Warning: the password is cached without checking that it is
+correct.  It is better to check the password before caching.  If
+you must use this function, take care to check passwords and
+remove incorrect ones from the cache."
   (let ((password (password-read prompt key)))
     (when (and password key)
       (password-cache-add key password))
     password))
 
+(make-obsolete 'password-read-and-add 'password-read "23.1")
+
 (defun password-cache-remove (key)
   "Remove password indexed by KEY from password cache.
 This is typically run be a timer setup from `password-cache-add',
@@ -120,8 +117,7 @@ user again."
 
 (defun password-cache-add (key password)
   "Add password to cache.
-The password is removed by a timer after `password-cache-expiry'
-seconds."
+The password is removed by a timer after `password-cache-expiry' seconds."
   (when (and password-cache-expiry (null (intern-soft key password-data)))
     (run-at-time password-cache-expiry nil
                 #'password-cache-remove
@@ -134,7 +130,7 @@ seconds."
   (interactive)
   (fillarray password-data 0))
 
-(provide 'password)
+(provide 'password-cache)
 
 ;;; arch-tag: ab160494-16c8-4c68-a4a1-73eebf6686e5
-;;; password.el ends here
+;;; password-cache.el ends here
index 79b269870b14bd2ec9db4acc655d551711c15d3f..8116ad91fd255248a4eb7076b1f5e7c66a188779 100644 (file)
@@ -281,6 +281,10 @@ to all arguments, such as variable names after a $."
   :type 'hook
   :group 'pcomplete)
 
+(defsubst pcomplete-executables (&optional regexp)
+  "Complete amongst a list of directories and executables."
+  (pcomplete-entries regexp 'file-executable-p))
+
 (defcustom pcomplete-command-completion-function
   (function
    (lambda ()
@@ -599,6 +603,8 @@ this is `comint-dynamic-complete-functions'."
   "Setup shell-mode to use pcomplete."
   (pcomplete-comint-setup 'shell-dynamic-complete-functions))
 
+(declare-function comint-bol "comint" (&optional arg))
+
 (defun pcomplete-parse-comint-arguments ()
   "Parse whitespace separated arguments in the current region."
   (let ((begin (save-excursion (comint-bol nil) (point)))
@@ -780,10 +786,6 @@ component, `default-directory' is used as the basis for completion."
   "Complete amongst a list of directories."
   (pcomplete-entries regexp 'file-directory-p))
 
-(defsubst pcomplete-executables (&optional regexp)
-  "Complete amongst a list of directories and executables."
-  (pcomplete-entries regexp 'file-executable-p))
-
 ;; generation of completion lists
 
 (defun pcomplete-find-completion-function (command)
@@ -944,17 +946,16 @@ generate the completions list.  This means that the hook
 ;; Abstractions so that the code below will work for both Emacs 20 and
 ;; XEmacs 21
 
-(unless (fboundp 'event-matches-key-specifier-p)
-  (defalias 'event-matches-key-specifier-p 'eq))
+(defalias 'pcomplete-event-matches-key-specifier-p
+  (if (featurep 'xemacs)
+      'event-matches-key-specifier-p
+  'eq))
 
 (defun pcomplete-read-event (&optional prompt)
   (if (fboundp 'read-event)
       (read-event prompt)
     (aref (read-key-sequence prompt) 0)))
 
-(unless (fboundp 'event-basic-type)
-  (defalias 'event-basic-type 'event-key))
-
 (defun pcomplete-show-completions (completions)
   "List in help buffer sorted COMPLETIONS.
 Typing SPC flushes the help buffer."
@@ -973,13 +974,13 @@ Typing SPC flushes the help buffer."
            (while (with-current-buffer (get-buffer "*Completions*")
                     (setq event (pcomplete-read-event)))
              (cond
-              ((event-matches-key-specifier-p event ?\s)
+              ((pcomplete-event-matches-key-specifier-p event ?\s)
                (set-window-configuration pcomplete-last-window-config)
                (setq pcomplete-last-window-config nil)
                (throw 'done nil))
-              ((or (event-matches-key-specifier-p event 'tab)
+              ((or (pcomplete-event-matches-key-specifier-p event 'tab)
                     ;; Needed on a terminal
-                    (event-matches-key-specifier-p event 9))
+                    (pcomplete-event-matches-key-specifier-p event 9))
                 (let ((win (or (get-buffer-window "*Completions*" 0)
                                (display-buffer "*Completions*"
                                                'not-this-window))))
index 3ca1829030f390f0a0cdd22a1dd9c39dd89b8a53..61ee7b4bea216f4308c4623bfffca1d27bb2bd38 100644 (file)
@@ -235,7 +235,7 @@ The remaining KEYS are passed directly to `cvs-create-fileinfo'."
              ;; servers, this should not be necessary, because they return
              ;; a complete merge output.
              (with-temp-buffer
-               (insert-file-contents path)
+               (ignore-errors (insert-file-contents path))
                (goto-char (point-min))
                (if (re-search-forward "^<<<<<<< " nil t)
                    'CONFLICT 'NEED-MERGE))))
@@ -272,8 +272,9 @@ The remaining KEYS are passed directly to `cvs-create-fileinfo'."
        ;; branches, or because it's been removed).
        (if (ignore-errors
              (with-temp-buffer
-               (insert-file-contents (expand-file-name
-                                      ".cvsignore" (file-name-directory dir)))
+                (ignore-errors
+                  (insert-file-contents
+                   (expand-file-name ".cvsignore" (file-name-directory dir))))
                (goto-char (point-min))
                (re-search-forward
                 (concat "^" (regexp-quote (file-name-nondirectory dir)) "/$")
@@ -301,7 +302,7 @@ The remaining KEYS are passed directly to `cvs-create-fileinfo'."
 
        ;; [add] this will also show up as a `U <file>'
        (and
-       (cvs-match "\\(.*\\), version \\(.*\\), resurrected$"
+       (cvs-match "`?\\(.*?\\)'?, version \\(.*\\), resurrected$"
                   (path 1) (base-rev 2))
        ;; FIXME: resurrection only brings back the original version,
        ;; not the latest on the branch, so `up-to-date' is not always
index a0bac0b287133307626c737c07297d53621c2fb5..f9c71c34192f210e243f9ca9535438b5db9f00cd 100644 (file)
@@ -1457,7 +1457,9 @@ The POSTPROC specified there (typically `log-edit') is then called,
   (let ((buf (cvs-temp-buffer "message" 'normal 'nosetup))
        (setupfun (or (nth 2 (cdr (assoc "message" cvs-buffer-name-alist)))
                      'log-edit)))
-    (funcall setupfun 'cvs-do-commit setup 'cvs-commit-filelist buf)
+    (funcall setupfun 'cvs-do-commit setup 
+            '((log-edit-listfun . cvs-commit-filelist)
+              (log-edit-diff-function . cvs-mode-diff)) buf)
     (set (make-local-variable 'cvs-minor-wrap-function) 'cvs-commit-minor-wrap)
     (run-hooks 'cvs-mode-commit-hook)))
 
@@ -1520,7 +1522,10 @@ This is best called from a `log-view-mode' buffer."
       ;; Set the filename before, so log-edit can correctly setup its
       ;; log-edit-initial-files variable.
       (set (make-local-variable 'cvs-edit-log-files) (list file)))
-    (funcall setupfun 'cvs-do-edit-log nil 'cvs-edit-log-filelist buf)
+    (funcall setupfun 'cvs-do-edit-log nil 
+            '((log-edit-listfun . cvs-edit-log-filelist)
+              (log-edit-diff-function . cvs-mode-diff))
+            buf)
     (when text (erase-buffer) (insert text))
     (set (make-local-variable 'cvs-edit-log-revision) rev)
     (set (make-local-variable 'cvs-minor-wrap-function)
@@ -1960,6 +1965,8 @@ This command ignores files that are not flagged as `Unknown'."
     (setf (cvs-fileinfo->type fi) 'DEAD))
   (cvs-cleanup-collection cvs-cookies nil nil nil))
 
+(declare-function vc-editable-p "vc" (file))
+(declare-function vc-checkout "vc" (file &optional writable rev))
 
 (defun cvs-append-to-ignore (dir str &optional old-dir)
   "Add STR to the .cvsignore file in DIR.
@@ -2291,7 +2298,7 @@ this file, or a list of arguments to send to the program."
           (buffer (find-buffer-visiting file)))
       ;; For a revert to happen the user must be editing the file...
       (unless (or (null buffer)
-                 (eq (cvs-fileinfo->type fileinfo) 'MESSAGE)
+                 (memq (cvs-fileinfo->type fileinfo) '(MESSAGE UNKNOWN))
                  ;; FIXME: check whether revert is really needed.
                  ;; `(verify-visited-file-modtime buffer)' doesn't cut it
                  ;; because it only looks at the time stamp (it ignores
index 11d0c652d34de56b19e87eba595618eb82e75f01..336c492efde51cf13fa686bdcb2e0293162a7b22 100644 (file)
              (repeat))))
        (repeat)))))
 
+  (defvar pgg-parse-crc24)
+
   (defun pgg-parse-crc24-string (string)
     (let ((h (vector nil 183 1230 nil nil nil nil nil nil)))
       (ccl-execute-on-string pgg-parse-crc24 h string)
                       pgg-parse-public-key-algorithm-alist)))
     result))
 
+;; p-d-p only calls this if it is defined, but the compiler does not
+;; recognize that.
+(declare-function pgg-parse-crc24-string "pgg-parse" (string))
+
 (defun pgg-decode-packets ()
   (if (re-search-forward "^=\\([A-Za-z0-9+/]\\{4\\}\\)$" nil t)
       (let ((p (match-beginning 0))
index 13a5148d5cd5cf4e6222b3fd992f83639f0266c6..6e4a2a874ec74ef07bcd813ed782f8f0fb44643c 100644 (file)
 ;;; @ utility functions
 ;;;
 
+(eval-when-compile
+  (unless (featurep 'xemacs)
+    (defalias 'pgg-run-at-time 'run-at-time)
+    (defalias 'pgg-cancel-timer 'cancel-timer))
+
+  (when (featurep 'xemacs)
+    (defmacro pgg-run-at-time-1 (time repeat function args)
+      (if (condition-case nil
+             (let ((delete-itimer 'delete-itimer)
+                   (itimer-driver-start 'itimer-driver-start)
+                   (itimer-value 'itimer-value)
+                   (start-itimer 'start-itimer))
+               (unless (or (symbol-value 'itimer-process)
+                           (symbol-value 'itimer-timer))
+                 (funcall itimer-driver-start))
+               ;; Check whether there is a bug to which the difference of
+               ;; the present time and the time when the itimer driver was
+               ;; woken up is subtracted from the initial itimer value.
+               (let* ((inhibit-quit t)
+                      (ctime (current-time))
+                      (itimer-timer-last-wakeup
+                       (prog1
+                           ctime
+                         (setcar ctime (1- (car ctime)))))
+                      (itimer-list nil)
+                      (itimer (funcall start-itimer "pgg-run-at-time"
+                                       'ignore 5)))
+                 (sleep-for 0.1) ;; Accept the timeout interrupt.
+                 (prog1
+                     (> (funcall itimer-value itimer) 0)
+                   (funcall delete-itimer itimer))))
+           (error nil))
+         `(let ((time ,time))
+            (apply #'start-itimer "pgg-run-at-time"
+                   ,function (if time (max time 1e-9) 1e-9)
+                   ,repeat nil t ,args)))
+      `(let ((time ,time)
+            (itimers (list nil)))
+        (setcar
+         itimers
+         (apply #'start-itimer "pgg-run-at-time"
+                (lambda (itimers repeat function &rest args)
+                  (let ((itimer (car itimers)))
+                    (if repeat
+                        (progn
+                          (set-itimer-function
+                           itimer
+                           (lambda (itimer repeat function &rest args)
+                             (set-itimer-restart itimer repeat)
+                             (set-itimer-function itimer function)
+                             (set-itimer-function-arguments itimer args)
+                             (apply function args)))
+                          (set-itimer-function-arguments
+                           itimer
+                           (append (list itimer repeat function) args)))
+                      (set-itimer-function
+                       itimer
+                       (lambda (itimer function &rest args)
+                         (delete-itimer itimer)
+                         (apply function args)))
+                      (set-itimer-function-arguments
+                       itimer
+                       (append (list itimer function) args)))))
+                1e-9 (if time (max time 1e-9) 1e-9)
+                nil t itimers ,repeat ,function ,args))))
+
+    (defun pgg-run-at-time (time repeat function &rest args)
+      "Emulating function run as `run-at-time'.
+TIME should be nil meaning now, or a number of seconds from now.
+Return an itimer object which can be used in either `delete-itimer'
+or `cancel-timer'."
+      (pgg-run-at-time-1 time repeat function args))
+    (defun pgg-cancel-timer (timer)
+      "Emulate cancel-timer for xemacs."
+      (let ((delete-itimer 'delete-itimer))
+        (funcall delete-itimer timer)))
+    ))
+
 (defun pgg-invoke (func scheme &rest args)
   (progn
     (require (intern (format "pgg-%s" scheme)))
@@ -153,6 +231,8 @@ regulate cache behavior."
   (defun pgg-clear-string (string)
     (fillarray string ?_)))
 
+(declare-function pgg-clear-string "pgg" (string))
+
 (defun pgg-remove-passphrase-from-cache (key &optional notruncate)
   "Omit passphrase associated with KEY in time-limited passphrase cache.
 
@@ -177,85 +257,6 @@ regulate cache behavior."
       (pgg-cancel-timer old-timer)
       (unintern interned-timer-key pgg-pending-timers))))
 
-(eval-when-compile
-  (defmacro pgg-run-at-time-1 (time repeat function args)
-    (when (featurep 'xemacs)
-      (if (condition-case nil
-             (let ((delete-itimer 'delete-itimer)
-                   (itimer-driver-start 'itimer-driver-start)
-                   (itimer-value 'itimer-value)
-                   (start-itimer 'start-itimer))
-               (unless (or (symbol-value 'itimer-process)
-                           (symbol-value 'itimer-timer))
-                 (funcall itimer-driver-start))
-               ;; Check whether there is a bug to which the difference of
-               ;; the present time and the time when the itimer driver was
-               ;; woken up is subtracted from the initial itimer value.
-               (let* ((inhibit-quit t)
-                      (ctime (current-time))
-                      (itimer-timer-last-wakeup
-                       (prog1
-                           ctime
-                         (setcar ctime (1- (car ctime)))))
-                      (itimer-list nil)
-                      (itimer (funcall start-itimer "pgg-run-at-time"
-                                       'ignore 5)))
-                 (sleep-for 0.1) ;; Accept the timeout interrupt.
-                 (prog1
-                     (> (funcall itimer-value itimer) 0)
-                   (funcall delete-itimer itimer))))
-           (error nil))
-         `(let ((time ,time))
-            (apply #'start-itimer "pgg-run-at-time"
-                   ,function (if time (max time 1e-9) 1e-9)
-                   ,repeat nil t ,args)))
-      `(let ((time ,time)
-            (itimers (list nil)))
-        (setcar
-         itimers
-         (apply #'start-itimer "pgg-run-at-time"
-                (lambda (itimers repeat function &rest args)
-                  (let ((itimer (car itimers)))
-                    (if repeat
-                        (progn
-                          (set-itimer-function
-                           itimer
-                           (lambda (itimer repeat function &rest args)
-                             (set-itimer-restart itimer repeat)
-                             (set-itimer-function itimer function)
-                             (set-itimer-function-arguments itimer args)
-                             (apply function args)))
-                          (set-itimer-function-arguments
-                           itimer
-                           (append (list itimer repeat function) args)))
-                      (set-itimer-function
-                       itimer
-                       (lambda (itimer function &rest args)
-                         (delete-itimer itimer)
-                         (apply function args)))
-                      (set-itimer-function-arguments
-                       itimer
-                       (append (list itimer function) args)))))
-                1e-9 (if time (max time 1e-9) 1e-9)
-                nil t itimers ,repeat ,function ,args))))))
-
-(eval-and-compile
-  (if (featurep 'xemacs)
-      (progn
-        (defun pgg-run-at-time (time repeat function &rest args)
-          "Emulating function run as `run-at-time'.
-TIME should be nil meaning now, or a number of seconds from now.
-Return an itimer object which can be used in either `delete-itimer'
-or `cancel-timer'."
-          (pgg-run-at-time-1 time repeat function args))
-        (defun pgg-cancel-timer (timer)
-          "Emulate cancel-timer for xemacs."
-          (let ((delete-itimer 'delete-itimer))
-            (funcall delete-itimer timer)))
-        )
-    (defalias 'pgg-run-at-time 'run-at-time)
-    (defalias 'pgg-cancel-timer 'cancel-timer)))
-
 (defmacro pgg-convert-lbt-region (start end lbt)
   `(let ((pgg-conversion-end (set-marker (make-marker) ,end)))
      (goto-char ,start)
index 699aa91abcf44a7ef9b651ccd0443a924c097f31..48a6e4bd046e4bebe6b7828b16181148ed4179b3 100644 (file)
@@ -296,14 +296,14 @@ a reflection."
 (defun bb-up (count)
   (interactive "p")
   (while (and (> count 0) (> bb-y -1))
-    (forward-line -1)
+    (with-no-warnings (previous-line))
     (setq bb-y (1- bb-y))
     (setq count (1- count))))
 
 (defun bb-down (count)
   (interactive "p")
   (while (and (> count 0) (< bb-y 8))
-    (forward-line 1)
+    (with-no-warnings (next-line))
     (setq bb-y (1+ bb-y))
     (setq count (1- count))))
 
index a1f8c2708d2ac6298cf02b974c58a437fede7c0b..95c16849dcee656dbd17cdf9d277795c6ac01811 100644 (file)
@@ -1,4 +1,4 @@
-;;; dunnet.el --- text adventure for Emacs
+;;; dunnet.el --- text adventure for Emacs -*-  byte-compile-warnings: nil -*-
 
 ;; Copyright (C) 1992, 1993, 2001, 2002, 2003, 2004,
 ;;   2005, 2006, 2007 Free Software Foundation, Inc.
   :type 'file
   :group 'dunnet)
 
-(if nil
-    (eval-and-compile (setq byte-compile-warnings nil)))
-
-(eval-when-compile
- (require 'cl))
-
 ;;;; Mode definitions for interactive mode
 
 (define-derived-mode dun-mode text-mode "Dungeon"
   "Function called when return is pressed in interactive mode to parse line."
   (interactive "*p")
   (beginning-of-line)
-  (setq beg (+ (point) 1))
-  (end-of-line)
-  (if (and (not (= beg (point))) (not (< (point) beg))
-          (string= ">" (buffer-substring (- beg 1) beg)))
-      (progn
-       (setq line (downcase (buffer-substring beg (point))))
-       (princ line)
-       (if (eq (dun-vparse dun-ignore dun-verblist line) -1)
-           (dun-mprinc "I don't understand that.\n")))
+  (let ((beg (1+ (point)))
+        line)
+    (end-of-line)
+    (if (and (not (= beg (point))) (not (< (point) beg))
+             (string= ">" (buffer-substring (- beg 1) beg)))
+        (progn
+          (setq line (downcase (buffer-substring beg (point))))
+          (princ line)
+          (if (eq (dun-vparse dun-ignore dun-verblist line) -1)
+              (dun-mprinc "I don't understand that.\n")))
     (goto-char (point-max))
-    (dun-mprinc "\n"))
-    (dun-messages))
+    (dun-mprinc "\n")))
+  (dun-messages))
 
 (defun dun-messages ()
   (if dun-dead
index 28fc453577bb6c9111af153af65c83e3a04fb881..702052f52d6abdc43c77d98b9d32af8232e8cfa4 100644 (file)
@@ -112,6 +112,8 @@ If called interactively, display a list of matches."
 ;;
 ;; written by Kayvan Aghaiepour
 
+(declare-function doctor-ret-or-read "doctor" (arg))
+
 ;;;###autoload
 (defun psychoanalyze-pinhead ()
   "Zippy goes to the analyst."
index 01f1c86618cdf941d4beaaa4259713221b9213a8..9f6e70dcce5fd1d45ace189feba974583bb66ee6 100644 (file)
@@ -840,7 +840,8 @@ Do not change."
 (defface antlr-keyword
   (cond-emacs-xemacs
    '((((class color) (background light))
-      (:foreground "black" :EMACS :weight bold :XEMACS :bold t))))
+      (:foreground "black" :EMACS :weight bold :XEMACS :bold t))
+     (t :inherit font-lock-keyword-face)))
   "ANTLR keywords."
   :group 'antlr)
 ;; backward-compatibility alias
@@ -850,7 +851,8 @@ Do not change."
 (defface antlr-syntax
   (cond-emacs-xemacs
    '((((class color) (background light))
-      (:foreground "black" :EMACS :weight bold :XEMACS :bold t))))
+      (:foreground "black" :EMACS :weight bold :XEMACS :bold t))
+     (t :inherit font-lock-constant-face)))
   "ANTLR syntax symbols like :, |, (, ), ...."
   :group 'antlr)
 ;; backward-compatibility alias
@@ -860,7 +862,8 @@ Do not change."
 (defface antlr-ruledef
   (cond-emacs-xemacs
    '((((class color) (background light))
-      (:foreground "blue" :EMACS :weight bold :XEMACS :bold t))))
+      (:foreground "blue" :EMACS :weight bold :XEMACS :bold t))
+     (t :inherit font-lock-function-name-face)))
   "ANTLR rule references (definition)."
   :group 'antlr)
 ;; backward-compatibility alias
@@ -870,7 +873,8 @@ Do not change."
 (defface antlr-tokendef
   (cond-emacs-xemacs
    '((((class color) (background light))
-      (:foreground "blue" :EMACS :weight bold :XEMACS :bold t))))
+      (:foreground "blue" :EMACS :weight bold :XEMACS :bold t))
+     (t :inherit font-lock-function-name-face)))
   "ANTLR token references (definition)."
   :group 'antlr)
 ;; backward-compatibility alias
@@ -878,7 +882,8 @@ Do not change."
 
 (defvar antlr-ruleref-face 'antlr-ruleref)
 (defface antlr-ruleref
-  '((((class color) (background light)) (:foreground "blue4")))
+  '((((class color) (background light)) (:foreground "blue4"))
+    (t :inherit font-lock-type-face))
   "ANTLR rule references (usage)."
   :group 'antlr)
 ;; backward-compatibility alias
@@ -886,7 +891,8 @@ Do not change."
 
 (defvar antlr-tokenref-face 'antlr-tokenref)
 (defface antlr-tokenref
-  '((((class color) (background light)) (:foreground "orange4")))
+  '((((class color) (background light)) (:foreground "orange4"))
+    (t :inherit font-lock-type-face))
   "ANTLR token references (usage)."
   :group 'antlr)
 ;; backward-compatibility alias
@@ -896,7 +902,8 @@ Do not change."
 (defface antlr-literal
   (cond-emacs-xemacs
    '((((class color) (background light))
-      (:foreground "brown4" :EMACS :weight bold :XEMACS :bold t))))
+      (:foreground "brown4" :EMACS :weight bold :XEMACS :bold t))
+     (t :inherit font-lock-string-face)))
   "ANTLR special literal tokens.
 It is used to highlight strings matched by the first regexp group of
 `antlr-font-lock-literal-regexp'."
index a019f59891895ebfc8e3ad30274b3149afff083e..7666da75f9b81eccd31d9e7c4be44a9a4b0a3f71 100644 (file)
@@ -604,7 +604,7 @@ comment at the start of cc-engine.el for more info."
   ;;         (e.g. if).
   ;;
   ;;
-  ;; The following diagram briefly outlines the PDA.  
+  ;; The following diagram briefly outlines the PDA.
   ;;
   ;; Common state:
   ;;   "else": Push state, goto state `else'.
@@ -1079,7 +1079,7 @@ single `?' is found, then `c-maybe-labelp' is cleared.
 
 For AWK, a statement which is terminated by an EOL (not a \; or a }) is
 regarded as having a \"virtual semicolon\" immediately after the last token on
-the line.  If this virtual semicolon is _at_ from, the function recognises it.
+the line.  If this virtual semicolon is _at_ from, the function recognizes it.
 
 Note that this function might do hidden buffer changes.  See the
 comment at the start of cc-engine.el for more info."
@@ -1916,7 +1916,7 @@ comment at the start of cc-engine.el for more info."
 (defun c-partial-ws-p (beg end)
   ;; Is the region (beg end) WS, and is there WS (or BOB/EOB) next to the
   ;; region?  This is a "heuristic" function.  .....
-  ;; 
+  ;;
   ;; The motivation for the second bit is to check whether removing this
   ;; region would coalesce two symbols.
   ;;
@@ -3291,7 +3291,7 @@ comment at the start of cc-engine.el for more info."
 ;; The workaround for this is for the AWK Mode initialisation to switch the
 ;; defalias for c-in-literal to c-slow-in-literal.  This will slow down other
 ;; cc-modes in Xemacs whenever an awk-buffer has been initialised.
-;; 
+;;
 ;; (Alan Mackenzie, 2003/4/30).
 
 (defun c-fast-in-literal (&optional lim detect-cpp)
@@ -3406,7 +3406,7 @@ comment at the start of cc-engine.el for more info."
        (if (and (consp range) (progn
                                 (goto-char (car range))
                                 (looking-at c-line-comment-starter)))
-           (let ((col (current-column)) 
+           (let ((col (current-column))
                  (beg (point))
                  (bopl (c-point 'bopl))
                  (end (cdr range)))
@@ -4045,7 +4045,7 @@ comment at the start of cc-engine.el for more info."
   ;; example, this happens to "foo" when "foo \n bar();" becomes
   ;; "foo(); \n bar();".  Such stale types, if not removed, foul up
   ;; the fontification.
-  ;; 
+  ;;
   ;; Have we, perhaps, added non-ws characters to the front/back of a found
   ;; type?
   (when (> end beg)
@@ -4064,7 +4064,7 @@ comment at the start of cc-engine.el for more info."
                        (c-beginning-of-current-token)))
            (c-unfind-type (buffer-substring-no-properties
                            (point) beg))))))
-           
+
   (if c-maybe-stale-found-type ; e.g. (c-decl-id-start "foo" 97 107 " (* ooka) " "o")
       (cond
        ;; Changing the amount of (already existing) whitespace - don't do anything.
@@ -5929,7 +5929,7 @@ comment at the start of cc-engine.el for more info."
        macro-start                     ; if we're in one.
        label-type)
     (cond
-     ;; "case" or "default" (Doesn't apply to AWK). 
+     ;; "case" or "default" (Doesn't apply to AWK).
      ((looking-at c-label-kwds-regexp)
       (let ((kwd-end (match-end 1)))
        ;; Record only the keyword itself for fontification, since in
@@ -6048,7 +6048,7 @@ comment at the start of cc-engine.el for more info."
                         (c-forward-label nil pte start))))))))))
 
           ;; Point is still at the beginning of the possible label construct.
-          ;; 
+          ;;
           ;; Check that the next nonsymbol token is ":", or that we're in one
           ;; of QT's "slots" declarations.  Allow '(' for the sake of macro
           ;; arguments.  FIXME: Should build this regexp from the language
@@ -6074,7 +6074,7 @@ comment at the start of cc-engine.el for more info."
                     (and (c-major-mode-is 'c++-mode)
                          (string-match
                           "\\(p\\(r\\(ivate\\|otected\\)\\|ublic\\)\\|more\\)\\>"
-                          (buffer-substring start (point)))))  
+                          (buffer-substring start (point)))))
               (c-forward-syntactic-ws limit)
               (cond
                ((looking-at ":\\([^:]\\|\\'\\)") ; A single colon.
@@ -7238,7 +7238,7 @@ comment at the start of cc-engine.el for more info."
   ;; needed with further syntax elements of the types `substatement',
   ;; `inexpr-statement', `arglist-cont-nonempty', `statement-block-intro', and
   ;; `defun-block-intro'.
-  ;; 
+  ;;
   ;; Do the generic processing to anchor the given syntax symbol on
   ;; the preceding statement: Skip over any labels and containing
   ;; statements on the same line, and then search backward until we
@@ -7424,7 +7424,7 @@ comment at the start of cc-engine.el for more info."
                                 c-other-decl-block-key-in-symbols-alist))
                     (max (c-point 'boi paren-pos) (point))))
                   (t (c-add-syntax 'defun-block-intro nil))))
-                            
+
                 (c-add-syntax 'statement-block-intro nil)))
 
          (if (= paren-pos boi)
@@ -8264,7 +8264,7 @@ comment at the start of cc-engine.el for more info."
                 'statement-cont)
               nil nil containing-sexp paren-state))
             ))
-          
+
           ;; CASE 5F: Close of a non-class declaration level block.
           ((and (eq char-after-ip ?})
                 (c-keyword-member containing-decl-kwd
index 68ecd3a0515cce3747d5f74c34d8fd938c4bb1b7..d3e613fa25403b61dcb725e1c7ed3247a0be27e4 100644 (file)
@@ -123,6 +123,8 @@ telling us which (X)Emacs version you're using."
       map)
     "Keymap used in command `c-subword-mode' minor mode.")
 
+  ;; Produces compiler warning about make-variable-buffer-local not
+  ;; being called at toplevel (due to fboundp test).
   (define-minor-mode c-subword-mode
     "Mode enabling subword movement and editing keys.
 In spite of GNU Coding Standards, it is popular to name a symbol by
index 3de5b7eeb7eec38458fc387ecfba6cdc997030a3..b4148c59b4989c733ed0fa80e1d44dcc849b9a8a 100644 (file)
@@ -339,6 +339,57 @@ File = \\(.+\\), Line = \\([0-9]+\\)\\(?:, Column = \\([0-9]+\\)\\)?"
      nil 2 nil 2 nil
      (0 'default t)
      (1 compilation-error-face prepend) (2 compilation-line-face prepend))
+
+    (compilation-perl--Pod::Checker
+     ;; podchecker error messages, per Pod::Checker.
+     ;; The style is from the Pod::Checker::poderror() function, eg.
+     ;; *** ERROR: Spurious text after =cut at line 193 in file foo.pm
+     ;;
+     ;; Plus end_pod() can give "at line EOF" instead of a
+     ;; number, so for that match "on line N" which is the
+     ;; originating spot, eg.
+     ;; *** ERROR: =over on line 37 without closing =back at line EOF in file bar.pm
+     ;;
+     ;; Plus command() can give both "on line N" and "at line N";
+     ;; the latter is desired and is matched because the .* is
+     ;; greedy.
+     ;; *** ERROR: =over on line 1 without closing =back (at head1) at line 3 in file x.pod
+     ;;
+     "^\\*\\*\\* \\(?:ERROR\\|\\(WARNING\\)\\).* \\(?:at\\|on\\) line \
+\\([0-9]+\\) \\(?:.* \\)?in file \\([^ \t\n]+\\)"
+     3 2 nil (1))
+    (compilation-perl--Test
+     ;; perl Test module error messages.
+     ;; Style per the ok() function "$context", eg.
+     ;; # Failed test 1 in foo.t at line 6
+     ;;
+     "^# Failed test [0-9]+ in \\([^ \t\r\n]+\\) at line \\([0-9]+\\)"
+     1 2)
+    (compilation-perl--Test::Harness
+     ;; perl Test::Harness output, eg.
+     ;; NOK 1# Test 1 got: "1234" (t/foo.t at line 46)
+     ;;
+     ;; Test::Harness is slightly designed for tty output, since
+     ;; it prints CRs to overwrite progress messages, but if you
+     ;; run it in with M-x compile this pattern can at least step
+     ;; through the failures.
+     ;;
+     "^.*NOK.* \\([^ \t\r\n]+\\) at line \\([0-9]+\\)"
+     1 2)
+    (compilation-weblint
+     ;; The style comes from HTML::Lint::Error::as_string(), eg.
+     ;; index.html (13:1) Unknown element <fdjsk>
+     ;;
+     ;; The pattern only matches filenames without spaces, since that
+     ;; should be usual and should help reduce the chance of a false
+     ;; match of a message from some unrelated program.
+     ;;
+     ;; This message style is quite close to the "ibm" entry which is
+     ;; for IBM C, though that ibm bit doesn't put a space after the
+     ;; filename.
+     ;;
+     "^\\([^ \t\r\n(]+\\) (\\([0-9]+\\):\\([0-9]+\\)) "
+     1 2 3)
     )
   "Alist of values for `compilation-error-regexp-alist'.")
 
index 13f1e0c24b82664bf581884e08d15f1778938894..4a397a9d0124be9cc0e5b3a1f9685b5d64b791d1 100644 (file)
@@ -1510,6 +1510,8 @@ the last)."
      2 3))
   "Alist that specifies how to match errors in perl output.")
 
+(defvar compilation-error-regexp-alist)
+
 ;;;###autoload
 (defun cperl-mode ()
   "Major mode for editing Perl code.
@@ -1790,9 +1792,11 @@ or as help on variables `cperl-tips', `cperl-problems',
   (set 'vc-sccs-header cperl-vc-sccs-header)
   ;; This one is obsolete...
   (make-local-variable 'vc-header-alist)
-  (set 'vc-header-alist (or cperl-vc-header-alist ; Avoid warning
-                           `((SCCS ,(car cperl-vc-sccs-header))
-                              (RCS ,(car cperl-vc-rcs-header)))))
+  (with-no-warnings
+   (set 'vc-header-alist (or cperl-vc-header-alist ; Avoid warning
+                            `((SCCS ,(car cperl-vc-sccs-header))
+                              (RCS ,(car cperl-vc-rcs-header)))))
+   )
   (cond ((boundp 'compilation-error-regexp-alist-alist);; xemacs 20.x
         (make-local-variable 'compilation-error-regexp-alist-alist)
         (set 'compilation-error-regexp-alist-alist
index 6a3e9e82d6e6a41f60f425e2ada080db4704f9ae..4546880cca5591273af064fbaddcf77fd56519d8 100644 (file)
@@ -2201,6 +2201,7 @@ otherwise return nil."
           ()
         (equal start (match-end 0))))))
 
+(declare-function imenu-default-create-index-function "imenu" ())
 
 ;;;-------------------------------------------------------------------------
 (defun dcl-imenu-create-index-function ()
index 5538bd8984a4d941e935f022f45cdf431132a34d..1e144282de53231dd7cf312bd408b0c763d380a1 100644 (file)
@@ -1268,10 +1268,9 @@ For the format of LINE-ERR-INFO, see `flymake-ler-make-ler'."
 (defun flymake-goto-file-and-line (file line)
   "Try to get buffer for FILE and goto line LINE in it."
   (if (not (file-exists-p file))
-      (flymake-log 1 "file %s does not exists" file)
-    (progn
-      (find-file file)
-      (goto-line line))))
+      (flymake-log 1 "File %s does not exist" file)
+    (find-file file)
+    (goto-line line)))
 
 ;; flymake minor mode declarations
 (defvar flymake-mode-line nil)
index 43cb61cba6b3f547716ab84e64821fc4c39cf2e3..1954319269d53545b6f6ca654aa45e54f735e0cd 100644 (file)
@@ -908,6 +908,8 @@ affects all Fortran buffers, and also the default."
   "Fortran mode adds this to `hack-local-variables-hook'."
   (fortran-line-length fortran-line-length))
 
+(declare-function gud-find-c-expr "gud.el" nil)
+
 (defun fortran-gud-find-expr ()
   ;; Consider \n as punctuation (end of expression).
   (with-syntax-table fortran-gud-syntax-table
index 0d1a4b05d65a041ae2fe4826c4758fc4a86c6210..32db8850b6659061a3bf0e79039d127ea34737c3 100644 (file)
 ;; section in the GDB info manual.
 
 ;; GDB developers plan to make the annotation interface obsolete.  A new
-;; interface called GDB/MI (machine interface) has been designed to replace
-;; it.  Some GDB/MI commands are used in this file through the CLI command
-;; 'interpreter mi <mi-command>'.  A file called gdb-mi.el is included with
-;; GDB (6.2 onwards) that uses GDB/MI as the primary interface to GDB.  It is
-;; still under development and is part of a process to migrate Emacs from
-;; annotations to GDB/MI.
+;; interface called GDB/MI (machine interface) has been designed to replace it.
+;; Some GDB/MI commands are used in this file through the CLI command
+;; 'interpreter mi <mi-command>'.  To help with the process of fully migrating
+;; Emacs from annotations to GDB/MI, there is an experimental package called
+;; gdb-mi in the Emacs Lisp Package Archive ("http://tromey.com/elpa/").  It
+;; comprises of modified gud.el and a file called gdb-mi.el which replaces
+;; gdb-ui.el.  When installed, this overrides the current files and invoking
+;; M-x gdb will use GDB/MI directly (starts with "gdb -i=mi").  When deleted
+;; ('d' followed by 'x' in Package Menu mode), the files are deleted and old
+;; functionality restored.  This provides a convenient way to review the
+;; current status/contribute to its improvement.  For someone who just wants to
+;; use GDB, however, the current mode in Emacs 22 is a much better option.
+;; There is also a file, also called gdb-mi.el, a version of which is included
+;; the GDB distribution.  This will probably only work with versions
+;; distributed with GDB 6.5 or later.  Unlike the version in ELPA it works on
+;; top of gdb-ui.el and you can only start it with M-x gdbmi.
 
 ;; This mode SHOULD WORK WITH GDB 5.0 or later but you will NEED AT LEAST
 ;; GDB 6.0 to use watch expressions.  It works best with GDB 6.4 or later
 
 ;;; Known Bugs:
 
-;; 1) Strings that are watched don't update in the speedbar when their
-;;    contents change unless the first character changes.
-;; 2) Cannot handle multiple debug sessions.
-;; 3) M-x gdb doesn't work with "run" command in .gdbinit, use M-x gdba instead.
-;; 4) M-x gdb doesn't work if the corefile is specified in the command in the
-;;    minibuffer, use M-x gdba instead (or specify the core in the GUD buffer).
-;; 5) If you wish to call procedures from your program in GDB
+;; 1) Cannot handle multiple debug sessions.
+;; 2) If you wish to call procedures from your program in GDB
 ;;    e.g "call myproc ()", "p mysquare (5)" then use level 2 annotations
 ;;    "gdb --annotate=2 myprog" to keep source buffer/selected frame fixed.
-;; 6) After detaching from a process, clicking on the "GO" icon on toolbar
+;; 3) After detaching from a process, clicking on the "GO" icon on toolbar
 ;;    (gud-go) sends "continue" to GDB (should be "run").
 
-;;; Problems with watch expressions, GDB/MI:
-
-;; 1) They go out of scope when the inferior is re-run.
-;; 2) -stack-list-locals has a type field but also prints type in values field.
-;; 3) VARNUM increments even when variable object is not created
-;;    (maybe trivial).
-
 ;;; TODO:
 
 ;; 1) Use MI command -data-read-memory for memory window.
@@ -138,6 +136,7 @@ Emacs can't find.")
 (defvar gdb-frame-begin nil
   "Non-nil when GDB generates frame-begin annotation.")
 (defvar gdb-printing t)
+(defvar gdb-parent-bptno-enabled nil)
 
 (defvar gdb-buffer-type nil
   "One of the symbols bound in `gdb-buffer-rules'.")
@@ -222,7 +221,6 @@ handlers.")
 The directory containing FILE becomes the initial working
 directory and source-file directory for your debugger.
 
-
 If `gdb-many-windows' is nil (the default value) then gdb just
 pops up the GUD buffer unless `gdb-show-main' is t.  In this case
 it starts with two windows: one displaying the GUD buffer and the
@@ -1860,7 +1858,7 @@ static char *magick[] = {
   :group 'gud)
 
 (defconst gdb-breakpoint-regexp
-  "\\([0-9]+\\).*?\\(?:point\\|catch\\s-+\\S-+\\)\\s-+\\S-+\\s-+\\(.\\)\\s-+")
+  "\\(?:\\([0-9]+\\).*?\\(?:point\\|catch\\s-+\\S-+\\)\\s-+\\S-+\\|\\([0-9]+\\.[0-9]+\\)\\)\\s-+\\(.\\)\\s-+")
 
 ;; Put breakpoint icons in relevant margins (even those set in the GUD buffer).
 (defun gdb-info-breakpoints-custom ()
@@ -1879,10 +1877,12 @@ static char *magick[] = {
          (forward-line 1)
          (if (looking-at gdb-breakpoint-regexp)
              (progn
-               (setq bptno (match-string 1))
-               (setq flag (char-after (match-beginning 2)))
+               (setq bptno (or (match-string 1) (match-string 2)))
+               (setq flag (char-after (match-beginning 3)))
+               (if (match-string 1)
+                   (setq gdb-parent-bptno-enabled (eq flag ?y)))
                (add-text-properties
-                (match-beginning 2) (match-end 2)
+                (match-beginning 3) (match-end 3)
                 (if (eq flag ?y)
                     '(face font-lock-warning-face)
                   '(face font-lock-type-face)))
@@ -1938,6 +1938,9 @@ static char *magick[] = {
          (end-of-line))))))
   (if (gdb-get-buffer 'gdb-assembler-buffer) (gdb-assembler-custom)))
 
+(declare-function gud-remove "gdb-ui" t t) ; gud-def
+(declare-function gud-break  "gdb-ui" t t) ; gud-def
+
 (defun gdb-mouse-set-clear-breakpoint (event)
   "Set/clear breakpoint in left fringe/margin with mouse click."
   (interactive "e")
@@ -1963,17 +1966,18 @@ static char *magick[] = {
          (save-excursion
            (goto-char (posn-point posn))
            (if (posn-object posn)
-               (gdb-enqueue-input
-                (list
-                 (let ((bptno (get-text-property
-                               0 'gdb-bptno (car (posn-string posn)))))
+               (let* ((bptno (get-text-property
+                              0 'gdb-bptno (car (posn-string posn)))))
+                 (string-match "\\([0-9+]\\)*" bptno)
+                 (gdb-enqueue-input
+                  (list
                    (concat gdb-server-prefix
                            (if (get-text-property
                                 0 'gdb-enabled (car (posn-string posn)))
                                "disable "
                              "enable ")
-                           bptno "\n"))
-                 'ignore))))))))
+                           (match-string 1 bptno) "\n")
+                  'ignore)))))))))
 
 (defun gdb-mouse-toggle-breakpoint-fringe (event)
   "Enable/disable breakpoint in left fringe with mouse click."
@@ -1991,14 +1995,16 @@ static char *magick[] = {
            (when (overlay-get overlay 'put-break)
              (setq obj (overlay-get overlay 'before-string))))
          (when (stringp obj)
-           (gdb-enqueue-input
-            (list
-             (concat gdb-server-prefix
-              (if (get-text-property 0 'gdb-enabled obj)
-                  "disable "
-                "enable ")
-              (get-text-property 0 'gdb-bptno obj) "\n")
-             'ignore))))))))
+           (let* ((bptno (get-text-property 0 'gdb-bptno obj)))
+             (string-match "\\([0-9+]\\)*" bptno)
+             (gdb-enqueue-input
+              (list
+               (concat gdb-server-prefix
+                       (if (get-text-property 0 'gdb-enabled obj)
+                           "disable "
+                         "enable ")
+                       (match-string 1 bptno) "\n")
+               'ignore)))))))))
 
 (defun gdb-breakpoints-buffer-name ()
   (with-current-buffer gud-comint-buffer
@@ -2064,21 +2070,25 @@ static char *magick[] = {
        (gdb-enqueue-input
         (list
          (concat gdb-server-prefix
-                 (if (eq ?y (char-after (match-beginning 2)))
+                 (if (eq ?y (char-after (match-beginning 3)))
                      "disable "
                    "enable ")
-                 (match-string 1) "\n") 'ignore))
+                 (or (match-string 1) (match-string 2)) "\n") 'ignore))
       (error "Not recognized as break/watchpoint line"))))
 
 (defun gdb-delete-breakpoint ()
   "Delete the breakpoint at current line."
   (interactive)
-  (beginning-of-line 1)
-  (if (looking-at gdb-breakpoint-regexp)
-      (gdb-enqueue-input
-       (list
-       (concat gdb-server-prefix "delete " (match-string 1) "\n") 'ignore))
-    (error "Not recognized as break/watchpoint line")))
+  (save-excursion
+    (beginning-of-line 1)
+    (if (looking-at gdb-breakpoint-regexp)
+       (if (match-string 1)
+           (gdb-enqueue-input
+            (list
+             (concat gdb-server-prefix "delete " (match-string 1) "\n")
+             'ignore))
+         (message-box "This breakpoint cannot be deleted on its own."))
+      (error "Not recognized as break/watchpoint line"))))
 
 (defun gdb-goto-breakpoint (&optional event)
   "Display the breakpoint location specified at current line."
@@ -2086,7 +2096,7 @@ static char *magick[] = {
   (if event (posn-set-point (event-end event)))
   (save-excursion
     (beginning-of-line 1)
-    (if (looking-at "\\([0-9]+\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)")
+    (if (looking-at "\\([0-9]+\\.?[0-9]*\\) .+ in .+ at\\s-+\\(\\S-+\\):\\([0-9]+\\)")
        (let ((bptno (match-string 1))
              (file  (match-string 2))
              (line  (match-string 3)))
@@ -3156,6 +3166,8 @@ BUFFER nil or omitted means use the current buffer."
          (delete-overlay overlay))))
 
 (defun gdb-put-breakpoint-icon (enabled bptno)
+  (if (string-match "[0-9+]+\\." bptno)
+      (setq enabled gdb-parent-bptno-enabled))
   (let ((start (- (line-beginning-position) 1))
        (end (+ (line-end-position) 1))
        (putstring (if enabled "B" "b"))
@@ -3215,8 +3227,8 @@ BUFFER nil or omitted means use the current buffer."
          (setq left-margin-width 2)
          (let ((window (get-buffer-window (current-buffer) 0)))
            (if window
-             (set-window-margins
-              window left-margin-width right-margin-width)))))
+               (set-window-margins
+                window left-margin-width right-margin-width)))))
       (gdb-put-string
        (propertize putstring
                   'face (if enabled 'breakpoint-enabled 'breakpoint-disabled))
@@ -3286,18 +3298,16 @@ BUFFER nil or omitted means use the current buffer."
       (goto-char (point-min))
       (while (< (point) (- (point-max) 1))
        (forward-line 1)
-       (if (looking-at "[^\t].*?breakpoint")
-           (progn
-             (looking-at
-           "\\([0-9]+\\)\\s-+\\S-+\\s-+\\S-+\\s-+\\(.\\)\\s-+0x0*\\(\\S-+\\)")
-             (setq bptno (match-string 1))
-             (setq flag (char-after (match-beginning 2)))
-             (setq address (match-string 3))
-             (with-current-buffer buffer
-               (save-excursion
-                 (goto-char (point-min))
-                 (if (search-forward address nil t)
-                     (gdb-put-breakpoint-icon (eq flag ?y) bptno))))))))
+       (when (looking-at
+              "\\([0-9]+\\.?[0-9]*\\).*?\\s-+\\(.\\)\\s-+0x0*\\(\\S-+\\)")
+         (setq bptno (match-string 1))
+         (setq flag (char-after (match-beginning 2)))
+         (setq address (match-string 3))
+         (with-current-buffer buffer
+           (save-excursion
+             (goto-char (point-min))
+             (if (search-forward address nil t)
+                 (gdb-put-breakpoint-icon (eq flag ?y) bptno)))))))
     (if (not (equal gdb-pc-address "main"))
        (with-current-buffer buffer
          (set-window-point (get-buffer-window buffer 0) pos)))))
@@ -3458,7 +3468,7 @@ is set in them."
   (gdb-force-mode-line-update
    (propertize "ready" 'face font-lock-variable-name-face)))
 
-; Uses "-var-list-children --all-values".  Needs GDB 6.1 onwards.
+; Uses "-var-list-children --all-values".  Needs GDB 6.4 onwards.
 (defun gdb-var-list-children-1 (varnum)
   (gdb-enqueue-input
    (list
index 091735ee09de24b0bba78ee5f9ec8ccf8a52489b..f811fce6e7f94ba586864f29e1b2825278955fff 100644 (file)
@@ -332,6 +332,12 @@ This variable's value takes effect when `grep-compute-defaults' is called.")
   "The default find program for `grep-find-command'.
 This variable's value takes effect when `grep-compute-defaults' is called.")
 
+;;;###autoload
+(defvar xargs-program "xargs"
+  "The default xargs program for `grep-find-command'.
+See `grep-find-use-xargs'.
+This variable's value takes effect when `grep-compute-defaults' is called.")
+
 ;;;###autoload
 (defvar grep-find-use-xargs nil
   "Non-nil means that `grep-find' uses the `xargs' utility by default.
@@ -365,11 +371,16 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
   (unless (or (not grep-highlight-matches) (eq grep-highlight-matches t))
     (grep-compute-defaults))
   (when (eq grep-highlight-matches t)
-    ;; Modify `process-environment' locally bound in `compilation-start'
-    (setenv "GREP_OPTIONS" (concat (getenv "GREP_OPTIONS") " --color=always"))
-    ;; for GNU grep 2.5.1
+    ;; `setenv' modifies `process-environment' let-bound in `compilation-start'
+    ;; Any TERM except "dumb" allows GNU grep to use `--color=auto'
+    (setenv "TERM" "emacs-grep")
+    ;; `--color=auto' emits escape sequences on a tty rather than on a pipe,
+    ;; thus allowing to use multiple grep filters on the command line
+    ;; and to output escape sequences only on the final grep output
+    (setenv "GREP_OPTIONS" (concat (getenv "GREP_OPTIONS") " --color=auto"))
+    ;; GREP_COLOR is used in GNU grep 2.5.1, but deprecated in later versions
     (setenv "GREP_COLOR" "01;31")
-    ;; for GNU grep 2.5.1-cvs
+    ;; GREP_COLORS is used in GNU grep 2.5.2 and later versions
     (setenv "GREP_COLORS" "mt=01;31:fn=:ln=:bn=:se=:ml=:cx=:ne"))
   (set (make-local-variable 'compilation-exit-message-function)
        (lambda (status code msg)
@@ -475,15 +486,15 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
                (cond
                 ((and
                   (grep-probe find-program `(nil nil nil ,null-device "-print0"))
-                  (grep-probe "xargs" `(nil nil nil "-0" "-e" "echo")))
+                  (grep-probe xargs-program `(nil nil nil "-0" "-e" "echo")))
                  'gnu)
                 (t
                  'exec))))
        (unless grep-find-command
          (setq grep-find-command
                (cond ((eq grep-find-use-xargs 'gnu)
-                      (format "%s . -type f -print0 | xargs -0 -e %s"
-                              find-program grep-command))
+                      (format "%s . -type f -print0 | %s -0 -e %s"
+                              find-program xargs-program grep-command))
                      ((eq grep-find-use-xargs 'exec)
                       (let ((cmd0 (format "%s . -type f -exec %s"
                                           find-program grep-command)))
@@ -493,22 +504,22 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
                                  (shell-quote-argument ";"))
                          (1+ (length cmd0)))))
                      (t
-                      (format "%s . -type f -print | xargs %s"
-                              find-program grep-command)))))
+                      (format "%s . -type f -print | %s %s"
+                              find-program xargs-program grep-command)))))
        (unless grep-find-template
          (setq grep-find-template
                (let ((gcmd (format "%s <C> %s <R>"
                                    grep-program grep-options)))
                  (cond ((eq grep-find-use-xargs 'gnu)
-                        (format "%s . <X> -type f <F> -print0 | xargs -0 -e %s"
-                                find-program gcmd))
+                        (format "%s . <X> -type f <F> -print0 | %s -0 -e %s"
+                                find-program xargs-program gcmd))
                        ((eq grep-find-use-xargs 'exec)
                         (format "%s . <X> -type f <F> -exec %s {} %s %s"
                                 find-program gcmd null-device
                                 (shell-quote-argument ";")))
                        (t
-                        (format "%s . <X> -type f <F> -print | xargs %s"
-                                find-program gcmd))))))))
+                        (format "%s . <X> -type f <F> -print | %s %s"
+                                find-program xargs-program gcmd))))))))
     (unless (or (not grep-highlight-matches) (eq grep-highlight-matches t))
       (setq grep-highlight-matches
            (with-temp-buffer
@@ -543,7 +554,7 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
       ""))
 
 (defun grep-default-command ()
-  "Compute the default grep command for C-u M-x grep to offer."
+  "Compute the default grep command for \\[universal-argument] \\[grep] to offer."
   (let ((tag-default (shell-quote-argument (grep-tag-default)))
        ;; This a regexp to match single shell arguments.
        ;; Could someone please add comments explaining it?
@@ -596,19 +607,19 @@ Set up `compilation-exit-message-function' and run `grep-setup-hook'."
   "Run grep, with user-specified args, and collect output in a buffer.
 While grep runs asynchronously, you can use \\[next-error] (M-x next-error),
 or \\<grep-mode-map>\\[compile-goto-error] in the grep \
-output buffer, to go to the lines
-where grep found matches.
+output buffer, to go to the lines where grep
+found matches.
 
 For doing a recursive `grep', see the `rgrep' command.  For running
 `grep' in a specific directory, see `lgrep'.
 
-This command uses a special history list for its COMMAND-ARGS, so you can
-easily repeat a grep command.
+This command uses a special history list for its COMMAND-ARGS, so you
+can easily repeat a grep command.
 
 A prefix argument says to default the argument based upon the current
 tag the cursor is over, substituting it into the last grep command
-in the grep command history (or into `grep-command'
-if that history list is empty)."
+in the grep command history (or into `grep-command' if that history
+list is empty)."
   (interactive
    (progn
      (grep-compute-defaults)
@@ -736,8 +747,9 @@ before it is executed.
 With two \\[universal-argument] prefixes, directly edit and run `grep-command'.
 
 Collect output in a buffer.  While grep runs asynchronously, you
-can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error]
-in the grep output buffer, to go to the lines where grep found matches.
+can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error] \
+in the grep output buffer,
+to go to the lines where grep found matches.
 
 This command shares argument histories with \\[rgrep] and \\[grep]."
   (interactive
@@ -797,8 +809,9 @@ before it is executed.
 With two \\[universal-argument] prefixes, directly edit and run `grep-find-command'.
 
 Collect output in a buffer.  While find runs asynchronously, you
-can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error]
-in the grep output buffer, to go to the lines where grep found matches.
+can use \\[next-error] (M-x next-error), or \\<grep-mode-map>\\[compile-goto-error] \
+in the grep output buffer,
+to go to the lines where grep found matches.
 
 This command shares argument histories with \\[lgrep] and \\[grep-find]."
   (interactive
index ce231f4c66284cab2e00eae2f8a664cf07a0a732..3c6736ac79b5af8603f74511e297c61f281f0f34 100644 (file)
@@ -318,6 +318,8 @@ Uses `gud-<MINOR-MODE>-directories' to find the source files."
        (setq directories (cdr directories)))
       result)))
 
+(declare-function gdb-create-define-alist "gdb-ui" ())
+
 (defun gud-find-file (file)
   ;; Don't get confused by double slashes in the name that comes from GDB.
   (while (string-match "//+" file)
@@ -709,6 +711,9 @@ The option \"--fullname\" must be included in this value."
 (defvar gud-filter-pending-text nil
   "Non-nil means this is text that has been saved for later in `gud-filter'.")
 
+;; If in gdba mode, gdb-ui is loaded.
+(declare-function gdb-restore-windows "gdb-ui" ())
+
 ;; The old gdb command (text command mode).  The new one is in gdb-ui.el.
 ;;;###autoload
 (defun gud-gdb (command-line)
@@ -2597,6 +2602,8 @@ It is saved for when this flag is not set.")
 (defvar gud-overlay-arrow-position nil)
 (add-to-list 'overlay-arrow-variable-list 'gud-overlay-arrow-position)
 
+(declare-function gdb-reset "gdb-ui" ())
+
 (defun gud-sentinel (proc msg)
   (cond ((null (buffer-name (process-buffer proc)))
         ;; buffer killed
@@ -2666,6 +2673,11 @@ Obeying it means displaying in another window the specified file and line."
     (setq gud-last-last-frame gud-last-frame
          gud-last-frame nil)))
 
+(declare-function global-hl-line-highlight  "hl-line" ())
+(declare-function hl-line-highlight         "hl-line" ())
+(declare-function gdb-display-source-buffer "gdb-ui"  (buffer))
+(declare-function gdb-display-buffer "gdb-ui" (buf dedicated &optional size))
+
 ;; Make sure the file named TRUE-FILE is in a buffer that appears on the screen
 ;; and that its line LINE is visible.
 ;; Put the overlay-arrow on the line LINE in that buffer.
@@ -2998,6 +3010,12 @@ Link exprs of the form:
        (t nil)))
      (t nil))))
 
+
+(declare-function c-langelem-sym "cc-defs" (langelem))
+(declare-function c-langelem-pos "cc-defs" (langelem))
+(declare-function syntax-symbol  "gud"     (x))
+(declare-function syntax-point   "gud"     (x))
+
 (defun gud-find-class (f line)
   "Find fully qualified class in file F at line LINE.
 This function uses the `gud-jdb-classpath' (and optional
@@ -3383,6 +3401,8 @@ With arg, dereference expr if ARG is positive, otherwise do not derereference."
        ((xdb pdb) (concat "p " expr))
        (sdb (concat expr "/"))))
 
+(declare-function gdb-enqueue-input "gdb-ui" (item))
+
 (defun gud-tooltip-tips (event)
   "Show tip for identifier or selection under the mouse.
 The mouse must either point at an identifier or inside a selected
index d005c6de63e5bdae5360db90d13c7da08dc7f490..cfd9834abca83a04615019582bf492ee869b2026 100644 (file)
@@ -91,6 +91,8 @@
 
 (require 'idlwave)
 
+(declare-function idlwave-shell-buffer "idlw-shell")
+
 ;; Some variables to identify the previously used structure
 (defvar idlwave-current-tags-var nil)
 (defvar idlwave-current-tags-buffer nil)
 (defvar idlwave-sint-structtags nil)
 
 ;; Create the sintern type for structure talks
+(declare-function idlwave-sintern-structtag "idlw-complete-structtag" t t)
 (idlwave-new-sintern-type 'structtag)
 
 ;; Hook the plugin into idlwave
index 2269e17935785c515f9f31f632751a2ebc740207..69f24686e82d1b07cb23c5820a5c42445ce2da15 100644 (file)
 
 
 ;;; Code:
-(defvar idlwave-help-browse-url-available nil
+(defvar idlwave-help-browse-url-available t
   "Whether browse-url is available")
 
-(setq idlwave-help-browse-url-available
-      (condition-case nil
-         (require 'browse-url)
-       (error nil)))
+(require 'browse-url)
 
 (defgroup idlwave-online-help nil
   "Online Help options for IDLWAVE mode."
@@ -258,6 +255,39 @@ support."
 (defvar idlwave-help-def-pos)
 (defvar idlwave-help-args)
 (defvar idlwave-help-in-header)
+(declare-function idlwave-prepare-structure-tag-completion "idlw-complete-structtag")
+(declare-function idlwave-all-method-classes "idlwave")
+(declare-function idlwave-all-method-keyword-classes "idlwave")
+(declare-function idlwave-beginning-of-statement "idlwave")
+(declare-function idlwave-best-rinfo-assoc "idlwave")
+(declare-function idlwave-class-found-in "idlwave")
+(declare-function idlwave-class-or-superclass-with-tag "idlwave")
+(declare-function idlwave-completing-read "idlwave")
+(declare-function idlwave-current-routine "idlwave")
+(declare-function idlwave-downcase-safe "idlwave")
+(declare-function idlwave-entry-find-keyword "idlwave")
+(declare-function idlwave-expand-keyword "idlwave")
+(declare-function idlwave-find-class-definition "idlwave")
+(declare-function idlwave-find-inherited-class "idlwave")
+(declare-function idlwave-find-struct-tag "idlwave")
+(declare-function idlwave-get-buffer-visiting "idlwave")
+(declare-function idlwave-in-quote "idlwave")
+(declare-function idlwave-make-full-name "idlwave")
+(declare-function idlwave-members-only "idlwave")
+(declare-function idlwave-popup-select "idlwave")
+(declare-function idlwave-routine-source-file "idlwave")
+(declare-function idlwave-routines "idlwave")
+(declare-function idlwave-sintern-class "idlwave")
+(declare-function idlwave-sintern-keyword "idlwave")
+(declare-function idlwave-sintern-method "idlwave")
+(declare-function idlwave-sintern-routine-or-method "idlwave")
+(declare-function idlwave-sintern-sysvar "idlwave" t t);idlwave-new-sintern-type
+(declare-function idlwave-sintern-sysvartag "idlwave" t t)
+(declare-function idlwave-substitute-link-target "idlwave")
+(declare-function idlwave-sys-dir "idlwave")
+(declare-function idlwave-this-word "idlwave")
+(declare-function idlwave-what-module-find-class "idlwave")
+(declare-function idlwave-where "idlwave")
 
 (defun idlwave-help-mode ()
   "Major mode for displaying IDL Help.
index abe5cfe648912bee4545a7dea0ba9bc09be2bd80..9648494adc4da7481b5d6e6c3cb067918e648e7b 100644 (file)
     (defmacro defcustom (var value doc &rest args)
       `(defvar ,var ,value ,doc))))
 
+(declare-function idlwave-shell-get-path-info "idlw-shell")
+(declare-function idlwave-shell-temp-file "idlw-shell")
+(declare-function idlwave-shell-is-running "idlw-shell")
+(declare-function widget-value "wid-edit" (widget))
+(declare-function comint-dynamic-complete-filename "comint" ())
+(declare-function Info-goto-node "info" (nodename &optional fork))
+
 (defgroup idlwave nil
   "Major mode for editing IDL .pro files."
   :tag "IDLWAVE"
@@ -7599,6 +7606,7 @@ property indicating the link is added."
 (defvar idlwave-current-class-tags nil)
 (defvar idlwave-current-native-class-tags nil)
 (defvar idlwave-sint-class-tags nil)
+(declare-function idlwave-sintern-class-tag "idlwave" t t)
 (idlwave-new-sintern-type 'class-tag)
 (add-to-list 'idlwave-complete-special 'idlwave-complete-class-structure-tag)
 (add-hook 'idlwave-update-rinfo-hook 'idlwave-class-tag-reset)
@@ -7657,6 +7665,8 @@ property indicating the link is added."
 
 (defvar idlwave-sint-sysvars nil)
 (defvar idlwave-sint-sysvartags nil)
+(declare-function idlwave-sintern-sysvar    "idlwave" t t)
+(declare-function idlwave-sintern-sysvartag "idlwave" t t)
 (idlwave-new-sintern-type 'sysvar)
 (idlwave-new-sintern-type 'sysvartag)
 (add-to-list 'idlwave-complete-special 'idlwave-complete-sysvar-or-tag)
index a0d33f56ee48b35a55e974425efd33367472bfd3..e8246ddb816a40a1f7f67afd9f005bdd847e91ae 100644 (file)
@@ -52,6 +52,8 @@
 (defvar inferior-octave-output-string nil)
 (defvar inferior-octave-receive-in-progress nil)
 
+(declare-function inferior-octave-send-list-and-digest "octave-inf" (list))
+
 (defconst octave-maintainer-address
   "Kurt Hornik <Kurt.Hornik@wu-wien.ac.at>, bug-gnu-emacs@gnu.org"
   "Current maintainer of the Emacs Octave package.")
index bb71491da2d46eaa8df0e0825d831af262bf2352..af456f9828487af013cb4c172541eead29fbb6fc 100644 (file)
@@ -266,7 +266,9 @@ The expansion is entirely correct because it uses the C preprocessor."
     ;; format statements
     ("^[ \t]*format.*=[ \t]*\\(\n\\)" (1 '(7)))
     ;; Funny things in sub arg specifications like `sub myfunc ($$)'
-    ("\\<sub\\s-+\\S-+\\s-*(\\([^)]+\\))" 1 '(1))
+    ;; Be careful not to match "sub { (...) ... }".
+    ("\\<sub[[:space:]]+[^{}[:punct:][:space:]]+[[:space:]]*(\\([^)]+\\))"
+     1 '(1))
     ;; Regexp and funny quotes.
     ("\\(?:[?:.,;=!~({[]\\|\\(^\\)\\)[ \t\n]*\\(/\\)"
      (2 (if (and (match-end 1)
index 3583f54675451a400fa4a15ebc0ad7088af7b564..dd3503f16b05387a155594403b4f94bc3a5626be 100644 (file)
@@ -240,6 +240,11 @@ rigidly along with this one (not yet)."
 (defvar inferior-prolog-mode-syntax-table prolog-mode-syntax-table)
 (defvar inferior-prolog-mode-abbrev-table prolog-mode-abbrev-table)
 
+(declare-function comint-mode "comint")
+(declare-function comint-send-string "comint" (process string))
+(declare-function comint-send-region "comint" (process start end))
+(declare-function comint-send-eof "comint" ())
+
 (define-derived-mode inferior-prolog-mode comint-mode "Inferior Prolog"
   "Major mode for interacting with an inferior Prolog process.
 
index c131575f57c3f19a7fd3f59bc4c6f76d2768213b..6327a68302b6f19b3344698d56b427120353a20e 100644 (file)
@@ -480,6 +480,9 @@ If nil, the following are tried in turn, until success:
       (setq i (1+ i)))))
 
 \f
+
+(declare-function doc-view-minor-mode "doc-view")
+
 ;; PostScript mode.
 
 ;;;###autoload
index f54b7c9f9285dfeb357261aedc8d9240e9073efa..66779acb1033efed984251d441ccc4e14e4f5c1a 100644 (file)
@@ -65,7 +65,6 @@
 ;;; Code:
 
 (eval-when-compile
-  (require 'cl)
   (require 'compile)
   (require 'comint)
   (require 'hippie-exp))
@@ -1224,6 +1223,9 @@ local value.")
     ;; (modify-syntax-entry ?\" "." st)
     st))
 
+;; Autoloaded.
+(declare-function compilation-shell-minor-mode "compile" (&optional arg))
+
 ;; Fixme: This should inherit some stuff from `python-mode', but I'm
 ;; not sure how much: at least some keybindings, like C-c C-f;
 ;; syntax?; font-locking, e.g. for triple-quoted strings?
@@ -1656,6 +1658,8 @@ instance.  Assumes an inferior Python is running."
 \f
 ;;;; Info-look functionality.
 
+(declare-function info-lookup-maybe-add-help "info-look" (&rest arg))
+
 (defun python-after-info-look ()
   "Set up info-look for Python.
 Used with `eval-after-load'."
index e9d9247d7cb96d25e5dea1cdfb2a2afbcf5d92aa..cd08fea29103ec8a9f5377295bae6333495ad767 100644 (file)
@@ -1524,6 +1524,8 @@ with your script for an edit-interpret-debug cycle."
        skeleton-filter-function 'sh-feature
        skeleton-newline-indent-rigidly t
        sh-indent-supported-here nil)
+  (set (make-local-variable 'defun-prompt-regexp)
+       (concat "^\\(function[ \t]\\|[[:alnum:]]+[ \t]+()[ \t]+\\)"))
   (set (make-local-variable 'parse-sexp-ignore-comments) t)
   ;; Parse or insert magic number for exec, and set all variables depending
   ;; on the shell thus determined.
index 7876f9bb47c8e1be898915d2b47feb9fd859e89b..34fdd5fe3df2eb063404771c03596cdea1ca8a6e 100644 (file)
@@ -372,11 +372,9 @@ using `search-forward-regexp' and `replace-match' is preferred." "22.1")
 
 (defun map-query-replace-regexp (regexp to-strings &optional n start end)
   "Replace some matches for REGEXP with various strings, in rotation.
-The second argument TO-STRINGS contains the replacement strings,
-separated by spaces.  Third arg DELIMITED (prefix arg if interactive),
-if non-nil, means replace only matches surrounded by word boundaries.
-This command works like `query-replace-regexp' except that each
-successive replacement uses the next successive replacement string,
+The second argument TO-STRINGS contains the replacement strings, separated
+by spaces.  This command works like `query-replace-regexp' except that
+each successive replacement uses the next successive replacement string,
 wrapping around from the last such string to the first.
 
 In Transient Mark mode, if the mark is active, operate on the contents
@@ -533,9 +531,20 @@ which will run faster and will not set the mark or print anything."
   "Read arguments for `keep-lines' and friends.
 Prompt for a regexp with PROMPT.
 Value is a list, (REGEXP)."
-  (list (read-from-minibuffer prompt nil nil nil
-                             'regexp-history nil t)
-       nil nil t))
+  (let* ((default (list
+                  (regexp-quote
+                   (or (funcall (or find-tag-default-function
+                                    (get major-mode 'find-tag-default-function)
+                                    'find-tag-default))
+                       ""))
+                  (car regexp-search-ring)
+                  (regexp-quote (or (car search-ring) ""))
+                  (car (symbol-value
+                        query-replace-from-history-variable))))
+        (default (delete-dups (delq nil (delete "" default)))))
+    (list (read-from-minibuffer prompt nil nil nil
+                               'regexp-history default t)
+         nil nil t)))
 
 (defun keep-lines (regexp &optional rstart rend interactive)
   "Delete all lines except those containing matches for REGEXP.
@@ -725,6 +734,35 @@ a previously found match."
     (define-key map "q" 'quit-window)
     (define-key map "z" 'kill-this-buffer)
     (define-key map "\C-c\C-f" 'next-error-follow-minor-mode)
+    (define-key map [menu-bar] (make-sparse-keymap))
+    (define-key map [menu-bar occur]
+      (cons "Occur" map))
+    (define-key map [next-error-follow-minor-mode]
+      (menu-bar-make-mm-toggle next-error-follow-minor-mode
+                              "Auto Occurrence Display"
+                              "Display another occurrence when moving the cursor"))
+    (define-key map [separator-1] '("--"))
+    (define-key map [kill-this-buffer] 
+      '("Kill occur buffer" . kill-this-buffer))
+    (define-key map [quit-window] 
+      '("Quit occur window" . quit-window))
+    (define-key map [revert-buffer] 
+      '("Revert occur buffer" . revert-buffer))
+    (define-key map [clone-buffer] 
+      '("Clone occur buffer" . clone-buffer))
+    (define-key map [occur-rename-buffer] 
+      '("Rename occur buffer" . occur-rename-buffer))
+    (define-key map [separator-2] '("--"))
+    (define-key map [occur-mode-goto-occurrence-other-window]
+      '("Go To Occurrence Other Window" . occur-mode-goto-occurrence-other-window))
+    (define-key map [occur-mode-goto-occurrence]
+      '("Go To Occurrence" . occur-mode-goto-occurrence))
+    (define-key map [occur-mode-display-occurrence]
+      '("Display Occurrence" . occur-mode-display-occurrence))
+    (define-key map [occur-next] 
+      '("Move to next match" . occur-next))
+    (define-key map [occur-prev] 
+      '("Move to previous match" . occur-prev))
     map)
   "Keymap for `occur-mode'.")
 
@@ -938,23 +976,29 @@ which means to discard all text properties."
       (nreverse result))))
 
 (defun occur-read-primary-args ()
-  (list (let* ((default (car regexp-history))
-              (input
-               (read-from-minibuffer
-                (if default
-                    (format "List lines matching regexp (default %s): "
-                            (query-replace-descr default))
-                  "List lines matching regexp: ")
-                nil
-                nil
-                nil
-                'regexp-history
-                default)))
-         (if (equal input "")
-             default
-           input))
-       (when current-prefix-arg
-         (prefix-numeric-value current-prefix-arg))))
+  (let* ((default
+          (list (and transient-mark-mode mark-active
+                     (regexp-quote
+                      (buffer-substring-no-properties
+                       (region-beginning) (region-end))))
+                (regexp-quote
+                 (or (funcall
+                      (or find-tag-default-function
+                          (get major-mode 'find-tag-default-function)
+                          'find-tag-default))
+                     ""))
+                (car regexp-search-ring)
+                (regexp-quote (or (car search-ring) ""))
+                (car (symbol-value
+                      query-replace-from-history-variable))))
+        (default (delete-dups (delq nil (delete "" default))))
+        (input
+         (read-from-minibuffer
+          "List lines matching regexp: "
+          nil nil nil 'regexp-history default)))
+    (list input
+         (when current-prefix-arg
+           (prefix-numeric-value current-prefix-arg)))))
 
 (defun occur-rename-buffer (&optional unique-p interactive-p)
   "Rename the current *Occur* buffer to *Occur: original-buffer-name*.
index 3a5f24cbe8f8ebb6dcde3e0a5256bce0c3172554..6ebbe57840d261d337653334ad4c0d12633c913b 100644 (file)
@@ -171,8 +171,6 @@ first comment line visible (if point is in a comment)."
           ;;(repos-debug-macro "4")
           ))))
 
-;;;###autoload (define-key esc-map "\C-l" 'reposition-window)
-
 ;;; Auxiliary functions
 
 ;; Return number of screen lines between START and END.
index b6f3a76ff232f1fe3a20b8c1e6c600f511feee31..df2deb6c14c08f21340ea93767be9b1ae7f41a81 100644 (file)
@@ -205,13 +205,15 @@ may have changed\) back to `save-place-alist'."
       (setq save-place-alist (cdr save-place-alist)))))
 
 (defun save-place-alist-to-file ()
-  (let ((file (expand-file-name save-place-file)))
+  (let ((file (expand-file-name save-place-file))
+        (coding-system-for-write 'utf-8))
     (save-excursion
-      (message "Saving places to %s..." file)
       (set-buffer (get-buffer-create " *Saved Places*"))
       (delete-region (point-min) (point-max))
       (when save-place-forget-unreadable-files
        (save-place-forget-unreadable-files))
+      (insert (format ";;; -*- coding: %s -*-\n"
+                      (symbol-name coding-system-for-write)))
       (let ((print-length nil)
             (print-level nil))
         (print save-place-alist (current-buffer)))
@@ -224,10 +226,9 @@ may have changed\) back to `save-place-alist'."
                t))))
        (condition-case nil
            ;; Don't use write-file; we don't want this buffer to visit it.
-           (write-region (point-min) (point-max) file)
-         (file-error (message "Can't write %s" file)))
-        (kill-buffer (current-buffer))
-        (message "Saving places to %s...done" file)))))
+            (write-region (point-min) (point-max) file)
+         (file-error (message "Saving places: can't write %s" file)))
+        (kill-buffer (current-buffer))))))
 
 (defun load-save-place-alist-from-file ()
   (if (not save-place-loaded)
@@ -238,7 +239,6 @@ may have changed\) back to `save-place-alist'."
           ;; load it if it exists:
           (if (file-readable-p file)
               (save-excursion
-                (message "Loading places from %s..." file)
                 ;; don't want to use find-file because we have been
                 ;; adding hooks to it.
                 (set-buffer (get-buffer-create " *Saved Places*"))
@@ -266,8 +266,7 @@ may have changed\) back to `save-place-alist'."
                             (setq count (1+ count)))
                           (setq s (cdr s))))))
 
-                (kill-buffer (current-buffer))
-                (message "Loading places from %s...done" file)))
+                (kill-buffer (current-buffer))))
           nil))))
 
 (defun save-places-to-alist ()
index 14e53f75daa22b660a2e80d77e01959efdc02e6f..35c103d1c1505740d17f38a96a0cea0962826965 100644 (file)
@@ -166,6 +166,8 @@ prefix argument, it uses the text of the region as the selection value ."
 \f
 ;;; Cut Buffer support
 
+(declare-function x-get-cut-buffer-internal "xselect.c")
+
 (defun x-get-cut-buffer (&optional which-one)
   "Returns the value of one of the 8 X server cut-buffers.
 Optional arg WHICH-ONE should be a number from 0 to 7, defaulting to 0.
@@ -177,6 +179,9 @@ Cut buffers are considered obsolete; you should use selections instead."
             which-one)
      'CUT_BUFFER0)))
 
+(declare-function x-rotate-cut-buffers-internal "xselect.c")
+(declare-function x-store-cut-buffer-internal "xselect.c")
+
 (defun x-set-cut-buffer (string &optional push)
   "Store STRING into the X server's primary cut buffer.
 If PUSH is non-nil, also rotate the cut buffers:
index 329010cc95026657ec4fa297afa14b224f2820c2..e6477b92d6f6579d6bf8551d19ad77c9900ef529 100644 (file)
@@ -811,17 +811,18 @@ The following commands are accepted by the client:
                 tty-type             ;string.
                (files nil)
                (lineno 1)
-               (columnno 0))
+               (columnno 0)
+               command-line-args-left
+               arg)
            ;; Remove this line from STRING.
            (setq string (substring string (match-end 0)))
-           (while (string-match " *[^ ]* " request)
-             (let ((arg (substring request (match-beginning 0)
-                                    (1- (match-end 0)))))
-               (setq request (substring request (match-end 0)))
+           (setq command-line-args-left
+                 (mapcar 'server-unquote-arg (split-string request " " t)))
+           (while (setq arg (pop command-line-args-left))
                (cond
                 ;; -version CLIENT-VERSION: obsolete at birth.
-                ((and (equal "-version" arg) (string-match "[^ ]+ " request))
-                  (setq request (substring request (match-end 0))))
+                ((and (equal "-version" arg) command-line-args-left)
+                 (pop command-line-args-left))
 
                 ;; -nowait:  Emacsclient won't wait for a result.
                 ((equal "-nowait" arg) (setq nowait t))
@@ -831,10 +832,8 @@ The following commands are accepted by the client:
 
                 ;; -display DISPLAY:
                 ;; Open X frames on the given display instead of the default.
-                ((and (equal "-display" arg)
-                       (string-match "\\([^ ]*\\) " request))
-                  (setq display (match-string 1 request))
-                 (setq request (substring request (match-end 0))))
+                ((and (equal "-display" arg) command-line-args-left)
+                 (setq display (pop command-line-args-left)))
 
                 ;; -window-system:  Open a new X frame.
                 ((equal "-window-system" arg)
@@ -863,33 +862,32 @@ The following commands are accepted by the client:
 
                 ;; -ignore COMMENT:  Noop; useful for debugging emacsclient.
                 ;; (The given comment appears in the server log.)
-                ((and (equal "-ignore" arg) (string-match "[^ ]* " request))
-                 (setq dontkill t
-                       request (substring request (match-end 0))))
+                ((and (equal "-ignore" arg) command-line-args-left
+                 (setq dontkill t)
+                 (pop command-line-args-left)))
 
                 ;; -tty DEVICE-NAME TYPE:  Open a new tty frame at the client.
                 ((and (equal "-tty" arg)
-                       (string-match "\\([^ ]*\\) \\([^ ]*\\) " request))
-                  (setq tty-name (match-string 1 request))
-                  (setq tty-type (match-string 2 request))
-                  (setq dontkill t)
-                  (setq request (substring request (match-end 0))))
+                       (cdr command-line-args-left))
+                  (setq tty-name (pop command-line-args-left)
+                       tty-type (pop command-line-args-left)
+                       dontkill t))
 
                 ;; -position LINE[:COLUMN]:  Set point to the given
                 ;;  position in the next file.
                 ((and (equal "-position" arg)
-                       (string-match "\\+\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)? "
-                                     request))
-                 (setq lineno (string-to-number (match-string 1 request))
+                      command-line-args-left
+                       (string-match "\\+\\([0-9]+\\)\\(?::\\([0-9]+\\)\\)?"
+                                     (car command-line-args-left)))
+                 (setq arg (pop command-line-args-left))
+                 (setq lineno (string-to-number (match-string 1 arg))
                        columnno (if (null (match-end 2)) 0
-                                   (string-to-number (match-string 2 request)))
-                       request (substring request (match-end 0))))
+                                   (string-to-number (match-string 2 arg)))))
 
                 ;; -file FILENAME:  Load the given file.
                 ((and (equal "-file" arg)
-                       (string-match "\\([^ ]+\\) " request))
-                 (let ((file (server-unquote-arg (match-string 1 request))))
-                   (setq request (substring request (match-end 0)))
+                      command-line-args-left)
+                 (let ((file (pop command-line-args-left)))
                    (if coding-system
                        (setq file (decode-coding-string file coding-system)))
                    (setq file (command-line-normalize-file-name file))
@@ -901,10 +899,8 @@ The following commands are accepted by the client:
 
                 ;; -eval EXPR:  Evaluate a Lisp expression.
                 ((and (equal "-eval" arg)
-                       (string-match "\\([^ ]+\\) " request))
-                 (lexical-let ((expr (server-unquote-arg
-                                       (match-string 1 request))))
-                   (setq request (substring request (match-end 0)))
+                       command-line-args-left)
+                 (lexical-let ((expr (pop command-line-args-left)))
                    (if coding-system
                        (setq expr (decode-coding-string expr coding-system)))
                     (push (lambda () (server-eval-and-print expr proc))
@@ -913,23 +909,21 @@ The following commands are accepted by the client:
                          columnno 0)))
 
                 ;; -env NAME=VALUE:  An environment variable.
-                ((and (equal "-env" arg) (string-match "\\([^ ]+\\) " request))
-                 (let ((var (server-unquote-arg (match-string 1 request))))
+                ((and (equal "-env" arg) command-line-args-left)
+                 (let ((var (pop command-line-args-left)))
                    ;; XXX Variables should be encoded as in getenv/setenv.
-                   (setq request (substring request (match-end 0)))
                     (process-put proc 'env
                                  (cons var (process-get proc 'env)))))
 
                 ;; -dir DIRNAME:  The cwd of the emacsclient process.
-                ((and (equal "-dir" arg) (string-match "\\([^ ]+\\) " request))
-                 (setq dir (server-unquote-arg (match-string 1 request)))
-                 (setq request (substring request (match-end 0)))
+                ((and (equal "-dir" arg) command-line-args-left)
+                 (setq dir (pop command-line-args-left))
                  (if coding-system
                      (setq dir (decode-coding-string dir coding-system)))
                  (setq dir (command-line-normalize-file-name dir)))
 
                 ;; Unknown command.
-                (t (error "Unknown command: %s" arg)))))
+                (t (error "Unknown command: %s" arg))))
 
             (setq frame
                   (case tty-name
similarity index 96%
rename from lisp/gnus/sha1.el
rename to lisp/sha1.el
index 146aa6374a0b9bd9620efef62f0984b9c227bc33..0026866c18711df205aa28489ecec3b84aea7c77 100644 (file)
@@ -6,21 +6,21 @@
 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
 ;; Keywords: SHA1, FIPS 180-1
 
-;; This file is part of FLIM (Faithful Library about Internet Message).
+;; This file is 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, or
-;; (at your option) any later version.
+;; 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, or (at your option)
+;; any later version.
 
-;; This program is distributed in the hope that it will be useful,
+;; 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 this program; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 ;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
index f6a8818e5a92fef47387ccd0b2fcbb0e6d0c49e1..bdf55d859b2d785b5db7965a3b52dfb2f9e30e76 100644 (file)
@@ -1633,7 +1633,7 @@ as an argument limits undo to changes within the current region."
         (delete-auto-save-file-if-necessary recent-save))
     ;; Display a message announcing success.
     (if message
-       (message message))))
+       (message "%s" message))))
 
 (defun buffer-disable-undo (&optional buffer)
   "Make BUFFER stop keeping undo information.
@@ -5646,7 +5646,7 @@ front of the list of recently selected ones."
 ;;; Handling of Backspace and Delete keys.
 
 (defcustom normal-erase-is-backspace 'maybe
-  "Set the default behaviour of the Delete and Backspace keys.
+  "Set the default behavior of the Delete and Backspace keys.
 
 If set to t, Delete key deletes forward and Backspace key deletes
 backward.
@@ -5654,7 +5654,7 @@ backward.
 If set to nil, both Delete and Backspace keys delete backward.
 
 If set to 'maybe (which is the default), Emacs automatically
-selects a behaviour.  On window systems, the behaviour depends on
+selects a behavior.  On window systems, the behavior depends on
 the keyboard used.  If the keyboard has both a Backspace key and
 a Delete key, and both are mapped to their usual meanings, the
 option's default value is set to t, so that Backspace can be used
index 18ca1a3418189684cb4fa0f49643391c802dcabf..dcbb97bd79cf9a951d54165edca79d849e359d5b 100644 (file)
@@ -905,6 +905,7 @@ replace chars to try and eliminate some spurious differences."
 (defvar ediff-buffer-C)
 (defvar ediff-ancestor-buffer)
 (defvar ediff-quit-hook)
+(declare-function ediff-cleanup-mess "ediff-util" nil)
 
 ;;;###autoload
 (defun smerge-ediff (&optional name-mine name-other name-base)
index 16cb891355943295ec17340818dc48daed8cecd2..d16d4d26693ce862d39c78180470f76c8baee121 100644 (file)
@@ -36,6 +36,42 @@ Each element of this list holds the arguments to one call to `defcustom'.")
   (setq custom-declare-variable-list
        (cons arguments custom-declare-variable-list)))
 
+(defmacro declare-function (fn file &optional arglist fileonly)
+  "Tell the byte-compiler that function FN is defined, in FILE.
+Optional ARGLIST is the argument list used by the function.  The
+FILE argument is not used by the byte-compiler, but by the
+`check-declare' package, which checks that FILE contains a
+definition for FN.  ARGLIST is used by both the byte-compiler and
+`check-declare' to check for consistency.
+
+FILE can be either a Lisp file (in which case the \".el\"
+extension is optional), or a C file.  C files are expanded
+relative to the Emacs \"src/\" directory.  Lisp files are
+searched for using `locate-library', and if that fails they are
+expanded relative to the location of the file containing the
+declaration.  A FILE with an \"ext:\" prefix is an external file.
+`check-declare' will check such files if they are found, and skip
+them without error if they are not.
+
+FILEONLY non-nil means that `check-declare' will only check that
+FILE exists, not that it defines FN.  This is intended for
+function-definitions that `check-declare' does not recognize, e.g.
+`defstruct'.
+
+To specify a value for FILEONLY without passing an argument list,
+set ARGLIST to `t'.  This is necessary because `nil' means an
+empty argument list, rather than an unspecified one.
+
+Note that for the purposes of `check-declare', this statement
+must be the first non-whitespace on a line, and everything up to
+the end of FILE must be all on the same line.  For example:
+
+\(declare-function c-end-of-defun \"progmodes/cc-cmds.el\"
+                  \(&optional arg))
+
+For more information, see Info node `elisp(Declaring Functions)'."
+  ;; Does nothing - byte-compile-declare-function does the work.
+  nil)
 \f
 ;;;; Basic Lisp macros.
 
@@ -723,7 +759,9 @@ even when EVENT actually has modifiers."
     (if (listp type)
        (setq type (car type)))
     (if (symbolp type)
-       (cdr (get type 'event-symbol-elements))
+        ;; Don't read event-symbol-elements directly since we're not
+        ;; sure the symbol has already been parsed.
+       (cdr (internal-event-symbol-parse-modifiers type))
       (let ((list nil)
            (char (logand type (lognot (logior ?\M-\^@ ?\C-\^@ ?\S-\^@
                                               ?\H-\^@ ?\s-\^@ ?\A-\^@)))))
@@ -858,7 +896,8 @@ and `event-end' functions."
             (x (/ (car pair) (frame-char-width frame)))
             (y (/ (cdr pair) (+ (frame-char-height frame)
                                 (or (frame-parameter frame 'line-spacing)
-                                    default-line-spacing
+                                     ;; FIXME: Why the `default'?
+                                    (default-value 'line-spacing)
                                     0)))))
        (cons x y))))))
 
@@ -945,7 +984,7 @@ is converted into a string by expressing it in decimal."
 (make-obsolete 'focus-frame "it does nothing." "22.1")
 (defalias 'unfocus-frame 'ignore "")
 (make-obsolete 'unfocus-frame "it does nothing." "22.1")
-(make-obsolete 'make-variable-frame-local "use a frame-parameter instead" "22.2")
+(make-obsolete 'make-variable-frame-local "use a frame-parameter instead." "22.2")
 \f
 ;;;; Obsolescence declarations for variables, and aliases.
 
@@ -1537,6 +1576,23 @@ FILE should be the name of a library, with no directory name."
 \f
 ;;;; Process stuff.
 
+(defun process-lines (program &rest args)
+  "Execute PROGRAM with ARGS, returning its output as a list of lines.
+Signal an error if the program returns with a non-zero exit status."
+  (with-temp-buffer
+    (let ((status (apply 'call-process program nil (current-buffer) nil args)))
+      (unless (eq status 0)
+       (error "%s exited with status %s" program status))
+      (goto-char (point-min))
+      (let (lines)
+       (while (not (eobp))
+         (setq lines (cons (buffer-substring-no-properties
+                            (line-beginning-position)
+                            (line-end-position))
+                           lines))
+         (forward-line 1))
+       (nreverse lines)))))
+
 ;; open-network-stream is a wrapper around make-network-process.
 
 (when (featurep 'make-network-process)
@@ -2099,6 +2155,8 @@ a system-dependent default device name is used."
       (play-sound-internal sound)
     (error "This Emacs binary lacks sound support")))
 
+(declare-function w32-shell-dos-semantics "w32-fns" nil)
+
 (defun shell-quote-argument (argument)
   "Quote an argument for passing as argument to an inferior shell."
   (if (or (eq system-type 'ms-dos)
index e81f71c582f2cb1aa7eaaede8883a3d0921a8e6e..3c648b9e6b3cf41e175712fea61bcd2a809861e3 100644 (file)
 (defvar mac-font-panel-mode)
 (defvar mac-ts-active-input-overlay)
 (defvar x-invocation-args)
+(declare-function mac-code-convert-string "mac.c")
+(declare-function mac-coerce-ae-data "mac.c")
+(declare-function mac-resume-apple-event "macselect.c")
+;; Suppress warning when compiling on non-Mac.
+(declare-function mac-font-panel-mode "mac-win.el")
+(declare-function mac-atsu-font-face-attributes "macfns.c")
+(declare-function mac-ae-set-reply-parameter "macselect.c")
+(declare-function mac-clear-font-name-table "macfns.c")
 
 (defvar x-command-line-resources nil)
 
@@ -1058,28 +1066,31 @@ XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp")
 \f
 ;;;; Function keys
 
-(substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame
-                          global-map)
-
 (defun x-setup-function-keys (frame)
   "Setup Function Keys for mac."
-;; Map certain keypad keys into ASCII characters
-;; that people usually expect.
-(define-key local-function-key-map [backspace] [?\d])
-(define-key local-function-key-map [delete] [?\d])
-(define-key local-function-key-map [tab] [?\t])
-(define-key local-function-key-map [linefeed] [?\n])
-(define-key local-function-key-map [clear] [?\C-l])
-(define-key local-function-key-map [return] [?\C-m])
-(define-key local-function-key-map [escape] [?\e])
-(define-key local-function-key-map [M-backspace] [?\M-\d])
-(define-key local-function-key-map [M-delete] [?\M-\d])
-(define-key local-function-key-map [M-tab] [?\M-\t])
-(define-key local-function-key-map [M-linefeed] [?\M-\n])
-(define-key local-function-key-map [M-clear] [?\M-\C-l])
-(define-key local-function-key-map [M-return] [?\M-\C-m])
-(define-key local-function-key-map [M-escape] [?\M-\e])
-)
+  ;; Don't do this twice on the same display, or it would break
+  ;; normal-erase-is-backspace-mode.
+  (unless (terminal-parameter frame 'x-setup-function-keys)
+    (with-selected-frame frame
+      ;; Map certain keypad keys into ASCII characters
+      ;; that people usually expect.
+      (define-key local-function-key-map [backspace] [?\d])
+      (define-key local-function-key-map [delete] [?\d])
+      (define-key local-function-key-map [tab] [?\t])
+      (define-key local-function-key-map [linefeed] [?\n])
+      (define-key local-function-key-map [clear] [?\C-l])
+      (define-key local-function-key-map [return] [?\C-m])
+      (define-key local-function-key-map [escape] [?\e])
+      (define-key local-function-key-map [M-backspace] [?\M-\d])
+      (define-key local-function-key-map [M-delete] [?\M-\d])
+      (define-key local-function-key-map [M-tab] [?\M-\t])
+      (define-key local-function-key-map [M-linefeed] [?\M-\n])
+      (define-key local-function-key-map [M-clear] [?\M-\C-l])
+      (define-key local-function-key-map [M-return] [?\M-\C-m])
+      (define-key local-function-key-map [M-escape] [?\M-\e])
+      (substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame
+                                local-function-key-map global-map))
+    (set-terminal-parameter frame 'x-setup-function-keys t)))
 
 ;; These tell read-char how to convert
 ;; these special chars to ASCII.
@@ -1811,6 +1822,9 @@ if possible.  If there's no such frame, a new frame is created."
       ;; Reaches here if the user has canceled the quit.
       (mac-resume-apple-event ae -128)))) ; userCanceledErr
 
+;; url-generic-parse-url is autoloaded from url-parse.
+(declare-function url-type "url-parse" t t) ; defstruct
+
 (defun mac-ae-get-url (event)
   "Open the URL specified by the Apple event EVENT.
 Currently the `mailto' scheme is supported."
index ecbda7d9c1e18d75e3a2e020e9983c13cfbde324..2ddb4e404332340092b29bc3c38301f02ac95eb1 100644 (file)
 
 (load "term/internal" nil t)
 
+(declare-function msdos-remember-default-colors "msdos.c")
+(declare-function w16-set-clipboard-data "w16select.c")
+(declare-function w16-get-clipboard-data "w16select.c")
+
 ;;; This is copied from etc/rgb.txt, except that some values were changed
 ;;; a bit to make them consistent with DOS console colors, and the RGB
 ;;; values were scaled up to 16 bits, as `tty-define-color' requires.
index 70323e3155b702491ed50268024e1a4606deaa3c..5622efa022d074b3675b871f5620055acbdc89f2 100644 (file)
@@ -63,7 +63,6 @@
 ;;; Code:
 
 (defvar msdos-color-values)
-(defvar w32-tty-standard-colors)
 
 ;; The following list is taken from rgb.txt distributed with X.
 ;;
@@ -816,8 +815,6 @@ Value is the modified color alist for FRAME."
   "Register the default set of colors for a character terminal."
   (let* ((colors (cond ((eq window-system 'pc)
                        msdos-color-values)
-                      ((eq system-type 'windows-nt)
-                       w32-tty-standard-colors)
                       (t tty-standard-colors)))
         (color (car colors)))
     (while colors
index 688dd7deea89b974ca0e3601ce89691c160f6e69..bdaeaf1b52eb65b6ab5b3bd2fdc4875439cc4e37 100644 (file)
 (defvar xlfd-regexp-registry-subnum)
 (defvar w32-color-map) ;; defined in w32fns.c
 
+(declare-function w32-send-sys-command "w32fns.c")
+(declare-function w32-select-font "w32fns.c")
+(declare-function set-message-beep "w32console.c")
+
 ;; Conditional on new-fontset so bootstrapping works on non-GUI compiles
 (if (fboundp 'new-fontset)
     (require 'fontset))
@@ -1053,17 +1057,6 @@ XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp")
  If FRAME is nil or not given, use the selected frame."
    (interactive "i")
    (w32-send-sys-command ?\xf100 frame))
-
-(defun x-setup-function-keys (frame)
-  "Setup Function Keys for w32."
-  (with-selected-frame frame
-     (define-key local-function-key-map [f10] 'menu-bar-open)
-
-     (substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame
-                                local-function-key-map global-map)
-
-     (define-key local-function-key-map [S-tab] [backtab]))
-  (set-terminal-parameter frame 'x-setup-function-keys t))
 \f
 
 ;; W32 systems have different fonts than commonly found on X, so
diff --git a/lisp/term/w32console.el b/lisp/term/w32console.el
new file mode 100644 (file)
index 0000000..f45d7e0
--- /dev/null
@@ -0,0 +1,65 @@
+;;; w32console.el -- Setup w32 console keys and colors.
+
+;; Copyright (C) 2007 Free Software Foundation, Inc.
+
+;; Author: FSF
+;; Keywords: terminals
+
+;; 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, 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., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+;; W32 uses different color indexes than standard:
+
+(defvar w32-tty-standard-colors
+  '(("black"          0     0     0     0)
+    ("blue"           1     0     0 52480) ; MediumBlue
+    ("green"          2  8704 35584  8704) ; ForestGreen
+    ("cyan"           3     0 52736 53504) ; DarkTurquoise
+    ("red"            4 45568  8704  8704) ; FireBrick
+    ("magenta"        5 35584     0 35584) ; DarkMagenta
+    ("brown"          6 40960 20992 11520) ; Sienna
+    ("lightgray"      7 48640 48640 48640) ; Gray
+    ("darkgray"       8 26112 26112 26112) ; Gray40
+    ("lightblue"      9     0     0 65535) ; Blue
+    ("lightgreen"    10     0 65535     0) ; Green
+    ("lightcyan"     11     0 65535 65535) ; Cyan
+    ("lightred"      12 65535     0     0) ; Red
+    ("lightmagenta"  13 65535     0 65535) ; Magenta
+    ("yellow"        14 65535 65535     0) ; Yellow
+    ("white"         15 65535 65535 65535))
+"A list of VGA console colors, their indices and 16-bit RGB values.")
+
+(defun terminal-init-w32console ()
+  "Terminal initialization function for w32 console."
+  ;; Share function key initialization with w32 gui frames
+  (x-setup-function-keys (selected-frame))
+  (let* ((colors w32-tty-standard-colors)
+         (color (car colors)))
+    (tty-color-clear)
+    (while colors
+      (tty-color-define (car color) (cadr color) (cddr color))
+      (setq colors (cdr colors)
+            color (car colors))))
+  (clear-face-cache)
+  (tty-set-up-initial-frame-faces)
+  (run-hooks 'terminal-init-w32-hook))
+
+;; arch-tag: 3195fd5e-ab86-4a46-b1dc-4f7a8c8deff3
index eb2e559a0d1e1c42524dff4be93d03372458a98a..ffd2a98c6b0cf3d43f61e6d93abab0e32103186c 100644 (file)
@@ -2576,15 +2576,18 @@ If you don't want stock icons, set the variable to nil."
 
 (defun x-gtk-map-stock (file)
   "Map icon with file name FILE to a Gtk+ stock name, using `x-gtk-stock-map'."
-  (let* ((file-sans (file-name-sans-extension file))
-        (key (and (string-match "/\\([^/]+/[^/]+/[^/]+$\\)" file-sans)
-                  (match-string 1 file-sans)))
-        (value))
-    (mapc (lambda (elem)
-           (let ((assoc (if (symbolp elem) (symbol-value elem) elem)))
-             (or value (setq value (assoc-string (or key file-sans) assoc)))))
-           icon-map-list)
-    (and value (cdr value))))
+  (if (stringp file)
+      (let* ((file-sans (file-name-sans-extension file))
+            (key (and (string-match "/\\([^/]+/[^/]+/[^/]+$\\)" file-sans)
+                      (match-string 1 file-sans)))
+            (value))
+       (mapc (lambda (elem)
+               (let ((assoc (if (symbolp elem) (symbol-value elem) elem)))
+                 (or value (setq value (assoc-string (or key file-sans)
+                                                     assoc)))))
+             icon-map-list)
+       (and value (cdr value)))
+    nil))
 
 (provide 'x-win)
 
index 8660f75fa95316d1e57703e2f676cccc9e3e3544..83af2156831c4a2dc645200a8461041350808d65 100644 (file)
 (defvar css-font-lock-defaults
   '(css-font-lock-keywords nil t))
 
-(unless (fboundp 'prog-mode) (defalias 'prog-mode 'fundamental-mode))
-
 ;;;###autoload (add-to-list 'auto-mode-alist '("\\.css\\'" . css-mode))
 ;;;###autoload
-(define-derived-mode css-mode prog-mode "CSS"
+(define-derived-mode css-mode fundamental-mode "CSS"
   "Major mode to edit Cascading Style Sheets."
   (set (make-local-variable 'font-lock-defaults) css-font-lock-defaults)
   (set (make-local-variable 'comment-start) "/*")
index 27c425de4483d9297c6b0c2c3e6eb69657ca2612..0516a4ab8a54537270a342611c972eaea4681fd3 100644 (file)
@@ -836,6 +836,10 @@ in the active region."
                   (fill-region-as-paragraph beg end justify))))))
      fill-pfx)))
 
+(declare-function comment-search-forward "newcomment" (limit &optional noerror))
+(declare-function comment-string-strip "newcomment" (str beforep afterp))
+
+
 (defun fill-comment-paragraph (&optional justify)
   "Fill current comment.
 If we're not in a comment, just return nil so that the caller
index 73e8ec490450a03bde04dcc971406891f544be81..16265ae42d1568d318eeb8eb63b5eb854471ebf4 100644 (file)
@@ -1531,29 +1531,42 @@ The buffer to mark them in is `flyspell-large-region-buffer'."
     (if flyspell-issue-message-flag (message "Checking region..."))
     (set-buffer curbuf)
     (ispell-check-version)
-    (let ((c (apply 'ispell-call-process-region beg
-                   end
-                   ispell-program-name
-                   nil
-                   buffer
-                   nil
-                   (if ispell-really-aspell "list" "-l")
-                   (let (args)
-                     ;; Local dictionary becomes the global dictionary in use.
-                     (if ispell-local-dictionary
-                         (setq ispell-dictionary ispell-local-dictionary))
-                     (setq args (ispell-get-ispell-args))
-                     (if ispell-dictionary ; use specified dictionary
-                         (setq args
-                               (append (list "-d" ispell-dictionary) args)))
-                     (if ispell-personal-dictionary ; use specified pers dict
-                         (setq args
-                               (append args
-                                       (list "-p"
-                                             (expand-file-name
-                                              ispell-personal-dictionary)))))
-                     (setq args (append args ispell-extra-args))
-                     args))))
+    ;; Local dictionary becomes the global dictionary in use.
+    (setq ispell-current-dictionary
+         (or ispell-local-dictionary ispell-dictionary))
+    (setq ispell-current-personal-dictionary
+         (or ispell-local-pdict ispell-personal-dictionary))
+    (let ((args (ispell-get-ispell-args))
+         (encoding (ispell-get-coding-system))
+         c)
+      (if (and ispell-current-dictionary  ; use specified dictionary
+              (not (member "-d" args)))  ; only define if not overridden
+         (setq args
+               (append (list "-d" ispell-current-dictionary) args)))
+      (if ispell-current-personal-dictionary ; use specified pers dict
+         (setq args
+               (append args
+                       (list "-p"
+                             (expand-file-name
+                              ispell-current-personal-dictionary)))))
+      (setq args (append args ispell-extra-args))
+      (if (and ispell-really-aspell
+              ispell-aspell-supports-utf8)
+         (setq args
+               (append args
+                       (list
+                        (concat "--encoding="
+                                (symbol-name
+                                 encoding))))))
+      (let ((process-coding-system-alist (list (cons "\\.*" encoding))))
+       (setq c (apply 'ispell-call-process-region beg
+                      end
+                      ispell-program-name
+                      nil
+                      buffer
+                      nil
+                      (if ispell-really-aspell "list" "-l")
+                      args)))
       (if (eq c 0)
          (progn
            (flyspell-process-localwords buffer)
index 926e0debda15a09a2943f520ffec9f0cf4f142f7..163f436e53dcdecd07e0b85875e5fcc3b49fd1a8 100644 (file)
@@ -981,7 +981,7 @@ Assumes that value contains no whitespace."
                "[^[:alpha:]]"
                (regexp-opt otherchars)
                t                            ; We can't tell, so set this to t
-               (list "-d" dict-name "--encoding=utf-8")
+               (list "-d" dict-name)
                nil                             ; aspell doesn't support this
                ;; Here we specify the encoding to use while communicating with
                ;; aspell.  This doesn't apply to command line arguments, so
@@ -1161,12 +1161,13 @@ The variable `ispell-library-directory' defines the library location."
              (delete-menu-item '("Edit" "Spell")) ; in case already defined
              (add-menu '("Edit") "Spell" ispell-menu-xemacs))))))
 
-;;; Allow incrementing characters as integers in XEmacs 20
-(if (and (featurep 'xemacs)
-        (fboundp 'int-char))
-    (fset 'ispell-int-char 'int-char)
-  ;; Emacs and XEmacs 19 or earlier
-  (fset 'ispell-int-char 'identity))
+(defalias 'ispell-int-char
+  ;; Allow incrementing characters as integers in XEmacs 20
+  (if (and (featurep 'xemacs)
+          (fboundp 'int-char))
+      'int-char
+    ;; Emacs and XEmacs 19 or earlier
+    'identity))
 
 
 ;;; **********************************************************************
@@ -2480,6 +2481,13 @@ Keeps argument list for future ispell invocations for no async support."
              (append args
                      (list "-p"
                            (expand-file-name ispell-current-personal-dictionary)))))
+    (if (and ispell-really-aspell
+            ispell-aspell-supports-utf8)
+       (setq args
+             (append args
+                     (list
+                      (concat "--encoding="
+                              (symbol-name (ispell-get-coding-system)))))))
     (setq args (append args ispell-extra-args))
 
     ;; Initially we don't know any buffer's local words.
@@ -3503,9 +3511,9 @@ You can bind this to the key C-c i in GNUS or mail by adding to
           (cite-regexp                 ;Prefix of quoted text
            (cond
             ((functionp 'sc-cite-regexp)       ; sc 3.0
-             (concat "\\(" (sc-cite-regexp) "\\)" "\\|"
-                     (with-no-warnings
-                      (ispell-non-empty-string sc-reference-tag-string))))
+             (with-no-warnings
+               (concat "\\(" (sc-cite-regexp) "\\)" "\\|"
+                       (ispell-non-empty-string sc-reference-tag-string))))
             ((boundp 'sc-cite-regexp)          ; sc 2.3
              (concat "\\(" sc-cite-regexp "\\)" "\\|"
                      (with-no-warnings
index b1b31b622d179cf025a7ef82c303a817236408bb..eef1c10e5b6fe3e7070ef7e6f52c5e3e2bd78a4c 100644 (file)
@@ -1077,9 +1077,8 @@ Valid parameters are
             (path (insert (format "\\href{%s}{%s}" path desc)))
             (t (insert "\\texttt{" desc "}")))))))
 
-(defun org-export-latex-cleaned-string 
+(defun org-export-latex-cleaned-string (&optional commentsp)
   ;; FIXME remove commentsp call in org.el and here
-  (&optional commentsp)
   "Clean stuff in the LaTeX export."
 
   ;; Preserve line breaks
index b555e6c11022eca45fc9a01379711127a99ec251..0535f679c402f19b13ebb46febe112dd64c603d9 100644 (file)
@@ -3883,6 +3883,84 @@ If it is less than 8, the level-1 face gets re-used for level N+1 etc."
   :type 'number
   :group 'org-faces)
 
+;;; Function declarations.
+(declare-function add-to-diary-list "diary-lib"
+                  (date string specifier &optional marker globcolor literal))
+(declare-function table--at-cell-p "table" (position &optional object at-column))
+(declare-function Info-find-node "info" (filename nodename &optional no-going-back))
+(declare-function Info-goto-node "info" (nodename &optional fork))
+(declare-function bbdb "ext:bbdb-com" (string elidep))
+(declare-function bbdb-company "ext:bbdb-com" (string elidep))
+(declare-function bbdb-current-record "ext:bbdb-com" (&optional planning-on-modifying))
+(declare-function bbdb-name "ext:bbdb-com" (string elidep))
+(declare-function bbdb-record-getprop "ext:bbdb" (record property))
+(declare-function bbdb-record-name "ext:bbdb" (record))
+(declare-function bibtex-beginning-of-entry "bibtex" ())
+(declare-function bibtex-generate-autokey "bibtex" ())
+(declare-function bibtex-parse-entry "bibtex" (&optional content))
+(declare-function bibtex-url "bibtex" (&optional pos no-browse))
+(declare-function calendar-astro-date-string    "cal-julian" (&optional date))
+(declare-function calendar-bahai-date-string    "cal-bahai"  (&optional date))
+(declare-function calendar-check-holidays       "holidays"   (date))
+(declare-function calendar-chinese-date-string  "cal-china"  (&optional date))
+(declare-function calendar-coptic-date-string   "cal-coptic" (&optional date))
+(declare-function calendar-ethiopic-date-string "cal-coptic" (&optional date))
+(declare-function calendar-forward-day          "cal-move"   (arg))
+(declare-function calendar-french-date-string   "cal-french" (&optional date))
+(declare-function calendar-goto-date            "cal-move"   (date))
+(declare-function calendar-goto-today           "cal-move"   ())
+(declare-function calendar-hebrew-date-string   "cal-hebrew" (&optional date))
+(declare-function calendar-islamic-date-string  "cal-islam"  (&optional date))
+(declare-function calendar-iso-date-string      "cal-iso"    (&optional date))
+(declare-function calendar-julian-date-string   "cal-julian" (&optional date))
+(declare-function calendar-mayan-date-string    "cal-mayan"  (&optional date))
+(declare-function calendar-persian-date-string  "cal-persia" (&optional date))
+(declare-function cdlatex-tab "ext:cdlatex" ())
+(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
+(declare-function gnus-article-show-summary "gnus-art" ())
+(declare-function gnus-summary-last-subject "gnus-sum" ())
+(declare-function mh-display-msg "mh-show" (msg-num folder-name))
+(declare-function mh-find-path "mh-utils" ())
+(declare-function mh-get-header-field "mh-utils" (field))
+(declare-function mh-get-msg-num "mh-utils" (error-if-no-message))
+(declare-function mh-header-display "mh-show" ())
+(declare-function mh-index-previous-folder "mh-search" ())
+(declare-function mh-normalize-folder-name "mh-utils" (folder &optional empty-string-okay dont-remove-trailing-slash return-nil-if-folder-empty))
+(declare-function mh-search "mh-search" (folder search-regexp &optional redo-search-flag window-config))
+(declare-function mh-search-choose "mh-search" (&optional searcher))
+(declare-function mh-show "mh-show" (&optional message redisplay-flag))
+(declare-function mh-show-buffer-message-number "mh-comp" (&optional buffer))
+(declare-function mh-show-header-display "mh-show" t t)
+(declare-function mh-show-msg "mh-show" (msg))
+(declare-function mh-show-show "mh-show" t t)
+(declare-function mh-visit-folder "mh-folder" (folder &optional range index-data))
+(declare-function org-export-latex-cleaned-string "org-export-latex" (&optional commentsp))
+(declare-function parse-time-string "parse-time" (string))
+(declare-function remember "remember" (&optional initial))
+(declare-function remember-buffer-desc "remember" ())
+(declare-function rmail-narrow-to-non-pruned-header "rmail" ())
+(declare-function rmail-show-message "rmail" (&optional n no-summary))
+(declare-function rmail-what-message "rmail" ())
+(declare-function elmo-folder-exists-p "ext:elmo" (folder) t)
+(declare-function elmo-message-entity-field "ext:elmo-msgdb" (entity field &optional type))
+(declare-function elmo-message-field "ext:elmo" (folder number field &optional type) t)
+(declare-function vm-beginning-of-message "ext:vm-page" ())
+(declare-function vm-follow-summary-cursor "ext:vm-motion" ())
+(declare-function vm-get-header-contents "ext:vm-summary" (message header-name-regexp &optional clump-sep))
+(declare-function vm-isearch-narrow "ext:vm-search" ())
+(declare-function vm-isearch-update "ext:vm-search" ())
+(declare-function vm-select-folder-buffer "ext:vm-macro" ())
+(declare-function vm-su-message-id "ext:vm-summary" (m))
+(declare-function vm-su-subject "ext:vm-summary" (m))
+(declare-function vm-summarize "ext:vm-summary" (&optional display raise))
+(declare-function wl-folder-get-elmo-folder "ext:wl-folder" (entity &optional no-cache))
+(declare-function wl-summary-goto-folder-subr "ext:wl-summary" (&optional name scan-type other-window sticky interactive scoring force-exit))
+(declare-function wl-summary-jump-to-msg-by-message-id "ext:wl-summary" (&optional id))
+(declare-function wl-summary-line-from "ext:wl-summary" ())
+(declare-function wl-summary-line-subject "ext:wl-summary" ())
+(declare-function wl-summary-message-number "ext:wl-summary" ())
+(declare-function wl-summary-redisplay "ext:wl-summary" (&optional arg))
+
 ;;; Variables for pre-computed regular expressions, all buffer local
 
 (defvar org-drawer-regexp nil
@@ -16838,7 +16916,7 @@ D may be an absolute day number, or a calendar-type list (month day year)."
 
 (defun org-calendar-holiday ()
   "List of holidays, for Diary display in Org-mode."
-  (let ((hl (check-calendar-holidays date)))
+  (let ((hl (calendar-check-holidays date)))
     (if hl (mapconcat 'identity hl "; "))))
 
 (defun org-diary-sexp-entry (sexp entry date)
index 201eeebb6235154aafbb708628c9af05bf4d9ef5..06ebeea9fa0160e0661facb020251cad6c881855 100644 (file)
@@ -440,8 +440,8 @@ negative arg -N means kill forward to Nth end of paragraph."
              (end-of-paragraph-text))))))
 
 (defun forward-sentence (&optional arg)
-  "Move forward to next `sentence-end'.  With argument, repeat.
-With negative argument, move backward repeatedly to `sentence-beginning'.
+  "Move forward to next end of sentence.  With argument, repeat.
+With negative argument, move backward repeatedly to start of sentence.
 
 The variable `sentence-end' is a regular expression that matches ends of
 sentences.  Also, every paragraph boundary terminates sentences as well."
index e49c408b6e511433000e735cda78d7af4506eb21..e7d292f48bb52da42581ac9eb530ba4c0482a7f6 100644 (file)
 (require 'reftex)
 ;;;
 
+(declare-function TeX-argument-insert "ext:tex" (name optional &optional prefix))
+(declare-function TeX-argument-prompt "ext:tex" (optional prompt default &optional complete))
+(declare-function multi-prompt "ext:multi-prompt" 
+                 (separator
+                  unique prompt table
+                  &optional mp-predicate require-match initial history))
+(declare-function LaTeX-add-index-entries "ext:tex" (&rest entries) t)
+(declare-function LaTeX-add-labels "ext:tex" (&rest entries) t)
+(declare-function LaTeX-bibitem-list "ext:tex" () t)
+(declare-function LaTeX-index-entry-list "ext:tex" () t)
+(declare-function LaTeX-label-list "ext:tex" () t)
+
 (defun reftex-plug-flag (which)
   ;; Tell if a certain flag is set in reftex-plug-into-AUCTeX
   (or (eq t reftex-plug-into-AUCTeX)
index cfee8b53c0b1ec0affd9f6ce928c9bcde9b0c556..86ad54a73fa7b2bb5a1d036c0901afa7c7e8f100 100644 (file)
@@ -352,13 +352,15 @@ will display info in the echo area."
     (message "Automatic display of crossref information was turned on")))
 
 (defun reftex-start-itimer-once ()
-   (and reftex-mode
+   (and (featurep 'xemacs) reftex-mode
         (not (itimer-live-p reftex-auto-view-crossref-timer))
         (setq reftex-auto-view-crossref-timer
               (start-itimer "RefTeX Idle Timer"
                             'reftex-view-crossref-when-idle 
                             reftex-idle-time nil t))))
 
+(declare-function bibtex-beginning-of-entry "bibtex" ())
+
 (defun reftex-view-crossref-from-bibtex (&optional arg)
   "View location in a LaTeX document which cites the BibTeX entry at point.
 Since BibTeX files can be used by many LaTeX documents, this function
index f430e9bd01aba0034cecbcd71754a71bb8068950..73bcf6d6a74393ffaa0e3245ab1eecc2aace26df 100644 (file)
@@ -39,6 +39,9 @@
 (defvar transient-mark-mode)
 (defvar TeX-master)
 ;; END remove for XEmacs release
+
+(declare-function texmathp "ext:texmathp" ())
+
 (defun reftex-index-selection-or-word (&optional arg phrase)
   "Put selection or the word near point into the default index macro.
 This uses the information in `reftex-index-default-macro' to make an index
index ae147cc6b97057d0d3ab51e2c452548455e25e6d..d1d979b3fc053c56941d6d8882bdefb9ba79e451 100644 (file)
@@ -995,8 +995,10 @@ always show the current section in connection with the option
       (select-frame current-toc-frame)
       (switch-to-buffer "*toc*")
       (select-frame current-frame)
-      (if (fboundp 'focus-frame) (focus-frame current-frame)
-        (if (fboundp 'x-focus-frame) (x-focus-frame current-frame)))
+      (if (fboundp 'x-focus-frame) (x-focus-frame current-frame)
+        ;; focus-frame has done nothing in Emacs since at least v21.
+        (if (featurep 'xemacs)
+            (if (fboundp 'focus-frame) (focus-frame current-frame))))
       (select-window current-window)
       (when (eq reftex-auto-recenter-toc 'frame)
         (unless reftex-toc-auto-recenter-timer
diff --git a/lisp/textmodes/remember-diary.el b/lisp/textmodes/remember-diary.el
deleted file mode 100644 (file)
index e35909f..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-;;; remember-diary --- extracting diary information from buffers
-
-;; Copyright (C) 1999, 2000, 2001, 2004, 2007 Free Software Foundation, Inc.
-
-;; Author: Sacha Chua <sacha@free.net.ph>
-;; Created: 24 Mar 2004
-;; Keywords: data memory todo pim diary
-;; URL: http://gna.org/projects/remember-el/
-
-;; 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, 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
-
-;;; Commentary:
-
-;; This module recognizes entries of the form
-;;
-;;     DIARY: ....
-;;
-;; and puts them in your ~/.diary (or remember-diary-file) together
-;; with an annotation. Planner-style dates (yyyy.mm.dd) are converted
-;; to yyyy-mm-dd so that diary can understand them.
-;;
-;; For example:
-;;
-;; DIARY: 2003.08.12 Sacha's birthday
-;;
-;; is stored as
-;;
-;; 2003.08.12 Sacha's birthday [[/home/sacha/notebook/emacs/emacs-wiki/remember-diary.el]]
-;;
-;; To use, add the following to your .emacs:
-;;
-;;    (require 'remember-diary)
-;;    ;; This should be before other entries that may return t
-;;    (add-to-list 'remember-handler-functions 'remember-diary-extract-entries)
-;;
-
-(require 'remember)
-(require 'diary-lib)
-
-;;; Code:
-(defcustom remember-diary-file diary-file
-  "*File for extracted diary entries."
-  :type 'file
-  :group 'remember)
-
-(defun remember-diary-convert-entry (entry)
-  "Translate MSG to an entry readable by diary."
-  (save-match-data
-    (when remember-annotation
-        (setq entry (concat entry " " remember-annotation)))
-    (if (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\)" entry)
-        (replace-match
-         (if european-calendar-style
-             (concat (match-string 3 entry) "/"
-                     (match-string 2 entry) "/"
-                     (match-string 1 entry))
-           (concat (match-string 2 entry) "/"
-                   (match-string 3 entry) "/"
-                   (match-string 1 entry)))
-         t t entry)
-      entry)))
-
-;;;###autoload
-(defun remember-diary-extract-entries ()
-  "Extract diary entries from the region."
-  (save-excursion
-    (goto-char (point-min))
-    (let (list)
-      (while (re-search-forward "^DIARY:\\s-*\\(.+\\)" nil t)
-        (add-to-list 'list (remember-diary-convert-entry (match-string 1))))
-      (when list
-        (make-diary-entry (mapconcat 'identity list "\n")
-                          nil remember-diary-file))
-      nil))) ;; Continue processing
-
-(provide 'remember-diary)
-
-;; arch-tag: bda8a3f8-9a9b-46aa-8493-d71d7f1e445d
-;;; remember-diary.el ends here
index 7249f1d4c5772bdaf4ad97c1b4a26020fb690334..81be7ace146f653f251cecc42317296f375a588c 100644 (file)
 ;; Faridu'd-Din `Attar wrote: "Be occupied as little as possible with
 ;; things of the outer world but much with things of the inner world;
 ;; then right action will overcome inaction."
+;;
+;; * Diary integration
+;;
+;; To use, add the following to your .emacs:
+;;
+;;   ;; This should be before other entries that may return t
+;;   (add-to-list 'remember-handler-functions 'remember-diary-extract-entries)
+;;
+;; This module recognizes entries of the form
+;;
+;;   DIARY: ....
+;;
+;; and puts them in your ~/.diary (or remember-diary-file) together
+;; with an annotation.  Dates in the form YYYY.MM.DD are converted to
+;; YYYY-MM-DD so that diary can understand them.
+;;
+;; For example:
+;;
+;;   DIARY: 2003.08.12 Sacha's birthday
+;;
+;; is stored as
+;;
+;;   2003.08.12 Sacha's birthday
 
 ;;; History:
 
@@ -440,6 +463,46 @@ application."
     (kill-buffer (current-buffer))
     (jump-to-register remember-register)))
 
+;;; Diary integration
+
+(defcustom remember-diary-file nil
+  "*File for extracted diary entries.
+If this is nil, then `diary-file' will be used instead."
+  :type 'file
+  :group 'remember)
+
+(defun remember-diary-convert-entry (entry)
+  "Translate MSG to an entry readable by diary."
+  (save-match-data
+    (when remember-annotation
+        (setq entry (concat entry " " remember-annotation)))
+    (if (string-match "\\([0-9]+\\)\\.\\([0-9]+\\)\\.\\([0-9]+\\)" entry)
+        (replace-match
+         (if european-calendar-style
+             (concat (match-string 3 entry) "/"
+                     (match-string 2 entry) "/"
+                     (match-string 1 entry))
+           (concat (match-string 2 entry) "/"
+                   (match-string 3 entry) "/"
+                   (match-string 1 entry)))
+         t t entry)
+      entry)))
+
+(autoload 'make-diary-entry "diary-lib")
+
+;;;###autoload
+(defun remember-diary-extract-entries ()
+  "Extract diary entries from the region."
+  (save-excursion
+    (goto-char (point-min))
+    (let (list)
+      (while (re-search-forward "^DIARY:\\s-*\\(.+\\)" nil t)
+        (add-to-list 'list (remember-diary-convert-entry (match-string 1))))
+      (when list
+        (make-diary-entry (mapconcat 'identity list "\n")
+                          nil (or remember-diary-file diary-file)))
+      nil))) ;; Continue processing
+
 ;;; Internal Functions:
 
 (defvar remember-mode-map
index 73b6ec3920e69c784f9b22e92327a38c6b72c6ca..55e7134f87e6265ec41df112caa86c8c986b91a5 100644 (file)
@@ -3001,14 +3001,17 @@ Default is to leave paragraph indentation as is."
 (put 'printindex 'texinfo-format 'texinfo-format-printindex)
 
 (defun texinfo-format-printindex ()
-  (let ((indexelts (symbol-value
-                    (cdr (assoc (texinfo-parse-arg-discard)
-                                texinfo-indexvar-alist))))
-        opoint)
+  (let* ((arg (texinfo-parse-arg-discard))
+         (fmt (cdr (assoc arg texinfo-short-index-format-cmds-alist)))
+         (index-list (delq nil (mapcar (lambda (e)
+                                         (and (eq fmt (get (cdr e) 'texinfo-format))
+                                              (cdr (assoc (car e) texinfo-indexvar-alist))))
+                                       texinfo-short-index-cmds-alist)))
+         (indexelts (apply #'append nil (mapcar #'symbol-value index-list)))
+         opoint)
     (insert "\n* Menu:\n\n")
     (setq opoint (point))
     (texinfo-print-index nil indexelts)
-
     (if (memq system-type '(vax-vms windows-nt ms-dos))
         (texinfo-sort-region opoint (point))
       (shell-command-on-region opoint (point) "sort -fd" 1))))
index 93552c15ea9ebaa6f9069af7fdecf62c49d6f1f8..9d86733ab98ab1ec215fd0a31b87796ff4bdebb3 100644 (file)
@@ -1,3 +1,68 @@
+2007-12-06  Glenn Morris  <rgm@gnu.org>
+
+       * url-file.el, url-mailto.el: Remove directory part from filenames
+       in function declarations.
+
+2007-12-02  Glenn Morris  <rgm@gnu.org>
+
+       * url-about.el, url-handlers.el: Don't require cl when compiling.
+
+       * url-dav.el (url-dav-delete-directory): Fix message typo.
+
+       * url-history.el (top-level): Don't require cl when compiling.
+       (url-history-setup-save-timer, url-history-save-history):
+       Use condition-case rather than ignore-errors.
+
+       * url-imap.el (top-level): Don't require cl when compiling.
+       (url-imap): Use signal rather than check-type.
+
+       * url-news.el (top-level): Don't require cl when compiling.
+       (gnus-group-buffer): Define for compiler.
+       (url-news-fetch-message-id): Don't use `declare'.
+       (nntp-open-tls-stream, nntp-open-ssl-stream):
+       No need to define for compiler.
+       (url-snews): Use nntp-open-tls-stream unless ssl is requested.
+       Correct quoting of nntp-open-connection-function value.
+
+2007-12-01  Glenn Morris  <rgm@gnu.org>
+
+       * url-handlers.el (top-level): Always require url-parse, not just
+       when compiling.
+
+2007-11-30  Glenn Morris  <rgm@gnu.org>
+
+       * url-cookie.el (url-cookie-p): Declare as a function.
+
+2007-11-29  Glenn Morris  <rgm@gnu.org>
+
+       * url-file.el (url-file-build-filename, url-file): Wrap uses of
+       efs in (featurep 'xemacs) test.
+
+       * url-irc.el (zenirc, zenirc-send-line): Declare as functions.
+
+2007-11-28  Diane Murray  <disumu@x3y2z1.net>
+
+       * url-dired.el: Don't require w3-fetch and w3-open-local.
+       (url-dired-find-file): Use `find-file'.  Doc fix.
+       (url-dired-find-file-mouse, url-dired-minor-mode): Doc fix.
+
+2007-11-24  Glenn Morris  <rgm@gnu.org>
+
+       * url-privacy.el (url-device-type): Fix typo.
+
+2007-11-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * url-mailto.el (mail-send-and-exit):
+       * url-http.el (url-dav-file-attributes):
+       * url-file.el (ange-ftp-set-passwd, ange-ftp-copy-file-internal)
+       (url-generate-unique-filename): Declare as functions.
+
+       * url-privacy.el (url-device-type): Define unconditionally.
+
+2007-11-15  Richard Stallman  <rms@gnu.org>
+
+       * url.el (url-retrieve-synchronously): Call delete-process.
+
 2007-10-31  Juanma Barranquero  <lekktu@gmail.com>
 
        * url-vars.el (url-vars-unload-hook): Remove function and variable.
index 5ed16bb2f81629b266367638358445508e30c2db..4a16fe7e122bd1d582b30754254fc3f9f54b0cee 100644 (file)
@@ -25,8 +25,6 @@
 
 ;;; Code:
 
-(eval-when-compile
-  (require 'cl))
 (require 'url-util)
 (require 'url-parse)
 
index 368c34e32a8a5531644f0d317840868d889b10ea..bc0fea4de442f29fa26fc3a3ae3c08252b304e70 100644 (file)
@@ -87,6 +87,8 @@ telling Microsoft that."
      ;; (message "Could not load cookie file %s" fname)
      )))
 
+(declare-function url-cookie-p "url-cookie" t t) ; defstruct
+
 (defun url-cookie-clean-up (&optional secure)
   (let* (
         (var (if secure 'url-cookie-secure-storage 'url-cookie-storage))
index 3c2ea8721347b7493e450e4ce0c85b79cf40543e..fafea4c1f0e5e897c0491aaa62275a04581c6384 100644 (file)
@@ -746,7 +746,7 @@ files in the collection as well."
             (setq status (plist-get (cdr result) 'DAV:status))
             (if (not (url-dav-http-success-p status))
                 (signal 'file-error (list "Removing directory"
-                                          "Errror removing"
+                                          "Error removing"
                                           (car result) status))))
           props))
   nil)
index 189628468b7882b43ebb49e6d03951c944f10a2d..93c99447555933e2c4e0d891bb472f34b1cec6bf 100644 (file)
@@ -24,8 +24,6 @@
 
 ;;; Code:
 
-(autoload 'w3-fetch "w3")
-(autoload 'w3-open-local "w3")
 (autoload 'dired-get-filename "dired")
 
 (defvar url-dired-minor-mode-map
 (make-variable-buffer-local 'url-dired-minor-mode)
 
 (defun url-dired-find-file ()
-  "In dired, visit the file or directory named on this line, using Emacs-W3."
+  "In dired, visit the file or directory named on this line."
   (interactive)
   (let ((filename (dired-get-filename)))
-    (cond ((string-match "/\\(.*@.*\\):\\(/.*\\)" filename)
-          (w3-fetch (concat "file://" (match-string 1 filename) (match-string 2 filename))))
-         (t
-          (w3-open-local filename)))))
+    (find-file filename)))
 
 (defun url-dired-find-file-mouse (event)
-  "In dired, visit the file or directory name you click on, using Emacs-W3."
+  "In dired, visit the file or directory name you click on."
   (interactive "@e")
   (mouse-set-point event)
   (url-dired-find-file))
 
 (defun url-dired-minor-mode (&optional arg)
-  "Minor mode for directory browsing with Emacs-W3."
+  "Minor mode for directory browsing."
   (interactive "P")
   (cond
    ((null arg)
index c361016856b26c7d26a93c5399a224ea7b57d931..f9c9cd33d0488953e3ad2541927dbbb3b788ee40 100644 (file)
@@ -86,6 +86,12 @@ to them."
            (error nil)))
       (apply func args))))
 
+(declare-function ange-ftp-set-passwd "ange-ftp" (host user passwd))
+(declare-function ange-ftp-copy-file-internal "ange-ftp"
+                 (filename newname ok-if-already-exists
+                           keep-date &optional msg cont nowait))
+(declare-function url-generate-unique-filename "url-util" (&optional fmt))
+
 (defun url-file-build-filename (url)
   (if (not (vectorp url))
       (setq url (url-generic-parse-url url)))
@@ -113,8 +119,9 @@ to them."
         (cond
          ((featurep 'ange-ftp)
           (ange-ftp-set-passwd host user pass))
-         ((or (featurep 'efs) (featurep 'efs-auto))
-          (efs-set-passwd host user pass))
+         ((when (featurep 'xemacs)
+             (or (featurep 'efs) (featurep 'efs-auto)
+                 (efs-set-passwd host user pass))))
          (t
           nil)))
 
@@ -208,14 +215,15 @@ to them."
                                                   new (current-buffer)
                                                   callback cbargs)
                                             t)
-             (autoload 'efs-copy-file-internal "efs")
-             (efs-copy-file-internal filename (efs-ftp-path filename)
-                                     new (efs-ftp-path new)
-                                     t nil 0
-                                     (list 'url-file-asynch-callback
-                                           new (current-buffer)
-                                           callback cbargs)
-                                     0 nil))))))
+              (when (featurep 'xemacs)
+                (autoload 'efs-copy-file-internal "efs")
+                (efs-copy-file-internal filename (efs-ftp-path filename)
+                                        new (efs-ftp-path new)
+                                        t nil 0
+                                        (list 'url-file-asynch-callback
+                                              new (current-buffer)
+                                              callback cbargs)
+                                        0 nil)))))))
     buffer))
 
 (defmacro url-file-create-wrapper (method args)
index d6776c238e0264472adc5a813de2cb11109d523e..d22076a8b4fb763059f6771d7e3eebb2fdc8f51c 100644 (file)
@@ -27,7 +27,7 @@
 ;;; Code:
 
 ;; (require 'url)
-(eval-when-compile (require 'url-parse))
+(require 'url-parse)
 ;; (require 'url-util)
 (eval-when-compile (require 'mm-decode))
 ;; (require 'mailcap)
@@ -41,9 +41,6 @@
 (autoload 'mm-dissect-buffer "mm-decode" "Dissect the current buffer and return a list of MIME handles.")
 (autoload 'url-scheme-get-property "url-methods" "Get property of a URL SCHEME.")
 
-(eval-when-compile
-  (require 'cl))
-
 ;; Implementation status
 ;; ---------------------
 ;; Function                            Status
index 1ed3c71174ede4cc0e914ca1d90889db554621a2..605ffa0145fa22cde6b928031fbcb6d98521fbaf 100644 (file)
@@ -28,7 +28,6 @@
 
 ;; This can get a recursive require.
 ;;(require 'url)
-(eval-when-compile (require 'cl))
 (require 'url-parse)
 (autoload 'url-do-setup "url")
 
@@ -83,8 +82,9 @@ to run the `url-history-setup-save-timer' function manually."
 (defun url-history-setup-save-timer ()
   "Reset the history list timer."
   (interactive)
-  (ignore-errors
-   (cancel-timer url-history-timer))
+  (condition-case nil
+      (cancel-timer url-history-timer)
+    (error nil))
   (setq url-history-timer nil)
   (if (and (eq url-history-track t) url-history-save-interval)
       (setq url-history-timer (run-at-time url-history-save-interval
@@ -120,7 +120,9 @@ user for what type to save as."
   (interactive)
   (or fname (setq fname (expand-file-name url-history-file)))
   (unless (file-directory-p (file-name-directory fname))
-    (ignore-errors (make-directory (file-name-directory fname))))
+    (condition-case nil
+        (make-directory (file-name-directory fname))
+      (error nil)))
   (cond
    ((not url-history-changed-since-last-save) nil)
    ((not (file-writable-p fname))
index c5931c7d877e146df1dac3ffc9b315627abcea08..c8447dab8595df2afab7f62978eb420676709838 100644 (file)
@@ -1269,6 +1269,8 @@ CBARGS as the arguments."
            nil nil nil)          ;whether gid would change ; inode ; device.
         (kill-buffer buffer)))))
 
+(declare-function url-dav-file-attributes (url &optional id-format))
+
 ;;;###autoload
 (defun url-http-file-attributes (url &optional id-format)
   (if (url-dav-supported-p url)
index 5c5dff31f7660010a7788800abf9626450738d92..3b1d9e24dbce584a11a7c29fba5a19882ce02f2b 100644 (file)
@@ -32,7 +32,6 @@
 
 ;;; Code:
 
-(eval-when-compile (require 'cl))
 (require 'url-util)
 (require 'url-parse)
 (require 'nnimap)
@@ -53,7 +52,8 @@
                          (nnimap-authenticator ,authenticator)))))
 
 (defun url-imap (url)
-  (check-type url vector "Need a pre-parsed URL.")
+  (unless (vectorp url)
+    (signal 'wrong-type-error (list "Need a pre-parsed URL." url)))
   (save-excursion
     (set-buffer (generate-new-buffer " *url-imap*"))
     (mm-disable-multibyte)
index 0cefb375bf38ae1a1ef556c1eb2e97208bf6bc36..2c3155e49ce06aa285364b230192deb52d8c3820 100644 (file)
@@ -47,6 +47,10 @@ PASSWORD - What password to use"
                 (function :tag "Other"))
   :group 'url)
 
+;; External.
+(declare-function zenirc "ext:zenirc" (&optional prefix))
+(declare-function zenirc-send-line "ext:zenirc" ())
+
 (defun url-irc-zenirc (host port channel user password)
   (let ((zenirc-buffer-name (if (and user host port)
                                (format "%s@%s:%d" user host port)
index 4b15d07245b0155786779c6fe169b4965da1a55c..160c6db98d711efc3fc90e195a4bc750a15d2ba4 100644 (file)
@@ -60,6 +60,8 @@
        (save-excursion
          (insert "\n"))))))
 
+(declare-function mail-send-and-exit "sendmail")
+
 ;;;###autoload
 (defun url-mailto (url)
   "Handle the mailto: URL syntax."
index d774270aced0577207ccf8adcfe46e9a41cd010c..fc1f0091547438e357c561ec473f6f1133874cbb 100644 (file)
@@ -30,9 +30,6 @@
 (require 'nntp)
 (autoload 'url-warn "url")
 (autoload 'gnus-group-read-ephemeral-group "gnus-group")
-(eval-when-compile (require 'cl))
-(defvar nntp-open-tls-stream)
-(defvar nntp-open-ssl-stream)
 
 (defgroup url-news nil
   "News related options."
@@ -85,8 +82,9 @@
                )))
     buf))
 
+(defvar gnus-group-buffer)
+
 (defun url-news-fetch-newsgroup (newsgroup host)
-  (declare (special gnus-group-buffer))
   (if (string-match "^/+" newsgroup)
       (setq newsgroup (substring newsgroup (match-end 0))))
   (if (string-match "/+$" newsgroup)
 
 ;;;###autoload
 (defun url-snews (url)
-  (let ((nntp-open-connection-function (if (eq 'tls url-gateway-method)
-                                          nntp-open-tls-stream
-                                        nntp-open-ssl-stream)))
+  (let ((nntp-open-connection-function (if (eq 'ssl url-gateway-method)
+                                          'nntp-open-ssl-stream
+                                        'nntp-open-tls-stream)))
     (url-news url)))
 
 (provide 'url-news)
index 6c29474752b3b248d7d7f8e1afe646ebf2695042..e7c189ebf412b9136f4ccb27adeca39e1e6a02af 100644 (file)
 (eval-when-compile (require 'cl))
 (require 'url-vars)
 
-(if (fboundp 'device-type)
-    (defalias 'url-device-type 'device-type)
-  (defun url-device-type (&optional device) (or window-system 'tty)))
+(defun url-device-type (&optional device)
+  (if (fboundp 'device-type)
+      (device-type device)              ; XEmacs
+    (or window-system 'tty)))
 
 ;;;###autoload
 (defun url-setup-privacy-info ()
index 3b292b4452d3e44d758105055e199b6e92f39af0..c375a75e06f8d6ed35d3049421d342358e324288 100644 (file)
@@ -241,7 +241,9 @@ no further processing).  URL is either a string or a parsed URL."
                ;; XXX: The callback must always be called.  Any
                ;; exception is a bug that should be fixed, not worked
                ;; around.
-                (setq retrieval-done t))
+               (progn ;; Call delete-process so we run any sentinel now.
+                 (delete-process proc)
+                 (setq retrieval-done t)))
             ;; We used to use `sit-for' here, but in some cases it wouldn't
             ;; work because apparently pending keyboard input would always
             ;; interrupt it before it got a chance to handle process input.
index d6573db9df258c658928faf502a0156e0873b398..c9c50fceba2fb0e5a8b19967e7d6022826a89f56 100644 (file)
@@ -513,15 +513,46 @@ The changes are between FIRST-REVISION and SECOND-REVISION."
 
 (defun vc-cvs-diff (files &optional oldvers newvers buffer)
   "Get a difference report using CVS between two revisions of FILE."
-    (let* ((async (and (not vc-disable-async-diff) 
-                      (vc-stay-local-p files)))
-          (status (apply 'vc-cvs-command (or buffer "*vc-diff*")
+  (let* ((async (and (not vc-disable-async-diff)
+                    (vc-stay-local-p files)))
+        (invoke-cvs-diff-list nil)
+        status)
+    ;; Look through the file list and see if any files have backups
+    ;; that can be used to do a plain "diff" instead of "cvs diff".
+    (dolist (file files)
+      (let ((ov oldvers)
+           (nv newvers))
+       (when (or (not ov) (string-equal ov ""))
+         (setq ov (vc-working-revision file)))
+       (when (string-equal nv "")
+         (setq nv nil))
+       (let ((file-oldvers (vc-version-backup-file file ov))
+             (file-newvers (if (not nv)
+                               file
+                             (vc-version-backup-file file nv)))
+             (coding-system-for-read (vc-coding-system-for-diff file)))
+         (if (and file-oldvers file-newvers)
+             (progn
+               (apply 'vc-do-command (or buffer "*vc-diff*") 1 "diff" nil
+                      (append (if (listp diff-switches)
+                                  diff-switches
+                                (list diff-switches))
+                              (if (listp vc-diff-switches)
+                                  vc-diff-switches
+                                (list vc-diff-switches))
+                              (list (file-relative-name file-oldvers)
+                                    (file-relative-name file-newvers))))
+               (setq status 0))
+           (push file invoke-cvs-diff-list)))))
+    (when invoke-cvs-diff-list
+      (setq status (apply 'vc-cvs-command (or buffer "*vc-diff*")
                          (if async 'async 1)
-                         files "diff"
+                         invoke-cvs-diff-list "diff"
                          (and oldvers (concat "-r" oldvers))
                          (and newvers (concat "-r" newvers))
                          (vc-switches 'CVS 'diff))))
-      (if async 1 status)))            ; async diff, pessimistic assumption
+    (if async 1 status))) ; async diff, pessimistic assumption
+
 
 (defun vc-cvs-diff-tree (dir &optional rev1 rev2)
   "Diff all files at and below DIR."
index 07714b26c32b7e10d4bd3a8cc51698cb0a337965..6fd6849281bbdd009b0d48bd036df5d523f79aa3 100644 (file)
@@ -81,7 +81,7 @@
 ;; HISTORY FUNCTIONS
 ;; * print-log (files &optional buffer)                   OK
 ;; - log-view-mode ()                             OK
-;; - show-log-entry (revision)                    NOT NEEDED, DEFAULT IS GOOD
+;; - show-log-entry (revision)                    OK
 ;; - wash-log (file)                              COULD BE SUPPORTED
 ;; - logentry-check ()                            NOT NEEDED
 ;; - comment-history (file)                       ??
 ;;; BACKEND PROPERTIES
 
 (defun vc-git-revision-granularity ()
-     'repository)
+  'repository)
 
 ;;; STATE-QUERYING FUNCTIONS
 
       (let* ((dir (file-name-directory file))
             (name (file-relative-name file dir)))
        (and (ignore-errors
-             (when dir (cd dir))
-             (eq 0 (call-process "git" nil '(t nil) nil "ls-files" "-c" "-z" "--" name)))
+               (when dir (cd dir))
+               (vc-git--out-ok "ls-files" "-c" "-z" "--" name))
             (let ((str (buffer-string)))
               (and (> (length str) (length name))
-                   (string= (substring str 0 (1+ (length name))) (concat name "\0")))))))))
+                   (string= (substring str 0 (1+ (length name)))
+                             (concat name "\0")))))))))
 
 (defun vc-git-state (file)
   "Git-specific version of `vc-state'."
-  (call-process "git" nil nil nil "add" "--refresh" "--" (file-relative-name file))
+  (vc-git--call nil "add" "--refresh" "--" (file-relative-name file))
   (let ((diff (vc-git--run-command-string file "diff-index" "-z" "HEAD" "--")))
-    (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} [ADMU]\0[^\0]+\0" diff))
+    (if (and diff (string-match ":[0-7]\\{6\\} [0-7]\\{6\\} [0-9a-f]\\{40\\} [0-9a-f]\\{40\\} [ADMU]\0[^\0]+\0"
+                                diff))
         'edited
       'up-to-date)))
 
 (defun vc-git-dir-state (dir)
   (with-temp-buffer
-    (vc-git-command (current-buffer) nil nil "ls-files" "-t")
+    (vc-git-command (current-buffer) nil nil "ls-files" "-t" "-c" "-m" "-o")
     (goto-char (point-min))
     (let ((status-char nil)
          (file nil))
        (setq status-char (char-after))
        (setq file
              (expand-file-name
-              (buffer-substring-no-properties (+ (point) 2) (line-end-position))))
+              (buffer-substring-no-properties (+ (point) 2)
+                                               (line-end-position))))
        (cond
         ;; The rest of the possible states in "git ls-files -t" output:
          ;;      R              removed/deleted
   "Git-specific version of `vc-working-revision'."
   (let ((str (with-output-to-string
                (with-current-buffer standard-output
-                 (call-process "git" nil '(t nil) nil "symbolic-ref" "HEAD")))))
+                 (vc-git--out-ok "symbolic-ref" "HEAD")))))
     (if (string-match "^\\(refs/heads/\\)?\\(.+\\)$" str)
         (match-string 2 str)
       str)))
        "^commit *\\([0-9a-z]+\\)")
   (set (make-local-variable 'log-view-font-lock-keywords)
        (append
-       `((,log-view-message-re  (1 'change-log-acknowledgement))
-         (,log-view-file-re (1 'change-log-file-face)))
-         ;; Handle the case:
-         ;; user: foo@bar
-         '(("^Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
-            (1 'change-log-email))
-          ;; Handle the case:
-          ;; user: FirstName LastName <foo@bar>
-          ("^Author:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
-           (1 'change-log-name)
-           (2 'change-log-email))
-          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
-           (1 'change-log-name))
-          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
-           (1 'change-log-name)
-           (2 'change-log-email))
-          ("^Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)"
-           (1 'change-log-acknowledgement)
-           (2 'change-log-acknowledgement))
-          ("^Date:   \\(.+\\)" (1 'change-log-date))
-          ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))
+        `((,log-view-message-re  (1 'change-log-acknowledgement))
+          (,log-view-file-re (1 'change-log-file-face)))
+        ;; Handle the case:
+        ;; user: foo@bar
+        '(("^Author:[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
+           (1 'change-log-email))
+          ;; Handle the case:
+          ;; user: FirstName LastName <foo@bar>
+          ("^Author:[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
+           (1 'change-log-name)
+           (2 'change-log-email))
+          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)"
+           (1 'change-log-name))
+          ("^ +\\(?:\\(?:[Aa]cked\\|[Ss]igned-[Oo]ff\\)-[Bb]y:\\)[ \t]+\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]"
+           (1 'change-log-name)
+           (2 'change-log-email))
+          ("^Merge: \\([0-9a-z]+\\) \\([0-9a-z]+\\)"
+           (1 'change-log-acknowledgement)
+           (2 'change-log-acknowledgement))
+          ("^Date:   \\(.+\\)" (1 'change-log-date))
+          ("^summary:[ \t]+\\(.+\\)" (1 'log-view-message))))))
+
+(defun vc-git-show-log-entry (revision)
+  "Move to the log entry for REVISION.
+REVISION may have the form BRANCH, BRANCH~N,
+or BRANCH^ (where \"^\" can be repeated)."
+  (goto-char (point-min))
+  (search-forward "\ncommit" nil t
+                  (cond ((string-match "~\\([0-9]\\)$" revision)
+                         (1+ (string-to-number (match-string 1 revision))))
+                        ((string-match "\\^+$" revision)
+                         (1+ (length (match-string 0 revision))))
+                        (t nil)))
+  (beginning-of-line))
 
 (defun vc-git-diff (files &optional rev1 rev2 buffer)
   (let ((buf (or buffer "*vc-diff*")))
     (if (and rev1 rev2)
-        (vc-git-command buf 1 files "diff-tree" "--exit-code" "-p" rev1 rev2 "--")
-      (vc-git-command buf 1 files "diff-index" "--exit-code" "-p" (or rev1 "HEAD") "--"))))
+        (vc-git-command buf 1 files "diff-tree" "--exit-code" "-p"
+                        rev1 rev2 "--")
+      (vc-git-command buf 1 files "diff-index" "--exit-code" "-p"
+                      (or rev1 "HEAD") "--"))))
 
 (defun vc-git-revision-table (files)
   ;; What about `files'?!?  --Stef
     (vc-git-command buf 0 name "blame" (if rev (concat "-r" rev)))))
 
 (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))) '(6 5 4 3 2 1 7))))))
+        (apply #'encode-time (mapcar (lambda (match)
+                                       (string-to-number (match-string match)))
+                                     '(6 5 4 3 2 1 7))))))
 
 (defun vc-git-annotate-extract-revision-at-line ()
- (save-excursion
-   (move-beginning-of-line 1)
-   (and (looking-at "[0-9a-f]+")
-        (buffer-substring-no-properties (match-beginning 0) (match-end 0)))))
 (save-excursion
+    (move-beginning-of-line 1)
+    (and (looking-at "[0-9a-f]+")
+         (buffer-substring-no-properties (match-beginning 0) (match-end 0)))))
 
 ;;; SNAPSHOT SYSTEM
 
     (vc-git-symbolic-commit
      (with-temp-buffer
        (and
-       (zerop
-        (call-process "git" nil '(t nil) nil "rev-list"
-                      "-2" rev "--" file))
+       (vc-git--out-ok "rev-list" "-2" rev "--" file)
        (goto-char (point-max))
        (bolp)
        (zerop (forward-line -1))
        (not (bobp))
        (buffer-substring-no-properties
-          (point)
-          (1- (point-max))))))))
+         (point)
+         (1- (point-max))))))))
 
 (defun vc-git-next-revision (file rev)
   "Git-specific version of `vc-next-revision'."
   (let* ((default-directory (file-name-directory
                             (expand-file-name file)))
-       (file (file-name-nondirectory file))
-       (current-rev
-        (with-temp-buffer
-          (and
-           (zerop
-            (call-process "git" nil '(t nil) nil "rev-list"
-                          "-1" rev "--" file))
-           (goto-char (point-max))
-           (bolp)
-           (zerop (forward-line -1))
-           (bobp)
-           (buffer-substring-no-properties
-            (point)
-            (1- (point-max)))))))
+         (file (file-name-nondirectory file))
+         (current-rev
+          (with-temp-buffer
+            (and
+             (vc-git--out-ok "rev-list" "-1" rev "--" file)
+             (goto-char (point-max))
+             (bolp)
+             (zerop (forward-line -1))
+             (bobp)
+             (buffer-substring-no-properties
+              (point)
+              (1- (point-max)))))))
     (and current-rev
         (vc-git-symbolic-commit
          (with-temp-buffer
            (and
-            (zerop
-             (call-process "git" nil '(t nil) nil "rev-list"
-                           "HEAD" "--" file))
+            (vc-git--out-ok "rev-list" "HEAD" "--" file)
             (goto-char (point-min))
             (search-forward current-rev nil t)
             (zerop (forward-line -1))
 The difference to vc-do-command is that this function always invokes `git'."
   (apply 'vc-do-command buffer okstatus "git" file-or-list flags))
 
+(defun vc-git--call (buffer command &rest args)
+  (apply 'call-process "git" nil buffer nil command args))
+
+(defun vc-git--out-ok (command &rest args)
+  (zerop (apply 'vc-git--call '(t nil) command args)))
+
 (defun vc-git--run-command-string (file &rest args)
   "Run a git command on FILE and return its output as string."
   (let* ((ok t)
          (str (with-output-to-string
                 (with-current-buffer standard-output
-                  (unless (eq 0 (apply #'call-process "git" nil '(t nil) nil
-                                       (append args (list (file-relative-name file)))))
+                  (unless (apply 'vc-git--out-ok
+                                 (append args (list (file-relative-name
+                                                     file))))
                     (setq ok nil))))))
     (and ok str)))
 
@@ -452,10 +473,7 @@ Returns nil if not possible."
   (and commit
        (with-temp-buffer
         (and
-         (zerop
-          (call-process "git" nil '(t nil) nil "name-rev"
-                        "--name-only" "--tags"
-                        commit))
+         (vc-git--out-ok "name-rev" "--name-only" "--tags" commit)
          (goto-char (point-min))
          (= (forward-line 2) 1)
          (bolp)
index 872be45a2c19a91561744eb6697850f1a03f30f9..af2b4f133d2175bf7cfaefb65d555109f3335ae3 100644 (file)
 (defun vc-hg-revision-table (files)
   (let ((default-directory (file-name-directory (car files))))
     (with-temp-buffer
-      (vc-hg-command t nil file "log" "--template" "{rev} ")
+      (vc-hg-command t nil files "log" "--template" "{rev} ")
       (split-string 
        (buffer-substring-no-properties (point-min) (point-max))))))
 
@@ -480,6 +480,8 @@ REV is the revision to check out into WORKFILE."
     (pop-to-buffer bname)
     (vc-hg-incoming-mode)))
 
+(declare-function log-view-get-marked "log-view" ())
+
 ;; XXX maybe also add key bindings for these functions.
 (defun vc-hg-push ()
   (interactive)
index e28a01d35e6f4a07e392b88fd4f77db16be3df8e..80f12af974aa108987ba450479038b67575a61d8 100644 (file)
@@ -705,6 +705,8 @@ Before doing that, check if there are any old backups and get rid of them."
         (vc-call make-version-backups-p file)
          (vc-make-version-backup file))))
 
+(declare-function vc-dired-resynch-file "vc" (file))
+
 (defun vc-after-save ()
   "Function to be called by `basic-save-buffer' (in files.el)."
   ;; If the file in the current buffer is under version control,
index 5811b2f7d63b8b88cc8e35d9d8bc7c609496d595..622c9682fbc9703903dd186412ec73cfd271b31b 100644 (file)
@@ -83,8 +83,8 @@
 ;; to be installed somewhere on Emacs's path for executables.
 ;;
 ;; If your site uses the ChangeLog convention supported by Emacs, the
-;; function log-edit-comment-to-change-log could prove a useful checkin hook,
-;; although you might prefer to use C-c C-a (i.e. log-edit-insert-changelog)
+;; function `log-edit-comment-to-change-log' could prove a useful checkin hook,
+;; although you might prefer to use C-c C-a (i.e. `log-edit-insert-changelog')
 ;; from the commit buffer instead or to set `log-edit-setup-invert'.
 ;;
 ;; The vc code maintains some internal state in order to reduce expensive
@@ -774,6 +774,7 @@ List of factors, used to expand/compress the time scale.  See `vc-annotate'."
     (define-key m "N" 'vc-annotate-next-revision)
     (define-key m "P" 'vc-annotate-prev-revision)
     (define-key m "W" 'vc-annotate-working-revision)
+    (define-key m "V" 'vc-annotate-toggle-annotation-visibility)
     m)
   "Local keymap used for VC-Annotate mode.")
 
@@ -1267,7 +1268,9 @@ Otherwise, throw an error."
           marked))
        ((vc-backend buffer-file-name)
         (list buffer-file-name))
-       ((and vc-parent-buffer (buffer-file-name vc-parent-buffer))
+       ((and vc-parent-buffer (or (buffer-file-name vc-parent-buffer)
+                                  (with-current-buffer vc-parent-buffer
+                                    vc-dired-mode)))
         (progn
           (set-buffer vc-parent-buffer)
           (vc-deduce-fileset)))
@@ -1535,8 +1538,9 @@ merge in the changes into your working copy."
   (vc-call-backend backend 'create-repo))
 
 ;;;###autoload
-(defun vc-register (&optional set-revision comment)
-  "Register the current file into a version control system.
+(defun vc-register (&optional fname set-revision comment)
+  "Register into a version control system.
+If FNAME is given register that file, otherwise register the current file.
 With prefix argument SET-REVISION, allow user to specify initial revision
 level.  If COMMENT is present, use that as an initial comment.
 
@@ -1547,40 +1551,44 @@ directory are already registered under that backend) will be used to
 register the file.  If no backend declares itself responsible, the
 first backend that could register the file is used."
   (interactive "P")
-  (unless buffer-file-name (error "No visited file"))
-  (when (vc-backend buffer-file-name)
-    (if (vc-registered buffer-file-name)
-       (error "This file is already registered")
-      (unless (y-or-n-p "Previous master file has vanished.  Make a new one? ")
-       (error "Aborted"))))
-  ;; Watch out for new buffers of size 0: the corresponding file
-  ;; does not exist yet, even though buffer-modified-p is nil.
-  (if (and (not (buffer-modified-p))
-          (zerop (buffer-size))
-          (not (file-exists-p buffer-file-name)))
-      (set-buffer-modified-p t))
-  (vc-buffer-sync)
-
-  (vc-start-entry (list buffer-file-name)
-                  (if set-revision
-                      (read-string (format "Initial revision level for %s: "
-                                          (buffer-name)))
-                   (vc-call-backend (vc-responsible-backend buffer-file-name)
-                                    'init-revision))
-                  (or comment (not vc-initial-comment))
-                 nil
-                  "Enter initial comment."
-                 (lambda (files rev comment)
-                   (dolist (file files)
-                     (message "Registering %s... " file)
-                     (let ((backend (vc-responsible-backend file t)))
-                       (vc-file-clearprops file)
-                       (vc-call-backend backend 'register (list file) rev comment)
-                       (vc-file-setprop file 'vc-backend backend)
-                       (unless vc-make-backup-files
-                         (make-local-variable 'backup-inhibited)
-                         (setq backup-inhibited t)))
-                     (message "Registering %s... done" file)))))
+  (when (and (null fname) (null buffer-file-name)) (error "No visited file"))
+
+  (let ((bname (if fname (get-file-buffer fname) buffer-file-name)))
+    (unless fname (setq fname buffer-file-name))
+    (when (vc-backend fname)
+      (if (vc-registered fname)
+         (error "This file is already registered")
+       (unless (y-or-n-p "Previous master file has vanished.  Make a new one? ")
+         (error "Aborted"))))
+    ;; Watch out for new buffers of size 0: the corresponding file
+    ;; does not exist yet, even though buffer-modified-p is nil.
+    (when bname
+      (with-current-buffer bname
+       (if (and (not (buffer-modified-p))
+                (zerop (buffer-size))
+                (not (file-exists-p buffer-file-name)))
+           (set-buffer-modified-p t))
+       (vc-buffer-sync)))
+    (vc-start-entry (list fname)
+                   (if set-revision
+                       (read-string (format "Initial revision level for %s: "
+                                            fname))
+                     (vc-call-backend (vc-responsible-backend fname)
+                                      'init-revision))
+                   (or comment (not vc-initial-comment))
+                   nil
+                   "Enter initial comment."
+                   (lambda (files rev comment)
+                     (dolist (file files)
+                       (message "Registering %s... " file)
+                       (let ((backend (vc-responsible-backend file t)))
+                         (vc-file-clearprops file)
+                         (vc-call-backend backend 'register (list file) rev comment)
+                         (vc-file-setprop file 'vc-backend backend)
+                         (unless vc-make-backup-files
+                           (make-local-variable 'backup-inhibited)
+                           (setq backup-inhibited t)))
+                       (message "Registering %s... done" file))))))
 
 (defun vc-register-with (backend)
   "Register the current file with a specified back end."
@@ -1590,6 +1598,8 @@ first backend that could register the file is used."
   (let ((vc-handled-backends (list backend)))
     (call-interactively 'vc-register)))
 
+(declare-function view-mode-exit "view" (&optional return-to-alist exit-action all-win))
+
 (defun vc-resynch-window (file &optional keep noquery)
   "If FILE is in the current buffer, either revert or unvisit it.
 The choice between revert (to see expanded keywords) and unvisit depends on
@@ -1637,14 +1647,18 @@ empty comment.  Remember the file's buffer in `vc-parent-buffer'
 \(current one if no file).  AFTER-HOOK specifies the local value
 for vc-log-operation-hook."
   (let ((parent
-        (if (and files (equal (length files) 1))
-            (get-file-buffer (car files))
-          (current-buffer))))
-    (if vc-before-checkin-hook
-        (if files
-            (with-current-buffer parent
-              (run-hooks 'vc-before-checkin-hook))
-          (run-hooks 'vc-before-checkin-hook)))
+         (if (eq major-mode 'vc-dired-mode)
+             ;; If we are called from VC dired, the parent buffer is
+             ;; the current buffer.
+             (current-buffer)
+           (if (and files (equal (length files) 1))
+               (get-file-buffer (car files))
+             (current-buffer)))))
+    (when vc-before-checkin-hook
+      (if files
+         (with-current-buffer parent
+           (run-hooks 'vc-before-checkin-hook))
+       (run-hooks 'vc-before-checkin-hook)))
     (if (and comment (not initial-contents))
        (set-buffer (get-buffer-create "*VC-log*"))
       (pop-to-buffer (get-buffer-create "*VC-log*")))
@@ -1654,8 +1668,8 @@ for vc-log-operation-hook."
     ;;(if file (vc-mode-line file))
     (vc-log-edit files)
     (make-local-variable 'vc-log-after-operation-hook)
-    (if after-hook
-       (setq vc-log-after-operation-hook after-hook))
+    (when after-hook
+      (setq vc-log-after-operation-hook after-hook))
     (setq vc-log-operation action)
     (setq vc-log-revision rev)
     (when comment
@@ -1929,13 +1943,14 @@ returns t if the buffer had changes, nil otherwise."
         (progn
           (message "No changes between %s and %s" rev1-name rev2-name)
           nil)
-      (pop-to-buffer (current-buffer))
       (diff-mode)
       ;; Make the *vc-diff* buffer read only, the diff-mode key
       ;; bindings are nicer for read only buffers. pcl-cvs does the
       ;; same thing.
       (setq buffer-read-only t)
       (vc-exec-after `(vc-diff-sentinel ,verbose ,rev1-name ,rev2-name))
+      ;; Display the buffer, but at the end because it can change point.
+      (pop-to-buffer (current-buffer))
       ;; In the async case, we return t even if there are no differences
       ;; because we don't know that yet.
       t)))
@@ -2059,11 +2074,16 @@ If `F.~REV~' already exists, use it instead of checking it out again."
                      (with-current-buffer filebuf
                        (vc-call find-revision file revision outbuf))))
                  (setq failed nil))
-             (if (and failed (file-exists-p filename))
-                 (delete-file filename))))
+             (when (and failed (file-exists-p filename))
+               (delete-file filename))))
          (vc-mode-line file))
        (message "Checking out %s...done" filename)))
-    (find-file-noselect filename)))
+    (let ((result-buf (find-file-noselect filename)))
+      (with-current-buffer result-buf
+       ;; Set the parent buffer so that things like
+       ;; C-x v g, C-x v l, ... etc work.
+       (setq vc-parent-buffer filebuf))
+      result-buf)))
 
 ;; Header-insertion code
 
@@ -3134,11 +3154,24 @@ to provide the `find-revision' operation instead."
 You can use the mode-specific menu to alter the time-span of the used
 colors.  See variable `vc-annotate-menu-elements' for customizing the
 menu items."
+  ;; Frob buffer-invisibility-spec so that if it is originally a naked t,
+  ;; it will become a list, to avoid initial annotations being invisible.
+  (add-to-invisibility-spec 'foo)
+  (remove-from-invisibility-spec 'foo)
   (set (make-local-variable 'truncate-lines) t)
   (set (make-local-variable 'font-lock-defaults)
        '(vc-annotate-font-lock-keywords t))
   (view-mode 1))
 
+(defun vc-annotate-toggle-annotation-visibility ()
+  "Toggle whether or not the annotation is visible."
+  (interactive)
+  (funcall (if (memq 'vc-annotate-annotation buffer-invisibility-spec)
+               'remove-from-invisibility-spec
+             'add-to-invisibility-spec)
+           'vc-annotate-annotation)
+  (force-window-update (current-buffer)))
+
 (defun vc-annotate-display-default (ratio)
   "Display the output of \\[vc-annotate] using the default color range.
 The color range is given by `vc-annotate-color-map', scaled by RATIO.
@@ -3153,6 +3186,13 @@ The current time is used as the offset."
   ;; Since entries should be sorted, we can just use the last one.
   (caar (last color-map)))
 
+(defun vc-annotate-get-time-set-line-props ()
+  (let ((bol (point))
+        (date (vc-call-backend vc-annotate-backend 'annotate-time))
+        (inhibit-read-only t))
+    (put-text-property bol (point) 'invisible 'vc-annotate-annotation)
+    date))
+
 (defun vc-annotate-display-autoscale (&optional full)
   "Highlight the output of \\[vc-annotate] using an autoscaled color map.
 Autoscaling means that the map is scaled from the current time to the
@@ -3168,7 +3208,7 @@ cover the range from the oldest annotation to the newest."
     (save-excursion
       (goto-char (point-min))
       (while (not (eobp))
-        (when (setq date (vc-call-backend vc-annotate-backend 'annotate-time))
+        (when (setq date (vc-annotate-get-time-set-line-props))
           (if (> date newest)
               (setq newest date))
           (if (< date oldest)
@@ -3216,6 +3256,7 @@ cover the range from the oldest annotation to the newest."
      :style toggle :selected
      (eq vc-annotate-display-mode 'fullscale)]
     "--"
+    ["Toggle annotation visibility" vc-annotate-toggle-annotation-visibility]
     ["Annotate previous revision" vc-annotate-prev-revision]
     ["Annotate next revision" vc-annotate-next-revision]
     ["Annotate revision at line" vc-annotate-revision-at-line]
@@ -3480,7 +3521,7 @@ The argument TIME is a list as returned by `current-time' or
 This calls the backend function annotate-time, and returns the
 difference in days between the time returned and the current time,
 or OFFSET if present."
-   (let ((next-time (vc-call-backend vc-annotate-backend 'annotate-time)))
+   (let ((next-time (vc-annotate-get-time-set-line-props)))
      (if next-time
         (- (or offset
                (vc-call-backend vc-annotate-backend 'annotate-current-time))
@@ -3536,7 +3577,10 @@ The annotations are relative to the current time, unless overridden by OFFSET."
   "Set up `log-edit' for use with VC on FILE."
   (setq default-directory
        (with-current-buffer vc-parent-buffer default-directory))
-  (log-edit 'vc-finish-logentry nil `(lambda () ',fileset))
+  (log-edit 'vc-finish-logentry
+           nil
+           `((log-edit-listfun . (lambda () ',fileset))
+             (log-edit-diff-function . (lambda () (vc-diff nil)))))
   (set (make-local-variable 'vc-log-fileset) fileset)
   (make-local-variable 'vc-log-revision)
   (set-buffer-modified-p nil)
index 39cec28d88d2f83f9b1fd5922492a7900e9091f7..82d248f237358e4cd05ed467036e41dc28bf0b8f 100644 (file)
@@ -1,3 +1,4 @@
+;; -*- no-byte-compile: t -*-
 ;;; vms-patch.el --- override parts of files.el for VMS
 
 ;; Copyright (C) 1986, 1992, 2001, 2002, 2003, 2004,
index 92df327dde1c098fb88509302d795212c29e852e..136d2913975af00f09ff849f6e1fa31a3253d180 100644 (file)
@@ -1,3 +1,4 @@
+;; -*- no-byte-compile: t -*-
 ;;; vmsproc.el --- run asynchronous VMS subprocesses under Emacs
 
 ;; Copyright (C) 1986, 2001, 2002, 2003, 2004, 2005,
index 994eb767232bcae55e8e2a1716537d2cb9b4c150..676e26ee12ae45c48ed35fa6f85b4f7c78979cc0 100644 (file)
 
 (defvar explicit-shell-file-name)
 
-;; Map delete and backspace
-(define-key function-key-map [backspace] "\177")
-(define-key function-key-map [delete] "\C-d")
-(define-key function-key-map [M-backspace] [?\M-\177])
-(define-key function-key-map [C-M-backspace] [\C-\M-delete])
+;;;; Function keys
+
+(defvar x-alternatives-map
+  (let ((map (make-sparse-keymap)))
+    ;; Map certain keypad keys into ASCII characters that people usually expect.
+    (define-key map [backspace] [127])
+    (define-key map [delete] [127])
+    (define-key map [tab] [?\t])
+    (define-key map [linefeed] [?\n])
+    (define-key map [clear] [?\C-l])
+    (define-key map [return] [?\C-m])
+    (define-key map [escape] [?\e])
+    (define-key map [M-backspace] [?\M-\d])
+    (define-key map [M-delete] [?\M-\d])
+    (define-key map [M-tab] [?\M-\t])
+    (define-key map [M-linefeed] [?\M-\n])
+    (define-key map [M-clear] [?\M-\C-l])
+    (define-key map [M-return] [?\M-\C-m])
+    (define-key map [M-escape] [?\M-\e])
+    (define-key map [iso-lefttab] [backtab])
+    (define-key map [S-iso-lefttab] [backtab])
+    map)
+  "Keymap of possible alternative meanings for some keys.")
+
+(defun x-setup-function-keys (frame)
+  "Set up `function-key-map' on FRAME for w32."
+  ;; Don't do this twice on the same display, or it would break
+  ;; normal-erase-is-backspace-mode.
+  (unless (terminal-parameter frame 'x-setup-function-keys)
+    ;; Map certain keypad keys into ASCII characters that people usually expect.
+    (with-selected-frame frame
+      (let ((map (copy-keymap x-alternatives-map)))
+        (set-keymap-parent map (keymap-parent local-function-key-map))
+        (set-keymap-parent local-function-key-map map)))
+    (set-terminal-parameter frame 'x-setup-function-keys t)))
+
+(declare-function set-message-beep "w32console.c")
+(declare-function w32-get-clipboard-data "w32select.c")
+(declare-function w32-get-locale-info "w32proc.c")
+(declare-function w32-get-valid-locale-ids "w32proc.c")
+(declare-function w32-set-clipboard-data "w32select.c")
 
 ;; Ignore case on file-name completion
 (setq completion-ignore-case t)
@@ -310,25 +346,6 @@ This function is provided for backward compatibility, since
 (global-set-key [lwindow] 'ignore)
 (global-set-key [rwindow] 'ignore)
 
-;; Map certain keypad keys into ASCII characters
-;; that people usually expect.
-(define-key function-key-map [tab] [?\t])
-(define-key function-key-map [linefeed] [?\n])
-(define-key function-key-map [clear] [11])
-(define-key function-key-map [return] [13])
-(define-key function-key-map [escape] [?\e])
-(define-key function-key-map [M-tab] [?\M-\t])
-(define-key function-key-map [M-linefeed] [?\M-\n])
-(define-key function-key-map [M-clear] [?\M-\013])
-(define-key function-key-map [M-return] [?\M-\015])
-(define-key function-key-map [M-escape] [?\M-\e])
-
-;; These don't do the right thing (voelker)
-;(define-key function-key-map [backspace] [127])
-;(define-key function-key-map [delete] [127])
-;(define-key function-key-map [M-backspace] [?\M-\d])
-;(define-key function-key-map [M-delete] [?\M-\d])
-
 ;; These tell read-char how to convert
 ;; these special chars to ASCII.
 (put 'tab 'ascii-character ?\t)
@@ -339,28 +356,6 @@ This function is provided for backward compatibility, since
 (put 'backspace 'ascii-character 127)
 (put 'delete 'ascii-character 127)
 
-;; W32 uses different color indexes than standard:
-
-(defvar w32-tty-standard-colors
-  '(("black"          0     0     0     0)
-    ("blue"           1     0     0 52480) ; MediumBlue
-    ("green"          2  8704 35584  8704) ; ForestGreen
-    ("cyan"           3     0 52736 53504) ; DarkTurquoise
-    ("red"            4 45568  8704  8704) ; FireBrick
-    ("magenta"        5 35584     0 35584) ; DarkMagenta
-    ("brown"          6 40960 20992 11520) ; Sienna
-    ("lightgray"      7 48640 48640 48640) ; Gray
-    ("darkgray"       8 26112 26112 26112) ; Gray40
-    ("lightblue"      9     0     0 65535) ; Blue
-    ("lightgreen"    10     0 65535     0) ; Green
-    ("lightcyan"     11     0 65535 65535) ; Cyan
-    ("lightred"      12 65535     0     0) ; Red
-    ("lightmagenta"  13 65535     0 65535) ; Magenta
-    ("yellow"        14 65535 65535     0) ; Yellow
-    ("white"         15 65535 65535 65535))
-"A list of VGA console colors, their indices and 16-bit RGB values.")
-
-
 (defun w32-add-charset-info (xlfd-charset windows-charset codepage)
   "Function to add character sets to display with Windows fonts.
 Creates entries in `w32-charset-info-alist'.
index a76ac809feb659ed4883fc9e614ce104919858e4..39d27d578481a8eacb8208d6ae306a9b25b1e214 100644 (file)
@@ -556,6 +556,7 @@ If OLD, return the old target.  If MOVE, move point before it."
          (if move (goto-char (1- beg)))))
     (and target (wdired-normalize-filename target))))
 
+(declare-function make-symbolic-link "fileio.c")
 
 ;; Perform the changes in the target of the changed links.
 (defun wdired-do-symlink-changes ()
index c86f8351c7ac43396cf7c8c0efbb244197d5423d..652d49a542177e4d4eb3fd443c8687ca03c08c02 100644 (file)
@@ -488,7 +488,7 @@ new value.")
 ;;; Widget Properties.
 
 (defsubst widget-type (widget)
-  "Return the type of WIDGET, a symbol."
+  "Return the type of WIDGET.  The type is a symbol."
   (car widget))
 
 ;;;###autoload
@@ -1450,7 +1450,7 @@ The value of the :type attribute should be an unconverted widget type."
 
 (defun widget-default-complete (widget)
   "Call the value of the :complete-function property of WIDGET.
-If that does not exists, call the value of `widget-complete-field'."
+If that does not exist, call the value of `widget-complete-field'."
   (call-interactively (or (widget-get widget :complete-function)
                          widget-complete-field)))
 
index 0f6ae8ab7634ab2b62326d49f8c1ae0951ade249..025a7c5ab653ad8973b67c2d908ec764d34bdf12 100644 (file)
@@ -215,8 +215,7 @@ to be counted) its minibuffer frame (if that's not the same frame).
 The optional arg MINIBUF non-nil means count the minibuffer
 even if it is inactive."
    (let ((count 0))
-     (walk-windows (function (lambda (w)
-                              (setq count (+ count 1))))
+     (walk-windows (lambda (w) (setq count (+ count 1)))
                   minibuf)
      count))
 
@@ -379,8 +378,7 @@ subtree is balanced."
         (h)
         (tried-sizes)
         (last-sizes)
-        (windows (window-list nil 0))
-        (counter 0))
+        (windows (window-list nil 0)))
     (when wt
       (while (not (member last-sizes tried-sizes))
         (when last-sizes (setq tried-sizes (cons last-sizes tried-sizes)))
@@ -415,17 +413,16 @@ Arguments WINDOW, DELTA and HORIZONTAL are passed on to that function."
         (when w
           (let ((dw (- w (- (bw-r wt) (bw-l wt)))))
             (when (/= 0 dw)
-                (bw-adjust-window wt dw t))))
+              (bw-adjust-window wt dw t))))
         (when h
           (let ((dh (- h (- (bw-b wt) (bw-t wt)))))
             (when (/= 0 dh)
               (bw-adjust-window wt dh nil)))))
     (let* ((childs (cdr (assq 'childs wt)))
-           (lastchild (car (last childs)))
            (cw (when w (/ w (if (bw-eqdir 'hor wt) (length childs) 1))))
            (ch (when h (/ h (if (bw-eqdir 'ver wt) (length childs) 1)))))
       (dolist (c childs)
-          (bw-balance-sub c cw ch)))))
+        (bw-balance-sub c cw ch)))))
 
 ;;; A different solution to balance-windows
 
@@ -561,7 +558,7 @@ window."
        (old-point (point))
        (size (and arg (prefix-numeric-value arg)))
         (window-full-p nil)
-       new-w bottom switch moved)
+       new-w bottom moved)
     (and size (< size 0) (setq size (+ (window-height) size)))
     (setq new-w (split-window nil size))
     (or split-window-keep-point
@@ -879,6 +876,46 @@ and the buffer that is killed or buried is the one in that window."
     ;; Maybe get rid of the window.
     (and window (not window-handled) (not window-solitary)
         (delete-window window))))
+
+(defvar recenter-last-op nil
+  "Indicates the last recenter operation performed.
+Possible values: `top', `middle', `bottom'.")
+
+(defun recenter-top-bottom (&optional arg)
+  "Move current line to window center, top, and bottom, successively.
+With a prefix argument, this is the same as `recenter':
+ With numeric prefix ARG, move current line to window-line ARG.
+ With plain `C-u', move current line to window center.
+
+Otherwise move current line to window center on first call, and to
+top, middle, or bottom on successive calls.
+
+The starting position of the window determines the cycling order:
+ If initially in the top or middle third: top -> middle -> bottom.
+ If initially in the bottom third: bottom -> middle -> top.
+
+Top and bottom destinations are actually `scroll-conservatively' lines
+from true window top and bottom."
+  (interactive "P")
+  (cond
+   (arg (recenter arg))                 ; Always respect ARG.
+   ((not (eq this-command last-command))
+    ;; First time - save mode and recenter.
+    (setq recenter-last-op 'middle)
+    (recenter))
+   (t ;; repeat: loop through various options.
+    (setq recenter-last-op
+         (cond ((eq recenter-last-op 'middle)
+                (recenter scroll-conservatively)
+                'top)
+               ((eq recenter-last-op 'top)
+                (recenter (1- (- scroll-conservatively)))
+                'bottom)
+               ((eq recenter-last-op 'bottom)
+                (recenter)
+                'middle))))))
+
+(define-key global-map [?\C-l] 'recenter-top-bottom)
 \f
 (defvar mouse-autoselect-window-timer nil
   "Timer used by delayed window autoselection.")
index f6f3b75dc0795f0fd44123f0808d3b3b58234456..2c36acabef4b87c3a935008da02616693866d310 100644 (file)
@@ -117,7 +117,7 @@ any protocol specific data.")
 
 (defvar x-dnd-empty-state [nil nil nil nil nil nil nil])
 
-
+(declare-function x-register-dnd-atom "xselect.c")
 
 (defun x-dnd-init-frame (&optional frame)
   "Setup drag and drop for FRAME (i.e. create appropriate properties)."
@@ -422,6 +422,9 @@ otherwise return the frame coordinates."
           (+ frame-real-top (nth 1 edges))))
       (cons frame-real-left frame-real-top))))
 
+(declare-function x-get-atom-name "xselect.c")
+(declare-function x-send-client-message "xselect.c")
+
 (defun x-dnd-handle-xdnd (event frame window message format data)
   "Receive one XDND event (client message) and send the appropriate reply.
 EVENT is the client message.  FRAME is where the mouse is now.
index bcf4d5b5624b48d648dd601e2c9f6ec41479e0a9..20a0de9101273c4007bb270e5b9dbb505ba4c4a9 100644 (file)
@@ -1,3 +1,7 @@
+2007-11-24  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * INSTALL: Also build and run on Mac OS X 10.5.
+
 2007-11-01  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
 
        * inc/config.h: Remove HAVE_X11R5.
index 7cdf0de494008f65b00505d11e29dbb2cb58f5e0..6d78910b46453715b6a136c3d8dfefcac1489bbe 100644 (file)
@@ -192,7 +192,7 @@ is created.
 * NOTES
 
 Emacs should build and run on a PowerMac running Mac OS 8.6 - 9.2 (but
-only tested on 9.2.2), and Mac OS X 10.1 - 10.4.
+only tested on 9.2.2), and Mac OS X 10.1 - 10.5.
 
 You will need around 100 MB of disk space for the source files and
 intermediate files.
index 8a67e7a459c4f44c516786366f1e90f68579bb98..08768e16bebd42b6a309d03ddf093c789d18bb27 100755 (executable)
--- a/make-dist
+++ b/make-dist
@@ -294,7 +294,7 @@ mkdir ${tempdir}
 ### tar file; this means that people can start reading the INSTALL and
 ### README while the rest of the tar file is still unpacking.  Whoopee.
 echo "Making links to top-level files"
-ln FTP INSTALL README BUGS move-if-change ${tempdir}
+ln INSTALL README BUGS move-if-change ${tempdir}
 ln ChangeLog Makefile.in configure configure.in ${tempdir}
 ln config.bat make-dist update-subdirs vpath.sed ${tempdir}
 ### Copy these files; they're cross-filesystem symlinks.
@@ -318,15 +318,15 @@ for subdir in lisp site-lisp \
              leim/SKK-DIC leim/ja-dic leim/quail \
              src src/m src/s src/bitmaps lib-src oldXMenu lwlib \
              nt nt/inc nt/inc/sys nt/inc/arpa nt/inc/netinet nt/icons \
-             etc etc/charsets etc/e etc/gnus \
+             etc etc/charsets etc/e etc/gnus etc/nxml \
              etc/images etc/images/ezimage etc/images/gnus etc/images/gud \
              etc/images/icons etc/images/low-color etc/images/mail \
              etc/images/smilies etc/images/smilies/grayscale \
              etc/images/smilies/medium etc/images/tree-widget \
              etc/images/tree-widget/default etc/images/tree-widget/folder \
-             etc/refcards etc/tutorials info doc doc/emacs doc/misc doc/man \
-             doc/lispref doc/lispintro m4 msdos vms mac mac/inc \
-             mac/inc/sys mac/src mac/Emacs.app mac/Emacs.app/Contents \
+             etc/refcards etc/schema etc/tutorials info doc doc/emacs \
+             doc/misc doc/man doc/lispref doc/lispintro m4 msdos vms mac \
+             mac/inc mac/inc/sys mac/src mac/Emacs.app mac/Emacs.app/Contents \
              mac/Emacs.app/Contents/MacOS mac/Emacs.app/Contents/Resources \
              mac/Emacs.app/Contents/Resources/English.lproj
 do
@@ -374,7 +374,7 @@ echo "Making links to \`lisp' and its subdirectories"
 
  for file in $subdirs; do
    echo "  lisp/$file"
-   mkdir ../${tempdir}/lisp/$file
+   mkdir -p ../${tempdir}/lisp/$file
    ln $file/[a-zA-Z0-9]*.el ../${tempdir}/lisp/$file
    ln $file/[a-zA-Z0-9]*.elc ../${tempdir}/lisp/$file
    for img in $file/[a-zA-Z]*.xpm $file/[a-zA-Z]*.xbm $file/[a-zA-Z]*.pbm; do
@@ -575,7 +575,8 @@ echo "Making links to \`etc'"
 ### tex litter.
 (cd etc
  files=`ls -d * | grep -v CVS | grep -v RCS | grep -v 'Old' | grep -v '^e$' \
-        | grep -v '^charsets$' | grep -v '^images$' | grep -v '^refcards$' | grep -v '^tutorials$'`
+        | grep -v '^charsets$' | grep -v '^gnus$' | grep -v '^images$' | grep -v '^nxml$' \
+        | grep -v '^refcards$' | grep -v '^tutorials$'| grep -v '^schema$'`
  ln $files ../${tempdir}/etc
  ## If we ended up with a symlink, or if we did not get anything
  ## due to a cross-device symlink, copy the file.
@@ -598,7 +599,7 @@ echo "Making links to \`etc'"
  rm -f DOC* *~ \#*\# *.dvi *.log *.orig *.rej *,v =* core
  rm -f TAGS)
 
-for dir in etc/charsets etc/e etc/gnus etc/tutorials etc/refcards ; do
+for dir in etc/charsets etc/e etc/gnus etc/nxml etc/tutorials etc/refcards etc/schema ; do
     echo "Making links to \`${dir}'"
     (cd ${dir}
        ln `ls -d * | grep -v CVS | grep -v RCS` ../../${tempdir}/${dir}
@@ -709,21 +710,6 @@ for subdir in . etc info leim lib-src lisp lwlib mac msdos nt src; do
   cp COPYING ${tempdir}/${subdir}
 done
 
-#### Make sure that there aren't any hard links between files in the
-#### distribution; people with afs can't deal with that.  Okay,
-#### actually we just re-copy anything with a link count greater
-#### than two.  (Yes, strictly greater than 2 is correct; since we
-#### created these files by linking them in from the original tree,
-#### they'll have exactly two links normally.)
-####
-#### Commented out since it's not strictly necessary; it should suffice
-#### to just break the link on alloca.c.
-#echo "Breaking intra-tree links."
-#find ${tempdir} ! -type d -links +2 \
-#  -exec cp -p {} $$ \; -exec rm -f {} \; -exec mv $$ {} \;
-rm -f $tempdir/lib-src/alloca.c
-cp $tempdir/src/alloca.c $tempdir/lib-src/alloca.c
-
 if [ "${newer}" ]; then
   echo "Removing files older than $newer"
   ## We remove .elc files unconditionally, on the theory that anyone picking
index 4cf00fc3c308516a190a8da0955fc799edcce0c6..f55e4ac786c66527871f9c7ef46eab5fdedeb3cb 100644 (file)
@@ -1,3 +1,346 @@
+2007-12-05  Magnus Henoch  <mange@freemail.hu>
+
+       * process.c (make_process): Initialize pty_flag to 0.
+
+2007-12-05  Jason Rumney  <jasonr@gnu.org>
+
+       * image.c (xbm_load) [WINDOWSNT]: Shuffle the bits of directly
+       specified XBMs.
+
+2007-12-05  Richard Stallman  <rms@gnu.org>
+
+       * xdisp.c (syms_of_xdisp) <scroll-conservatively>: Doc fix.
+
+2007-12-05  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * mac.c (cfsockets_for_select) [MAC_OSX && SELECT_USE_CFSOCKET]:
+       New variable.
+       (mac_try_close_socket) [MAC_OSX]: New function.
+       [MAC_OSX] (sys_select) [SELECT_USE_CFSOCKET]:
+       Update cfsockets_for_select.  Replace invalid CFRunLoop source.
+
+       * sysdep.c (emacs_close) [MAC_OSX && HAVE_CARBON]:
+       Use mac_try_close_socket.
+
+2007-12-05  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * unexmacosx.c (unrelocate): New argument BASE.  Use it instead of
+       reloc_base.
+       (copy_dysymtab): Compute relocation base here.
+       (rebase_reloc_address) [__ppc64__]: New function.
+       (copy_dysymtab) [__ppc64__]: Use it if relocation base needs to be
+       changed.
+
+2007-12-05  Jason Rumney  <jasonr@gnu.org>
+
+       * w32proc.c (sys_spawnve): Quote args with wildcards.
+
+2007-12-05  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * unexmacosx.c (copy_data_segment): Also copy __gcc_except_tab and
+       __objc_* sections.
+       (unrelocate) [_LP64]: Set relocation base to address of data segment.
+
+2007-12-05  Michael Albinus  <michael.albinus@gmx.de>
+
+       * dbusbind.c (xd_read_message): Return value is a Lisp_Object.
+       Move check for Vdbus_registered_functions_table to
+       xd_read_queued_messages.
+       (xd_read_queued_messages): Protect xd_read_message calls by
+       internal_condition_case_1.
+
+2007-12-04  Michael Albinus  <michael.albinus@gmx.de>
+
+       * dbusbind.c (QCdbus_system_bus, QCdbus_session_bus): Renamed from
+       Qdbus_system_bus and Qdbus_session_bus, respectively.
+       (Vdbus_intern_symbols): Removed.
+       (Vdbus_registered_functions_table): New hash table.
+       (XD_SYMBOL_INTERN_SYMBOL): Removed.
+       (xd_read_message, Fdbus_register_signal, Fdbus_unregister_signal):
+       Rewritten in order to manage registered functions by hash table
+       Vdbus_registered_functions_table.
+
+2007-12-03  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * xterm.c: Update URL to Window Manager Specification in comment.
+
+2007-12-02  Michael Albinus  <michael.albinus@gmx.de>
+
+       * config.in (HAVE_DBUS): Add.
+
+       * Makefile.in: (HAVE_DBUS): Add D-Bus definitions if defined.
+       (ALL_CFLAGS): Add ${DBUS_CFLAGS}.
+       (obj): Add $(DBUS_OBJ).
+       (LIBES): Add $(DBUS_LIBS).
+       (dbusbind.o): New target.
+
+       * dbusbind.c: New file.
+
+       * emacs.c (main): Call syms_of_dbusbind when HAVE_DBUS is defined.
+
+       * keyboard.c: All D-Bus related code is wrapped by "#ifdef HAVE_DBUS".
+       (Qdbus_event) New Lisp symbol.
+       (kbd_buffer_get_event, make_lispy_event): Handle DBUS_EVENT.
+       (gobble_input): Call xd_read_queued_messages, reading D-Bus
+       messages.
+       (keys_of_keyboard ): Define dbus-event.
+
+       * termhooks.h (event_kind): Add DBUS_EVENT when HAVE_DBUS is defined.
+
+2007-12-01  Richard Stallman  <rms@gnu.org>
+
+       * search.c (syms_of_search) <inhibit-changing-match-data>: Doc fix.
+
+2007-11-30  Jason Rumney  <jasonr@gnu.org>
+
+       * w32console.c (w32con_ins_del_lines, scroll_line): Clip to window.
+       (w32con_reset_terminal_modes): Clear screen buffer.
+       (w32_face_attributes): Don't use color indexes that are out of range.
+       Only reverse the default colors.
+
+       * xfaces.c (map_tty_color, tty_color_name): Remove special case for
+       WINDOWSNT.
+
+       * w32console.c, w32term.h (vga_stdcolor_name): Remove.
+
+2007-11-29  Jason Rumney  <jasonr@gnu.org>
+
+       * w32console.c: Leave HAVE_WINDOW_SYSTEM defined.
+       (w32_face_attributes): Use Vtty_defined_color_alist to determine
+       if the terminal colors are initialized.
+       (unspecified_fg, unspecified_bg): Remove unused declarations.
+
+2007-11-29  Andreas Schwab  <schwab@suse.de>
+
+       * keyboard.c (apply_modifiers): Fix typo.
+
+2007-11-29  Richard Stallman  <rms@gnu.org>
+
+       * keymap.c (Fcurrent_local_map): Doc fix.
+
+2007-11-28  Petr Salinger  <Petr.Salinger@seznam.cz>  (tiny change)
+
+       * s/gnu-kfreebsd.h: New file.
+
+2007-11-28  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * buffer.c (Fget_buffer_create, Fmake_indirect_buffer):
+       Don't cast redundantly.
+
+       * keyboard.c (KEY_TO_CHAR): New macro.
+       (parse_modifiers, apply_modifiers): Accept integer arguments.
+       (read_key_sequence): Use them to unify the "shift->unshift" mapping
+       for chars and symbol keys.
+       After doing such remapping, apply function-key-map again.
+
+2007-11-27  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * Makefile.in (SOME_MACHINE_LISP): Remove VMS files, they are not
+       compiled anymore.
+
+2007-11-26  Andreas Schwab  <schwab@suse.de>
+
+       * process.c (list_processes_1): Fix indentation level of the
+       command column.
+
+2007-11-23  Andreas Schwab  <schwab@suse.de>
+
+       * editfns.c (Fformat): Handle %c specially since it requires the
+       argument to be of type int.
+
+2007-11-23  Markus Triska  <markus.triska@gmx.at>
+
+       * emacs.c (main): Call init_editfns before init_process, since
+       init_process sets Vprocess_connection_type depending on OS release
+
+2007-11-22  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * data.c (do_symval_forwarding): Use same code as in find_symbol_value.
+       (find_symbol_value): Use do_symval_forwarding.
+
+       * data.c (set_internal): Set the value in the `cons-cell' (for
+       Buffer_Local_values) not only for frame-local variables.
+
+2007-11-22  Andreas Schwab  <schwab@suse.de>
+
+       * data.c (Fnumber_to_string): Add cast when passing EMACS_INT
+       values to sprintf.
+       * keymap.c (Fsingle_key_description): Likewise.
+       * print.c (print_object): Likewise.
+
+2007-11-22  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * gtkutil.c (update_frame_tool_bar): Don't call x-gtk-map-stock if
+       file for image is nil.
+
+2007-11-22  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * term.c: Include stdarg.h.
+       (fatal): Implement using varargs.
+       * lisp.h (fatal): Add argument types. (Restore 2005-09-30 change).
+
+2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * lisp.h (struct Lisp_Buffer_Objfwd): Add a `slottype' field.
+       * data.c (store_symval_forwarding): Get type from buffer_objfwd.
+       Update call to buffer_slot_type_mismatch.
+       * buffer.h (buffer_local_types, PER_BUFFER_TYPE): Remove.
+       (buffer_slot_type_mismatch): Update.
+       * buffer.c (buffer_local_types): Remove.
+       (buffer_slot_type_mismatch): Get the symbol and type as arguments.
+       (defvar_per_buffer): Set the type in the buffer_objfwd.
+
+2007-11-21  Jason Rumney  <jasonr@gnu.org>
+
+       * w32bdf.c (w32_init_bdf_font, w32_BDF_to_x_font):
+       CreateFileMapping returns NULL on failure.
+
+2007-11-21  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * search.c (Fset_match_data): Remove the `evaporate' feature.
+       (unwind_set_match_data): Don't use the `evaporate' feature.
+
+2007-11-21  Jason Rumney  <jasonr@gnu.org>
+
+       * dispnew.c (init_display) [WINDOWSNT]: Hardcode terminal_type.
+
+       * w32console.c (w32con_write_glyphs): Remove unused variables.
+
+2007-11-20  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * macterm.c (mac_term_init): Call add_keyboard_wait_descriptor.
+
+       * s/darwin.h (MULTI_KBOARD): Remove.
+
+       * macfns.c (x_create_tip_frame, Fx_create_frame)
+       (x_create_tip_frame): Don't deal with MULTI_KBOARD.
+
+2007-11-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * buffer.c (Fbuffer_local_value): Remove redundant test.
+       (swap_out_buffer_local_variables): Swap out binding in `buffer' rather
+       than in `current-buffer' to match the comment.
+       Do the swap using swap_in_global_binding.
+
+       * data.c (store_symval_forwarding, set_internal):
+       * eval.c (specbind): Remove dead code.
+
+       * coding.c (detect_coding, Fupdate_coding_systems_internal):
+       * fns.c (Fmd5): Use find_symbol_value rather than SYMBOL_VALUE
+       Since we do not want to see internal Lisp_*fwd objects here.
+
+2007-11-18  Jan Dj\e,Ad\e(Brv  <jan.h.d@swipnet.se>
+
+       * sysdep.c (init_system_name): Use getaddrinfo if available.
+
+       * xterm.c (x_scroll_bar_set_handle, x_scroll_bar_handle_click)
+       (x_scroll_bar_note_movement): start, end, with, height in struct
+       scroll_bar are integers and not Lisp_Object, so remove XINT for them.
+
+2007-11-17  Dan Nicolaescu  <dann@ics.uci.edu>
+
+       * puresize.h (BASE_PURESIZE): Increase to 1190000.
+
+2007-11-16  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * buffer.h (struct buffer): Move `undo_list' back to before `name'.
+       This undoes Richard's change of 14-Oct-2002.
+
+       * alloc.c (allocate_other_vector):
+       * lisp.h (allocate_other_vector): Remove.
+
+       * window.c (struct save_window_data): Move non-lisp data to the end
+       and make it `int' rather than Lisp_Object.
+       (Fcurrent_window_configuration): Use ALLOCATE_PSEUDOVECTOR.
+       Done wrap/unwrap integer values.
+       (Fset_window_configuration, compare_window_configurations):
+       Update use of fields to their new types.
+
+       * xterm.h (struct scroll_bar): Only use Lisp_Object for lisp data.
+       Turn integer fields into `int'.  Merge x_window_low and x_window_high.
+       (SCROLL_BAR_PACK, SCROLL_BAR_UNPACK, SCROLL_BAR_X_WINDOW)
+       (SET_SCROLL_BAR_X_WINDOW): Remove.
+       (SCROLL_BAR_X_WIDGET, SET_SCROLL_BAR_X_WIDGET):
+       Access the new x_window field directly.
+       * xterm.c (x_scroll_bar_create): Use a pseudovector.
+       Don't wrap/unwrap integers into Lisp_Objects.
+       (XTset_vertical_scroll_bar, x_scroll_bar_handle_click)
+       (x_scroll_bar_report_motion):
+       Don't wrap/unwrap integers into Lisp_Objects.
+       (x_term_init): Use SDATA.
+       (x_window_to_scroll_bar, x_create_toolkit_scroll_bar)
+       (x_scroll_bar_set_handle, x_scroll_bar_remove)
+       (XTset_vertical_scroll_bar, x_scroll_bar_expose)
+       (x_scroll_bar_report_motion, x_scroll_bar_clear):
+       * xfns.c (x_set_background_color):
+       * gtkutil.c (xg_create_scroll_bar, xg_set_toolkit_scroll_bar_thumb):
+       Access the new x_window field directly.
+
+       * alloc.c (ALLOCATE_PSEUDOVECTOR): Move to lisp.h.
+       (allocate_pseudovector): Make non-static.
+
+       * lisp.h (enum pvec_type): New tag PVEC_OTHER.
+       (allocate_pseudovector): Declare.
+       (ALLOCATE_PSEUDOVECTOR): Move from alloc.c
+
+2007-11-15  Andreas Schwab  <schwab@suse.de>
+
+       * editfns.c (Fformat): Correctly format EMACS_INT values.
+       Also take precision into account when formatting an integer.
+
+       * keyboard.c (Fevent_symbol_parse_modifiers): Fix declaration.
+
+2007-11-15  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * keyboard.c (Fevent_symbol_parse_modifiers): New function.
+       (syms_of_keyboard): Defsubr it.
+
+       * data.c (swap_in_global_binding): Fix longstanding bug where
+       store_symval_forwarding was not called with the right second argument,
+       thus causing objfwd-ing from being dropped.
+
+2007-11-14  Juanma Barranquero  <lekktu@gmail.com>
+
+       * macfns.c (Fx_create_frame, Fx_display_pixel_width)
+       (Fx_display_pixel_height, Fx_display_planes)
+       (Fx_display_color_cells, Fx_server_max_request_size)
+       (Fx_server_vendor, Fx_server_version, Fx_display_backing_store)
+       (Fx_display_visual_class, Fx_display_save_under):
+       * w32fns.c (Fx_create_frame, Fx_display_pixel_width)
+       (Fx_display_pixel_height, Fx_display_planes)
+       (Fx_display_color_cells, Fx_server_max_request_size)
+       (Fx_server_vendor, Fx_server_version, Fx_display_screens)
+       (Fx_display_mm_height, Fx_display_mm_width)
+       (Fx_display_backing_store, Fx_display_visual_class)
+       (Fw32_select_font, Fx_display_save_under):
+       * xfns.c (Fx_create_frame, Fx_display_pixel_width)
+       (Fx_display_pixel_height, Fx_display_planes)
+       (Fx_display_color_cells, Fx_server_max_request_size)
+       (Fx_server_vendor, Fx_server_version, Fx_display_backing_store)
+       (Fx_display_save_under): Fix typos in docstrings.
+
+2007-11-14  Juanma Barranquero  <lekktu@gmail.com>
+
+       * w32fns.c (Fw32_registered_hot_keys): Don't return the nil values
+       corresponding to deleted entries; they are an implementation detail.
+       (gray_bitmap_width, gray_bitmap_height, gray_bitmap_bits):
+       Remove variables.
+       (w32_pass_extra_mouse_buttons_to_system, w32_strict_fontnames)
+       (w32_pass_multimedia_buttons_to_system, w32_strict_painting)
+       (Vw32_charset_info_alist, w32_to_x_color, w32_init_class)
+       (w32_createscrollbar, w32_createwindow, my_post_msg, w32_get_modifiers)
+       (w32_grabbed_keys, cancel_all_deferred_msgs): Make static.
+       (Fw32_define_rgb_color, Fw32_load_color_file)
+       (syms_of_w32fns) <w32-pass-multimedia-buttons-to-system>:
+       Fix typos in docstrings.
+       (Fx_server_version): Reflow docstring.
+       (Fw32_shell_execute): Doc fixes.
+
+2007-11-13  Juanma Barranquero  <lekktu@gmail.com>
+
+       * w32fns.c (Fw32_register_hot_key): Don't try to register hot key
+       if w32_parse_hot_key returned nil.
+
 2007-11-10  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * xdisp.c (load_overlay_strings): Fix copy&paste typo.
 2007-11-01  Johan Bockg\e,Ae\e(Brd  <bojohan@gnu.org>
 
        * macterm.c, w32term.c, xterm.c (x_draw_stretch_glyph_string):
-        Don't set s->stippled_p here, since it has already been set by
+       Don't set s->stippled_p here, since it has already been set by
        x_set_glyph_string_gc from x_draw_glyph_string.
 
 2007-11-01  Dan Nicolaescu  <dann@ics.uci.edu>
index c5e7bc61e4774f428111e1161fa61cfd3ca64de9..b718726325740b3c88b028504a5d46518eb3bce7 100644 (file)
        * w32.c: Fix high cpu load for server sockets.
        (pfn_WSAEventSelect): New function ptr.
        (init_winsock): Load it.
-       (sys_listen): Set FILE_LISTEN flag. Set event mask for socket's
+       (sys_listen): Set FILE_LISTEN flag.  Set event mask for socket's
        char_avail event object to FD_ACCEPT.
        (sys_accept): Check FILE_LISTEN flag.  Set event mask on new
        socket's char_avail event object to FD_READ|FD_CLOSE.
index 5e476cd59caa63b6cccccb0db4102f3655a027d9..e1e5d457fc23fe1516d3da4fe4ec1d5d7aa141e9 100644 (file)
@@ -263,6 +263,12 @@ TOOLKIT_DEFINES =
 #endif
 #endif
 
+#ifdef HAVE_DBUS
+DBUS_CFLAGS = @DBUS_CFLAGS@
+DBUS_LIBS = @DBUS_LIBS@
+DBUS_OBJ = dbusbind.o
+#endif
+
 /* DO NOT use -R.  There is a special hack described in lastfile.c
    which is used instead.  Some initialized data areas are modified
    at initial startup, then labeled as part of the text area when
@@ -276,7 +282,7 @@ TOOLKIT_DEFINES =
 
 /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM
    since it may have -I options that should override those two.  */
-ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS_SOUND} ${RSVG_CFLAGS} ${CFLAGS} @FREETYPE_CFLAGS@ @FONTCONFIG_CFLAGS@ @LIBOTF_CFLAGS@ @M17N_FLT_CFLAGS@
+ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS_SOUND} ${RSVG_CFLAGS} ${DBUS_CFLAGS} ${CFLAGS} @FREETYPE_CFLAGS@ @FONTCONFIG_CFLAGS@ @LIBOTF_CFLAGS@ @M17N_FLT_CFLAGS@
 .c.o:
        $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<
 
@@ -608,7 +614,7 @@ FONTOBJ = font.o
    whose initialized data areas should be dumped as pure by dump-emacs.  */
 obj=    dispnew.o frame.o scroll.o xdisp.o $(XMENU_OBJ) window.o \
        charset.o coding.o category.o ccl.o character.o chartab.o \
-       cm.o term.o terminal.o xfaces.o $(XOBJ) $(GTK_OBJ)\
+       cm.o term.o terminal.o xfaces.o $(XOBJ) $(GTK_OBJ) $(DBUS_OBJ) \
        emacs.o keyboard.o macros.o keymap.o sysdep.o \
        buffer.o filelock.o insdel.o marker.o \
        minibuf.o fileio.o dired.o filemode.o \
@@ -925,7 +931,7 @@ shortlisp= \
    for the sake of systems which can''t handle large ones.  */
 SOME_MACHINE_LISP = ${dotdot}/lisp/mouse.elc \
   ${dotdot}/lisp/select.elc ${dotdot}/lisp/scroll-bar.elc \
-  ${dotdot}/lisp/vmsproc.elc ${dotdot}/lisp/vms-patch.elc \
+  VMS_SUPPORT \
   ${dotdot}/lisp/ls-lisp.elc ${dotdot}/lisp/dos-fns.elc \
   ${dotdot}/lisp/w32-fns.elc ${dotdot}/lisp/dos-w32.elc \
   ${dotdot}/lisp/disp-table.elc ${dotdot}/lisp/dos-vars.elc \
@@ -943,8 +949,8 @@ SOME_MACHINE_LISP = ${dotdot}/lisp/mouse.elc \
    Note that SunOS needs -lm to come before -lc; otherwise, you get
    duplicated symbols.  If the standard libraries were compiled
    with GCC, we might need gnulib again after them.  */
-LIBES = $(LOADLIBES) $(LIBS) $(LIBX) $(LIBSOUND) $(RSVG_LIBS) LIBGPM \
-   LIBRESOLV LIBS_SYSTEM LIBS_MACHINE LIBS_TERMCAP \
+LIBES = $(LOADLIBES) $(LIBS) $(LIBX) $(LIBSOUND) $(RSVG_LIBS) $(DBUS_LIBS) \
+   LIBGPM LIBRESOLV LIBS_SYSTEM LIBS_MACHINE LIBS_TERMCAP \
    LIBS_DEBUG $(GETLOADAVG_LIBS) \
    @FREETYPE_LIBS@ @FONTCONFIG_LIBS@ @LIBOTF_LIBS@ @M17N_FLT_LIBS@ \
    $(GNULIB_VAR) LIB_MATH LIB_STANDARD $(GNULIB_VAR)
@@ -1265,9 +1271,10 @@ xselect.o: xselect.c process.h dispextern.h frame.h xterm.h blockinput.h \
 xrdb.o: xrdb.c $(config_h) epaths.h
 xsmfns.o: xsmfns.c $(config_h) systime.h sysselect.h termhooks.h xterm.h \
   lisp.h termopts.h
-gtkutil.o:  gtkutil.c gtkutil.h xterm.h lisp.h frame.h $(config_h) \
+gtkutil.o: gtkutil.c gtkutil.h xterm.h lisp.h frame.h $(config_h) \
   blockinput.h window.h atimer.h systime.h termhooks.h keyboard.h \
   charset.h coding.h
+dbusbind.o: dbusbind.c termhooks.h $(config_h)
 
 hftctl.o: hftctl.c $(config_h)
 sound.o: sound.c dispextern.h $(config_h)
index 5e3c38943f49fb6a3cdda7f5b560a8f620cc4e49..88f37ee363cffa4dc062eafc51709aa732b7c2ad 100644 (file)
@@ -2967,7 +2967,7 @@ allocate_vector (nslots)
 
 /* Allocate other vector-like structures.  */
 
-static struct Lisp_Vector *
+struct Lisp_Vector *
 allocate_pseudovector (memlen, lisplen, tag)
      int memlen, lisplen;
      EMACS_INT tag;
@@ -2983,10 +2983,6 @@ allocate_pseudovector (memlen, lisplen, tag)
   XSETPVECTYPE (v, tag);       /* Add the appropriate tag.  */
   return v;
 }
-#define ALLOCATE_PSEUDOVECTOR(typ,field,tag)                           \
-  ((typ*)                                                              \
-   allocate_pseudovector                                               \
-       (VECSIZE (typ), PSEUDOVECSIZE (typ, field), tag))
 
 struct Lisp_Hash_Table *
 allocate_hash_table (void)
@@ -3033,22 +3029,6 @@ allocate_process ()
 }
 
 
-/* Only used for PVEC_WINDOW_CONFIGURATION. */
-struct Lisp_Vector *
-allocate_other_vector (len)
-     EMACS_INT len;
-{
-  struct Lisp_Vector *v = allocate_vectorlike (len);
-  EMACS_INT i;
-
-  for (i = 0; i < len; ++i)
-    v->contents[i] = Qnil;
-  v->size = len;
-
-  return v;
-}
-
-
 DEFUN ("make-vector", Fmake_vector, Smake_vector, 2, 2, 0,
        doc: /* Return a newly created vector of length LENGTH, with each element being INIT.
 See also the function `vector'.  */)
index 416ff7e370232f815c95f392370f89604983ef3d..77af23ace39e39317bfa1ebd91eae50b2366f2b8 100644 (file)
@@ -99,17 +99,6 @@ DECL_ALIGN (struct buffer, buffer_local_symbols);
 /* A Lisp_Object pointer to the above, used for staticpro */
 static Lisp_Object Vbuffer_local_symbols;
 
-/* This structure holds the required types for the values in the
-   buffer-local slots.  If a slot contains Qnil, then the
-   corresponding buffer slot may contain a value of any type.  If a
-   slot contains an integer, then prospective values' tags must be
-   equal to that integer (except nil is always allowed).
-   When a tag does not match, the function
-   buffer_slot_type_mismatch will signal an error.
-
-   If a slot here contains -1, the corresponding variable is read-only.  */
-struct buffer buffer_local_types;
-
 /* Flags indicating which built-in buffer-local variables
    are permanent locals.  */
 static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS];
@@ -360,7 +349,7 @@ The value is never nil.  */)
   if (SCHARS (name) == 0)
     error ("Empty string for buffer name is not allowed");
 
-  b = (struct buffer *) allocate_buffer ();
+  b = allocate_buffer ();
 
   /* An ordinary buffer uses its own struct buffer_text.  */
   b->text = &b->own_text;
@@ -561,7 +550,7 @@ CLONE nil means the indirect buffer's state is reset to default values.  */)
   if (SCHARS (name) == 0)
     error ("Empty string for buffer name is not allowed");
 
-  b = (struct buffer *) allocate_buffer ();
+  b = allocate_buffer ();
 
   b->base_buffer = (XBUFFER (base_buffer)->base_buffer
                    ? XBUFFER (base_buffer)->base_buffer
@@ -896,8 +885,7 @@ is the default binding of the variable. */)
   CHECK_BUFFER (buffer);
   buf = XBUFFER (buffer);
 
-  if (SYMBOLP (variable))
-    variable = indirect_variable (variable);
+  variable = indirect_variable (variable);
 
   /* Look in local_var_list */
   result = Fassoc (variable, buf->local_var_alist);
@@ -2534,26 +2522,11 @@ swap_out_buffer_local_variables (b)
 
       /* Need not do anything if some other buffer's binding is now encached.  */
       tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer;
-      if (BUFFERP (tem) && XBUFFER (tem) == current_buffer)
+      if (EQ (tem, buffer))
        {
-         /* Symbol is set up for this buffer's old local value.
-            Set it up for the current buffer with the default value.  */
-
-         tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->cdr;
-         /* Store the symbol's current value into the alist entry
-            it is currently set up for.  This is so that, if the
-            local is marked permanent, and we make it local again
-            later in Fkill_all_local_variables, we don't lose the value.  */
-         XSETCDR (XCAR (tem),
-                  do_symval_forwarding (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->realvalue));
-         /* Switch to the symbol's default-value alist entry.  */
-         XSETCAR (tem, tem);
-         /* Mark it as current for buffer B.  */
-         XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer = buffer;
-         /* Store the current value into any forwarding in the symbol.  */
-         store_symval_forwarding (sym,
-                                  XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->realvalue,
-                                  XCDR (tem), NULL);
+         /* Symbol is set up for this buffer's old local value:
+            swap it out!  */
+         swap_in_global_binding (sym);
        }
     }
 }
@@ -4434,13 +4407,13 @@ evaporate_overlays (pos)
    in the slot with offset OFFSET.  */
 
 void
-buffer_slot_type_mismatch (offset)
-     int offset;
+buffer_slot_type_mismatch (sym, type)
+     Lisp_Object sym;
+     int type;
 {
-  Lisp_Object sym;
   char *type_name;
 
-  switch (XINT (PER_BUFFER_TYPE (offset)))
+  switch (type)
     {
     case Lisp_Int:
       type_name = "integers";
@@ -4458,7 +4431,6 @@ buffer_slot_type_mismatch (offset)
       abort ();
     }
 
-  sym = PER_BUFFER_SYMBOL (offset);
   error ("Only %s should be stored in the buffer-local variable %s",
         type_name, SDATA (SYMBOL_NAME (sym)));
 }
@@ -5306,9 +5278,9 @@ defvar_per_buffer (namestring, address, type, doc)
 
   XMISCTYPE (val) = Lisp_Misc_Buffer_Objfwd;
   XBUFFER_OBJFWD (val)->offset = offset;
+  XBUFFER_OBJFWD (val)->slottype = type;
   SET_SYMBOL_VALUE (sym, val);
   PER_BUFFER_SYMBOL (offset) = sym;
-  PER_BUFFER_TYPE (offset) = type;
 
   if (PER_BUFFER_IDX (offset) == 0)
     /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
index d9e82d62b171bef9f322a2cb5e5677ac12b670e1..22cb21cb3ae39da00b24645d0d184689c0f56fd5 100644 (file)
@@ -561,6 +561,15 @@ struct buffer
   /* Position where the overlay lists are centered.  */
   EMACS_INT overlay_center;
 
+  /* Changes in the buffer are recorded here for undo.
+     t means don't record anything.
+     This information belongs to the base 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.
+     This comes before `name' because it is marked in a special way.  */
+  Lisp_Object undo_list;
+
   /* Everything from here down must be a Lisp_Object.  */
 
   /* The name of this buffer.  */
@@ -601,15 +610,6 @@ struct buffer
   /* Mode line element that controls format of mode line.  */
   Lisp_Object mode_line_format;
 
-  /* Changes in the buffer are recorded here for undo.
-     t means don't record anything.
-     This information belongs to the base 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.
-     This comes before `name' because it is marked in a special way.  */
-  Lisp_Object undo_list;
-
   /* Analogous to mode_line_format for the line displayed at the top
      of windows.  Nil means don't display that line.  */
   Lisp_Object header_line_format;
@@ -827,18 +827,6 @@ extern struct buffer buffer_local_flags;
    that don't have such names.  */
 
 extern struct buffer buffer_local_symbols;
-
-/* This structure holds the required types for the values in the
-   buffer-local slots.  If a slot contains Qnil, then the
-   corresponding buffer slot may contain a value of any type.  If a
-   slot contains an integer, then prospective values' tags must be
-   equal to that integer (except nil is always allowed).
-   When a tag does not match, the function
-   buffer_slot_type_mismatch will signal an error.
-
-   If a slot here contains -1, the corresponding variable is read-only.  */
-
-extern struct buffer buffer_local_types;
 \f
 extern void delete_all_overlays P_ ((struct buffer *));
 extern void reset_buffer P_ ((struct buffer *));
@@ -852,7 +840,7 @@ extern void set_buffer_internal P_ ((struct buffer *));
 extern void set_buffer_internal_1 P_ ((struct buffer *));
 extern void set_buffer_temp P_ ((struct buffer *));
 extern void record_buffer P_ ((Lisp_Object));
-extern void buffer_slot_type_mismatch P_ ((int)) NO_RETURN;
+extern void buffer_slot_type_mismatch P_ ((Lisp_Object, int)) NO_RETURN;
 extern void fix_overlays_before P_ ((struct buffer *, EMACS_INT, EMACS_INT));
 extern void mmap_set_vars P_ ((int));
 
@@ -1005,11 +993,5 @@ extern int last_per_buffer_idx;
 #define PER_BUFFER_SYMBOL(OFFSET) \
       (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_symbols))
 
-/* Return the type of the per-buffer variable at offset OFFSET in the
-   buffer structure.  */
-
-#define PER_BUFFER_TYPE(OFFSET) \
-      (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_types))
-
 /* arch-tag: 679305dd-d41c-4a50-b170-3caf5c97b2d1
    (do not change this comment) */
index 874f74ba25661eec1353494e4d647620b7bc2562..d7023aafa704c5a2a8e55ab8d76daad95248d54a 100644 (file)
@@ -117,6 +117,9 @@ Boston, MA 02110-1301, USA.  */
 /* Define to 1 if you have /usr/lib/crti.o. */
 #undef HAVE_CRTIN
 
+/* Define to 1 if using D-Bus. */
+#undef HAVE_DBUS
+
 /* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
    don't. */
 #undef HAVE_DECL_SYS_SIGLIST
index e02e22aa0e3d527a73fa9419b5ea16bfd1be0131..88a665b3cf8907b839837fe0984295a2f6cf3d6b 100644 (file)
@@ -864,7 +864,6 @@ do_symval_forwarding (valcontents)
      register Lisp_Object valcontents;
 {
   register Lisp_Object val;
-  int offset;
   if (MISCP (valcontents))
     switch (XMISCTYPE (valcontents))
       {
@@ -879,11 +878,10 @@ do_symval_forwarding (valcontents)
        return *XOBJFWD (valcontents)->objvar;
 
       case Lisp_Misc_Buffer_Objfwd:
-       offset = XBUFFER_OBJFWD (valcontents)->offset;
-       return PER_BUFFER_VALUE (current_buffer, offset);
+       return PER_BUFFER_VALUE (current_buffer,
+                                XBUFFER_OBJFWD (valcontents)->offset);
 
       case Lisp_Misc_Kboard_Objfwd:
-       offset = XKBOARD_OBJFWD (valcontents)->offset;
         /* We used to simply use current_kboard here, but from Lisp
            code, it's value is often unexpected.  It seems nicer to
            allow constructions like this to work as intuitively expected:
@@ -895,7 +893,8 @@ do_symval_forwarding (valcontents)
            last-command and real-last-command, and people may rely on
            that.  I took a quick look at the Lisp codebase, and I
            don't think anything will break.  --lorentey  */
-       return *(Lisp_Object *)(offset + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
+       return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
+                               + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
       }
   return valcontents;
 }
@@ -922,13 +921,15 @@ store_symval_forwarding (symbol, valcontents, newval, buf)
        case Lisp_Misc_Intfwd:
          CHECK_NUMBER (newval);
          *XINTFWD (valcontents)->intvar = XINT (newval);
-         if (*XINTFWD (valcontents)->intvar != XINT (newval))
-           error ("Value out of range for variable `%s'",
-                  SDATA (SYMBOL_NAME (symbol)));
+         /* This can never happen since intvar points to an EMACS_INT
+            which is at least large enough to hold a Lisp_Object.
+             if (*XINTFWD (valcontents)->intvar != XINT (newval))
+              error ("Value out of range for variable `%s'",
+                  SDATA (SYMBOL_NAME (symbol))); */
          break;
 
        case Lisp_Misc_Boolfwd:
-         *XBOOLFWD (valcontents)->boolvar = NILP (newval) ? 0 : 1;
+         *XBOOLFWD (valcontents)->boolvar = !NILP (newval);
          break;
 
        case Lisp_Misc_Objfwd:
@@ -968,12 +969,11 @@ store_symval_forwarding (symbol, valcontents, newval, buf)
        case Lisp_Misc_Buffer_Objfwd:
          {
            int offset = XBUFFER_OBJFWD (valcontents)->offset;
-           Lisp_Object type;
+           Lisp_Object type = XBUFFER_OBJFWD (valcontents)->slottype;
 
-           type = PER_BUFFER_TYPE (offset);
            if (! NILP (type) && ! NILP (newval)
                && XTYPE (newval) != XINT (type))
-             buffer_slot_type_mismatch (offset);
+             buffer_slot_type_mismatch (symbol, XINT (type));
 
            if (buf == NULL)
              buf = current_buffer;
@@ -1011,26 +1011,23 @@ void
 swap_in_global_binding (symbol)
      Lisp_Object symbol;
 {
-  Lisp_Object valcontents, cdr;
-
-  valcontents = SYMBOL_VALUE (symbol);
-  if (!BUFFER_LOCAL_VALUEP (valcontents))
-    abort ();
-  cdr = XBUFFER_LOCAL_VALUE (valcontents)->cdr;
+  Lisp_Object valcontents = SYMBOL_VALUE (symbol);
+  struct Lisp_Buffer_Local_Value *blv = XBUFFER_LOCAL_VALUE (valcontents);
+  Lisp_Object cdr = blv->cdr;
 
   /* Unload the previously loaded binding.  */
   Fsetcdr (XCAR (cdr),
-          do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
+          do_symval_forwarding (blv->realvalue));
 
   /* Select the global binding in the symbol.  */
   XSETCAR (cdr, cdr);
-  store_symval_forwarding (symbol, valcontents, XCDR (cdr), NULL);
+  store_symval_forwarding (symbol, blv->realvalue, XCDR (cdr), NULL);
 
   /* Indicate that the global binding is set up now.  */
-  XBUFFER_LOCAL_VALUE (valcontents)->frame = Qnil;
-  XBUFFER_LOCAL_VALUE (valcontents)->buffer = Qnil;
-  XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame = 0;
-  XBUFFER_LOCAL_VALUE (valcontents)->found_for_buffer = 0;
+  blv->frame = Qnil;
+  blv->buffer = Qnil;
+  blv->found_for_frame = 0;
+  blv->found_for_buffer = 0;
 }
 
 /* Set up the buffer-local symbol SYMBOL for validity in the current buffer.
@@ -1106,31 +1103,7 @@ find_symbol_value (symbol)
   if (BUFFER_LOCAL_VALUEP (valcontents))
     valcontents = swap_in_symval_forwarding (symbol, valcontents);
 
-  if (MISCP (valcontents))
-    {
-      switch (XMISCTYPE (valcontents))
-       {
-       case Lisp_Misc_Intfwd:
-         XSETINT (val, *XINTFWD (valcontents)->intvar);
-         return val;
-
-       case Lisp_Misc_Boolfwd:
-         return (*XBOOLFWD (valcontents)->boolvar ? Qt : Qnil);
-
-       case Lisp_Misc_Objfwd:
-         return *XOBJFWD (valcontents)->objvar;
-
-       case Lisp_Misc_Buffer_Objfwd:
-         return PER_BUFFER_VALUE (current_buffer,
-                                    XBUFFER_OBJFWD (valcontents)->offset);
-
-       case Lisp_Misc_Kboard_Objfwd:
-         return *(Lisp_Object *)(XKBOARD_OBJFWD (valcontents)->offset
-                                 + (char *)FRAME_KBOARD (SELECTED_FRAME ()));
-       }
-    }
-
-  return valcontents;
+  return do_symval_forwarding (valcontents);
 }
 
 DEFUN ("symbol-value", Fsymbol_value, Ssymbol_value, 1, 1, 0,
@@ -1240,9 +1213,9 @@ set_internal (symbol, newval, buf, bindflag)
          || buf != XBUFFER (XBUFFER_LOCAL_VALUE (valcontents)->buffer)
          || (XBUFFER_LOCAL_VALUE (valcontents)->check_frame
              && !EQ (selected_frame, XBUFFER_LOCAL_VALUE (valcontents)->frame))
-         || (BUFFER_LOCAL_VALUEP (valcontents)
-             && EQ (XCAR (current_alist_element),
-                    current_alist_element)))
+         /* Also unload a global binding (if the var is local_if_set). */
+         || (EQ (XCAR (current_alist_element),
+                 current_alist_element)))
        {
          /* The currently loaded binding is not necessarily valid.
             We need to unload it, and choose a new binding.  */
@@ -1260,7 +1233,7 @@ set_internal (symbol, newval, buf, bindflag)
            {
              /* This buffer still sees the default value.  */
 
-             /* If the variable is a Lisp_Some_Buffer_Local_Value,
+             /* If the variable is not local_if_set,
                 or if this is `let' rather than `set',
                 make CURRENT-ALIST-ELEMENT point to itself,
                 indicating that we're seeing the default value.
@@ -1301,6 +1274,9 @@ set_internal (symbol, newval, buf, bindflag)
          XBUFFER_LOCAL_VALUE (valcontents)->frame = selected_frame;
        }
       innercontents = XBUFFER_LOCAL_VALUE (valcontents)->realvalue;
+
+      /* Store the new value in the cons-cell.  */
+      XSETCDR (XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr), newval);
     }
 
   /* If storing void (making the symbol void), forward only through
@@ -1310,24 +1286,6 @@ set_internal (symbol, newval, buf, bindflag)
   else
     store_symval_forwarding (symbol, innercontents, newval, buf);
 
-  /* If we just set a variable whose current binding is frame-local,
-     store the new value in the frame parameter too.  */
-
-  if (BUFFER_LOCAL_VALUEP (valcontents))
-    {
-      /* What binding is loaded right now?  */
-      current_alist_element
-       = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
-
-      /* If the current buffer is not the buffer whose binding is
-        loaded, or if there may be frame-local bindings and the frame
-        isn't the right one, or if it's a Lisp_Buffer_Local_Value and
-        the default binding is loaded, the loaded binding may be the
-        wrong one.  */
-      if (XBUFFER_LOCAL_VALUE (valcontents)->found_for_frame)
-       XSETCDR (current_alist_element, newval);
-    }
-
   return newval;
 }
 \f
@@ -2320,7 +2278,7 @@ NUMBER may be an integer or a floating point number.  */)
     }
 
   if (sizeof (int) == sizeof (EMACS_INT))
-    sprintf (buffer, "%d", XINT (number));
+    sprintf (buffer, "%d", (int) XINT (number));
   else if (sizeof (long) == sizeof (EMACS_INT))
     sprintf (buffer, "%ld", (long) XINT (number));
   else
diff --git a/src/dbusbind.c b/src/dbusbind.c
new file mode 100644 (file)
index 0000000..07fc242
--- /dev/null
@@ -0,0 +1,817 @@
+/* Elisp bindings for D-Bus.
+   Copyright (C) 2007 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, 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., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
+
+#include "config.h"
+
+#ifdef HAVE_DBUS
+#include <stdlib.h>
+#include <dbus/dbus.h>
+#include "lisp.h"
+#include "frame.h"
+#include "termhooks.h"
+#include "keyboard.h"
+
+\f
+/* Subroutines.  */
+Lisp_Object Qdbus_get_unique_name;
+Lisp_Object Qdbus_call_method;
+Lisp_Object Qdbus_send_signal;
+Lisp_Object Qdbus_register_signal;
+Lisp_Object Qdbus_unregister_signal;
+
+/* D-Bus error symbol.  */
+Lisp_Object Qdbus_error;
+
+/* Lisp symbols of the system and session buses.  */
+Lisp_Object QCdbus_system_bus, QCdbus_session_bus;
+
+/* Hash table which keeps function definitions.  */
+Lisp_Object Vdbus_registered_functions_table;
+
+/* Whether to debug D-Bus.  */
+Lisp_Object Vdbus_debug;
+
+\f
+/* We use "xd_" and "XD_" as prefix for all internal symbols, because
+   we don't want to poison other namespaces with "dbus_".  */
+
+/* Raise a Lisp error from a D-Bus error.  */
+#define XD_ERROR(error)                                                        \
+  {                                                                    \
+    char s[1024];                                                      \
+    strcpy (s, error.message);                                         \
+    dbus_error_free (&error);                                          \
+    /* Remove the trailing newline.  */                                        \
+    if (strchr (s, '\n') != NULL)                                      \
+      s[strlen (s) - 1] = '\0';                                                \
+    xsignal1 (Qdbus_error, build_string (s));                          \
+  }
+
+/* Macros for debugging.  In order to enable them, build with
+   "make MYCPPFLAGS='-DDBUS_DEBUG'".  */
+#ifdef DBUS_DEBUG
+#define XD_DEBUG_MESSAGE(...)          \
+  {                                    \
+    char s[1024];                      \
+    sprintf (s, __VA_ARGS__);          \
+    printf ("%s: %s\n", __func__, s);  \
+    message ("%s: %s", __func__, s);   \
+  }
+#define XD_DEBUG_VALID_LISP_OBJECT_P(object)                           \
+  if (!valid_lisp_object_p (object))                                   \
+    {                                                                  \
+      XD_DEBUG_MESSAGE ("%s Assertion failure", __LINE__);             \
+      xsignal1 (Qdbus_error, build_string ("Assertion failure"));      \
+    }
+
+#else /* !DBUS_DEBUG */
+#define XD_DEBUG_MESSAGE(...)          \
+  if (!NILP (Vdbus_debug))             \
+    {                                  \
+      char s[1024];                    \
+      sprintf (s, __VA_ARGS__);                \
+      message ("%s: %s", __func__, s); \
+    }
+#define XD_DEBUG_VALID_LISP_OBJECT_P(object)
+#endif
+
+/* Determine the DBusType of a given Lisp object.  It is used to
+   convert Lisp objects, being arguments of `dbus-call-method' or
+   `dbus-send-signal', into corresponding C values appended as
+   arguments to a D-Bus message.  */
+#define XD_LISP_OBJECT_TO_DBUS_TYPE(object)                            \
+  (EQ (object, Qt) || EQ (object, Qnil)) ? DBUS_TYPE_BOOLEAN :         \
+  (NATNUMP (object)) ? DBUS_TYPE_UINT32 :                              \
+  (INTEGERP (object)) ? DBUS_TYPE_INT32 :                              \
+  (FLOATP (object)) ? DBUS_TYPE_DOUBLE :                               \
+  (STRINGP (object)) ? DBUS_TYPE_STRING :                              \
+  DBUS_TYPE_INVALID
+
+/* Extract C value from Lisp OBJECT.  DTYPE must be a valid DBusType,
+   as detected by XD_LISP_OBJECT_TO_DBUS_TYPE.  Compound types are not
+   supported (yet).  It is used to convert Lisp objects, being
+   arguments of `dbus-call-method' or `dbus-send-signal', into
+   corresponding C values appended as arguments to a D-Bus
+   message.  */
+char *
+xd_retrieve_value (dtype, object)
+     uint dtype;
+     Lisp_Object object;
+{
+
+  XD_DEBUG_VALID_LISP_OBJECT_P (object);
+  switch (dtype)
+    {
+    case DBUS_TYPE_BOOLEAN:
+      XD_DEBUG_MESSAGE ("%d %s", dtype, (NILP (object)) ? "false" : "true");
+      return (NILP (object)) ? (char *) FALSE : (char *) TRUE;
+    case DBUS_TYPE_UINT32:
+      XD_DEBUG_MESSAGE ("%d %d", dtype, XUINT (object));
+      return (char *) XUINT (object);
+    case DBUS_TYPE_INT32:
+      XD_DEBUG_MESSAGE ("%d %d", dtype, XINT (object));
+      return (char *) XINT (object);
+    case DBUS_TYPE_DOUBLE:
+      XD_DEBUG_MESSAGE ("%d %d", dtype, XFLOAT (object));
+      return (char *) XFLOAT (object);
+    case DBUS_TYPE_STRING:
+      XD_DEBUG_MESSAGE ("%d %s", dtype, SDATA (object));
+      return SDATA (object);
+    default:
+      XD_DEBUG_MESSAGE ("DBus-Type %d not supported", dtype);
+      return NULL;
+    }
+}
+
+/* Retrieve C value from a DBusMessageIter structure ITER, and return
+   a converted Lisp object.  The type DTYPE of the argument of the
+   D-Bus message must be a valid DBusType.  Compound D-Bus types are
+   partly supported; they result always in a Lisp list.  */
+Lisp_Object
+xd_retrieve_arg (dtype, iter)
+     uint dtype;
+     DBusMessageIter *iter;
+{
+
+  switch (dtype)
+    {
+    case DBUS_TYPE_BOOLEAN:
+      {
+       dbus_bool_t val;
+       dbus_message_iter_get_basic (iter, &val);
+       XD_DEBUG_MESSAGE ("%d %s", dtype, (val == FALSE) ? "false" : "true");
+       return (val == FALSE) ? Qnil : Qt;
+      }
+    case DBUS_TYPE_INT32:
+    case DBUS_TYPE_UINT32:
+      {
+       dbus_uint32_t val;
+       dbus_message_iter_get_basic (iter, &val);
+       XD_DEBUG_MESSAGE ("%d %d", dtype, val);
+       return make_number (val);
+      }
+    case DBUS_TYPE_STRING:
+    case DBUS_TYPE_OBJECT_PATH:
+      {
+       char *val;
+       dbus_message_iter_get_basic (iter, &val);
+       XD_DEBUG_MESSAGE ("%d %s", dtype, val);
+       return build_string (val);
+      }
+    case DBUS_TYPE_ARRAY:
+    case DBUS_TYPE_VARIANT:
+    case DBUS_TYPE_STRUCT:
+    case DBUS_TYPE_DICT_ENTRY:
+      {
+       Lisp_Object result;
+       struct gcpro gcpro1;
+       result = Qnil;
+       GCPRO1 (result);
+       DBusMessageIter subiter;
+       int subtype;
+       dbus_message_iter_recurse (iter, &subiter);
+       while ((subtype = dbus_message_iter_get_arg_type (&subiter))
+              != DBUS_TYPE_INVALID)
+         {
+           result = Fcons (xd_retrieve_arg (subtype, &subiter), result);
+           dbus_message_iter_next (&subiter);
+         }
+       RETURN_UNGCPRO (Fnreverse (result));
+      }
+    default:
+      XD_DEBUG_MESSAGE ("DBusType %d not supported", dtype);
+      return Qnil;
+    }
+}
+
+
+/* Initialize D-Bus connection.  BUS is a Lisp symbol, either :system
+   or :session.  It tells which D-Bus to be initialized.  */
+DBusConnection *
+xd_initialize (bus)
+     Lisp_Object bus;
+{
+  DBusConnection *connection;
+  DBusError derror;
+
+  /* Parameter check.  */
+  CHECK_SYMBOL (bus);
+  if (!((EQ (bus, QCdbus_system_bus)) || (EQ (bus, QCdbus_session_bus))))
+    xsignal2 (Qdbus_error, build_string ("Wrong bus name"), bus);
+
+  /* Open a connection to the bus.  */
+  dbus_error_init (&derror);
+
+  if (EQ (bus, QCdbus_system_bus))
+    connection = dbus_bus_get (DBUS_BUS_SYSTEM, &derror);
+  else
+    connection = dbus_bus_get (DBUS_BUS_SESSION, &derror);
+
+  if (dbus_error_is_set (&derror))
+    XD_ERROR (derror);
+
+  if (connection == NULL)
+    xsignal2 (Qdbus_error, build_string ("No connection"), bus);
+
+  /* Return the result.  */
+  return connection;
+}
+
+DEFUN ("dbus-get-unique-name", Fdbus_get_unique_name, Sdbus_get_unique_name,
+       1, 1, 0,
+       doc: /* Return the unique name of Emacs registered at D-Bus BUS as string.  */)
+     (bus)
+     Lisp_Object bus;
+{
+  DBusConnection *connection;
+  char name[1024];
+
+  /* Check parameters.  */
+  CHECK_SYMBOL (bus);
+
+  /* Open a connection to the bus.  */
+  connection = xd_initialize (bus);
+
+  /* Request the name.  */
+  strcpy (name, dbus_bus_get_unique_name (connection));
+  if (name == NULL)
+    xsignal1 (Qdbus_error, build_string ("No unique name available"));
+
+  /* Return.  */
+  return build_string (name);
+}
+
+DEFUN ("dbus-call-method", Fdbus_call_method, Sdbus_call_method, 5, MANY, 0,
+       doc: /* Call METHOD on the D-Bus BUS.
+
+BUS is either the symbol `:system' or the symbol `:session'.
+
+SERVICE is the D-Bus service name to be used.  PATH is the D-Bus
+object path SERVICE is registered at.  INTERFACE is an interface
+offered by SERVICE.  It must provide METHOD.
+
+All other arguments ARGS are passed to METHOD as arguments.  They are
+converted into D-Bus types via the following rules:
+
+  t and nil => DBUS_TYPE_BOOLEAN
+  number    => DBUS_TYPE_UINT32
+  integer   => DBUS_TYPE_INT32
+  float     => DBUS_TYPE_DOUBLE
+  string    => DBUS_TYPE_STRING
+
+Other Lisp objects are not supported as input arguments of METHOD.
+
+`dbus-call-method' returns the resulting values of METHOD as a list of
+Lisp objects.  The type conversion happens the other direction as for
+input arguments.  Additionally to the types supported for input
+arguments, the D-Bus compound types DBUS_TYPE_ARRAY, DBUS_TYPE_VARIANT,
+DBUS_TYPE_STRUCT and DBUS_TYPE_DICT_ENTRY are accepted.  All of them
+are converted into a list of Lisp objects which correspond to the
+elements of the D-Bus container.  Example:
+
+\(dbus-call-method
+  :session "GetKeyField" "org.gnome.seahorse"
+  "/org/gnome/seahorse/keys/openpgp" "org.gnome.seahorse.Keys"
+  "openpgp:657984B8C7A966DD" "simple-name")
+
+  => (t ("Philip R. Zimmermann"))
+
+If the result of the METHOD call is just one value, the converted Lisp
+object is returned instead of a list containing this single Lisp object.
+
+\(dbus-call-method
+  :system "GetPropertyString" "org.freedesktop.Hal"
+  "/org/freedesktop/Hal/devices/computer" "org.freedesktop.Hal.Device"
+  "system.kernel.machine")
+
+  => "i686"
+
+usage: (dbus-call-method BUS METHOD SERVICE PATH INTERFACE &rest ARGS)  */)
+     (nargs, args)
+     int nargs;
+     register Lisp_Object *args;
+{
+  Lisp_Object bus, method, service, path, interface;
+  Lisp_Object result;
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DBusConnection *connection;
+  DBusMessage *dmessage;
+  DBusMessage *reply;
+  DBusMessageIter iter;
+  DBusError derror;
+  uint dtype;
+  int i;
+  char *value;
+
+  /* Check parameters.  */
+  bus = args[0];
+  method = args[1];
+  service = args[2];
+  path = args[3];
+  interface = args[4];
+
+  CHECK_SYMBOL (bus);
+  CHECK_STRING (method);
+  CHECK_STRING (service);
+  CHECK_STRING (path);
+  CHECK_STRING (interface);
+  GCPRO5 (bus, method, service, path, interface);
+
+  XD_DEBUG_MESSAGE ("%s %s %s %s",
+                   SDATA (method),
+                   SDATA (service),
+                   SDATA (path),
+                   SDATA (interface));
+
+  /* Open a connection to the bus.  */
+  connection = xd_initialize (bus);
+
+  /* Create the message.  */
+  dmessage = dbus_message_new_method_call (SDATA (service),
+                                          SDATA (path),
+                                          SDATA (interface),
+                                          SDATA (method));
+  if (dmessage == NULL)
+    {
+      UNGCPRO;
+      xsignal1 (Qdbus_error, build_string ("Unable to create a new message"));
+    }
+
+  UNGCPRO;
+
+  /* Append parameters to the message.  */
+  for (i = 5; i < nargs; ++i)
+    {
+
+      XD_DEBUG_VALID_LISP_OBJECT_P (args[i]);
+      XD_DEBUG_MESSAGE ("Parameter%d %s",
+                       i-4,
+                       SDATA (format2 ("%s", args[i], Qnil)));
+
+      dtype = XD_LISP_OBJECT_TO_DBUS_TYPE (args[i]);
+      if (dtype == DBUS_TYPE_INVALID)
+       xsignal2 (Qdbus_error, build_string ("Not a valid argument"), args[i]);
+
+      value = (char *) xd_retrieve_value (dtype, args[i]);
+
+      if (!dbus_message_append_args (dmessage,
+                                    dtype,
+                                    &value,
+                                    DBUS_TYPE_INVALID))
+       xsignal2 (Qdbus_error,
+                 build_string ("Unable to append argument"), args[i]);
+    }
+
+  /* Send the message.  */
+  dbus_error_init (&derror);
+  reply = dbus_connection_send_with_reply_and_block (connection,
+                                                    dmessage,
+                                                    -1,
+                                                    &derror);
+
+  if (dbus_error_is_set (&derror))
+    XD_ERROR (derror);
+
+  if (reply == NULL)
+    xsignal1 (Qdbus_error, build_string ("No reply"));
+
+  XD_DEBUG_MESSAGE ("Message sent");
+
+  /* Collect the results.  */
+  result = Qnil;
+  GCPRO1 (result);
+
+  if (!dbus_message_iter_init (reply, &iter))
+    {
+      UNGCPRO;
+      xsignal1 (Qdbus_error, build_string ("Cannot read reply"));
+    }
+
+  /* Loop over the parameters of the D-Bus reply message.  Construct a
+     Lisp list, which is returned by `dbus-call-method'.  */
+  while ((dtype = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID)
+    {
+      result = Fcons (xd_retrieve_arg (dtype, &iter), result);
+      dbus_message_iter_next (&iter);
+    }
+
+  /* Cleanup.  */
+  dbus_message_unref (dmessage);
+  dbus_message_unref (reply);
+
+  /* Return the result.  If there is only one single Lisp object,
+     return it as-it-is, otherwise return the reversed list.  */
+  if (XUINT (Flength (result)) == 1)
+    RETURN_UNGCPRO (XCAR (result));
+  else
+    RETURN_UNGCPRO (Fnreverse (result));
+}
+
+DEFUN ("dbus-send-signal", Fdbus_send_signal, Sdbus_send_signal, 5, MANY, 0,
+       doc: /* Send signal SIGNAL on the D-Bus BUS.
+
+BUS is either the symbol `:system' or the symbol `:session'.
+
+SERVICE is the D-Bus service name SIGNAL is sent from.  PATH is the
+D-Bus object path SERVICE is registered at.  INTERFACE is an interface
+offered by SERVICE.  It must provide signal SIGNAL.
+
+All other arguments ARGS are passed to SIGNAL as arguments.  They are
+converted into D-Bus types via the following rules:
+
+  t and nil => DBUS_TYPE_BOOLEAN
+  number    => DBUS_TYPE_UINT32
+  integer   => DBUS_TYPE_INT32
+  float     => DBUS_TYPE_DOUBLE
+  string    => DBUS_TYPE_STRING
+
+Other Lisp objects are not supported as arguments of SIGNAL.
+
+Example:
+
+\(dbus-send-signal
+  :session "Started" "org.gnu.emacs" "/org/gnu/emacs" "org.gnu.emacs")))
+
+usage: (dbus-send-signal BUS SIGNAL SERVICE PATH INTERFACE &rest ARGS)  */)
+     (nargs, args)
+     int nargs;
+     register Lisp_Object *args;
+{
+  Lisp_Object bus, signal, service, path, interface;
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+  DBusConnection *connection;
+  DBusMessage *dmessage;
+  uint dtype;
+  int i;
+  char *value;
+
+  /* Check parameters.  */
+  bus = args[0];
+  signal = args[1];
+  service = args[2];
+  path = args[3];
+  interface = args[4];
+
+  CHECK_SYMBOL (bus);
+  CHECK_STRING (signal);
+  CHECK_STRING (service);
+  CHECK_STRING (path);
+  CHECK_STRING (interface);
+  GCPRO5 (bus, signal, service, path, interface);
+
+  XD_DEBUG_MESSAGE ("%s %s %s %s",
+                   SDATA (signal),
+                   SDATA (service),
+                   SDATA (path),
+                   SDATA (interface));
+
+  /* Open a connection to the bus.  */
+  connection = xd_initialize (bus);
+
+  /* Create the message.  */
+  dmessage = dbus_message_new_signal (SDATA (path),
+                                     SDATA (interface),
+                                     SDATA (signal));
+  if (dmessage == NULL)
+    {
+      UNGCPRO;
+      xsignal1 (Qdbus_error, build_string ("Unable to create a new message"));
+    }
+
+  UNGCPRO;
+
+  /* Append parameters to the message.  */
+  for (i = 5; i < nargs; ++i)
+    {
+      XD_DEBUG_VALID_LISP_OBJECT_P (args[i]);
+      XD_DEBUG_MESSAGE ("Parameter%d %s",
+                       i-4,
+                       SDATA (format2 ("%s", args[i], Qnil)));
+
+      dtype = XD_LISP_OBJECT_TO_DBUS_TYPE (args[i]);
+      if (dtype == DBUS_TYPE_INVALID)
+       xsignal2 (Qdbus_error, build_string ("Not a valid argument"), args[i]);
+
+      value = (char *) xd_retrieve_value (dtype, args[i]);
+
+      if (!dbus_message_append_args (dmessage,
+                                    dtype,
+                                    &value,
+                                    DBUS_TYPE_INVALID))
+       xsignal2 (Qdbus_error,
+                 build_string ("Unable to append argument"), args[i]);
+    }
+
+  /* Send the message.  The message is just added to the outgoing
+     message queue.  */
+  if (!dbus_connection_send (connection, dmessage, NULL))
+    xsignal1 (Qdbus_error, build_string ("Cannot send message"));
+
+  /* Flush connection to ensure the message is handled.  */
+  dbus_connection_flush (connection);
+
+  XD_DEBUG_MESSAGE ("Signal sent");
+
+  /* Cleanup.  */
+  dbus_message_unref (dmessage);
+
+  /* Return.  */
+  return Qt;
+}
+
+/* Read queued incoming message of the D-Bus BUS.  BUS is a Lisp
+   symbol, either :system or :session.  */
+Lisp_Object
+xd_read_message (bus)
+     Lisp_Object bus;
+{
+  Lisp_Object key;
+  struct gcpro gcpro1;
+  static struct input_event event;
+  DBusConnection *connection;
+  DBusMessage *dmessage;
+  DBusMessageIter iter;
+  uint dtype;
+  char service[1024], path[1024], interface[1024], member[1024];
+
+  /* Open a connection to the bus.  */
+  connection = xd_initialize (bus);
+
+  /* Non blocking read of the next available message.  */
+  dbus_connection_read_write (connection, 0);
+  dmessage = dbus_connection_pop_message (connection);
+
+  /* Return if there is no queued message.  */
+  if (dmessage == NULL)
+    return;
+
+  /* There is a message in the queue.  Construct the D-Bus event.  */
+  XD_DEBUG_MESSAGE ("Event received");
+  EVENT_INIT (event);
+
+  event.kind = DBUS_EVENT;
+  event.frame_or_window = Qnil;
+
+  /* Collect the parameters.  */
+  event.arg = Qnil;
+  GCPRO1 (event.arg);
+
+  if (!dbus_message_iter_init (dmessage, &iter))
+    {
+      UNGCPRO;
+      XD_DEBUG_MESSAGE ("Cannot read event");
+      return;
+    }
+
+  /* Loop over the resulting parameters.  Construct a list.  */
+  while ((dtype = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID)
+    {
+      event.arg = Fcons (xd_retrieve_arg (dtype, &iter), event.arg);
+      dbus_message_iter_next (&iter);
+    }
+
+  /* The arguments are stored in reverse order.  Reorder them.  */
+  event.arg = Fnreverse (event.arg);
+
+  /* Read service, object path interface and member from the
+     message.  */
+  strcpy (service,   dbus_message_get_sender (dmessage));
+  strcpy (path,      dbus_message_get_path (dmessage));
+  strcpy (interface, dbus_message_get_interface (dmessage));
+  strcpy (member,    dbus_message_get_member (dmessage));
+
+  /* Add them to the event.  */
+  event.arg = Fcons ((member == NULL ? Qnil : build_string (member)),
+                    event.arg);
+  event.arg = Fcons ((interface == NULL ? Qnil : build_string (interface)),
+                    event.arg);
+  event.arg = Fcons ((path == NULL ? Qnil : build_string (path)),
+                    event.arg);
+  event.arg = Fcons ((service == NULL ? Qnil : build_string (service)),
+                    event.arg);
+
+  /* Add the bus symbol to the event.  */
+  event.arg = Fcons (bus, event.arg);
+
+  /* Add the registered function of the message.  */
+  key = list3 (bus,
+              (interface == NULL ? Qnil : build_string (interface)),
+              (member == NULL ? Qnil : build_string (member)));
+  event.arg = Fcons (Fgethash (key, Vdbus_registered_functions_table, Qnil),
+                    event.arg);
+
+  /* Store it into the input event queue.  */
+  kbd_buffer_store_event (&event);
+
+  /* Cleanup.  */
+  dbus_message_unref (dmessage);
+  UNGCPRO;
+}
+
+/* Read queued incoming messages from the system and session buses.  */
+void
+xd_read_queued_messages ()
+{
+
+  /* Vdbus_registered_functions_table will be made as hash table in
+     dbus.el.  When it isn't loaded yet, it doesn't make sense to
+     handle D-Bus messages.  Furthermore, we ignore all Lisp errors
+     during the call.  */
+  if (HASH_TABLE_P (Vdbus_registered_functions_table))
+    {
+      internal_condition_case_1 (xd_read_message, QCdbus_system_bus,
+                                Qerror, Fidentity);
+      internal_condition_case_1 (xd_read_message, QCdbus_session_bus,
+                                Qerror, Fidentity);
+    }
+}
+
+DEFUN ("dbus-register-signal", Fdbus_register_signal, Sdbus_register_signal,
+       6, 6, 0,
+       doc: /* Register for signal SIGNAL on the D-Bus BUS.
+
+BUS is either the symbol `:system' or the symbol `:session'.
+
+SERVICE is the D-Bus service name used by the sending D-Bus object.
+It can be either a known name or the unique name of the D-Bus object
+sending the signal.  When SERVICE is nil, related signals from all
+D-Bus objects shall be accepted.
+
+PATH is the D-Bus object path SERVICE is registered.  It can also be
+nil if the path name of incoming signals shall not be checked.
+
+INTERFACE is an interface offered by SERVICE.  It must provide SIGNAL.
+HANDLER is a Lisp function to be called when the signal is received.
+It must accept as arguments the values SIGNAL is sending.  INTERFACE,
+SIGNAL and HANDLER must not be nil.  Example:
+
+\(defun my-signal-handler (device)
+  (message "Device %s added" device))
+
+\(dbus-register-signal
+  :system "DeviceAdded"
+  (dbus-get-name-owner :system "org.freedesktop.Hal")
+  "/org/freedesktop/Hal/Manager" "org.freedesktop.Hal.Manager"
+  'my-signal-handler)
+
+  => (:system "org.freedesktop.Hal.Manager" "DeviceAdded")
+
+`dbus-register-signal' returns an object, which can be used in
+`dbus-unregister-signal' for removing the registration.  */)
+     (bus, signal, service, path, interface, handler)
+     Lisp_Object bus, signal, service, path, interface, handler;
+{
+  Lisp_Object key;
+  DBusConnection *connection;
+  char rule[1024];
+  DBusError derror;
+
+  /* Check parameters.  */
+  CHECK_SYMBOL (bus);
+  CHECK_STRING (signal);
+  if (!NILP (service)) CHECK_STRING (service);
+  if (!NILP (path)) CHECK_STRING (path);
+  CHECK_STRING (interface);
+  CHECK_SYMBOL (handler);
+
+  /* Open a connection to the bus.  */
+  connection = xd_initialize (bus);
+
+  /* Create a rule to receive related signals.  */
+  sprintf (rule,
+          "type='signal',interface='%s',member=%s%",
+          SDATA (interface),
+          SDATA (signal));
+
+  /* Add service and path to the rule if they are non-nil.  */
+  if (!NILP (service))
+    sprintf (rule, "%s,sender='%s'%", rule, SDATA (service));
+
+  if (!NILP (path))
+    sprintf (rule, "%s,path='%s'", rule, SDATA (path));
+
+  /* Add the rule to the bus.  */
+  dbus_error_init (&derror);
+  dbus_bus_add_match (connection, rule, &derror);
+  if (dbus_error_is_set (&derror))
+    XD_ERROR (derror);
+
+  XD_DEBUG_MESSAGE ("Matching rule \"%s\" created", rule);
+
+  /* Create a hash table entry.  */
+  key = list3 (bus, interface, signal);
+  Fputhash (key, handler, Vdbus_registered_functions_table);
+  XD_DEBUG_MESSAGE ("\"%s\" registered with handler \"%s\"",
+                   SDATA (format2 ("%s", key, Qnil)),
+                   SDATA (format2 ("%s", handler, Qnil)));
+
+  /* Return key.  */
+  return key;
+}
+
+DEFUN ("dbus-unregister-signal", Fdbus_unregister_signal, Sdbus_unregister_signal,
+       1, 1, 0,
+       doc: /* Unregister OBJECT from the D-Bus.
+OBJECT must be the result of a preceding `dbus-register-signal' call.  */)
+     (object)
+     Lisp_Object object;
+{
+
+  /* Check parameters.  */
+  CHECK_SYMBOL (object);
+
+  XD_DEBUG_MESSAGE ("\"%s\" unregistered with handler \"%s\"",
+                   SDATA (format2 ("%s", object, Qnil)),
+                   SDATA (format2 ("%s", Fsymbol_function (object), Qnil)));
+
+  /* Unintern the signal symbol.  */
+  Fremhash (object, Vdbus_registered_functions_table);
+
+  /* Return.  */
+  return Qnil;
+}
+
+\f
+void
+syms_of_dbusbind ()
+{
+
+  Qdbus_get_unique_name = intern ("dbus-get-unique-name");
+  staticpro (&Qdbus_get_unique_name);
+  defsubr (&Sdbus_get_unique_name);
+
+  Qdbus_call_method = intern ("dbus-call-method");
+  staticpro (&Qdbus_call_method);
+  defsubr (&Sdbus_call_method);
+
+  Qdbus_send_signal = intern ("dbus-send-signal");
+  staticpro (&Qdbus_send_signal);
+  defsubr (&Sdbus_send_signal);
+
+  Qdbus_register_signal = intern ("dbus-register-signal");
+  staticpro (&Qdbus_register_signal);
+  defsubr (&Sdbus_register_signal);
+
+  Qdbus_unregister_signal = intern ("dbus-unregister-signal");
+  staticpro (&Qdbus_unregister_signal);
+  defsubr (&Sdbus_unregister_signal);
+
+  Qdbus_error = intern ("dbus-error");
+  staticpro (&Qdbus_error);
+  Fput (Qdbus_error, Qerror_conditions,
+       list2 (Qdbus_error, Qerror));
+  Fput (Qdbus_error, Qerror_message,
+       build_string ("D-Bus error"));
+
+  QCdbus_system_bus = intern (":system");
+  staticpro (&QCdbus_system_bus);
+
+  QCdbus_session_bus = intern (":session");
+  staticpro (&QCdbus_session_bus);
+
+  DEFVAR_LISP ("dbus-registered-functions-table", &Vdbus_registered_functions_table,
+    doc: /* Hash table of registered functions for D-Bus.
+The key in the hash table is the list (BUS INTERFACE MEMBER).  BUS is
+either the symbol `:system' or the symbol `:session'.  INTERFACE is a
+string which denotes a D-Bus interface, and MEMBER, also a string, is
+either a method or a signal INTERFACE is offering.
+
+The value in the hash table a the function to be called when a D-Bus
+message, which matches the key criteria, arrives.  */);
+  /* We initialize Vdbus_registered_functions_table in dbus.el,
+     because we need to define a hash table function first.  */
+  Vdbus_registered_functions_table = Qnil;
+
+  DEFVAR_LISP ("dbus-debug", &Vdbus_debug,
+    doc: /* If non-nil, debug messages of D-Bus bindings are raised.  */);
+#ifdef DBUS_DEBUG
+  Vdbus_debug = Qt;
+#else
+  Vdbus_debug = Qnil;
+#endif
+
+  Fprovide (intern ("dbusbind"), Qnil);
+
+}
+
+#endif /* HAVE_DBUS */
+
+/* arch-tag: 0e828477-b571-4fe4-b559-5c9211bc14b8
+   (do not change this comment) */
index 973630609b64a03e51f9fbb7bc83fd5257c9f847..d7bca7acbc4762768bf4a590c30eb716830d83d1 100644 (file)
@@ -6893,8 +6893,12 @@ init_display ()
       exit (1);
     }
 
+#ifdef WINDOWSNT
+  terminal_type = "w32console";
+#else
   /* Look at the TERM variable.  */
   terminal_type = (char *) getenv ("TERM");
+#endif
   if (!terminal_type)
     {
 #ifdef VMS
index 66e3883494ff0ddd8a37bedd2c9bcd6057fd0072..fa1b229bfc4cc16eed57802bd514616776c42150 100644 (file)
@@ -3673,8 +3673,10 @@ usage: (format STRING &rest OBJECTS)  */)
              precision[n+1] = 10 * precision[n+1] + *format - '0';
          }
 
-       if (format - this_format_start + 1 > longest_format)
-         longest_format = format - this_format_start + 1;
+       /* Extra +1 for 'l' that we may need to insert into the
+          format.  */
+       if (format - this_format_start + 2 > longest_format)
+         longest_format = format - this_format_start + 2;
 
        if (format == end)
          error ("Format string ends in middle of format specifier");
@@ -3735,7 +3737,7 @@ usage: (format STRING &rest OBJECTS)  */)
                  && *format != 'i' && *format != 'X' && *format != 'c')
                error ("Invalid format operation %%%c", *format);
 
-           thissize = 30;
+           thissize = 30 + (precision[n] > 0 ? precision[n] : 0);
            if (*format == 'c')
              {
                if (! ASCII_CHAR_P (XINT (args[n]))
@@ -3933,23 +3935,40 @@ usage: (format STRING &rest OBJECTS)  */)
                     format - this_format_start);
              this_format[format - this_format_start] = 0;
 
-             if (INTEGERP (args[n]))
+             if (format[-1] == 'e' || format[-1] == 'f' || format[-1] == 'g')
+               sprintf (p, this_format, XFLOAT_DATA (args[n]));
+             else
                {
-                 if (format[-1] == 'd')
-                   sprintf (p, this_format, XINT (args[n]));
-                 /* Don't sign-extend for octal or hex printing.  */
+                 if (sizeof (EMACS_INT) > sizeof (int)
+                     && format[-1] != 'c')
+                   {
+                     /* Insert 'l' before format spec.  */
+                     this_format[format - this_format_start]
+                       = this_format[format - this_format_start - 1];
+                     this_format[format - this_format_start - 1] = 'l';
+                     this_format[format - this_format_start + 1] = 0;
+                   }
+
+                 if (INTEGERP (args[n]))
+                   {
+                     if (format[-1] == 'c')
+                       sprintf (p, this_format, (int) XINT (args[n]));
+                     else if (format[-1] == 'd')
+                       sprintf (p, this_format, XINT (args[n]));
+                     /* Don't sign-extend for octal or hex printing.  */
+                     else
+                       sprintf (p, this_format, XUINT (args[n]));
+                   }
+                 else if (format[-1] == 'c')
+                   sprintf (p, this_format, (int) XFLOAT_DATA (args[n]));
+                 else if (format[-1] == 'd')
+                   /* Maybe we should use "%1.0f" instead so it also works
+                      for values larger than MAXINT.  */
+                   sprintf (p, this_format, (EMACS_INT) XFLOAT_DATA (args[n]));
                  else
-                   sprintf (p, this_format, XUINT (args[n]));
+                   /* Don't sign-extend for octal or hex printing.  */
+                   sprintf (p, this_format, (EMACS_UINT) XFLOAT_DATA (args[n]));
                }
-             else if (format[-1] == 'e' || format[-1] == 'f' || format[-1] == 'g')
-               sprintf (p, this_format, XFLOAT_DATA (args[n]));
-             else if (format[-1] == 'd')
-               /* Maybe we should use "%1.0f" instead so it also works
-                  for values larger than MAXINT.  */
-               sprintf (p, this_format, (EMACS_INT) XFLOAT_DATA (args[n]));
-             else
-               /* Don't sign-extend for octal or hex printing.  */
-               sprintf (p, this_format, (EMACS_UINT) XFLOAT_DATA (args[n]));
 
              if (p > buf
                  && multibyte
index 71743c45964f8c29a49a04eaf473ca0e9a7abf72..21e583f7d91ec0851566f6a61d3087bd177d86bb 100644 (file)
@@ -353,7 +353,7 @@ int fatal_error_in_progress;
 void (*fatal_error_signal_hook) P_ ((void));
 
 #ifdef HAVE_GTK_AND_PTHREAD
-/* When compiled with GTK and running under Gnome, multiple threads meay be
+/* When compiled with GTK and running under Gnome, multiple threads may be
    created.  Keep track of our main thread to make sure signals are delivered
    to it (see syssignal.h).  */
 
@@ -1664,6 +1664,10 @@ main (argc, argv
       syms_of_fontset ();
 #endif /* MAC_OSX && HAVE_CARBON */
 
+#ifdef HAVE_DBUS
+      syms_of_dbusbind ();
+#endif /* HAVE_DBUS */
+
 #ifdef SYMS_SYSTEM
       SYMS_SYSTEM;
 #endif
@@ -1693,6 +1697,7 @@ main (argc, argv
 
   init_charset ();
 
+  init_editfns (); /* init_process uses Voperating_system_release. */
   init_process (); /* init_display uses add_keyboard_wait_descriptor. */
 #ifndef MAC_OS8
   /* Called before init_window_once for Mac OS Classic.  */
@@ -1715,7 +1720,6 @@ main (argc, argv
   init_image ();
 #endif /* HAVE_WINDOW_SYSTEM */
   init_macros ();
-  init_editfns ();
   init_floatfns ();
 #ifdef VMS
   init_vmsfns ();
index 7f5f58a2e81cd425e35e45bedd5ac642bf63a940..74ebb0c90b6d21a25e4633c31fd1598bfc6a1c35 100644 (file)
@@ -3263,7 +3263,6 @@ void
 specbind (symbol, value)
      Lisp_Object symbol, value;
 {
-  Lisp_Object ovalue;
   Lisp_Object valcontents;
 
   CHECK_SYMBOL (symbol);
@@ -3283,9 +3282,7 @@ specbind (symbol, value)
     }
   else
     {
-      Lisp_Object valcontents;
-
-      ovalue = find_symbol_value (symbol);
+      Lisp_Object ovalue = find_symbol_value (symbol);
       specpdl_ptr->func = 0;
       specpdl_ptr->old_value = ovalue;
 
@@ -3330,10 +3327,14 @@ specbind (symbol, value)
        specpdl_ptr->symbol = symbol;
 
       specpdl_ptr++;
-      if (BUFFER_OBJFWDP (ovalue) || KBOARD_OBJFWDP (ovalue))
-       store_symval_forwarding (symbol, ovalue, value, NULL);
-      else
-       set_internal (symbol, value, 0, 1);
+      /* We used to do
+            if (BUFFER_OBJFWDP (ovalue) || KBOARD_OBJFWDP (ovalue))
+             store_symval_forwarding (symbol, ovalue, value, NULL);
+            else
+         but ovalue comes from find_symbol_value which should never return
+         such an internal value.  */
+      eassert (!(BUFFER_OBJFWDP (ovalue) || KBOARD_OBJFWDP (ovalue)));
+      set_internal (symbol, value, 0, 1);
     }
 }
 
index e36e192c65e1adcd1293ea94f21f2f7fe2ea8da5..41926ace154e763d4041aba85cdc60eb478db97d 100644 (file)
@@ -2970,10 +2970,9 @@ free_frame_menubar (f)
 
 int xg_ignore_gtk_scrollbar;
 
-/* SET_SCROLL_BAR_X_WINDOW assumes the second argument fits in
-   32 bits.  But we want to store pointers, and they may be larger
-   than 32 bits.  Keep a mapping from integer index to widget pointers
-   to get around the 32 bit limitation.  */
+/* Xlib's `Window' fits in 32 bits.  But we want to store pointers, and they
+   may be larger than 32 bits.  Keep a mapping from integer index to widget
+   pointers to get around the 32 bit limitation.  */
 
 static struct
 {
@@ -3183,7 +3182,7 @@ xg_create_scroll_bar (f, bar, scroll_callback, scroll_bar_name)
   /* Set the cursor to an arrow.  */
   xg_set_cursor (webox, FRAME_X_DISPLAY_INFO (f)->xg_cursor);
 
-  SET_SCROLL_BAR_X_WINDOW (bar, scroll_id);
+  bar->x_window = scroll_id;
 }
 
 /* Make the scroll bar represented by SCROLLBAR_ID visible.  */
@@ -3258,7 +3257,7 @@ xg_set_toolkit_scroll_bar_thumb (bar, portion, position, whole)
      struct scroll_bar *bar;
      int portion, position, whole;
 {
-  GtkWidget *wscroll = xg_get_widget_from_map (SCROLL_BAR_X_WINDOW (bar));
+  GtkWidget *wscroll = xg_get_widget_from_map (bar->x_window);
 
   FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
 
@@ -3822,6 +3821,7 @@ update_frame_tool_bar (f)
       GtkWidget *wbutton = NULL;
       GtkWidget *weventbox;
       Lisp_Object func = intern ("x-gtk-map-stock");
+      Lisp_Object specified_file;
 
       ti = gtk_toolbar_get_nth_item (GTK_TOOLBAR (x->toolbar_widget), i);
 
@@ -3840,8 +3840,9 @@ update_frame_tool_bar (f)
           continue;
         }
 
-      if (EQ (Qt, Ffboundp (func))) 
-        stock = call1 (func, file_for_image (image));
+      specified_file = file_for_image (image);
+      if (!NILP (specified_file) && EQ (Qt, Ffboundp (func)))
+        stock = call1 (func, specified_file);
 
       if (! NILP (stock) && STRINGP (stock))
         {
index 91be3f4b57e94658ecc28a26bbfc40ca30fd3106..a9b1e9835ed321f7ba96f5e24010b2aa22c8f237 100644 (file)
@@ -3128,6 +3128,8 @@ convert_mono_to_color_image (f, img, foreground, background)
   release_frame_dc (f, hdc);
   old_prev = SelectObject (old_img_dc, img->pixmap);
   new_prev = SelectObject (new_img_dc, new_pixmap);
+  /* Windows convention for mono bitmaps is black = background,
+     white = foreground.  */
   SetTextColor (new_img_dc, background);
   SetBkColor (new_img_dc, foreground);
 
@@ -3523,6 +3525,19 @@ xbm_load (f, img)
          else
            bits = XBOOL_VECTOR (data)->data;
 
+#ifdef WINDOWSNT
+          {
+            char *invertedBits;
+            int nbytes, i;
+            /* Windows mono bitmaps are reversed compared with X.  */
+            invertedBits = bits;
+            nbytes = (img->width + BITS_PER_CHAR - 1) / BITS_PER_CHAR 
+              * img->height;
+            bits = (char *) alloca(nbytes);
+            for (i = 0; i < nbytes; i++)
+              bits[i] = XBM_BIT_SHUFFLE (invertedBits[i]);
+          }
+#endif
          /* Create the pixmap.  */
 
          Create_Pixmap_From_Bitmap_Data (f, img, bits,
index 0678fcdb4ded7d5d2893926f840773a871580d35..6595b7f800d2199a2fcec0aee7683580d3b6edd9 100644 (file)
@@ -514,7 +514,9 @@ Lisp_Object Qsave_session;
 #ifdef MAC_OS
 Lisp_Object Qmac_apple_event;
 #endif
-
+#ifdef HAVE_DBUS
+Lisp_Object Qdbus_event;
+#endif
 /* Lisp_Object Qmouse_movement; - also an event header */
 
 /* Properties of event headers.  */
@@ -1570,7 +1572,7 @@ command_loop_1 ()
 #ifdef MULTI_KBOARD
   int was_locked = single_kboard;
 #endif
-#endif  
+#endif
   int already_adjusted = 0;
 
   current_kboard->Vprefix_arg = Qnil;
@@ -2566,7 +2568,7 @@ do { if (polling_stopped_here) start_polling ();  \
    USED_MOUSE_MENU is null, we don't dereference it.
 
    Value is -2 when we find input on another keyboard.  A second call
-   to read_char will read it. 
+   to read_char will read it.
 
    If END_TIME is non-null, it is a pointer to an EMACS_TIME
    specifying the maximum time to wait until.  If no input arrives by
@@ -3181,7 +3183,7 @@ read_char (commandflag, nmaps, maps, prev_event, used_mouse_menu, end_time)
       int count = SPECPDL_INDEX ();
       record_single_kboard_state ();
 #endif
-      
+
       last_input_char = c;
       Fcommand_execute (tem, Qnil, Fvector (1, &last_input_char), Qt);
 
@@ -4097,7 +4099,7 @@ kbd_buffer_get_event (kbp, used_mouse_menu, end_time)
         events.  */
       if (CONSP (Vunread_command_events))
        break;
-      
+
       if (kbd_fetch_ptr != kbd_store_ptr)
        break;
 #if defined (HAVE_MOUSE) || defined (HAVE_GPM)
@@ -4309,6 +4311,13 @@ kbd_buffer_get_event (kbp, used_mouse_menu, end_time)
          internal_last_event_frame = frame;
          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 this event is on a different frame, return a switch-frame this
@@ -6187,6 +6196,13 @@ make_lispy_event (event)
       }
 #endif
 
+#ifdef HAVE_DBUS
+    case DBUS_EVENT:
+      {
+       return Fcons (Qdbus_event, event->arg);
+      }
+#endif /* HAVE_DBUS */
+
 #ifdef HAVE_GPM
     case GPM_CLICK_EVENT:
       {
@@ -6505,12 +6521,21 @@ lispy_modifier_list (modifiers)
    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 (symbol)
      Lisp_Object symbol;
 {
   Lisp_Object elements;
 
+  if (INTEGERP (symbol))
+    return (Fcons (make_number (KEY_TO_CHAR (symbol)),
+                  Fcons (make_number (XINT (symbol) & CHAR_MODIFIER_MASK),
+                         Qnil)));
+  else if (!SYMBOLP (symbol))
+    return Qnil;
+
   elements = Fget (symbol, Qevent_symbol_element_mask);
   if (CONSP (elements))
     return elements;
@@ -6545,6 +6570,20 @@ parse_modifiers (symbol)
     }
 }
 
+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.  */)
+     (symbol)
+     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.
 
@@ -6564,6 +6603,9 @@ apply_modifiers (modifiers, base)
   /* 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 (index, (modifiers & ~click_modifier));
@@ -6975,6 +7017,11 @@ void
 gobble_input (expected)
      int expected;
 {
+#ifdef HAVE_DBUS
+  /* Check whether a D-Bus message has arrived.  */
+  xd_read_queued_messages ();
+#endif /* HAVE_DBUS */
+
 #ifndef VMS
 #ifdef SIGIO
   if (interrupt_input)
@@ -7094,7 +7141,7 @@ read_avail_input (expected)
               nread += nr;
               expected = 0;
             }
-          
+
           if (nr == -1)          /* Not OK to read input now. */
             {
               err = 1;
@@ -7102,7 +7149,7 @@ read_avail_input (expected)
           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
@@ -7114,7 +7161,7 @@ read_avail_input (expected)
                    group?  Perhaps on systems with FIONREAD Emacs is
                    alone in its group.  */
                 kill (getpid (), SIGHUP);
-              
+
               /* XXX Is calling delete_terminal safe here?  It calls Fdelete_frame. */
               if (t->delete_terminal_hook)
                 (*t->delete_terminal_hook) (t);
@@ -7287,14 +7334,14 @@ tty_read_avail_input (struct terminal *terminal,
         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.  */
@@ -9210,7 +9257,7 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
   last_nonmenu_event = Qnil;
 
   delayed_switch_frame = Qnil;
-  
+
   if (INTERACTIVE)
     {
       if (!NILP (prompt))
@@ -10102,32 +10149,44 @@ read_key_sequence (keybuf, bufsize, prompt, dont_downcase_last,
         and is a shifted function key,
         use the corresponding unshifted function key instead.  */
       if (first_binding >= nmaps
-         && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
-         && SYMBOLP (key))
-       {
-         Lisp_Object breakdown;
-         int modifiers;
-
-         breakdown = parse_modifiers (key);
-         modifiers = XINT (XCAR (XCDR (breakdown)));
-         if (modifiers & shift_modifier)
+         && /* 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 (current_buffer->downcase_table)->size)
+                 && UPPERCASEP (KEY_TO_CHAR (key))))
            {
-             Lisp_Object new_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;
 
-             modifiers &= ~shift_modifier;
-             new_key = apply_modifiers (modifiers,
-                                        XCAR (breakdown));
-
+             /* 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;
+
              goto replay_sequence;
            }
        }
     }
-
   if (!dummyflag)
     read_key_sequence_cmd = (first_binding < nmaps
                             ? defs[first_binding]
@@ -11244,7 +11303,7 @@ See also `current-input-mode'.  */)
   new_interrupt_input = 1;
 #endif
 
-  if (new_interrupt_input != interrupt_input) 
+  if (new_interrupt_input != interrupt_input)
     {
 #ifdef POLL_FOR_INPUT
       stop_polling ();
@@ -11324,7 +11383,7 @@ See also `current-input-mode'.  */)
   struct terminal *t = get_terminal (terminal, 1);
   struct tty_display_info *tty;
   int new_meta;
-  
+
   if (t == NULL || t->type != output_termcap)
     return Qnil;
   tty = t->display_info.tty;
@@ -11336,7 +11395,7 @@ See also `current-input-mode'.  */)
   else
     new_meta = 2;
 
-  if (tty->meta_key != new_meta) 
+  if (tty->meta_key != new_meta)
     {
 #ifndef DOS_NT
       /* this causes startup screen to be restored and messes with the mouse */
@@ -11344,7 +11403,7 @@ See also `current-input-mode'.  */)
 #endif
 
       tty->meta_key = new_meta;
-  
+
 #ifndef DOS_NT
       init_sys_modes (tty);
 #endif
@@ -11376,7 +11435,7 @@ See also `current-input-mode'.  */)
   /* 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);
 
@@ -11386,7 +11445,7 @@ See also `current-input-mode'.  */)
 
   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;
@@ -11785,6 +11844,11 @@ syms_of_keyboard ()
   staticpro (&Qmac_apple_event);
 #endif
 
+#ifdef HAVE_DBUS
+  Qdbus_event = intern ("dbus-event");
+  staticpro (&Qdbus_event);
+#endif
+
   Qmenu_enable = intern ("menu-enable");
   staticpro (&Qmenu_enable);
   Qmenu_alias = intern ("menu-alias");
@@ -11945,6 +12009,7 @@ syms_of_keyboard ()
   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);
@@ -12346,7 +12411,7 @@ here.  If a mapping is defined in both the current
 `local-function-key-map' binding and this variable, then the local
 definition will take precendence.  */);
   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 `function-key-map', but comes after that,
@@ -12468,7 +12533,7 @@ and tool-bar buttons.  */);
   /* Vwindow_system is left at t for now.  */
   initial_kboard->next_kboard = all_kboards;
   all_kboards = initial_kboard;
-#endif  
+#endif
 }
 
 void
@@ -12513,6 +12578,13 @@ keys_of_keyboard ()
    *                       "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
 }
 
 /* Mark the pointers in the kboard objects.
index b5abb194e1ffeb1ff3f8bfe19c2b642cc78c2eac..1630ac22a5359f8dedbf5058fddc859b06634779 100644 (file)
@@ -2047,7 +2047,8 @@ If KEYMAP is nil, that means no local keymap.  */)
 }
 
 DEFUN ("current-local-map", Fcurrent_local_map, Scurrent_local_map, 0, 0, 0,
-       doc: /* Return current buffer's local keymap, or nil if it has none.  */)
+       doc: /* Return current buffer's local keymap, or nil if it has none.
+Normally the local keymap is set by the major mode with `use-local-map'.  */)
      ()
 {
   return current_buffer->keymap;
index f4b93ff9dceed0eb52009e704ca0a0c0cc2da632..fb53f68b07352b1a2088e5c35b81e2a483cc94ee 100644 (file)
@@ -349,7 +349,8 @@ enum pvec_type
   PVEC_HASH_TABLE = 0x40000,
   PVEC_TERMINAL = 0x80000,
   PVEC_SUB_CHAR_TABLE = 0x100000,
-  PVEC_TYPE_MASK = 0x1ffe00
+  PVEC_OTHER = 0x200000,
+  PVEC_TYPE_MASK = 0x2ffe00
 
 #if 0 /* This is used to make the value of PSEUDOVECTOR_FLAG available to
         GDB.  It doesn't work on OS Alpha.  Moved to a variable in
@@ -1209,6 +1210,7 @@ struct Lisp_Buffer_Objfwd
     int type : 16;     /* = Lisp_Misc_Buffer_Objfwd */
     unsigned gcmarkbit : 1;
     int spacer : 15;
+    Lisp_Object slottype; /* Qnil, Lisp_Int, Lisp_Symbol, or Lisp_String.  */
     int offset;
   };
 
@@ -2568,7 +2570,11 @@ EXFUN (Fmake_byte_code, MANY);
 EXFUN (Fmake_bool_vector, 2);
 extern Lisp_Object Qchar_table_extra_slots;
 extern struct Lisp_Vector *allocate_vector P_ ((EMACS_INT));
-extern struct Lisp_Vector *allocate_other_vector P_ ((EMACS_INT));
+extern struct Lisp_Vector *allocate_pseudovector P_ ((int memlen, int lisplen, EMACS_INT tag));
+#define ALLOCATE_PSEUDOVECTOR(typ,field,tag)                           \
+  ((typ*)                                                              \
+   allocate_pseudovector                                               \
+       (VECSIZE (typ), PSEUDOVECSIZE (typ, field), tag))
 extern struct Lisp_Hash_Table *allocate_hash_table P_ ((void));
 extern struct window *allocate_window P_ ((void));
 extern struct frame *allocate_frame P_ ((void));
@@ -3245,7 +3251,7 @@ extern void syms_of_dired P_ ((void));
 
 /* Defined in term.c */
 extern void syms_of_term P_ ((void));
-extern void fatal () NO_RETURN;
+extern void fatal P_ ((const char *msgid, ...)) NO_RETURN;
 
 /* Defined in terminal.c */
 extern void syms_of_terminal P_ ((void));
index 75a606b60b3f47c6ca5bd9844fd9d938f3b30111..9c1a08075f85176491eabf62c97eb317dd6f4a2e 100644 (file)
--- a/src/mac.c
+++ b/src/mac.c
@@ -5004,6 +5004,10 @@ extern int noninteractive;
 #if SELECT_USE_CFSOCKET
 #define SELECT_TIMEOUT_THRESHOLD_RUNLOOP 0.2
 
+/* Dictionary of file descriptors vs CFSocketRef's allocated in
+   sys_select.  */
+static CFMutableDictionaryRef cfsockets_for_select;
+
 static void
 socket_callback (s, type, address, data, info)
      CFSocketRef s;
@@ -5089,6 +5093,43 @@ select_and_poll_event (nfds, rfds, wfds, efds, timeout)
     return 0;
 }
 
+/* Clean up the CFSocket associated with the file descriptor FD in
+   case the same descriptor is used in other threads later.  If no
+   CFSocket is associated with FD, then return 0 without closing FD.
+   Otherwise, return 1 with closing FD.  */
+
+int
+mac_try_close_socket (fd)
+     int fd;
+{
+#if SELECT_USE_CFSOCKET
+  if (cfsockets_for_select)
+    {
+      void *key = (void *) fd;
+      CFSocketRef socket =
+       (CFSocketRef) CFDictionaryGetValue (cfsockets_for_select, key);
+
+      if (socket)
+       {
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1020
+         CFOptionFlags flags = CFSocketGetSocketFlags (socket);
+
+         if (!(flags & kCFSocketCloseOnInvalidate))
+           CFSocketSetSocketFlags (socket, flags | kCFSocketCloseOnInvalidate);
+#endif
+         BLOCK_INPUT;
+         CFSocketInvalidate (socket);
+         CFDictionaryRemoveValue (cfsockets_for_select, key);
+         UNBLOCK_INPUT;
+
+         return 1;
+       }
+    }
+#endif
+
+  return 0;
+}
+
 int
 sys_select (nfds, rfds, wfds, efds, timeout)
      int nfds;
@@ -5165,6 +5206,11 @@ sys_select (nfds, rfds, wfds, efds, timeout)
              CFDictionaryCreateMutable (NULL, 0, NULL,
                                         &kCFTypeDictionaryValueCallBacks);
 
+         if (cfsockets_for_select == NULL)
+           cfsockets_for_select =
+             CFDictionaryCreateMutable (NULL, 0, NULL,
+                                        &kCFTypeDictionaryValueCallBacks);
+
          for (minfd = 1; ; minfd++) /* nfds-1 works as a sentinel.  */
            if (FD_ISSET (minfd, rfds) || (wfds && FD_ISSET (minfd, wfds)))
              break;
@@ -5176,7 +5222,7 @@ sys_select (nfds, rfds, wfds, efds, timeout)
                CFRunLoopSourceRef source =
                  (CFRunLoopSourceRef) CFDictionaryGetValue (sources, key);
 
-               if (source == NULL)
+               if (source == NULL || !CFRunLoopSourceIsValid (source))
                  {
                    CFSocketRef socket =
                      CFSocketCreateWithNative (NULL, fd,
@@ -5186,11 +5232,12 @@ sys_select (nfds, rfds, wfds, efds, timeout)
 
                    if (socket == NULL)
                      continue;
+                   CFDictionarySetValue (cfsockets_for_select, key, socket);
                    source = CFSocketCreateRunLoopSource (NULL, socket, 0);
                    CFRelease (socket);
                    if (source == NULL)
                      continue;
-                   CFDictionaryAddValue (sources, key, source);
+                   CFDictionarySetValue (sources, key, source);
                    CFRelease (source);
                  }
                CFRunLoopAddSource (runloop, source, kCFRunLoopDefaultMode);
index 2b8c24db3b3f53374ef26b50f1aa2c5d6206e7cc..1b2c2d5702a615a290a5da39cfc2404100e9177d 100644 (file)
@@ -2513,7 +2513,7 @@ unwind_create_frame (frame)
 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
        1, 1, 0,
        doc: /* Make a new window, which is called a "frame" in Emacs terms.
-Returns an Emacs frame object.
+Return an Emacs frame object.
 PARAMETERS is an alist of frame parameters.
 If the parameters specify that the frame should not have a minibuffer,
 and do not specify a specific minibuffer window to use,
@@ -2547,11 +2547,7 @@ This function is an internal primitive--use `make-frame' instead.  */)
   if (EQ (display, Qunbound))
     display = Qnil;
   dpyinfo = check_x_display_info (display);
-#ifdef MULTI_KBOARD
   kb = dpyinfo->terminal->kboard;
-#else
-  kb = &the_only_kboard;
-#endif
 
   name = mac_get_arg (parameters, Qname, "name", "Name", RES_TYPE_STRING);
   if (!STRINGP (name)
@@ -2615,9 +2611,7 @@ This function is an internal primitive--use `make-frame' instead.  */)
   image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
-#ifdef MULTI_KBOARD
   FRAME_KBOARD (f) = kb;
-#endif
 
   /* Specify the parent under which to make this window.  */
 
@@ -2975,7 +2969,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
        0, 1, 0,
-       doc: /* Returns the width in pixels of DISPLAY.
+       doc: /* Return the width in pixels of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -2989,7 +2983,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
        Sx_display_pixel_height, 0, 1, 0,
-       doc: /* Returns the height in pixels of DISPLAY.
+       doc: /* Return the height in pixels of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3003,7 +2997,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
        0, 1, 0,
-       doc: /* Returns the number of bitplanes of DISPLAY.
+       doc: /* Return the number of bitplanes of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3017,7 +3011,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells,
        0, 1, 0,
-       doc: /* Returns the number of color cells of DISPLAY.
+       doc: /* Return the number of color cells of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3033,7 +3027,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
        Sx_server_max_request_size,
        0, 1, 0,
-       doc: /* Returns the maximum request size of the server of DISPLAY.
+       doc: /* Return the maximum request size of the server of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3046,7 +3040,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
-       doc: /* Returns the "vendor ID" string of the Mac OS system (Apple).
+       doc: /* Return the "vendor ID" string of the Mac OS system (Apple).
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3057,7 +3051,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
-       doc: /* Returns the version numbers of the Mac OS system.
+       doc: /* Return the version numbers of the Mac OS system.
 The value is a list of three integers: the major and minor
 version numbers, and the vendor-specific release
 number.  See also the function `x-server-vendor'.
@@ -3191,7 +3185,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-backing-store", Fx_display_backing_store,
        Sx_display_backing_store, 0, 1, 0,
-       doc: /* Returns an indication of whether DISPLAY does backing store.
+       doc: /* Return an indication of whether DISPLAY does backing store.
 The value may be `always', `when-mapped', or `not-useful'.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
@@ -3204,7 +3198,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-visual-class", Fx_display_visual_class,
        Sx_display_visual_class, 0, 1, 0,
-       doc: /* Returns the visual class of DISPLAY.
+       doc: /* Return the visual class of DISPLAY.
 The value is one of the symbols `static-gray', `gray-scale',
 `static-color', `pseudo-color', `true-color', or `direct-color'.
 
@@ -3235,7 +3229,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-save-under", Fx_display_save_under,
        Sx_display_save_under, 0, 1, 0,
-       doc: /* Returns t if DISPLAY supports the save-under feature.
+       doc: /* Return t if DISPLAY supports the save-under feature.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3809,11 +3803,7 @@ x_create_tip_frame (dpyinfo, parms, text)
 
   parms = Fcopy_alist (parms);
 
-#ifdef MULTI_KBOARD
   kb = dpyinfo->terminal->kboard;
-#else
-  kb = &the_only_kboard;
-#endif
 
   /* Get the name of the frame to use for resource lookup.  */
   name = mac_get_arg (parms, Qname, "name", "Name", RES_TYPE_STRING);
@@ -3859,9 +3849,7 @@ x_create_tip_frame (dpyinfo, parms, text)
   image_cache_refcount = FRAME_X_IMAGE_CACHE (f)->refcount;
   dpyinfo_refcount = dpyinfo->reference_count;
 #endif /* GLYPH_DEBUG */
-#ifdef MULTI_KBOARD
   FRAME_KBOARD (f) = kb;
-#endif
   f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window;
   f->output_data.mac->explicit_parent = 0;
 
index f107f081421431cbadfa54cf1fab6afcaced0303..f07b9eb0a5daafc65a05a2005f1235f1fac42f9c 100644 (file)
@@ -12625,6 +12625,10 @@ mac_term_init (display_name, xrm_option, resource_name)
                                x_display_name_list);
   dpyinfo->name_list_element = XCAR (x_display_name_list);
 
+  /* FIXME: Untested.
+     Add the default keyboard. */
+  add_keyboard_wait_descriptor (0);
+
 #if USE_CG_DRAWING
   mac_init_fringe (terminal->rif);
 #endif
@@ -12844,7 +12848,6 @@ mac_create_terminal (struct mac_display_info *dpyinfo)
   /* FIXME: This keyboard setup is 100% untested, just copied from
      w32_create_terminal in order to set window-system now that it's
      a keyboard object.  */
-#ifdef MULTI_KBOARD
   /* We don't yet support separate terminals on Mac, so don't try to share
      keyboards between virtual terminals that are on the same physical
      terminal like X does.  */
@@ -12859,7 +12862,6 @@ mac_create_terminal (struct mac_display_info *dpyinfo)
   if (current_kboard == initial_kboard)
     current_kboard = terminal->kboard;
   terminal->kboard->reference_count++;
-#endif
 
   return terminal;
 }
index c6304bbd24efc0d147d81441ef415f030ac8271c..a88404cb52e4d2a7842f2c83d7b84c2f79947eca 100644 (file)
@@ -1636,7 +1636,7 @@ print_object (obj, printcharfun, escapeflag)
     {
     case Lisp_Int:
       if (sizeof (int) == sizeof (EMACS_INT))
-       sprintf (buf, "%d", XINT (obj));
+       sprintf (buf, "%d", (int) XINT (obj));
       else if (sizeof (long) == sizeof (EMACS_INT))
        sprintf (buf, "%ld", (long) XINT (obj));
       else
index d80d7db2554d7cda01af427c8abfd3c00b0bf695..c2f0c82a6a85cc7ca5454f8c92c50bbbdc164e1c 100644 (file)
@@ -631,6 +631,7 @@ make_process (name)
   p->tick = 0;
   p->update_tick = 0;
   p->pid = 0;
+  p->pty_flag = 0;
   p->raw_status_new = 0;
   p->status = Qrun;
   p->mark = Fmake_marker ();
@@ -1374,8 +1375,10 @@ list_processes_1 (query_only)
   if (w_tty)
     {
       XSETFASTINT (i_tty, XFASTINT (i_buffer) + w_buffer + 1);
-      XSETFASTINT (i_command, XFASTINT (i_buffer) + w_tty + 1);
-    } else {
+      XSETFASTINT (i_command, XFASTINT (i_tty) + w_tty + 1);
+    }
+  else
+    {
       i_tty = Qnil;
       XSETFASTINT (i_command, XFASTINT (i_buffer) + w_buffer + 1);
     }
index bf4971a0b5f1abd8de0b2dcf7d5da369e4f93ac5..100721b36cc480c468d47ec4f08517c969804829 100644 (file)
@@ -43,7 +43,7 @@ Boston, MA 02110-1301, USA.  */
 #endif
 
 #ifndef BASE_PURESIZE
-#define BASE_PURESIZE (1180000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
+#define BASE_PURESIZE (1190000 + SYSTEM_PURESIZE_EXTRA + SITELOAD_PURESIZE_EXTRA)
 #endif
 
 /* Increase BASE_PURESIZE by a ratio depending on the machine's word size.  */
index 6bfa0e95106e13cd610ba302e6321699b059e0b0..c1108e7c2955b304e8a523b177187e9172849a3b 100644 (file)
@@ -53,9 +53,6 @@ Boston, MA 02110-1301, USA.  */
 /* We need a little extra space, see ../../lisp/loadup.el. */
 #define SYSTEM_PURESIZE_EXTRA 30000
 
-/* XXX The MULTI_KBOARD support does not work yet on this platform. */
-#undef MULTI_KBOARD
-
 #endif
 #endif
 
diff --git a/src/s/gnu-kfreebsd.h b/src/s/gnu-kfreebsd.h
new file mode 100644 (file)
index 0000000..a1e8c02
--- /dev/null
@@ -0,0 +1,11 @@
+#include "gnu-linux.h"
+
+/* SYSTEM_TYPE should indicate the kind of system you are using.
+   It sets the Lisp variable system-type.  */
+#undef SYSTEM_TYPE
+#define SYSTEM_TYPE "gnu/kfreebsd" /* All the best software is free */
+
+#define NO_TERMIO               /* use only <termios.h> */
+
+/* arch-tag: 8d098200-2586-469e-99ab-6d092c035e03
+   (do not change this comment) */
index 2881fa1eb751ee6dec46ef75555954ae1bdb2d3f..ee64a5d94f2206d99f57e45ab7f8d152d1b6ad49 100644 (file)
@@ -477,9 +477,7 @@ extern char *get_emacs_configuration_options (void);
 #endif
 #include <string.h>
 
-/* We need a little extra space, see ../../lisp/loadup.el.
-   The number below comes from 23923 bytes worth (as of 2006-04)
-   of w32-specific files loaded by loadup.el, plus 1K spare.  */
+/* We need a little extra space, see ../../lisp/loadup.el.  */
 #define SYSTEM_PURESIZE_EXTRA 50000
 
 /* For unexec to work on Alpha systems, we need to put Emacs'
@@ -491,9 +489,9 @@ extern char *get_emacs_configuration_options (void);
    into its own section.  VC5 intermingles uninitialized data from the CRT
    between Emacs' static uninitialized data and its public uninitialized
    data.  A separate .bss section for Emacs groups both static and
-   public uninitalized together.
+   public uninitialized together.
 
-   Note that unexnt.c relies on this fact, and must be modified
+   Note that unexw32.c relies on this fact, and must be modified
    accordingly if this section name is changed, or if this pragma is
    removed.  Also, obviously, all files that define initialized data
    must include config.h to pick up this pragma.  */
index aff998b154b8286d6f178d25c459c6297e71a010..2060abda6d7f284bdda925bcea53b48cf7eba42c 100644 (file)
@@ -2942,11 +2942,15 @@ Return value is undefined if the last search failed.  */)
   return reuse;
 }
 
-/* Internal usage only:
-   If RESEAT is `evaporate', put the markers back on the free list
-   immediately.  No other references to the markers must exist in this case,
-   so it is used only internally on the unwind stack and save-match-data from
-   Lisp.  */
+/* We used to have an internal use variant of `reseat' described as:
+
+      If RESEAT is `evaporate', put the markers back on the free list
+      immediately.  No other references to the markers must exist in this
+      case, so it is used only internally on the unwind stack and
+      save-match-data from Lisp.
+
+   But it was ill-conceived: those supposedly-internal markers get exposed via
+   the undo-list, so freeing them here is unsafe.  */
 
 DEFUN ("set-match-data", Fset_match_data, Sset_match_data, 1, 2, 0,
        doc: /* Set internal data on last search match from elements of LIST.
@@ -3031,10 +3035,7 @@ If optional arg RESEAT is non-nil, make markers on LIST point nowhere.  */)
 
            if (!NILP (reseat) && MARKERP (m))
              {
-               if (EQ (reseat, Qevaporate))
-                 free_marker (m);
-               else
-                 unchain_marker (XMARKER (m));
+               unchain_marker (XMARKER (m));
                XSETCAR (list, Qnil);
              }
 
@@ -3052,10 +3053,7 @@ If optional arg RESEAT is non-nil, make markers on LIST point nowhere.  */)
 
            if (!NILP (reseat) && MARKERP (m))
              {
-               if (EQ (reseat, Qevaporate))
-                 free_marker (m);
-               else
-                 unchain_marker (XMARKER (m));
+               unchain_marker (XMARKER (m));
                XSETCAR (list, Qnil);
              }
          }
@@ -3119,8 +3117,8 @@ static Lisp_Object
 unwind_set_match_data (list)
      Lisp_Object list;
 {
-  /* It is safe to free (evaporate) the markers immediately.  */
-  return Fset_match_data (list, Qevaporate);
+  /* It is NOT ALWAYS safe to free (evaporate) the markers immediately.  */
+  return Fset_match_data (list, Qt);
 }
 
 /* Called to unwind protect the match data.  */
@@ -3219,9 +3217,10 @@ A value of nil (which is the normal value) means treat spaces literally.  */);
 
   DEFVAR_LISP ("inhibit-changing-match-data", &Vinhibit_changing_match_data,
       doc: /* Internal use only.
-If non-nil, the match data will not be changed during call to searching or
-matching functions, such as `looking-at', `string-match', `re-search-forward'
-etc.  */);
+If non-nil, the primitive searching and matching functions
+such as `looking-at', `string-match', `re-search-forward', etc.,
+do not set the match data.  The proper way to use this variable
+is to bind it with `let' around a small expression.  */);
   Vinhibit_changing_match_data = Qnil;
 
   defsubr (&Slooking_at);
index 35a107f34cf0697894b0d3fdc515205658f97df7..d1f378a3f8744aa87a55ec64f40124549b11b9fa 100644 (file)
@@ -2518,10 +2518,50 @@ init_system_name ()
 #endif /* not CANNOT_DUMP */
     if (! index (hostname, '.'))
       {
-       struct hostent *hp;
        int count;
+#ifdef HAVE_GETADDRINFO
+        struct addrinfo *res;
+        struct addrinfo hints;
+        int ret;
+
+        memset (&hints, 0, sizeof(hints));
+        hints.ai_socktype = SOCK_STREAM;
+        hints.ai_flags = AI_CANONNAME;
+
+       for (count = 0;; count++)
+         {
+            if ((ret = getaddrinfo (hostname, NULL, &hints, &res)) == 0
+                || ret != EAI_AGAIN)
+              break;
+
+            if (count >= 5)
+             break;
+           Fsleep_for (make_number (1), Qnil);
+         }
+
+        if (ret == 0)
+          {
+            struct addrinfo *it = res;
+            while (it)
+              {
+                char *fqdn = it->ai_canonname;
+                if (fqdn && index (fqdn, '.')
+                    && strcmp (fqdn, "localhost.localdomain") != 0)
+                  break;
+                it = it->ai_next;
+              }
+            if (it)
+              {
+                hostname = alloca (strlen (it->ai_canonname) + 1);
+                strcpy (hostname, it->ai_canonname);
+              }
+            freeaddrinfo (res);
+          }
+#else /* !HAVE_GETADDRINFO */
+        struct hostent *hp;
        for (count = 0;; count++)
          {
+
 #ifdef TRY_AGAIN
            h_errno = 0;
 #endif
@@ -2529,11 +2569,14 @@ init_system_name ()
 #ifdef TRY_AGAIN
            if (! (hp == 0 && h_errno == TRY_AGAIN))
 #endif
+
              break;
+
            if (count >= 5)
              break;
            Fsleep_for (make_number (1), Qnil);
          }
+
        if (hp)
          {
            char *fqdn = (char *) hp->h_name;
@@ -2567,6 +2610,7 @@ init_system_name ()
              }
 #endif
          }
+#endif /* !HAVE_GETADDRINFO */
       }
 #endif /* HAVE_SOCKETS */
   /* We used to try using getdomainname here,
@@ -3442,6 +3486,15 @@ emacs_close (fd)
   int did_retry = 0;
   register int rtnval;
 
+#if defined (MAC_OSX) && defined (HAVE_CARBON)
+  {
+    extern int mac_try_close_socket P_ ((int));
+
+    if (mac_try_close_socket (fd))
+      return 0;
+  }
+#endif
+
   while ((rtnval = close (fd)) == -1
         && (errno == EINTR))
     did_retry = 1;
index bb7c139eafd5b28be3d8c41be6005ae57ab687fc..e7d66420ffa06c5ec4c748b2ca1e567128ad6a9f 100644 (file)
@@ -37,6 +37,7 @@ Boston, MA 02110-1301, USA.  */
 #endif
 
 #include <signal.h>
+#include <stdarg.h>
 
 #include "lisp.h"
 #include "termchar.h"
@@ -3866,14 +3867,14 @@ maybe_fatal (must_succeed, buffer, terminal, str1, str2, arg1, arg2)
   abort ();
 }
 
-/* VARARGS 1 */
 void
-fatal (str, arg1, arg2)
-     char *str, *arg1, *arg2;
+fatal (const char *str, ...)
 {
+  va_list ap;
+  va_start (ap, str);
   fprintf (stderr, "emacs: ");
-  fprintf (stderr, str, arg1, arg2);
-  fprintf (stderr, "\n");
+  vfprintf (stderr, str, ap);
+  va_end (ap);
   fflush (stderr);
   exit (1);
 }
index 369bdff158dfdc737411c05c678b94659d9312df..e5c7dcea140634e183a1d55fa3f7564a29fa7534 100644 (file)
@@ -197,6 +197,10 @@ enum event_kind
   , GPM_CLICK_EVENT
 #endif
 
+#ifdef HAVE_DBUS
+  , DBUS_EVENT
+#endif
+
 #ifdef WINDOWSNT
   /* Generated when an APPCOMMAND event is received, in response to
      Multimedia or Internet buttons on some keyboards.
@@ -336,7 +340,7 @@ struct terminal
 
   /* All fields before `next_terminal' should be Lisp_Object and are traced
      by the GC.  All fields afterwards are ignored by the GC.  */
-  
+
   /* Chain of all terminal devices. */
   struct terminal *next_terminal;
 
@@ -382,12 +386,12 @@ struct terminal
 
   /* Terminal characteristics. */
   /* XXX Are these really used on non-termcap displays? */
-  
+
   int must_write_spaces;       /* Nonzero means spaces in the text must
                                   actually be output; can't just skip over
                                   some columns to leave them blank.  */
   int fast_clear_end_of_line;   /* Nonzero means terminal has a `ce' string */
-  
+
   int line_ins_del_ok;          /* Terminal can insert and delete lines */
   int char_ins_del_ok;          /* Terminal can insert and delete chars */
   int scroll_region_ok;         /* Terminal supports setting the scroll
@@ -410,24 +414,24 @@ struct terminal
   struct redisplay_interface *rif;
 
   /* Frame-based redisplay interface. */
-  
+
   /* Text display hooks.  */
 
   void (*cursor_to_hook) P_ ((struct frame *f, int vpos, int hpos));
   void (*raw_cursor_to_hook) P_ ((struct frame *, int, int));
-  
+
   void (*clear_to_end_hook) P_ ((struct frame *));
   void (*clear_frame_hook) P_ ((struct frame *));
   void (*clear_end_of_line_hook) P_ ((struct frame *, int));
-  
+
   void (*ins_del_lines_hook) P_ ((struct frame *f, int, int));
-  
+
   void (*insert_glyphs_hook) P_ ((struct frame *f, struct glyph *s, int n));
   void (*write_glyphs_hook) P_ ((struct frame *f, struct glyph *s, int n));
   void (*delete_glyphs_hook) P_ ((struct frame *, int));
-  
+
   void (*ring_bell_hook) P_ ((struct frame *f));
-  
+
   void (*reset_terminal_modes_hook) P_ ((struct terminal *));
   void (*set_terminal_modes_hook) P_ ((struct terminal *));
 
@@ -442,7 +446,7 @@ struct terminal
      Set *f to the frame the mouse is in, or zero if the mouse is in no
      Emacs frame.  If it is set to zero, all the other arguments are
      garbage.
-  
+
      If the motion started in a scroll bar, set *bar_window to the
      scroll bar's window, *part to the part the mouse is currently over,
      *x to the position of the mouse along the scroll bar, and *y to the
@@ -452,7 +456,7 @@ struct terminal
      row of the character cell the mouse is over.
 
      Set *time to the time the mouse was at the returned position.
-     
+
      This should clear mouse_moved until the next motion
      event arrives.  */
   void (*mouse_position_hook) P_ ((struct frame **f, int,
@@ -478,7 +482,7 @@ struct terminal
      hook is zero, that means the terminal we're displaying on doesn't
      support overlapping frames, so there's no need to raise or lower
      anything.
-     
+
      If RAISE is non-zero, F is brought to the front, before all other
      windows.  If RAISE is zero, F is sent to the back, behind all other
      windows.  */
@@ -488,7 +492,7 @@ struct terminal
      For example, if going from fullscreen to not fullscreen this hook
      may do something OS dependent, like extended window manager hints on X11.  */
   void (*fullscreen_hook) P_ ((struct frame *f));
-    
+
   \f
   /* Scroll bar hooks.  */
 
@@ -497,21 +501,21 @@ struct terminal
      lisp objects.  This allows us to place references to them in
      Lisp_Windows without worrying about those references becoming
      dangling references when the scroll bar is destroyed.
-     
+
      The window-system-independent portion of Emacs just refers to
      scroll bars via their windows, and never looks inside the scroll bar
      representation; it always uses hook functions to do all the
      scroll bar manipulation it needs.
-     
+
      The `vertical_scroll_bar' field of a Lisp_Window refers to that
      window's scroll bar, or is nil if the window doesn't have a
      scroll bar.
-     
+
      The `scroll_bars' and `condemned_scroll_bars' fields of a Lisp_Frame
      are free for use by the scroll bar implementation in any way it sees
      fit.  They are marked by the garbage collector.  */
-  
-  
+
+
   /* Set the vertical scroll bar for WINDOW to have its upper left corner
      at (TOP, LEFT), and be LENGTH rows high.  Set its handle to
      indicate that we are displaying PORTION characters out of a total
@@ -529,16 +533,16 @@ struct terminal
      Instead, we just assert at the beginning of redisplay that *all*
      scroll bars are to be removed, and then save scroll bars from the
      fiery pit when we actually redisplay their window.  */
-  
+
   /* Arrange for all scroll bars on FRAME to be removed at the next call
      to `*judge_scroll_bars_hook'.  A scroll bar may be spared if
      `*redeem_scroll_bar_hook' is applied to its window before the judgement.
-     
+
      This should be applied to each frame each time its window tree is
      redisplayed, even if it is not displaying scroll bars at the moment;
      if the HAS_SCROLL_BARS flag has just been turned off, only calling
      this and the judge_scroll_bars_hook will get rid of them.
-     
+
      If non-zero, this hook should be safe to apply to any frame,
      whether or not it can support scroll bars, and whether or not it is
      currently displaying them.  */
@@ -555,7 +559,7 @@ struct terminal
      tree is redisplayed, even if it is not displaying scroll bars at the
      moment; if the HAS_SCROLL_BARS flag has just been turned off, only
      calling this and condemn_scroll_bars_hook will get rid of them.
-     
+
      If non-zero, this hook should be safe to apply to any frame,
      whether or not it can support scroll bars, and whether or not it is
      currently displaying them.  */
@@ -595,7 +599,7 @@ struct terminal
 
   /* Called after the last frame on this terminal is deleted, or when
      the display device was closed (hangup).
-     
+
      If this is NULL, then the generic delete_terminal is called
      instead.  Otherwise the hook must call delete_terminal itself.
 
index 3646aec6983f281c31d159d24d5b6bdc8eff7e29..dadc19d52e326a63df353265c9bf5956536bfeca 100644 (file)
@@ -819,7 +819,9 @@ copy_data_segment (struct load_command *lc)
               || strncmp (sectp->sectname, "__la_sym_ptr2", 16) == 0
               || strncmp (sectp->sectname, "__dyld", 16) == 0
               || strncmp (sectp->sectname, "__const", 16) == 0
-              || strncmp (sectp->sectname, "__cfstring", 16) == 0)
+              || strncmp (sectp->sectname, "__cfstring", 16) == 0
+              || strncmp (sectp->sectname, "__gcc_except_tab", 16) == 0
+              || strncmp (sectp->sectname, "__objc_", 7) == 0)
        {
          if (!unexec_copy (sectp->offset, old_file_offset, sectp->size))
            unexec_error ("cannot copy section %s", sectp->sectname);
@@ -898,12 +900,13 @@ copy_symtab (struct load_command *lc, long delta)
 
 /* Fix up relocation entries. */
 static void
-unrelocate (const char *name, off_t reloff, int nrel)
+unrelocate (const char *name, off_t reloff, int nrel, vm_address_t base)
 {
   int i, unreloc_count;
   struct relocation_info reloc_info;
   struct scattered_relocation_info *sc_reloc_info
     = (struct scattered_relocation_info *) &reloc_info;
+  vm_address_t location;
 
   for (unreloc_count = 0, i = 0; i < nrel; i++)
     {
@@ -917,14 +920,15 @@ unrelocate (const char *name, off_t reloff, int nrel)
        switch (reloc_info.r_type)
          {
          case GENERIC_RELOC_VANILLA:
-           if (reloc_info.r_address >= data_segment_scp->vmaddr
-               && reloc_info.r_address < (data_segment_scp->vmaddr
-                                          + data_segment_scp->vmsize))
+           location = base + reloc_info.r_address;
+           if (location >= data_segment_scp->vmaddr
+               && location < (data_segment_scp->vmaddr
+                              + data_segment_scp->vmsize))
              {
                off_t src_off = data_segment_old_fileoff
-                 + reloc_info.r_address - data_segment_scp->vmaddr;
+                 + (location - data_segment_scp->vmaddr);
                off_t dst_off = data_segment_scp->fileoff
-                 + reloc_info.r_address - data_segment_scp->vmaddr;
+                 + (location - data_segment_scp->vmaddr);
 
                if (!unexec_copy (dst_off, src_off, 1 << reloc_info.r_length))
                  unexec_error ("unrelocate: %s:%d cannot copy original value",
@@ -955,15 +959,73 @@ unrelocate (const char *name, off_t reloff, int nrel)
            unreloc_count, nrel, name);
 }
 
+#if __ppc64__
+/* Rebase r_address in the relocation table.  */
+static void
+rebase_reloc_address (off_t reloff, int nrel, long linkedit_delta, long diff)
+{
+  int i;
+  struct relocation_info reloc_info;
+  struct scattered_relocation_info *sc_reloc_info
+    = (struct scattered_relocation_info *) &reloc_info;
+
+  for (i = 0; i < nrel; i++, reloff += sizeof (reloc_info))
+    {
+      if (lseek (infd, reloff - linkedit_delta, L_SET)
+         != reloff - linkedit_delta)
+       unexec_error ("rebase_reloc_table: cannot seek to reloc_info");
+      if (!unexec_read (&reloc_info, sizeof (reloc_info)))
+       unexec_error ("rebase_reloc_table: cannot read reloc_info");
+
+      if (sc_reloc_info->r_scattered == 0
+         && reloc_info.r_type == GENERIC_RELOC_VANILLA)
+       {
+         reloc_info.r_address -= diff;
+         if (!unexec_write (reloff, &reloc_info, sizeof (reloc_info)))
+           unexec_error ("rebase_reloc_table: cannot write reloc_info");
+       }
+    }
+}
+#endif
+
 /* Copy a LC_DYSYMTAB load command from the input file to the output
    file, adjusting the file offset fields.  */
 static void
 copy_dysymtab (struct load_command *lc, long delta)
 {
   struct dysymtab_command *dstp = (struct dysymtab_command *) lc;
+  vm_address_t base;
 
-  unrelocate ("local", dstp->locreloff, dstp->nlocrel);
-  unrelocate ("external", dstp->extreloff, dstp->nextrel);
+#ifdef _LP64
+#if __ppc64__
+  {
+    int i;
+
+    base = 0;
+    for (i = 0; i < nlc; i++)
+      if (lca[i]->cmd == LC_SEGMENT)
+       {
+         struct segment_command *scp = (struct segment_command *) lca[i];
+
+         if (scp->vmaddr + scp->vmsize > 0x100000000
+             && (scp->initprot & VM_PROT_WRITE) != 0)
+           {
+             base = data_segment_scp->vmaddr;
+             break;
+           }
+       }
+  }
+#else
+  /* First writable segment address.  */
+  base = data_segment_scp->vmaddr;
+#endif
+#else
+  /* First segment address in the file (unless MH_SPLIT_SEGS set). */
+  base = 0;
+#endif
+
+  unrelocate ("local", dstp->locreloff, dstp->nlocrel, base);
+  unrelocate ("external", dstp->extreloff, dstp->nextrel, base);
 
   if (dstp->nextrel > 0) {
     dstp->extreloff += delta;
@@ -982,6 +1044,29 @@ copy_dysymtab (struct load_command *lc, long delta)
     unexec_error ("cannot write symtab command to header");
 
   curr_header_offset += lc->cmdsize;
+
+#if __ppc64__
+  /* Check if the relocation base needs to be changed.  */
+  if (base == 0)
+    {
+      vm_address_t newbase = 0;
+      int i;
+
+      for (i = 0; i < num_unexec_regions; i++)
+       if (unexec_regions[i].range.address + unexec_regions[i].range.size
+           > 0x100000000)
+         {
+           newbase = data_segment_scp->vmaddr;
+           break;
+         }
+
+      if (newbase)
+       {
+         rebase_reloc_address (dstp->locreloff, dstp->nlocrel, delta, newbase);
+         rebase_reloc_address (dstp->extreloff, dstp->nextrel, delta, newbase);
+       }
+    }
+#endif
 }
 
 /* Copy a LC_TWOLEVEL_HINTS load command from the input file to the output
index 1ccd7ff24245094345093b6216085d8e039aca94..dd6abd8a743d63b7d8bfaef47e6383ca797b8617 100644 (file)
@@ -261,7 +261,7 @@ w32_init_bdf_font(char *filename)
       error("Fail to open BDF file");
     }
   hfilemap = CreateFileMapping(hfile, NULL, PAGE_READONLY, 0, 0, NULL);
-  if (hfilemap == INVALID_HANDLE_VALUE)
+  if (!hfilemap)
     {
       CloseHandle(hfile);
       error("Can't map font");
@@ -828,7 +828,7 @@ int w32_BDF_to_x_font (char *file, char* xstr, int len)
   size = fileinfo.nFileSizeLow;
 
   hfilemap = CreateFileMapping (hfile, NULL, PAGE_READONLY, 0, 0, NULL);
-  if (hfilemap == INVALID_HANDLE_VALUE)
+  if (!hfilemap)
     {
       CloseHandle (hfile);
       return 0;
index 72411d7d4be01945df31c0067dcf76cbab828645..d5f7a66a0e84cd32ab753160562898a9407994be 100644 (file)
@@ -35,8 +35,6 @@ Boston, MA 02110-1301, USA.
 #include "character.h"
 #include "coding.h"
 #include "disptab.h"
-/* Disable features in frame.h that require a Window System.  */
-#undef HAVE_WINDOW_SYSTEM
 #include "frame.h"
 #include "termhooks.h"
 #include "termchar.h"
@@ -76,6 +74,8 @@ static DWORD   prev_console_mode;
 static CONSOLE_CURSOR_INFO prev_console_cursor;
 #endif
 
+extern Lisp_Object Vtty_defined_color_alist;
+
 /* Determine whether to make frame dimensions match the screen buffer,
    or the current window size.  The former is desirable when running
    over telnet, while the latter is more useful when working directly at
@@ -164,6 +164,7 @@ w32con_ins_del_lines (struct frame *f, int vpos, int n)
 {
   int       i, nb;
   SMALL_RECT scroll;
+  SMALL_RECT clip;
   COORD             dest;
   CHAR_INFO  fill;
 
@@ -179,15 +180,16 @@ w32con_ins_del_lines (struct frame *f, int vpos, int n)
       scroll.Bottom = FRAME_LINES (f) - n;
       dest.Y = vpos + n;
     }
-  scroll.Left = 0;
-  scroll.Right = FRAME_COLS (f);
+  clip.Top = clip.Left = scroll.Left = 0;
+  clip.Right = scroll.Right = FRAME_COLS (f);
+  clip.Bottom = FRAME_LINES (f);
 
   dest.X = 0;
 
   fill.Char.AsciiChar = 0x20;
   fill.Attributes = char_attr_normal;
 
-  ScrollConsoleScreenBuffer (cur_screen, &scroll, NULL, dest, &fill);
+  ScrollConsoleScreenBuffer (cur_screen, &scroll, &clip, dest, &fill);
 
   /* Here we have to deal with a w32 console flake: If the scroll
      region looks like abc and we scroll c to a and fill with d we get
@@ -235,12 +237,13 @@ scroll_line (struct frame *f, int dist, int direction)
 {
   /* The idea here is to implement a horizontal scroll in one line to
      implement delete and half of insert.  */
-  SMALL_RECT scroll;
+  SMALL_RECT scroll, clip;
   COORD             dest;
   CHAR_INFO  fill;
 
-  scroll.Top = cursor_coords.Y;
-  scroll.Bottom = cursor_coords.Y;
+  clip.Top = scroll.Top = clip.Bottom = scroll.Bottom = cursor_coords.Y;
+  clip.Left = 0;
+  clip.Right = FRAME_COLS (f);
 
   if (direction == LEFT)
     {
@@ -259,7 +262,7 @@ scroll_line (struct frame *f, int dist, int direction)
   fill.Char.AsciiChar = 0x20;
   fill.Attributes = char_attr_normal;
 
-  ScrollConsoleScreenBuffer (cur_screen, &scroll, NULL, dest, &fill);
+  ScrollConsoleScreenBuffer (cur_screen, &scroll, &clip, dest, &fill);
 }
 
 
@@ -290,7 +293,6 @@ static void
 w32con_write_glyphs (struct frame *f, register struct glyph *string,
                      register int len)
 {
-  int produced, consumed;
   DWORD r;
   WORD char_attr;
   unsigned char *conversion_buffer;
@@ -418,11 +420,31 @@ SOUND is nil to use the normal beep.  */)
 static void
 w32con_reset_terminal_modes (struct terminal *t)
 {
+  COORD dest;
+  CONSOLE_SCREEN_BUFFER_INFO info;
+  int n;
+  DWORD r;
+
+  /* Clear the complete screen buffer.  This is required because Emacs
+     sets the cursor position to the top of the buffer, but there might
+     be other output below the bottom of the Emacs frame if the screen buffer
+     is larger than the window size.  */
+  GetConsoleScreenBufferInfo (cur_screen, &info);
+  dest.X = 0;
+  dest.Y = 0;
+  n = info.dwSize.X * info.dwSize.Y;
+
+  FillConsoleOutputAttribute (cur_screen, char_attr_normal, n, dest, &r);
+  FillConsoleOutputCharacter (cur_screen, ' ', n, dest, &r);
+  /* Now that the screen is clear, put the cursor at the top.  */
+  SetConsoleCursorPosition (cur_screen, dest);
+  
 #ifdef USE_SEPARATE_SCREEN
   SetConsoleActiveScreenBuffer (prev_screen);
 #else
   SetConsoleCursorInfo (prev_screen, &prev_console_cursor);
 #endif
+
   SetConsoleMode (keyboard_handle, prev_console_mode);
 }
 
@@ -484,32 +506,31 @@ w32_face_attributes (f, face_id)
 
   char_attr = char_attr_normal;
 
-  if (face->foreground != FACE_TTY_DEFAULT_FG_COLOR
-      && face->foreground != FACE_TTY_DEFAULT_COLOR)
-    char_attr = (char_attr & 0xfff0) + (face->foreground % 16);
-
-  if (face->background != FACE_TTY_DEFAULT_BG_COLOR
-      && face->background != FACE_TTY_DEFAULT_COLOR)
-    char_attr = (char_attr & 0xff0f) + ((face->background % 16) << 4);
-
-
-  /* NTEMACS_TODO: Faces defined during startup get both foreground
-     and background of 0. Need a better way around this - for now detect
-     the problem and invert one of the faces to make the text readable. */
-  if (((char_attr & 0x00f0) >> 4) == (char_attr & 0x000f))
-    char_attr ^= 0x0007;
-
+  /* Reverse the default color if requested. If background and
+     foreground are specified, then they have been reversed already.  */
   if (face->tty_reverse_p)
     char_attr = (char_attr & 0xff00) + ((char_attr & 0x000f) << 4)
       + ((char_attr & 0x00f0) >> 4);
 
-  return char_attr;
-}
+  /* Before the terminal is properly initialized, all colors map to 0.
+     Don't try to resolve them.  */
+  if (NILP (Vtty_defined_color_alist))
+    return char_attr;
+
+  /* Colors should be in the range 0...15 unless they are one of
+     FACE_TTY_DEFAULT_COLOR, FACE_TTY_DEFAULT_FG_COLOR or
+     FACE_TTY_DEFAULT_BG_COLOR.  Other out of range colors are
+     invalid, so it is better to use the default color if they ever
+     get through to here.  */
+  if (face->foreground >= 0 && face->foreground < 16)
+    char_attr = (char_attr & 0xfff0) + face->foreground;
 
+  if (face->background >= 0 && face->background < 16)
+    char_attr = (char_attr & 0xff0f) + (face->background << 4);
 
-/* Emulation of some X window features from xfns.c and xfaces.c.  */
+  return char_attr;
+}
 
-extern char unspecified_fg[], unspecified_bg[];
 
 
 /* Given a color index, return its standard name.  */
index 03179c6952efc92bad05400cf335294078ba2258..3e4413a0beee8b0a2b05bf78e85eba8a3d8f7df1 100644 (file)
@@ -79,14 +79,6 @@ extern int quit_char;
 
 extern char *lispy_function_keys[];
 
-/* The gray bitmap `bitmaps/gray'.  This is done because w32term.c uses
-   it, and including `bitmaps/gray' more than once is a problem when
-   config.h defines `static' as an empty replacement string.  */
-
-int gray_bitmap_width = gray_width;
-int gray_bitmap_height = gray_height;
-unsigned char *gray_bitmap_bits = gray_bits;
-
 /* The colormap for converting color names to RGB values */
 Lisp_Object Vw32_color_map;
 
@@ -149,10 +141,10 @@ int w32_mouse_button_tolerance;
 int w32_mouse_move_interval;
 
 /* Flag to indicate if XBUTTON events should be passed on to Windows.  */
-int w32_pass_extra_mouse_buttons_to_system;
+static int w32_pass_extra_mouse_buttons_to_system;
 
 /* Flag to indicate if media keys should be passed on to Windows.  */
-int w32_pass_multimedia_buttons_to_system;
+static int w32_pass_multimedia_buttons_to_system;
 
 /* Non nil if no window manager is in use.  */
 Lisp_Object Vx_no_window_manager;
@@ -191,14 +183,14 @@ Lisp_Object Vx_pixel_size_width_font_regexp;
 Lisp_Object Vw32_bdf_filename_alist;
 
 /* A flag to control whether fonts are matched strictly or not.  */
-int w32_strict_fontnames;
+static int w32_strict_fontnames;
 
 /* A flag to control whether we should only repaint if GetUpdateRect
    indicates there is an update region.  */
-int w32_strict_painting;
+static int w32_strict_painting;
 
 /* Associative list linking character set strings to Windows codepages. */
-Lisp_Object Vw32_charset_info_alist;
+static Lisp_Object Vw32_charset_info_alist;
 
 /* VIETNAMESE_CHARSET is not defined in some versions of MSVC.  */
 #ifndef VIETNAMESE_CHARSET
@@ -478,7 +470,7 @@ x_real_positions (f, xptr, yptr)
 DEFUN ("w32-define-rgb-color", Fw32_define_rgb_color,
        Sw32_define_rgb_color, 4, 4, 0,
        doc: /* Convert RGB numbers to a windows color reference and associate with NAME.
-This adds or updates a named color to w32-color-map, making it
+This adds or updates a named color to `w32-color-map', making it
 available for use.  The original entry's RGB ref is returned, or nil
 if the entry is new.  */)
     (red, green, blue, name)
@@ -493,7 +485,7 @@ if the entry is new.  */)
   CHECK_NUMBER (blue);
   CHECK_STRING (name);
 
-  XSETINT (rgb, RGB(XUINT (red), XUINT (green), XUINT (blue)));
+  XSETINT (rgb, RGB (XUINT (red), XUINT (green), XUINT (blue)));
 
   BLOCK_INPUT;
 
@@ -518,7 +510,7 @@ if the entry is new.  */)
 DEFUN ("w32-load-color-file", Fw32_load_color_file,
        Sw32_load_color_file, 1, 1, 0,
        doc: /* Create an alist of color entries from an external file.
-Assign this value to w32-color-map to replace the existing color map.
+Assign this value to `w32-color-map' to replace the existing color map.
 
 The file should define one named RGB color per line like so:
   R G B   name
@@ -836,7 +828,7 @@ DEFUN ("w32-default-color-map", Fw32_default_color_map, Sw32_default_color_map,
   return (cmap);
 }
 
-Lisp_Object
+static Lisp_Object
 w32_to_x_color (rgb)
      Lisp_Object rgb;
 {
@@ -953,7 +945,7 @@ x_to_w32_color (colorname)
       int size;
       color = colorname + 1;
 
-      size = strlen(color);
+      size = strlen (color);
       if (size == 3 || size == 6 || size == 9 || size == 12)
        {
          UINT colorval;
@@ -971,11 +963,11 @@ x_to_w32_color (colorname)
              /* The check for 'x' in the following conditional takes into
                 account the fact that strtol allows a "0x" in front of
                 our numbers, and we don't.  */
-             if (!isxdigit(color[0]) || color[1] == 'x')
+             if (!isxdigit (color[0]) || color[1] == 'x')
                break;
              t = color[size];
              color[size] = '\0';
-             value = strtoul(color, &end, 16);
+             value = strtoul (color, &end, 16);
              color[size] = t;
              if (errno == ERANGE || end - color != size)
                break;
@@ -1005,7 +997,7 @@ x_to_w32_color (colorname)
            }
        }
     }
-  else if (strnicmp(colorname, "rgb:", 4) == 0)
+  else if (strnicmp (colorname, "rgb:", 4) == 0)
     {
       char *color;
       UINT colorval;
@@ -1022,9 +1014,9 @@ x_to_w32_color (colorname)
          /* The check for 'x' in the following conditional takes into
             account the fact that strtol allows a "0x" in front of
             our numbers, and we don't.  */
-         if (!isxdigit(color[0]) || color[1] == 'x')
+         if (!isxdigit (color[0]) || color[1] == 'x')
            break;
-         value = strtoul(color, &end, 16);
+         value = strtoul (color, &end, 16);
          if (errno == ERANGE)
            break;
          switch (end - color)
@@ -1060,7 +1052,7 @@ x_to_w32_color (colorname)
          color = end + 1;
        }
     }
-  else if (strnicmp(colorname, "rgbi:", 5) == 0)
+  else if (strnicmp (colorname, "rgbi:", 5) == 0)
     {
       /* This is an RGB Intensity specification.  */
       char *color;
@@ -1076,7 +1068,7 @@ x_to_w32_color (colorname)
          double value;
          UINT val;
 
-         value = strtod(color, &end);
+         value = strtod (color, &end);
          if (errno == ERANGE)
            break;
          if (value < 0.0 || value > 1.0)
@@ -1574,7 +1566,6 @@ x_set_mouse_color (f, arg, oldval)
 #endif /* TODO */
 }
 
-/* Defined in w32term.c. */
 void
 x_set_cursor_color (f, arg, oldval)
      struct frame *f;
@@ -1926,7 +1917,7 @@ x_set_name (f, name, explicit)
        name = ENCODE_SYSTEM (name);
 
       BLOCK_INPUT;
-      SetWindowText(FRAME_W32_WINDOW (f), SDATA (name));
+      SetWindowText (FRAME_W32_WINDOW (f), SDATA (name));
       UNBLOCK_INPUT;
     }
 }
@@ -1978,7 +1969,7 @@ x_set_title (f, name, old_name)
        name = ENCODE_SYSTEM (name);
 
       BLOCK_INPUT;
-      SetWindowText(FRAME_W32_WINDOW (f), SDATA (name));
+      SetWindowText (FRAME_W32_WINDOW (f), SDATA (name));
       UNBLOCK_INPUT;
     }
 }
@@ -2025,7 +2016,7 @@ Cursor
 w32_load_cursor (LPCTSTR name)
 {
   /* Try first to load cursor from application resource.  */
-  Cursor cursor = LoadImage ((HINSTANCE) GetModuleHandle(NULL),
+  Cursor cursor = LoadImage ((HINSTANCE) GetModuleHandle (NULL),
                             name, IMAGE_CURSOR, 0, 0,
                             LR_DEFAULTCOLOR | LR_DEFAULTSIZE | LR_SHARED);
   if (!cursor)
@@ -2039,7 +2030,7 @@ w32_load_cursor (LPCTSTR name)
 
 extern LRESULT CALLBACK w32_wnd_proc ();
 
-BOOL
+static BOOL
 w32_init_class (hinst)
      HINSTANCE hinst;
 {
@@ -2059,24 +2050,24 @@ w32_init_class (hinst)
   return (RegisterClass (&wc));
 }
 
-HWND
+static HWND
 w32_createscrollbar (f, bar)
      struct frame *f;
      struct scroll_bar * bar;
 {
   return (CreateWindow ("SCROLLBAR", "", SBS_VERT | WS_CHILD | WS_VISIBLE,
                        /* Position and size of scroll bar.  */
-                       XINT(bar->left) + VERTICAL_SCROLL_BAR_WIDTH_TRIM,
-                        XINT(bar->top),
-                       XINT(bar->width) - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2,
-                        XINT(bar->height),
+                       XINT (bar->left) + VERTICAL_SCROLL_BAR_WIDTH_TRIM,
+                        XINT (bar->top),
+                       XINT (bar->width) - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2,
+                        XINT (bar->height),
                        FRAME_W32_WINDOW (f),
                        NULL,
                        hinst,
                        NULL));
 }
 
-void
+static void
 w32_createwindow (f)
      struct frame *f;
 {
@@ -2146,7 +2137,7 @@ w32_createwindow (f)
     }
 }
 
-void
+static void
 my_post_msg (wmsg, hwnd, msg, wParam, lParam)
      W32Msg * wmsg;
      HWND hwnd;
@@ -2378,7 +2369,7 @@ w32_key_to_modifier (int key)
   return 0;
 }
 
-unsigned int
+static unsigned int
 w32_get_modifiers ()
 {
   return ((modifier_set (VK_SHIFT)   ? shift_modifier : 0) |
@@ -2449,12 +2440,12 @@ map_keypad_keys (unsigned int virt_key, unsigned int extended)
 }
 
 /* List of special key combinations which w32 would normally capture,
-   but emacs should grab instead.  Not directly visible to lisp, to
+   but Emacs should grab instead.  Not directly visible to lisp, to
    simplify synchronization.  Each item is an integer encoding a virtual
    key code and modifier combination to capture.  */
-Lisp_Object w32_grabbed_keys;
+static Lisp_Object w32_grabbed_keys;
 
-#define HOTKEY(vk,mods)       make_number (((vk) & 255) | ((mods) << 8))
+#define HOTKEY(vk, mods)      make_number (((vk) & 255) | ((mods) << 8))
 #define HOTKEY_ID(k)          (XFASTINT (k) & 0xbfff)
 #define HOTKEY_VK_CODE(k)     (XFASTINT (k) & 255)
 #define HOTKEY_MODIFIERS(k)   (XFASTINT (k) >> 8)
@@ -2680,7 +2671,7 @@ complete_deferred_msg (HWND hwnd, UINT msg, LRESULT result)
   deferred_msg * msg_buf = find_deferred_msg (hwnd, msg);
 
   if (msg_buf == NULL)
-    /* Message may have been cancelled, so don't abort().  */
+    /* Message may have been cancelled, so don't abort.  */
     return;
 
   msg_buf->result = result;
@@ -2690,7 +2681,7 @@ complete_deferred_msg (HWND hwnd, UINT msg, LRESULT result)
   PostThreadMessage (dwWindowsThreadId, WM_NULL, 0, 0);
 }
 
-void
+static void
 cancel_all_deferred_msgs ()
 {
   deferred_msg * item;
@@ -2768,7 +2759,7 @@ post_character_message (hwnd, msg, wParam, lParam, modifiers)
 
   /* Detect quit_char and set quit-flag directly.  Note that we
      still need to post a message to ensure the main thread will be
-     woken up if blocked in sys_select(), but we do NOT want to post
+     woken up if blocked in sys_select, but we do NOT want to post
      the quit_char message itself (because it will usually be as if
      the user had typed quit_char twice).  Instead, we post a dummy
      message that has no particular effect. */
@@ -2923,7 +2914,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
 
        /* If GetUpdateRect returns 0 (meaning there is no update
            region), assume the whole window needs to be repainted.  */
-       GetClientRect(hwnd, &wmsg.rect);
+       GetClientRect (hwnd, &wmsg.rect);
        my_post_msg (&wmsg, hwnd, msg, wParam, lParam);
         return 0;
       }
@@ -3774,7 +3765,7 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
            DWORD scrollbar_extra;
            RECT wr;
 
-           wp.length = sizeof(wp);
+           wp.length = sizeof (wp);
            GetWindowRect (hwnd, &wr);
 
            enter_crit ();
@@ -4251,7 +4242,7 @@ x_default_font_parameter (f, parms)
 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
        1, 1, 0,
        doc: /* Make a new window, which is called a \"frame\" in Emacs terms.
-Returns an Emacs frame object.
+Return an Emacs frame object.
 PARAMETERS is an alist of frame parameters.
 If the parameters specify that the frame should not have a minibuffer,
 and do not specify a specific minibuffer window to use,
@@ -4621,11 +4612,12 @@ DEFUN ("x-focus-frame", Fx_focus_frame, Sx_focus_frame, 1, 1, 0,
 
 \f
 /* Return the charset portion of a font name.  */
-char * xlfd_charset_of_font (char * fontname)
+char *
+xlfd_charset_of_font (char * fontname)
 {
   char *charset, *encoding;
 
-  encoding = strrchr(fontname, '-');
+  encoding = strrchr (fontname, '-');
   if (!encoding || encoding == fontname)
     return NULL;
 
@@ -4633,7 +4625,7 @@ char * xlfd_charset_of_font (char * fontname)
     if (*charset == '-')
       break;
 
-  if (charset == fontname || strcmp(charset, "-*-*") == 0)
+  if (charset == fontname || strcmp (charset, "-*-*") == 0)
     return NULL;
 
   return charset + 1;
@@ -4647,7 +4639,7 @@ static BOOL w32_to_x_font (LOGFONT * lplf, char * lpxstr, int len,
 static BOOL x_to_w32_font (char *lpxstr, LOGFONT *lplogfont);
 
 static struct font_info *
-w32_load_system_font (f,fontname,size)
+w32_load_system_font (f, fontname, size)
      struct frame *f;
      char * fontname;
      int size;
@@ -4750,7 +4742,7 @@ w32_load_system_font (f,fontname,size)
                GetFontLanguageInfo, we check the properties of the
                codepage directly, since that is ultimately what we are
                working from anyway.  */
-           /* font->double_byte_p = GetFontLanguageInfo(hdc) & GCP_DBCS; */
+           /* font->double_byte_p = GetFontLanguageInfo (hdc) & GCP_DBCS; */
            CPINFO cpi = {0};
            GetCPInfo (codepage, &cpi);
            font->double_byte_p = cpi.MaxCharSize > 1;
@@ -4887,10 +4879,10 @@ w32_load_system_font (f,fontname,size)
    pointer to the structure font_info while allocating it dynamically.
    If loading fails, return NULL. */
 struct font_info *
-w32_load_font (f,fontname,size)
-struct frame *f;
-char * fontname;
-int size;
+w32_load_font (f, fontname, size)
+     struct frame *f;
+     char * fontname;
+     int size;
 {
   Lisp_Object bdf_fonts;
   struct font_info *retval = NULL;
@@ -4926,7 +4918,7 @@ int size;
   if (retval)
     return retval;
 
-  return w32_load_system_font(f, fontname, size);
+  return w32_load_system_font (f, fontname, size);
 }
 
 
@@ -4940,7 +4932,7 @@ w32_unload_font (dpyinfo, font)
       if (font->per_char) xfree (font->per_char);
       if (font->bdf) w32_free_bdf_font (font->bdf);
 
-      if (font->hfont) DeleteObject(font->hfont);
+      if (font->hfont) DeleteObject (font->hfont);
       xfree (font);
     }
 }
@@ -4974,16 +4966,16 @@ x_to_w32_weight (lpw)
 {
   if (!lpw) return (FW_DONTCARE);
 
-  if (stricmp (lpw,"heavy") == 0)             return FW_HEAVY;
-  else if (stricmp (lpw,"extrabold") == 0)    return FW_EXTRABOLD;
-  else if (stricmp (lpw,"bold") == 0)         return FW_BOLD;
-  else if (stricmp (lpw,"demibold") == 0)     return FW_SEMIBOLD;
-  else if (stricmp (lpw,"semibold") == 0)     return FW_SEMIBOLD;
-  else if (stricmp (lpw,"medium") == 0)       return FW_MEDIUM;
-  else if (stricmp (lpw,"normal") == 0)       return FW_NORMAL;
-  else if (stricmp (lpw,"light") == 0)        return FW_LIGHT;
-  else if (stricmp (lpw,"extralight") == 0)   return FW_EXTRALIGHT;
-  else if (stricmp (lpw,"thin") == 0)         return FW_THIN;
+  if (stricmp (lpw, "heavy") == 0)             return FW_HEAVY;
+  else if (stricmp (lpw, "extrabold") == 0)    return FW_EXTRABOLD;
+  else if (stricmp (lpw, "bold") == 0)         return FW_BOLD;
+  else if (stricmp (lpw, "demibold") == 0)     return FW_SEMIBOLD;
+  else if (stricmp (lpw, "semibold") == 0)     return FW_SEMIBOLD;
+  else if (stricmp (lpw, "medium") == 0)       return FW_MEDIUM;
+  else if (stricmp (lpw, "normal") == 0)       return FW_NORMAL;
+  else if (stricmp (lpw, "light") == 0)        return FW_LIGHT;
+  else if (stricmp (lpw, "extralight") == 0)   return FW_EXTRALIGHT;
+  else if (stricmp (lpw, "thin") == 0)         return FW_THIN;
   else
     return FW_DONTCARE;
 }
@@ -5033,12 +5025,12 @@ x_to_w32_charset (lpcs)
      Format of each entry is
        (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
   */
-  this_entry = Fassoc (build_string(charset), Vw32_charset_info_alist);
+  this_entry = Fassoc (build_string (charset), Vw32_charset_info_alist);
 
-  if (NILP(this_entry))
+  if (NILP (this_entry))
     {
       /* At startup, we want iso8859-1 fonts to come up properly. */
-      if (stricmp(charset, "iso8859-1") == 0)
+      if (stricmp (charset, "iso8859-1") == 0)
         return ANSI_CHARSET;
       else
         return DEFAULT_CHARSET;
@@ -5121,7 +5113,7 @@ w32_to_x_charset (fncharset, matching)
     case ANSI_CHARSET:
       /* Handle startup case of w32-charset-info-alist not
          being set up yet. */
-      if (NILP(Vw32_charset_info_alist))
+      if (NILP (Vw32_charset_info_alist))
         return "iso8859-1";
       charset_type = Qw32_charset_ansi;
       break;
@@ -5315,7 +5307,7 @@ w32_to_all_x_charsets (fncharset)
     case ANSI_CHARSET:
       /* Handle startup case of w32-charset-info-alist not
          being set up yet. */
-      if (NILP(Vw32_charset_info_alist))
+      if (NILP (Vw32_charset_info_alist))
         return Fcons (build_string ("iso8859-1"), Qnil);
 
       charset_type = Qw32_charset_ansi;
@@ -5543,6 +5535,9 @@ w32_to_x_font (lplogfont, lpxstr, len, specific_charset)
                          strlen(lplogfont->lfFaceName), Qnil);
   fontname = coding.destination;
 
+  fontname = alloca (sizeof (*fontname) * bufsz);
+  decode_coding (&coding, lplogfont->lfFaceName, fontname,
+                 strlen (lplogfont->lfFaceName), bufsz - 1);
   *(fontname + coding.produced) = '\0';
 
   /* Replace dashes with underscores so the dashes are not
@@ -5754,7 +5749,7 @@ x_to_w32_font (lpxstr, lplogfont)
 
       if (fields > 0)
         {
-         strncpy (lplogfont->lfFaceName,name, LF_FACESIZE);
+         strncpy (lplogfont->lfFaceName, name, LF_FACESIZE);
          lplogfont->lfFaceName[LF_FACESIZE-1] = 0;
        }
       else
@@ -5953,7 +5948,7 @@ w32_font_match (fontname, pattern)
   }
 
   return (fast_string_match_ignore_case (build_string (regex),
-                                         build_string(font_name_copy)) >= 0);
+                                         build_string (font_name_copy)) >= 0);
 }
 
 /* Callback functions, and a structure holding info they need, for
@@ -6189,7 +6184,8 @@ enum_fontex_cb1 (lplf, lptm, font_type, lpef)
 /* Interface to fontset handler. (adapted from mw32font.c in Meadow
    and xterm.c in Emacs 20.3) */
 
-static Lisp_Object w32_list_bdf_fonts (Lisp_Object pattern, int max_names)
+static Lisp_Object
+w32_list_bdf_fonts (Lisp_Object pattern, int max_names)
 {
   char *fontname, *ptnstr;
   Lisp_Object list, tem, newlist = Qnil;
@@ -6260,7 +6256,7 @@ w32_list_fonts (f, pattern, size, maxnames)
       codepage = w32_codepage_for_font (SDATA (tpat));
       if (codepage != CP_8BIT && codepage != CP_UNICODE
           && codepage != CP_DEFAULT && codepage != CP_UNKNOWN
-         && !IsValidCodePage(codepage))
+         && !IsValidCodePage (codepage))
         continue;
 
       /* See if we cached the result for this particular query.
@@ -6371,7 +6367,7 @@ w32_list_fonts (f, pattern, size, maxnames)
                 XSETCDR (tem, make_number (0));
               SelectObject (hdc, oldobj);
               ReleaseDC (dpyinfo->root_window, hdc);
-              DeleteObject(thisinfo.hfont);
+              DeleteObject (thisinfo.hfont);
               UNBLOCK_INPUT;
             }
           found_size = XINT (XCDR (tem));
@@ -6420,7 +6416,7 @@ w32_list_fonts (f, pattern, size, maxnames)
     Lisp_Object combined[2];
     combined[0] = w32_list_bdf_fonts (pattern, maxnames - n_fonts);
     combined[1] = newlist;
-    newlist = Fnconc(2, combined);
+    newlist = Fnconc (2, combined);
   }
 
   return newlist;
@@ -6447,7 +6443,7 @@ w32_query_font (struct frame *f, char *fontname)
 
   for (i = 0; i < one_w32_display_info.n_fonts ;i++, pfi++)
     {
-      if (stricmp(pfi->name, fontname) == 0) return pfi;
+      if (stricmp (pfi->name, fontname) == 0) return pfi;
     }
 
   return NULL;
@@ -6484,7 +6480,7 @@ w32_find_ccl_program (fontp)
 }
 
 /* directory-files from dired.c.  */
-Lisp_Object Fdirectory_files P_((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object));
+Lisp_Object Fdirectory_files P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object));
 
 \f
 /* Find BDF files in a specified directory.  (use GCPRO when calling,
@@ -6495,13 +6491,13 @@ w32_find_bdf_fonts_in_dir (Lisp_Object directory)
   Lisp_Object filelist, list = Qnil;
   char fontname[100];
 
-  if (!STRINGP(directory))
+  if (!STRINGP (directory))
     return Qnil;
 
   filelist = Fdirectory_files (directory, Qt,
                               build_string (".*\\.[bB][dD][fF]"), Qt);
 
-  for ( ; CONSP(filelist); filelist = XCDR (filelist))
+  for ( ; CONSP (filelist); filelist = XCDR (filelist))
     {
       Lisp_Object filename = XCAR (filelist);
       if (w32_BDF_to_x_font (SDATA (filename), fontname, 100))
@@ -6531,8 +6527,8 @@ in the list.  DIRECTORY may be a list of directories.  */)
       pair[0] = list;
       pair[1] = Qnil;
       GCPRO2 (directory, list);
-      pair[1] = w32_find_bdf_fonts_in_dir( XCAR (directory) );
-      list = Fnconc( 2, pair );
+      pair[1] = w32_find_bdf_fonts_in_dir ( XCAR (directory) );
+      list = Fnconc ( 2, pair );
       UNGCPRO;
     }
   return list;
@@ -6609,7 +6605,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-pixel-width", Fx_display_pixel_width,
        Sx_display_pixel_width, 0, 1, 0,
-       doc: /* Returns the width in pixels of DISPLAY.
+       doc: /* Return the width in pixels of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6623,7 +6619,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
        Sx_display_pixel_height, 0, 1, 0,
-       doc: /* Returns the height in pixels of DISPLAY.
+       doc: /* Return the height in pixels of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6637,7 +6633,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
        0, 1, 0,
-       doc: /* Returns the number of bitplanes of DISPLAY.
+       doc: /* Return the number of bitplanes of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6651,7 +6647,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells,
        0, 1, 0,
-       doc: /* Returns the number of color cells of DISPLAY.
+       doc: /* Return the number of color cells of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6671,7 +6667,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
   /* We force 24+ bit depths to 24-bit, both to prevent an overflow
      and because probably is more meaningful on Windows anyway */
   if (cap < 0)
-    cap = 1 << min(dpyinfo->n_planes * dpyinfo->n_cbits, 24);
+    cap = 1 << min (dpyinfo->n_planes * dpyinfo->n_cbits, 24);
 
   ReleaseDC (dpyinfo->root_window, hdc);
 
@@ -6681,7 +6677,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
        Sx_server_max_request_size,
        0, 1, 0,
-       doc: /* Returns the maximum request size of the server of DISPLAY.
+       doc: /* Return the maximum request size of the server of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6694,7 +6690,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
-       doc: /* Returns the "vendor ID" string of the W32 system (Microsoft).
+       doc: /* Return the "vendor ID" string of the W32 system (Microsoft).
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6705,10 +6701,10 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
-       doc: /* Returns the version numbers of the server of DISPLAY.
+       doc: /* Return the version numbers of the server of DISPLAY.
 The value is a list of three integers: the major and minor
-version numbers of the X Protocol in use, and the distributor-specific release
-number.  See also the function `x-server-vendor'.
+version numbers of the X Protocol in use, and the distributor-specific
+release number.  See also the function `x-server-vendor'.
 
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
@@ -6722,7 +6718,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-display-screens", Fx_display_screens, Sx_display_screens, 0, 1, 0,
-       doc: /* Returns the number of screens on the server of DISPLAY.
+       doc: /* Return the number of screens on the server of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6734,7 +6730,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-mm-height", Fx_display_mm_height,
        Sx_display_mm_height, 0, 1, 0,
-       doc: /* Returns the height in millimeters of DISPLAY.
+       doc: /* Return the height in millimeters of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6755,7 +6751,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0,
-       doc: /* Returns the width in millimeters of DISPLAY.
+       doc: /* Return the width in millimeters of DISPLAY.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6778,7 +6774,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-backing-store", Fx_display_backing_store,
        Sx_display_backing_store, 0, 1, 0,
-       doc: /* Returns an indication of whether DISPLAY does backing store.
+       doc: /* Return an indication of whether DISPLAY does backing store.
 The value may be `always', `when-mapped', or `not-useful'.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
@@ -6791,7 +6787,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-visual-class", Fx_display_visual_class,
        Sx_display_visual_class, 0, 1, 0,
-       doc: /* Returns the visual class of DISPLAY.
+       doc: /* Return the visual class of DISPLAY.
 The value is one of the symbols `static-gray', `gray-scale',
 `static-color', `pseudo-color', `true-color', or `direct-color'.
 
@@ -6818,7 +6814,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-save-under", Fx_display_save_under,
        Sx_display_save_under, 0, 1, 0,
-       doc: /* Returns t if DISPLAY supports the save-under feature.
+       doc: /* Return t if DISPLAY supports the save-under feature.
 The optional argument DISPLAY specifies which display to ask about.
 DISPLAY should be either a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -6934,7 +6930,7 @@ terminate Emacs if we can't open the connection.  */)
     Lisp_Object color_file;
     struct gcpro gcpro1;
 
-    color_file = build_string("~/rgb.txt");
+    color_file = build_string ("~/rgb.txt");
 
     GCPRO1 (color_file);
 
@@ -8192,7 +8188,7 @@ If ONLY-DIR-P is non-nil, the user can only select directories.  */)
            *last = '\0';
          }
 
-       file = DECODE_FILE(build_string (filename));
+       file = DECODE_FILE (build_string (filename));
       }
     /* User cancelled the dialog without making a selection.  */
     else if (!CommDlgExtendedError ())
@@ -8223,7 +8219,7 @@ If ONLY-DIR-P is non-nil, the user can only select directories.  */)
 
 DEFUN ("w32-select-font", Fw32_select_font, Sw32_select_font, 0, 2, 0,
        doc: /* Select a font for the named FRAME using the W32 font dialog.
-Returns an X-style font string corresponding to the selection.
+Return an X-style font string corresponding to the selection.
 
 If FRAME is omitted or nil, it defaults to the selected frame.
 If INCLUDE-PROPORTIONAL is non-nil, include proportional fonts
@@ -8327,13 +8323,13 @@ DOCUMENT is typically the name of a document file or a URL, but can
 also be a program executable to run, or a directory to open in the
 Windows Explorer.
 
-If DOCUMENT is a program executable, the optional arg PARAMETERS can
-be a string containing command line parameters that will be passed to
-the program; otherwise, PARAMETERS should be nil or unspecified.
+If DOCUMENT is a program executable, the optional third arg PARAMETERS
+can be a string containing command line parameters that will be passed
+to the program; otherwise, PARAMETERS should be nil or unspecified.
 
-Second optional argument SHOW-FLAG can be used to control how the
+Optional fourth argument SHOW-FLAG can be used to control how the
 application will be displayed when it is invoked.  If SHOW-FLAG is nil
-or unspceified, the application is displayed normally, otherwise it is
+or unspecified, the application is displayed normally, otherwise it is
 an integer representing a ShowWindow flag:
 
   0 - start hidden
@@ -8470,7 +8466,7 @@ The return value is the hotkey-id if registered, otherwise nil.  */)
 {
   key = w32_parse_hot_key (key);
 
-  if (NILP (Fmemq (key, w32_grabbed_keys)))
+  if (!NILP (key) && NILP (Fmemq (key, w32_grabbed_keys)))
     {
       /* Reuse an empty slot if possible.  */
       Lisp_Object item = Fmemq (Qnil, w32_grabbed_keys);
@@ -8518,7 +8514,6 @@ DEFUN ("w32-unregister-hot-key", Fw32_unregister_hot_key,
 #else
       if (PostThreadMessage (dwWindowsThreadId, WM_EMACS_UNREGISTER_HOT_KEY,
                             (WPARAM) XINT (XCAR (item)), (LPARAM) item))
-
 #endif
        {
          MSG msg;
@@ -8534,7 +8529,7 @@ DEFUN ("w32-registered-hot-keys", Fw32_registered_hot_keys,
        doc: /* Return list of registered hot-key IDs.  */)
   ()
 {
-  return Fcopy_sequence (w32_grabbed_keys);
+  return Fdelq (Qnil, Fcopy_sequence (w32_grabbed_keys));
 }
 
 DEFUN ("w32-reconstruct-hot-key", Fw32_reconstruct_hot_key,
@@ -8697,10 +8692,10 @@ If the underlying system call fails, value is nil.  */)
        LARGE_INTEGER freebytes;
        LARGE_INTEGER totalbytes;
 
-       if (pfn_GetDiskFreeSpaceEx(rootname,
-                                  (ULARGE_INTEGER *)&availbytes,
-                                  (ULARGE_INTEGER *)&totalbytes,
-                                  (ULARGE_INTEGER *)&freebytes))
+       if (pfn_GetDiskFreeSpaceEx (rootname,
+                                   (ULARGE_INTEGER *)&availbytes,
+                                   (ULARGE_INTEGER *)&totalbytes,
+                                   (ULARGE_INTEGER *)&freebytes))
          value = list3 (make_float ((double) totalbytes.QuadPart),
                         make_float ((double) freebytes.QuadPart),
                         make_float ((double) availbytes.QuadPart));
@@ -8712,11 +8707,11 @@ If the underlying system call fails, value is nil.  */)
        DWORD free_clusters;
        DWORD total_clusters;
 
-       if (GetDiskFreeSpace(rootname,
-                            &sectors_per_cluster,
-                            &bytes_per_sector,
-                            &free_clusters,
-                            &total_clusters))
+       if (GetDiskFreeSpace (rootname,
+                             &sectors_per_cluster,
+                             &bytes_per_sector,
+                             &free_clusters,
+                             &total_clusters))
          value = list3 (make_float ((double) total_clusters
                                     * sectors_per_cluster * bytes_per_sector),
                         make_float ((double) free_clusters
@@ -8762,12 +8757,12 @@ DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
       ClosePrinter (hPrn);
       return Qnil;
     }
-  /* Call GetPrinter() again with big enouth memory block */
+  /* Call GetPrinter again with big enouth memory block */
   err = GetPrinter (hPrn, 2, (LPBYTE)ppi2, dwNeeded, &dwReturned);
   ClosePrinter (hPrn);
   if (!err)
     {
-      xfree(ppi2);
+      xfree (ppi2);
       return Qnil;
     }
 
@@ -8777,23 +8772,23 @@ DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
         {
          /* a remote printer */
          if (*ppi2->pServerName == '\\')
-           _snprintf(pname_buf, sizeof (pname_buf), "%s\\%s", ppi2->pServerName,
-                     ppi2->pShareName);
+           _snprintf (pname_buf, sizeof (pname_buf), "%s\\%s", ppi2->pServerName,
+                      ppi2->pShareName);
          else
-           _snprintf(pname_buf, sizeof (pname_buf), "\\\\%s\\%s", ppi2->pServerName,
-                     ppi2->pShareName);
+           _snprintf (pname_buf, sizeof (pname_buf), "\\\\%s\\%s", ppi2->pServerName,
+                      ppi2->pShareName);
          pname_buf[sizeof (pname_buf) - 1] = '\0';
        }
       else
         {
          /* a local printer */
-         strncpy(pname_buf, ppi2->pPortName, sizeof (pname_buf));
+         strncpy (pname_buf, ppi2->pPortName, sizeof (pname_buf));
          pname_buf[sizeof (pname_buf) - 1] = '\0';
          /* `pPortName' can include several ports, delimited by ','.
           * we only use the first one. */
-         strtok(pname_buf, ",");
+         strtok (pname_buf, ",");
        }
-      xfree(ppi2);
+      xfree (ppi2);
     }
 
   return build_string (pname_buf);
@@ -9023,7 +9018,7 @@ system to handle them.  */);
                &w32_pass_multimedia_buttons_to_system,
                doc: /* If non-nil, media buttons are passed to Windows.
 Some modern keyboards contain buttons for controlling media players, web
-browsers and other applications. Generally these buttons are handled on a
+browsers and other applications.  Generally these buttons are handled on a
 system wide basis, but by setting this to nil they are made available
 to Emacs for binding.  Depending on your keyboard, additional keys that
 may be available are:
@@ -9039,8 +9034,7 @@ media-play, media-pause, media-record, media-fast-forward, media-rewind,
 media-channel-up, media-channel-down,
 volume-mute, volume-up, volume-down,
 mic-volume-mute, mic-volume-down, mic-volume-up, mic-toggle,
-bass-down, bass-boost, bass-up, treble-down, treble-up
-  */);
+bass-down, bass-boost, bass-up, treble-down, treble-up  */);
   w32_pass_multimedia_buttons_to_system = 1;
 
   DEFVAR_LISP ("x-pointer-shape", &Vx_pointer_shape,
@@ -9069,14 +9063,14 @@ Value must be an integer or float.  */);
   Vhourglass_delay = make_number (DEFAULT_HOURGLASS_DELAY);
 
   DEFVAR_LISP ("x-sensitive-text-pointer-shape",
-             &Vx_sensitive_text_pointer_shape,
+              &Vx_sensitive_text_pointer_shape,
               doc: /* The shape of the pointer when over mouse-sensitive text.
 This variable takes effect when you create a new frame
 or when you set the mouse color.  */);
   Vx_sensitive_text_pointer_shape = Qnil;
 
   DEFVAR_LISP ("x-window-horizontal-drag-cursor",
-             &Vx_window_horizontal_drag_shape,
+              &Vx_window_horizontal_drag_shape,
               doc: /* Pointer shape to use for indicating a window can be dragged horizontally.
 This variable takes effect when you create a new frame
 or when you set the mouse color.  */);
@@ -9282,7 +9276,8 @@ versions of Windows) characters.  */);
        variable initialized is 0 and directly from main when initialized
        is non zero.
  */
-void globals_of_w32fns ()
+void
+globals_of_w32fns ()
 {
   HMODULE user32_lib = GetModuleHandle ("user32.dll");
   /*
@@ -9313,7 +9308,7 @@ void globals_of_w32fns ()
 #undef abort
 
 void
-w32_abort()
+w32_abort ()
 {
   int button;
   button = MessageBox (NULL,
@@ -9341,7 +9336,7 @@ w32_abort()
 
 /* For convenience when debugging.  */
 int
-w32_last_error()
+w32_last_error ()
 {
   return GetLastError ();
 }
index 6c5f9b89f77a3535cc43210f577afd85bd139815..7ce01aa3e5030885e00f967faf094e5413ce289f 100644 (file)
@@ -782,7 +782,14 @@ sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
      variable in their environment.  */
   char ppid_env_var_buffer[64];
   char *extra_env[] = {ppid_env_var_buffer, NULL};
-  char *sepchars = " \t";
+  /* These are the characters that cause an argument to need quoting.
+     Arguments with whitespace characters need quoting to prevent the
+     argument being split into two or more. Arguments with wildcards
+     are also quoted, for consistency with posix platforms, where wildcards
+     are not expanded if we run the program directly without a shell.
+     Some extra whitespace characters need quoting in Cygwin programs,
+     so this list is conditionally modified below.  */
+  char *sepchars = " \t*?";
 
   /* We don't care about the other modes */
   if (mode != _P_NOWAIT)
index df0328ba410679328ae59237d00b8d92147c631c..75ff9f71e4a1b91f12c993a040c477de81830bac 100644 (file)
@@ -768,7 +768,6 @@ struct face;
 
 XGCValues *XCreateGC (void *, Window, unsigned long, XGCValues *);
 struct frame * check_x_frame (Lisp_Object);
-Lisp_Object vga_stdcolor_name (int);
 
 EXFUN (Fx_display_color_p, 1);
 EXFUN (Fx_display_grayscale_p, 1);
index a377ff76718da41456b9e97e139f9a9d02f4fdf7..129a553f65da1d1f9b40dde929177640dd10b208 100644 (file)
@@ -6053,8 +6053,6 @@ struct save_window_data
   {
     EMACS_UINT size;
     struct Lisp_Vector *next_from_Lisp_Vector_struct;
-    Lisp_Object frame_cols, frame_lines, frame_menu_bar_lines;
-    Lisp_Object frame_tool_bar_lines;
     Lisp_Object selected_frame;
     Lisp_Object current_window;
     Lisp_Object current_buffer;
@@ -6062,12 +6060,18 @@ struct save_window_data
     Lisp_Object minibuf_selected_window;
     Lisp_Object root_window;
     Lisp_Object focus_frame;
-    /* Record the values of window-min-width and window-min-height
-       so that window sizes remain consistent with them.  */
-    Lisp_Object min_width, min_height;
     /* A vector, each of whose elements is a struct saved_window
        for one window.  */
     Lisp_Object saved_windows;
+
+    /* All fields above are traced by the GC.
+       From `fame-cols' down, the fields are ignored by the GC.  */
+
+    int frame_cols, frame_lines, frame_menu_bar_lines;
+    int frame_tool_bar_lines;
+    /* Record the values of window-min-width and window-min-height
+       so that window sizes remain consistent with them.  */
+    int min_width, min_height;
   };
 
 /* This is saved as a Lisp_Vector  */
@@ -6207,18 +6211,20 @@ the return value is nil.  Otherwise the value is t.  */)
         if it runs during this.  */
       BLOCK_INPUT;
 
-      if (XFASTINT (data->frame_lines) != previous_frame_lines
-         || XFASTINT (data->frame_cols) != previous_frame_cols)
-       change_frame_size (f, XFASTINT (data->frame_lines),
-                          XFASTINT (data->frame_cols), 0, 0, 0);
+      if (data->frame_lines != previous_frame_lines
+         || data->frame_cols != previous_frame_cols)
+       change_frame_size (f, data->frame_lines,
+                          data->frame_cols, 0, 0, 0);
 #if defined (HAVE_WINDOW_SYSTEM) || defined (MSDOS)
-      if (XFASTINT (data->frame_menu_bar_lines)
+      if (data->frame_menu_bar_lines
          != previous_frame_menu_bar_lines)
-       x_set_menu_bar_lines (f, data->frame_menu_bar_lines, make_number (0));
+       x_set_menu_bar_lines (f, make_number (data->frame_menu_bar_lines),
+                             make_number (0));
 #ifdef HAVE_WINDOW_SYSTEM
-      if (XFASTINT (data->frame_tool_bar_lines)
+      if (data->frame_tool_bar_lines
          != previous_frame_tool_bar_lines)
-       x_set_tool_bar_lines (f, data->frame_tool_bar_lines, make_number (0));
+       x_set_tool_bar_lines (f, make_number (data->frame_tool_bar_lines),
+                             make_number (0));
 #endif
 #endif
 
@@ -6452,8 +6458,8 @@ the return value is nil.  Otherwise the value is t.  */)
     Fset_buffer (new_current_buffer);
 
   /* Restore the minimum heights recorded in the configuration.  */
-  window_min_height = XINT (data->min_height);
-  window_min_width = XINT (data->min_width);
+  window_min_height = data->min_height;
+  window_min_width = data->min_width;
 
   Vminibuf_scroll_window = data->minibuf_scroll_window;
   minibuf_selected_window = data->minibuf_selected_window;
@@ -6654,7 +6660,6 @@ redirection (see `redirect-frame-focus').  */)
   register Lisp_Object tem;
   register int n_windows;
   register struct save_window_data *data;
-  register struct Lisp_Vector *vec;
   register int i;
   FRAME_PTR f;
 
@@ -6664,14 +6669,13 @@ redirection (see `redirect-frame-focus').  */)
   f = XFRAME (frame);
 
   n_windows = count_windows (XWINDOW (FRAME_ROOT_WINDOW (f)));
-  vec = allocate_other_vector (VECSIZE (struct save_window_data));
-  XSETPVECTYPE (vec, PVEC_WINDOW_CONFIGURATION);
-  data = (struct save_window_data *)vec;
-
-  XSETFASTINT (data->frame_cols, FRAME_COLS (f));
-  XSETFASTINT (data->frame_lines, FRAME_LINES (f));
-  XSETFASTINT (data->frame_menu_bar_lines, FRAME_MENU_BAR_LINES (f));
-  XSETFASTINT (data->frame_tool_bar_lines, FRAME_TOOL_BAR_LINES (f));
+  data = ALLOCATE_PSEUDOVECTOR (struct save_window_data, frame_cols,
+                              PVEC_WINDOW_CONFIGURATION);
+
+  data->frame_cols = FRAME_COLS (f);
+  data->frame_lines = FRAME_LINES (f);
+  data->frame_menu_bar_lines = FRAME_MENU_BAR_LINES (f);
+  data->frame_tool_bar_lines = FRAME_TOOL_BAR_LINES (f);
   data->selected_frame = selected_frame;
   data->current_window = FRAME_SELECTED_WINDOW (f);
   XSETBUFFER (data->current_buffer, current_buffer);
@@ -6679,8 +6683,8 @@ redirection (see `redirect-frame-focus').  */)
   data->minibuf_selected_window = minibuf_level > 0 ? minibuf_selected_window : Qnil;
   data->root_window = FRAME_ROOT_WINDOW (f);
   data->focus_frame = FRAME_FOCUS_FRAME (f);
-  XSETINT (data->min_height, window_min_height);
-  XSETINT (data->min_width, window_min_width);
+  data->min_height = window_min_height;
+  data->min_width = window_min_width;
   tem = Fmake_vector (make_number (n_windows), Qnil);
   data->saved_windows = tem;
   for (i = 0; i < n_windows; i++)
@@ -7187,11 +7191,11 @@ compare_window_configurations (c1, c2, ignore_positions)
   sw1 = XVECTOR (d1->saved_windows);
   sw2 = XVECTOR (d2->saved_windows);
 
-  if (! EQ (d1->frame_cols, d2->frame_cols))
+  if (d1->frame_cols != d2->frame_cols)
     return 0;
-  if (! EQ (d1->frame_lines, d2->frame_lines))
+  if (d1->frame_lines != d2->frame_lines)
     return 0;
-  if (! EQ (d1->frame_menu_bar_lines, d2->frame_menu_bar_lines))
+  if (d1->frame_menu_bar_lines != d2->frame_menu_bar_lines)
     return 0;
   if (! EQ (d1->selected_frame, d2->selected_frame))
     return 0;
@@ -7213,9 +7217,9 @@ compare_window_configurations (c1, c2, ignore_positions)
      if everything else compares equal.  */
   if (! EQ (d1->focus_frame, d2->focus_frame))
     return 0;
-  if (! EQ (d1->min_width, d2->min_width))
+  if (d1->min_width != d2->min_width)
     return 0;
-  if (! EQ (d1->min_height, d2->min_height))
+  if (d1->min_height != d2->min_height)
     return 0;
 
   /* Verify that the two confis have the same number of windows.  */
index 9c79684e43824948d175e257d2abc5ad758ed1d2..fbf7569583adc6fd8042b906cfac5dc50781b378 100644 (file)
@@ -24494,8 +24494,12 @@ If you want scrolling to always be a line at a time, you should set
 
   DEFVAR_INT ("scroll-conservatively", &scroll_conservatively,
     doc: /* *Scroll up to this many lines, to bring point back on screen.
-A value of zero means to scroll the text to center point vertically
-in the window.  */);
+If point moves off-screen, redisplay will scroll by up to
+`scroll-conservatively' lines in order to bring point just barely
+onto the screen again.   If that cannot be done, then redisplay
+recenters point as usual.
+
+A value of zero means always recenter point if it moves off screen.  */);
   scroll_conservatively = 0;
 
   DEFVAR_INT ("scroll-margin", &scroll_margin,
index f43054fe06ad2be606515a51df8c463bc6c04415..853a3867f63898c545513f0906902f89f84dd063 100644 (file)
@@ -1474,10 +1474,6 @@ tty_color_name (f, idx)
   if (idx == FACE_TTY_DEFAULT_BG_COLOR)
     return build_string (unspecified_bg);
 
-#ifdef WINDOWSNT
-  return vga_stdcolor_name (idx);
-#endif
-
   return Qunspecified;
 }
 
@@ -7948,13 +7944,11 @@ map_tty_color (f, face, idx, defaulted)
     {
       pixel = load_color (f, face, color, idx);
 
-#if defined (MSDOS) || defined (WINDOWSNT)
+#ifdef MSDOS
       /* If the foreground of the default face is the default color,
         use the foreground color defined by the frame.  */
-#ifdef MSDOS
       if (FRAME_MSDOS_P (f))
        {
-#endif /* MSDOS */
          if (pixel == default_pixel
              || pixel == FACE_TTY_DEFAULT_COLOR)
            {
@@ -7974,10 +7968,8 @@ map_tty_color (f, face, idx, defaulted)
              face->lface[idx] = tty_color_name (f, pixel);
              *defaulted = 1;
            }
-#ifdef MSDOS
-       }
-#endif
-#endif /* MSDOS or WINDOWSNT */
+        }
+#endif /* MSDOS */
     }
 
   if (foreground_p)
index 95efa697110d34b09d7f5859778fa56e63f4d650..8239fc3475c2f9db0f17b6caf022163969f238de 100644 (file)
@@ -938,7 +938,7 @@ x_set_background_color (f, arg, oldval)
             !NILP (bar);
             bar = XSCROLL_BAR (bar)->next)
          {
-           Window window = SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar));
+           Window window = XSCROLL_BAR (bar)->x_window;
            XSetWindowBackground (dpy, window, bg);
          }
       }
@@ -3205,7 +3205,7 @@ x_default_font_parameter (f, parms)
 DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
        1, 1, 0,
        doc: /* Make a new X window, which is called a "frame" in Emacs terms.
-Returns an Emacs frame object.
+Return an Emacs frame object.
 ALIST is an alist of frame parameters.
 If the parameters specify that the frame should not have a minibuffer,
 and do not specify a specific minibuffer window to use,
@@ -3798,7 +3798,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
        0, 1, 0,
-       doc: /* Returns the width in pixels of the X display TERMINAL.
+       doc: /* Return the width in pixels of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3812,7 +3812,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-pixel-height", Fx_display_pixel_height,
        Sx_display_pixel_height, 0, 1, 0,
-       doc: /* Returns the height in pixels of the X display TERMINAL.
+       doc: /* Return the height in pixels of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3826,7 +3826,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-planes", Fx_display_planes, Sx_display_planes,
        0, 1, 0,
-       doc: /* Returns the number of bitplanes of the X display TERMINAL.
+       doc: /* Return the number of bitplanes of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3840,7 +3840,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-color-cells", Fx_display_color_cells, Sx_display_color_cells,
        0, 1, 0,
-       doc: /* Returns the number of color cells of the X display TERMINAL.
+       doc: /* Return the number of color cells of the X display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3865,7 +3865,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 DEFUN ("x-server-max-request-size", Fx_server_max_request_size,
        Sx_server_max_request_size,
        0, 1, 0,
-       doc: /* Returns the maximum request size of the X server of display TERMINAL.
+       doc: /* Return the maximum request size of the X server of display TERMINAL.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
@@ -3878,7 +3878,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-server-vendor", Fx_server_vendor, Sx_server_vendor, 0, 1, 0,
-       doc: /* Returns the "vendor ID" string of the X server of display TERMINAL.
+       doc: /* Return the "vendor ID" string of the X server of display TERMINAL.
 \(Labelling every distributor as a "vendor" embodies the false assumption
 that operating systems cannot be developed and distributed noncommercially.)
 The optional argument TERMINAL specifies which display to ask about.
@@ -3895,7 +3895,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 }
 
 DEFUN ("x-server-version", Fx_server_version, Sx_server_version, 0, 1, 0,
-       doc: /* Returns the version numbers of the X server of display TERMINAL.
+       doc: /* Return the version numbers of the X server of display TERMINAL.
 The value is a list of three integers: the major and minor
 version numbers of the X Protocol in use, and the distributor-specific release
 number.  See also the function `x-server-vendor'.
@@ -3955,7 +3955,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-backing-store", Fx_display_backing_store,
        Sx_display_backing_store, 0, 1, 0,
-       doc: /* Returns an indication of whether X display TERMINAL does backing store.
+       doc: /* Return an indication of whether X display TERMINAL does backing store.
 The value may be `always', `when-mapped', or `not-useful'.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
@@ -4033,7 +4033,7 @@ If omitted or nil, that stands for the selected frame's display.  */)
 
 DEFUN ("x-display-save-under", Fx_display_save_under,
        Sx_display_save_under, 0, 1, 0,
-       doc: /* Returns t if the X display TERMINAL supports the save-under feature.
+       doc: /* Return t if the X display TERMINAL supports the save-under feature.
 The optional argument TERMINAL specifies which display to ask about.
 TERMINAL should be a terminal id, a frame or a display name (a string).
 If omitted or nil, that stands for the selected frame's display.  */)
index 55185fb57f2b588355874c6ae3cb960a0b3ed883..023d0194c59bd9fd9fd51fdd073c3c2996b744cd 100644 (file)
@@ -4209,7 +4209,7 @@ x_window_to_scroll_bar (display, window_id)
                               condemned = Qnil,
                               ! NILP (bar));
           bar = XSCROLL_BAR (bar)->next)
-       if (SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)) == window_id &&
+       if (XSCROLL_BAR (bar)->x_window == window_id &&
             FRAME_X_DISPLAY (XFRAME (frame)) == display)
          return XSCROLL_BAR (bar);
     }
@@ -4525,9 +4525,8 @@ xm_scroll_callback (widget, client_data, call_data)
     }
 }
 
+#elif defined USE_GTK
 
-#else /* !USE_MOTIF, i.e. Xaw or GTK */
-#ifdef USE_GTK
 /* Scroll bar callback for GTK scroll bars.  WIDGET is the scroll
    bar widget.  DATA is a pointer to the scroll_bar structure. */
 
@@ -4598,7 +4597,7 @@ xg_scroll_callback (widget, data)
     }
 }
 
-#else /* not USE_GTK */
+#else /* not USE_GTK and not USE_MOTIF */
 
 /* Xaw scroll bar callback.  Invoked when the thumb is dragged.
    WIDGET is the scroll bar widget.  CLIENT_DATA is a pointer to the
@@ -4681,8 +4680,7 @@ xaw_scroll_callback (widget, client_data, call_data)
   x_send_scroll_bar_event (bar->window, part, position, height);
 }
 
-#endif /* not USE_GTK */
-#endif /* not USE_MOTIF */
+#endif /* not USE_GTK and not USE_MOTIF */
 
 #define SCROLL_BAR_NAME "verticalScrollBar"
 
@@ -4888,7 +4886,7 @@ x_create_toolkit_scroll_bar (f, bar)
   /* Remember X window and widget in the scroll bar vector.  */
   SET_SCROLL_BAR_X_WIDGET (bar, widget);
   xwindow = XtWindow (widget);
-  SET_SCROLL_BAR_X_WINDOW (bar, xwindow);
+  bar->x_window = xwindow;
 
   UNBLOCK_INPUT;
 }
@@ -5032,7 +5030,7 @@ x_scroll_bar_create (w, top, left, width, height)
 {
   struct frame *f = XFRAME (w->frame);
   struct scroll_bar *bar
-    = XSCROLL_BAR (Fmake_vector (make_number (SCROLL_BAR_VEC_SIZE), Qnil));
+    = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, x_window, PVEC_OTHER);
 
   BLOCK_INPUT;
 
@@ -5076,21 +5074,19 @@ x_scroll_bar_create (w, top, left, width, height)
                            CopyFromParent,
                             /* Attributes.  */
                            mask, &a);
-    SET_SCROLL_BAR_X_WINDOW (bar, window);
+    bar->x_window = window;
   }
 #endif /* not USE_TOOLKIT_SCROLL_BARS */
 
   XSETWINDOW (bar->window, w);
-  XSETINT (bar->top, top);
-  XSETINT (bar->left, left);
-  XSETINT (bar->width, width);
-  XSETINT (bar->height, height);
-  XSETINT (bar->start, 0);
-  XSETINT (bar->end, 0);
+  bar->top = top;
+  bar->left = left;
+  bar->width = width;
+  bar->height = height;
+  bar->start = 0;
+  bar->end = 0;
   bar->dragging = Qnil;
-#ifdef USE_TOOLKIT_SCROLL_BARS
-  bar->fringe_extended_p = Qnil;
-#endif
+  bar->fringe_extended_p = 0;
 
   /* Add bar to its frame's list of scroll bars.  */
   bar->next = FRAME_SCROLL_BARS (f);
@@ -5104,12 +5100,12 @@ x_scroll_bar_create (w, top, left, width, height)
   {
 #ifdef USE_GTK
     xg_update_scrollbar_pos (f,
-                             SCROLL_BAR_X_WINDOW (bar),
+                             bar->x_window,
                              top,
                              left + VERTICAL_SCROLL_BAR_WIDTH_TRIM,
                              width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2,
                              max (height, 1));
-    xg_show_scroll_bar (SCROLL_BAR_X_WINDOW (bar));
+    xg_show_scroll_bar (bar->x_window);
 #else /* not USE_GTK */
     Widget scroll_bar = SCROLL_BAR_X_WIDGET (FRAME_X_DISPLAY (f), bar);
     XtConfigureWidget (scroll_bar,
@@ -5121,7 +5117,7 @@ x_scroll_bar_create (w, top, left, width, height)
 #endif /* not USE_GTK */
     }
 #else /* not USE_TOOLKIT_SCROLL_BARS */
-  XMapRaised (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (bar));
+  XMapRaised (FRAME_X_DISPLAY (f), bar->x_window);
 #endif /* not USE_TOOLKIT_SCROLL_BARS */
 
   UNBLOCK_INPUT;
@@ -5129,6 +5125,8 @@ x_scroll_bar_create (w, top, left, width, height)
 }
 
 
+#ifndef USE_TOOLKIT_SCROLL_BARS
+
 /* Draw BAR's handle in the proper position.
 
    If the handle is already drawn from START to END, don't bother
@@ -5142,8 +5140,6 @@ x_scroll_bar_create (w, top, left, width, height)
    the bar's top is as far down as it goes; otherwise, there's no way
    to move to the very end of the buffer.  */
 
-#ifndef USE_TOOLKIT_SCROLL_BARS
-
 static void
 x_scroll_bar_set_handle (bar, start, end, rebuild)
      struct scroll_bar *bar;
@@ -5151,22 +5147,22 @@ x_scroll_bar_set_handle (bar, start, end, rebuild)
      int rebuild;
 {
   int dragging = ! NILP (bar->dragging);
-  Window w = SCROLL_BAR_X_WINDOW (bar);
+  Window w = bar->x_window;
   FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
   GC gc = f->output_data.x->normal_gc;
 
   /* If the display is already accurate, do nothing.  */
   if (! rebuild
-      && start == XINT (bar->start)
-      && end == XINT (bar->end))
+      && start == bar->start
+      && end == bar->end)
     return;
 
   BLOCK_INPUT;
 
   {
-    int inside_width = VERTICAL_SCROLL_BAR_INSIDE_WIDTH (f, XINT (bar->width));
-    int inside_height = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, XINT (bar->height));
-    int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height));
+    int inside_width = VERTICAL_SCROLL_BAR_INSIDE_WIDTH (f, bar->width);
+    int inside_height = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, bar->height);
+    int top_range = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
 
     /* Make sure the values are reasonable, and try to preserve
        the distance between start and end.  */
@@ -5186,8 +5182,8 @@ x_scroll_bar_set_handle (bar, start, end, rebuild)
     }
 
     /* Store the adjusted setting in the scroll bar.  */
-    XSETINT (bar->start, start);
-    XSETINT (bar->end, end);
+    bar->start = start;
+    bar->end = end;
 
     /* Clip the end position, just for display.  */
     if (end > top_range)
@@ -5254,12 +5250,12 @@ x_scroll_bar_remove (bar)
 
 #ifdef USE_TOOLKIT_SCROLL_BARS
 #ifdef USE_GTK
-  xg_remove_scroll_bar (f, SCROLL_BAR_X_WINDOW (bar));
+  xg_remove_scroll_bar (f, bar->x_window);
 #else /* not USE_GTK */
   XtDestroyWidget (SCROLL_BAR_X_WIDGET (FRAME_X_DISPLAY (f), bar));
 #endif /* not USE_GTK */
 #else
-  XDestroyWindow (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (bar));
+  XDestroyWindow (FRAME_X_DISPLAY (f), bar->x_window);
 #endif
 
   /* Disassociate this scroll bar from its window.  */
@@ -5357,19 +5353,19 @@ XTset_vertical_scroll_bar (w, portion, whole, position)
 
       BLOCK_INPUT;
 
-      if (sb_left != XINT (bar->left))
+      if (sb_left != bar->left)
        mask |= CWX;
-      if (top != XINT (bar->top))
+      if (top != bar->top)
        mask |= CWY;
-      if (sb_width != XINT (bar->width))
+      if (sb_width != bar->width)
        mask |= CWWidth;
-      if (height != XINT (bar->height))
+      if (height != bar->height)
        mask |= CWHeight;
 
 #ifdef USE_TOOLKIT_SCROLL_BARS
 
       /* Move/size the scroll bar widget.  */
-      if (mask || !NILP (bar->fringe_extended_p) != fringe_extended_p)
+      if (mask || bar->fringe_extended_p != fringe_extended_p)
        {
          /* Since toolkit scroll bars are smaller than the space reserved
             for them on the frame, we have to clear "under" them.  */
@@ -5384,7 +5380,7 @@ XTset_vertical_scroll_bar (w, portion, whole, position)
            }
 #ifdef USE_GTK
           xg_update_scrollbar_pos (f,
-                                   SCROLL_BAR_X_WINDOW (bar),
+                                   bar->x_window,
                                    top,
                                    sb_left + VERTICAL_SCROLL_BAR_WIDTH_TRIM,
                                    sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM *2,
@@ -5440,23 +5436,23 @@ XTset_vertical_scroll_bar (w, portion, whole, position)
          wc.y = top;
          wc.width = sb_width - VERTICAL_SCROLL_BAR_WIDTH_TRIM * 2;
          wc.height = height;
-         XConfigureWindow (FRAME_X_DISPLAY (f), SCROLL_BAR_X_WINDOW (bar),
+         XConfigureWindow (FRAME_X_DISPLAY (f), bar->x_window,
                            mask, &wc);
        }
 
 #endif /* not USE_TOOLKIT_SCROLL_BARS */
 
       /* Remember new settings.  */
-      XSETINT (bar->left, sb_left);
-      XSETINT (bar->top, top);
-      XSETINT (bar->width, sb_width);
-      XSETINT (bar->height, height);
+      bar->left = sb_left;
+      bar->top = top;
+      bar->width = sb_width;
+      bar->height = height;
 
       UNBLOCK_INPUT;
     }
 
 #ifdef USE_TOOLKIT_SCROLL_BARS
-  bar->fringe_extended_p = fringe_extended_p ? Qt : Qnil;
+  bar->fringe_extended_p = fringe_extended_p;
 
   x_set_toolkit_scroll_bar_thumb (bar, portion, position, whole);
 #else /* not USE_TOOLKIT_SCROLL_BARS */
@@ -5600,14 +5596,14 @@ x_scroll_bar_expose (bar, event)
      struct scroll_bar *bar;
      XEvent *event;
 {
-  Window w = SCROLL_BAR_X_WINDOW (bar);
+  Window w = bar->x_window;
   FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
   GC gc = f->output_data.x->normal_gc;
   int width_trim = VERTICAL_SCROLL_BAR_WIDTH_TRIM;
 
   BLOCK_INPUT;
 
-  x_scroll_bar_set_handle (bar, XINT (bar->start), XINT (bar->end), 1);
+  x_scroll_bar_set_handle (bar, bar->start, bar->end, 1);
 
   /* Switch to scroll bar foreground color.  */
   if (f->output_data.x->scroll_bar_foreground_pixel != -1)
@@ -5619,8 +5615,8 @@ x_scroll_bar_expose (bar, event)
 
                  /* x, y, width, height */
                  0, 0,
-                 XINT (bar->width) - 1 - width_trim - width_trim,
-                 XINT (bar->height) - 1);
+                 bar->width - 1 - width_trim - width_trim,
+                 bar->height - 1);
 
    /* Restore the foreground color of the GC if we changed it above.  */
    if (f->output_data.x->scroll_bar_foreground_pixel != -1)
@@ -5664,18 +5660,18 @@ x_scroll_bar_handle_click (bar, event, emacs_event)
 #if 0
     FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
     int internal_height
-      = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, XINT (bar->height));
+      = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, bar->height);
 #endif
     int top_range
-      = VERTICAL_SCROLL_BAR_TOP_RANGE (f, XINT (bar->height));
+      = VERTICAL_SCROLL_BAR_TOP_RANGE (f, bar->height);
     int y = event->xbutton.y - VERTICAL_SCROLL_BAR_TOP_BORDER;
 
     if (y < 0) y = 0;
     if (y > top_range) y = top_range;
 
-    if (y < XINT (bar->start))
+    if (y < bar->start)
       emacs_event->part = scroll_bar_above_handle;
-    else if (y < XINT (bar->end) + VERTICAL_SCROLL_BAR_MIN_HANDLE)
+    else if (y < bar->end + VERTICAL_SCROLL_BAR_MIN_HANDLE)
       emacs_event->part = scroll_bar_handle;
     else
       emacs_event->part = scroll_bar_below_handle;
@@ -5688,7 +5684,7 @@ x_scroll_bar_handle_click (bar, event, emacs_event)
        holding it.  */
     if (event->type == ButtonPress
        && emacs_event->part == scroll_bar_handle)
-      XSETINT (bar->dragging, y - XINT (bar->start));
+      XSETINT (bar->dragging, y - bar->start);
 #endif
 
 #ifndef USE_TOOLKIT_SCROLL_BARS
@@ -5697,7 +5693,7 @@ x_scroll_bar_handle_click (bar, event, emacs_event)
        && ! NILP (bar->dragging))
       {
        int new_start = y - XINT (bar->dragging);
-       int new_end = new_start + (XINT (bar->end) - XINT (bar->start));
+       int new_end = new_start + bar->end - bar->start;
 
        x_scroll_bar_set_handle (bar, new_start, new_end, 0);
        bar->dragging = Qnil;
@@ -5745,9 +5741,9 @@ x_scroll_bar_note_movement (bar, event)
       /* Where should the handle be now?  */
       int new_start = event->xmotion.y - XINT (bar->dragging);
 
-      if (new_start != XINT (bar->start))
+      if (new_start != bar->start)
        {
-         int new_end = new_start + (XINT (bar->end) - XINT (bar->start));
+         int new_end = new_start + bar->end - bar->start;
 
          x_scroll_bar_set_handle (bar, new_start, new_end, 0);
        }
@@ -5768,7 +5764,7 @@ x_scroll_bar_report_motion (fp, bar_window, part, x, y, time)
      unsigned long *time;
 {
   struct scroll_bar *bar = XSCROLL_BAR (last_mouse_scroll_bar);
-  Window w = SCROLL_BAR_X_WINDOW (bar);
+  Window w = bar->x_window;
   FRAME_PTR f = XFRAME (WINDOW_FRAME (XWINDOW (bar->window)));
   int win_x, win_y;
   Window dummy_window;
@@ -5795,10 +5791,10 @@ x_scroll_bar_report_motion (fp, bar_window, part, x, y, time)
     {
 #if 0
       int inside_height
-       = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, XINT (bar->height));
+       = VERTICAL_SCROLL_BAR_INSIDE_HEIGHT (f, bar->height);
 #endif
       int top_range
-       = VERTICAL_SCROLL_BAR_TOP_RANGE     (f, XINT (bar->height));
+       = VERTICAL_SCROLL_BAR_TOP_RANGE     (f, bar->height);
 
       win_y -= VERTICAL_SCROLL_BAR_TOP_BORDER;
 
@@ -5815,9 +5811,9 @@ x_scroll_bar_report_motion (fp, bar_window, part, x, y, time)
 
       if (! NILP (bar->dragging))
        *part = scroll_bar_handle;
-      else if (win_y < XINT (bar->start))
+      else if (win_y < bar->start)
        *part = scroll_bar_above_handle;
-      else if (win_y < XINT (bar->end) + VERTICAL_SCROLL_BAR_MIN_HANDLE)
+      else if (win_y < bar->end + VERTICAL_SCROLL_BAR_MIN_HANDLE)
        *part = scroll_bar_handle;
       else
        *part = scroll_bar_below_handle;
@@ -5854,7 +5850,7 @@ x_scroll_bar_clear (f)
     for (bar = FRAME_SCROLL_BARS (f); VECTORP (bar);
         bar = XSCROLL_BAR (bar)->next)
       XClearArea (FRAME_X_DISPLAY (f),
-                 SCROLL_BAR_X_WINDOW (XSCROLL_BAR (bar)),
+                 XSCROLL_BAR (bar)->x_window,
                  0, 0, 0, 0, True);
 #endif /* not USE_TOOLKIT_SCROLL_BARS */
 }
@@ -7065,12 +7061,10 @@ handle_one_xevent (dpyinfo, eventp, finish, hold_quit)
 
                 if (tool_bar_p && event.xbutton.button < 4)
                   {
-                    if (event.xbutton.type == ButtonPress)
-                      handle_tool_bar_click (f, x, y, 1, 0);
-                    else
-                      handle_tool_bar_click (f, x, y, 0,
-                                             x_x_to_emacs_modifiers (dpyinfo,
-                                                                    event.xbutton.state));
+                   handle_tool_bar_click (f, x, y,
+                                          event.xbutton.type == ButtonPress,
+                                          x_x_to_emacs_modifiers (dpyinfo,
+                                                                  event.xbutton.state));
                   }
               }
 
@@ -8072,7 +8066,7 @@ x_connection_closed (dpy, error_message)
 
      Closing the display is reported to lead to a bus error on
      OpenWindows in certain situations.  I suspect that is a bug
-     in OpenWindows.  I don't know how to cicumvent it here.  */
+     in OpenWindows.  I don't know how to circumvent it here.  */
 
 #ifdef USE_X_TOOLKIT
   /* If DPYINFO is null, this means we didn't open the display
@@ -8123,6 +8117,10 @@ x_connection_closed (dpy, error_message)
 
   unbind_to (index, Qnil);
   clear_waiting_for_input ();
+  /* FIXME: This is an asynchronous interrupt w.r.t elisp, so signalling an
+     error might not be the best thing to do.  I'd vote for creating an
+     elisp event and stuffing it in the queue so people can bind to it via
+     the global map.  --Stef  */
   error ("%s", error_msg);
 }
 
@@ -8726,7 +8724,7 @@ x_set_offset (f, xoff, yoff, change_gravity)
    on the root window for frame F contains ATOMNAME.
    This is how a WM check shall be done according to the Window Manager
    Specification/Extended Window Manager Hints at
-   http://freedesktop.org/wiki/Standards_2fwm_2dspec.  */
+   http://freedesktop.org/wiki/Specifications/wm-spec.  */
 
 static int
 wm_supports (f, atomname)
@@ -9259,7 +9257,7 @@ x_ewmh_activate_frame (f)
      FRAME_PTR f;
 {
   /* See Window Manager Specification/Extended Window Manager Hints at
-     http://freedesktop.org/wiki/Standards_2fwm_2dspec  */
+     http://freedesktop.org/wiki/Specifications/wm-spec  */
 
   const char *atom = "_NET_ACTIVE_WINDOW";
   if (f->async_visible && wm_supports (f, atom))
@@ -11329,8 +11327,8 @@ x_term_init (display_name, xrm_option, resource_name)
     /* Mac OS X 10.3's Xserver sometimes reports 0.0mm.  */
     dpyinfo->resy = (mm < 1) ? 100 : pixels * 25.4 / mm;
     pixels = DisplayWidth (dpyinfo->display, screen_number);
-    /* Mac OS X 10.3's Xserver sometimes reports 0.0mm.  */
     mm = DisplayWidthMM (dpyinfo->display, screen_number);
+    /* Mac OS X 10.3's Xserver sometimes reports 0.0mm.  */
     dpyinfo->resx = (mm < 1) ? 100 : pixels * 25.4 / mm;
   }
 
@@ -11499,13 +11497,13 @@ x_term_init (display_name, xrm_option, resource_name)
                                    Qnil, Qnil);
 #ifdef USE_XIM
     if (STRINGP (value)
-       && (!strcmp (XSTRING (value)->data, "false")
-           || !strcmp (XSTRING (value)->data, "off")))
+       && (!strcmp (SDATA (value), "false")
+           || !strcmp (SDATA (value), "off")))
       use_xim = 0;
 #else
     if (STRINGP (value)
-       && (!strcmp (XSTRING (value)->data, "true")
-           || !strcmp (XSTRING (value)->data, "on")))
+       && (!strcmp (SDATA (value), "true")
+           || !strcmp (SDATA (value), "on")))
       use_xim = 1;
 #endif
   }
index 40cbf695d388877313ab68ee7d42a89669d2bb46..25b04fe75fa8e23093fe59f7fd8d4b5313cf491a 100644 (file)
@@ -757,13 +757,14 @@ struct scroll_bar
   /* The next and previous in the chain of scroll bars in this frame.  */
   Lisp_Object next, prev;
 
-  /* The X window representing this scroll bar.  Since this is a full
-     32-bit quantity, we store it split into two 32-bit values.  */
-  Lisp_Object x_window_low, x_window_high;
+  /* Fields from `x_window' down will not be traced by the GC.  */
+
+  /* The X window representing this scroll bar.  */
+  Window x_window;
 
   /* The position and size of the scroll bar in pixels, relative to the
      frame.  */
-  Lisp_Object top, left, width, height;
+  int top, left, width, height;
 
   /* The starting and ending positions of the handle, relative to the
      handle area (i.e. zero is the top position, not
@@ -776,7 +777,7 @@ struct scroll_bar
      drawing handle bottoms VERTICAL_SCROLL_BAR_MIN_HANDLE pixels below
      where they would be normally; the bottom and top are in a
      different co-ordinate system.  */
-  Lisp_Object start, end;
+  int start, end;
 
   /* If the scroll bar handle is currently being dragged by the user,
      this is the number of pixels from the top of the handle to the
@@ -784,11 +785,9 @@ struct scroll_bar
      being dragged, this is Qnil.  */
   Lisp_Object dragging;
 
-#ifdef USE_TOOLKIT_SCROLL_BARS
-  /* t if the background of the fringe that is adjacent to a scroll
+  /* 1 if the background of the fringe that is adjacent to a scroll
      bar is extended to the gap between the fringe and the bar.  */
-  Lisp_Object fringe_extended_p;
-#endif
+  unsigned int fringe_extended_p : 1;
 };
 
 /* The number of elements a vector holding a struct scroll_bar needs.  */
@@ -801,36 +800,19 @@ struct scroll_bar
 #define XSCROLL_BAR(vec) ((struct scroll_bar *) XVECTOR (vec))
 
 
-/* Building a 32-bit C integer from two 16-bit lisp integers.  */
-#define SCROLL_BAR_PACK(low, high) (XINT (high) << 16 | XINT (low))
-
-/* Setting two lisp integers to the low and high words of a 32-bit C int.  */
-#define SCROLL_BAR_UNPACK(low, high, int32) \
-  (XSETINT ((low),   (int32)        & 0xffff), \
-   XSETINT ((high), ((int32) >> 16) & 0xffff))
-
-
-/* Extract the X window id of the scroll bar from a struct scroll_bar.  */
-#define SCROLL_BAR_X_WINDOW(ptr) \
-  ((Window) SCROLL_BAR_PACK ((ptr)->x_window_low, (ptr)->x_window_high))
-
-/* Store a window id in a struct scroll_bar.  */
-#define SET_SCROLL_BAR_X_WINDOW(ptr, id) \
-  (SCROLL_BAR_UNPACK ((ptr)->x_window_low, (ptr)->x_window_high, (int) id))
-
 /* Extract the X widget of the scroll bar from a struct scroll_bar.
    XtWindowToWidget should be fast enough since Xt uses a hash table
    to map windows to widgets.  */
 
 #define SCROLL_BAR_X_WIDGET(dpy, ptr) \
-  XtWindowToWidget (dpy, SCROLL_BAR_X_WINDOW (ptr))
+  XtWindowToWidget (dpy, ptr->x_window)
 
 /* Store a widget id in a struct scroll_bar.  */
 
 #define SET_SCROLL_BAR_X_WIDGET(ptr, w)                \
   do {                                         \
     Window window = XtWindow (w);              \
-    SET_SCROLL_BAR_X_WINDOW (ptr, window);     \
+    ptr->x_window = window;                    \
 } while (0)
 
 
index c1d44cab9b931440ddf2780bb0c02703b20d1b10..1d9cc68812c1e3db53e4d23e8b40d414ad5f6798 100755 (executable)
@@ -37,17 +37,16 @@ done
 if [ "x$subdirs" = x ]; then
   rm -f subdirs.el
 else
-
-  echo ";; -*- no-byte-compile: t -*-" > subdirs.el
-
-  echo ";; In load-path, after this directory should come
-;; certain of its subdirectories.  Here we specify them." >> subdirs.el
-
-  echo "(normal-top-level-add-to-load-path '($subdirs))
+  rm -f subdirs.el~
+  echo ";; -*- no-byte-compile: t -*-
+;; In load-path, after this directory should come
+;; certain of its subdirectories.  Here we specify them.
+(normal-top-level-add-to-load-path '($subdirs))
 ;; Local" "Variables:
 ;; version-control: never
 ;; no-byte-compile: t
-;; End:" >> subdirs.el
+;; End:" > subdirs.el~
+  mv subdirs.el~ subdirs.el
 fi
 
 # arch-tag: 56ebcf1b-5c30-4934-b0b4-72d374064704