summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatteo F. Vescovi <mfv@debian.org>2016-11-06 14:36:13 +0100
committerMatteo F. Vescovi <mfv@debian.org>2016-11-06 14:36:13 +0100
commit9076980b03c8423f6d1d92982bcc732c81c4a789 (patch)
treece95cb405ad8191133b3492956bf3e0fd4c42f58
parent8e7ca604077584e6c2b1e079844306a9f4ce321b (diff)
Import Upstream version 0.7.90
-rw-r--r--AUTHORS8
-rw-r--r--Makefile.am61
-rw-r--r--Makefile.in993
-rw-r--r--NEWS46
-rw-r--r--README56
-rw-r--r--aclocal.m4641
-rw-r--r--compat/hex-util.el75
-rw-r--r--compat/sha1.el442
-rwxr-xr-xconfigure3592
-rw-r--r--configure.ac15
-rwxr-xr-xelisp-comp89
-rw-r--r--fsm.el203
-rw-r--r--html/Account-settings.html69
-rw-r--r--html/Ad_002dHoc-Commands.html77
-rw-r--r--html/Autoaway.html72
-rw-r--r--html/Automation.html56
-rw-r--r--html/Avatars.html61
-rw-r--r--html/Basic-operation.html61
-rw-r--r--html/Chat-printers.html67
-rw-r--r--html/Chatting.html66
-rw-r--r--html/Composing-messages.html55
-rw-r--r--html/Concept-index.html153
-rw-r--r--html/Connecting.html81
-rw-r--r--html/Connection-settings.html74
-rw-r--r--html/Contact.html50
-rw-r--r--html/Customization.html60
-rw-r--r--html/Customizing-alerts.html96
-rw-r--r--html/Customizing-the-chat-buffer.html96
-rw-r--r--html/Customizing-the-roster-buffer.html89
-rw-r--r--html/Debug-options.html51
-rw-r--r--html/Extending-service-discovery.html71
-rw-r--r--html/File-transfer.html69
-rw-r--r--html/Function-index.html104
-rw-r--r--html/Groupchat.html91
-rw-r--r--html/Hacking-and-extending.html59
-rw-r--r--html/Hooks.html68
-rw-r--r--html/Info-alerts.html53
-rw-r--r--html/Introduction.html63
-rw-r--r--html/Invitations.html57
-rw-r--r--html/Keepalive.html64
-rw-r--r--html/Listening-for-new-requests.html67
-rw-r--r--html/MUC-Administration.html91
-rw-r--r--html/MUC-alerts.html68
-rw-r--r--html/Message-alerts.html79
-rw-r--r--html/Message-events.html71
-rw-r--r--html/Message-history.html83
-rw-r--r--html/Miscellaneous-settings.html52
-rw-r--r--html/Modeline-status.html58
-rw-r--r--html/Personal-information.html60
-rw-r--r--html/Presence-alerts.html69
-rw-r--r--html/Presence-subscription.html63
-rw-r--r--html/Presence.html91
-rw-r--r--html/Private-messages.html57
-rw-r--r--html/Protocol-support.html77
-rw-r--r--html/RFC-3920.html60
-rw-r--r--html/RFC-3921.html58
-rw-r--r--html/Receiving-files.html67
-rw-r--r--html/Registering.html78
-rw-r--r--html/Roster-buffer.html77
-rw-r--r--html/Roster-import-and-export.html62
-rw-r--r--html/Roster-structure.html81
-rw-r--r--html/Searching.html59
-rw-r--r--html/Sending-files.html82
-rw-r--r--html/Sending-new-requests.html86
-rw-r--r--html/Service-discovery-and-browsing.html68
-rw-r--r--html/Services.html63
-rw-r--r--html/Spell-checking.html51
-rw-r--r--html/Standard-alerts.html101
-rw-r--r--html/Stanza-chains.html52
-rw-r--r--html/Time-queries.html56
-rw-r--r--html/Tracking-activity.html77
-rw-r--r--html/Useful-features.html56
-rw-r--r--html/Variable-index.html132
-rw-r--r--html/Watch-buddies.html57
-rw-r--r--html/XEP_002d0004.html61
-rw-r--r--html/XEP_002d0012.html48
-rw-r--r--html/XEP_002d0020.html47
-rw-r--r--html/XEP_002d0022.html50
-rw-r--r--html/XEP_002d0030.html48
-rw-r--r--html/XEP_002d0045.html51
-rw-r--r--html/XEP_002d0049.html48
-rw-r--r--html/XEP_002d0050.html49
-rw-r--r--html/XEP_002d0054.html49
-rw-r--r--html/XEP_002d0055.html50
-rw-r--r--html/XEP_002d0065.html54
-rw-r--r--html/XEP_002d0066.html50
-rw-r--r--html/XEP_002d0068.html48
-rw-r--r--html/XEP_002d0077.html54
-rw-r--r--html/XEP_002d0078.html49
-rw-r--r--html/XEP_002d0082.html48
-rw-r--r--html/XEP_002d0086.html48
-rw-r--r--html/XEP_002d0090.html48
-rw-r--r--html/XEP_002d0091.html48
-rw-r--r--html/XEP_002d0092.html49
-rw-r--r--html/XEP_002d0095.html49
-rw-r--r--html/XEP_002d0096.html51
-rw-r--r--html/XEP_002d0146.html47
-rw-r--r--html/XEP_002d0153.html46
-rw-r--r--html/XML-representation.html71
-rw-r--r--html/XMPP-URIs.html84
-rw-r--r--html/index.html201
-rwxr-xr-xinstall-sh291
-rw-r--r--jabber-activity.el73
-rw-r--r--jabber-ahc-presence.el6
-rw-r--r--jabber-ahc.el49
-rw-r--r--jabber-alert.el44
-rw-r--r--jabber-autoaway.el24
-rw-r--r--jabber-autoloads.el232
-rw-r--r--jabber-avatar.el32
-rw-r--r--jabber-bookmarks.el231
-rw-r--r--jabber-browse.el12
-rw-r--r--jabber-chat.el170
-rw-r--r--jabber-chatbuffer.el31
-rw-r--r--jabber-chatstates.el174
-rw-r--r--jabber-compose.el10
-rw-r--r--jabber-conn.el220
-rw-r--r--jabber-core.el996
-rw-r--r--jabber-disco.el34
-rw-r--r--jabber-events.el11
-rw-r--r--jabber-export.el41
-rw-r--r--jabber-festival.el2
-rw-r--r--jabber-ft-client.el9
-rw-r--r--jabber-ft-server.el29
-rw-r--r--jabber-gmail.el98
-rw-r--r--jabber-history.el66
-rw-r--r--jabber-iq.el79
-rw-r--r--jabber-keepalive.el59
-rw-r--r--jabber-keymap.el7
-rw-r--r--jabber-logon.el83
-rw-r--r--jabber-modeline.el9
-rw-r--r--jabber-muc-nick-completion.el190
-rw-r--r--jabber-muc.el287
-rw-r--r--jabber-newdisco.el51
-rw-r--r--jabber-osd.el35
-rw-r--r--jabber-pkg.el.in4
-rw-r--r--jabber-presence.el320
-rw-r--r--jabber-private.el30
-rw-r--r--jabber-ratpoison.el2
-rw-r--r--jabber-register.el71
-rw-r--r--jabber-roster.el234
-rw-r--r--jabber-sasl.el158
-rw-r--r--jabber-sawfish.el8
-rw-r--r--jabber-screen.el2
-rw-r--r--jabber-search.el19
-rw-r--r--jabber-si-client.el8
-rw-r--r--jabber-si-server.el8
-rw-r--r--jabber-socks5.el95
-rw-r--r--jabber-time.el29
-rw-r--r--jabber-truncate.el69
-rw-r--r--jabber-util.el181
-rw-r--r--jabber-vcard-avatars.el78
-rw-r--r--jabber-vcard.el24
-rw-r--r--jabber-version.el16
-rw-r--r--jabber-widget.el14
-rw-r--r--jabber-wmii.el58
-rw-r--r--jabber-xmessage.el17
-rw-r--r--jabber-xml.el26
-rw-r--r--jabber.el128
-rw-r--r--jabber.info749
-rw-r--r--jabber.texi424
-rw-r--r--m4/emacs-lib.m424
-rwxr-xr-xmissing367
-rw-r--r--srv.el8
-rw-r--r--tests/Makefile.am3
-rw-r--r--tests/Makefile.in362
-rw-r--r--tests/skip-tag-forward.el23
-rw-r--r--texinfo.tex8962
167 files changed, 20581 insertions, 7834 deletions
diff --git a/AUTHORS b/AUTHORS
index 210fd03..3aa9f60 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,16 +1,24 @@
Developers:
Tom Berger
Magnus Henoch
+Kirill A. Korinskiy
+Detlev Zundel
+Evgenii Terechkov
Contributors:
+Anthony Chaumas-Pellet
Mathias Dahl
Mario Domenech Goulart
Nolan Eakins
+Ami Fischman
François Fleuret
David Hansen
Justin Kirby
Carl Henrik Lunde
+Olivier Ramonat
Andrey Slusar
+Valery V. Vorotyntsev
Milan Zamazal
+Xavier Maillard
arch-tag: 15700144-3BD9-11D9-871C-000A95C2FCD0
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..2703d81
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,61 @@
+ACLOCAL_AMFLAGS = -I m4
+
+my_lisp_sources=fsm.el jabber-activity.el jabber-ahc-presence.el \
+jabber-ahc.el jabber-alert.el jabber-autoaway.el jabber-avatar.el \
+jabber-bookmarks.el jabber-browse.el jabber-chat.el \
+jabber-chatbuffer.el jabber-chatstates.el jabber-compose.el \
+jabber-conn.el jabber-core.el jabber-disco.el jabber-events.el \
+jabber-export.el jabber-feature-neg.el jabber-festival.el \
+jabber-ft-client.el jabber-ft-common.el jabber-ft-server.el \
+jabber-gmail.el jabber-history.el jabber-iq.el jabber-keepalive.el \
+jabber-keymap.el jabber-logon.el jabber-menu.el jabber-modeline.el \
+jabber-muc-nick-completion.el jabber-muc.el jabber-newdisco.el \
+jabber-osd.el jabber-presence.el jabber-private.el jabber-ratpoison.el \
+jabber-register.el jabber-roster.el jabber-sasl.el jabber-sawfish.el \
+jabber-screen.el jabber-search.el jabber-si-client.el \
+jabber-si-common.el jabber-si-server.el jabber-socks5.el \
+jabber-time.el jabber-truncate.el jabber-util.el \
+jabber-vcard-avatars.el jabber-vcard.el jabber-version.el \
+jabber-watch.el jabber-widget.el jabber-wmii.el jabber-xmessage.el \
+jabber-xml.el jabber.el srv.el
+
+compat_lisp_sources =
+if USE_OUR_SHA1
+compat_lisp_sources += compat/sha1.el
+endif
+if USE_OUR_HEX_UTIL
+compat_lisp_sources += compat/hex-util.el
+endif
+
+dist_lisp_LISP=$(my_lisp_sources) $(compat_lisp_sources) jabber-autoloads.el
+MAINTAINERCLEANFILES=jabber-autoloads.el
+
+EXTRA_DIST = jabber-pkg.el.in
+
+# The autoload file will cause Lisp sources to be rebuilt _twice_: the
+# timestamp of the Lisp compilation is set _before_ the autoloads are
+# regenerated, which means that jabber-autoload.el is once again
+# considered new, which means that everything will be built again.
+# Suggestions welcome.
+jabber-autoloads.el: $(my_lisp_sources)
+ $(EMACS) --batch --eval "(setq generated-autoload-file \"$(abs_builddir)/$@\")" -f batch-update-autoloads $(srcdir)
+
+info_TEXINFOS=jabber.texi
+
+dist_libexec_SCRIPTS = xmppuri.sh
+
+SUBDIRS = . tests
+
+# Package everything in a form suitable for ELPA. That is, use
+# "jabber" instead of "emacs-jabber" as base name.
+CLEANFILES = jabber-pkg.el
+elpa: dist
+ rm -rf emacs-jabber-$(PACKAGE_VERSION) jabber-$(PACKAGE_VERSION)
+ $(AMTAR) xzf emacs-jabber-$(PACKAGE_VERSION).tar.gz
+ mv emacs-jabber-$(PACKAGE_VERSION) jabber-$(PACKAGE_VERSION)
+ cd jabber-$(PACKAGE_VERSION) ; install-info jabber.info dir
+ sed "s/@""PACKAGE_VERSION@""/$(PACKAGE_VERSION)/" < $(srcdir)/jabber-pkg.el.in > jabber-$(PACKAGE_VERSION)/jabber-pkg.el
+ $(AMTAR) chf jabber-$(PACKAGE_VERSION).tar jabber-$(PACKAGE_VERSION)
+ rm -rf jabber-$(PACKAGE_VERSION)
+ @echo "Created jabber-$(PACKAGE_VERSION).tar"
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..8eef8a7
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,993 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+@USE_OUR_SHA1_TRUE@am__append_1 = compat/sha1.el
+@USE_OUR_HEX_UTIL_TRUE@am__append_2 = compat/hex-util.el
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(am__dist_lisp_LISP_DIST) \
+ $(dist_libexec_SCRIPTS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS NEWS \
+ elisp-comp install-sh missing texinfo.tex
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/emacs-lib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(infodir)" \
+ "$(DESTDIR)$(lispdir)"
+dist_libexecSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(dist_libexec_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/jabber.info
+am__TEXINFO_TEX_DIR = $(srcdir)
+DVIS = jabber.dvi
+PDFS = jabber.pdf
+PSS = jabber.ps
+HTMLS = jabber.html
+TEXINFOS = jabber.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-dvi-recursive install-exec-recursive \
+ install-html-recursive install-info-recursive \
+ install-pdf-recursive install-ps-recursive install-recursive \
+ installcheck-recursive installdirs-recursive pdf-recursive \
+ ps-recursive uninstall-recursive
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__dist_lisp_LISP_DIST = fsm.el jabber-activity.el \
+ jabber-ahc-presence.el jabber-ahc.el jabber-alert.el \
+ jabber-autoaway.el jabber-avatar.el jabber-bookmarks.el \
+ jabber-browse.el jabber-chat.el jabber-chatbuffer.el \
+ jabber-chatstates.el jabber-compose.el jabber-conn.el \
+ jabber-core.el jabber-disco.el jabber-events.el \
+ jabber-export.el jabber-feature-neg.el jabber-festival.el \
+ jabber-ft-client.el jabber-ft-common.el jabber-ft-server.el \
+ jabber-gmail.el jabber-history.el jabber-iq.el \
+ jabber-keepalive.el jabber-keymap.el jabber-logon.el \
+ jabber-menu.el jabber-modeline.el \
+ jabber-muc-nick-completion.el jabber-muc.el jabber-newdisco.el \
+ jabber-osd.el jabber-presence.el jabber-private.el \
+ jabber-ratpoison.el jabber-register.el jabber-roster.el \
+ jabber-sasl.el jabber-sawfish.el jabber-screen.el \
+ jabber-search.el jabber-si-client.el jabber-si-common.el \
+ jabber-si-server.el jabber-socks5.el jabber-time.el \
+ jabber-truncate.el jabber-util.el jabber-vcard-avatars.el \
+ jabber-vcard.el jabber-version.el jabber-watch.el \
+ jabber-widget.el jabber-wmii.el jabber-xmessage.el \
+ jabber-xml.el jabber.el srv.el compat/sha1.el \
+ compat/hex-util.el jabber-autoloads.el
+dist_lispLISP_INSTALL = $(INSTALL_DATA)
+LISP = $(dist_lisp_LISP)
+am__ELFILES = compat/hex-util.el compat/sha1.el fsm.el \
+ jabber-activity.el jabber-ahc-presence.el jabber-ahc.el \
+ jabber-alert.el jabber-autoaway.el jabber-autoloads.el \
+ jabber-avatar.el jabber-bookmarks.el jabber-browse.el \
+ jabber-chat.el jabber-chatbuffer.el jabber-chatstates.el \
+ jabber-compose.el jabber-conn.el jabber-core.el \
+ jabber-disco.el jabber-events.el jabber-export.el \
+ jabber-feature-neg.el jabber-festival.el jabber-ft-client.el \
+ jabber-ft-common.el jabber-ft-server.el jabber-gmail.el \
+ jabber-history.el jabber-iq.el jabber-keepalive.el \
+ jabber-keymap.el jabber-logon.el jabber-menu.el \
+ jabber-modeline.el jabber-muc-nick-completion.el jabber-muc.el \
+ jabber-newdisco.el jabber-osd.el jabber-presence.el \
+ jabber-private.el jabber-ratpoison.el jabber-register.el \
+ jabber-roster.el jabber-sasl.el jabber-sawfish.el \
+ jabber-screen.el jabber-search.el jabber-si-client.el \
+ jabber-si-common.el jabber-si-server.el jabber-socks5.el \
+ jabber-time.el jabber-truncate.el jabber-util.el \
+ jabber-vcard-avatars.el jabber-vcard.el jabber-version.el \
+ jabber-watch.el jabber-widget.el jabber-wmii.el \
+ jabber-xmessage.el jabber-xml.el jabber.el srv.el
+am__ELCFILES = $(am__ELFILES:.el=.elc)
+ELCFILES = $(LISP:.el=.elc)
+elisp_comp = $(top_srcdir)/elisp-comp
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EMACS = @EMACS@
+EMACSLOADPATH = @EMACSLOADPATH@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+lispdir = @lispdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ACLOCAL_AMFLAGS = -I m4
+my_lisp_sources = fsm.el jabber-activity.el jabber-ahc-presence.el \
+jabber-ahc.el jabber-alert.el jabber-autoaway.el jabber-avatar.el \
+jabber-bookmarks.el jabber-browse.el jabber-chat.el \
+jabber-chatbuffer.el jabber-chatstates.el jabber-compose.el \
+jabber-conn.el jabber-core.el jabber-disco.el jabber-events.el \
+jabber-export.el jabber-feature-neg.el jabber-festival.el \
+jabber-ft-client.el jabber-ft-common.el jabber-ft-server.el \
+jabber-gmail.el jabber-history.el jabber-iq.el jabber-keepalive.el \
+jabber-keymap.el jabber-logon.el jabber-menu.el jabber-modeline.el \
+jabber-muc-nick-completion.el jabber-muc.el jabber-newdisco.el \
+jabber-osd.el jabber-presence.el jabber-private.el jabber-ratpoison.el \
+jabber-register.el jabber-roster.el jabber-sasl.el jabber-sawfish.el \
+jabber-screen.el jabber-search.el jabber-si-client.el \
+jabber-si-common.el jabber-si-server.el jabber-socks5.el \
+jabber-time.el jabber-truncate.el jabber-util.el \
+jabber-vcard-avatars.el jabber-vcard.el jabber-version.el \
+jabber-watch.el jabber-widget.el jabber-wmii.el jabber-xmessage.el \
+jabber-xml.el jabber.el srv.el
+
+compat_lisp_sources = $(am__append_1) $(am__append_2)
+dist_lisp_LISP = $(my_lisp_sources) $(compat_lisp_sources) jabber-autoloads.el
+MAINTAINERCLEANFILES = jabber-autoloads.el
+EXTRA_DIST = jabber-pkg.el.in
+info_TEXINFOS = jabber.texi
+dist_libexec_SCRIPTS = xmppuri.sh
+SUBDIRS = . tests
+
+# Package everything in a form suitable for ELPA. That is, use
+# "jabber" instead of "emacs-jabber" as base name.
+CLEANFILES = jabber-pkg.el
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+install-dist_libexecSCRIPTS: $(dist_libexec_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)"
+ @list='$(dist_libexec_SCRIPTS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ if test -f $$d$$p; then \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " $(dist_libexecSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(libexecdir)/$$f'"; \
+ $(dist_libexecSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(libexecdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-dist_libexecSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(dist_libexec_SCRIPTS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+ echo " rm -f '$(DESTDIR)$(libexecdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(libexecdir)/$$f"; \
+ done
+
+.texi.info:
+ restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+ am__cwd=`pwd` && cd $(srcdir) && \
+ rm -rf $$backupdir && mkdir $$backupdir && \
+ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+ done; \
+ else :; fi && \
+ cd "$$am__cwd"; \
+ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $@ $<; \
+ then \
+ rc=0; \
+ cd $(srcdir); \
+ else \
+ rc=$$?; \
+ cd $(srcdir) && \
+ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+ fi; \
+ rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2DVI) $<
+
+.texi.pdf:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+ $(TEXI2PDF) $<
+
+.texi.html:
+ rm -rf $(@:.html=.htp)
+ if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+ -o $(@:.html=.htp) $<; \
+ then \
+ rm -rf $@; \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+ else \
+ if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+ rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+ exit 1; \
+ fi
+$(srcdir)/jabber.info: jabber.texi
+jabber.dvi: jabber.texi
+jabber.pdf: jabber.texi
+jabber.html: jabber.texi
+.dvi.ps:
+ TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+ $(DVIPS) -o $@ $<
+
+uninstall-dvi-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(DVIS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \
+ rm -f "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+
+uninstall-html-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(HTMLS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \
+ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \
+ done
+
+uninstall-info-am:
+ @$(PRE_UNINSTALL)
+ @if test -d '$(DESTDIR)$(infodir)' && \
+ (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+ install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+ done; \
+ else :; fi
+ @$(NORMAL_UNINSTALL)
+ @list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \
+ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+ else :; fi); \
+ done
+
+uninstall-pdf-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PDFS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+
+uninstall-ps-am:
+ @$(NORMAL_UNINSTALL)
+ @list='$(PSS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(psdir)/$$f"; \
+ done
+
+dist-info: $(INFO_DEPS)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for base in $$list; do \
+ case $$base in \
+ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$base; then d=.; else d=$(srcdir); fi; \
+ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+ if test -f $$file; then \
+ relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+ test -f $(distdir)/$$relfile || \
+ cp -p $$file $(distdir)/$$relfile; \
+ else :; fi; \
+ done; \
+ done
+
+mostlyclean-aminfo:
+ -rm -rf jabber.aux jabber.cp jabber.cps jabber.fn jabber.fns jabber.ky \
+ jabber.kys jabber.log jabber.pg jabber.pgs jabber.tmp \
+ jabber.toc jabber.tp jabber.tps jabber.vr jabber.vrs \
+ jabber.dvi jabber.pdf jabber.ps jabber.html
+
+maintainer-clean-aminfo:
+ @list='$(INFO_DEPS)'; for i in $$list; do \
+ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
+
+elc-stamp: $(LISP)
+ @echo 'WARNING: Warnings can be ignored. :-)'
+ @rm -f elc-temp && touch elc-temp
+ if test "$(EMACS)" != no; then \
+ set x; \
+ list='$(LISP)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ set x "$$@" "$$d$$p"; shift; \
+ done; \
+ shift; \
+ EMACS="$(EMACS)" $(SHELL) $(elisp_comp) "$$@" || exit 1; \
+ else : ; fi
+ @mv -f elc-temp $@
+$(am__ELCFILES): elc-stamp
+ @if test "$(EMACS)" != no && test ! -f $@; then \
+ trap 'rm -rf elc-lock elc-stamp' 1 2 13 15; \
+ if mkdir elc-lock 2>/dev/null; then \
+ rm -f elc-stamp; \
+ $(MAKE) $(AM_MAKEFLAGS) elc-stamp; \
+ rmdir elc-lock; \
+ else \
+ while test -d elc-lock; do sleep 1; done; \
+ test -f elc-stamp; exit $$?; \
+ fi; \
+ else : ; fi
+install-dist_lispLISP: $(dist_lisp_LISP) $(ELCFILES)
+ @$(NORMAL_INSTALL)
+ @if test "$(EMACS)" != no; then \
+ test -z "$(lispdir)" || $(MKDIR_P) "$(DESTDIR)$(lispdir)"; \
+ list='$(dist_lisp_LISP)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(dist_lispLISP_INSTALL) '$$d$$p' '$(DESTDIR)$(lispdir)/$$f'"; \
+ $(dist_lispLISP_INSTALL) "$$d$$p" "$(DESTDIR)$(lispdir)/$$f"; \
+ if test -f $${p}c; then \
+ echo " $(dist_lispLISP_INSTALL) '$${p}c' '$(DESTDIR)$(lispdir)/$${f}c'"; \
+ $(dist_lispLISP_INSTALL) "$${p}c" "$(DESTDIR)$(lispdir)/$${f}c"; \
+ else : ; fi; \
+ done; \
+ else : ; fi
+
+uninstall-dist_lispLISP:
+ @$(NORMAL_UNINSTALL)
+ @if test "$(EMACS)" != no; then \
+ list='$(dist_lisp_LISP)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(lispdir)/$$f' '$(DESTDIR)$(lispdir)/$${f}c'"; \
+ rm -f "$(DESTDIR)$(lispdir)/$$f" "$(DESTDIR)$(lispdir)/$${f}c"; \
+ done; \
+ else : ; fi
+
+clean-lisp:
+ -rm -f elc-stamp $(ELCFILES)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+$(RECURSIVE_CLEAN_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d $(distdir) || mkdir $(distdir)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$(top_distdir)" distdir="$(distdir)" \
+ dist-info
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r $(distdir)
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ $(am__remove_distdir)
+
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-lzma: distdir
+ tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lzma*) \
+ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(INFO_DEPS) $(SCRIPTS) $(LISP) $(ELCFILES)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(infodir)" "$(DESTDIR)$(lispdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic clean-lisp mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am: $(DVIS)
+
+html: html-recursive
+
+html-am: $(HTMLS)
+
+info: info-recursive
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-dist_lispLISP install-info-am
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am: $(DVIS)
+ @$(NORMAL_INSTALL)
+ test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)"
+ @list='$(DVIS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(dvidir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(dvidir)/$$f"; \
+ done
+install-exec-am: install-dist_libexecSCRIPTS
+
+install-html: install-html-recursive
+
+install-html-am: $(HTMLS)
+ @$(NORMAL_INSTALL)
+ test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
+ @list='$(HTMLS)'; for p in $$list; do \
+ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ if test -d "$$d$$p"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \
+ echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f"; \
+ else \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
+ fi; \
+ done
+install-info: install-info-recursive
+
+install-info-am: $(INFO_DEPS)
+ @$(NORMAL_INSTALL)
+ test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ esac; \
+ if test -f $$file; then d=.; else d=$(srcdir); fi; \
+ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+ if test -f $$ifile; then \
+ relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+ echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+ $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+ else : ; fi; \
+ done; \
+ done
+ @$(POST_INSTALL)
+ @if (install-info --version && \
+ install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+ list='$(INFO_DEPS)'; \
+ for file in $$list; do \
+ relfile=`echo "$$file" | sed 's|^.*/||'`; \
+ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am: $(PDFS)
+ @$(NORMAL_INSTALL)
+ test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)"
+ @list='$(PDFS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(pdfdir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(pdfdir)/$$f"; \
+ done
+install-ps: install-ps-recursive
+
+install-ps-am: $(PSS)
+ @$(NORMAL_INSTALL)
+ test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)"
+ @list='$(PSS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(INSTALL_DATA) '$$d$$p' '$(DESTDIR)$(psdir)/$$f'"; \
+ $(INSTALL_DATA) "$$d$$p" "$(DESTDIR)$(psdir)/$$f"; \
+ done
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+ maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am: $(PDFS)
+
+ps: ps-recursive
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-dist_libexecSCRIPTS uninstall-dist_lispLISP \
+ uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-pdf-am uninstall-ps-am
+
+.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
+ install-strip
+
+.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
+ all all-am am--refresh check check-am clean clean-generic \
+ clean-lisp ctags ctags-recursive dist dist-all dist-bzip2 \
+ dist-gzip dist-info dist-lzma dist-shar dist-tarZ dist-zip \
+ distcheck distclean distclean-generic distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dist_libexecSCRIPTS \
+ install-dist_lispLISP install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-aminfo maintainer-clean-generic mostlyclean \
+ mostlyclean-aminfo mostlyclean-generic pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am \
+ uninstall-dist_libexecSCRIPTS uninstall-dist_lispLISP \
+ uninstall-dvi-am uninstall-html-am uninstall-info-am \
+ uninstall-pdf-am uninstall-ps-am
+
+
+# The autoload file will cause Lisp sources to be rebuilt _twice_: the
+# timestamp of the Lisp compilation is set _before_ the autoloads are
+# regenerated, which means that jabber-autoload.el is once again
+# considered new, which means that everything will be built again.
+# Suggestions welcome.
+jabber-autoloads.el: $(my_lisp_sources)
+ $(EMACS) --batch --eval "(setq generated-autoload-file \"$(abs_builddir)/$@\")" -f batch-update-autoloads $(srcdir)
+elpa: dist
+ rm -rf emacs-jabber-$(PACKAGE_VERSION) jabber-$(PACKAGE_VERSION)
+ $(AMTAR) xzf emacs-jabber-$(PACKAGE_VERSION).tar.gz
+ mv emacs-jabber-$(PACKAGE_VERSION) jabber-$(PACKAGE_VERSION)
+ cd jabber-$(PACKAGE_VERSION) ; install-info jabber.info dir
+ sed "s/@""PACKAGE_VERSION@""/$(PACKAGE_VERSION)/" < $(srcdir)/jabber-pkg.el.in > jabber-$(PACKAGE_VERSION)/jabber-pkg.el
+ $(AMTAR) chf jabber-$(PACKAGE_VERSION).tar jabber-$(PACKAGE_VERSION)
+ rm -rf jabber-$(PACKAGE_VERSION)
+ @echo "Created jabber-$(PACKAGE_VERSION).tar"
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
index cc26e34..5ef96a8 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,51 @@
-*- mode: outline -*-
+* New features in jabber.el 0.8
+
+** Support for multiple accounts
+Configuration variables have changed. See section "Account settings"
+in the manual.
+
+** OSD alerts (message, MUC, MUC-personal)
+
+** Family of personal MUC alerts added
+See section "Standard alerts" in manual.
+
+** MUC nicks completion
+See sectin "Groupchat" in manual.
+
+** Automatic reconnection
+Not enabled by default; See "Reconnecting" section in manual.
+
+** Support for XEP-0085
+This means "contact is typing" notifications when chatting with Gajim
+or Google Talk users, among others.
+See "Typing notifications" section in the manual.
+
+** Option: hide offline contacts in roster
+See "The roster buffer" in manual.
+
+** Clean history from chat buffers
+See jabber-truncate-* functions and new options for
+jabber-alert-muc-hooks and jabber-alert-message-hooks. See section
+"Message history" in manual too.
+
+** MUC bookmarks
+See jabber-edit-bookmarks function and "Bookmarks" section in manual.
+
+** Name of browse buffers customizable
+See "Services" section in manual.
+
+** Subscription requests are sent to chat buffers
+Subscription requests now displayed in chat buffers. See "Presence
+subscription" section in manual.
+
+** Option: hide avatar in chat buffer
+`jabber-chat-buffer-show-avatar'.
+
+** Gmail notifications
+(Not documented nor autoloaded)
+
* New features in jabber.el 0.7.1
** STARTTLS
diff --git a/README b/README
index 698bd58..32d5588 100644
--- a/README
+++ b/README
@@ -1,20 +1,25 @@
-This is jabber.el 0.7.1, a Jabber client for Emacs. If you don't know
-what Jabber is, see http://www.jabber.org .
+This is jabber.el 0.7.90, a Jabber client for Emacs. Note that this
+is a pretest version; testing and bug reports are very welcome.
+
+Jabber (also known as XMPP) is an instant messaging system; see
+http://www.jabber.org for more information.
Home page: http://emacs-jabber.sourceforge.net
Project page: http://sourceforge.net/projects/emacs-jabber
Wiki page: http://www.emacswiki.org/cgi-bin/wiki/JabberEl
Mailing list: http://lists.sourceforge.net/lists/listinfo/emacs-jabber-general
and: http://dir.gmane.org/gmane.emacs.jabber.general
-MUC room: jabber.el@conference.jabber.se
+MUC room: jabber.el@conference.jabber.se and emacs@conference.jabber.ru (Russian, English)
GNU Emacs
=========
-jabber.el depends on GNU Emacs 21, in particular xml.el, and some
-files from Gnus 5.10. If you don't have Gnus 5.10 (M-x gnus-version
-will tell), you can download sha1.el and hex-util.el from Gnus CVS
-at http://quimby.gnus.org/cgi-bin/cvsweb.cgi/gnus/lisp/ .
+jabber.el depends on GNU Emacs (21, 22, 23 works fine), in particular
+xml.el, and some files from Gnus 5.10. If you don't have Gnus 5.10
+(M-x gnus-version will tell), you can get sha1.el and hex-util.el
+from the compat subdirectory. (The configure script tries to detect
+this situation and include the files in the build)
+
XEmacs
======
@@ -52,23 +57,32 @@ there is no guarantee of other connections being encrypted.
Installation
============
-To install, put all .el files somewhere in your load-path (or have
-your load-path include the directory they're in) and put
-(require 'jabber) in your .emacs file. To install the Info
-documentation, copy jabber.info to /usr/local/info and run
-"install-info /usr/local/info/jabber.info".
-
-If you've been using a post-0.6 CVS version of jabber.el, you might
-need to remove some redundant hook functions. Make sure that
-jabber-alert-message-hooks doesn't contain jabber-message-history, and
-that jabber-alert-presence-hooks doesn't contain
-jabber-presence-watch.
+jabber.el can be installed using the commands:
+./configure
+make
+make install
+
+You can specify which emacs you want to use:
+./configure EMACS=emacs-or-xemacs-21.4
+
+You can also install jabber.el by hand. Put all .el files somewhere
+in your load-path, or have your load-path include the directory
+they're in. To install the Info documentation, copy jabber.info to
+/usr/local/info and run "install-info /usr/local/info/jabber.info".
+
+After installation by either method, add (load "jabber-autoloads") to
+your .emacs file.
+
+If you are upgrading from 0.7-0.7.x, you need to update your
+configuration. See the section "Account settings" in the manual.
Usage
=====
-To start using it, type M-x jabber-customize and set your username and
-server. Then, type C-x C-j C-c (or equivalently M-x jabber-connect)
-to connect (with prefix argument, register new account).
+
+To connect to a Jabber server, type C-x C-j C-c (or equivalently M-x
+jabber-connect-all) and enter your JID. With prefix argument,
+register a new account. You can set your JID permanently with M-x
+jabber-customize.
Your roster is displayed in a buffer called *-jabber-*. To
disconnect, type C-x C-j C-d or M-x jabber-disconnect.
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..1981f80
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,641 @@
+# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(AC_AUTOCONF_VERSION, [2.62],,
+[m4_warning([this file was generated for autoconf 2.62.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.10.1], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10.1])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 13
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.60])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES(OBJC)],
+ [define([AC_PROG_OBJC],
+ defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+# 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 10
+
+# AM_PATH_LISPDIR
+# ---------------
+AC_DEFUN([AM_PATH_LISPDIR],
+[AC_PREREQ([2.60])dnl
+ # If set to t, that means we are running in a shell under Emacs.
+ # If you have an Emacs named "t", then use the full path.
+ test x"$EMACS" = xt && EMACS=
+ AC_CHECK_PROGS([EMACS], [emacs xemacs], [no])
+ AC_ARG_VAR([EMACS], [the Emacs editor command])
+ AC_ARG_VAR([EMACSLOADPATH], [the Emacs library search path])
+ AC_ARG_WITH([lispdir],
+ [ --with-lispdir override the default lisp directory],
+ [ lispdir="$withval"
+ AC_MSG_CHECKING([where .elc files should go])
+ AC_MSG_RESULT([$lispdir])],
+ [
+ AC_CACHE_CHECK([where .elc files should go], [am_cv_lispdir], [
+ if test $EMACS != "no"; then
+ if test x${lispdir+set} != xset; then
+ # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly
+ # Some emacsen will start up in interactive mode, requiring C-x C-c to exit,
+ # which is non-obvious for non-emacs users.
+ # Redirecting /dev/null should help a bit; pity we can't detect "broken"
+ # emacsen earlier and avoid running this altogether.
+ AC_RUN_LOG([$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' </dev/null >conftest.out])
+ am_cv_lispdir=`sed -n \
+ -e 's,/$,,' \
+ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \
+ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \
+ conftest.out`
+ rm conftest.out
+ fi
+ fi
+ test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp'
+ ])
+ lispdir="$am_cv_lispdir"
+])
+AC_SUBST([lispdir])
+])# AM_PATH_LISPDIR
+
+AU_DEFUN([ud_PATH_LISPDIR], [AM_PATH_LISPDIR])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+ [[\\/$]]* | ?:[[\\/]]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/emacs-lib.m4])
diff --git a/compat/hex-util.el b/compat/hex-util.el
new file mode 100644
index 0000000..901c98c
--- /dev/null
+++ b/compat/hex-util.el
@@ -0,0 +1,75 @@
+;;; hex-util.el --- Functions to encode/decode hexadecimal string.
+
+;; Copyright (C) 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
+;; Keywords: data
+
+;; This file is part of FLIM (Faithful Library about Internet Message).
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 3, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; 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
+ (defmacro hex-char-to-num (chr)
+ `(let ((chr ,chr))
+ (cond
+ ((and (<= ?a chr)(<= chr ?f)) (+ (- chr ?a) 10))
+ ((and (<= ?A chr)(<= chr ?F)) (+ (- chr ?A) 10))
+ ((and (<= ?0 chr)(<= chr ?9)) (- chr ?0))
+ (t (error "Invalid hexadecimal digit `%c'" chr)))))
+ (defmacro num-to-hex-char (num)
+ `(aref "0123456789abcdef" ,num)))
+
+(defun decode-hex-string (string)
+ "Decode hexadecimal STRING to octet string."
+ (let* ((len (length string))
+ (dst (make-string (/ len 2) 0))
+ (idx 0)(pos 0))
+ (while (< pos len)
+ ;; logior and lsh are not byte-coded.
+ ;; (aset dst idx (logior (lsh (hex-char-to-num (aref string pos)) 4)
+ ;; (hex-char-to-num (aref string (1+ pos)))))
+ (aset dst idx (+ (* (hex-char-to-num (aref string pos)) 16)
+ (hex-char-to-num (aref string (1+ pos)))))
+ (setq idx (1+ idx)
+ pos (+ 2 pos)))
+ dst))
+
+(defun encode-hex-string (string)
+ "Encode octet STRING to hexadecimal string."
+ (let* ((len (length string))
+ (dst (make-string (* len 2) 0))
+ (idx 0)(pos 0))
+ (while (< pos len)
+ ;; logand and lsh are not byte-coded.
+ ;; (aset dst idx (num-to-hex-char (logand (lsh (aref string pos) -4) 15)))
+ (aset dst idx (num-to-hex-char (/ (aref string pos) 16)))
+ (setq idx (1+ idx))
+ ;; (aset dst idx (num-to-hex-char (logand (aref string pos) 15)))
+ (aset dst idx (num-to-hex-char (% (aref string pos) 16)))
+ (setq idx (1+ idx)
+ pos (1+ pos)))
+ dst))
+
+(provide 'hex-util)
+
+;; arch-tag: fe8aaa79-6c86-400e-813f-5a8cc4cb3859
+;;; hex-util.el ends here
diff --git a/compat/sha1.el b/compat/sha1.el
new file mode 100644
index 0000000..7c5feff
--- /dev/null
+++ b/compat/sha1.el
@@ -0,0 +1,442 @@
+;;; sha1.el --- SHA1 Secure Hash Algorithm in Emacs-Lisp
+
+;; Copyright (C) 1999, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+
+;; 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 program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 3, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; 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 the definition of SHA-1 in FIPS PUB
+;; 180-1 (Federal Information Processing Standards Publication 180-1),
+;; "Announcing the Standard for SECURE HASH STANDARD".
+;; <URL:http://www.itl.nist.gov/div897/pubs/fip180-1.htm>
+;; (EXCEPTION; two optimizations taken from GnuPG/cipher/sha1.c)
+;;
+;; Test cases from FIPS PUB 180-1.
+;;
+;; (sha1 "abc")
+;; => a9993e364706816aba3e25717850c26c9cd0d89d
+;;
+;; (sha1 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")
+;; => 84983e441c3bd26ebaae4aa1f95129e5e54670f1
+;;
+;; (sha1 (make-string 1000000 ?a))
+;; => 34aa973cd4c4daa4f61eeb2bdbad27316534016f
+;;
+;; BUGS:
+;; * It is assumed that length of input string is less than 2^29 bytes.
+;; * It is caller's responsibility to make string (or region) unibyte.
+;;
+;; TODO:
+;; * Rewrite from scratch!
+;; This version is much faster than Keiichi Suzuki's another sha1.el,
+;; but it is too dirty.
+
+;;; Code:
+
+(require 'hex-util)
+
+;;;
+;;; external SHA1 function.
+;;;
+
+(defgroup sha1 nil
+ "Elisp interface for SHA1 hash computation."
+ :version "22.1"
+ :group 'extensions)
+
+(defcustom sha1-maximum-internal-length 500
+ "*Maximum length of message to use Lisp version of SHA1 function.
+If message is longer than this, `sha1-program' is used instead.
+
+If this variable is set to 0, use external program only.
+If this variable is set to nil, use internal function only."
+ :type 'integer
+ :group 'sha1)
+
+(defcustom sha1-program '("sha1sum")
+ "*Name of program to compute SHA1.
+It must be a string \(program name\) or list of strings \(name and its args\)."
+ :type '(repeat string)
+ :group 'sha1)
+
+(defcustom sha1-use-external (condition-case ()
+ (executable-find (car sha1-program))
+ (error))
+ "*Use external SHA1 program.
+If this variable is set to nil, use internal function only."
+ :type 'boolean
+ :group 'sha1)
+
+(defun sha1-string-external (string &optional binary)
+ (let (prog args digest default-enable-multibyte-characters)
+ (if (consp sha1-program)
+ (setq prog (car sha1-program)
+ args (cdr sha1-program))
+ (setq prog sha1-program
+ args nil))
+ (with-temp-buffer
+ (insert string)
+ (apply (function call-process-region)
+ (point-min)(point-max)
+ prog t t nil args)
+ ;; SHA1 is 40 bytes long in hexadecimal form.
+ (setq digest (buffer-substring (point-min)(+ (point-min) 40))))
+ (if binary
+ (decode-hex-string digest)
+ digest)))
+
+(defun sha1-region-external (beg end &optional binary)
+ (sha1-string-external (buffer-substring-no-properties beg end) binary))
+
+;;;
+;;; internal SHA1 function.
+;;;
+
+(eval-when-compile
+ ;; optional second arg of string-to-number is new in v20.
+ (defconst sha1-K0-high 23170) ; (string-to-number "5A82" 16)
+ (defconst sha1-K0-low 31129) ; (string-to-number "7999" 16)
+ (defconst sha1-K1-high 28377) ; (string-to-number "6ED9" 16)
+ (defconst sha1-K1-low 60321) ; (string-to-number "EBA1" 16)
+ (defconst sha1-K2-high 36635) ; (string-to-number "8F1B" 16)
+ (defconst sha1-K2-low 48348) ; (string-to-number "BCDC" 16)
+ (defconst sha1-K3-high 51810) ; (string-to-number "CA62" 16)
+ (defconst sha1-K3-low 49622) ; (string-to-number "C1D6" 16)
+
+ ;; original definition of sha1-F0.
+ ;; (defmacro sha1-F0 (B C D)
+ ;; (` (logior (logand (, B) (, C))
+ ;; (logand (lognot (, B)) (, D)))))
+ ;; a little optimization from GnuPG/cipher/sha1.c.
+ (defmacro sha1-F0 (B C D)
+ `(logxor ,D (logand ,B (logxor ,C ,D))))
+ (defmacro sha1-F1 (B C D)
+ `(logxor ,B ,C ,D))
+ ;; original definition of sha1-F2.
+ ;; (defmacro sha1-F2 (B C D)
+ ;; (` (logior (logand (, B) (, C))
+ ;; (logand (, B) (, D))
+ ;; (logand (, C) (, D)))))
+ ;; a little optimization from GnuPG/cipher/sha1.c.
+ (defmacro sha1-F2 (B C D)
+ `(logior (logand ,B ,C)
+ (logand ,D (logior ,B ,C))))
+ (defmacro sha1-F3 (B C D)
+ `(logxor ,B ,C ,D))
+
+ (defmacro sha1-S1 (W-high W-low)
+ `(let ((W-high ,W-high)
+ (W-low ,W-low))
+ (setq S1W-high (+ (% (* W-high 2) 65536)
+ (/ W-low ,(/ 65536 2))))
+ (setq S1W-low (+ (/ W-high ,(/ 65536 2))
+ (% (* W-low 2) 65536)))))
+ (defmacro sha1-S5 (A-high A-low)
+ `(progn
+ (setq S5A-high (+ (% (* ,A-high 32) 65536)
+ (/ ,A-low ,(/ 65536 32))))
+ (setq S5A-low (+ (/ ,A-high ,(/ 65536 32))
+ (% (* ,A-low 32) 65536)))))
+ (defmacro sha1-S30 (B-high B-low)
+ `(progn
+ (setq S30B-high (+ (/ ,B-high 4)
+ (* (% ,B-low 4) ,(/ 65536 4))))
+ (setq S30B-low (+ (/ ,B-low 4)
+ (* (% ,B-high 4) ,(/ 65536 4))))))
+
+ (defmacro sha1-OP (round)
+ `(progn
+ (sha1-S5 sha1-A-high sha1-A-low)
+ (sha1-S30 sha1-B-high sha1-B-low)
+ (setq sha1-A-low (+ (,(intern (format "sha1-F%d" round))
+ sha1-B-low sha1-C-low sha1-D-low)
+ sha1-E-low
+ ,(symbol-value
+ (intern (format "sha1-K%d-low" round)))
+ (aref block-low idx)
+ (progn
+ (setq sha1-E-low sha1-D-low)
+ (setq sha1-D-low sha1-C-low)
+ (setq sha1-C-low S30B-low)
+ (setq sha1-B-low sha1-A-low)
+ S5A-low)))
+ (setq carry (/ sha1-A-low 65536))
+ (setq sha1-A-low (% sha1-A-low 65536))
+ (setq sha1-A-high (% (+ (,(intern (format "sha1-F%d" round))
+ sha1-B-high sha1-C-high sha1-D-high)
+ sha1-E-high
+ ,(symbol-value
+ (intern (format "sha1-K%d-high" round)))
+ (aref block-high idx)
+ (progn
+ (setq sha1-E-high sha1-D-high)
+ (setq sha1-D-high sha1-C-high)
+ (setq sha1-C-high S30B-high)
+ (setq sha1-B-high sha1-A-high)
+ S5A-high)
+ carry)
+ 65536))))
+
+ (defmacro sha1-add-to-H (H X)
+ `(progn
+ (setq ,(intern (format "sha1-%s-low" H))
+ (+ ,(intern (format "sha1-%s-low" H))
+ ,(intern (format "sha1-%s-low" X))))
+ (setq carry (/ ,(intern (format "sha1-%s-low" H)) 65536))
+ (setq ,(intern (format "sha1-%s-low" H))
+ (% ,(intern (format "sha1-%s-low" H)) 65536))
+ (setq ,(intern (format "sha1-%s-high" H))
+ (% (+ ,(intern (format "sha1-%s-high" H))
+ ,(intern (format "sha1-%s-high" X))
+ carry)
+ 65536))))
+ )
+
+;;; buffers (H0 H1 H2 H3 H4).
+(defvar sha1-H0-high)
+(defvar sha1-H0-low)
+(defvar sha1-H1-high)
+(defvar sha1-H1-low)
+(defvar sha1-H2-high)
+(defvar sha1-H2-low)
+(defvar sha1-H3-high)
+(defvar sha1-H3-low)
+(defvar sha1-H4-high)
+(defvar sha1-H4-low)
+
+(defun sha1-block (block-high block-low)
+ (let (;; step (c) --- initialize buffers (A B C D E).
+ (sha1-A-high sha1-H0-high) (sha1-A-low sha1-H0-low)
+ (sha1-B-high sha1-H1-high) (sha1-B-low sha1-H1-low)
+ (sha1-C-high sha1-H2-high) (sha1-C-low sha1-H2-low)
+ (sha1-D-high sha1-H3-high) (sha1-D-low sha1-H3-low)
+ (sha1-E-high sha1-H4-high) (sha1-E-low sha1-H4-low)
+ (idx 16))
+ ;; step (b).
+ (let (;; temporary variables used in sha1-S1 macro.
+ S1W-high S1W-low)
+ (while (< idx 80)
+ (sha1-S1 (logxor (aref block-high (- idx 3))
+ (aref block-high (- idx 8))
+ (aref block-high (- idx 14))
+ (aref block-high (- idx 16)))
+ (logxor (aref block-low (- idx 3))
+ (aref block-low (- idx 8))
+ (aref block-low (- idx 14))
+ (aref block-low (- idx 16))))
+ (aset block-high idx S1W-high)
+ (aset block-low idx S1W-low)
+ (setq idx (1+ idx))))
+ ;; step (d).
+ (setq idx 0)
+ (let (;; temporary variables used in sha1-OP macro.
+ S5A-high S5A-low S30B-high S30B-low carry)
+ (while (< idx 20) (sha1-OP 0) (setq idx (1+ idx)))
+ (while (< idx 40) (sha1-OP 1) (setq idx (1+ idx)))
+ (while (< idx 60) (sha1-OP 2) (setq idx (1+ idx)))
+ (while (< idx 80) (sha1-OP 3) (setq idx (1+ idx))))
+ ;; step (e).
+ (let (;; temporary variables used in sha1-add-to-H macro.
+ carry)
+ (sha1-add-to-H H0 A)
+ (sha1-add-to-H H1 B)
+ (sha1-add-to-H H2 C)
+ (sha1-add-to-H H3 D)
+ (sha1-add-to-H H4 E))))
+
+(defun sha1-binary (string)
+ "Return the SHA1 of STRING in binary form."
+ (let (;; prepare buffers for a block. byte-length of block is 64.
+ ;; input block is split into two vectors.
+ ;;
+ ;; input block: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ...
+ ;; block-high: +-0-+ +-1-+ +-2-+ +-3-+
+ ;; block-low: +-0-+ +-1-+ +-2-+ +-3-+
+ ;;
+ ;; length of each vector is 80, and elements of each vector are
+ ;; 16bit integers. elements 0x10-0x4F of each vector are
+ ;; assigned later in `sha1-block'.
+ (block-high (eval-when-compile (make-vector 80 nil)))
+ (block-low (eval-when-compile (make-vector 80 nil))))
+ (unwind-protect
+ (let* (;; byte-length of input string.
+ (len (length string))
+ (lim (* (/ len 64) 64))
+ (rem (% len 4))
+ (idx 0)(pos 0))
+ ;; initialize buffers (H0 H1 H2 H3 H4).
+ (setq sha1-H0-high 26437 ; (string-to-number "6745" 16)
+ sha1-H0-low 8961 ; (string-to-number "2301" 16)
+ sha1-H1-high 61389 ; (string-to-number "EFCD" 16)
+ sha1-H1-low 43913 ; (string-to-number "AB89" 16)
+ sha1-H2-high 39098 ; (string-to-number "98BA" 16)
+ sha1-H2-low 56574 ; (string-to-number "DCFE" 16)
+ sha1-H3-high 4146 ; (string-to-number "1032" 16)
+ sha1-H3-low 21622 ; (string-to-number "5476" 16)
+ sha1-H4-high 50130 ; (string-to-number "C3D2" 16)
+ sha1-H4-low 57840) ; (string-to-number "E1F0" 16)
+ ;; loop for each 64 bytes block.
+ (while (< pos lim)
+ ;; step (a).
+ (setq idx 0)
+ (while (< idx 16)
+ (aset block-high idx (+ (* (aref string pos) 256)
+ (aref string (1+ pos))))
+ (setq pos (+ pos 2))
+ (aset block-low idx (+ (* (aref string pos) 256)
+ (aref string (1+ pos))))
+ (setq pos (+ pos 2))
+ (setq idx (1+ idx)))
+ (sha1-block block-high block-low))
+ ;; last block.
+ (if (prog1
+ (< (- len lim) 56)
+ (setq lim (- len rem))
+ (setq idx 0)
+ (while (< pos lim)
+ (aset block-high idx (+ (* (aref string pos) 256)
+ (aref string (1+ pos))))
+ (setq pos (+ pos 2))
+ (aset block-low idx (+ (* (aref string pos) 256)
+ (aref string (1+ pos))))
+ (setq pos (+ pos 2))
+ (setq idx (1+ idx)))
+ ;; this is the last (at most) 32bit word.
+ (cond
+ ((= rem 3)
+ (aset block-high idx (+ (* (aref string pos) 256)
+ (aref string (1+ pos))))
+ (setq pos (+ pos 2))
+ (aset block-low idx (+ (* (aref string pos) 256)
+ 128)))
+ ((= rem 2)
+ (aset block-high idx (+ (* (aref string pos) 256)
+ (aref string (1+ pos))))
+ (aset block-low idx 32768))
+ ((= rem 1)
+ (aset block-high idx (+ (* (aref string pos) 256)
+ 128))
+ (aset block-low idx 0))
+ (t ;; (= rem 0)
+ (aset block-high idx 32768)
+ (aset block-low idx 0)))
+ (setq idx (1+ idx))
+ (while (< idx 16)
+ (aset block-high idx 0)
+ (aset block-low idx 0)
+ (setq idx (1+ idx))))
+ ;; last block has enough room to write the length of string.
+ (progn
+ ;; write bit length of string to last 4 bytes of the block.
+ (aset block-low 15 (* (% len 8192) 8))
+ (setq len (/ len 8192))
+ (aset block-high 15 (% len 65536))
+ ;; XXX: It is not practical to compute SHA1 of
+ ;; such a huge message on emacs.
+ ;; (setq len (/ len 65536)) ; for 64bit emacs.
+ ;; (aset block-low 14 (% len 65536))
+ ;; (aset block-high 14 (/ len 65536))
+ (sha1-block block-high block-low))
+ ;; need one more block.
+ (sha1-block block-high block-low)
+ (fillarray block-high 0)
+ (fillarray block-low 0)
+ ;; write bit length of string to last 4 bytes of the block.
+ (aset block-low 15 (* (% len 8192) 8))
+ (setq len (/ len 8192))
+ (aset block-high 15 (% len 65536))
+ ;; XXX: It is not practical to compute SHA1 of
+ ;; such a huge message on emacs.
+ ;; (setq len (/ len 65536)) ; for 64bit emacs.
+ ;; (aset block-low 14 (% len 65536))
+ ;; (aset block-high 14 (/ len 65536))
+ (sha1-block block-high block-low))
+ ;; make output string (in binary form).
+ (let ((result (make-string 20 0)))
+ (aset result 0 (/ sha1-H0-high 256))
+ (aset result 1 (% sha1-H0-high 256))
+ (aset result 2 (/ sha1-H0-low 256))
+ (aset result 3 (% sha1-H0-low 256))
+ (aset result 4 (/ sha1-H1-high 256))
+ (aset result 5 (% sha1-H1-high 256))
+ (aset result 6 (/ sha1-H1-low 256))
+ (aset result 7 (% sha1-H1-low 256))
+ (aset result 8 (/ sha1-H2-high 256))
+ (aset result 9 (% sha1-H2-high 256))
+ (aset result 10 (/ sha1-H2-low 256))
+ (aset result 11 (% sha1-H2-low 256))
+ (aset result 12 (/ sha1-H3-high 256))
+ (aset result 13 (% sha1-H3-high 256))
+ (aset result 14 (/ sha1-H3-low 256))
+ (aset result 15 (% sha1-H3-low 256))
+ (aset result 16 (/ sha1-H4-high 256))
+ (aset result 17 (% sha1-H4-high 256))
+ (aset result 18 (/ sha1-H4-low 256))
+ (aset result 19 (% sha1-H4-low 256))
+ result))
+ ;; do not leave a copy of input string.
+ (fillarray block-high nil)
+ (fillarray block-low nil))))
+
+(defun sha1-string-internal (string &optional binary)
+ (if binary
+ (sha1-binary string)
+ (encode-hex-string (sha1-binary string))))
+
+(defun sha1-region-internal (beg end &optional binary)
+ (sha1-string-internal (buffer-substring-no-properties beg end) binary))
+
+;;;
+;;; application interface.
+;;;
+
+(defun sha1-region (beg end &optional binary)
+ (if (and sha1-use-external
+ sha1-maximum-internal-length
+ (> (abs (- end beg)) sha1-maximum-internal-length))
+ (sha1-region-external beg end binary)
+ (sha1-region-internal beg end binary)))
+
+(defun sha1-string (string &optional binary)
+ (if (and sha1-use-external
+ sha1-maximum-internal-length
+ (> (length string) sha1-maximum-internal-length))
+ (sha1-string-external string binary)
+ (sha1-string-internal string binary)))
+
+;;;###autoload
+(defun sha1 (object &optional beg end binary)
+ "Return the SHA1 (Secure Hash Algorithm) of an object.
+OBJECT is either a string or a buffer.
+Optional arguments BEG and END denote buffer positions for computing the
+hash of a portion of OBJECT.
+If BINARY is non-nil, return a string in binary form."
+ (if (stringp object)
+ (sha1-string object binary)
+ (with-current-buffer object
+ (sha1-region (or beg (point-min)) (or end (point-max)) binary))))
+
+(provide 'sha1)
+
+;; arch-tag: c0f9abd0-ffc1-4557-aac6-ece7f2d4c901
+;;; sha1.el ends here
diff --git a/configure b/configure
new file mode 100755
index 0000000..9154a9e
--- /dev/null
+++ b/configure
@@ -0,0 +1,3592 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.62 for jabber.el 0.7.90.
+#
+# Report bugs to <emacs-jabber-general@lists.sourceforge.net>.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+ if (eval ":") 2>/dev/null; then
+ as_have_required=yes
+else
+ as_have_required=no
+fi
+
+ if test $as_have_required = yes && (eval ":
+(as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=\$LINENO
+ as_lineno_2=\$LINENO
+ test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+ test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+ :
+else
+ as_candidate_shells=
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ case $as_dir in
+ /*)
+ for as_base in sh bash ksh sh5; do
+ as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+ done;;
+ esac
+done
+IFS=$as_save_IFS
+
+
+ for as_shell in $as_candidate_shells $SHELL; do
+ # Try only shells that exist, to save several forks.
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ { ("$as_shell") 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+_ASEOF
+}; then
+ CONFIG_SHELL=$as_shell
+ as_have_required=yes
+ if { "$as_shell" 2> /dev/null <<\_ASEOF
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+:
+(as_func_return () {
+ (exit $1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+ break
+fi
+
+fi
+
+ done
+
+ if test "x$CONFIG_SHELL" != x; then
+ for as_var in BASH_ENV ENV
+ do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+ done
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+ if test $as_have_required = no; then
+ echo This script requires a shell more modern than all the
+ echo shells that I found on your system. Please install a
+ echo modern shell, or manually run the script under such a
+ echo shell if you do have one.
+ { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+ (exit \$1)
+}
+as_func_success () {
+ as_func_return 0
+}
+as_func_failure () {
+ as_func_return 1
+}
+as_func_ret_success () {
+ return 0
+}
+as_func_ret_failure () {
+ return 1
+}
+
+exitcode=0
+if as_func_success; then
+ :
+else
+ exitcode=1
+ echo as_func_success failed.
+fi
+
+if as_func_failure; then
+ exitcode=1
+ echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+ :
+else
+ exitcode=1
+ echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+ exitcode=1
+ echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+ :
+else
+ exitcode=1
+ echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+ echo No shell found that supports shell functions.
+ echo Please tell bug-autoconf@gnu.org about your system,
+ echo including any error possibly output before this message.
+ echo This can help us improve future autoconf versions.
+ echo Configuration will now proceed without shell functions.
+}
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -p'
+ fi
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='jabber.el'
+PACKAGE_TARNAME='emacs-jabber'
+PACKAGE_VERSION='0.7.90'
+PACKAGE_STRING='jabber.el 0.7.90'
+PACKAGE_BUGREPORT='emacs-jabber-general@lists.sourceforge.net'
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+am__isrc
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+MKDIR_P
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+EMACS
+EMACSLOADPATH
+lispdir
+USE_OUR_SHA1_TRUE
+USE_OUR_SHA1_FALSE
+USE_OUR_HEX_UTIL_TRUE
+USE_OUR_HEX_UTIL_FALSE
+LIBOBJS
+LTLIBOBJS'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+with_lispdir
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+EMACS
+EMACSLOADPATH'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
+ { (exit 1); exit 1; }; }
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { $as_echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) { $as_echo "$as_me: error: Unrecognized options: $ac_unrecognized_opts" >&2
+ { (exit 1); exit 1; }; } ;;
+ *) $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ { $as_echo "$as_me: error: Working directory cannot be determined" >&2
+ { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
+ { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
+ { (exit 1); exit 1; }; }
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+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 jabber.el 0.7.90 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --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/emacs-jabber]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of jabber.el 0.7.90:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-lispdir override the default lisp directory
+
+Some influential environment variables:
+ EMACS the Emacs editor command
+ EMACSLOADPATH
+ the Emacs library search path
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <emacs-jabber-general@lists.sourceforge.net>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for guested configure.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+jabber.el configure 0.7.90
+generated by GNU Autoconf 2.62
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+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 jabber.el $as_me 0.7.90, which was
+generated by GNU Autoconf 2.62. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ $as_echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ $as_echo "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ $as_echo "$as_me: caught signal $ac_signal"
+ $as_echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+ ac_site_file1=$CONFIG_SITE
+elif test "x$prefix" != xNONE; then
+ ac_site_file1=$prefix/share/config.site
+ ac_site_file2=$prefix/etc/config.site
+else
+ ac_site_file1=$ac_default_prefix/share/config.site
+ ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+ test "x$ac_site_file" = xNONE && continue
+ if test -r "$ac_site_file"; then
+ { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5
+$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
+ { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5
+$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+am__api_version='1.10'
+
+ac_aux_dir=
+for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
+ if test -f "$ac_dir/install-sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f "$ac_dir/install.sh"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f "$ac_dir/shtool"; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+$as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+$as_echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir (GNU coreutils) '* | \
+ 'mkdir (coreutils) '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+done
+IFS=$as_save_IFS
+
+fi
+
+ if test "${ac_cv_path_mkdir+set}" = set; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ test -d ./--version && rmdir ./--version
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+ [\\/$]* | ?:[\\/]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+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_prog_AWK="$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { $as_echo "$as_me:$LINENO: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+ SET_MAKE=
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='emacs-jabber'
+ VERSION='0.7.90'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+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_prog_STRIP="${ac_tool_prefix}strip"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+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_prog_ac_ct_STRIP="strip"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet. If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+ # If set to t, that means we are running in a shell under Emacs.
+ # If you have an Emacs named "t", then use the full path.
+ test x"$EMACS" = xt && EMACS=
+ for ac_prog in emacs xemacs
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if test "${ac_cv_prog_EMACS+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$EMACS"; then
+ ac_cv_prog_EMACS="$EMACS" # Let the user override the test.
+else
+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_prog_EMACS="$ac_prog"
+ $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+EMACS=$ac_cv_prog_EMACS
+if test -n "$EMACS"; then
+ { $as_echo "$as_me:$LINENO: result: $EMACS" >&5
+$as_echo "$EMACS" >&6; }
+else
+ { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$EMACS" && break
+done
+test -n "$EMACS" || EMACS="no"
+
+
+
+
+# Check whether --with-lispdir was given.
+if test "${with_lispdir+set}" = set; then
+ withval=$with_lispdir; lispdir="$withval"
+ { $as_echo "$as_me:$LINENO: checking where .elc files should go" >&5
+$as_echo_n "checking where .elc files should go... " >&6; }
+ { $as_echo "$as_me:$LINENO: result: $lispdir" >&5
+$as_echo "$lispdir" >&6; }
+else
+
+ { $as_echo "$as_me:$LINENO: checking where .elc files should go" >&5
+$as_echo_n "checking where .elc files should go... " >&6; }
+if test "${am_cv_lispdir+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+
+ if test $EMACS != "no"; then
+ if test x${lispdir+set} != xset; then
+ # If $EMACS isn't GNU Emacs or XEmacs, this can blow up pretty badly
+ # Some emacsen will start up in interactive mode, requiring C-x C-c to exit,
+ # which is non-obvious for non-emacs users.
+ # Redirecting /dev/null should help a bit; pity we can't detect "broken"
+ # emacsen earlier and avoid running this altogether.
+ { ($as_echo "$as_me:$LINENO: \$EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) \"\\n\")) (setq load-path (cdr load-path)))' </dev/null >conftest.out") >&5
+ ($EMACS -batch -q -eval '(while load-path (princ (concat (car load-path) "\n")) (setq load-path (cdr load-path)))' </dev/null >conftest.out) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ am_cv_lispdir=`sed -n \
+ -e 's,/$,,' \
+ -e '/.*\/lib\/x*emacs\/site-lisp$/{s,.*/lib/\(x*emacs/site-lisp\)$,${libdir}/\1,;p;q;}' \
+ -e '/.*\/share\/x*emacs\/site-lisp$/{s,.*/share/\(x*emacs/site-lisp\),${datarootdir}/\1,;p;q;}' \
+ conftest.out`
+ rm conftest.out
+ fi
+ fi
+ test -z "$am_cv_lispdir" && am_cv_lispdir='${datadir}/emacs/site-lisp'
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $am_cv_lispdir" >&5
+$as_echo "$am_cv_lispdir" >&6; }
+ lispdir="$am_cv_lispdir"
+
+fi
+
+
+
+
+
+{ $as_echo "$as_me:$LINENO: checking whether $EMACS has library sha1" >&5
+$as_echo_n "checking whether $EMACS has library sha1... " >&6; }
+if test "${ax_cv_emacs_lib_sha1+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.el <<EOF
+(require 'sha1)
+EOF
+{ ($as_echo "$as_me:$LINENO: \$EMACS -batch -l conftest.el") >&5
+ ($EMACS -batch -l conftest.el) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+if test $ac_status -eq 0; then
+ ax_cv_emacs_lib_sha1=yes
+else
+ ax_cv_emacs_lib_sha1=no
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ax_cv_emacs_lib_sha1" >&5
+$as_echo "$ax_cv_emacs_lib_sha1" >&6; }
+if test $ax_cv_emacs_lib_sha1 = yes; then
+ HAVE_SHA1=yes
+else
+ HAVE_SHA1=no
+fi
+
+
+
+{ $as_echo "$as_me:$LINENO: checking whether $EMACS has library sha1-el" >&5
+$as_echo_n "checking whether $EMACS has library sha1-el... " >&6; }
+if test "${ax_cv_emacs_lib_sha1_el+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.el <<EOF
+(require 'sha1-el)
+EOF
+{ ($as_echo "$as_me:$LINENO: \$EMACS -batch -l conftest.el") >&5
+ ($EMACS -batch -l conftest.el) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+if test $ac_status -eq 0; then
+ ax_cv_emacs_lib_sha1_el=yes
+else
+ ax_cv_emacs_lib_sha1_el=no
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ax_cv_emacs_lib_sha1_el" >&5
+$as_echo "$ax_cv_emacs_lib_sha1_el" >&6; }
+if test $ax_cv_emacs_lib_sha1_el = yes; then
+ HAVE_SHA1_EL=yes
+else
+ HAVE_SHA1_EL=no
+fi
+
+
+
+{ $as_echo "$as_me:$LINENO: checking whether $EMACS has library hex-util" >&5
+$as_echo_n "checking whether $EMACS has library hex-util... " >&6; }
+if test "${ax_cv_emacs_lib_hex_util+set}" = set; then
+ $as_echo_n "(cached) " >&6
+else
+ cat >conftest.el <<EOF
+(require 'hex-util)
+EOF
+{ ($as_echo "$as_me:$LINENO: \$EMACS -batch -l conftest.el") >&5
+ ($EMACS -batch -l conftest.el) 2>&5
+ ac_status=$?
+ $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+if test $ac_status -eq 0; then
+ ax_cv_emacs_lib_hex_util=yes
+else
+ ax_cv_emacs_lib_hex_util=no
+fi
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ax_cv_emacs_lib_hex_util" >&5
+$as_echo "$ax_cv_emacs_lib_hex_util" >&6; }
+if test $ax_cv_emacs_lib_hex_util = yes; then
+ HAVE_HEX_UTIL=yes
+else
+ HAVE_HEX_UTIL=no
+fi
+
+
+
+ if test x$HAVE_SHA1 = xno -a x$HAVE_SHA1_EL = xno; then
+ USE_OUR_SHA1_TRUE=
+ USE_OUR_SHA1_FALSE='#'
+else
+ USE_OUR_SHA1_TRUE='#'
+ USE_OUR_SHA1_FALSE=
+fi
+
+ if test x$HAVE_HEX_UTIL = xno; then
+ USE_OUR_HEX_UTIL_TRUE=
+ USE_OUR_HEX_UTIL_FALSE='#'
+else
+ USE_OUR_HEX_UTIL_TRUE='#'
+ USE_OUR_HEX_UTIL_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files Makefile tests/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+$as_echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) $as_unset $ac_var ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ test "x$cache_file" != "x/dev/null" &&
+ { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+ cat confcache >$cache_file
+ else
+ { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${USE_OUR_SHA1_TRUE}" && test -z "${USE_OUR_SHA1_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"USE_OUR_SHA1\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"USE_OUR_SHA1\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_OUR_HEX_UTIL_TRUE}" && test -z "${USE_OUR_HEX_UTIL_FALSE}"; then
+ { { $as_echo "$as_me:$LINENO: error: conditional \"USE_OUR_HEX_UTIL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"USE_OUR_HEX_UTIL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in
+ *posix*) set -o posix ;;
+esac
+
+fi
+
+
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+ as_echo='printf %s\n'
+ as_echo_n='printf %s'
+else
+ if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+ as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+ as_echo_n='/usr/ucb/echo -n'
+ else
+ as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+ as_echo_n_body='eval
+ arg=$1;
+ case $arg in
+ *"$as_nl"*)
+ expr "X$arg" : "X\\(.*\\)$as_nl";
+ arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+ esac;
+ expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+ '
+ export as_echo_n_body
+ as_echo_n='sh -c $as_echo_n_body as_echo'
+ fi
+ export as_echo_body
+ as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" "" $as_nl"
+
+# Find who we are. Look in the path if we contain no directory separator.
+case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line after each line using $LINENO; the second 'sed'
+ # does the real work. The second script uses 'N' to pair each
+ # line-number line with the line containing $LINENO, and appends
+ # trailing '-' during substitution so that $LINENO is not a special
+ # case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # scripts with optimization help from Paolo Bonzini. Blame Lee
+ # E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+ case `echo 'x\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ *) ECHO_C='\c';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -p'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -p'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -p'
+ fi
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+ as_test_x='test -x'
+else
+ if ls -dL / >/dev/null 2>&1; then
+ as_ls_L_option=L
+ else
+ as_ls_L_option=
+ fi
+ as_test_x='
+ eval sh -c '\''
+ if test -d "$1"; then
+ test -d "$1/.";
+ else
+ case $1 in
+ -*)set "./$1";;
+ esac;
+ case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
+ ???[sx]*):;;*)false;;esac;fi
+ '\'' sh
+ '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by jabber.el $as_me 0.7.90, which was
+generated by GNU Autoconf 2.62. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_version="\\
+jabber.el config.status 0.7.90
+configured by $0, generated by GNU Autoconf 2.62,
+ with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2008 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ $as_echo "$ac_cs_version"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ $as_echo "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { $as_echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
+
+ *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp=
+ trap 'exit_status=$?
+ { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} ||
+{
+ $as_echo "$as_me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=' '
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+
+ if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+ { (exit 1); exit 1; }; }
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[ ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES "
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+$as_echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+ { (exit 1); exit 1; }; };;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+ case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ ac_file_inputs="$ac_file_inputs '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`$as_echo "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$tmp/stdin" \
+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+ { (exit 1); exit 1; }; } ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { as_dir="$ac_dir"
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
+ { (exit 1); exit 1; }; }; }
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+ { (exit 1); exit 1; }; }
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined." >&2;}
+
+ rm -f "$tmp/stdin"
+ case $ac_file in
+ -) cat "$tmp/out" && rm -f "$tmp/out";;
+ *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+ esac \
+ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+
+
+
+ esac
+
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+ { (exit 1); exit 1; }; }
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { $as_echo "$as_me:$LINENO: WARNING: Unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..3e489d9
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,15 @@
+AC_INIT([jabber.el], [0.7.90], [emacs-jabber-general@lists.sourceforge.net], [emacs-jabber])
+AM_INIT_AUTOMAKE([-Wall -Werror foreign dist-zip])
+AC_CONFIG_MACRO_DIR([m4])
+
+AM_PATH_LISPDIR
+
+AX_CHECK_EMACS_LIB([sha1], [HAVE_SHA1=yes], [HAVE_SHA1=no])
+AX_CHECK_EMACS_LIB([sha1-el], [HAVE_SHA1_EL=yes], [HAVE_SHA1_EL=no])
+AX_CHECK_EMACS_LIB([hex-util], [HAVE_HEX_UTIL=yes], [HAVE_HEX_UTIL=no])
+
+AM_CONDITIONAL([USE_OUR_SHA1], [test x$HAVE_SHA1 = xno -a x$HAVE_SHA1_EL = xno])
+AM_CONDITIONAL([USE_OUR_HEX_UTIL], [test x$HAVE_HEX_UTIL = xno])
+
+AC_CONFIG_FILES([Makefile tests/Makefile])
+AC_OUTPUT
diff --git a/elisp-comp b/elisp-comp
new file mode 100755
index 0000000..2d1eb65
--- /dev/null
+++ b/elisp-comp
@@ -0,0 +1,89 @@
+#!/bin/sh
+# Copyright (C) 1995, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+scriptversion=2005-05-14.22
+
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+ '')
+ echo "$0: No files. Try \`$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: elisp-comp [--help] [--version] FILES...
+
+This script byte-compiles all `.el' files listed as FILES using GNU
+Emacs, and put the resulting `.elc' files into the current directory,
+so disregarding the original directories used in `.el' arguments.
+
+This script manages in such a way that all Emacs LISP files to
+be compiled are made visible between themselves, in the event
+they require or load-library one another.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "elisp-comp $scriptversion"
+ exit $?
+ ;;
+esac
+
+if test -z "$EMACS" || test "$EMACS" = "t"; then
+ # Value of "t" means we are running in a shell under Emacs.
+ # Just assume Emacs is called "emacs".
+ EMACS=emacs
+fi
+
+tempdir=elc.$$
+
+# Cleanup the temporary directory on exit.
+trap 'ret=$?; rm -rf "$tempdir" && exit $ret' 0
+trap '(exit $?); exit' 1 2 13 15
+
+mkdir $tempdir
+cp "$@" $tempdir
+
+(
+ cd $tempdir
+ echo "(setq load-path (cons nil load-path))" > script
+ $EMACS -batch -q -l script -f batch-byte-compile *.el || exit $?
+ mv *.elc ..
+) || exit $?
+
+(exit 0); exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/fsm.el b/fsm.el
index 23182b4..e2d4906 100644
--- a/fsm.el
+++ b/fsm.el
@@ -1,9 +1,9 @@
;;; fsm.el --- state machine library
-;; Copyright (C) 2006 Magnus Henoch
+;; Copyright (C) 2006, 2007, 2008 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
-;; Version: 0.1
+;; Version: 0.1ttn4
;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
@@ -46,6 +46,7 @@
;; define-state-machine - create start-FOO function
;; define-state - event handler for each state (required)
;; define-enter-state - called when entering a state (optional)
+;; define-fsm - encapsulates the above three (more sugar!)
;; fsm-send - send an event to a state machine
;; fsm-call - send an event and wait for reply
@@ -53,14 +54,66 @@
;; <URL:http://fresh.homeunix.net/~luke/distel/>
;; Emacs' tq library is a similar idea.
+;; Here is a simple (not using all the features of fsm.el) example:
+;;
+;; (require 'cl)
+;; (labels ((hey (n ev)
+;; (message "%d (%s)\tp%sn%s!" n ev
+;; (if (zerop (% n 4)) "o" "i")
+;; (make-string (max 1 (abs n)) ?g))))
+;; (macrolet ((zow (next timeout)
+;; `(progn (hey (incf count) event)
+;; (list ,next count ,timeout))))
+;; (define-fsm pingpong
+;; :start ((init) "Start a pingpong fsm."
+;; (interactive "nInit (number, negative to auto-terminate): ")
+;; (list :ping (ash (ash init -2) 2) ; 4 is death
+;; (when (interactive-p) 0)))
+;; :state-data-name count
+;; :states
+;; ((:ping
+;; (:event (zow :pingg 0.1)))
+;; (:pingg
+;; (:event (zow :pinggg 0.1)))
+;; (:pinggg
+;; (:event (zow :pong 1)))
+;; (:pong
+;; (:event (zow :ping (if (= 0 count)
+;; (fsm-goodbye-cruel-world 'pingpong)
+;; 3))))))))
+;;
+;; (fsm-send (start-pingpong -16) t)
+;;
+;; Copy into a buffer, uncomment, and type M-x eval-buffer RET.
+;; Alternatively, you can replace the `fsm-goodbye-cruel-world'
+;; form with `nil', eval just the `labels' form and then type
+;; M-x start-pingpong RET -16 RET.
+
+;; NOTE: This is version 0.1ttn4 of fsm.el, with the following
+;; mods (an exercise in meta-meta-programming ;-) by ttn:
+;; -- Refill for easy (traditional 80-column) perusal.
+;; -- New var `fsm-debug-timestamp-format'.
+;; -- Make variables satisfy `user-variable-p'.
+;; -- Use `format' instead of `concat'.
+;; -- New func `fsm-goodbye-cruel-world'.
+;; -- Make start-function respect `interactive' spec.
+;; -- Make enter-/event-functions anonymous.
+;; -- New macro `define-fsm'.
+;; -- Example usage in Commentary.
+
;;; Code:
(eval-when-compile (require 'cl))
(defvar fsm-debug "*fsm-debug*"
- "Name of buffer for fsm debug messages.
+ "*Name of buffer for fsm debug messages.
If nil, don't output debug messages.")
+(defvar fsm-debug-timestamp-format nil
+ "*Timestamp format (a string) for `fsm-debug-output'.
+Default format is whatever `current-time-string' returns
+followed by a colon and a space.")
+
(defun fsm-debug-output (format &rest args)
"Append debug output to buffer named by `fsm-debug'.
FORMAT and ARGS are passed to `format'."
@@ -68,7 +121,10 @@ FORMAT and ARGS are passed to `format'."
(with-current-buffer (get-buffer-create fsm-debug)
(save-excursion
(goto-char (point-max))
- (insert (current-time-string) ": " (apply 'format format args) "\n")))))
+ (insert (if fsm-debug-timestamp-format
+ (format-time-string fsm-debug-timestamp-format)
+ (concat (current-time-string) ": "))
+ (apply 'format format args) "\n")))))
(defmacro* define-state-machine (name &key start sleep)
"Define a state machine class called NAME.
@@ -88,25 +144,40 @@ default, which is accept-process-output with rearranged
arguments.
\(fn NAME :start ((ARG ...) DOCSTRING BODY) [:sleep SLEEP-FUNCTION])"
- (let ((start-name (intern (concat "start-" (symbol-name name)))))
+ (declare (debug (&define name :name start
+ &rest
+ &or [":start"
+ (lambda-list
+ [&optional ("interactive" interactive)]
+ stringp def-body)]
+ [":sleep" function-form])))
+ (let ((start-name (intern (format "start-%s" name)))
+ interactive-spec)
(destructuring-bind (arglist docstring &body body) start
+ (when (and (consp (car body)) (eq 'interactive (caar body)))
+ (setq interactive-spec (list (pop body))))
(unless (stringp docstring)
(error "Docstring is not a string"))
`(progn
+ (put ',name :fsm-enter (make-hash-table :size 11 :test 'eq))
+ (put ',name :fsm-event (make-hash-table :size 11 :test 'eq))
(defun ,start-name ,arglist
,docstring
+ ,@interactive-spec
(fsm-debug-output "Starting %s" ',name)
(let ((fsm (list :fsm ',name)))
(destructuring-bind (state state-data &optional timeout)
(progn ,@body)
(nconc fsm (list :state nil :state-data nil
- :sleep ,(or sleep (lambda (secs) (accept-process-output nil secs)))
+ :sleep ,(or sleep (lambda (secs)
+ (accept-process-output
+ nil secs)))
:deferred nil))
(fsm-update fsm state state-data timeout)
fsm)))))))
-(defmacro* define-state (fsm state-name arglist &body body)
- "Define a state called STATE-NAME in the state machine FSM.
+(defmacro* define-state (fsm-name state-name arglist &body body)
+ "Define a state called STATE-NAME in the state machine FSM-NAME.
ARGLIST and BODY make a function that gets called when the state
machine receives an event in this state. The arguments are:
@@ -132,12 +203,12 @@ TIMEOUT A number: send timeout event after this many seconds
Alternatively, the function may return the keyword :defer, in
which case the event will be resent when the state machine enters
another state."
- (let ((fn-name (intern (concat "fsm-" (symbol-name fsm) "-" (symbol-name state-name)))))
- `(defun ,fn-name ,arglist
- ,@body)))
+ (declare (debug (&define name name :name handler lambda-list def-body)))
+ `(setf (gethash ',state-name (get ',fsm-name :fsm-event))
+ (lambda ,arglist ,@body)))
-(defmacro* define-enter-state (fsm state-name arglist &body body)
- "Define a function to call when FSM enters the state STATE-NAME.
+(defmacro* define-enter-state (fsm-name state-name arglist &body body)
+ "Define a function to call when FSM-NAME enters the state STATE-NAME.
ARGLIST and BODY make a function that gets called when the state
machine enters this state. The arguments are:
@@ -151,9 +222,62 @@ NEW-STATE-DATA An object
TIMEOUT A number: send timeout event after this many seconds
nil: cancel existing timer
:keep: let existing timer continue"
- (let ((fn-name (intern (concat "fsm-" (symbol-name fsm) "-enter-" (symbol-name state-name)))))
- `(defun ,fn-name ,arglist
- ,@body)))
+ (declare (debug (&define name name :name enter lambda-list def-body)))
+ `(setf (gethash ',state-name (get ',fsm-name :fsm-enter))
+ (lambda ,arglist ,@body)))
+
+(defmacro* define-fsm (name &key
+ start sleep states
+ (fsm-name 'fsm)
+ (state-data-name 'state-data)
+ (callback-name 'callback)
+ (event-name 'event))
+ "Define a state machine class called NAME, along with its STATES.
+This macro is (further) syntatic sugar for `define-state-machine',
+`define-state' and `define-enter-state' macros, q.v.
+
+NAME is a symbol. Everything else is specified with a keyword arg.
+
+START and SLEEP are the same as for `define-state-machine'.
+
+STATES is a list, each element having the form (STATE-NAME . STATE-SPEC).
+STATE-NAME is a symbol. STATE-SPEC is an alist with keys `:event' or
+`:enter', and values a series of expressions representing the BODY of
+a `define-state' or `define-enter-state' call, respectively.
+
+FSM-NAME, STATE-DATA-NAME, CALLBACK-NAME, and EVENT-NAME are symbols,
+used to construct the state functions' arglists."
+ `(progn
+ (define-state-machine ,name :start ,start :sleep ,sleep)
+ ,@(loop for (state-name . spec) in states
+ if (assq :enter spec) collect
+ `(define-enter-state ,name ,state-name
+ (,fsm-name ,state-data-name)
+ ,@(cdr it))
+ end
+ if (assq :event spec) collect
+ `(define-state ,name ,state-name
+ (,fsm-name ,state-data-name
+ ,event-name
+ ,callback-name)
+ ,@(cdr it))
+ end)))
+
+(defun fsm-goodbye-cruel-world (name)
+ "Unbind functions related to fsm NAME (a symbol).
+Includes start-NAME, and each fsm-NAME-STATE and fsm-NAME-enter-STATE.
+Functions are `fmakunbound', which will probably give (fatal) pause to
+any state machines using them. Return nil."
+ (interactive "SUnbind function definitions for fsm named: ")
+ (fmakunbound (intern (format "start-%s" name)))
+ (let (ht)
+ (when (hash-table-p (setq ht (get name :fsm-event)))
+ (clrhash ht)
+ (remprop name :fsm-event))
+ (when (hash-table-p (setq ht (get name :fsm-enter)))
+ (clrhash ht)
+ (remprop name :fsm-enter)))
+ nil)
(defun fsm-start-timer (fsm secs)
"Send a timeout event to FSM after SECS seconds.
@@ -192,7 +316,8 @@ CALLBACK with the response as only argument."
(run-with-timer 0.1 nil #'fsm-send-sync fsm event callback))
(defun fsm-update (fsm new-state new-state-data timeout)
- (let ((old-state (plist-get (cddr fsm) :state)))
+ (let ((fsm-name (cadr fsm))
+ (old-state (plist-get (cddr fsm) :state)))
(plist-put (cddr fsm) :state new-state)
(plist-put (cddr fsm) :state-data new-state-data)
(fsm-maybe-change-timer fsm timeout)
@@ -200,13 +325,18 @@ CALLBACK with the response as only argument."
;; On state change, call enter function and send deferred events
;; again.
(unless (eq old-state new-state)
- (fsm-debug-output "%s enters %s" (cadr fsm) new-state)
- (let ((enter-fn (intern (concat "fsm-" (symbol-name (cadr fsm)) "-enter-" (symbol-name new-state)))))
+ (fsm-debug-output "%s enters %s" fsm-name new-state)
+ (let ((enter-fn (gethash new-state (get fsm-name :fsm-enter))))
(when (functionp enter-fn)
- (destructuring-bind (newer-state-data newer-timeout)
- (funcall enter-fn fsm new-state-data)
- (plist-put (cddr fsm) :state-data newer-state-data)
- (fsm-maybe-change-timer fsm newer-timeout))))
+ (fsm-debug-output "Found enter function for %S: %S" new-state enter-fn)
+ (condition-case e
+ (destructuring-bind (newer-state-data newer-timeout)
+ (funcall enter-fn fsm new-state-data)
+ (fsm-debug-output "Using data from enter function")
+ (plist-put (cddr fsm) :state-data newer-state-data)
+ (fsm-maybe-change-timer fsm newer-timeout))
+ ((debug error)
+ (fsm-debug-output "Didn't work: %S" e)))))
(let ((deferred (nreverse (plist-get (cddr fsm) :deferred))))
(setf (cddr fsm)
@@ -222,23 +352,27 @@ CALLBACK with the response as only argument."
(let* ((fsm-name (second fsm))
(state (plist-get (cddr fsm) :state))
(state-data (plist-get (cddr fsm) :state-data))
- (state-fn (intern (concat "fsm-" (symbol-name fsm-name)
- "-" (symbol-name state)))))
+ (state-fn (gethash state (get fsm-name :fsm-event))))
;; If the event is a list, output only the car, to avoid an
;; overflowing debug buffer.
- (fsm-debug-output "Sent %S to %s in state %s" (or (car-safe event) event) fsm-name state)
+ (fsm-debug-output "Sent %S to %s in state %s"
+ (or (car-safe event) event) fsm-name state)
(let ((result (condition-case e
- (funcall state-fn fsm state-data event (or callback 'ignore))
- (error (cons :error-signaled e)))))
+ (funcall state-fn fsm state-data event
+ (or callback 'ignore))
+ ((debug error) (cons :error-signaled e)))))
;; Special case for deferring an event until next state change.
(cond
((eq result :defer)
(let ((deferred (plist-get (cddr fsm) :deferred)))
- (plist-put (cddr fsm) :deferred (cons (list event callback) deferred))))
+ (plist-put (cddr fsm) :deferred
+ (cons (list event callback) deferred))))
((null result)
- (fsm-debug-output "Warning: event %S ignored in state %s" event state))
+ (fsm-debug-output "Warning: event %S ignored in state %s/%s" event fsm-name state))
((eq (car-safe result) :error-signaled)
- (fsm-debug-output "Error: %s" (error-message-string (cdr result))))
+ (fsm-debug-output "Error in %s/%s: %s"
+ fsm-name state
+ (error-message-string (cdr result))))
(t
(destructuring-bind (new-state new-state-data &optional timeout) result
(fsm-update fsm new-state new-state-data timeout))))))))
@@ -271,5 +405,12 @@ Events sent are of the form (:sentinel PROCESS STRING)."
"Sleep up to SECS seconds in a way that lets FSM receive events."
(funcall (plist-get (cddr fsm) :sleep) secs))
+(defun fsm-get-state-data (fsm)
+ "Return the state data of FSM.
+Note the absence of a set function. The fsm should manage its
+state data itself; other code should just send messages to it."
+ (plist-get (cddr fsm) :state-data))
+
(provide 'fsm)
+
;;; fsm.el ends here
diff --git a/html/Account-settings.html b/html/Account-settings.html
deleted file mode 100644
index f0dd9ac..0000000
--- a/html/Account-settings.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<html lang="en">
-<head>
-<title>Account settings - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Customization.html#Customization" title="Customization">
-<link rel="next" href="Connection-settings.html#Connection-settings" title="Connection settings">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Account-settings"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Connection-settings.html#Connection-settings">Connection settings</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Customization.html#Customization">Customization</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.1 Account settings</h3>
-
-<p><a name="index-jabber_002dusername-158"></a><a name="index-jabber_002dserver-159"></a><a name="index-jabber_002dpassword-160"></a><a name="index-jabber_002dresource-161"></a><a name="index-jabber_002ddefault_002dpriority-162"></a><a name="index-jabber_002dnickname-163"></a><a name="index-Username-164"></a><a name="index-Resource-165"></a>
-<code>jabber-username</code> is the username part of your JID.
-
- <p><code>jabber-server</code> is the JID of your server, i.e. the hostname part
-of your JID. This is usually, but not necessarily, the same as the
-hostname of the server.
-
- <p><code>jabber-password</code> is your password. You have the option to set
-it here, in which case it will be stored in cleartext in your
-<span class="file">.emacs</span> file. If this is set to <code>nil</code>, you will be prompted for
-your password every time you connect.
-
- <p><code>jabber-resource</code> is the resource you want to log in under. This
-only matters if you are connected to the same account from different
-clients or different computers, since each connection must have a
-unique resource. You might want to set this to your hostname.
-
- <p><code>jabber-default-priority</code> is the default priority sent with your
-presence. Regardless of what you have here, you can change your
-priority during a session with <code>jabber-send-presence</code>.
-See <a href="Presence.html#Presence">Presence</a>, for more information on priority.
-
- <p><code>jabber-nickname</code> is your default nickname for groupchats.
-
- </body></html>
-
diff --git a/html/Ad_002dHoc-Commands.html b/html/Ad_002dHoc-Commands.html
deleted file mode 100644
index ce57985..0000000
--- a/html/Ad_002dHoc-Commands.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<html lang="en">
-<head>
-<title>Ad-Hoc Commands - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Services.html#Services" title="Services">
-<link rel="prev" href="Searching.html#Searching" title="Searching">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Ad_002dHoc-Commands"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Searching.html#Searching">Searching</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Services.html#Services">Services</a>
-<hr><br>
-</div>
-
-<h3 class="section">6.4 Ad-Hoc Commands</h3>
-
-<p><a name="index-Ad_002dHoc-Commands-82"></a><a name="index-jabber_002dahc_002dget_002dlist-83"></a><a name="index-jabber_002dahc_002dexecute_002dcommand-84"></a>
-jabber.el supports a subset of XEP-0050, the standard for Ad-Hoc
-Commands. As the name implies, this can be used for just about
-anything. It has been used for remote-controlling clients (e.g. Psi),
-and administering services (e.g. PyMSNt).
-
- <p>Currently, jabber.el uses ad-hoc commands for setting presence remotely.
-If you realize that you forgot to set your client to &ldquo;away&rdquo; with a low
-priority, you can do it remotely.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>
-
- <p>The commands for executing ad-hoc commands are available under the
-Service menu, which is opened by typing <kbd>C-c C-s</kbd>.
-
- <p>To find which commands are available, run &ldquo;Request command-list&rdquo;
-(<code>jabber-ahc-get-list</code>).<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a>
-
- <p>To run a command from the list, put point over it and run &ldquo;Execute
-command&rdquo; (<code>jabber-ahc-execute-command</code>), accepting the defaults
-for JID and node. (If you already know those, you could of course
-enter them yourself) The form you get should hopefully be
-self-explanatory.
-
- <div class="footnote">
-<hr>
-<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> Most Jabber servers also
-support kicking a client off the net by logging in with another client
-with exactly the same resource.</p>
-
- <p class="footnote"><small>[<a name="fn-2" href="#fnd-2">2</a>]</small> This is the same thing as a
-disco items request to the node
-<code>http://jabber.org/protocol/commands</code>.</p>
-
- <p><hr></div>
-
- </body></html>
-
diff --git a/html/Autoaway.html b/html/Autoaway.html
deleted file mode 100644
index 6916b6d..0000000
--- a/html/Autoaway.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<html lang="en">
-<head>
-<title>Autoaway - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="prev" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="next" href="Modeline-status.html#Modeline-status" title="Modeline status">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Autoaway"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Modeline-status.html#Modeline-status">Modeline status</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Useful-features.html#Useful-features">Useful features</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Useful-features.html#Useful-features">Useful features</a>
-<hr><br>
-</div>
-
-<h3 class="section">10.1 Autoaway</h3>
-
-<p><a name="index-autoaway-100"></a><a name="index-idle-101"></a><a name="index-xprintidle-102"></a><a name="index-jabber_002dautoaway_002dmethod-103"></a>
-It is possible to automatically set your status to &ldquo;away&rdquo; when you
-haven't used your computer for a while. This lets your contacts know
-that you might not answer immediately.
-
- <p>To activate this feature, add <code>jabber-autoaway-start</code> to
-<code>jabber-post-connect-hook</code>, e.g:
-<pre class="example"> (add-hook 'jabber-post-connect-hook 'jabber-autoaway-start)
-</pre>
- <p>There are different methods to find how long you have been &ldquo;idle&rdquo;.
-The method to use is specified by <code>jabber-autoaway-method</code>. The
-value of this variable should be a function that returns the number of
-seconds you have been idle. Three functions are provided.
-
- <p>If you are running Emacs 22 and thus have the <code>current-idle-time</code>
-function, it is used by default. Note that this method only measures
-the time since you last interacted with Emacs, and thus disregards
-activity in other programs.
-
- <p>If you are using the X Window System, you can use the
-<a href="http://www.dtek.chalmers.se/~henoch/text/xprintidle.html">xprintidle</a> program. Make sure that <code>jabber-xprintidle-program</code> is
-set to the correct file name. This uses the same method as XScreensaver
-to find your idle time.
-
- <p>If you are using Emacs on a GNU/Linux terminal, the function
-<code>jabber-termatime-get-idle-time</code> is used by default.
-
- </body></html>
-
diff --git a/html/Automation.html b/html/Automation.html
deleted file mode 100644
index dd117c2..0000000
--- a/html/Automation.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<html lang="en">
-<head>
-<title>Automation - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Groupchat.html#Groupchat" title="Groupchat">
-<link rel="prev" href="Groupchat.html#Groupchat" title="Groupchat">
-<link rel="next" href="Invitations.html#Invitations" title="Invitations">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Automation"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Invitations.html#Invitations">Invitations</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Groupchat.html#Groupchat">Groupchat</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Groupchat.html#Groupchat">Groupchat</a>
-<hr><br>
-</div>
-
-<h3 class="section">3.1 Automation</h3>
-
-<p><a name="index-jabber_002dmuc_002ddefault_002dnicknames-38"></a><a name="index-jabber_002dmuc_002dautojoin-39"></a><a name="index-jabber_002dmuc_002dautojoin-40"></a><a name="index-Default-MUC-nickname-41"></a><a name="index-Autojoin-chat-rooms-42"></a>
-You can select a default nickname by setting <code>jabber-nickname</code>.
-Additionally, you can set different nicknames for different groups, by
-customizing <code>jabber-muc-default-nicknames</code>. There you specify
-the JID of the group, and your preferred nickname.
-
- <p>If you want to automatically join certain rooms when connecting, you
-can set <code>jabber-muc-autojoin</code> to a list containing the JIDs of
-the rooms you want to enter. To disable this feature, remove
-<code>jabber-muc-autojoin</code> from <code>jabber-post-connect-hook</code>.
-
- </body></html>
-
diff --git a/html/Avatars.html b/html/Avatars.html
deleted file mode 100644
index 64315bb..0000000
--- a/html/Avatars.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html lang="en">
-<head>
-<title>Avatars - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Personal-information.html#Personal-information" title="Personal information">
-<link rel="next" href="Time-queries.html#Time-queries" title="Time queries">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Avatars"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Time-queries.html#Time-queries">Time queries</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Personal-information.html#Personal-information">Personal information</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">8 Avatars</h2>
-
-<p><a name="index-avatars-89"></a><a name="index-jabber_002dvcard_002davatars_002dretrieve-90"></a><a name="index-jabber_002dvcard_002davatars_002dpublish-91"></a><a name="index-jabber_002davatar_002dcache_002ddirectory-92"></a>
-jabber.el supports viewing and publishing avatars according to XEP-0153,
-vCard-Based Avatars. By default, if you have an avatar in your vCard
-(see <a href="Personal-information.html#Personal-information">Personal information</a>), it will be published for others to see,
-and if other people publish their avatars, they will be displayed in the
-roster buffer and in the header line of chat buffers, assuming that your
-Emacs can display images.
-
- <p>To disable retrieval of other people's avatars, set
-<code>jabber-vcard-avatars-retrieve</code> to nil. To disable publishing of
-your own avatar, set <code>jabber-vcard-avatars-publish</code> to nil.
-
- <p>Avatars are cached in the directory specified by
-<code>jabber-avatar-cache-directory</code>, by default
-<span class="file">~/.jabber-avatars/</span>. The cache is never cleaned, so you might
-want to do that yourself from time to time.
-
- </body></html>
-
diff --git a/html/Basic-operation.html b/html/Basic-operation.html
deleted file mode 100644
index c6399dd..0000000
--- a/html/Basic-operation.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html lang="en">
-<head>
-<title>Basic operation - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Introduction.html#Introduction" title="Introduction">
-<link rel="next" href="Groupchat.html#Groupchat" title="Groupchat">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Basic-operation"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Groupchat.html#Groupchat">Groupchat</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Introduction.html#Introduction">Introduction</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">2 Basic operation</h2>
-
-<p>This chapter is intended as an introduction to basic usage of
-jabber.el. If you have used Jabber before and are familiar with the
-terminology, you might find it a bit too basic &mdash; in that case, just
-skim it, making sure to pick up the commands mentioned.
-
- <p>There are a handful of global keybindings for common commands. They
-start with <kbd>C-x C-j</kbd>, and you can get a list of them by typing
-<kbd>C-x C-j C-h</kbd>.
-
-<ul class="menu">
-<li><a accesskey="1" href="Connecting.html#Connecting">Connecting</a>
-<li><a accesskey="2" href="Chatting.html#Chatting">Chatting</a>
-<li><a accesskey="3" href="Presence.html#Presence">Presence</a>
-<li><a accesskey="4" href="Presence-subscription.html#Presence-subscription">Presence subscription</a>
-<li><a accesskey="5" href="Roster-buffer.html#Roster-buffer">Roster buffer</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Chat-printers.html b/html/Chat-printers.html
deleted file mode 100644
index 8daeb27..0000000
--- a/html/Chat-printers.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<html lang="en">
-<head>
-<title>Chat printers - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="Extending-service-discovery.html#Extending-service-discovery" title="Extending service discovery">
-<link rel="next" href="Stanza-chains.html#Stanza-chains" title="Stanza chains">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Chat-printers"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Stanza-chains.html#Stanza-chains">Stanza chains</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.6 Chat printers</h3>
-
-<p><a name="index-jabber_002dchat_002dprinters-244"></a><a name="index-jabber_002dmuc_002dprinters-245"></a><a name="index-jabber_002dbody_002dprinters-246"></a><a name="index-Chat-printers-247"></a><a name="index-Body-printers-248"></a>
-Chat printers are functions that print a certain aspect of an incoming
-message in a chat buffer. Included are functions for printing subjects
-(<code>jabber-chat-print-subject</code>), bodies
-(<code>jabber-chat-print-body</code>, and <code>jabber:x:oob</code>-style URLs
-(<code>jabber-chat-print-url</code>). The functions in
-<code>jabber-chat-printers</code> are called in order, with the entire
-<code>&lt;message/&gt;</code> stanza as argument, and are expected to call
-<code>insert</code> if they have anything to add.
-
- <p>For MUC, the functions in <code>jabber-muc-printers</code> are prepended to
-those in <code>jabber-chat-printers</code>.
-
- <p>Body printers are a subgroup of chat printers. They are exclusive; only
-one of them applies to any given message. The idea is that
-&ldquo;higher-quality&rdquo; parts of the message override pieces included for
-backwards compatibility. Included are <code>jabber-muc-print-invite</code>
-and <code>jabber-chat-normal-body</code>; functions for XHTML-IM and PGP
-encrypted messages may be written in the future. The functions in
-<code>jabber-body-printers</code> are called in order until one of them
-returns non-nil.
-
- </body></html>
-
diff --git a/html/Chatting.html b/html/Chatting.html
deleted file mode 100644
index 4bd3196..0000000
--- a/html/Chatting.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<html lang="en">
-<head>
-<title>Chatting - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="prev" href="Connecting.html#Connecting" title="Connecting">
-<link rel="next" href="Presence.html#Presence" title="Presence">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Chatting"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Presence.html#Presence">Presence</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Connecting.html#Connecting">Connecting</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Basic-operation.html#Basic-operation">Basic operation</a>
-<hr><br>
-</div>
-
-<h3 class="section">2.2 Chatting</h3>
-
-<p><a name="index-Chatting-5"></a><a name="index-jabber_002dchat_002dwith-6"></a>
-There are several ways to open a chat buffer. The shortest way is to
-put point over the person you want to chat with in the roster display
-and hit RET.
-
- <p>You can also use menus to access commands. In the roster display, you
-can access several menus through keystrokes or mouse clicks. You can
-bring one big menu up by pressing the second mouse button, or you can
-bring up the &ldquo;chat menu&rdquo; by typing <kbd>C-c C-c</kbd>. If you do the
-latter while point is on a roster entry, that entry will be the
-default value when you are asked for whom to chat with.
-
- <p>You can also use the function <code>jabber-chat-with</code>, which is what the
-menu item is bound to. This function is bound to <kbd>C-x C-j C-j</kbd> in
-the global keymap.
-
- <p>Now, try opening a chat with someone. A buffer named
-<code>*-jabber-chat-:-</code><var>person</var><code>-*</code> will be created and selected.
-Type your message at the end of the buffer, and hit <kbd>RET</kbd> to send
-it. To include a newline in your message, use <kbd>C-j</kbd>.
-
- </body></html>
-
diff --git a/html/Composing-messages.html b/html/Composing-messages.html
deleted file mode 100644
index af2a0ff..0000000
--- a/html/Composing-messages.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<html lang="en">
-<head>
-<title>Composing messages - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Groupchat.html#Groupchat" title="Groupchat">
-<link rel="next" href="File-transfer.html#File-transfer" title="File transfer">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Composing-messages"></a>Next:&nbsp;<a rel="next" accesskey="n" href="File-transfer.html#File-transfer">File transfer</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Groupchat.html#Groupchat">Groupchat</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">4 Composing messages</h2>
-
-<p><a name="index-jabber_002dcompose-55"></a><a name="index-composing-messages-56"></a><a name="index-message-composition-57"></a>
-The chat buffer interface can be inconvenient for some purposes. As you
-can't use <kbd>RET</kbd> to insert a newline (use <kbd>C-j</kbd> for that),
-writing a longer message can be painful. Also, it is not possible to
-include a subject in the message, or send the message to multiple
-recipients.
-
- <p>These features are implemented by the message composing tool. Type
-<kbd>M-x jabber-compose</kbd> to start it. In the buffer that comes up, you
-can specify recipients, enter a subject, and type your message.
-
- </body></html>
-
diff --git a/html/Concept-index.html b/html/Concept-index.html
deleted file mode 100644
index 82444b1..0000000
--- a/html/Concept-index.html
+++ /dev/null
@@ -1,153 +0,0 @@
-<html lang="en">
-<head>
-<title>Concept index - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="next" href="Function-index.html#Function-index" title="Function index">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Concept-index"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Function-index.html#Function-index">Function index</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Protocol-support.html#Protocol-support">Protocol support</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="unnumbered">Concept index</h2>
-
-<ul class="index-cp" compact>
-<li><a href="Registering.html#index-Account-removal-77">Account removal</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Tracking-activity.html#index-Activity-114">Activity</a>: <a href="Tracking-activity.html#Tracking-activity">Tracking activity</a></li>
-<li><a href="Ad_002dHoc-Commands.html#index-Ad_002dHoc-Commands-82">Ad-Hoc Commands</a>: <a href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">Ad-Hoc Commands</a></li>
-<li><a href="MUC-Administration.html#index-Affiliations_002c-MUC-53">Affiliations, MUC</a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="Customizing-alerts.html#index-Alert-hooks-207">Alert hooks</a>: <a href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a></li>
-<li><a href="Standard-alerts.html#index-Alerts-209">Alerts</a>: <a href="Standard-alerts.html#Standard-alerts">Standard alerts</a></li>
-<li><a href="Autoaway.html#index-autoaway-100">autoaway</a>: <a href="Autoaway.html#Autoaway">Autoaway</a></li>
-<li><a href="Automation.html#index-Autojoin-chat-rooms-42">Autojoin chat rooms</a>: <a href="Automation.html#Automation">Automation</a></li>
-<li><a href="Avatars.html#index-avatars-89">avatars</a>: <a href="Avatars.html#Avatars">Avatars</a></li>
-<li><a href="Message-history.html#index-Backlog-127">Backlog</a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="MUC-Administration.html#index-Banning_002c-MUC-54">Banning, MUC</a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="Chat-printers.html#index-Body-printers-248">Body printers</a>: <a href="Chat-printers.html#Chat-printers">Chat printers</a></li>
-<li><a href="Services.html#index-Browse-buffers-66">Browse buffers</a>: <a href="Services.html#Services">Services</a></li>
-<li><a href="XMPP-URIs.html#index-browser-integration-154">browser integration</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Service-discovery-and-browsing.html#index-Browsing-68">Browsing</a>: <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a></li>
-<li><a href="Registering.html#index-Cancelling-registration-73">Cancelling registration</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Groupchat.html#index-Changing-nickname-29">Changing nickname</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Registering.html#index-Changing-password-74">Changing password</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-Chat-buffer-189">Chat buffer</a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Chat-printers.html#index-Chat-printers-247">Chat printers</a>: <a href="Chat-printers.html#Chat-printers">Chat printers</a></li>
-<li><a href="Groupchat.html#index-Chatrooms-26">Chatrooms</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Chatting.html#index-Chatting-5">Chatting</a>: <a href="Chatting.html#Chatting">Chatting</a></li>
-<li><a href="Message-events.html#index-Composing-137">Composing</a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Composing-messages.html#index-composing-messages-56">composing messages</a>: <a href="Composing-messages.html#Composing-messages">Composing messages</a></li>
-<li><a href="Connecting.html#index-Connecting-3">Connecting</a>: <a href="Connecting.html#Connecting">Connecting</a></li>
-<li><a href="Connection-settings.html#index-Connection-settings-170">Connection settings</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Customization.html#index-Customization-157">Customization</a>: <a href="Customization.html#Customization">Customization</a></li>
-<li><a href="Automation.html#index-Default-MUC-nickname-41">Default MUC nickname</a>: <a href="Automation.html#Automation">Automation</a></li>
-<li><a href="Message-events.html#index-Delivered-138">Delivered</a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Keepalive.html#index-Detecting-lost-connections-109">Detecting lost connections</a>: <a href="Keepalive.html#Keepalive">Keepalive</a></li>
-<li><a href="Presence.html#index-directed-presence-14">directed presence</a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Message-events.html#index-Displayed-139">Displayed</a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Roster-import-and-export.html#index-Export-roster-146">Export roster</a>: <a href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-Faces_002c-chat-buffer-191">Faces, chat buffer</a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="File-transfer.html#index-File-transfer-58">File transfer</a>: <a href="File-transfer.html#File-transfer">File transfer</a></li>
-<li><a href="Sending-files.html#index-file-transfer-proxy-61">file transfer proxy</a>: <a href="Sending-files.html#Sending-files">Sending files</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-Filling-long-lines-in-chat-buffer-206">Filling long lines in chat buffer</a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Spell-checking.html#index-flyspell-124">flyspell</a>: <a href="Spell-checking.html#Spell-checking">Spell checking</a></li>
-<li><a href="Registering.html#index-Gateway-registration-75">Gateway registration</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Connection-settings.html#index-GnuTLS-176">GnuTLS</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Groupchat.html#index-Groupchat-24">Groupchat</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Message-history.html#index-History-126">History</a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Autoaway.html#index-idle-101">idle</a>: <a href="Autoaway.html#Autoaway">Autoaway</a></li>
-<li><a href="Time-queries.html#index-idle-time_002c-query-98">idle time, query</a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="Roster-import-and-export.html#index-Import-roster-147">Import roster</a>: <a href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a></li>
-<li><a href="Invitations.html#index-Invitations-43">Invitations</a>: <a href="Invitations.html#Invitations">Invitations</a></li>
-<li><a href="Groupchat.html#index-Joining-a-groupchat-28">Joining a groupchat</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Keepalive.html#index-Keepalive-108">Keepalive</a>: <a href="Keepalive.html#Keepalive">Keepalive</a></li>
-<li><a href="Roster-buffer.html#index-Key-bindings-22">Key bindings</a>: <a href="Roster-buffer.html#Roster-buffer">Roster buffer</a></li>
-<li><a href="MUC-Administration.html#index-Kicking_002c-MUC-48">Kicking, MUC</a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="Time-queries.html#index-last-online-95">last online</a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="XMPP-URIs.html#index-links-150">links</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Roster-buffer.html#index-Menus-21">Menus</a>: <a href="Roster-buffer.html#Roster-buffer">Roster buffer</a></li>
-<li><a href="Miscellaneous-settings.html#index-Menus-179">Menus</a>: <a href="Miscellaneous-settings.html#Miscellaneous-settings">Miscellaneous settings</a></li>
-<li><a href="Composing-messages.html#index-message-composition-57">message composition</a>: <a href="Composing-messages.html#Composing-messages">Composing messages</a></li>
-<li><a href="Modeline-status.html#index-Modeline-104">Modeline</a>: <a href="Modeline-status.html#Modeline-status">Modeline status</a></li>
-<li><a href="MUC-Administration.html#index-Moderator_002c-MUC-50">Moderator, MUC</a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="XMPP-URIs.html#index-Mozilla-integration-152">Mozilla integration</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Groupchat.html#index-MUC-25">MUC</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Connection-settings.html#index-Network-settings-171">Network settings</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Groupchat.html#index-Nickname_002c-changing-30">Nickname, changing</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Watch-buddies.html#index-Online-notifications-121">Online notifications</a>: <a href="Watch-buddies.html#Watch-buddies">Watch buddies</a></li>
-<li><a href="Connection-settings.html#index-OpenSSL-177">OpenSSL</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Registering.html#index-Password-change-76">Password change</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Personal-information.html#index-Personal-information-86">Personal information</a>: <a href="Personal-information.html#Personal-information">Personal information</a></li>
-<li><a href="Presence.html#index-Presence-7">Presence</a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Presence-subscription.html#index-Presence-subscription-17">Presence subscription</a>: <a href="Presence-subscription.html#Presence-subscription">Presence subscription</a></li>
-<li><a href="Private-messages.html#index-Private-MUC-messages-45">Private MUC messages</a>: <a href="Private-messages.html#Private-messages">Private messages</a></li>
-<li><a href="Sending-files.html#index-proxy_002c-file-transfer-60">proxy, file transfer</a>: <a href="Sending-files.html#Sending-files">Sending files</a></li>
-<li><a href="Groupchat.html#index-query-groupchat-31">query groupchat</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Connecting.html#index-Registering-an-account-4">Registering an account</a>: <a href="Connecting.html#Connecting">Connecting</a></li>
-<li><a href="Registering.html#index-Registration-72">Registration</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Registering.html#index-Removing-an-account-78">Removing an account</a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Account-settings.html#index-Resource-165">Resource</a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="MUC-Administration.html#index-Roles_002c-MUC-51">Roles, MUC</a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="Roster-buffer.html#index-Roster-buffer_002c-basics-20">Roster buffer, basics</a>: <a href="Roster-buffer.html#Roster-buffer">Roster buffer</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-Roster-buffer_002c-customizing-187">Roster buffer, customizing</a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Message-history.html#index-Rotation-128">Rotation</a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Standard-alerts.html#index-Scroll-210">Scroll</a>: <a href="Standard-alerts.html#Standard-alerts">Standard alerts</a></li>
-<li><a href="Searching.html#index-Searching-80">Searching</a>: <a href="Searching.html#Searching">Searching</a></li>
-<li><a href="Presence.html#index-send-directed-presence-15">send directed presence</a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="File-transfer.html#index-Sending-files-59">Sending files</a>: <a href="File-transfer.html#File-transfer">File transfer</a></li>
-<li><a href="Presence.html#index-Sending-presence-8">Sending presence</a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Service-discovery-and-browsing.html#index-Service-discovery-67">Service discovery</a>: <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-Sorting-the-roster-188">Sorting the roster</a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Spell-checking.html#index-Spell-checking-125">Spell checking</a>: <a href="Spell-checking.html#Spell-checking">Spell checking</a></li>
-<li><a href="Connection-settings.html#index-SRV-records-175">SRV records</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Connection-settings.html#index-SSL-172">SSL</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Connection-settings.html#index-STARTTLS-174">STARTTLS</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Presence-subscription.html#index-Subscribing-to-someone_0027s-presence-18">Subscribing to someone's presence</a>: <a href="Presence-subscription.html#Presence-subscription">Presence subscription</a></li>
-<li><a href="Protocol-support.html#index-Supported-protocols-252">Supported protocols</a>: <a href="Protocol-support.html#Protocol-support">Protocol support</a></li>
-<li><a href="Time-queries.html#index-time-query-93">time query</a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-Timestamps-190">Timestamps</a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Connection-settings.html#index-TLS-173">TLS</a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Groupchat.html#index-Topic_002c-MUC-33">Topic, MUC</a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Time-queries.html#index-uptime_002c-query-97">uptime, query</a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="XMPP-URIs.html#index-URIs-148">URIs</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="XMPP-URIs.html#index-URLs-149">URLs</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Account-settings.html#index-Username-164">Username</a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Personal-information.html#index-vCard-85">vCard</a>: <a href="Personal-information.html#Personal-information">Personal information</a></li>
-<li><a href="MUC-Administration.html#index-Voice_002c-MUC-49">Voice, MUC</a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="Watch-buddies.html#index-Watch-120">Watch</a>: <a href="Watch-buddies.html#Watch-buddies">Watch buddies</a></li>
-<li><a href="XMPP-URIs.html#index-web-browser-integration-153">web browser integration</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Sending-files.html#index-XEP_002d0065-proxy-62">XEP-0065 proxy</a>: <a href="Sending-files.html#Sending-files">Sending files</a></li>
-<li><a href="Debug-options.html#index-XML-log-227">XML log</a>: <a href="Debug-options.html#Debug-options">Debug options</a></li>
-<li><a href="XML-representation.html#index-XML-representation-228">XML representation</a>: <a href="XML-representation.html#XML-representation">XML representation</a></li>
-<li><a href="XMPP-URIs.html#index-xmpp_003a-links-151">xmpp: links</a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Autoaway.html#index-xprintidle-102">xprintidle</a>: <a href="Autoaway.html#Autoaway">Autoaway</a></li>
- </ul></body></html>
-
diff --git a/html/Connecting.html b/html/Connecting.html
deleted file mode 100644
index 3c2c53e..0000000
--- a/html/Connecting.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<html lang="en">
-<head>
-<title>Connecting - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="prev" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="next" href="Chatting.html#Chatting" title="Chatting">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Connecting"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Chatting.html#Chatting">Chatting</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Basic-operation.html#Basic-operation">Basic operation</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Basic-operation.html#Basic-operation">Basic operation</a>
-<hr><br>
-</div>
-
-<h3 class="section">2.1 Connecting</h3>
-
-<p><a name="index-jabber_002dconnect-1"></a><a name="index-jabber_002ddisconnect-2"></a>
-<a name="index-Connecting-3"></a><a name="index-Registering-an-account-4"></a>
-I'll assume that you have already successfully installed jabber.el; if
-not, consult the <span class="file">README</span> file. Also, make sure you have
-<code>(require 'jabber)</code> in your <span class="file">.emacs</span>.
-
- <p>Now, type <kbd>M-x jabber-customize</kbd>. This brings up a customize
-buffer for jabber.el. The most important variables to customize are
-<code>jabber-username</code> and
-<code>jabber-server</code>.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> Save your changes, and type
-<kbd>M-x jabber-connect</kbd> to connect.
-
- <p>If you do not yet have a Jabber account, you can register one. Enter
-your desired username for <code>jabber-username</code> and the server you wish
-to use for <code>jabber-server</code>, save, and type <kbd>C-u M-x
-jabber-connect</kbd> or <kbd>C-u C-x C-j C-c</kbd>. If the server supports
-in-band registration, you will be presented with a registration form to
-fill out and send. There the username you chose will be prefilled.
-Don't change it, otherwise jabber.el will be confused.
-
- <p>If you successfully connect, jabber.el will download your roster and
-display it in a buffer called <code>*-jabber-*</code>.
-
- <p>By default, you will appear as &ldquo;online&rdquo; to your contacts. To change
-this to e.g. &ldquo;away&rdquo;, type <kbd>M-x jabber-send-presence</kbd> or <kbd>C-x
-C-j C-p</kbd>. See <a href="Presence.html#Presence">Presence</a>, for more information.
-
- <p>To disconnect, type <kbd>M-x jabber-disconnect</kbd> or <kbd>C-x C-j C-d</kbd>.
-
- <div class="footnote">
-<hr>
-<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> See <a href="Connection-settings.html#Connection-settings">Connection settings</a>, for other
-things you might have to change.</p>
-
- <p><hr></div>
-
- </body></html>
-
diff --git a/html/Connection-settings.html b/html/Connection-settings.html
deleted file mode 100644
index c4297f9..0000000
--- a/html/Connection-settings.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<html lang="en">
-<head>
-<title>Connection settings - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Account-settings.html#Account-settings" title="Account settings">
-<link rel="next" href="Miscellaneous-settings.html#Miscellaneous-settings" title="Miscellaneous settings">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Connection-settings"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Miscellaneous-settings.html#Miscellaneous-settings">Miscellaneous settings</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Account-settings.html#Account-settings">Account settings</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.2 Connection settings</h3>
-
-<p><a name="index-jabber_002dnetwork_002dserver-166"></a><a name="index-jabber_002dport-167"></a><a name="index-jabber_002dconnection_002dtype-168"></a><a name="index-jabber_002dconnection_002dssl_002dprogram-169"></a><a name="index-Connection-settings-170"></a><a name="index-Network-settings-171"></a><a name="index-SSL-172"></a><a name="index-TLS-173"></a><a name="index-STARTTLS-174"></a><a name="index-SRV-records-175"></a>
-<code>jabber-network-server</code> is the hostname or IP address of your
-server. If it is set to <code>nil</code>, jabber.el will use the name in
-<code>jabber-server</code>.
-
- <p><code>jabber-port</code> is the TCP port of the server to connect to. If
-<code>nil</code>, the default port is selected based on the chosen
-connection method.
-
- <p>If both <code>jabber-network-server</code> and <code>jabber-port</code> are nil, and
-a sufficiently modern <code>dns.el</code> is available, jabber.el will use SRV
-records to find the right hostname and port.
-
- <p><code>jabber-connection-type</code> specifies what kind of connection to
-use. <code>network</code> means normal unencrypted network connection
-(usually on port 5222), and <code>ssl</code> means encrypted connection
-through GnuTLS or OpenSSL (port 5223), while <code>starttls</code> will
-initiate an unencrypted connection and switch to encrypted if offered
-by the server. You can change the settings of the encryption program
-through <kbd>M-x customize-group RET tls</kbd>, <kbd>M-x customize-group RET starttls</kbd>
-or <kbd>M-x customize-group RET ssl</kbd>, respectively.
-
- <p><a name="index-GnuTLS-176"></a><a name="index-OpenSSL-177"></a>By default, GnuTLS will be used if the <code>tls</code> library is available,
-and if that fails, OpenSSL will be used if the <code>ssl</code> library is
-available. You can force the use of either program by setting
-<code>jabber-connection-ssl-program</code> to <code>gnutls</code> or <code>openssl</code>,
-respectively. If you use <code>starttls</code> the library with the same name is
-required, and it depends on the GnuTLS command line client.
-
- </body></html>
-
diff --git a/html/Contact.html b/html/Contact.html
deleted file mode 100644
index 71b9687..0000000
--- a/html/Contact.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<html lang="en">
-<head>
-<title>Contact - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Introduction.html#Introduction" title="Introduction">
-<link rel="prev" href="Introduction.html#Introduction" title="Introduction">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Contact"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Introduction.html#Introduction">Introduction</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Introduction.html#Introduction">Introduction</a>
-<hr><br>
-</div>
-
-<h3 class="section">1.1 Contact</h3>
-
-<p>jabber.el is developed by Tom Berger (e-mail
-<a href="mailto:object@intellectronica.net">object@intellectronica.net</a>, JID <code>object@jabber.org.uk</code>) and
-Magnus Henoch (e-mail <a href="mailto:mange@freemail.hu">mange@freemail.hu</a>, JID
-<code>legoscia@jabber.cd.chalmers.se</code>). There is a web page at
-<a href="http://intellectronica.net/emacs-jabber/">http://intellectronica.net/emacs-jabber/</a>, and a Sourceforge
-project page at <a href="http://sourceforge.net/projects/emacs-jabber">http://sourceforge.net/projects/emacs-jabber</a>.
-
- </body></html>
-
diff --git a/html/Customization.html b/html/Customization.html
deleted file mode 100644
index 28d41ee..0000000
--- a/html/Customization.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html lang="en">
-<head>
-<title>Customization - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="XMPP-URIs.html#XMPP-URIs" title="XMPP URIs">
-<link rel="next" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Customization"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">15 Customization</h2>
-
-<p><a name="index-jabber_002dcustomize-156"></a><a name="index-Customization-157"></a>
-jabber.el is intended to be customizable for many tastes. After all,
-this is Emacs. To open a customization buffer for jabber.el, type
-<kbd>M-x jabber-customize</kbd>.
-
-<ul class="menu">
-<li><a accesskey="1" href="Account-settings.html#Account-settings">Account settings</a>
-<li><a accesskey="2" href="Connection-settings.html#Connection-settings">Connection settings</a>
-<li><a accesskey="3" href="Miscellaneous-settings.html#Miscellaneous-settings">Miscellaneous settings</a>
-<li><a accesskey="4" href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a>
-<li><a accesskey="5" href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a>
-<li><a accesskey="6" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>
-<li><a accesskey="7" href="Hooks.html#Hooks">Hooks</a>
-<li><a accesskey="8" href="Debug-options.html#Debug-options">Debug options</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Customizing-alerts.html b/html/Customizing-alerts.html
deleted file mode 100644
index 4b59695..0000000
--- a/html/Customizing-alerts.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<html lang="en">
-<head>
-<title>Customizing alerts - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer" title="Customizing the chat buffer">
-<link rel="next" href="Hooks.html#Hooks" title="Hooks">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Customizing-alerts"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Hooks.html#Hooks">Hooks</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.6 Customizing alerts</h3>
-
-<p><a name="index-Alert-hooks-207"></a><a name="index-define_002djabber_002dalert-208"></a>
-When an event happens (currently including presence changes, incoming
-messages, and completed queries) you will usually want to be
-notified. Since tastes in this area vary wildly, these alerts are
-implemented as hooks, so you can choose which ones you want, or write
-your own if none fit.
-
- <p>Actually, if you don't want to write your own, stop reading this
-section and just read <a href="Standard-alerts.html#Standard-alerts">Standard alerts</a>.
-
- <p>Many kinds of alerts consist in displaying a text message through a
-certain mechanism. This text message is provided by a function which
-you can rewrite or replace. If this function returns <code>nil</code>, no
-message is displayed, and non-textual alerts refrain from action.
-
- <p>If you want to write alert hooks that do nothing except displaying the
-supplied message in some way, use the macro
-<code>define-jabber-alert</code>. For example, if <var>foo</var> is a function
-that takes a string as an argument, write
-<pre class="example"> (define-jabber-alert foo
- "Display a message in a fooish way"
- 'foo)
-</pre>
- <p>and all details will be taken care of for you.
-
- <p>The hooks take different arguments depending on category. However,
-they all have in common that the last argument is the result of the
-message function. The message function for each category takes the
-same arguments as the corresponding hooks, except for that last
-argument.
-
- <p>Alert hook contributions are very welcome. You can send them to the
-mailing list, or to the Sourceforge patch tracker.
-
- <p>Alert hooks are meant for optional UI things, that are subject to
-varying user tastes, and that can be toggled by simply adding or
-removing the function to and from the hook. For other things, there
-are corresponding general hooks, that are defvars instead of
-defcustoms, and that are to be managed by Lisp code. They have the
-same name as the alert hooks minus the <code>-alert</code> part,
-i.e. <code>jabber-message-hooks</code> vs <code>jabber-alert-message-hooks</code>,
-etc.
-
-<ul class="menu">
-<li><a accesskey="1" href="Standard-alerts.html#Standard-alerts">Standard alerts</a>
-<li><a accesskey="2" href="Presence-alerts.html#Presence-alerts">Presence alerts</a>
-<li><a accesskey="3" href="Message-alerts.html#Message-alerts">Message alerts</a>
-<li><a accesskey="4" href="MUC-alerts.html#MUC-alerts">MUC alerts</a>
-<li><a accesskey="5" href="Info-alerts.html#Info-alerts">Info alerts</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Customizing-the-chat-buffer.html b/html/Customizing-the-chat-buffer.html
deleted file mode 100644
index 8803400..0000000
--- a/html/Customizing-the-chat-buffer.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<html lang="en">
-<head>
-<title>Customizing the chat buffer - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer" title="Customizing the roster buffer">
-<link rel="next" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Customizing-the-chat-buffer"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.5 Customizing the chat buffer</h3>
-
-<p><a name="index-Chat-buffer-189"></a><a name="index-Timestamps-190"></a><a name="index-Faces_002c-chat-buffer-191"></a>
-You can customize the look of the prompts in the chat buffer. There
-are separate settings for local (i.e. your own messages) and foreign
-prompts.
-
- <p><a name="index-jabber_002dchat_002dtext_002dlocal-192"></a><a name="index-jabber_002dchat_002dtext_002dforeign-193"></a><code>jabber-chat-text-local</code> and <code>jabber-chat-text-foreign</code>
-determine the faces used for chat messages.
-
- <p><a name="index-jabber_002dchat_002dprompt_002dlocal-194"></a><a name="index-jabber_002dchat_002dprompt_002dforeign-195"></a><code>jabber-chat-prompt-local</code> and <code>jabber-chat-prompt-foreign</code>
-determine the faces used for the prompts.
-
- <p><a name="index-jabber_002dchat_002dlocal_002dprompt_002dformat-196"></a><a name="index-jabber_002dchat_002dforeign_002dprompt_002dformat-197"></a><code>jabber-chat-local-prompt-format</code> and
-<code>jabber-chat-foreign-prompt-format</code> determine what text is
-displayed in the prompts. They are format strings, with the following
-special sequences defined:
-
- <dl>
-<dt><code>%t</code><dd>The time when the message was sent or received
-<br><dt><code>%n</code><dd>The nickname of the user. For the foreign prompt, this is the name of
-the contact in the roster, or the JID if no name set. For the local
-prompt, this is the username part of your JID.
-<br><dt><code>%u</code><dd>The username of the user.
-<br><dt><code>%r</code><dd>The resource.
-<br><dt><code>%j</code><dd>The bare JID of the user
-</dl>
-
- <p><a name="index-jabber_002dchat_002dtime_002dformat-198"></a><code>jabber-chat-time-format</code> defines how <code>%t</code> shows time. Its
-format is identical to that passed to <code>format-time-string</code>.
-See <a href="../elisp/Time-Conversion.html#Time-Conversion">Time Conversion (GNU Emacs Lisp Reference Manual)</a>.
-
- <p><a name="index-jabber_002dchat_002ddelayed_002dtime_002dformat-199"></a><code>jabber-chat-delayed-time-format</code> is used instead of
-<code>jabber-chat-time-format</code> for delayed messages (messages sent while
-you were offline, or fetched from history). This way you can have short
-timestamps everywhere except where you need long ones. You can always
-see the complete timestamp in a tooltip by hovering over the prompt with
-the mouse.
-
- <p><a name="index-jabber_002dprint_002drare_002dtime-200"></a><a name="index-jabber_002drare_002dtime_002dformat-201"></a><a name="index-jabber_002dchat_002dtext_002dlocalBy-default_002c-timestamps-are-printed-in-the-chat-buffer-every-hour-_0028at-202"></a>&ldquo;rare&rdquo; times). This can be toggled with
-<code>jabber-print-rare-time</code>. You can customize the displayed time by
-setting <code>jabber-rare-time-format</code>. Rare timestamps will be printed
-whenever time formatted by that format string would change.
-
- <p><a name="index-jabber_002dchat_002dheader_002dline_002dformat-203"></a><a name="index-jabber_002dmuc_002dheader_002dline_002dformat-204"></a>You can also customize the header line of chat buffers, by modifying
-the variable <code>jabber-chat-header-line-format</code>. The format of
-that variable is the same as that of <code>mode-line-format</code> and
-<code>header-line-format</code>. See <a href="../elisp/Mode-Line-Format.html#Mode-Line-Format">Mode-Line Format (GNU Emacs Lisp Reference Manual)</a>. For MUC buffers,
-<code>jabber-muc-header-line-format</code> is used instead.
-
- <p><a name="index-jabber_002dchat_002dfill_002dlong_002dlines-205"></a><a name="index-Filling-long-lines-in-chat-buffer-206"></a>The variable <code>jabber-chat-fill-long-lines</code> controls whether long
-lines in the chat buffer are filled.
-
- </body></html>
-
diff --git a/html/Customizing-the-roster-buffer.html b/html/Customizing-the-roster-buffer.html
deleted file mode 100644
index e61e38a..0000000
--- a/html/Customizing-the-roster-buffer.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<html lang="en">
-<head>
-<title>Customizing the roster buffer - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Miscellaneous-settings.html#Miscellaneous-settings" title="Miscellaneous settings">
-<link rel="next" href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer" title="Customizing the chat buffer">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Customizing-the-roster-buffer"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Miscellaneous-settings.html#Miscellaneous-settings">Miscellaneous settings</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.4 Customizing the roster buffer</h3>
-
-<p><a name="index-jabber_002droster_002dsort_002dfunctions-180"></a><a name="index-jabber_002dsort_002dorder-181"></a><a name="index-jabber_002dshow_002dresources-182"></a><a name="index-jabber_002droster_002dline_002dformat-183"></a><a name="index-jabber_002dresource_002dline_002dformat-184"></a><a name="index-jabber_002droster_002dbuffer-185"></a><a name="index-jabber_002droster_002dshow_002dbindings-186"></a><a name="index-Roster-buffer_002c-customizing-187"></a>
-<a name="index-Sorting-the-roster-188"></a><code>jabber-roster-sort-functions</code> controls how roster items are
-sorted. By default, contacts are sorted first by presence, and then
-alphabetically by displayed name.
-
- <p><code>jabber-sort-order</code> controls how roster items are sorted by
-presence. It is a list containing strings corresponding to show
-status (see <a href="Presence.html#Presence">Presence</a>) or <code>nil</code>, which represents offline.
-
- <p><code>jabber-show-resources</code> controls when your contacts' resources
-are shown in the roster buffer. The default is to show resources when
-a contact has more than one connected resource.
-
- <p><code>jabber-roster-line-format</code> specifies how the entry for each
-contact looks. It is a string where some characters are special if
-preceded by a percent sign:
-
- <dl>
-<dt><code>%a</code><dd>Avatar of contact, if any
-<br><dt><code>%c</code><dd>"*" if the contact is connected, or " " if not
-<br><dt><code>%u</code><dd>Subscription state - see below
-<br><dt><code>%n</code><dd>Nickname of contact, or JID if no nickname
-<br><dt><code>%j</code><dd>Bare JID of contact (without resource)
-<br><dt><code>%r</code><dd>Highest-priority resource of contact
-<br><dt><code>%s</code><dd>Availability of contact as string ("Online", "Away" etc)
-<br><dt><code>%S</code><dd>Status string specified by contact
-</dl>
-
- <p><code>jabber-resource-line-format</code> is nearly identical, except that
-the values correspond to the values of the resource in question, and
-that the <code>%p</code> escape is available, which inserts the priority of
-the resource.
-
- <p><code>jabber-roster-buffer</code> specifies the name of the roster buffer.
-If you change this, the new name will be used the next time you
-connect.
-
- <p><code>jabber-roster-show-bindings</code> controls whether to show a list of
-keybindings at the top of the roster buffer. You need to run <kbd>M-x
-jabber-display-roster</kbd> after changing this variable to update the display.
-
- <p><code>%u</code> is replaced by one of the strings given by
-`jabber-roster-subscription-display'.
-
- </body></html>
-
diff --git a/html/Debug-options.html b/html/Debug-options.html
deleted file mode 100644
index a2d4af6..0000000
--- a/html/Debug-options.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<html lang="en">
-<head>
-<title>Debug options - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Hooks.html#Hooks" title="Hooks">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Debug-options"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Hooks.html#Hooks">Hooks</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.8 Debug options</h3>
-
-<p><a name="index-jabber_002ddebug_002dlog_002dxml-226"></a><a name="index-XML-log-227"></a>
-These settings provide a lot of information which is usually not very
-interesting, but can be useful for debugging various things.
-
- <p><code>jabber-debug-log-xml</code> activates XML logging. All XML stanzas
-sent and received are logged in the buffer <code>*-jabber-xml-log-*</code>
-in list format. See <a href="XML-representation.html#XML-representation">XML representation</a>.
-
- </body></html>
-
diff --git a/html/Extending-service-discovery.html b/html/Extending-service-discovery.html
deleted file mode 100644
index 3fe9b83..0000000
--- a/html/Extending-service-discovery.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<html lang="en">
-<head>
-<title>Extending service discovery - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="Sending-new-requests.html#Sending-new-requests" title="Sending new requests">
-<link rel="next" href="Chat-printers.html#Chat-printers" title="Chat printers">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Extending-service-discovery"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Chat-printers.html#Chat-printers">Chat printers</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.5 Service discovery</h3>
-
-<p><a name="index-jabber_002dadvertised_002dfeatures-240"></a><a name="index-jabber_002ddisco_002ditems_002dnodes-241"></a><a name="index-jabber_002ddisco_002dinfo_002dnodes-242"></a><a name="index-jabber_002dmy_002djid_002dp-243"></a>
-Your new handlers will likely want to advertise their existence
-through service discovery.
-
- <p>To have an additional feature reported in response to disco info
-requests, add a string to <code>jabber-advertised-features</code>.
-
- <p>By default, the service discovery functions reject all requests
-containing a node identifier with an &ldquo;Item not found&rdquo; error. To
-make them respond, add the appropriate entries to
-<code>jabber-disco-items-nodes</code> and <code>jabber-disco-info-nodes</code>.
-Both variables work in the same way. They are alists, where the keys
-are the node names, and the values are lists of two items.
-
- <p>The first item is the data to return &mdash; either a list or a function
-taking the entire IQ stanza and returning a list, this list containing
-the XML nodes to include in the <code>&lt;query/&gt;</code> node in the response.
-
- <p>The second item is the access control function. An access control
-function receives the JID as its only argument, and returns non-nil if
-access is to be granted. If nil is specified instead of a function,
-access is always granted. One such function is provided,
-<code>jabber-my-jid-p</code>, which grants access for JIDs where the
-username and server (not necessarily resource) are equal to those of
-the user.
-
- </body></html>
-
diff --git a/html/File-transfer.html b/html/File-transfer.html
deleted file mode 100644
index 0ba416c..0000000
--- a/html/File-transfer.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<html lang="en">
-<head>
-<title>File transfer - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Composing-messages.html#Composing-messages" title="Composing messages">
-<link rel="next" href="Services.html#Services" title="Services">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="File-transfer"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Services.html#Services">Services</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Composing-messages.html#Composing-messages">Composing messages</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">5 File transfer</h2>
-
-<p><a name="index-File-transfer-58"></a><a name="index-Sending-files-59"></a>
-jabber.el has limited support for file transfer. The most important
-limit is that files sent and received are kept in buffers, so Emacs must
-be able to allocate enough memory for the entire file, and the file size
-must be smaller than the maximum buffer size.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>
-
- <p>jabber.el is able to exchange files with most Jabber clients (and also
-some MSN transports), but notably not with the official Google Talk
-client. The Google Talk client uses a different file transfer protocol
-that, at the time of this release, has not been published.
-
-<ul class="menu">
-<li><a accesskey="1" href="Receiving-files.html#Receiving-files">Receiving files</a>
-<li><a accesskey="2" href="Sending-files.html#Sending-files">Sending files</a>
-</ul>
-
- <div class="footnote">
-<hr>
-<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> The maximum
-buffer size is kept in the variable <code>most-positive-fixnum</code>. On
-most 32-bit systems, this is 128 or 256 megabytes, depending on your
-Emacs version.</p>
-
- <p><hr></div>
-
- </body></html>
-
diff --git a/html/Function-index.html b/html/Function-index.html
deleted file mode 100644
index 1159de9..0000000
--- a/html/Function-index.html
+++ /dev/null
@@ -1,104 +0,0 @@
-<html lang="en">
-<head>
-<title>Function index - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Concept-index.html#Concept-index" title="Concept index">
-<link rel="next" href="Variable-index.html#Variable-index" title="Variable index">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Function-index"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Variable-index.html#Variable-index">Variable index</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Concept-index.html#Concept-index">Concept index</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="unnumbered">Function index</h2>
-
-
-
-<ul class="index-fn" compact>
-<li><a href="Customizing-alerts.html#index-define_002djabber_002dalert-208"><code>define-jabber-alert</code></a>: <a href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a></li>
-<li><a href="Tracking-activity.html#index-jabber_002dactivity_002dmode-115"><code>jabber-activity-mode</code></a>: <a href="Tracking-activity.html#Tracking-activity">Tracking activity</a></li>
-<li><a href="Ad_002dHoc-Commands.html#index-jabber_002dahc_002dexecute_002dcommand-84"><code>jabber-ahc-execute-command</code></a>: <a href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">Ad-Hoc Commands</a></li>
-<li><a href="Ad_002dHoc-Commands.html#index-jabber_002dahc_002dget_002dlist-83"><code>jabber-ahc-get-list</code></a>: <a href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">Ad-Hoc Commands</a></li>
-<li><a href="Chatting.html#index-jabber_002dchat_002dwith-6"><code>jabber-chat-with</code></a>: <a href="Chatting.html#Chatting">Chatting</a></li>
-<li><a href="Composing-messages.html#index-jabber_002dcompose-55"><code>jabber-compose</code></a>: <a href="Composing-messages.html#Composing-messages">Composing messages</a></li>
-<li><a href="Connecting.html#index-jabber_002dconnect-1"><code>jabber-connect</code></a>: <a href="Connecting.html#Connecting">Connecting</a></li>
-<li><a href="Customization.html#index-jabber_002dcustomize-156"><code>jabber-customize</code></a>: <a href="Customization.html#Customization">Customization</a></li>
-<li><a href="Connecting.html#index-jabber_002ddisconnect-2"><code>jabber-disconnect</code></a>: <a href="Connecting.html#Connecting">Connecting</a></li>
-<li><a href="Roster-buffer.html#index-jabber_002ddisplay_002droster-23"><code>jabber-display-roster</code></a>: <a href="Roster-buffer.html#Roster-buffer">Roster buffer</a></li>
-<li><a href="Roster-import-and-export.html#index-jabber_002dexport_002droster-144"><code>jabber-export-roster</code></a>: <a href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a></li>
-<li><a href="Sending-files.html#index-jabber_002dft_002dsend-65"><code>jabber-ft-send</code></a>: <a href="Sending-files.html#Sending-files">Sending files</a></li>
-<li><a href="Service-discovery-and-browsing.html#index-jabber_002dget_002dbrowse-69"><code>jabber-get-browse</code></a>: <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a></li>
-<li><a href="Service-discovery-and-browsing.html#index-jabber_002dget_002ddisco_002dinfo-71"><code>jabber-get-disco-info</code></a>: <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a></li>
-<li><a href="Service-discovery-and-browsing.html#index-jabber_002dget_002ddisco_002ditems-70"><code>jabber-get-disco-items</code></a>: <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a></li>
-<li><a href="Time-queries.html#index-jabber_002dget_002didle_002dtime-99"><code>jabber-get-idle-time</code></a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="Time-queries.html#index-jabber_002dget_002dlast_002donline-96"><code>jabber-get-last-online</code></a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="Registering.html#index-jabber_002dget_002dregister-79"><code>jabber-get-register</code></a>: <a href="Registering.html#Registering">Registering</a></li>
-<li><a href="Searching.html#index-jabber_002dget_002dsearch-81"><code>jabber-get-search</code></a>: <a href="Searching.html#Searching">Searching</a></li>
-<li><a href="Time-queries.html#index-jabber_002dget_002dtime-94"><code>jabber-get-time</code></a>: <a href="Time-queries.html#Time-queries">Time queries</a></li>
-<li><a href="Groupchat.html#index-jabber_002dgroupchat_002dget_002dconfig-36"><code>jabber-groupchat-get-config</code></a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Groupchat.html#index-jabber_002dgroupchat_002djoin-27"><code>jabber-groupchat-join</code></a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Groupchat.html#index-jabber_002dgroupchat_002dleave-35"><code>jabber-groupchat-leave</code></a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="XMPP-URIs.html#index-jabber_002dhandle_002duri-155"><code>jabber-handle-uri</code></a>: <a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a></li>
-<li><a href="Roster-import-and-export.html#index-jabber_002dimport_002droster-145"><code>jabber-import-roster</code></a>: <a href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a></li>
-<li><a href="Info-alerts.html#index-jabber_002dinfo_002ddefault_002dmessage-220"><code>jabber-info-default-message</code></a>: <a href="Info-alerts.html#Info-alerts">Info alerts</a></li>
-<li><a href="Keepalive.html#index-jabber_002dkeepalive_002dstart-110"><code>jabber-keepalive-start</code></a>: <a href="Keepalive.html#Keepalive">Keepalive</a></li>
-<li><a href="Keepalive.html#index-jabber_002dkeepalive_002dstop-111"><code>jabber-keepalive-stop</code></a>: <a href="Keepalive.html#Keepalive">Keepalive</a></li>
-<li><a href="Miscellaneous-settings.html#index-jabber_002dmenu-178"><code>jabber-menu</code></a>: <a href="Miscellaneous-settings.html#Miscellaneous-settings">Miscellaneous settings</a></li>
-<li><a href="Message-alerts.html#index-jabber_002dmessage_002ddefault_002dmessage-214"><code>jabber-message-default-message</code></a>: <a href="Message-alerts.html#Message-alerts">Message alerts</a></li>
-<li><a href="Modeline-status.html#index-jabber_002dmode_002dline_002dmode-105"><code>jabber-mode-line-mode</code></a>: <a href="Modeline-status.html#Modeline-status">Modeline status</a></li>
-<li><a href="Automation.html#index-jabber_002dmuc_002dautojoin-40"><code>jabber-muc-autojoin</code></a>: <a href="Automation.html#Automation">Automation</a></li>
-<li><a href="MUC-alerts.html#index-jabber_002dmuc_002ddefault_002dmessage-218"><code>jabber-muc-default-message</code></a>: <a href="MUC-alerts.html#MUC-alerts">MUC alerts</a></li>
-<li><a href="Invitations.html#index-jabber_002dmuc_002dinvite-44"><code>jabber-muc-invite</code></a>: <a href="Invitations.html#Invitations">Invitations</a></li>
-<li><a href="Groupchat.html#index-jabber_002dmuc_002dnames-37"><code>jabber-muc-names</code></a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Private-messages.html#index-jabber_002dmuc_002dprivate-46"><code>jabber-muc-private</code></a>: <a href="Private-messages.html#Private-messages">Private messages</a></li>
-<li><a href="MUC-Administration.html#index-jabber_002dmuc_002dset_002daffiliation-52"><code>jabber-muc-set-affiliation</code></a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="MUC-Administration.html#index-jabber_002dmuc_002dset_002drole-47"><code>jabber-muc-set-role</code></a>: <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a></li>
-<li><a href="Groupchat.html#index-jabber_002dmuc_002dset_002dtopic-34"><code>jabber-muc-set-topic</code></a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Extending-service-discovery.html#index-jabber_002dmy_002djid_002dp-243"><code>jabber-my-jid-p</code></a>: <a href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a></li>
-<li><a href="Presence-alerts.html#index-jabber_002dpresence_002ddefault_002dmessage-212"><code>jabber-presence-default-message</code></a>: <a href="Presence-alerts.html#Presence-alerts">Presence alerts</a></li>
-<li><a href="Sending-new-requests.html#index-jabber_002dprocess_002ddata-239"><code>jabber-process-data</code></a>: <a href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a></li>
-<li><a href="Listening-for-new-requests.html#index-jabber_002dprocess_002diq-232"><code>jabber-process-iq</code></a>: <a href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a></li>
-<li><a href="Sending-new-requests.html#index-jabber_002dprocess_002diq-237"><code>jabber-process-iq</code></a>: <a href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a></li>
-<li><a href="Sending-new-requests.html#index-jabber_002dreport_002dsuccess-238"><code>jabber-report-success</code></a>: <a href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a></li>
-<li><a href="Presence.html#index-jabber_002dsend_002ddefault_002dpresence-10"><code>jabber-send-default-presence</code></a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Presence.html#index-jabber_002dsend_002ddirected_002dpresence-16"><code>jabber-send-directed-presence</code></a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Sending-new-requests.html#index-jabber_002dsend_002diq-236"><code>jabber-send-iq</code></a>: <a href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a></li>
-<li><a href="Listening-for-new-requests.html#index-jabber_002dsend_002diq-231"><code>jabber-send-iq</code></a>: <a href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a></li>
-<li><a href="Presence.html#index-jabber_002dsend_002dpresence-9"><code>jabber-send-presence</code></a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Presence-subscription.html#index-jabber_002dsend_002dsubscription_002drequest-19"><code>jabber-send-subscription-request</code></a>: <a href="Presence-subscription.html#Presence-subscription">Presence subscription</a></li>
-<li><a href="Listening-for-new-requests.html#index-jabber_002dsignal_002derror-233"><code>jabber-signal-error</code></a>: <a href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a></li>
-<li><a href="Sending-files.html#index-jabber_002dsocks5_002dquery_002dall_002dproxies-64"><code>jabber-socks5-query-all-proxies</code></a>: <a href="Sending-files.html#Sending-files">Sending files</a></li>
-<li><a href="Personal-information.html#index-jabber_002dvcard_002dedit-88"><code>jabber-vcard-edit</code></a>: <a href="Personal-information.html#Personal-information">Personal information</a></li>
-<li><a href="Personal-information.html#index-jabber_002dvcard_002dget-87"><code>jabber-vcard-get</code></a>: <a href="Personal-information.html#Personal-information">Personal information</a></li>
-<li><a href="Watch-buddies.html#index-jabber_002dwatch_002dadd-122"><code>jabber-watch-add</code></a>: <a href="Watch-buddies.html#Watch-buddies">Watch buddies</a></li>
-<li><a href="Watch-buddies.html#index-jabber_002dwatch_002dremove-123"><code>jabber-watch-remove</code></a>: <a href="Watch-buddies.html#Watch-buddies">Watch buddies</a></li>
- </ul></body></html>
-
diff --git a/html/Groupchat.html b/html/Groupchat.html
deleted file mode 100644
index 55eacb0..0000000
--- a/html/Groupchat.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<html lang="en">
-<head>
-<title>Groupchat - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="next" href="Composing-messages.html#Composing-messages" title="Composing messages">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Groupchat"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Composing-messages.html#Composing-messages">Composing messages</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Basic-operation.html#Basic-operation">Basic operation</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">3 Groupchat</h2>
-
-<p><a name="index-Groupchat-24"></a><a name="index-MUC-25"></a><a name="index-Chatrooms-26"></a>
-The groupchat menu can be accessed by typing <kbd>C-c C-m</kbd> in the
-roster buffer. You can also type the commands directly, as will be
-shown here.
-
- <p><a name="index-jabber_002dgroupchat_002djoin-27"></a><a name="index-Joining-a-groupchat-28"></a><a name="index-Changing-nickname-29"></a><a name="index-Nickname_002c-changing-30"></a>To join a groupchat, type <kbd>M-x jabber-groupchat-join</kbd>. You will
-be prompted for the groupchat to join, and your nickname in the
-groupchat. This nickname doesn't need to have any correlation to your
-JID; in fact, groupchats are usually (but not always) configured such
-that only moderators can see your JID. You can change your nickname
-with <kbd>M-x jabber-muc-nick</kbd>. See <a href="Automation.html#Automation">Automation</a>, for setting default
-nicknames.
-
- <p><a name="index-query-groupchat-31"></a><a name="index-jabber_002dmuc_002ddisable_002ddisco_002dcheck-32"></a>When trying to join a room, jabber.el first sends a service discovery
-info request to the room, to find out whether it exists and what
-features are enabled (in particular whether the room is
-password-protected). However, this can cause problems with some buggy
-MUC services (or services that respond in a way that jabber.el doesn't
-expect). A workaround for that is to set
-<code>jabber-muc-disable-disco-check</code> to t; however, the bug should be
-unearthed and fixed.
-
- <p>Groupchat messages will be displayed in a buffer called
-<code>*-jabber-groupchat-:-</code><var>groupchat</var><code>-*</code>. It works much like the
-chat buffer.
-
- <p><a name="index-Topic_002c-MUC-33"></a><a name="index-jabber_002dmuc_002dset_002dtopic-34"></a>To change the topic of a groupchat, type <kbd>M-x jabber-muc-set-topic</kbd>.
-The current topic is shown in the header line.
-
- <p><a name="index-jabber_002dgroupchat_002dleave-35"></a>To leave a groupchat, type <kbd>M-x jabber-groupchat-leave</kbd>.
-
- <p><a name="index-jabber_002dgroupchat_002dget_002dconfig-36"></a>If you are the owner of a groupchat, you can change its configuration
-by typing <kbd>M-x jabber-groupchat-get-config</kbd>. A configuration form
-will be rendered in new buffer.
-
- <p><a name="index-jabber_002dmuc_002dnames-37"></a>To see which people are in a groupchat, type <kbd>M-x
-jabber-muc-names</kbd>. This gives a list of nicknames, &ldquo;roles&rdquo;,
-&ldquo;affiliations&rdquo;, and possibly JIDs. See <a href="MUC-Administration.html#MUC-Administration">MUC Administration</a>, for
-the meaning of roles and affiliations.
-
-<ul class="menu">
-<li><a accesskey="1" href="Automation.html#Automation">Automation</a>
-<li><a accesskey="2" href="Invitations.html#Invitations">Invitations</a>
-<li><a accesskey="3" href="Private-messages.html#Private-messages">Private messages</a>
-<li><a accesskey="4" href="MUC-Administration.html#MUC-Administration">MUC Administration</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Hacking-and-extending.html b/html/Hacking-and-extending.html
deleted file mode 100644
index e45346d..0000000
--- a/html/Hacking-and-extending.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<html lang="en">
-<head>
-<title>Hacking and extending - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Customization.html#Customization" title="Customization">
-<link rel="next" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Hacking-and-extending"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Protocol-support.html#Protocol-support">Protocol support</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Customization.html#Customization">Customization</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">16 Hacking and extending</h2>
-
-<p>This part of the manual is an attempt to explain parts of the source
-code. It is not meant to discourage you from reading the code
-yourself and trying to figure it out, but as a guide on where to
-look. Knowledge of Jabber protocols is assumed.
-
-<ul class="menu">
-<li><a accesskey="1" href="XML-representation.html#XML-representation">XML representation</a>
-<li><a accesskey="2" href="Roster-structure.html#Roster-structure">Roster structure</a>
-<li><a accesskey="3" href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a>
-<li><a accesskey="4" href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a>
-<li><a accesskey="5" href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a>
-<li><a accesskey="6" href="Chat-printers.html#Chat-printers">Chat printers</a>
-<li><a accesskey="7" href="Stanza-chains.html#Stanza-chains">Stanza chains</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Hooks.html b/html/Hooks.html
deleted file mode 100644
index 99654c7..0000000
--- a/html/Hooks.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html lang="en">
-<head>
-<title>Hooks - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="next" href="Debug-options.html#Debug-options" title="Debug options">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Hooks"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Debug-options.html#Debug-options">Debug options</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.7 Hooks</h3>
-
-<p>jabber.el provides various hooks that you can use for whatever
-purpose.
-
-
-<a name="index-jabber_002dpost_002dconnect_002dhook-221"></a>
-<dl><dt><code>jabber-post-connect-hook</code><dd>This hook is called after successful connection and authentication.
-By default it contains <code>jabber-send-default-presence</code>
-(see <a href="Presence.html#Presence">Presence</a>).
-
- <p><a name="index-jabber_002dlost_002dconnection_002dhook-222"></a><br><dt><code>jabber-lost-connection-hook</code><dd>This hook is called when you have been disconnected for unknown
-reasons. Usually this isn't noticed for quite a long time.
-
- <p><a name="index-jabber_002dpre_002ddisconnect_002dhook-223"></a><br><dt><code>jabber-pre-disconnect-hook</code><dd>This hook is called just before voluntary disconnection. This might
-be due to failed authentication, so check
-<code>*jabber-authenticated*</code> if you want to send a stanza.
-
- <p><a name="index-jabber_002dpost_002ddisconnect_002dhook-224"></a><br><dt><code>jabber-post-disconnect-hook</code><dd>This hook is called after disconnection of any kind, possibly just
-after <code>jabber-lost-connection-hook</code>.
-
- <p><a name="index-jabber_002dchat_002dmode_002dhook-225"></a><br><dt><code>jabber-chat-mode-hook</code><dd>This hook is called when a new chat buffer is created.
-
- </dl>
-
- </body></html>
-
diff --git a/html/Info-alerts.html b/html/Info-alerts.html
deleted file mode 100644
index 7c7513d..0000000
--- a/html/Info-alerts.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<html lang="en">
-<head>
-<title>Info alerts - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="prev" href="MUC-alerts.html#MUC-alerts" title="MUC alerts">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Info-alerts"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="MUC-alerts.html#MUC-alerts">MUC alerts</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>
-<hr><br>
-</div>
-
-<h4 class="subsection">15.6.5 Info alerts</h4>
-
-<p><a name="index-jabber_002dalert_002dinfo_002dmessage_002dfunction-219"></a><a name="index-jabber_002dinfo_002ddefault_002dmessage-220"></a>
-Info alerts are sadly underdeveloped. The message function,
-<code>jabber-alert-info-message-function</code>, takes two arguments,
-<var>infotype</var> and <var>buffer</var>. <var>buffer</var> is the buffer where
-something happened, and <var>infotype</var> is either <code>'roster</code> for
-roster updates, or <code>'browse</code> for anything that uses the browse
-buffer (basically anything except chatting).
-
- <p>The info alert hooks take an extra argument, as could be expected.
-
- </body></html>
-
diff --git a/html/Introduction.html b/html/Introduction.html
deleted file mode 100644
index f5f0d11..0000000
--- a/html/Introduction.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<html lang="en">
-<head>
-<title>Introduction - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="index.html#Top" title="Top">
-<link rel="next" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Introduction"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Basic-operation.html#Basic-operation">Basic operation</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="index.html#Top">Top</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">1 Introduction</h2>
-
-<p>jabber.el is a Jabber client running under Emacs. For more
-information on the open-protocol instant messaging network Jabber,
-please visit <a href="http://www.jabber.org">http://www.jabber.org</a>.
-
- <p>As a Jabber client, jabber.el is mostly just a face in the crowd,
-except that it uses buffers where GUI clients have windows. There is
-a roster buffer, and to chat with someone you open a chat buffer, and
-there are browse buffers (increasingly inexactly named) for
-interaction with servers and services. Then again, jabber.el delivers
-excellent console performance and customizable hooks (if you have
-speech synthesizer software, hook it up to your presence alerts).
-
- <p>jabber.el does not yet support GPG, sending and receiving
-roster items, and various other things.
-
-<ul class="menu">
-<li><a accesskey="1" href="Contact.html#Contact">Contact</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Invitations.html b/html/Invitations.html
deleted file mode 100644
index 79ede6e..0000000
--- a/html/Invitations.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<html lang="en">
-<head>
-<title>Invitations - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Groupchat.html#Groupchat" title="Groupchat">
-<link rel="prev" href="Automation.html#Automation" title="Automation">
-<link rel="next" href="Private-messages.html#Private-messages" title="Private messages">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Invitations"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Private-messages.html#Private-messages">Private messages</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Automation.html#Automation">Automation</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Groupchat.html#Groupchat">Groupchat</a>
-<hr><br>
-</div>
-
-<h3 class="section">3.2 Invitations</h3>
-
-<p><a name="index-Invitations-43"></a><a name="index-jabber_002dmuc_002dinvite-44"></a>
-You can invite someone to a groupchat with <kbd>M-x jabber-muc-invite</kbd>
-(also available in the MUC menu). Pay attention to the order of the
-arguments &mdash; as both users and rooms are just JIDs, it is technically
-possible to invite a room to a user, but that's probably not what you
-want.
-
- <p>When you receive an invitation, it appears in the chat buffer along
-with two buttons, &ldquo;Accept&rdquo; and &ldquo;Decline&rdquo;. Pressing &ldquo;Accept&rdquo;
-enters the room, as you would expect. Pressing &ldquo;Decline&rdquo; gives you
-an opportunity to state the reason why you're not joining.
-
- </body></html>
-
diff --git a/html/Keepalive.html b/html/Keepalive.html
deleted file mode 100644
index 63f8afd..0000000
--- a/html/Keepalive.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<html lang="en">
-<head>
-<title>Keepalive - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="prev" href="Modeline-status.html#Modeline-status" title="Modeline status">
-<link rel="next" href="Tracking-activity.html#Tracking-activity" title="Tracking activity">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Keepalive"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Tracking-activity.html#Tracking-activity">Tracking activity</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Modeline-status.html#Modeline-status">Modeline status</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Useful-features.html#Useful-features">Useful features</a>
-<hr><br>
-</div>
-
-<h3 class="section">10.3 Keepalive</h3>
-
-<p><a name="index-Keepalive-108"></a><a name="index-Detecting-lost-connections-109"></a><a name="index-jabber_002dkeepalive_002dstart-110"></a><a name="index-jabber_002dkeepalive_002dstop-111"></a><a name="index-jabber_002dkeepalive_002dinterval-112"></a><a name="index-jabber_002dkeepalive_002dtimeout-113"></a>
-Sometimes network connections are lost without you noticing. This is
-especially true with Jabber, as it is quite reasonable to keep the
-connection open for a long time without either sending or receiving
-any data.
-
- <p>If you want to detect a lost connection earlier, you can use the
-keepalive functions. Type <kbd>M-x jabber-keepalive-start</kbd> to start
-it, and <kbd>M-x jabber-keepalive-stop</kbd> to stop it.
-
- <p>These functions work by asking your server for the time once in a
-while (by default every ten minutes), and considering the connection
-lost if the server doesn't answer within reasonable time (by default
-20 seconds).
-
- <p>You can customize the interval and the timeout with the variables
-<code>jabber-keepalive-interval</code> and <code>jabber-keepalive-timeout</code>,
-respectively.
-
- </body></html>
-
diff --git a/html/Listening-for-new-requests.html b/html/Listening-for-new-requests.html
deleted file mode 100644
index 010d2d6..0000000
--- a/html/Listening-for-new-requests.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<html lang="en">
-<head>
-<title>Listening for new requests - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="Roster-structure.html#Roster-structure" title="Roster structure">
-<link rel="next" href="Sending-new-requests.html#Sending-new-requests" title="Sending new requests">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Listening-for-new-requests"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Sending-new-requests.html#Sending-new-requests">Sending new requests</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Roster-structure.html#Roster-structure">Roster structure</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.3 Listening for new requests</h3>
-
-<p><a name="index-jabber_002dsend_002diq-231"></a><a name="index-jabber_002dprocess_002diq-232"></a><a name="index-jabber_002dsignal_002derror-233"></a><a name="index-jabber_002diq_002dget_002dxmlns_002dalist-234"></a><a name="index-jabber_002diq_002dset_002dxmlns_002dalist-235"></a>
-To listen for new IQ requests, add the appropriate entry in
-<code>jabber-iq-get-xmlns-alist</code> or <code>jabber-iq-set-xmlns-alist</code>.
-The key is the namespace of the request, and the value is a function
-that takes one argument, the entire IQ stanza in list format.
-<code>jabber-process-iq</code> reads these alists to determine which
-function to call on incoming packets.
-
- <p>For example, the Ad-Hoc Commands module contains the following:
-
-<pre class="example"> (add-to-list 'jabber-iq-set-xmlns-alist
- (cons "http://jabber.org/protocol/commands" 'jabber-ahc-process))
-</pre>
- <p>To send a response to an IQ request, use <span class="samp">(jabber-send-iq
-</span><var>sender</var><span class="samp"> "result" </span><var>query</var><span class="samp"> nil nil nil nil </span><var>id</var><span class="samp">)</span>, where
-<var>query</var> is the query in list format. <code>jabber-send-iq</code> will
-encapsulate the query in an IQ packet with the specified id.
-
- <p>To return an error to the Jabber entity that sent the query, use
-<code>jabber-signal-error</code>. The signal is caught by
-<code>jabber-process-iq</code>, which takes care of sending the error.
-
- </body></html>
-
diff --git a/html/MUC-Administration.html b/html/MUC-Administration.html
deleted file mode 100644
index a73e18d..0000000
--- a/html/MUC-Administration.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<html lang="en">
-<head>
-<title>MUC Administration - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Groupchat.html#Groupchat" title="Groupchat">
-<link rel="prev" href="Private-messages.html#Private-messages" title="Private messages">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="MUC-Administration"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Private-messages.html#Private-messages">Private messages</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Groupchat.html#Groupchat">Groupchat</a>
-<hr><br>
-</div>
-
-<h3 class="section">3.4 Administration</h3>
-
-<p>Administration of a MUC room mostly consists of managing roles and
-affiliations. Roles are temporary, and apply until the user leaves the
-room. Affiliations are permanent, and based on JIDs.
-
-<h4 class="subsection">3.4.1 Roles</h4>
-
-<p><a name="index-jabber_002dmuc_002dset_002drole-47"></a><a name="index-Kicking_002c-MUC-48"></a><a name="index-Voice_002c-MUC-49"></a><a name="index-Moderator_002c-MUC-50"></a><a name="index-Roles_002c-MUC-51"></a>If you have moderator privileges, you can change the role of a
-participant with <kbd>M-x jabber-muc-set-role</kbd>. Kicking means setting
-the role to &ldquo;none&rdquo;. Granting and revoking voice are &ldquo;participant&rdquo;
-and &ldquo;visitor&rdquo;, respectively. &ldquo;moderator&rdquo; gives moderator
-privileges, obviously.
-
- <p>The possible roles are:
-
- <dl>
-<dt><span class="samp">moderator</span><dd>Has voice, can change other people's roles.
-
- <br><dt><span class="samp">participant</span><dd>Has voice.
-
- <br><dt><span class="samp">visitor</span><dd>Doesn't have voice (can't send messages to everyone, but can send
-private messages)
-
- <br><dt><span class="samp">none</span><dd>Not in room.
-</dl>
-
-<h4 class="subsection">3.4.2 Affiliations</h4>
-
-<p><a name="index-jabber_002dmuc_002dset_002daffiliation-52"></a><a name="index-Affiliations_002c-MUC-53"></a><a name="index-Banning_002c-MUC-54"></a>If you have admin or owner privileges, you can change the affiliation of
-a user with <kbd>M-x jabber-muc-set-affiliation</kbd>. Affiliation is
-persistent, and based on JIDs. Depending of your affiliation and the
-MUC implementation, you might not be allowed to perform all kinds of
-changes, and maybe not in one step.
-
- <p>Affiliations are:
-
- <dl>
-<dt><span class="samp">owner</span><dd>Can destroy room, appoint admins, make people members, ban people.
-
- <br><dt><span class="samp">admin</span><dd>Can make people members or ban people.
-
- <br><dt><span class="samp">member</span><dd>Can enter the room, and has voice by default.
-
- <br><dt><span class="samp">none</span><dd>Rights depend on room configuration. The room might be members-only, or
-grant voice only to members.
-
- <br><dt><span class="samp">outcast</span><dd>Banned from the room
-</dl>
-
- </body></html>
-
diff --git a/html/MUC-alerts.html b/html/MUC-alerts.html
deleted file mode 100644
index 909b2e4..0000000
--- a/html/MUC-alerts.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html lang="en">
-<head>
-<title>MUC alerts - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="prev" href="Message-alerts.html#Message-alerts" title="Message alerts">
-<link rel="next" href="Info-alerts.html#Info-alerts" title="Info alerts">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="MUC-alerts"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Info-alerts.html#Info-alerts">Info alerts</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Message-alerts.html#Message-alerts">Message alerts</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>
-<hr><br>
-</div>
-
-<h4 class="subsection">15.6.4 MUC alerts</h4>
-
-<p><a name="index-jabber_002dalert_002dmuc_002dfunction-216"></a><a name="index-jabber_002dmuc_002dalert_002dself-217"></a><a name="index-jabber_002dmuc_002ddefault_002dmessage-218"></a>
-Set <code>jabber-alert-muc-function</code> to your desired
-function. This function should look like:
-
-<pre class="example"> (defun <var>function</var> (<var>nick</var> <var>group</var> <var>buffer</var> <var>text</var>)
- ...
- )
-</pre>
- <p><var>nick</var> is the nickname, <var>group</var> is the JID of the group,
-<var>buffer</var> is the buffer where the message is displayed, and
-<var>text</var> is the text of the message.
-
- <p>The default function, <code>jabber-muc-default-message</code>, returns
-&ldquo;Message from <var>nick</var> in <var>group</var>&rdquo; or &ldquo;Message in
-<var>group</var>&rdquo;, the latter for messages from the room itself.
-
- <p>All MUC alert hooks take the same arguments plus the additional
-<var>proposed-alert</var>, which is the result of the specified message
-function.
-
- <p>By default, no alert is made for messages from yourself. To change
-that, customize the variable <code>jabber-muc-alert-self</code>.
-
- </body></html>
-
diff --git a/html/Message-alerts.html b/html/Message-alerts.html
deleted file mode 100644
index 29f37d8..0000000
--- a/html/Message-alerts.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<html lang="en">
-<head>
-<title>Message alerts - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="prev" href="Presence-alerts.html#Presence-alerts" title="Presence alerts">
-<link rel="next" href="MUC-alerts.html#MUC-alerts" title="MUC alerts">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Message-alerts"></a>Next:&nbsp;<a rel="next" accesskey="n" href="MUC-alerts.html#MUC-alerts">MUC alerts</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Presence-alerts.html#Presence-alerts">Presence alerts</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>
-<hr><br>
-</div>
-
-<h4 class="subsection">15.6.3 Message alerts</h4>
-
-<p><a name="index-jabber_002dalert_002dmessage_002dfunction-213"></a><a name="index-jabber_002dmessage_002ddefault_002dmessage-214"></a><a name="index-jabber_002dmessage_002dalert_002dsame_002dbuffer-215"></a>
-If you don't want message alerts when the chat buffer in question is
-already the current buffer, set <code>jabber-message-alert-same-buffer</code>
-to nil. This affects the behaviour of the default message function, so
-you'll have to reimplement this functionality if you write your own
-message function.
-
- <p>Set <code>jabber-alert-message-function</code> to your desired
-function.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> This function should look like:
-
-<pre class="example"> (defun <var>function</var> (<var>from</var> <var>buffer</var> <var>text</var>)
- ...
- )
-</pre>
- <p><var>from</var> is the JID symbol (see <a href="Roster-structure.html#Roster-structure">Roster structure</a>), <var>buffer</var>
-is the buffer where the message is displayed, and <var>text</var> is the
-text of the message.
-
- <p>The default function, <code>jabber-message-default-message</code>, returns
-&ldquo;Message from <var>person</var>&rdquo;, where <var>person</var> is the name of the
-person if specified in the roster, otherwise the JID.
-
- <p>All message alert hooks take the same arguments plus the additional
-<var>proposed-alert</var>, which is the result of the specified message
-function.
-
- <div class="footnote">
-<hr>
-<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> Logically it should be
-<code>jabber-alert-message-message-function</code>, but that would be
-really ugly.</p>
-
- <p><hr></div>
-
- </body></html>
-
diff --git a/html/Message-events.html b/html/Message-events.html
deleted file mode 100644
index 6d9edf6..0000000
--- a/html/Message-events.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<html lang="en">
-<head>
-<title>Message events - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Message-history.html#Message-history" title="Message history">
-<link rel="next" href="Roster-import-and-export.html#Roster-import-and-export" title="Roster import and export">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Message-events"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Message-history.html#Message-history">Message history</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">12 Message events</h2>
-
-<p><a name="index-Composing-137"></a><a name="index-Delivered-138"></a><a name="index-Displayed-139"></a><a name="index-jabber_002devents_002drequest_002dthese-140"></a><a name="index-jabber_002devents_002dconfirm_002ddelivered-141"></a><a name="index-jabber_002devents_002dconfirm_002ddisplayed-142"></a><a name="index-jabber_002devents_002dconfirm_002dcomposing-143"></a>
-In the status line of the chat buffer, you can sometimes see
-notifications about the progress of the message you just sent. These
-states are possible:
-
- <ul>
-<li>Delivered to offline storage (the user will receive it on next logon)
-
- <li>Delivered to user's client (but not necessarily displayed)
-
- <li>Displayed to user
-
- <li>User is composing a reply
-
- </ul>
-
- <p>The first state is only reported by servers; the other three are
-reported by clients. jabber.el can report all three of them, and can
-display all four; not all clients support all states, though.
-
- <p>If you don't want jabber.el to send out this information about you, set
-the variables <code>jabber-events-confirm-delivered</code>,
-<code>jabber-events-confirm-displayed</code>, and/or
-<code>jabber-events-confirm-composing</code> to nil. You can make jabber.el
-not to request such information by customizing
-<code>jabber-events-request-these</code>.
-
- </body></html>
-
diff --git a/html/Message-history.html b/html/Message-history.html
deleted file mode 100644
index 3b59854..0000000
--- a/html/Message-history.html
+++ /dev/null
@@ -1,83 +0,0 @@
-<html lang="en">
-<head>
-<title>Message history - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="next" href="Message-events.html#Message-events" title="Message events">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Message-history"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Message-events.html#Message-events">Message events</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Useful-features.html#Useful-features">Useful features</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">11 Message history</h2>
-
-<p><a name="index-History-126"></a><a name="index-Backlog-127"></a><a name="index-Rotation-128"></a><a name="index-jabber_002dhistory_002denabled-129"></a><a name="index-jabber_002dglobal_002dhistory_002dfilename-130"></a><a name="index-jabber_002duse_002dglobal_002dhistory-131"></a><a name="index-jabber_002dhistory_002ddir-132"></a><a name="index-jabber_002dhistory_002denable_002drotation-133"></a><a name="index-jabber_002dhistory_002dsize_002dlimit-134"></a><a name="index-jabber_002dbacklog_002dnumber-135"></a><a name="index-jabber_002dbacklog_002ddays-136"></a>
-If you want a record of messages sent and received, set
-<code>jabber-history-enabled</code> to t. By default all messages to will
-be saved to a global history file specified by
-<code>jabber-global-history-filename</code>
-(<span class="file">~/.jabber_global_message_log</span> by default). If you prefer to
-store your chats' history in per-contact files, you can set the
-<code>jabber-use-global-history</code> variable to <code>nil</code>. When using
-per-contact history, files are named by the contact JID and saved
-under the directory specified by the variable
-<code>jabber-history-dir</code> (default is <span class="file">~/.emacs-jabber</span>).
-
- <p>There is no facility for reading old messages yet, but just reading
-the file as text should be enough for many purposes.
-
- <p>When you open a new chat buffer and have entries in your history file,
-the last few messages you recently exchanged with the contact in
-question will be inserted. You can control how many messages with
-<code>jabber-backlog-number</code> (by default 10), and how old messages
-with <code>jabber-backlog-days</code> (by default 3 days).
-
- <p>If you worry about your history file(s) size, you can enable history
-rotation feature by setting the variable
-<code>jabber-history-enable-rotation</code> to <code>t</code> (default is
-<code>nil</code>). This feature &ldquo;rotates&rdquo; your history files according to
-the following rule: When <code>jabber-history-size-limit</code> (in
-kilobytes) is reached, the history file is renamed to
-&lt;history-file&gt;-&lt;number&gt;, where &lt;number&gt; is 1 or the smallest number
-after the last rotation. For example, suppose you set the
-<code>jabber-history-size-limit</code> variable to 512 and you chat with
-your buddy foo@jabber.server using the per-contact strategy to store
-history files. So, when the history file (<span class="file">foo@jabber-server</span>)
-reaches 512K bytes, it will be renamed to <span class="file">foo@jabber-server-1</span>
-and <span class="file">foo@jabber-server</span> will be set empty. Next time
-<span class="file">foo@jabber-server</span> grows to 512K bytes, it will be saved as
-<span class="file">foo@jabber-server-2</span> and so on. Although the example was
-presented with the per-contact history file strategy, history rotation
-works for both per-contact and global history logging strategies.
-
- </body></html>
-
diff --git a/html/Miscellaneous-settings.html b/html/Miscellaneous-settings.html
deleted file mode 100644
index d2b1484..0000000
--- a/html/Miscellaneous-settings.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<html lang="en">
-<head>
-<title>Miscellaneous settings - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customization.html#Customization" title="Customization">
-<link rel="prev" href="Connection-settings.html#Connection-settings" title="Connection settings">
-<link rel="next" href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer" title="Customizing the roster buffer">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Miscellaneous-settings"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Connection-settings.html#Connection-settings">Connection settings</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customization.html#Customization">Customization</a>
-<hr><br>
-</div>
-
-<h3 class="section">15.3 Miscellaneous settings</h3>
-
-<p><a name="index-jabber_002dmenu-178"></a><a name="index-Menus-179"></a>
-If you want a Jabber menu on the menu bar with some common commands,
-type <kbd>M-x jabber-menu</kbd>. You can remove it again with <kbd>C-u M-x
-jabber-menu</kbd>. Unfortunately, this cannot be changed through Customize
-settings, so you need to add <code>(jabber-menu)</code> to your <span class="file">.emacs</span>
-to enable it permanently.
-
- </body></html>
-
diff --git a/html/Modeline-status.html b/html/Modeline-status.html
deleted file mode 100644
index d906665..0000000
--- a/html/Modeline-status.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<html lang="en">
-<head>
-<title>Modeline status - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="prev" href="Autoaway.html#Autoaway" title="Autoaway">
-<link rel="next" href="Keepalive.html#Keepalive" title="Keepalive">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Modeline-status"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Keepalive.html#Keepalive">Keepalive</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Autoaway.html#Autoaway">Autoaway</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Useful-features.html#Useful-features">Useful features</a>
-<hr><br>
-</div>
-
-<h3 class="section">10.2 Modeline status</h3>
-
-<p><a name="index-Modeline-104"></a><a name="index-jabber_002dmode_002dline_002dmode-105"></a><a name="index-jabber_002dmode_002dline_002dmode-106"></a><a name="index-jabber_002dmode_002dline_002dcompact-107"></a>
-By typing <kbd>M-x jabber-mode-line-mode</kbd> you toggle display of some
-status in mode lines. The information is your own presence status,
-and some numbers showing the status of your roster contacts. By
-default, there are three numbers, for &ldquo;online&rdquo; (chatty and online),
-&ldquo;away&rdquo; (away, extended away and do not disturb) and offline
-contacts.
-
- <p>If you set <code>jabber-mode-line-compact</code> to nil, you get a complete
-breakdown of presence status. That gives you six numbers indicating
-the number of chatty, online, away, extended away, dnd, and offline
-contacts, respectively.
-
- </body></html>
-
diff --git a/html/Personal-information.html b/html/Personal-information.html
deleted file mode 100644
index 66fe866..0000000
--- a/html/Personal-information.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html lang="en">
-<head>
-<title>Personal information - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Services.html#Services" title="Services">
-<link rel="next" href="Avatars.html#Avatars" title="Avatars">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Personal-information"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Avatars.html#Avatars">Avatars</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Services.html#Services">Services</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">7 Personal information</h2>
-
-<p><a name="index-vCard-85"></a><a name="index-Personal-information-86"></a><a name="index-jabber_002dvcard_002dget-87"></a><a name="index-jabber_002dvcard_002dedit-88"></a>
-The Jabber way of handling personal information (name, addresses,
-phone numbers, etc) is &ldquo;vCards&rdquo; encoded in XML. You can get
-information about a user by running <kbd>M-x jabber-vcard-get</kbd>, and
-you can edit your own information by running <kbd>M-x
-jabber-vcard-edit</kbd>.
-
- <p>The form for editing your information can be slightly confusing &mdash;
-you are allowed to enter any number of addresses, phone numbers and
-e-mail addresses, each of which has a set of orthogonal properties.
-You can add and remove items with the [INS] and [DEL] buttons,
-respectively.
-
- <p>This is also where you set your avatar (see <a href="Avatars.html#Avatars">Avatars</a>). The size of
-your avatar file is limited to 8 kilobytes.
-
- </body></html>
-
diff --git a/html/Presence-alerts.html b/html/Presence-alerts.html
deleted file mode 100644
index fba3bda..0000000
--- a/html/Presence-alerts.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<html lang="en">
-<head>
-<title>Presence alerts - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="prev" href="Standard-alerts.html#Standard-alerts" title="Standard alerts">
-<link rel="next" href="Message-alerts.html#Message-alerts" title="Message alerts">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Presence-alerts"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Message-alerts.html#Message-alerts">Message alerts</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Standard-alerts.html#Standard-alerts">Standard alerts</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>
-<hr><br>
-</div>
-
-<h4 class="subsection">15.6.2 Presence alerts</h4>
-
-<p><a name="index-jabber_002dalert_002dpresence_002dmessage_002dfunction-211"></a><a name="index-jabber_002dpresence_002ddefault_002dmessage-212"></a>
-Set <code>jabber-alert-presence-message-function</code> to your desired
-function. This function should look like:
-
-<pre class="example"> (defun <var>function</var> (<var>who</var> <var>oldstatus</var> <var>newstatus</var> <var>statustext</var>)
- ...
- )
-</pre>
- <p><var>who</var> is the JID symbol (see <a href="Roster-structure.html#Roster-structure">Roster structure</a>),
-<var>oldstatus</var> and <var>newstatus</var> are the previous and current
-stati, respectively, and <var>statustext</var> is the status message if
-provided, otherwise nil.
-
- <p><var>newstatus</var> can also be one of <code>"subscribe"</code>,
-<code>"subscribed"</code>, <code>"unsubscribe"</code> and <code>"unsubscribed"</code>.
-
- <p>The default function, <code>jabber-presence-default-message</code>, returns
-<code>nil</code> if <var>oldstatus</var> and <var>newstatus</var> are the same, and in
-other cases constructs a message from the given data.
-
- <p>All presence alert hooks take the same arguments plus the additional
-<var>proposed-alert</var>, which is the result of the specified message
-function. This last argument is usually the only one they use.
-
- </body></html>
-
diff --git a/html/Presence-subscription.html b/html/Presence-subscription.html
deleted file mode 100644
index 7402dc5..0000000
--- a/html/Presence-subscription.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<html lang="en">
-<head>
-<title>Presence subscription - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="prev" href="Presence.html#Presence" title="Presence">
-<link rel="next" href="Roster-buffer.html#Roster-buffer" title="Roster buffer">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Presence-subscription"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Roster-buffer.html#Roster-buffer">Roster buffer</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Presence.html#Presence">Presence</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Basic-operation.html#Basic-operation">Basic operation</a>
-<hr><br>
-</div>
-
-<h3 class="section">2.4 Presence subscription</h3>
-
-<p><a name="index-Presence-subscription-17"></a><a name="index-Subscribing-to-someone_0027s-presence-18"></a><a name="index-jabber_002dsend_002dsubscription_002drequest-19"></a>
-Having permission to view the presence status of a person is called
-<dfn>subscribing to his presence</dfn>. Presence subscription between two
-persons can be asymmetric.
-
- <p>When jabber.el receives a presence subscription request, it will
-present it to you in an alert requiring immediate response, and offer
-you to send a subscription request back to that person.
-
- <p>To request subscription to someone, type <kbd>M-x
-jabber-send-subscription-request</kbd>. You will be prompted for the JID
-to send it to. This command can also be accessed through the Roster
-menu, by typing <kbd>C-c C-r</kbd> in the roster buffer. After that, you
-will probably want to give the contact a more readable name. The
-command for that is <code>jabber-roster-change</code>, which is also
-available in the Roster menu or by typing <kbd>e</kbd> on a person in the
-roster buffer.
-
- </body></html>
-
diff --git a/html/Presence.html b/html/Presence.html
deleted file mode 100644
index d720a38..0000000
--- a/html/Presence.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<html lang="en">
-<head>
-<title>Presence - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="prev" href="Chatting.html#Chatting" title="Chatting">
-<link rel="next" href="Presence-subscription.html#Presence-subscription" title="Presence subscription">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Presence"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Presence-subscription.html#Presence-subscription">Presence subscription</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Chatting.html#Chatting">Chatting</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Basic-operation.html#Basic-operation">Basic operation</a>
-<hr><br>
-</div>
-
-<h3 class="section">2.3 Presence</h3>
-
-<p><a name="index-Presence-7"></a><a name="index-Sending-presence-8"></a><a name="index-jabber_002dsend_002dpresence-9"></a><a name="index-jabber_002dsend_002ddefault_002dpresence-10"></a><a name="index-jabber_002ddefault_002dshow-11"></a><a name="index-jabber_002ddefault_002dstatus-12"></a><a name="index-jabber_002ddefault_002dpriority-13"></a>
-&ldquo;Presence&rdquo; is the Jabber term for letting other people know that you
-are online, and additionally how &ldquo;available&rdquo; you are. There are
-three elements to presence: availability status (called &ldquo;show&rdquo;),
-status message, and priority.
-
- <p>Your show status may either be empty (meaning simply &ldquo;online&rdquo;), or
-one of <code>away</code>, <code>xa</code>, <code>dnd</code> and <code>chat</code>, meaning
-&ldquo;away&rdquo;, &ldquo;extended away&rdquo; (i.e. away for an extended period), &ldquo;do
-not disturb&rdquo;, and &ldquo;free for chat&rdquo;, respectively. This information
-is available to everyone subscribing to your presence, but technically
-it does not restrict anyone's actions. You can chat with people even
-if you claim to be away.
-
- <p>The status message is a short text complementing your show status,
-such as &ldquo;at home&rdquo;, &ldquo;working&rdquo;, &ldquo;phone&rdquo;, &ldquo;playing games&rdquo; or
-whatever you want. It is sent to everyone subscribing to your
-presence, but not all clients prominently display it to the user.
-
- <p>The priority is only interesting if you are running more than one
-Jabber client at a time accessing the same account. In that case,
-messages sent to you without an indication of which client to send to
-are sent to the client with the highest priority.
-
- <p>To set your presence, use the function <code>jabber-send-presence</code>.
-It can be called both interactively and in Lisp code. For the latter
-case, use something like <code>(jabber-send-presence "away" "idle for
-10 minutes" 10)</code>.
-
- <p>By default, jabber.el sets your presence when you connect. If you
-want it not to do that, remove <code>jabber-send-default-presence</code>
-from <code>jabber-post-connect-hook</code>. If you want to change the
-presence that is sent, change the variables
-<code>jabber-default-show</code>, <code>jabber-default-status</code> and
-<code>jabber-default-priority</code>.
-
- <p>With jabber.el, you can set your presence remotely. See <a href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">Ad-Hoc Commands</a>.
-
- <p><a name="index-directed-presence-14"></a><a name="index-send-directed-presence-15"></a><a name="index-jabber_002dsend_002ddirected_002dpresence-16"></a>You can send &ldquo;directed presence&rdquo; with <kbd>M-x
-jabber-send-directed-presence</kbd>. This is mostly useful to manage
-transports&mdash;sending directed presence is a way to turn them on and
-off. You can also send directed presence to an annoying contact to
-appear as away or offline to that contact. Note, however, that in both
-of these cases, all subscribed entities will get your next global
-presence update.
-
- </body></html>
-
diff --git a/html/Private-messages.html b/html/Private-messages.html
deleted file mode 100644
index 106cfef..0000000
--- a/html/Private-messages.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<html lang="en">
-<head>
-<title>Private messages - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Groupchat.html#Groupchat" title="Groupchat">
-<link rel="prev" href="Invitations.html#Invitations" title="Invitations">
-<link rel="next" href="MUC-Administration.html#MUC-Administration" title="MUC Administration">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Private-messages"></a>Next:&nbsp;<a rel="next" accesskey="n" href="MUC-Administration.html#MUC-Administration">MUC Administration</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Invitations.html#Invitations">Invitations</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Groupchat.html#Groupchat">Groupchat</a>
-<hr><br>
-</div>
-
-<h3 class="section">3.3 Private messages</h3>
-
-<p><a name="index-Private-MUC-messages-45"></a><a name="index-jabber_002dmuc_002dprivate-46"></a>
-You can open a private chat with a participant in a chat room with
-<kbd>M-x jabber-muc-private</kbd> (or by using the MUC menu). This creates
-a buffer with the name
-<code>*-jabber-muc-priv-</code><var>group</var><code>-</code><var>nickname</var><code>-*</code> (customizable by
-<code>jabber-muc-private-buffer-format</code>), which behaves mostly like an
-ordinary chat buffer. This buffer will also be created if someone
-sends a private message to you.
-
- <p>Private MUC messages use the same alerts as normal chat messages.
-See <a href="Message-alerts.html#Message-alerts">Message alerts</a>.
-
- </body></html>
-
diff --git a/html/Protocol-support.html b/html/Protocol-support.html
deleted file mode 100644
index 4448210..0000000
--- a/html/Protocol-support.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<html lang="en">
-<head>
-<title>Protocol support - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="next" href="Concept-index.html#Concept-index" title="Concept index">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Protocol-support"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Concept-index.html#Concept-index">Concept index</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="appendix">Appendix A Protocol support</h2>
-
-<p><a name="index-Supported-protocols-252"></a>
-These are the protocols currently supported (in full or partially) by
-jabber.el.
-
-<ul class="menu">
-<li><a accesskey="1" href="RFC-3920.html#RFC-3920">RFC 3920</a>: XMPP-CORE
-<li><a accesskey="2" href="RFC-3921.html#RFC-3921">RFC 3921</a>: XMPP-IM
-<li><a accesskey="3" href="XEP_002d0004.html#XEP_002d0004">XEP-0004</a>: Data Forms
-<li><a accesskey="4" href="XEP_002d0012.html#XEP_002d0012">XEP-0012</a>: Last Activity
-<li><a accesskey="5" href="XEP_002d0020.html#XEP_002d0020">XEP-0020</a>: Feature Negotiation
-<li><a accesskey="6" href="XEP_002d0022.html#XEP_002d0022">XEP-0022</a>: Message Events
-<li><a accesskey="7" href="XEP_002d0030.html#XEP_002d0030">XEP-0030</a>: Service Discovery
-<li><a accesskey="8" href="XEP_002d0045.html#XEP_002d0045">XEP-0045</a>: Multi-User Chat
-<li><a accesskey="9" href="XEP_002d0049.html#XEP_002d0049">XEP-0049</a>: Private XML Storage
-<li><a href="XEP_002d0050.html#XEP_002d0050">XEP-0050</a>: Ad-Hoc Commands
-<li><a href="XEP_002d0054.html#XEP_002d0054">XEP-0054</a>: vcard-temp
-<li><a href="XEP_002d0055.html#XEP_002d0055">XEP-0055</a>: Jabber Search
-<li><a href="XEP_002d0065.html#XEP_002d0065">XEP-0065</a>: SOCKS5 Bytestreams
-<li><a href="XEP_002d0066.html#XEP_002d0066">XEP-0066</a>: Out of Band Data
-<li><a href="XEP_002d0068.html#XEP_002d0068">XEP-0068</a>: Field Standardization for Data Forms
-<li><a href="XEP_002d0077.html#XEP_002d0077">XEP-0077</a>: In-Band Registration
-<li><a href="XEP_002d0078.html#XEP_002d0078">XEP-0078</a>: Non-SASL Authentication
-<li><a href="XEP_002d0082.html#XEP_002d0082">XEP-0082</a>: Jabber Date and Time Profiles
-<li><a href="XEP_002d0086.html#XEP_002d0086">XEP-0086</a>: Error Condition Mappings
-<li><a href="XEP_002d0090.html#XEP_002d0090">XEP-0090</a>: Entity Time
-<li><a href="XEP_002d0091.html#XEP_002d0091">XEP-0091</a>: Delayed Delivery
-<li><a href="XEP_002d0092.html#XEP_002d0092">XEP-0092</a>: Software Version
-<li><a href="XEP_002d0095.html#XEP_002d0095">XEP-0095</a>: Stream Initiation
-<li><a href="XEP_002d0096.html#XEP_002d0096">XEP-0096</a>: File Transfer
-<li><a href="XEP_002d0146.html#XEP_002d0146">XEP-0146</a>: Remote Controlling Clients
-<li><a href="XEP_002d0153.html#XEP_002d0153">XEP-0153</a>: vCard-Based Avatars
-</ul>
-
- </body></html>
-
diff --git a/html/RFC-3920.html b/html/RFC-3920.html
deleted file mode 100644
index f442dd8..0000000
--- a/html/RFC-3920.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html lang="en">
-<head>
-<title>RFC 3920 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="next" href="RFC-3921.html#RFC-3921" title="RFC 3921">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="RFC-3920"></a>Next:&nbsp;<a rel="next" accesskey="n" href="RFC-3921.html#RFC-3921">RFC 3921</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Protocol-support.html#Protocol-support">Protocol support</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.1 RFC 3920 (XMPP-CORE)</h3>
-
-<p>Most of RFC 3920 is supported, with the following exceptions.
-
- <p>SASL is supported only when an external SASL library from FLIM or Gnus
-is present. As SASL is an essential part to XMPP, jabber.el will send
-pre-XMPP stream headers if it is not available.
-
- <p>None of the stringprep profiles are implemented. jabber.el changes
-JIDs to lowercase internally; that's all.
-
- <p>jabber.el doesn't interpret namespace prefixes.
-
- <p>The <code>xml:lang</code> attribute is neither interpreted nor generated.
-
- <p>SRV records are used if a modern version of <code>dns.el</code> is installed.
-
- </body></html>
-
diff --git a/html/RFC-3921.html b/html/RFC-3921.html
deleted file mode 100644
index 38702b1..0000000
--- a/html/RFC-3921.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<html lang="en">
-<head>
-<title>RFC 3921 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="RFC-3920.html#RFC-3920" title="RFC 3920">
-<link rel="next" href="XEP_002d0004.html#XEP_002d0004" title="XEP-0004">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="RFC-3921"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0004.html#XEP_002d0004">XEP-0004</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="RFC-3920.html#RFC-3920">RFC 3920</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.2 RFC 3921 (XMPP-IM)</h3>
-
-<p>Most of RFC 3921 is supported, with the following exceptions.
-
- <p>Messages of type &ldquo;headline&rdquo; are not treated in any special way.
-
- <p>The <code>&lt;thread/&gt;</code> element is not used or generated.
-
- <p>Sending &ldquo;directed presence&rdquo; is supported; however, presence stanzas
-received from contacts not in roster are ignored.
-
- <p>Privacy lists are not supported at all.
-
- <p>jabber.el doesn't support XMPP-E2E or &ldquo;im:&rdquo; CPIM URIs.
-
- </body></html>
-
diff --git a/html/Receiving-files.html b/html/Receiving-files.html
deleted file mode 100644
index a01a036..0000000
--- a/html/Receiving-files.html
+++ /dev/null
@@ -1,67 +0,0 @@
-<html lang="en">
-<head>
-<title>Receiving files - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="File-transfer.html#File-transfer" title="File transfer">
-<link rel="prev" href="File-transfer.html#File-transfer" title="File transfer">
-<link rel="next" href="Sending-files.html#Sending-files" title="Sending files">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Receiving-files"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Sending-files.html#Sending-files">Sending files</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="File-transfer.html#File-transfer">File transfer</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="File-transfer.html#File-transfer">File transfer</a>
-<hr><br>
-</div>
-
-<h3 class="section">5.1 Receiving files</h3>
-
-<p>Receiving files requires no configuration. When someone wants to send a
-file to you, you are asked (through <code>yes-or-no-p</code>) whether you want
-to accept the file. If you answer yes, you get to choose where to save
-the file.
-
- <p>If the sender's client is correctly configured (this is often not the
-case; see below), the file transfer will start. Currently, the only way
-to watch the progress is to inspect the buffer of the file being
-transfered; <kbd>C-x C-b</kbd> is one way of doing that. See <a href="../emacs/List-Buffers.html#List-Buffers">Listing Existing Buffers (GNU Emacs Manual)</a>. When the transfer
-is done, the message &ldquo;<var>file</var> downloaded&rdquo; appears in the echo area,
-and the buffer is killed.
-
- <p>If this doesn't happen, it is most likely the sender's fault. The
-sender needs to have a public IP address, either directly, through port
-forwarding (in which case the client needs to be configured with the
-real public IP address), or through an XEP-0065 proxy. If you have
-activated XML logging (see <a href="Debug-options.html#Debug-options">Debug options</a>), you can see the IP
-address that the other client is asking you to connect to there. Often
-you will find that this is an internal IP address (often starts with
-<code>192.168</code>). See the documentation of the sender's client for
-setting this up.
-
- </body></html>
-
diff --git a/html/Registering.html b/html/Registering.html
deleted file mode 100644
index 8dd7642..0000000
--- a/html/Registering.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<html lang="en">
-<head>
-<title>Registering - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Services.html#Services" title="Services">
-<link rel="prev" href="Service-discovery-and-browsing.html#Service-discovery-and-browsing" title="Service discovery and browsing">
-<link rel="next" href="Searching.html#Searching" title="Searching">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Registering"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Searching.html#Searching">Searching</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Services.html#Services">Services</a>
-<hr><br>
-</div>
-
-<h3 class="section">6.2 Registering</h3>
-
-<p><a name="index-Registration-72"></a><a name="index-Cancelling-registration-73"></a><a name="index-Changing-password-74"></a><a name="index-Gateway-registration-75"></a><a name="index-Password-change-76"></a><a name="index-Account-removal-77"></a><a name="index-Removing-an-account-78"></a><a name="index-jabber_002dget_002dregister-79"></a>
-Some services, in particular user directories and gateways to legacy
-IM systems, require registration. To register with such a service,
-either type <kbd>M-x jabber-get-register</kbd> or select it from the
-Service menu, which is opened by typing <kbd>C-c C-s</kbd>. You have to
-know the service's JID, possibly from service discovery.
-(see <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a>)
-
- <p>This is also the way to change your registration details, e.g. your
-password &mdash; just ask to register with that service again. To change
-the password of your Jabber account, ask to register with your Jabber
-server.
-
- <p>Please note that any passwords sent in this way will be sent in
-cleartext to your Jabber server, unless you have enabled SSL encryption
-(see <a href="Connection-settings.html#Connection-settings">Connection settings</a>), and possibly sent in cleartext from your
-server to the server hosting the service.
-
- <p>jabber.el will then request a registration form from that service. If
-for some reason the service does not answer (maybe network problems,
-or some services neither support registration nor report errors about
-that) that will be the last thing you saw about it. jabber.el will
-not report timeout errors, but rather simply wait until you shut it
-down.
-
- <p>Once the response arrives, the form will be rendered in a browse
-buffer. Just fill out the fields, and hit Submit. You will receive
-confirmation of your registration in the echo area.
-
- <p>To cancel an existing registration (and also for cancelling your
-Jabber account, if you sent a registration request to your server),
-hit Cancel. The unregistration will be confirmed in the echo area.
-
- </body></html>
-
diff --git a/html/Roster-buffer.html b/html/Roster-buffer.html
deleted file mode 100644
index 616b5a2..0000000
--- a/html/Roster-buffer.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<html lang="en">
-<head>
-<title>Roster buffer - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Basic-operation.html#Basic-operation" title="Basic operation">
-<link rel="prev" href="Presence-subscription.html#Presence-subscription" title="Presence subscription">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Roster-buffer"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Presence-subscription.html#Presence-subscription">Presence subscription</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Basic-operation.html#Basic-operation">Basic operation</a>
-<hr><br>
-</div>
-
-<h3 class="section">2.5 The roster buffer</h3>
-
-<p><a name="index-Roster-buffer_002c-basics-20"></a><a name="index-Menus-21"></a><a name="index-Key-bindings-22"></a><a name="index-jabber_002ddisplay_002droster-23"></a>
-The roster buffer is called <code>*-jabber-*</code>. It simply contains a
-list of the contacts on your roster.
-
- <p>In the roster buffer, any command which requires a JID will default to
-the JID under point when called. These commands can be called through
-either keyboard menus or mouse menus. To open a menu with the mouse,
-simply press the second mouse button over the JID in
-question.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> This will bring up a menu with all available
-actions. The keyboard menus are split into categories: Chat, Roster,
-Information, MUC (Multi-User Chat, or groupchat) and Services, opened
-by <kbd>C-c C-c</kbd>, <kbd>C-c C-r</kbd>, <kbd>C-c C-i</kbd>, <kbd>C-c C-m</kbd> and
-<kbd>C-c C-s</kbd>, respectively.
-
- <p>A list of keybindings is displayed at the top of the roster buffer.
-You can turn it off by setting <code>jabber-roster-show-bindings</code> to
-nil.
-
- <p>You can call <code>jabber-display-roster</code> to redisplay your roster
-according to changed preferences (see <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a>). This will not refetch your roster from the server.
-Refetching the roster is usually not needed, since updates are pushed
-to clients automatically.
-
- <p>You can choose not to have the roster updated automatically on
-presence changes (see <a href="Presence-alerts.html#Presence-alerts">Presence alerts</a>). In that case, you need to
-call <code>jabber-display-roster</code> manually.
-
- <div class="footnote">
-<hr>
-<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> For some reason, mouse menus don't work in XEmacs.
-Patches welcome.</p>
-
- <p><hr></div>
-
- </body></html>
-
diff --git a/html/Roster-import-and-export.html b/html/Roster-import-and-export.html
deleted file mode 100644
index 362ba93..0000000
--- a/html/Roster-import-and-export.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<html lang="en">
-<head>
-<title>Roster import and export - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Message-events.html#Message-events" title="Message events">
-<link rel="next" href="XMPP-URIs.html#XMPP-URIs" title="XMPP URIs">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Roster-import-and-export"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Message-events.html#Message-events">Message events</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">13 Roster import and export</h2>
-
-<p><a name="index-jabber_002dexport_002droster-144"></a><a name="index-jabber_002dimport_002droster-145"></a><a name="index-Export-roster-146"></a><a name="index-Import-roster-147"></a>
-Your roster is saved on the Jabber server, and usually not in the
-client. However, you might want to save the roster to a file anyway.
-The most common reason for this is probably to copy it to another
-account.
-
- <p>To export your roster to a file, type <kbd>M-x jabber-export-roster</kbd>.
-A buffer will appear in which you can edit the data to be exported.
-Changes done in that buffer will not affect your real roster.
-
- <p>To import your roster from a file, type <kbd>M-x jabber-import-roster</kbd>.
-You will be able to edit the data before importing it. Items not in the
-roster will be added; items in the roster will be modified to match
-imported data. Subscriptions will be updated.
-
- <p>The format of the roster files is the XML used by roster pushes in the
-XMPP protocol, in UTF-8 encoding.
-
- </body></html>
-
diff --git a/html/Roster-structure.html b/html/Roster-structure.html
deleted file mode 100644
index ba0fdd3..0000000
--- a/html/Roster-structure.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<html lang="en">
-<head>
-<title>Roster structure - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="XML-representation.html#XML-representation" title="XML representation">
-<link rel="next" href="Listening-for-new-requests.html#Listening-for-new-requests" title="Listening for new requests">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Roster-structure"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XML-representation.html#XML-representation">XML representation</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.2 Roster structure</h3>
-
-<p><a name="index-_002ajabber_002droster_002a-229"></a><a name="index-jabber_002djid_002dobarray-230"></a>
-Roster entries are contained in the list <code>*jabber-roster*</code>.
-
- <p>A roster entry is a symbol. Its name is the JID, and it is interned
-in <code>jabber-jid-obarray</code>. A roster entry can have the following
-properties:
-
- <dl>
-<dt><code>xml</code><dd>The XML tag received from the server on roster update
-
- <br><dt><code>name</code><dd>The name of the roster item (just like the XML attribute)
-
- <br><dt><code>subscription</code><dd>The subscription state (also copied)
-
- <br><dt><code>ask</code><dd>The ask state (copied)
-
- <br><dt><code>groups</code><dd>A list of strings (possibly empty) containing all the groups the
-contact is in
-
- <br><dt><code>connected</code><dd>Boolean, true if any resource is connected
-
- <br><dt><code>show</code><dd>Presence show status for highest-priority connected resource
-
- <br><dt><code>status</code><dd>Presence status message for highest-priority connected resource
-
- <br><dt><code>resources</code><dd>Alist. Keys are strings (resource names), values are plists with
-properties <code>connected</code>, <code>show</code>, <code>status</code> and
-<code>priority</code>.
-
- </dl>
-
- <p>Incoming presence information is inserted in <code>resources</code>, and the
-information from the resource with the highest priority is inserted in
-<code>show</code> and <code>status</code> by the function
-<code>jabber-prioritize-resources</code>.
-
- </body></html>
-
diff --git a/html/Searching.html b/html/Searching.html
deleted file mode 100644
index 0be0e38..0000000
--- a/html/Searching.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<html lang="en">
-<head>
-<title>Searching - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Services.html#Services" title="Services">
-<link rel="prev" href="Registering.html#Registering" title="Registering">
-<link rel="next" href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands" title="Ad-Hoc Commands">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Searching"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">Ad-Hoc Commands</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Registering.html#Registering">Registering</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Services.html#Services">Services</a>
-<hr><br>
-</div>
-
-<h3 class="section">6.3 Searching</h3>
-
-<p><a name="index-Searching-80"></a><a name="index-jabber_002dget_002dsearch-81"></a>
-Some services, notably user directories and gateways to legacy IM
-systems, allow searching. Searching in Jabber generally means
-searching for someone's JID, but the protocol is general enough to
-support most databases.
-
- <p>To search a service, either type <kbd>M-x jabber-get-search</kbd> or select
-it from the Service menu, which is opened by typing <kbd>C-c C-s</kbd>.
-
- <p>Just like with registration, this command sends a request for a search
-form, and displays it if and when the response arrives. Enter your
-search and submit it. Search results will be displayed in a different
-browse buffer.
-
- </body></html>
-
diff --git a/html/Sending-files.html b/html/Sending-files.html
deleted file mode 100644
index 6685489..0000000
--- a/html/Sending-files.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<html lang="en">
-<head>
-<title>Sending files - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="File-transfer.html#File-transfer" title="File transfer">
-<link rel="prev" href="Receiving-files.html#Receiving-files" title="Receiving files">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Sending-files"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Receiving-files.html#Receiving-files">Receiving files</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="File-transfer.html#File-transfer">File transfer</a>
-<hr><br>
-</div>
-
-<h3 class="section">5.2 Sending files</h3>
-
-<p><a name="index-proxy_002c-file-transfer-60"></a><a name="index-file-transfer-proxy-61"></a><a name="index-XEP_002d0065-proxy-62"></a>
-To send a file to someone, you need an XEP-0065 proxy.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> If your Jabber server hosts such a proxy, it will be found
-automatically, otherwise it needs to be manually configured.
-
- <p>You can check whether your Jabber server has a proxy with <kbd>M-x
-jabber-get-disco-items</kbd>; see <a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a>.
-
- <p><a name="index-jabber_002dsocks5_002dproxies-63"></a><a name="index-jabber_002dsocks5_002dquery_002dall_002dproxies-64"></a>To configure a proxy manually, customize the variable
-<code>jabber-socks5-proxies</code>. Putting <code>proxy.jabber.se</code> there
-should work. Type <kbd>M-x jabber-socks5-query-all-proxies</kbd> to see if
-the proxies answer.
-
- <p><a name="index-jabber_002dft_002dsend-65"></a>Now, you can type <kbd>M-x jabber-ft-send</kbd> to send a file to someone.
-You need to enter the correct full JID, including resource, to get this
-right. If the contact is logged in with only one client, and you can
-see it online, just typing the JID or roster name is enough. If you run
-the command from a chat buffer, the JID of the contact is given as
-the default value.
-
- <p>If the contact has several clients online, you probably want to send the
-file to a particular one. If you run this command from within a chat
-buffer, the default target will be the one that last sent a message to
-you. If you just type a bare JID or a roster name, the client with the
-highest priority will get the file.
-
- <p>If the contact accepts the file, and the contact's client succeeds in
-connecting to the proxy, jabber.el will send the file through the
-proxy. During this time, your Emacs will be blocked, so you might want
-to avoid sending large files over slow connections.
-
- <div class="footnote">
-<hr>
-<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> This
-requirement is not inherent in the protocol, only in the current file
-transfer implementation of jabber.el, and in Emacs versions earlier than
-22.</p>
-
- <p><hr></div>
-
- </body></html>
-
diff --git a/html/Sending-new-requests.html b/html/Sending-new-requests.html
deleted file mode 100644
index e77c2d3..0000000
--- a/html/Sending-new-requests.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<html lang="en">
-<head>
-<title>Sending new requests - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="Listening-for-new-requests.html#Listening-for-new-requests" title="Listening for new requests">
-<link rel="next" href="Extending-service-discovery.html#Extending-service-discovery" title="Extending service discovery">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Sending-new-requests"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.4 Sending new requests</h3>
-
-<p><a name="index-jabber_002dsend_002diq-236"></a><a name="index-jabber_002dprocess_002diq-237"></a><a name="index-jabber_002dreport_002dsuccess-238"></a><a name="index-jabber_002dprocess_002ddata-239"></a>
-To send an IQ request, use <code>jabber-send-iq</code>. It will generate an
-id, and create a mapping for it for use when the response comes. The
-syntax is:
-
-<pre class="example"> (jabber-send-iq <var>to</var> <var>type</var> <var>query</var>
- <var>success-callback</var> <var>success-closure</var>
- <var>failure-callback</var> <var>failure-closure</var>)
-</pre>
- <p>Both callbacks take two arguments, the IQ stanza returned and the
-closure item mentioned here.
-
- <p>Two standard callbacks are provided. <code>jabber-report-success</code>
-takes a string as closure item, and reports success or failure in the
-echo area. <code>jabber-process-data</code> prepares a browse buffer. If
-its closure argument is a function, it calls that function with point
-in this browse buffer. If it's a string, it prints that string along
-with the error message in the IQ response. If it's anything else
-(e.g. <code>nil</code>), it just dumps the XML in the browse buffer.
-
- <p>Examples follow. This is the hypothetical Jabber protocol &ldquo;frob&rdquo;,
-for which only success report is needed:
-<pre class="example"> (jabber-send-iq "someone@somewhere.org" "set"
- '(query ((xmlns . "frob")))
- 'jabber-report-success "Frobbing"
- 'jabber-report-success "Frobbing")
-</pre>
- <p>This will print &ldquo;Frobbing succeeded&rdquo; or &ldquo;Frobbing failed: reason&rdquo;,
-respectively, in the echo area.
-
- <p>The protocol &ldquo;investigate&rdquo; needs to parse results and show them in a
-browse buffer:
-<pre class="example"> (jabber-send-iq "someone@somewhere.org" "get"
- '(query ((xmlns . "investigate")))
- 'jabber-process-data 'jabber-process-investigate
- 'jabber-process-data "Investigation failed")
-</pre>
- <p>Of course, the previous example could have used
-<code>jabber-report-success</code> for the error message. It's a matter of
-UI taste.
-
- </body></html>
-
diff --git a/html/Service-discovery-and-browsing.html b/html/Service-discovery-and-browsing.html
deleted file mode 100644
index 54f28a8..0000000
--- a/html/Service-discovery-and-browsing.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<html lang="en">
-<head>
-<title>Service discovery and browsing - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Services.html#Services" title="Services">
-<link rel="prev" href="Services.html#Services" title="Services">
-<link rel="next" href="Registering.html#Registering" title="Registering">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Service-discovery-and-browsing"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Registering.html#Registering">Registering</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Services.html#Services">Services</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Services.html#Services">Services</a>
-<hr><br>
-</div>
-
-<h3 class="section">6.1 Service discovery and browsing</h3>
-
-<p><a name="index-Service-discovery-67"></a><a name="index-Browsing-68"></a><a name="index-jabber_002dget_002dbrowse-69"></a><a name="index-jabber_002dget_002ddisco_002ditems-70"></a><a name="index-jabber_002dget_002ddisco_002dinfo-71"></a>
-To find services you want to use, you need to discover them first.
-This can be done with either service discovery or browsing. Service
-discovery is the newer and preferred protocol, while browsing is still
-used by much software. The use of both is very similar.
-
- <p>The most common use of service discovery is to browse your home
-server, to see what services are provided locally. Note, however,
-that this is no restriction; you can use services from all over the
-network.
-
- <p>For service discovery there are two commands,
-<code>jabber-get-disco-items</code> and <code>jabber-get-disco-info</code>,
-depending on whether you want information about that specific JID or
-about services related to it, respectively. To start browsing, type
-<kbd>M-x jabber-get-browse</kbd> and enter the JID you want to browse.
-
- <p>These commands can be accessed from the Info menu, which is opened by
-typing <kbd>C-c C-i</kbd>.
-
- <p>If you think that the interface to service discovery is awkward and
-should be replaced with something better, you are completely right.
-
- </body></html>
-
diff --git a/html/Services.html b/html/Services.html
deleted file mode 100644
index 904c4e0..0000000
--- a/html/Services.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<html lang="en">
-<head>
-<title>Services - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="File-transfer.html#File-transfer" title="File transfer">
-<link rel="next" href="Personal-information.html#Personal-information" title="Personal information">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Services"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Personal-information.html#Personal-information">Personal information</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="File-transfer.html#File-transfer">File transfer</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">6 Services</h2>
-
-<p><a name="index-Browse-buffers-66"></a>
-Not every Jabber entity is a physical person. There are many
-automatic entities, called servers, services, components, agents,
-transports and other names. The use of these is described here.
-
- <p>The functions described in this chapter use <dfn>browse buffers</dfn>.
-Browse buffers are named <code>*-jabber-browse-:-</code><var>service</var><code>-*</code>,
-sometimes with a numerical suffix. The different menus have the same
-keybindings as in the roster buffer, and if you call a function
-operating on a JID while point is over a JID, that JID will be the
-default value, so you don't have to type it or copy it yourself.
-
-<ul class="menu">
-<li><a accesskey="1" href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">Service discovery and browsing</a>
-<li><a accesskey="2" href="Registering.html#Registering">Registering</a>
-<li><a accesskey="3" href="Searching.html#Searching">Searching</a>
-<li><a accesskey="4" href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">Ad-Hoc Commands</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Spell-checking.html b/html/Spell-checking.html
deleted file mode 100644
index 4ecef4b..0000000
--- a/html/Spell-checking.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<html lang="en">
-<head>
-<title>Spell checking - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="prev" href="Watch-buddies.html#Watch-buddies" title="Watch buddies">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Spell-checking"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Watch-buddies.html#Watch-buddies">Watch buddies</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Useful-features.html#Useful-features">Useful features</a>
-<hr><br>
-</div>
-
-<h3 class="section">10.6 Spell checking</h3>
-
-<p><a name="index-flyspell-124"></a><a name="index-Spell-checking-125"></a>
-You can activate spell checking in a chat buffer with <kbd>M-x
-flyspell-mode</kbd>. It will check only what you are currently writing, not
-what you receive or what you have already sent. You may want to add
-<code>flyspell-mode</code> to <code>jabber-chat-mode-hook</code>.
-
- <p>For more information about Emacs spell checking, See <a href="../emacs/Spelling.html#Spelling">Checking and Correcting Spelling (GNU Emacs Manual)</a>.
-
- </body></html>
-
diff --git a/html/Standard-alerts.html b/html/Standard-alerts.html
deleted file mode 100644
index 6d40bd5..0000000
--- a/html/Standard-alerts.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<html lang="en">
-<head>
-<title>Standard alerts - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="prev" href="Customizing-alerts.html#Customizing-alerts" title="Customizing alerts">
-<link rel="next" href="Presence-alerts.html#Presence-alerts" title="Presence alerts">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Standard-alerts"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Presence-alerts.html#Presence-alerts">Presence alerts</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Customizing-alerts.html#Customizing-alerts">Customizing alerts</a>
-<hr><br>
-</div>
-
-<h4 class="subsection">15.6.1 Standard alerts</h4>
-
-<p><a name="index-Alerts-209"></a><a name="index-Scroll-210"></a>
-Eight alerts are already written for all four alert categories. These
-all obey the result from the corresponding message function.
-
- <p>The <code>beep</code> alerts simply sound the terminal bell by calling
-<code>ding</code>. They are disabled by default.
-
- <p>The <code>echo</code> alerts display a message in the echo area by calling
-<code>message</code>. They are enabled by default.
-
- <p>The <code>switch</code> alerts switch to the buffer where the event occurred
-(chat buffer for incoming messages, roster buffer for presence
-changes, browse buffer for completed queries). They are disabled by
-default. Take care when using them, as they may interrupt your
-editing.
-
- <p>The <code>display</code> alerts display but do not select the buffer in
-question, using the function <code>display-buffer</code>. See <a href="../elisp/Choosing-Window.html#Choosing-Window">Choosing a Window for Display (GNU Emacs Lisp Reference Manual)</a>, for information about customizing its behaviour.
-This is enabled by default for info requests.
-
- <p>The <code>wave</code> alerts play a sound file by calling
-<code>play-sound-file</code>. No sound files are provided. To use this,
-enter the names of the sound files in
-<code>jabber-alert-message-wave</code>, <code>jabber-alert-presence-wave</code>
-and <code>jabber-alert-info-wave</code>, respectively. You can specify
-specific sound files for contacts matching a regexp in the variables
-<code>jabber-alert-message-wave-alist</code> and
-<code>jabber-alert-presence-wave-alist</code>.
-
- <p>The <code>screen</code> alerts send a message through the Screen terminal
-manager (see <a href="http://www.gnu.org/software/screen/">http://www.gnu.org/software/screen/</a>). They do no
-harm if called when you don't use Screen.
-
- <p>The <code>ratpoison</code> alerts send a message through the Ratpoison
-window manager (see <a href="http://ratpoison.sourceforge.net/">http://ratpoison.sourceforge.net/</a>). They
-do no harm if used when you're not running X, but if you are running X
-with another window manager, the ratpoison processes will never exit.
-You can look at them with <code>list-processes</code>.
-
- <p>The <code>sawfish</code> alerts send a message through the Sawfish window
-manager.
-
- <p>The <code>festival</code> alerts speak the message using the Emacs interface
-of the Festival speech synthesis system (see
-<a href="http://www.cstr.ed.ac.uk/projects/festival/">http://www.cstr.ed.ac.uk/projects/festival/</a>).
-
- <p>Additionally, for one-to-one and MUC messages, there are <code>scroll</code>
-alerts (enabled by default), that aim to do the right thing with chat
-buffers that are visible but not active. Sometimes you want point to
-scroll down, and sometimes not. These functions should do what you
-mean; if they don't, it's a bug.
-
- <p>Some of these functions are in the <span class="file">jabber-alert.el</span> file, and the
-others are in their own files. You can use them as templates or
-inspiration for your own alerts.
-
- </body></html>
-
diff --git a/html/Stanza-chains.html b/html/Stanza-chains.html
deleted file mode 100644
index 27cac6f..0000000
--- a/html/Stanza-chains.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<html lang="en">
-<head>
-<title>Stanza chains - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="Chat-printers.html#Chat-printers" title="Chat printers">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Stanza-chains"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Chat-printers.html#Chat-printers">Chat printers</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.7 Stanza chains</h3>
-
-<p><a name="index-jabber_002dmessage_002dchain-249"></a><a name="index-jabber_002diq_002dchain-250"></a><a name="index-jabber_002dpresence_002dchain-251"></a>
-If you really need to get under the skin of jabber.el, you can add
-functions to the lists <code>jabber-message-chain</code>,
-<code>jabber-iq-chain</code> and <code>jabber-presence-chain</code>. The functions
-in these lists will be called in order when an XML stanza of the
-corresponding type arrives, with the entire XML stanza passed as the
-only argument. Earlier functions can modify the stanza to change the
-behaviour of downstream functions.
-
- </body></html>
-
diff --git a/html/Time-queries.html b/html/Time-queries.html
deleted file mode 100644
index 08760bc..0000000
--- a/html/Time-queries.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<html lang="en">
-<head>
-<title>Time queries - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Avatars.html#Avatars" title="Avatars">
-<link rel="next" href="Useful-features.html#Useful-features" title="Useful features">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Time-queries"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Useful-features.html#Useful-features">Useful features</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Avatars.html#Avatars">Avatars</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">9 Time queries</h2>
-
-<p><a name="index-time-query-93"></a><a name="index-jabber_002dget_002dtime-94"></a>With <kbd>M-x jabber-get-time</kbd>, you can ask what time an entity (client,
-server or component) thinks it is, and what time zone it thinks it is
-in.
-
- <p><a name="index-last-online-95"></a><a name="index-jabber_002dget_002dlast_002donline-96"></a>You can query a server about when a certain user was last seen online.
-Use <kbd>M-x jabber-get-last-online</kbd> for that.
-
- <p><a name="index-uptime_002c-query-97"></a><a name="index-idle-time_002c-query-98"></a><a name="index-jabber_002dget_002didle_002dtime-99"></a>You can also ask a client about how long a user has been idle with
-<kbd>M-x jabber-get-idle-time</kbd>. Not all clients support this,
-e.g. jabber.el doesn't. This command can also tell the uptime of a
-server or component.
-
- </body></html>
-
diff --git a/html/Tracking-activity.html b/html/Tracking-activity.html
deleted file mode 100644
index a50d380..0000000
--- a/html/Tracking-activity.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<html lang="en">
-<head>
-<title>Tracking activity - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="prev" href="Keepalive.html#Keepalive" title="Keepalive">
-<link rel="next" href="Watch-buddies.html#Watch-buddies" title="Watch buddies">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Tracking-activity"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Watch-buddies.html#Watch-buddies">Watch buddies</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Keepalive.html#Keepalive">Keepalive</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Useful-features.html#Useful-features">Useful features</a>
-<hr><br>
-</div>
-
-<h3 class="section">10.4 Tracking activity</h3>
-
-<p><a name="index-Activity-114"></a><a name="index-jabber_002dactivity_002dmode-115"></a><a name="index-jabber_002dactivity_002dmake_002dstrings-116"></a><a name="index-jabber_002dactivity_002dquery_002dunread-117"></a><a name="index-jabber_002dactivity_002dcount_002din_002dtitle-118"></a><a name="index-jabber_002dactivity_002dcount_002din_002dtitle_002dformat-119"></a>
-When you're working on something important you might want to delay
-responding to incoming messages. However, when you're done working,
-will you remember them? If you're anything like me, you'll have a lot
-of buffers in your Emacs session, and a jabber chat buffer can easily
-get lost.
-
- <p>When you type <kbd>M-x jabber-activity-mode</kbd> Emacs starts keeping
-track of the buddies which have messaged you since last you visited
-their buffer, and will display them in mode line. As soon as you
-visit their buffer they disappear from the mode line, indicating that
-you've read their message.
-
- <p>If your mode line fills over because of these notifications, you can
-customize <code>jabber-activity-make-strings</code> to shorten them to the
-shortest possibly unambiguous form.
-
- <p>If you try to exit Emacs while you still have unread messages, you
-will be notified and asked about this. If you don't like that, set
-<code>jabber-activity-query-unread</code> to nil.
-
- <p>If you want to display the number of unread buffers in the frame title,
-set <code>jabber-activity-count-in-title</code> to t. The format of the
-number can be changed through
-<code>jabber-activity-count-in-title-format</code>.
-
- <p>For complete customizability, write a hook function for
-<code>jabber-activity-update-hook</code>. From that function, you can take
-action based on <code>jabber-activity-jids</code>,
-<code>jabber-activity-mode-string</code>, and
-<code>jabber-activity-count-string</code>.
-
- </body></html>
-
diff --git a/html/Useful-features.html b/html/Useful-features.html
deleted file mode 100644
index 7277744..0000000
--- a/html/Useful-features.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<html lang="en">
-<head>
-<title>Useful features - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Time-queries.html#Time-queries" title="Time queries">
-<link rel="next" href="Message-history.html#Message-history" title="Message history">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Useful-features"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Message-history.html#Message-history">Message history</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Time-queries.html#Time-queries">Time queries</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">10 Useful features</h2>
-
-<p>jabber.el includes a number of features meant to improve the user
-interface and do other useful things.
-
-<ul class="menu">
-<li><a accesskey="1" href="Autoaway.html#Autoaway">Autoaway</a>
-<li><a accesskey="2" href="Modeline-status.html#Modeline-status">Modeline status</a>
-<li><a accesskey="3" href="Keepalive.html#Keepalive">Keepalive</a>
-<li><a accesskey="4" href="Tracking-activity.html#Tracking-activity">Tracking activity</a>
-<li><a accesskey="5" href="Watch-buddies.html#Watch-buddies">Watch buddies</a>
-<li><a accesskey="6" href="Spell-checking.html#Spell-checking">Spell checking</a>
-</ul>
-
- </body></html>
-
diff --git a/html/Variable-index.html b/html/Variable-index.html
deleted file mode 100644
index f745fa3..0000000
--- a/html/Variable-index.html
+++ /dev/null
@@ -1,132 +0,0 @@
-<html lang="en">
-<head>
-<title>Variable index - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Function-index.html#Function-index" title="Function index">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Variable-index"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="Function-index.html#Function-index">Function index</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="unnumbered">Variable index</h2>
-
-
-
-<ul class="index-vr" compact>
-<li><a href="Roster-structure.html#index-_002ajabber_002droster_002a-229"><code>*jabber-roster*</code></a>: <a href="Roster-structure.html#Roster-structure">Roster structure</a></li>
-<li><a href="Tracking-activity.html#index-jabber_002dactivity_002dcount_002din_002dtitle-118"><code>jabber-activity-count-in-title</code></a>: <a href="Tracking-activity.html#Tracking-activity">Tracking activity</a></li>
-<li><a href="Tracking-activity.html#index-jabber_002dactivity_002dcount_002din_002dtitle_002dformat-119"><code>jabber-activity-count-in-title-format</code></a>: <a href="Tracking-activity.html#Tracking-activity">Tracking activity</a></li>
-<li><a href="Tracking-activity.html#index-jabber_002dactivity_002dmake_002dstrings-116"><code>jabber-activity-make-strings</code></a>: <a href="Tracking-activity.html#Tracking-activity">Tracking activity</a></li>
-<li><a href="Tracking-activity.html#index-jabber_002dactivity_002dquery_002dunread-117"><code>jabber-activity-query-unread</code></a>: <a href="Tracking-activity.html#Tracking-activity">Tracking activity</a></li>
-<li><a href="Extending-service-discovery.html#index-jabber_002dadvertised_002dfeatures-240"><code>jabber-advertised-features</code></a>: <a href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a></li>
-<li><a href="Info-alerts.html#index-jabber_002dalert_002dinfo_002dmessage_002dfunction-219"><code>jabber-alert-info-message-function</code></a>: <a href="Info-alerts.html#Info-alerts">Info alerts</a></li>
-<li><a href="Message-alerts.html#index-jabber_002dalert_002dmessage_002dfunction-213"><code>jabber-alert-message-function</code></a>: <a href="Message-alerts.html#Message-alerts">Message alerts</a></li>
-<li><a href="MUC-alerts.html#index-jabber_002dalert_002dmuc_002dfunction-216"><code>jabber-alert-muc-function</code></a>: <a href="MUC-alerts.html#MUC-alerts">MUC alerts</a></li>
-<li><a href="Presence-alerts.html#index-jabber_002dalert_002dpresence_002dmessage_002dfunction-211"><code>jabber-alert-presence-message-function</code></a>: <a href="Presence-alerts.html#Presence-alerts">Presence alerts</a></li>
-<li><a href="Autoaway.html#index-jabber_002dautoaway_002dmethod-103"><code>jabber-autoaway-method</code></a>: <a href="Autoaway.html#Autoaway">Autoaway</a></li>
-<li><a href="Avatars.html#index-jabber_002davatar_002dcache_002ddirectory-92"><code>jabber-avatar-cache-directory</code></a>: <a href="Avatars.html#Avatars">Avatars</a></li>
-<li><a href="Message-history.html#index-jabber_002dbacklog_002ddays-136"><code>jabber-backlog-days</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Message-history.html#index-jabber_002dbacklog_002dnumber-135"><code>jabber-backlog-number</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Chat-printers.html#index-jabber_002dbody_002dprinters-246"><code>jabber-body-printers</code></a>: <a href="Chat-printers.html#Chat-printers">Chat printers</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002ddelayed_002dtime_002dformat-199"><code>jabber-chat-delayed-time-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dfill_002dlong_002dlines-205"><code>jabber-chat-fill-long-lines</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dforeign_002dprompt_002dformat-197"><code>jabber-chat-foreign-prompt-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dheader_002dline_002dformat-203"><code>jabber-chat-header-line-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dlocal_002dprompt_002dformat-196"><code>jabber-chat-local-prompt-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Hooks.html#index-jabber_002dchat_002dmode_002dhook-225"><code>jabber-chat-mode-hook</code></a>: <a href="Hooks.html#Hooks">Hooks</a></li>
-<li><a href="Chat-printers.html#index-jabber_002dchat_002dprinters-244"><code>jabber-chat-printers</code></a>: <a href="Chat-printers.html#Chat-printers">Chat printers</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dprompt_002dforeign-195"><code>jabber-chat-prompt-foreign</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dprompt_002dlocal-194"><code>jabber-chat-prompt-local</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dtext_002dforeign-193"><code>jabber-chat-text-foreign</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dtext_002dlocal-192"><code>jabber-chat-text-local</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dtext_002dlocalBy-default_002c-timestamps-are-printed-in-the-chat-buffer-every-hour-_0028at-202"><code>jabber-chat-text-localBy default, timestamps are printed in the chat buffer every hour (at</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dchat_002dtime_002dformat-198"><code>jabber-chat-time-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Connection-settings.html#index-jabber_002dconnection_002dssl_002dprogram-169"><code>jabber-connection-ssl-program</code></a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Connection-settings.html#index-jabber_002dconnection_002dtype-168"><code>jabber-connection-type</code></a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Debug-options.html#index-jabber_002ddebug_002dlog_002dxml-226"><code>jabber-debug-log-xml</code></a>: <a href="Debug-options.html#Debug-options">Debug options</a></li>
-<li><a href="Account-settings.html#index-jabber_002ddefault_002dpriority-162"><code>jabber-default-priority</code></a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Presence.html#index-jabber_002ddefault_002dpriority-13"><code>jabber-default-priority</code></a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Presence.html#index-jabber_002ddefault_002dshow-11"><code>jabber-default-show</code></a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Presence.html#index-jabber_002ddefault_002dstatus-12"><code>jabber-default-status</code></a>: <a href="Presence.html#Presence">Presence</a></li>
-<li><a href="Extending-service-discovery.html#index-jabber_002ddisco_002dinfo_002dnodes-242"><code>jabber-disco-info-nodes</code></a>: <a href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a></li>
-<li><a href="Extending-service-discovery.html#index-jabber_002ddisco_002ditems_002dnodes-241"><code>jabber-disco-items-nodes</code></a>: <a href="Extending-service-discovery.html#Extending-service-discovery">Extending service discovery</a></li>
-<li><a href="Message-events.html#index-jabber_002devents_002dconfirm_002dcomposing-143"><code>jabber-events-confirm-composing</code></a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Message-events.html#index-jabber_002devents_002dconfirm_002ddelivered-141"><code>jabber-events-confirm-delivered</code></a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Message-events.html#index-jabber_002devents_002dconfirm_002ddisplayed-142"><code>jabber-events-confirm-displayed</code></a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Message-events.html#index-jabber_002devents_002drequest_002dthese-140"><code>jabber-events-request-these</code></a>: <a href="Message-events.html#Message-events">Message events</a></li>
-<li><a href="Message-history.html#index-jabber_002dglobal_002dhistory_002dfilename-130"><code>jabber-global-history-filename</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Message-history.html#index-jabber_002dhistory_002ddir-132"><code>jabber-history-dir</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Message-history.html#index-jabber_002dhistory_002denable_002drotation-133"><code>jabber-history-enable-rotation</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Message-history.html#index-jabber_002dhistory_002denabled-129"><code>jabber-history-enabled</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Message-history.html#index-jabber_002dhistory_002dsize_002dlimit-134"><code>jabber-history-size-limit</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Stanza-chains.html#index-jabber_002diq_002dchain-250"><code>jabber-iq-chain</code></a>: <a href="Stanza-chains.html#Stanza-chains">Stanza chains</a></li>
-<li><a href="Listening-for-new-requests.html#index-jabber_002diq_002dget_002dxmlns_002dalist-234"><code>jabber-iq-get-xmlns-alist</code></a>: <a href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a></li>
-<li><a href="Listening-for-new-requests.html#index-jabber_002diq_002dset_002dxmlns_002dalist-235"><code>jabber-iq-set-xmlns-alist</code></a>: <a href="Listening-for-new-requests.html#Listening-for-new-requests">Listening for new requests</a></li>
-<li><a href="Roster-structure.html#index-jabber_002djid_002dobarray-230"><code>jabber-jid-obarray</code></a>: <a href="Roster-structure.html#Roster-structure">Roster structure</a></li>
-<li><a href="Keepalive.html#index-jabber_002dkeepalive_002dinterval-112"><code>jabber-keepalive-interval</code></a>: <a href="Keepalive.html#Keepalive">Keepalive</a></li>
-<li><a href="Keepalive.html#index-jabber_002dkeepalive_002dtimeout-113"><code>jabber-keepalive-timeout</code></a>: <a href="Keepalive.html#Keepalive">Keepalive</a></li>
-<li><a href="Hooks.html#index-jabber_002dlost_002dconnection_002dhook-222"><code>jabber-lost-connection-hook</code></a>: <a href="Hooks.html#Hooks">Hooks</a></li>
-<li><a href="Message-alerts.html#index-jabber_002dmessage_002dalert_002dsame_002dbuffer-215"><code>jabber-message-alert-same-buffer</code></a>: <a href="Message-alerts.html#Message-alerts">Message alerts</a></li>
-<li><a href="Stanza-chains.html#index-jabber_002dmessage_002dchain-249"><code>jabber-message-chain</code></a>: <a href="Stanza-chains.html#Stanza-chains">Stanza chains</a></li>
-<li><a href="Modeline-status.html#index-jabber_002dmode_002dline_002dcompact-107"><code>jabber-mode-line-compact</code></a>: <a href="Modeline-status.html#Modeline-status">Modeline status</a></li>
-<li><a href="Modeline-status.html#index-jabber_002dmode_002dline_002dmode-106"><code>jabber-mode-line-mode</code></a>: <a href="Modeline-status.html#Modeline-status">Modeline status</a></li>
-<li><a href="MUC-alerts.html#index-jabber_002dmuc_002dalert_002dself-217"><code>jabber-muc-alert-self</code></a>: <a href="MUC-alerts.html#MUC-alerts">MUC alerts</a></li>
-<li><a href="Automation.html#index-jabber_002dmuc_002dautojoin-39"><code>jabber-muc-autojoin</code></a>: <a href="Automation.html#Automation">Automation</a></li>
-<li><a href="Automation.html#index-jabber_002dmuc_002ddefault_002dnicknames-38"><code>jabber-muc-default-nicknames</code></a>: <a href="Automation.html#Automation">Automation</a></li>
-<li><a href="Groupchat.html#index-jabber_002dmuc_002ddisable_002ddisco_002dcheck-32"><code>jabber-muc-disable-disco-check</code></a>: <a href="Groupchat.html#Groupchat">Groupchat</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dmuc_002dheader_002dline_002dformat-204"><code>jabber-muc-header-line-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Chat-printers.html#index-jabber_002dmuc_002dprinters-245"><code>jabber-muc-printers</code></a>: <a href="Chat-printers.html#Chat-printers">Chat printers</a></li>
-<li><a href="Connection-settings.html#index-jabber_002dnetwork_002dserver-166"><code>jabber-network-server</code></a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Account-settings.html#index-jabber_002dnickname-163"><code>jabber-nickname</code></a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Account-settings.html#index-jabber_002dpassword-160"><code>jabber-password</code></a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Connection-settings.html#index-jabber_002dport-167"><code>jabber-port</code></a>: <a href="Connection-settings.html#Connection-settings">Connection settings</a></li>
-<li><a href="Hooks.html#index-jabber_002dpost_002dconnect_002dhook-221"><code>jabber-post-connect-hook</code></a>: <a href="Hooks.html#Hooks">Hooks</a></li>
-<li><a href="Hooks.html#index-jabber_002dpost_002ddisconnect_002dhook-224"><code>jabber-post-disconnect-hook</code></a>: <a href="Hooks.html#Hooks">Hooks</a></li>
-<li><a href="Hooks.html#index-jabber_002dpre_002ddisconnect_002dhook-223"><code>jabber-pre-disconnect-hook</code></a>: <a href="Hooks.html#Hooks">Hooks</a></li>
-<li><a href="Stanza-chains.html#index-jabber_002dpresence_002dchain-251"><code>jabber-presence-chain</code></a>: <a href="Stanza-chains.html#Stanza-chains">Stanza chains</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002dprint_002drare_002dtime-200"><code>jabber-print-rare-time</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Customizing-the-chat-buffer.html#index-jabber_002drare_002dtime_002dformat-201"><code>jabber-rare-time-format</code></a>: <a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">Customizing the chat buffer</a></li>
-<li><a href="Account-settings.html#index-jabber_002dresource-161"><code>jabber-resource</code></a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002dresource_002dline_002dformat-184"><code>jabber-resource-line-format</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002droster_002dbuffer-185"><code>jabber-roster-buffer</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002droster_002dline_002dformat-183"><code>jabber-roster-line-format</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002droster_002dshow_002dbindings-186"><code>jabber-roster-show-bindings</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002droster_002dsort_002dfunctions-180"><code>jabber-roster-sort-functions</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Account-settings.html#index-jabber_002dserver-159"><code>jabber-server</code></a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002dshow_002dresources-182"><code>jabber-show-resources</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Sending-files.html#index-jabber_002dsocks5_002dproxies-63"><code>jabber-socks5-proxies</code></a>: <a href="Sending-files.html#Sending-files">Sending files</a></li>
-<li><a href="Customizing-the-roster-buffer.html#index-jabber_002dsort_002dorder-181"><code>jabber-sort-order</code></a>: <a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">Customizing the roster buffer</a></li>
-<li><a href="Message-history.html#index-jabber_002duse_002dglobal_002dhistory-131"><code>jabber-use-global-history</code></a>: <a href="Message-history.html#Message-history">Message history</a></li>
-<li><a href="Account-settings.html#index-jabber_002dusername-158"><code>jabber-username</code></a>: <a href="Account-settings.html#Account-settings">Account settings</a></li>
-<li><a href="Avatars.html#index-jabber_002dvcard_002davatars_002dpublish-91"><code>jabber-vcard-avatars-publish</code></a>: <a href="Avatars.html#Avatars">Avatars</a></li>
-<li><a href="Avatars.html#index-jabber_002dvcard_002davatars_002dretrieve-90"><code>jabber-vcard-avatars-retrieve</code></a>: <a href="Avatars.html#Avatars">Avatars</a></li>
- </ul></body></html>
-
diff --git a/html/Watch-buddies.html b/html/Watch-buddies.html
deleted file mode 100644
index 7fa43ff..0000000
--- a/html/Watch-buddies.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<html lang="en">
-<head>
-<title>Watch buddies - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Useful-features.html#Useful-features" title="Useful features">
-<link rel="prev" href="Tracking-activity.html#Tracking-activity" title="Tracking activity">
-<link rel="next" href="Spell-checking.html#Spell-checking" title="Spell checking">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="Watch-buddies"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Spell-checking.html#Spell-checking">Spell checking</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Tracking-activity.html#Tracking-activity">Tracking activity</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Useful-features.html#Useful-features">Useful features</a>
-<hr><br>
-</div>
-
-<h3 class="section">10.5 Watch buddies</h3>
-
-<p><a name="index-Watch-120"></a><a name="index-Online-notifications-121"></a><a name="index-jabber_002dwatch_002dadd-122"></a><a name="index-jabber_002dwatch_002dremove-123"></a>
-Sometimes you might be waiting for a certain person to come online,
-and you don't want that occasion to get lost in the noise. To get an
-obtrusive message when that happens, type <kbd>M-x jabber-watch-add</kbd>
-and select the person in question. You can enter a comment, to
-remember why you added the watch.
-
- <p>You will get a message whenever that person goes from offline to
-online. jabber.el will remember this for the rest of your Emacs
-session (it's not saved to disk, though), but if you want to get rid
-of it, type <kbd>M-x jabber-watch-remove</kbd>.
-
- </body></html>
-
diff --git a/html/XEP_002d0004.html b/html/XEP_002d0004.html
deleted file mode 100644
index bd9c3d4..0000000
--- a/html/XEP_002d0004.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0004 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="RFC-3921.html#RFC-3921" title="RFC 3921">
-<link rel="next" href="XEP_002d0012.html#XEP_002d0012" title="XEP-0012">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0004"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0012.html#XEP_002d0012">XEP-0012</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="RFC-3921.html#RFC-3921">RFC 3921</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.3 XEP-0004 (Data Forms)</h3>
-
-<p>XEP-0004 support is good enough for many purposes. Limitations are
-the following.
-
- <p>Forms in incoming messages are not interpreted. See each specific
-protocol for whether forms are accepted in that context.
-
- <p>&ldquo;Cancel&rdquo; messages are probably not consistently generated when they
-should be. This is partly a paradigm clash, as jabber.el doesn't use
-modal dialog boxes but buffers which can easily be buried.
-
- <p><code>&lt;required/&gt;</code> elements are not enforced.
-
- <p>The field types &ldquo;jid-single&rdquo;, &ldquo;jid-multi&rdquo; and &ldquo;list-multi&rdquo; are
-not implemented, due to programmer laziness. Let us know if you need
-them.
-
- </body></html>
-
diff --git a/html/XEP_002d0012.html b/html/XEP_002d0012.html
deleted file mode 100644
index 30aabdd..0000000
--- a/html/XEP_002d0012.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0012 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0004.html#XEP_002d0004" title="XEP-0004">
-<link rel="next" href="XEP_002d0020.html#XEP_002d0020" title="XEP-0020">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0012"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0020.html#XEP_002d0020">XEP-0020</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0004.html#XEP_002d0004">XEP-0004</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.4 XEP-0012 (Last Activity)</h3>
-
-<p>jabber.el can generate all three query types described in the protocol.
-However, it does not answer to such requests.
-
- </body></html>
-
diff --git a/html/XEP_002d0020.html b/html/XEP_002d0020.html
deleted file mode 100644
index e83a877..0000000
--- a/html/XEP_002d0020.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0020 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0012.html#XEP_002d0012" title="XEP-0012">
-<link rel="next" href="XEP_002d0022.html#XEP_002d0022" title="XEP-0022">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0020"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0022.html#XEP_002d0022">XEP-0022</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0012.html#XEP_002d0012">XEP-0012</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.5 XEP-0020 (Feature Negotiation)</h3>
-
-<p>There are no known limitations or bugs in XEP-0020 support.
-
- </body></html>
-
diff --git a/html/XEP_002d0022.html b/html/XEP_002d0022.html
deleted file mode 100644
index 992868b..0000000
--- a/html/XEP_002d0022.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0022 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0020.html#XEP_002d0020" title="XEP-0020">
-<link rel="next" href="XEP_002d0030.html#XEP_002d0030" title="XEP-0030">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0022"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0030.html#XEP_002d0030">XEP-0030</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0020.html#XEP_002d0020">XEP-0020</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.6 XEP-0022 (Message Events)</h3>
-
-<p>jabber.el understands all four specified kinds of message events
-(offline, delivered, displayed, and composing) and by default requests
-all of them. It also reports those three events that make sense for
-clients.
-
- </body></html>
-
diff --git a/html/XEP_002d0030.html b/html/XEP_002d0030.html
deleted file mode 100644
index 3eb6cdf..0000000
--- a/html/XEP_002d0030.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0030 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0022.html#XEP_002d0022" title="XEP-0022">
-<link rel="next" href="XEP_002d0045.html#XEP_002d0045" title="XEP-0045">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0030"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0045.html#XEP_002d0045">XEP-0045</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0022.html#XEP_002d0022">XEP-0022</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.7 XEP-0030 (Service Discovery)</h3>
-
-<p>Service discovery is supported, both as client and server. When used in
-the code, service discovery results are cached indefinitely.
-
- </body></html>
-
diff --git a/html/XEP_002d0045.html b/html/XEP_002d0045.html
deleted file mode 100644
index 562edcd..0000000
--- a/html/XEP_002d0045.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0045 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0030.html#XEP_002d0030" title="XEP-0030">
-<link rel="next" href="XEP_002d0049.html#XEP_002d0049" title="XEP-0049">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0045"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0049.html#XEP_002d0049">XEP-0049</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0030.html#XEP_002d0030">XEP-0030</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.8 XEP-0045 (Multi-User Chat)</h3>
-
-<p>jabber.el supports parts of XEP-0045. Entering, leaving and chatting
-work. So do invitations and private messages. Room configuration is
-supported. Changing roles of participants (basic moderation) is
-implemented, as is changing affiliations, but requesting affiliation
-lists is not yet supported.
-
- </body></html>
-
diff --git a/html/XEP_002d0049.html b/html/XEP_002d0049.html
deleted file mode 100644
index cc3dbba..0000000
--- a/html/XEP_002d0049.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0049 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0045.html#XEP_002d0045" title="XEP-0045">
-<link rel="next" href="XEP_002d0050.html#XEP_002d0050" title="XEP-0050">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0049"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0050.html#XEP_002d0050">XEP-0050</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0045.html#XEP_002d0045">XEP-0045</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.9 XEP-0049 (Private XML Storage)</h3>
-
-<p>jabber.el contains an implementation of XEP-0049; however it is not used
-for anything right now.
-
- </body></html>
-
diff --git a/html/XEP_002d0050.html b/html/XEP_002d0050.html
deleted file mode 100644
index cfa24a2..0000000
--- a/html/XEP_002d0050.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0050 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0049.html#XEP_002d0049" title="XEP-0049">
-<link rel="next" href="XEP_002d0054.html#XEP_002d0054" title="XEP-0054">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0050"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0054.html#XEP_002d0054">XEP-0054</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0049.html#XEP_002d0049">XEP-0049</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.10 XEP-0050 (Ad-Hoc Commands)</h3>
-
-<p>jabber.el is probably the first implementation of XEP-0050 (see
-<a href="http://article.gmane.org/gmane.network.jabber.devel/21413">post on jdev from 2004-03-10</a>). Both the client and server parts are
-supported.
-
- </body></html>
-
diff --git a/html/XEP_002d0054.html b/html/XEP_002d0054.html
deleted file mode 100644
index fe2bdbf..0000000
--- a/html/XEP_002d0054.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0054 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0050.html#XEP_002d0050" title="XEP-0050">
-<link rel="next" href="XEP_002d0055.html#XEP_002d0055" title="XEP-0055">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0054"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0055.html#XEP_002d0055">XEP-0055</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0050.html#XEP_002d0050">XEP-0050</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.11 XEP-0054 (vcard-temp)</h3>
-
-<p>Both displaying other users' vCards and editing your own vCard are
-supported. The implementation tries to follow the schema in the XEP
-accurately.
-
- </body></html>
-
diff --git a/html/XEP_002d0055.html b/html/XEP_002d0055.html
deleted file mode 100644
index af32d82..0000000
--- a/html/XEP_002d0055.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0055 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0054.html#XEP_002d0054" title="XEP-0054">
-<link rel="next" href="XEP_002d0065.html#XEP_002d0065" title="XEP-0065">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0055"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0065.html#XEP_002d0065">XEP-0065</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0054.html#XEP_002d0054">XEP-0054</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.12 XEP-0055 (Jabber Search)</h3>
-
-<p>XEP-0055 is supported, both with traditional fields and with Data Forms
-(see <a href="XEP_002d0004.html#XEP_002d0004">XEP-0004</a>). As the traditional fields specified by the XEP is a
-subset of those allowed in XEP-0077, handling of those two form types
-are merged. See <a href="XEP_002d0077.html#XEP_002d0077">XEP-0077</a>.
-
- </body></html>
-
diff --git a/html/XEP_002d0065.html b/html/XEP_002d0065.html
deleted file mode 100644
index 85ec52b..0000000
--- a/html/XEP_002d0065.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0065 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0055.html#XEP_002d0055" title="XEP-0055">
-<link rel="next" href="XEP_002d0066.html#XEP_002d0066" title="XEP-0066">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0065"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0066.html#XEP_002d0066">XEP-0066</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0055.html#XEP_002d0055">XEP-0055</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.13 XEP-0065 (SOCKS5 Bytestreams)</h3>
-
-<p>XEP-0065 is supported. Currently jabber.el cannot act as a server, not
-even on on Emacsen that support server sockets (GNU Emacs 22 and up).
-Therefore it relies on proxies. Proxies have to be entered and queried
-manually.
-
- <p>Psi's &ldquo;fast mode&rdquo;
-(<a href="http://delta.affinix.com/specs/stream.html">http://delta.affinix.com/specs/stream.html</a>), which gives
-greater flexibility with regards to NAT, is not implemented.
-
- </body></html>
-
diff --git a/html/XEP_002d0066.html b/html/XEP_002d0066.html
deleted file mode 100644
index 4c2da3f..0000000
--- a/html/XEP_002d0066.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0066 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0065.html#XEP_002d0065" title="XEP-0065">
-<link rel="next" href="XEP_002d0068.html#XEP_002d0068" title="XEP-0068">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0066"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0068.html#XEP_002d0068">XEP-0068</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0065.html#XEP_002d0065">XEP-0065</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.14 XEP-0066 (Out of Band Data)</h3>
-
-<p>jabber.el will display URLs sent in message stanzas qualified by
-the <code>jabber:x:oob</code> namespace, as described in this XEP. Sending
-such URLs or doing anything with iq stanzas (using the
-<code>jabber:iq:oob</code> namespace) is not supported.
-
- </body></html>
-
diff --git a/html/XEP_002d0068.html b/html/XEP_002d0068.html
deleted file mode 100644
index ed27e6c..0000000
--- a/html/XEP_002d0068.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0068 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0066.html#XEP_002d0066" title="XEP-0066">
-<link rel="next" href="XEP_002d0077.html#XEP_002d0077" title="XEP-0077">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0068"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0077.html#XEP_002d0077">XEP-0077</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0066.html#XEP_002d0066">XEP-0066</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.15 XEP-0068 (Field Standardization for Data Forms)</h3>
-
-<p>XEP-0068 is only used in the context of creating a new Jabber account,
-to prefill the username field of the registration form.
-
- </body></html>
-
diff --git a/html/XEP_002d0077.html b/html/XEP_002d0077.html
deleted file mode 100644
index 9a82526..0000000
--- a/html/XEP_002d0077.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0077 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0068.html#XEP_002d0068" title="XEP-0068">
-<link rel="next" href="XEP_002d0078.html#XEP_002d0078" title="XEP-0078">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0077"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0078.html#XEP_002d0078">XEP-0078</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0068.html#XEP_002d0068">XEP-0068</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.16 XEP-0077 (In-Band Registration)</h3>
-
-<p>In-band registration is supported for all purposes. That means
-registering a new Jabber account, changing Jabber password, removing a
-Jabber account, registering with a service, and cancelling
-registration to a service. Data forms are supported as well. URL
-redirections are not.
-
- <p>jabber.el will not prevent or alert a user trying to change a password
-over an unencrypted connection.
-
- </body></html>
-
diff --git a/html/XEP_002d0078.html b/html/XEP_002d0078.html
deleted file mode 100644
index 3b73985..0000000
--- a/html/XEP_002d0078.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0078 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0077.html#XEP_002d0077" title="XEP-0077">
-<link rel="next" href="XEP_002d0082.html#XEP_002d0082" title="XEP-0082">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0078"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0082.html#XEP_002d0082">XEP-0082</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0077.html#XEP_002d0077">XEP-0077</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.17 XEP-0078 (Non-SASL Authentication)</h3>
-
-<p>Non-SASL authentication is supported, both plaintext and digest.
-Digest is preferred, and a warning is displayed to the user if only
-plaintext is available.
-
- </body></html>
-
diff --git a/html/XEP_002d0082.html b/html/XEP_002d0082.html
deleted file mode 100644
index 3613f00..0000000
--- a/html/XEP_002d0082.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0082 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0078.html#XEP_002d0078" title="XEP-0078">
-<link rel="next" href="XEP_002d0086.html#XEP_002d0086" title="XEP-0086">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0082"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0086.html#XEP_002d0086">XEP-0086</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0078.html#XEP_002d0078">XEP-0078</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.18 XEP-0082 (Jabber Date and Time Profiles)</h3>
-
-<p>The DateTime profile of XEP-0082 is supported. Currently this is only
-used for file transfer.
-
- </body></html>
-
diff --git a/html/XEP_002d0086.html b/html/XEP_002d0086.html
deleted file mode 100644
index e5fcd1d..0000000
--- a/html/XEP_002d0086.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0086 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0082.html#XEP_002d0082" title="XEP-0082">
-<link rel="next" href="XEP_002d0090.html#XEP_002d0090" title="XEP-0090">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0086"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0090.html#XEP_002d0090">XEP-0090</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0082.html#XEP_002d0082">XEP-0082</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.19 XEP-0086 (Error Condition Mappings)</h3>
-
-<p>Legacy errors are interpreted, but never generated. XMPP style error
-messages take precedence when errors are reported to the user.
-
- </body></html>
-
diff --git a/html/XEP_002d0090.html b/html/XEP_002d0090.html
deleted file mode 100644
index b80b5ab..0000000
--- a/html/XEP_002d0090.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0090 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0086.html#XEP_002d0086" title="XEP-0086">
-<link rel="next" href="XEP_002d0091.html#XEP_002d0091" title="XEP-0091">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0090"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0091.html#XEP_002d0091">XEP-0091</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0086.html#XEP_002d0086">XEP-0086</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.20 XEP-0090 (Entity Time)</h3>
-
-<p>jabber.el can query other entities for their time, and return the
-current time to those who ask.
-
- </body></html>
-
diff --git a/html/XEP_002d0091.html b/html/XEP_002d0091.html
deleted file mode 100644
index 605f7ec..0000000
--- a/html/XEP_002d0091.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0091 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0090.html#XEP_002d0090" title="XEP-0090">
-<link rel="next" href="XEP_002d0092.html#XEP_002d0092" title="XEP-0092">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0091"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0092.html#XEP_002d0092">XEP-0092</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0090.html#XEP_002d0090">XEP-0090</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.21 XEP-0091 (Delayed Delivery)</h3>
-
-<p>The time specified on delayed incoming messages is interpreted, and
-displayed in chat buffers instead of the current time.
-
- </body></html>
-
diff --git a/html/XEP_002d0092.html b/html/XEP_002d0092.html
deleted file mode 100644
index 600b606..0000000
--- a/html/XEP_002d0092.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0092 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0091.html#XEP_002d0091" title="XEP-0091">
-<link rel="next" href="XEP_002d0095.html#XEP_002d0095" title="XEP-0095">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0092"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0095.html#XEP_002d0095">XEP-0095</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0091.html#XEP_002d0091">XEP-0091</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.22 XEP-0092 (Software Version)</h3>
-
-<p>The user can request the version of any entity. jabber.el answers
-version requests to anyone, giving &ldquo;jabber.el&rdquo; as name, and the
-Emacs version as OS.
-
- </body></html>
-
diff --git a/html/XEP_002d0095.html b/html/XEP_002d0095.html
deleted file mode 100644
index 265f961..0000000
--- a/html/XEP_002d0095.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0095 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0092.html#XEP_002d0092" title="XEP-0092">
-<link rel="next" href="XEP_002d0096.html#XEP_002d0096" title="XEP-0096">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0095"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0096.html#XEP_002d0096">XEP-0096</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0092.html#XEP_002d0092">XEP-0092</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.23 XEP-0095 (Stream Initiation)</h3>
-
-<p>XEP-0095 is supported, both incoming and outgoing, except that jabber.el
-doesn't check service discovery results before sending a stream
-initiation request.
-
- </body></html>
-
diff --git a/html/XEP_002d0096.html b/html/XEP_002d0096.html
deleted file mode 100644
index b30b5a9..0000000
--- a/html/XEP_002d0096.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0096 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0095.html#XEP_002d0095" title="XEP-0095">
-<link rel="next" href="XEP_002d0146.html#XEP_002d0146" title="XEP-0146">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0096"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0146.html#XEP_002d0146">XEP-0146</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0095.html#XEP_002d0095">XEP-0095</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.24 XEP-0096 (File Transfer)</h3>
-
-<p>Both sending and receiving files is supported. If a suitable program is
-found, MD5 hashes of outgoing files are calculated and sent. However,
-hashes of received files are not checked. Ranged transfers are not
-supported. In-band bytestreams are not yet supported, even though
-XEP-0096 requires them.
-
- </body></html>
-
diff --git a/html/XEP_002d0146.html b/html/XEP_002d0146.html
deleted file mode 100644
index 8f0ed3b..0000000
--- a/html/XEP_002d0146.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0146 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0096.html#XEP_002d0096" title="XEP-0096">
-<link rel="next" href="XEP_002d0153.html#XEP_002d0153" title="XEP-0153">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0146"></a>Next:&nbsp;<a rel="next" accesskey="n" href="XEP_002d0153.html#XEP_002d0153">XEP-0153</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0096.html#XEP_002d0096">XEP-0096</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.25 XEP-0146 (Remote Controlling Clients)</h3>
-
-<p>The &ldquo;set-status&rdquo; command in XEP-0146 is supported.
-
- </body></html>
-
diff --git a/html/XEP_002d0153.html b/html/XEP_002d0153.html
deleted file mode 100644
index 0289524..0000000
--- a/html/XEP_002d0153.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html lang="en">
-<head>
-<title>XEP-0153 - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Protocol-support.html#Protocol-support" title="Protocol support">
-<link rel="prev" href="XEP_002d0146.html#XEP_002d0146" title="XEP-0146">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XEP_002d0153"></a>Previous:&nbsp;<a rel="previous" accesskey="p" href="XEP_002d0146.html#XEP_002d0146">XEP-0146</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Protocol-support.html#Protocol-support">Protocol support</a>
-<hr><br>
-</div>
-
-<h3 class="section">A.26 XEP-0153 (vCard-Based Avatars)</h3>
-
-<p>vCard-based avatars are supported, both publishing and displaying. The
-pixel size limits on avatars are not enforced.
-
- </body></html>
-
diff --git a/html/XML-representation.html b/html/XML-representation.html
deleted file mode 100644
index 0eecc87..0000000
--- a/html/XML-representation.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<html lang="en">
-<head>
-<title>XML representation - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="up" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="prev" href="Hacking-and-extending.html#Hacking-and-extending" title="Hacking and extending">
-<link rel="next" href="Roster-structure.html#Roster-structure" title="Roster structure">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XML-representation"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Roster-structure.html#Roster-structure">Roster structure</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<hr><br>
-</div>
-
-<h3 class="section">16.1 XML representation</h3>
-
-<p><a name="index-XML-representation-228"></a>
-The XML representation is the one generated by <span class="file">xml.el</span> in Emacs,
-namely the following. Each tag is a list. The first element of the
-list is a symbol, the name of which is the name of the tag. The
-second element is an alist of attributes, where the keys are the
-attribute names in symbol form, and the values are strings. The
-remaining elements are the tags and data contained within the tag.
-
- <p>For example,
-<pre class="example"> &lt;foo bar='baz'&gt;
- &lt;frobozz/&gt;Fnord
- &lt;/foo&gt;
-</pre>
- <p>is represented as
-<pre class="example"> (foo ((bar . "baz")) (frobozz nil "") "Fnord
- ")
-</pre>
- <p>Note the empty string as the third element of the <code>frobozz</code>
-list. It is not present in newer (post-21.3) versions of
-<span class="file">xml.el</span>, but it's probably best to assume it might be there.
-
- <p>If you want to see what an XML tag would look like, use
-<code>jabber-sexp2xml</code>, which takes a tag and returns a string. You
-will usually not need it in your code, as you can use
-<code>jabber-send-sexp</code> to send away your tags to the server.
-
- </body></html>
-
diff --git a/html/XMPP-URIs.html b/html/XMPP-URIs.html
deleted file mode 100644
index 2333076..0000000
--- a/html/XMPP-URIs.html
+++ /dev/null
@@ -1,84 +0,0 @@
-<html lang="en">
-<head>
-<title>XMPP URIs - jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="index.html#Top">
-<link rel="prev" href="Roster-import-and-export.html#Roster-import-and-export" title="Roster import and export">
-<link rel="next" href="Customization.html#Customization" title="Customization">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<div class="node">
-<p>
-<a name="XMPP-URIs"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Customization.html#Customization">Customization</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="index.html#Top">Top</a>
-<hr><br>
-</div>
-
-<h2 class="chapter">14 XMPP URIs</h2>
-
-<p><a name="index-URIs-148"></a><a name="index-URLs-149"></a><a name="index-links-150"></a><a name="index-xmpp_003a-links-151"></a><a name="index-Mozilla-integration-152"></a><a name="index-web-browser-integration-153"></a><a name="index-browser-integration-154"></a><a name="index-jabber_002dhandle_002duri-155"></a>
-Many web page authors use links starting with <span class="samp">xmpp:</span> for JIDs.
-Your web browser could be made to pass such links to jabber.el, so that
-such links are actually useful and not just decoration. How to do that
-depends on your operating system and web browser.
-
-<h3 class="section">14.1 Mozilla and Unix</h3>
-
-<p>If you use a Mozilla-based web browser on a Unix-like operating system,
-follow these steps.
-
- <ol type=1 start=1>
-<li>Make sure you are running the Emacs server. See <a href="../emacs/Emacs-Server.html#Emacs-Server">Using Emacs as a Server (GNU Emacs Manual)</a>.
-
- <li>Note the path of the <span class="file">xmppuri.sh</span> file in the jabber.el
-distribution, and make sure it is executable.
-
- <li>Set the Mozilla preference <span class="samp">network.protocol-handler.app.xmpp</span> to
-the path of <span class="file">xmppuri.sh</span>. There are two ways to do this:
-
- <ul>
-<li>Go to the URL <span class="samp">about:config</span>, right-click in the list, choose &ldquo;New
-string&rdquo;, and enter <span class="samp">network.protocol-handler.app.xmpp</span> and the
-path in the following dialogs.
-
- <li>Open or create the file <span class="file">user.js</span> in your Mozilla profile directory
-(in the same directory as <span class="file">prefs.js</span>), and add the following line:
-
- <pre class="example"> user_pref("network.protocol-handler.app.xmpp", "<var>/path/to</var>/xmppuri.sh");
- </pre>
- <p>Restart Mozilla for this change to take effect.
-</ul>
- </ol>
-
-<h3 class="section">14.2 Other systems</h3>
-
-<p>If you know how to pass an XMPP URI from your browser to the function
-<code>jabber-handle-uri</code>, your contribution for this section would be
-appreciated.
-
- </body></html>
-
diff --git a/html/index.html b/html/index.html
deleted file mode 100644
index 6f5f585..0000000
--- a/html/index.html
+++ /dev/null
@@ -1,201 +0,0 @@
-<html lang="en">
-<head>
-<title>jabber.el manual 0.7.1</title>
-<meta http-equiv="Content-Type" content="text/html">
-<meta name="description" content="jabber.el manual 0.7.1">
-<meta name="generator" content="makeinfo 4.7">
-<link title="Top" rel="start" href="#Top">
-<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
-<!--
-This manual is for jabber.el, version 0.7.1.
-
-Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- Permission is granted to make and distribute verbatim copies or
- modified versions of this manual, provided the copyright notice and
- this permission notice are preserved on all copies.
- -->
-<meta http-equiv="Content-Style-Type" content="text/css">
-<style type="text/css"><!--
- pre.display { font-family:inherit }
- pre.format { font-family:inherit }
- pre.smalldisplay { font-family:inherit; font-size:smaller }
- pre.smallformat { font-family:inherit; font-size:smaller }
- pre.smallexample { font-size:smaller }
- pre.smalllisp { font-size:smaller }
- span.sc { font-variant:small-caps }
- span.roman { font-family: serif; font-weight: normal; }
---></style>
-</head>
-<body>
-<h1 class="settitle">jabber.el manual 0.7.1</h1>
-<div class="contents">
-<h2>Table of Contents</h2>
-<ul>
-<li><a name="toc_Top" href="index.html#Top">jabber.el manual</a>
-<li><a name="toc_Introduction" href="Introduction.html#Introduction">1 Introduction</a>
-<ul>
-<li><a href="Contact.html#Contact">1.1 Contact</a>
-</li></ul>
-<li><a name="toc_Basic-operation" href="Basic-operation.html#Basic-operation">2 Basic operation</a>
-<ul>
-<li><a href="Connecting.html#Connecting">2.1 Connecting</a>
-<li><a href="Chatting.html#Chatting">2.2 Chatting</a>
-<li><a href="Presence.html#Presence">2.3 Presence</a>
-<li><a href="Presence-subscription.html#Presence-subscription">2.4 Presence subscription</a>
-<li><a href="Roster-buffer.html#Roster-buffer">2.5 The roster buffer</a>
-</li></ul>
-<li><a name="toc_Groupchat" href="Groupchat.html#Groupchat">3 Groupchat</a>
-<ul>
-<li><a href="Automation.html#Automation">3.1 Automation</a>
-<li><a href="Invitations.html#Invitations">3.2 Invitations</a>
-<li><a href="Private-messages.html#Private-messages">3.3 Private messages</a>
-<li><a href="MUC-Administration.html#MUC-Administration">3.4 Administration</a>
-<ul>
-<li><a href="MUC-Administration.html#MUC-Administration">3.4.1 Roles</a>
-<li><a href="MUC-Administration.html#MUC-Administration">3.4.2 Affiliations</a>
-</li></ul>
-</li></ul>
-<li><a name="toc_Composing-messages" href="Composing-messages.html#Composing-messages">4 Composing messages</a>
-<li><a name="toc_File-transfer" href="File-transfer.html#File-transfer">5 File transfer</a>
-<ul>
-<li><a href="Receiving-files.html#Receiving-files">5.1 Receiving files</a>
-<li><a href="Sending-files.html#Sending-files">5.2 Sending files</a>
-</li></ul>
-<li><a name="toc_Services" href="Services.html#Services">6 Services</a>
-<ul>
-<li><a href="Service-discovery-and-browsing.html#Service-discovery-and-browsing">6.1 Service discovery and browsing</a>
-<li><a href="Registering.html#Registering">6.2 Registering</a>
-<li><a href="Searching.html#Searching">6.3 Searching</a>
-<li><a href="Ad_002dHoc-Commands.html#Ad_002dHoc-Commands">6.4 Ad-Hoc Commands</a>
-</li></ul>
-<li><a name="toc_Personal-information" href="Personal-information.html#Personal-information">7 Personal information</a>
-<li><a name="toc_Avatars" href="Avatars.html#Avatars">8 Avatars</a>
-<li><a name="toc_Time-queries" href="Time-queries.html#Time-queries">9 Time queries</a>
-<li><a name="toc_Useful-features" href="Useful-features.html#Useful-features">10 Useful features</a>
-<ul>
-<li><a href="Autoaway.html#Autoaway">10.1 Autoaway</a>
-<li><a href="Modeline-status.html#Modeline-status">10.2 Modeline status</a>
-<li><a href="Keepalive.html#Keepalive">10.3 Keepalive</a>
-<li><a href="Tracking-activity.html#Tracking-activity">10.4 Tracking activity</a>
-<li><a href="Watch-buddies.html#Watch-buddies">10.5 Watch buddies</a>
-<li><a href="Spell-checking.html#Spell-checking">10.6 Spell checking</a>
-</li></ul>
-<li><a name="toc_Message-history" href="Message-history.html#Message-history">11 Message history</a>
-<li><a name="toc_Message-events" href="Message-events.html#Message-events">12 Message events</a>
-<li><a name="toc_Roster-import-and-export" href="Roster-import-and-export.html#Roster-import-and-export">13 Roster import and export</a>
-<li><a name="toc_XMPP-URIs" href="XMPP-URIs.html#XMPP-URIs">14 XMPP URIs</a>
-<ul>
-<li><a href="XMPP-URIs.html#XMPP-URIs">14.1 Mozilla and Unix</a>
-<li><a href="XMPP-URIs.html#XMPP-URIs">14.2 Other systems</a>
-</li></ul>
-<li><a name="toc_Customization" href="Customization.html#Customization">15 Customization</a>
-<ul>
-<li><a href="Account-settings.html#Account-settings">15.1 Account settings</a>
-<li><a href="Connection-settings.html#Connection-settings">15.2 Connection settings</a>
-<li><a href="Miscellaneous-settings.html#Miscellaneous-settings">15.3 Miscellaneous settings</a>
-<li><a href="Customizing-the-roster-buffer.html#Customizing-the-roster-buffer">15.4 Customizing the roster buffer</a>
-<li><a href="Customizing-the-chat-buffer.html#Customizing-the-chat-buffer">15.5 Customizing the chat buffer</a>
-<li><a href="Customizing-alerts.html#Customizing-alerts">15.6 Customizing alerts</a>
-<ul>
-<li><a href="Standard-alerts.html#Standard-alerts">15.6.1 Standard alerts</a>
-<li><a href="Presence-alerts.html#Presence-alerts">15.6.2 Presence alerts</a>
-<li><a href="Message-alerts.html#Message-alerts">15.6.3 Message alerts</a>
-<li><a href="MUC-alerts.html#MUC-alerts">15.6.4 MUC alerts</a>
-<li><a href="Info-alerts.html#Info-alerts">15.6.5 Info alerts</a>
-</li></ul>
-<li><a href="Hooks.html#Hooks">15.7 Hooks</a>
-<li><a href="Debug-options.html#Debug-options">15.8 Debug options</a>
-</li></ul>
-<li><a name="toc_Hacking-and-extending" href="Hacking-and-extending.html#Hacking-and-extending">16 Hacking and extending</a>
-<ul>
-<li><a href="XML-representation.html#XML-representation">16.1 XML representation</a>
-<li><a href="Roster-structure.html#Roster-structure">16.2 Roster structure</a>
-<li><a href="Listening-for-new-requests.html#Listening-for-new-requests">16.3 Listening for new requests</a>
-<li><a href="Sending-new-requests.html#Sending-new-requests">16.4 Sending new requests</a>
-<li><a href="Extending-service-discovery.html#Extending-service-discovery">16.5 Service discovery</a>
-<li><a href="Chat-printers.html#Chat-printers">16.6 Chat printers</a>
-<li><a href="Stanza-chains.html#Stanza-chains">16.7 Stanza chains</a>
-</li></ul>
-<li><a name="toc_Protocol-support" href="Protocol-support.html#Protocol-support">Appendix A Protocol support</a>
-<ul>
-<li><a href="RFC-3920.html#RFC-3920">A.1 RFC 3920 (XMPP-CORE)</a>
-<li><a href="RFC-3921.html#RFC-3921">A.2 RFC 3921 (XMPP-IM)</a>
-<li><a href="XEP_002d0004.html#XEP_002d0004">A.3 XEP-0004 (Data Forms)</a>
-<li><a href="XEP_002d0012.html#XEP_002d0012">A.4 XEP-0012 (Last Activity)</a>
-<li><a href="XEP_002d0020.html#XEP_002d0020">A.5 XEP-0020 (Feature Negotiation)</a>
-<li><a href="XEP_002d0022.html#XEP_002d0022">A.6 XEP-0022 (Message Events)</a>
-<li><a href="XEP_002d0030.html#XEP_002d0030">A.7 XEP-0030 (Service Discovery)</a>
-<li><a href="XEP_002d0045.html#XEP_002d0045">A.8 XEP-0045 (Multi-User Chat)</a>
-<li><a href="XEP_002d0049.html#XEP_002d0049">A.9 XEP-0049 (Private XML Storage)</a>
-<li><a href="XEP_002d0050.html#XEP_002d0050">A.10 XEP-0050 (Ad-Hoc Commands)</a>
-<li><a href="XEP_002d0054.html#XEP_002d0054">A.11 XEP-0054 (vcard-temp)</a>
-<li><a href="XEP_002d0055.html#XEP_002d0055">A.12 XEP-0055 (Jabber Search)</a>
-<li><a href="XEP_002d0065.html#XEP_002d0065">A.13 XEP-0065 (SOCKS5 Bytestreams)</a>
-<li><a href="XEP_002d0066.html#XEP_002d0066">A.14 XEP-0066 (Out of Band Data)</a>
-<li><a href="XEP_002d0068.html#XEP_002d0068">A.15 XEP-0068 (Field Standardization for Data Forms)</a>
-<li><a href="XEP_002d0077.html#XEP_002d0077">A.16 XEP-0077 (In-Band Registration)</a>
-<li><a href="XEP_002d0078.html#XEP_002d0078">A.17 XEP-0078 (Non-SASL Authentication)</a>
-<li><a href="XEP_002d0082.html#XEP_002d0082">A.18 XEP-0082 (Jabber Date and Time Profiles)</a>
-<li><a href="XEP_002d0086.html#XEP_002d0086">A.19 XEP-0086 (Error Condition Mappings)</a>
-<li><a href="XEP_002d0090.html#XEP_002d0090">A.20 XEP-0090 (Entity Time)</a>
-<li><a href="XEP_002d0091.html#XEP_002d0091">A.21 XEP-0091 (Delayed Delivery)</a>
-<li><a href="XEP_002d0092.html#XEP_002d0092">A.22 XEP-0092 (Software Version)</a>
-<li><a href="XEP_002d0095.html#XEP_002d0095">A.23 XEP-0095 (Stream Initiation)</a>
-<li><a href="XEP_002d0096.html#XEP_002d0096">A.24 XEP-0096 (File Transfer)</a>
-<li><a href="XEP_002d0146.html#XEP_002d0146">A.25 XEP-0146 (Remote Controlling Clients)</a>
-<li><a href="XEP_002d0153.html#XEP_002d0153">A.26 XEP-0153 (vCard-Based Avatars)</a>
-</li></ul>
-<li><a name="toc_Concept-index" href="Concept-index.html#Concept-index">Concept index</a>
-<li><a name="toc_Function-index" href="Function-index.html#Function-index">Function index</a>
-<li><a name="toc_Variable-index" href="Variable-index.html#Variable-index">Variable index</a>
-</li></ul>
-</div>
-
-
-
-<div class="node">
-<p>
-<a name="Top"></a>Next:&nbsp;<a rel="next" accesskey="n" href="Introduction.html#Introduction">Introduction</a>,
-Previous:&nbsp;<a rel="previous" accesskey="p" href="../index.html#dir">(dir)</a>,
-Up:&nbsp;<a rel="up" accesskey="u" href="../index.html#dir">(dir)</a>
-<hr><br>
-</div>
-
-<h2 class="unnumbered">jabber.el manual</h2>
-
-<p>This manual is for jabber.el, version 0.7.1.
-
- <p>Copyright &copy; 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
-
- <blockquote>
-Permission is granted to make and distribute verbatim copies or
-modified versions of this manual, provided the copyright notice and
-this permission notice are preserved on all copies.
-</blockquote>
-
-<ul class="menu">
-<li><a accesskey="1" href="Introduction.html#Introduction">Introduction</a>
-<li><a accesskey="2" href="Basic-operation.html#Basic-operation">Basic operation</a>
-<li><a accesskey="3" href="Groupchat.html#Groupchat">Groupchat</a>
-<li><a accesskey="4" href="Composing-messages.html#Composing-messages">Composing messages</a>
-<li><a accesskey="5" href="File-transfer.html#File-transfer">File transfer</a>
-<li><a accesskey="6" href="Services.html#Services">Services</a>
-<li><a accesskey="7" href="Personal-information.html#Personal-information">Personal information</a>
-<li><a accesskey="8" href="Avatars.html#Avatars">Avatars</a>
-<li><a accesskey="9" href="Time-queries.html#Time-queries">Time queries</a>
-<li><a href="Useful-features.html#Useful-features">Useful features</a>
-<li><a href="Message-history.html#Message-history">Message history</a>
-<li><a href="Message-events.html#Message-events">Message events</a>
-<li><a href="Roster-import-and-export.html#Roster-import-and-export">Roster import and export</a>
-<li><a href="XMPP-URIs.html#XMPP-URIs">XMPP URIs</a>
-<li><a href="Customization.html#Customization">Customization</a>
-<li><a href="Hacking-and-extending.html#Hacking-and-extending">Hacking and extending</a>
-<li><a href="Protocol-support.html#Protocol-support">Protocol support</a>
-<li><a href="Concept-index.html#Concept-index">Concept index</a>
-<li><a href="Function-index.html#Function-index">Function index</a>
-<li><a href="Variable-index.html#Variable-index">Variable index</a>
-</ul>
-
- </body></html>
-
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..676e42e
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,291 @@
+#!/bin/sh
+#
+# $NetBSD: install-sh.in,v 1.4 2007/07/12 18:32:50 jlam Exp $
+# This script now also installs multiple files, but might choke on installing
+# multiple files with spaces in the file names.
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+awkprog="${AWKPROG-awk}"
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+instcmd="$mvprog"
+pathcompchmodcmd="$chmodprog 755"
+chmodcmd="$chmodprog 755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+stripflags=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+msrc=""
+dst=""
+dir_arg=""
+suffix=""
+suffixfmt=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -b) suffix=".old"
+ shift
+ continue;;
+
+ -B) suffixfmt="$2"
+ shift
+ shift
+ continue;;
+
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -S) stripcmd="$stripprog"
+ stripflags="-S $2 $stripflags"
+ shift
+ shift
+ continue;;
+
+ *) if [ x"$msrc" = x ]
+ then
+ msrc="$dst"
+ else
+ msrc="$msrc $dst"
+ fi
+ src="$dst"
+ dst="$1"
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$dir_arg" = x ]
+then
+ dstisfile=""
+ if [ ! -d "$dst" ]
+ then
+ if [ x"$msrc" = x"$src" ]
+ then
+ dstisfile=true
+ else
+ echo "install: destination is not a directory"
+ exit 1
+ fi
+ fi
+else
+ msrc="$msrc $dst"
+fi
+
+if [ x"$msrc" = x ]
+then
+ echo "install: no destination specified"
+ exit 1
+fi
+
+for srcarg in $msrc; do
+
+if [ x"$dir_arg" != x ]; then
+
+ dstarg="$srcarg"
+else
+ dstarg="$dst"
+
+# Waiting for this to be detected by the "$instcmd $srcarg $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f "$srcarg" ]
+ then
+ doinst="$instcmd"
+ elif [ -d "$srcarg" ]
+ then
+ echo "install: $srcarg: not a regular file"
+ exit 1
+ elif [ "$srcarg" = "/dev/null" ]
+ then
+ doinst="$cpprog"
+ else
+ echo "install: $srcarg does not exist"
+ exit 1
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d "$dstarg" ]
+ then
+ dstarg="$dstarg"/`basename "$srcarg"`
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo "$dstarg" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $doit $mkdirprog "${pathcomp}"
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "${pathcomp}"; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "${pathcomp}"; else true ; fi &&
+ if [ x"$pathcompchmodcmd" != x ]; then $doit $pathcompchmodcmd "${pathcomp}"; else true ; fi
+
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+ if [ x"$dir_arg" != x ]
+ then
+ if [ -d "$dstarg" ]; then
+ true
+ else
+ $doit $mkdirprog "$dstarg" &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dstarg"; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dstarg"; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dstarg"; else true ; fi
+ fi
+ else
+
+ if [ x"$dstisfile" = x ]
+ then
+ file=$srcarg
+ else
+ file=$dst
+ fi
+
+ dstfile=`basename "$file"`
+ dstfinal="$dstdir/$dstfile"
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Make a backup file name in the proper directory.
+ case x$suffixfmt in
+ *%*) suffix=`echo x |
+ $awkprog -v bname="$dstfinal" -v fmt="$suffixfmt" '
+ { cnt = 0;
+ do {
+ sfx = sprintf(fmt, cnt++);
+ name = bname sfx;
+ } while (system("test -f " name) == 0);
+ print sfx; }' -`;;
+ x) ;;
+ *) suffix="$suffixfmt";;
+ esac
+ dstbackup="$dstfinal$suffix"
+
+# Move or copy the file name to the temp name
+
+ $doit $doinst $srcarg "$dsttmp" &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripflags "$dsttmp"; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ if [ x"$suffix" != x ] && [ -f "$dstfinal" ]
+ then
+ $doit $mvcmd "$dstfinal" "$dstbackup"
+ else
+ $doit $rmcmd -f "$dstfinal"
+ fi &&
+ $doit $mvcmd "$dsttmp" "$dstfinal"
+ fi
+
+done &&
+
+
+exit 0
diff --git a/jabber-activity.el b/jabber-activity.el
index c01b8f2..afb8d9b 100644
--- a/jabber-activity.el
+++ b/jabber-activity.el
@@ -48,12 +48,17 @@
"activity tracking options"
:group 'jabber)
+;; All the (featurep 'jabber-activity) is so we don't call a function
+;; with an autoloaded cookie while the file is loading, since that
+;; would lead to endless load recursion.
+
(defcustom jabber-activity-make-string 'jabber-activity-make-string-default
"Function to call, for making the string to put in the mode
line. The default function returns the nick of the user."
:set #'(lambda (var val)
(custom-set-default var val)
- (when (fboundp 'jabber-activity-make-name-alist)
+ (when (and (featurep 'jabber-activity)
+ (fboundp 'jabber-activity-make-name-alist))
(jabber-activity-make-name-alist)
(jabber-activity-mode-line-update)))
:type 'function
@@ -70,7 +75,8 @@ at least this long, when possible."
JIDs."
:set #'(lambda (var val)
(custom-set-default var val)
- (when (fboundp 'jabber-activity-make-name-alist)
+ (when (and (featurep 'jabber-activity)
+ (fboundp 'jabber-activity-make-name-alist))
(jabber-activity-make-name-alist)
(jabber-activity-mode-line-update)))
:type '(choice (function-item :tag "Keep strings"
@@ -86,7 +92,8 @@ JIDs."
:group 'jabber-activity
:set #'(lambda (var val)
(custom-set-default var val)
- (when (bound-and-true-p jabber-activity-mode)
+ (when (and (featurep 'jabber-activity)
+ (bound-and-true-p jabber-activity-mode))
(jabber-activity-mode -1)
(jabber-activity-mode 1))))
@@ -97,7 +104,7 @@ Same syntax as `mode-line-format'."
:type 'sexp
:group 'jabber-activity
:set #'(lambda (var val)
- (if (not (bound-and-true-p jabber-activity-mode))
+ (if (not (and (featurep 'jabber-activity) (bound-and-true-p jabber-activity-mode)))
(custom-set-default var val)
(jabber-activity-mode -1)
(custom-set-default var val)
@@ -267,13 +274,9 @@ on JIDs where `jabber-activity-show-p'"
(defun jabber-activity-add (from buffer text proposed-alert)
"Add a JID to mode line when `jabber-activity-show-p'"
- ;; In case of private MUC message, we want to keep the full JID.
- (let ((jid (if (jabber-muc-sender-p from)
- from
- (jabber-jid-user from))))
- (when (funcall jabber-activity-show-p jid)
- (add-to-list 'jabber-activity-jids jid)
- (jabber-activity-mode-line-update))))
+ (when (funcall jabber-activity-show-p from)
+ (add-to-list 'jabber-activity-jids from)
+ (jabber-activity-mode-line-update)))
(defun jabber-activity-add-muc (nick group buffer text proposed-alert)
"Add a JID to mode line when `jabber-activity-show-p'"
@@ -281,6 +284,12 @@ on JIDs where `jabber-activity-show-p'"
(add-to-list 'jabber-activity-jids group)
(jabber-activity-mode-line-update)))
+(defun jabber-activity-presence (who oldstatus newstatus statustext proposed-alert)
+ "Add a JID to mode line on subscription requests."
+ (when (string= newstatus "subscribe")
+ (add-to-list 'jabber-activity-jids (symbol-name who))
+ (jabber-activity-mode-line-update)))
+
(defun jabber-activity-kill-hook ()
"Query the user as to whether killing Emacs should be cancelled
when there are unread messages which otherwise would be lost, if
@@ -293,17 +302,27 @@ when there are unread messages which otherwise would be lost, if
;;; Interactive functions
+(defvar jabber-activity-last-buffer nil
+ "Last non-Jabber buffer used.")
+
(defun jabber-activity-switch-to (&optional jid-param)
"If JID-PARAM is provided, switch to that buffer. If JID-PARAM is nil and
there has been activity in another buffer, switch to that buffer. If no such
-buffer exists, switch back to most recently used buffer."
- (interactive)
- (if (or jid-param jabber-activity-jids)
- (let ((jid (or jid-param (car jabber-activity-jids))))
- (switch-to-buffer (jabber-activity-find-buffer-name jid))
- (jabber-activity-clean))
- ;; Switch back to the buffer used last
- (switch-to-buffer nil)))
+buffer exists, switch back to the last non Jabber chat buffer used."
+ (interactive)
+ (if (or jid-param jabber-activity-jids)
+ (let ((jid (or jid-param (car jabber-activity-jids))))
+ (unless (eq major-mode 'jabber-chat-mode)
+ (setq jabber-activity-last-buffer (current-buffer)))
+ (switch-to-buffer (jabber-activity-find-buffer-name jid))
+ (jabber-activity-clean))
+ (if (eq major-mode 'jabber-chat-mode)
+ ;; Switch back to the buffer used last
+ (when (buffer-live-p jabber-activity-last-buffer)
+ (switch-to-buffer jabber-activity-last-buffer))
+ (message "No new activity"))))
+
+(defvar jabber-activity-idle-timer nil "Idle timer used for activity cleaning")
;;;###autoload
(define-minor-mode jabber-activity-mode
@@ -325,8 +344,12 @@ With a numeric arg, enable this display if arg is positive."
'jabber-activity-add)
(add-hook 'jabber-muc-hooks
'jabber-activity-add-muc)
- (add-hook 'jabber-post-connect-hook
- 'jabber-activity-make-name-alist)
+ (add-hook 'jabber-presence-hooks
+ 'jabber-activity-presence)
+ (setq jabber-activity-idle-timer (run-with-idle-timer 2 t 'jabber-activity-clean))
+ ;; XXX: reactivate
+ ;; (add-hook 'jabber-post-connect-hooks
+;; 'jabber-activity-make-name-alist)
(add-to-list 'kill-emacs-query-functions
'jabber-activity-kill-hook)
(add-to-list 'global-mode-string
@@ -357,8 +380,12 @@ With a numeric arg, enable this display if arg is positive."
'jabber-activity-add)
(remove-hook 'jabber-muc-hooks
'jabber-activity-add-muc)
- (remove-hook 'jabber-post-connect-hook
- 'jabber-activity-make-name-alist)
+ (remove-hook 'jabber-presence-hooks
+ 'jabber-activity-presence)
+ (ignore-errors (cancel-timer jabber-activity-idle-timer))
+ ;; XXX: reactivate
+;; (remove-hook 'jabber-post-connect-hooks
+;; 'jabber-activity-make-name-alist)
(setq global-mode-string (delete '(t jabber-activity-mode-string)
global-mode-string))
(setq frame-title-format
diff --git a/jabber-ahc-presence.el b/jabber-ahc-presence.el
index 6e0fa65..ab66f17 100644
--- a/jabber-ahc-presence.el
+++ b/jabber-ahc-presence.el
@@ -1,7 +1,7 @@
;; jabber-ahc-presence.el - provide remote control of presence
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -27,7 +27,7 @@
(jabber-ahc-add jabber-ahc-presence-node "Set presence" 'jabber-ahc-presence
'jabber-my-jid-p)
-(defun jabber-ahc-presence (xml-data)
+(defun jabber-ahc-presence (jc xml-data)
"Process presence change command."
(let* ((query (jabber-iq-query xml-data))
@@ -50,7 +50,7 @@
(status . "executing"))
(x ((xmlns . "jabber:x:data")
(type . "form"))
- (title nil ,(format "Set presence of %s@%s/%s" jabber-username jabber-server jabber-resource))
+ (title nil ,(format "Set presence of %s" (jabber-connection-jid jc)))
(instructions nil "Select new presence status.")
(field ((var . "FORM_TYPE") (type . "hidden"))
(value nil "http://jabber.org/protocol/rc"))
diff --git a/jabber-ahc.el b/jabber-ahc.el
index b2501d2..9206618 100644
--- a/jabber-ahc.el
+++ b/jabber-ahc.el
@@ -1,7 +1,7 @@
;; jabber-ahc.el - Ad-Hoc Commands by JEP-0050
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -35,11 +35,12 @@ This is an alist, where the keys are node names as strings (which
means that they must not conflict). The values are plists having
following properties:
-acl - function taking JID as single argument, return non-nil for
- access allowed. No function means open for everyone.
+acl - function taking connection object and JID of requester,
+ returning non-nil for access allowed. No function means
+ open for everyone.
name - name of command
-func - function receiving entire IQ stanza as single argument
- and returning a <command/> node
+func - function taking connection object and entire IQ stanza as
+ arguments and returning a <command/> node
Use the function `jabber-ahc-add' to add a command to this list.")
@@ -75,9 +76,9 @@ access allowed. nil means open for everyone."
(feature ((var . "jabber:x:data")))))))
(add-to-list 'jabber-advertised-features "http://jabber.org/protocol/commands")
-(add-to-list 'jabber-disco-items-nodes
+(add-to-list 'jabber-disco-items-nodes
(list "http://jabber.org/protocol/commands" #'jabber-ahc-disco-items nil))
-(defun jabber-ahc-disco-items (xml-data)
+(defun jabber-ahc-disco-items (jc xml-data)
"Return commands in response to disco#items request"
(let ((jid (jabber-xml-get-attribute xml-data 'from)))
(mapcar (function
@@ -88,15 +89,15 @@ access allowed. nil means open for everyone."
(name (plist-get plist 'name))
(func (plist-get plist 'func)))
(when (or (not (functionp acl))
- (funcall acl jid))
+ (funcall acl jc jid))
`(item ((name . ,name)
- (jid . ,(format "%s@%s/%s" jabber-username jabber-server jabber-resource))
+ (jid . ,(jabber-connection-jid jc))
(node . ,node))))))))
jabber-ahc-commands)))
(add-to-list 'jabber-iq-set-xmlns-alist
(cons "http://jabber.org/protocol/commands" 'jabber-ahc-process))
-(defun jabber-ahc-process (xml-data)
+(defun jabber-ahc-process (jc xml-data)
(let ((to (jabber-xml-get-attribute xml-data 'from))
(id (jabber-xml-get-attribute xml-data 'id))
@@ -108,10 +109,10 @@ access allowed. nil means open for everyone."
(if plist
;; found
(if (or (not (functionp acl))
- (funcall acl to))
+ (funcall acl jc to))
;; access control passed
- (jabber-send-iq to "result"
- (funcall func xml-data)
+ (jabber-send-iq jc to "result"
+ (funcall func jc xml-data)
nil nil nil nil id)
;; ...or failed
(jabber-signal-error "cancel" 'not-allowed))
@@ -121,18 +122,20 @@ access allowed. nil means open for everyone."
;;; CLIENT
(add-to-list 'jabber-jid-service-menu
(cons "Request command list" 'jabber-ahc-get-list))
-(defun jabber-ahc-get-list (to)
+(defun jabber-ahc-get-list (jc to)
"Request list of ad-hoc commands. (JEP-0050)"
- (interactive (list (jabber-read-jid-completing "Request command list from: ")))
- (jabber-get-disco-items to "http://jabber.org/protocol/commands"))
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Request command list from: ")))
+ (jabber-get-disco-items jc to "http://jabber.org/protocol/commands"))
(add-to-list 'jabber-jid-service-menu
(cons "Execute command" 'jabber-ahc-execute-command))
-(defun jabber-ahc-execute-command (to node)
+(defun jabber-ahc-execute-command (jc to node)
"Execute ad-hoc command. (JEP-0050)"
- (interactive (list (jabber-read-jid-completing "Execute command of: ")
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Execute command of: ")
(jabber-read-node "Node of command: ")))
- (jabber-send-iq to
+ (jabber-send-iq jc to
"set"
`(command ((xmlns . "http://jabber.org/protocol/commands")
(node . ,node)
@@ -140,7 +143,7 @@ access allowed. nil means open for everyone."
#'jabber-process-data #'jabber-ahc-display
#'jabber-process-data "Command execution failed"))
-(defun jabber-ahc-display (xml-data)
+(defun jabber-ahc-display (jc xml-data)
(let* ((from (jabber-xml-get-attribute xml-data 'from))
(query (jabber-iq-query xml-data))
(node (jabber-xml-get-attribute query 'node))
@@ -155,6 +158,8 @@ access allowed. nil means open for everyone."
(setq jabber-ahc-sessionid sessionid)
(make-local-variable 'jabber-ahc-node)
(setq jabber-ahc-node node)
+ (make-local-variable 'jabber-buffer-connection)
+ (setq jabber-buffer-connection jc)
(dolist (x (jabber-xml-get-children query 'x))
(when (string= (jabber-xml-get-attribute x 'xmlns) "jabber:x:data")
@@ -187,7 +192,7 @@ access allowed. nil means open for everyone."
(jabber-render-xdata-form xdata)
(when (string= status "executing")
- (let ((button-titles
+ (let ((button-titles
(cond
((null actions)
'(complete cancel))
@@ -208,7 +213,7 @@ access allowed. nil means open for everyone."
(defun jabber-ahc-submit (action)
"Submit Ad-Hoc Command."
- (jabber-send-iq jabber-submit-to
+ (jabber-send-iq jabber-buffer-connection jabber-submit-to
"set"
`(command ((xmlns . "http://jabber.org/protocol/commands")
(sessionid . ,jabber-ahc-sessionid)
diff --git a/jabber-alert.el b/jabber-alert.el
index 1517e7c..be2b6f4 100644
--- a/jabber-alert.el
+++ b/jabber-alert.el
@@ -1,7 +1,7 @@
;; jabber-alert.el - alert hooks
+;; Copyright (C) 2003, 2004, 2005, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004, 2005 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -106,8 +106,7 @@ every time."
:group 'jabber-alerts)
(defcustom jabber-alert-presence-hooks
- '(jabber-presence-update-roster
- jabber-presence-echo)
+ '(jabber-presence-echo)
"Hooks run when a user's presence changes.
Arguments are WHO, OLDSTATUS, NEWSTATUS, STATUSTEXT and
@@ -120,7 +119,6 @@ one of \"subscribe\", \"unsubscribe\", \"subscribed\" and
:type 'hook
:options '(jabber-presence-beep
jabber-presence-wave
- jabber-presence-update-roster
jabber-presence-switch
jabber-presence-display
jabber-presence-echo)
@@ -221,6 +219,11 @@ files."
:type 'file
:group 'jabber-alerts)
+(defcustom jabber-play-sound-file 'play-sound-file
+ "a function to call to play alert sound files"
+ :type 'function
+ :group 'jabber-alerts)
+
(defmacro define-jabber-alert (name docstring function)
"Define a new family of external alert hooks.
Use this macro when your hooks do nothing except displaying a string
@@ -272,13 +275,6 @@ Examples:
(define-jabber-alert beep "Beep on event"
(lambda (&rest ignore) (beep)))
-;; External notifiers
-(require 'jabber-screen)
-(require 'jabber-ratpoison)
-(require 'jabber-sawfish)
-(require 'jabber-festival)
-(require 'jabber-xmessage)
-
;; Message alert hooks
(defun jabber-message-default-message (from buffer text)
(when (or jabber-message-alert-same-buffer
@@ -309,7 +305,7 @@ Examples:
(return (cdr entry))))
jabber-alert-message-wave)))
(unless (equal sound-file "")
- (play-sound-file sound-file)))))
+ (funcall jabber-play-sound-file sound-file)))))
(defun jabber-message-display (from buffer text proposed-alert)
"Display the buffer where a new message has arrived."
@@ -356,7 +352,7 @@ Examples:
(defun jabber-muc-wave (nick group buffer text proposed-alert)
"Play the wave file specified in `jabber-alert-muc-wave'"
(when proposed-alert
- (play-sound-file jabber-alert-muc-wave)))
+ (funcall jabber-play-sound-file jabber-alert-muc-wave)))
(defun jabber-muc-display (nick group buffer text proposed-alert)
"Display the buffer where a new message has arrived."
@@ -414,7 +410,7 @@ This function is not called directly, but is the default for
(return (cdr entry))))
jabber-alert-presence-wave)))
(unless (equal sound-file "")
- (play-sound-file sound-file)))))
+ (funcall jabber-play-sound-file sound-file)))))
;; This is now defined in jabber-roster.el.
;; (defun jabber-presence-update-roster (who oldstatus newstatus statustext proposed-alert)
@@ -444,7 +440,7 @@ This function uses `jabber-info-message-alist' to find a message."
(defun jabber-info-wave (infotype buffer proposed-alert)
"Play the wave file specified in `jabber-alert-info-wave'"
(if proposed-alert
- (play-sound-file jabber-alert-info-wave)))
+ (funcall jabber-play-sound-file jabber-alert-info-wave)))
(defun jabber-info-display (infotype buffer proposed-alert)
"Display buffer of completed request"
@@ -456,6 +452,24 @@ This function uses `jabber-info-message-alist' to find a message."
(when proposed-alert
(switch-to-buffer buffer)))
+;;; Personal alert hooks
+(defmacro define-personal-jabber-alert (name)
+ "From ALERT function, make ALERT-personal function. Makes sence only for MUC."
+ (let ((sn (symbol-name name)))
+ (let ((func (intern (format "%s-personal" sn))))
+ `(progn
+ (defun ,func (nick group buffer text proposed-alert)
+ (if (jabber-muc-looks-like-personal-p text group)
+ (,name nick group buffer text proposed-alert)))
+ (pushnew (quote ,func) (get 'jabber-alert-muc-hooks 'custom-options)))))
+ )
+
+(define-personal-jabber-alert jabber-muc-beep)
+(define-personal-jabber-alert jabber-muc-wave)
+(define-personal-jabber-alert jabber-muc-echo)
+(define-personal-jabber-alert jabber-muc-switch)
+(define-personal-jabber-alert jabber-muc-display)
+
(provide 'jabber-alert)
;;; arch-tag: 725bd73e-c613-4fdc-a11d-3392a7598d4f
diff --git a/jabber-autoaway.el b/jabber-autoaway.el
index badb607..6707bd4 100644
--- a/jabber-autoaway.el
+++ b/jabber-autoaway.el
@@ -1,6 +1,6 @@
;;; jabber-autoaway.el --- change status to away after idleness
-;; Copyright (C) 2006 Magnus Henoch
+;; Copyright (C) 2006, 2008 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
@@ -85,14 +85,15 @@ This is used to detect whether the user has become unidle.")
(when jabber-autoaway-verbose
(apply #'message args)))
-(defun jabber-autoaway-start ()
- "Start autoaway timer."
+(defun jabber-autoaway-start (&optional ignored)
+ "Start autoaway timer.
+The IGNORED argument is there so you can put this function in
+`jabber-post-connect-hooks'."
(interactive)
- (when jabber-autoaway-timer
- (jabber-cancel-timer jabber-autoaway-timer))
- (setq jabber-autoaway-timer
- (run-with-timer (* jabber-autoaway-timeout 60) nil #'jabber-autoaway-timer))
- (jabber-autoaway-message "Autoaway timer started"))
+ (unless jabber-autoaway-timer
+ (setq jabber-autoaway-timer
+ (run-with-timer (* jabber-autoaway-timeout 60) nil #'jabber-autoaway-timer))
+ (jabber-autoaway-message "Autoaway timer started")))
(defun jabber-autoaway-stop ()
"Stop autoaway timer."
@@ -143,9 +144,12 @@ Return nil on error."
(progn
(setq jabber-autoaway-last-idle-time idle-time))
;; But if it doesn't, go back to unidle state.
+ (jabber-autoaway-message "Back to unidle")
;; But don't mess with the user's custom presence.
- (when (string= *jabber-current-status* jabber-autoaway-status)
- (jabber-send-default-presence))
+ (if (string= *jabber-current-status* jabber-autoaway-status)
+ (jabber-send-default-presence)
+ (jabber-autoaway-message "%S /= %S - not resetting presence" *jabber-current-status* jabber-autoaway-status))
+ (jabber-autoaway-stop)
(jabber-autoaway-start))))
(defun jabber-xprintidle-get-idle-time ()
diff --git a/jabber-autoloads.el b/jabber-autoloads.el
new file mode 100644
index 0000000..f010a51
--- /dev/null
+++ b/jabber-autoloads.el
@@ -0,0 +1,232 @@
+;;; jabber-autoloads.el --- automatically extracted autoloads
+;;
+;;; Code:
+
+
+;;;### (autoloads (jabber-info jabber-customize jabber-account-list)
+;;;;;; "jabber" "jabber.el" (18447 53546))
+;;; Generated autoloads from jabber.el
+
+(defvar jabber-account-list nil "\
+List of Jabber accounts.
+Each element of the list is a cons cell describing a Jabber account,
+where the car is a JID and the CDR is an alist.
+
+JID is a full Jabber ID string (e.g. foo@bar.tld). You can also
+specify the resource (e.g. foo@bar.tld/emacs).
+The following keys can be present in the alist:
+:password is a string to authenticate ourself against the server.
+It can be empty.
+:network-server is a string identifying the address to connect to,
+if it's different from the server part of the JID.
+:port is the port to use (default depends on connection type).
+:connection-type is a symbol. Valid symbols are `starttls',
+`network' and `ssl'.
+
+Only JID is mandatory. The rest can be guessed at run-time.
+
+Examples:
+
+Two accounts without any special configuration:
+\((\"foo@example.com\") (\"bar@example.net\"))
+
+One disabled account with a non-standard port:
+\((\"romeo@montague.net\" (:port . 5242) (:disabled . t)))
+
+If you don't have SRV and STARTTLS capabilities in your Emacs,
+configure a Google Talk account like this:
+\((\"username@gmail.com\"
+ (:network-server . \"talk.google.com\")
+ (:connection-type . ssl)))")
+
+(custom-autoload 'jabber-account-list "jabber" t)
+
+(autoload 'jabber-customize "jabber" "\
+customize jabber options
+
+\(fn)" t nil)
+
+(autoload 'jabber-info "jabber" "\
+open jabber.el manual
+
+\(fn)" t nil)
+
+;;;***
+
+;;;### (autoloads (jabber-activity-mode) "jabber-activity" "jabber-activity.el"
+;;;;;; (18441 20710))
+;;; Generated autoloads from jabber-activity.el
+
+(defvar jabber-activity-mode t "\
+Non-nil if Jabber-Activity mode is enabled.
+See the command `jabber-activity-mode' for a description of this minor mode.
+Setting this variable directly does not take effect;
+either customize it (see the info node `Easy Customization')
+or call the function `jabber-activity-mode'.")
+
+(custom-autoload 'jabber-activity-mode "jabber-activity" nil)
+
+(autoload 'jabber-activity-mode "jabber-activity" "\
+Toggle display of activity in hidden jabber buffers in the mode line.
+
+With a numeric arg, enable this display if arg is positive.
+
+\(fn &optional ARG)" t nil)
+
+;;;***
+
+;;;### (autoloads (jabber-edit-bookmarks jabber-get-bookmarks jabber-get-conference-data)
+;;;;;; "jabber-bookmarks" "jabber-bookmarks.el" (18442 56829))
+;;; Generated autoloads from jabber-bookmarks.el
+
+(autoload 'jabber-get-conference-data "jabber-bookmarks" "\
+Get bookmark data for CONFERENCE-JID.
+KEY may be nil or one of :name, :autojoin, :nick and :password.
+If KEY is nil, a plist containing the above keys is returned.
+CONT is called when the result is available, with JC and the
+result as arguments.
+
+\(fn JC CONFERENCE-JID CONT &optional KEY)" nil nil)
+
+(autoload 'jabber-get-bookmarks "jabber-bookmarks" "\
+Retrieve bookmarks (if needed) and call CONT.
+Arguments to CONT are JC and the bookmark list. CONT will be
+called as the result of a filter function or a timer.
+If REFRESH is non-nil, always fetch bookmarks.
+
+\(fn JC CONT &optional REFRESH)" nil nil)
+
+(autoload 'jabber-edit-bookmarks "jabber-bookmarks" "\
+Create a buffer for editing bookmarks interactively.
+
+\(fn JC)" t nil)
+
+;;;***
+
+;;;### (autoloads (jabber-compose) "jabber-compose" "jabber-compose.el"
+;;;;;; (17958 41106))
+;;; Generated autoloads from jabber-compose.el
+
+(autoload 'jabber-compose "jabber-compose" "\
+Create a buffer for composing a Jabber message.
+
+\(fn JC &optional RECIPIENT)" t nil)
+
+;;;***
+
+;;;### (autoloads nil "jabber-core" "jabber-core.el" (18447 53755))
+;;; Generated autoloads from jabber-core.el
+ (autoload 'jabber-connect-all "jabber" "Connect to all configured Jabber accounts.\nSee `jabber-account-list'.\nIf no accounts are configured (or ARG supplied), call `jabber-connect' interactively." t)
+ (autoload 'jabber-connect "jabber" "Connect to the Jabber server and start a Jabber XML stream.\nWith prefix argument, register a new account.\nWith double prefix argument, specify more connection details." t)
+
+;;;***
+
+;;;### (autoloads (jabber-import-roster jabber-export-roster) "jabber-export"
+;;;;;; "jabber-export.el" (18442 56829))
+;;; Generated autoloads from jabber-export.el
+
+(autoload 'jabber-export-roster "jabber-export" "\
+Export roster for connection JC.
+
+\(fn JC)" t nil)
+
+(autoload 'jabber-import-roster "jabber-export" "\
+Create buffer for roster import for connection JC from FILE.
+
+\(fn JC FILE)" t nil)
+
+;;;***
+
+;;;### (autoloads (jabber-gmail-query jabber-gmail-subscribe) "jabber-gmail"
+;;;;;; "jabber-gmail.el" (18365 38156))
+;;; Generated autoloads from jabber-gmail.el
+
+(autoload 'jabber-gmail-subscribe "jabber-gmail" "\
+Subscribe to gmail notifications.
+See http://code.google.com/apis/talk/jep_extensions/usersettings.html#4
+
+\(fn JC)" t nil)
+
+(autoload 'jabber-gmail-query "jabber-gmail" "\
+Request mail information from the Google Talk server (a.k.a. one shot query).
+See http://code.google.com/apis/talk/jep_extensions/gmail.html#requestmail
+
+\(fn JC)" t nil)
+
+;;;***
+
+;;;### (autoloads nil "jabber-keymap" "jabber-keymap.el" (18447 55296))
+;;; Generated autoloads from jabber-keymap.el
+
+(defvar jabber-global-keymap (let ((map (make-sparse-keymap))) (define-key map "" 'jabber-connect-all) (define-key map "" 'jabber-disconnect) (define-key map "" 'jabber-switch-to-roster-buffer) (define-key map "\n" 'jabber-chat-with) (define-key map "\f" 'jabber-activity-switch-to) (define-key map "" 'jabber-send-away-presence) (define-key map "" 'jabber-send-default-presence) (define-key map "" 'jabber-send-xa-presence) (define-key map "" 'jabber-send-presence) map) "\
+Global Jabber keymap (usually under C-x C-j)")
+
+(define-key ctl-x-map "\n" jabber-global-keymap)
+
+;;;***
+
+;;;### (autoloads (jabber-muc-looks-like-personal-p) "jabber-muc-nick-completion"
+;;;;;; "jabber-muc-nick-completion.el" (18442 56829))
+;;; Generated autoloads from jabber-muc-nick-completion.el
+
+(autoload 'jabber-muc-looks-like-personal-p "jabber-muc-nick-completion" "\
+Return non-nil if jabber MESSAGE is addresed to me.
+Optional argument GROUP to look.
+
+\(fn MESSAGE &optional GROUP)" nil nil)
+
+;;;***
+
+;;;### (autoloads (jabber-private-set jabber-private-get) "jabber-private"
+;;;;;; "jabber-private.el" (18442 56829))
+;;; Generated autoloads from jabber-private.el
+
+(autoload 'jabber-private-get "jabber-private" "\
+Retrieve an item from private XML storage.
+The item to retrieve is identified by NODE-NAME (a symbol) and
+NAMESPACE (a string).
+
+On success, SUCCESS-CALLBACK is called with JC and the retrieved
+XML fragment.
+
+On error, ERROR-CALLBACK is called with JC and the entire IQ
+result.
+
+\(fn JC NODE-NAME NAMESPACE SUCCESS-CALLBACK ERROR-CALLBACK)" nil nil)
+
+(autoload 'jabber-private-set "jabber-private" "\
+Store FRAGMENT in private XML storage.
+SUCCESS-CALLBACK, SUCCESS-CLOSURE-DATA, ERROR-CALLBACK and
+ERROR-CLOSURE-DATA are used as in `jabber-send-iq'.
+
+\(fn JC FRAGMENT &optional SUCCESS-CALLBACK SUCCESS-CLOSURE-DATA ERROR-CALLBACK ERROR-CLOSURE-DATA)" nil nil)
+
+;;;***
+
+;;;### (autoloads nil nil ("fsm.el" "jabber-ahc-presence.el" "jabber-ahc.el"
+;;;;;; "jabber-alert.el" "jabber-autoaway.el" "jabber-avatar.el"
+;;;;;; "jabber-browse.el" "jabber-chat.el" "jabber-chatbuffer.el"
+;;;;;; "jabber-chatstates.el" "jabber-conn.el" "jabber-disco.el"
+;;;;;; "jabber-events.el" "jabber-feature-neg.el" "jabber-festival.el"
+;;;;;; "jabber-ft-client.el" "jabber-ft-common.el" "jabber-ft-server.el"
+;;;;;; "jabber-history.el" "jabber-iq.el" "jabber-keepalive.el"
+;;;;;; "jabber-logon.el" "jabber-menu.el" "jabber-modeline.el" "jabber-muc.el"
+;;;;;; "jabber-newdisco.el" "jabber-osd.el" "jabber-presence.el"
+;;;;;; "jabber-ratpoison.el" "jabber-register.el" "jabber-roster.el"
+;;;;;; "jabber-sasl.el" "jabber-sawfish.el" "jabber-screen.el" "jabber-search.el"
+;;;;;; "jabber-si-client.el" "jabber-si-common.el" "jabber-si-server.el"
+;;;;;; "jabber-socks5.el" "jabber-time.el" "jabber-truncate.el"
+;;;;;; "jabber-util.el" "jabber-vcard-avatars.el" "jabber-vcard.el"
+;;;;;; "jabber-version.el" "jabber-watch.el" "jabber-widget.el"
+;;;;;; "jabber-wmii.el" "jabber-xmessage.el" "jabber-xml.el" "srv.el")
+;;;;;; (18454 52856 349895))
+
+;;;***
+
+(provide 'jabber-autoloads)
+;; Local Variables:
+;; version-control: never
+;; no-byte-compile: t
+;; no-update-autoloads: t
+;; End:
+;;; jabber-autoloads.el ends here
diff --git a/jabber-avatar.el b/jabber-avatar.el
index beb74f9..d03b0dd 100644
--- a/jabber-avatar.el
+++ b/jabber-avatar.el
@@ -1,6 +1,6 @@
;;; jabber-avatar.el --- generic functions for avatars
-;; Copyright (C) 2006 Magnus Henoch
+;; Copyright (C) 2006, 2007 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
@@ -45,6 +45,11 @@
:group 'jabber-avatar
:type 'directory)
+(defcustom jabber-avatar-verbose nil
+ "Display messages about irregularities with other people's avatars."
+ :group 'jabber-avatar
+ :type 'boolean)
+
;;;; Avatar data handling
(defstruct avatar sha1-sum mime-type url base64-data height width bytes)
@@ -71,8 +76,8 @@ Retrieves the image to find info about it."
(let ((data (with-temp-buffer
(insert-file-contents-literally filename)
(buffer-string)))
- (mime-type (progn (string-match "\\.[^.]+$" filename)
- (mailcap-extension-to-mime (match-string 0 filename)))))
+ (mime-type (when (string-match "\\.[^.]+$" filename)
+ (mailcap-extension-to-mime (match-string 0 filename)))))
(jabber-avatar-from-data data nil mime-type)))
(defun jabber-avatar-from-base64-string (base64-string &optional mime-type)
@@ -161,15 +166,18 @@ If there is no cached image, return nil."
(unless (file-directory-p jabber-avatar-cache-directory)
(make-directory jabber-avatar-cache-directory))
- (with-current-buffer buffer
- (let ((require-final-newline nil))
- (setq buffer-file-coding-system 'binary)
- (if (fboundp 'set-buffer-multibyte)
- (set-buffer-multibyte nil))
- (set-visited-file-name filename t)
- (insert base64-data)
- (base64-decode-region (point-min) (point-max))
- (basic-save-buffer)))
+ (if (file-exists-p filename)
+ (when jabber-avatar-verbose
+ (message "Caching avatar, but %s already exists" filename))
+ (with-current-buffer buffer
+ (let ((require-final-newline nil))
+ (setq buffer-file-coding-system 'binary)
+ (if (fboundp 'set-buffer-multibyte)
+ (set-buffer-multibyte nil))
+ (set-visited-file-name filename t)
+ (insert base64-data)
+ (base64-decode-region (point-min) (point-max))
+ (basic-save-buffer))))
(kill-buffer buffer)))
;;;; Set avatar for contact
diff --git a/jabber-bookmarks.el b/jabber-bookmarks.el
new file mode 100644
index 0000000..9fc4277
--- /dev/null
+++ b/jabber-bookmarks.el
@@ -0,0 +1,231 @@
+;; jabber-bookmarks.el - bookmarks according to XEP-0048
+
+;; Copyright (C) 2007 - Magnus Henoch - mange@freemail.hu
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+(require 'jabber-private)
+(require 'jabber-widget)
+
+(require 'cl)
+
+(defvar jabber-bookmarks (make-hash-table :test 'equal)
+ "Mapping from full JIDs to bookmarks.
+Bookmarks are what has been retrieved from the server, as list of
+XML elements. This is nil if bookmarks have not been retrieved,
+and t if no bookmarks where found.")
+
+;;;###autoload
+(defun jabber-get-conference-data (jc conference-jid cont &optional key)
+ "Get bookmark data for CONFERENCE-JID.
+KEY may be nil or one of :name, :autojoin, :nick and :password.
+If KEY is nil, a plist containing the above keys is returned.
+CONT is called when the result is available, with JC and the
+result as arguments."
+ (jabber-get-bookmarks
+ jc
+ (lexical-let ((conference-jid conference-jid)
+ (key key)
+ (cont cont))
+ (lambda (jc result)
+ (let ((entry
+ (dolist (node result)
+ (when (and (eq (jabber-xml-node-name node) 'conference)
+ (string= (jabber-xml-get-attribute node 'jid) conference-jid))
+ (return (jabber-parse-conference-bookmark node))))))
+ (funcall cont jc
+ (if key
+ (plist-get entry key)
+ entry)))))))
+
+(defun jabber-parse-conference-bookmark (node)
+ "Convert a <conference/> tag into a plist.
+The plist may contain the keys :jid, :name, :autojoin,
+:nick and :password."
+ (when (eq (jabber-xml-node-name node) 'conference)
+ (list :jid (jabber-xml-get-attribute node 'jid)
+ :name (jabber-xml-get-attribute node 'name)
+ :autojoin (member (jabber-xml-get-attribute node 'autojoin)
+ '("true" "1"))
+ :nick (car (jabber-xml-node-children
+ (car (jabber-xml-get-children node 'nick))))
+ :password (car (jabber-xml-node-children
+ (car (jabber-xml-get-children node 'password)))))))
+
+;;;###autoload
+(defun jabber-get-bookmarks (jc cont &optional refresh)
+ "Retrieve bookmarks (if needed) and call CONT.
+Arguments to CONT are JC and the bookmark list. CONT will be
+called as the result of a filter function or a timer.
+If REFRESH is non-nil, always fetch bookmarks."
+ (let ((bookmarks (gethash (jabber-connection-bare-jid jc) jabber-bookmarks)))
+ (if (and (not refresh) bookmarks)
+ (run-with-timer 0.1 nil cont jc (when (listp bookmarks) bookmarks))
+ (lexical-let* ((cont cont)
+ (callback (lambda (jc result) (jabber-get-bookmarks-1 jc result cont))))
+ (jabber-private-get jc 'storage "storage:bookmarks"
+ callback callback)))))
+
+(defun jabber-get-bookmarks-1 (jc result cont)
+ (let ((my-jid (jabber-connection-bare-jid jc))
+ (value
+ (if (eq (jabber-xml-node-name result) 'storage)
+ (or (jabber-xml-node-children result) t)
+ t)))
+ (puthash my-jid value jabber-bookmarks)
+ (funcall cont jc (when (listp value) value))))
+
+(defun jabber-set-bookmarks (jc bookmarks &optional callback)
+ "Set bookmarks to BOOKMARKS, which is a list of XML elements.
+If CALLBACK is non-nil, call it with JC and t or nil as arguments
+on success or failure, respectively."
+ (unless callback
+ (setq callback #'ignore))
+ (jabber-private-set
+ `(storage ((xmlns . "storage:bookmarks"))
+ ,@bookmarks)
+ callback t
+ callback nil))
+
+;;;###autoload
+(defun jabber-edit-bookmarks (jc)
+ "Create a buffer for editing bookmarks interactively."
+ (interactive (list (jabber-read-account)))
+ (jabber-get-bookmarks jc 'jabber-edit-bookmarks-1 t))
+
+(defun jabber-edit-bookmarks-1 (jc bookmarks)
+ (setq bookmarks
+ (mapcar
+ (lambda (e)
+ (case (jabber-xml-node-name e)
+ (url
+ (list 'url (or (jabber-xml-get-attribute e 'url) "")
+ (or (jabber-xml-get-attribute e 'name) "")))
+ (conference
+ (list 'conference
+ (or (jabber-xml-get-attribute e 'jid) "")
+ (or (jabber-xml-get-attribute e 'name) "")
+ (not (not (member (jabber-xml-get-attribute e 'autojoin)
+ '("true" "1"))))
+ (or (jabber-xml-path e '(nick "")) "")
+ (or (jabber-xml-path e '(password "")) "")))))
+ bookmarks))
+ (setq bookmarks (delq nil bookmarks))
+ (with-current-buffer (get-buffer-create "Edit bookmarks")
+ (jabber-init-widget-buffer nil)
+ (setq jabber-buffer-connection jc)
+
+ (widget-insert (jabber-propertize (concat "Edit bookmarks for "
+ (jabber-connection-bare-jid jc))
+ 'face 'jabber-title-large)
+ "\n\n")
+
+ (when (or (bound-and-true-p jabber-muc-autojoin)
+ (bound-and-true-p jabber-muc-default-nicknames))
+ (widget-insert "The variables `jabber-muc-autojoin' and/or `jabber-muc-default-nicknames'\n"
+ "contain values. They are only available to jabber.el on this machine.\n"
+ "You may want to import them into your bookmarks, to make them available\n"
+ "to any client on any machine.\n")
+ (widget-create 'push-button :notify 'jabber-bookmarks-import "Import values from variables")
+ (widget-insert "\n\n"))
+
+ (push (cons 'bookmarks
+ (widget-create
+ '(repeat
+ :tag "Bookmarks"
+ (choice
+ (list :tag "Conference"
+ (const :format "" conference)
+ (string :tag "JID") ;XXX: jid widget type?
+ (string :tag "Name")
+ (checkbox :tag "Autojoin" :format "%[%v%] Autojoin?\n")
+ (string :tag "Nick") ;or nil?
+ (string :tag "Password") ;or nil?
+ )
+ (list :tag "URL"
+ (const :format "" url)
+ (string :tag "URL")
+ (string :tag "Name"))))
+ :value bookmarks))
+ jabber-widget-alist)
+
+ (widget-insert "\n")
+ (widget-create 'push-button :notify 'jabber-bookmarks-submit "Submit")
+
+ (widget-setup)
+ (widget-minor-mode 1)
+ (switch-to-buffer (current-buffer))
+ (goto-char (point-min))))
+
+(defun jabber-bookmarks-submit (&rest ignore)
+ (let ((bookmarks (widget-value (cdr (assq 'bookmarks jabber-widget-alist)))))
+ (setq bookmarks
+ (mapcar
+ (lambda (entry)
+ (case (car entry)
+ (url
+ (destructuring-bind (symbol url name) entry
+ `(url ((url . ,url)
+ (name . ,name)))))
+ (conference
+ (destructuring-bind (symbol jid name autojoin nick password)
+ entry
+ `(conference ((jid . ,jid)
+ (name . ,name)
+ (autojoin . ,(if autojoin
+ "1"
+ "0")))
+ ,@(unless (zerop (length nick))
+ `((nick () ,nick)))
+ ,@(unless (zerop (length password))
+ `((password () ,password))))))))
+ bookmarks))
+ (remhash (jabber-connection-bare-jid jabber-buffer-connection) jabber-bookmarks)
+ (jabber-private-set
+ jabber-buffer-connection
+ `(storage ((xmlns . "storage:bookmarks"))
+ ,@bookmarks)
+ 'jabber-report-success "Storing bookmarks"
+ 'jabber-report-success "Storing bookmarks")))
+
+(defun jabber-bookmarks-import (&rest ignore)
+ (let* ((value (widget-value (cdr (assq 'bookmarks jabber-widget-alist))))
+ (conferences (mapcar
+ 'cdr
+ (remove-if-not
+ (lambda (entry)
+ (eq (car entry) 'conference))
+ value))))
+ (dolist (default-nickname jabber-muc-default-nicknames)
+ (destructuring-bind (muc-jid . nick) default-nickname
+ (let ((entry (assoc muc-jid conferences)))
+ (if entry
+ (setf (fourth entry) nick)
+ (setq entry (list muc-jid "" nil nick ""))
+ (push entry conferences)
+ (push (cons 'conference entry) value)))))
+ (dolist (autojoin jabber-muc-autojoin)
+ (let ((entry (assoc autojoin conferences)))
+ (if entry
+ (setf (third entry) t)
+ (setq entry (list autojoin "" t "" ""))
+ (push (cons 'conference entry) value))))
+ (widget-value-set (cdr (assq 'bookmarks jabber-widget-alist)) value)
+ (widget-setup)))
+
+(provide 'jabber-bookmarks)
+;; arch-tag: a7d6f862-bac0-11db-831f-000a95c2fcd0
diff --git a/jabber-browse.el b/jabber-browse.el
index 3900617..39572ac 100644
--- a/jabber-browse.el
+++ b/jabber-browse.el
@@ -27,17 +27,18 @@
(add-to-list 'jabber-jid-info-menu
(cons "Send browse query" 'jabber-get-browse))
-(defun jabber-get-browse (to)
+(defun jabber-get-browse (jc to)
"send a browse infoquery request to someone"
- (interactive (list (jabber-read-jid-completing "browse: ")))
- (jabber-send-iq to
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "browse: ")))
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:browse")))
#'jabber-process-data #'jabber-process-browse
#'jabber-process-data "Browse failed"))
;; called from jabber-process-data
-(defun jabber-process-browse (xml-data)
+(defun jabber-process-browse (jc xml-data)
"Handle results from jabber:iq:browse requests."
(dolist (item (jabber-xml-node-children xml-data))
(when (and (listp item)
@@ -88,10 +89,11 @@
(insert "\n")
(put-text-property beginning (point) 'jabber-jid jid)
+ (put-text-property beginning (point) 'jabber-account jc)
;; XXX: Is this kind of recursion really needed?
(if (listp (car (jabber-xml-node-children item)))
- (jabber-process-browse item))))))
+ (jabber-process-browse jc item))))))
(provide 'jabber-browse)
diff --git a/jabber-chat.el b/jabber-chat.el
index 255e436..984b34a 100644
--- a/jabber-chat.el
+++ b/jabber-chat.el
@@ -1,6 +1,6 @@
;; jabber-chat.el - one-to-one chats
-;; Copyright (C) 2005 - Magnus Henoch - mange@freemail.hu
+;; Copyright (C) 2005, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -41,9 +41,11 @@ with):
:group 'jabber-chat)
(defcustom jabber-chat-header-line-format
- '("" (:eval (let ((buddy (jabber-jid-symbol jabber-chatting-with)))
- (jabber-propertize " "
- 'display (get buddy 'avatar))))
+ '("" (jabber-chat-buffer-show-avatar
+ (:eval
+ (let ((buddy (jabber-jid-symbol jabber-chatting-with)))
+ (jabber-propertize " "
+ 'display (get buddy 'avatar)))))
(:eval (jabber-jid-displayname jabber-chatting-with))
"\t" (:eval (let ((buddy (jabber-jid-symbol jabber-chatting-with)))
(propertize
@@ -54,13 +56,21 @@ with):
(or (cdr (assoc (get buddy 'show) jabber-presence-faces))
'jabber-roster-user-online))))
"\t" (:eval (jabber-fix-status (get (jabber-jid-symbol jabber-chatting-with) 'status)))
- "\t" jabber-events-message) ;see jabber-events.el
+ "\t" jabber-events-message ;see jabber-events.el
+ "\t" jabber-chatstates-message) ;see jabber-chatstates.el
"The specification for the header line of chat buffers.
The format is that of `mode-line-format' and `header-line-format'."
:type 'sexp
:group 'jabber-chat)
+(defcustom jabber-chat-buffer-show-avatar t
+ "Show avatars in header line of chat buffer?
+This variable might not take effect if you have changed
+`jabber-chat-header-line-format'."
+ :type 'boolean
+ :group 'jabber-chat)
+
(defcustom jabber-chat-time-format "%H:%M"
"The format specification for instant messages in the chat buffer.
See also `jabber-chat-delayed-time-format'.
@@ -103,8 +113,8 @@ These fields are available:
%t Time, formatted according to `jabber-chat-time-format'
or `jabber-chat-delayed-time-format'
-%n Nickname (`jabber-nickname')
%u Username
+%n Nickname (obsolete, same as username)
%r Resource
%j Bare JID (without resource)"
:type 'string
@@ -207,14 +217,16 @@ Either a string or a buffer is returned, so use `get-buffer' or
(list
(cons ?n (jabber-jid-displayname chat-with))
(cons ?j (jabber-jid-user chat-with))
- (cons ?r (jabber-jid-resource chat-with)))))
+ (cons ?r (or (jabber-jid-resource chat-with) "")))))
-(defun jabber-chat-create-buffer (chat-with)
+(defun jabber-chat-create-buffer (jc chat-with)
"Prepare a buffer for chatting with CHAT-WITH.
This function is idempotent."
(with-current-buffer (get-buffer-create (jabber-chat-get-buffer chat-with))
(unless (eq major-mode 'jabber-chat-mode)
- (jabber-chat-mode #'jabber-chat-pp))
+ (jabber-chat-mode jc #'jabber-chat-pp))
+ ;; Make sure the connection variable is up to date.
+ (setq jabber-buffer-connection jc)
(make-local-variable 'jabber-chatting-with)
(setq jabber-chatting-with chat-with)
@@ -279,7 +291,7 @@ This function is idempotent."
(add-to-list 'jabber-message-chain 'jabber-process-chat)
-(defun jabber-process-chat (xml-data)
+(defun jabber-process-chat (jc xml-data)
"If XML-DATA is a one-to-one chat message, handle it as such."
;; XXX: there's more to being a chat message than not being MUC.
;; Maybe make independent predicate.
@@ -292,9 +304,10 @@ This function is idempotent."
xml-data 'body))))))
(with-current-buffer (if (jabber-muc-sender-p from)
(jabber-muc-private-create-buffer
+ jc
(jabber-jid-user from)
(jabber-jid-resource from))
- (jabber-chat-create-buffer from))
+ (jabber-chat-create-buffer jc from))
;; Call alert hooks only when something is output
(when (or error-p
(run-hook-with-args-until-success 'jabber-chat-printers xml-data :foreign :printp))
@@ -308,8 +321,8 @@ This function is idempotent."
(funcall jabber-alert-message-function
from (current-buffer) body-text))))))))
-(defun jabber-chat-send (body)
- "Send BODY, and display it in chat buffer."
+(defun jabber-chat-send (jc body)
+ "Send BODY through connection JC, and display it in chat buffer."
;; Build the stanza...
(let* ((id (apply 'format "emacs-msg-%d.%d.%d" (current-time)))
(stanza-to-send `(message
@@ -325,7 +338,7 @@ This function is idempotent."
(jabber-maybe-print-rare-time
(ewoc-enter-last jabber-chat-ewoc (list :local stanza-to-send :time (current-time)))))
;; ...and send it...
- (jabber-send-sexp stanza-to-send)))
+ (jabber-send-sexp jc stanza-to-send)))
(defun jabber-chat-pp (data)
"Pretty-print a <message/> stanza.
@@ -336,7 +349,14 @@ This function is used as an ewoc prettyprinter."
(original-timestamp (when (listp (cadr data))
(jabber-xml-path (cadr data) '(("jabber:x:delay" . "x")))))
(internal-time
- (plist-get (cddr data) :time)))
+ (plist-get (cddr data) :time))
+ (body (ignore-errors (car
+ (jabber-xml-node-children
+ (car
+ (jabber-xml-get-children (cadr data) 'body))))))
+ (/me-p
+ (and (> (length body) 4)
+ (string= (substring body 0 4) "/me "))))
;; Print prompt...
(let ((delayed (or original-timestamp (plist-get (cddr data) :delayed))))
@@ -344,20 +364,22 @@ This function is used as an ewoc prettyprinter."
(:local
(jabber-chat-self-prompt (or (jabber-x-delay original-timestamp)
internal-time)
- delayed))
+ delayed
+ /me-p))
(:foreign
;; For :error and :notice, this might be a string... beware
(jabber-chat-print-prompt (when (listp (cadr data)) (cadr data))
(or (jabber-x-delay original-timestamp)
internal-time)
- delayed))
- ((:error :notice)
+ delayed
+ /me-p))
+ ((:error :notice :subscription-request)
(jabber-chat-system-prompt (or (jabber-x-delay original-timestamp)
internal-time)))
(:muc-local
- (jabber-muc-print-prompt (cadr data) t))
+ (jabber-muc-print-prompt (cadr data) t /me-p))
(:muc-foreign
- (jabber-muc-print-prompt (cadr data)))
+ (jabber-muc-print-prompt (cadr data) nil /me-p))
((:muc-notice :muc-error)
(jabber-muc-system-prompt))))
@@ -376,7 +398,24 @@ This function is used as an ewoc prettyprinter."
(insert (cadr data)))
(:rare-time
(insert (jabber-propertize (format-time-string jabber-rare-time-format (cadr data))
- 'face 'jabber-rare-time-face))))
+ 'face 'jabber-rare-time-face)))
+ (:subscription-request
+ (insert "This user requests subscription to your presence.\n")
+ (when (and (stringp (cadr data)) (not (zerop (length (cadr data)))))
+ (insert "Message: " (cadr data) "\n"))
+ (insert "Accept?\n\n")
+ (flet ((button
+ (text action)
+ (if (fboundp 'insert-button)
+ (insert-button text 'action action)
+ ;; simple button replacement
+ (let ((keymap (make-keymap)))
+ (define-key keymap "\r" action)
+ (insert (jabber-propertize text 'keymap keymap 'face 'highlight))))
+ (insert "\t")))
+ (button "Mutual" 'jabber-subscription-accept-mutual)
+ (button "One-way" 'jabber-subscription-accept-one-way)
+ (button "Decline" 'jabber-subscription-decline))))
(when jabber-chat-fill-long-lines
(save-restriction
@@ -409,13 +448,14 @@ This function is used as an ewoc prettyprinter."
(jabber-message-time data))))
(ewoc-enter-before jabber-chat-ewoc node (list :rare-time (jabber-message-time data))))))
-(defun jabber-chat-print-prompt (xml-data timestamp delayed)
+(defun jabber-chat-print-prompt (xml-data timestamp delayed dont-print-nick-p)
"Print prompt for received message in XML-DATA.
TIMESTAMP is the timestamp to print, or nil to get it
from a jabber:x:delay element.
If DELAYED is true, print long timestamp
\(`jabber-chat-delayed-time-format' as opposed to
-`jabber-chat-time-format')."
+`jabber-chat-time-format').
+If DONT-PRINT-NICK-P is true, don't include nickname."
(let ((from (jabber-xml-get-attribute xml-data 'from))
(timestamp (or timestamp
(car (delq nil (mapcar 'jabber-x-delay (jabber-xml-get-children xml-data 'x)))))))
@@ -427,7 +467,7 @@ If DELAYED is true, print long timestamp
jabber-chat-delayed-time-format
jabber-chat-time-format)
timestamp))
- (cons ?n (jabber-jid-displayname from))
+ (cons ?n (if dont-print-nick-p "" (jabber-jid-displayname from)))
(cons ?u (or (jabber-jid-username from) from))
(cons ?r (jabber-jid-resource from))
(cons ?j (jabber-jid-user from))))
@@ -449,27 +489,33 @@ If DELAYED is true, print long timestamp
'help-echo
(concat (format-time-string "System message on %Y-%m-%d %H:%M:%S" timestamp)))))
-(defun jabber-chat-self-prompt (timestamp delayed)
+(defun jabber-chat-self-prompt (timestamp delayed dont-print-nick-p)
"Print prompt for sent message.
TIMESTAMP is the timestamp to print, or nil for now.
If DELAYED is true, print long timestamp
\(`jabber-chat-delayed-time-format' as opposed to
-`jabber-chat-time-format')."
- (insert (jabber-propertize
- (format-spec jabber-chat-local-prompt-format
- (list
- (cons ?t (format-time-string
- (if delayed
- jabber-chat-delayed-time-format
- jabber-chat-time-format)
- timestamp))
- (cons ?n jabber-nickname)
- (cons ?u jabber-username)
- (cons ?r jabber-resource)
- (cons ?j (concat jabber-username "@" jabber-server))))
- 'face 'jabber-chat-prompt-local
- 'help-echo
- (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from you"))))
+`jabber-chat-time-format').
+If DONT-PRINT-NICK-P is true, don't include nickname."
+ (let* ((state-data (fsm-get-state-data jabber-buffer-connection))
+ (username (plist-get state-data :username))
+ (server (plist-get state-data :server))
+ (resource (plist-get state-data :resource))
+ (nickname username))
+ (insert (jabber-propertize
+ (format-spec jabber-chat-local-prompt-format
+ (list
+ (cons ?t (format-time-string
+ (if delayed
+ jabber-chat-delayed-time-format
+ jabber-chat-time-format)
+ timestamp))
+ (cons ?n (if dont-print-nick-p "" nickname))
+ (cons ?u username)
+ (cons ?r resource)
+ (cons ?j (concat username "@" server))))
+ 'face 'jabber-chat-prompt-local
+ 'help-echo
+ (concat (format-time-string "On %Y-%m-%d %H:%M:%S" timestamp) " from you")))))
(defun jabber-chat-print-error (xml-data)
"Print error in given <message/> in a readable way."
@@ -509,11 +555,12 @@ If DELAYED is true, print long timestamp
(when body
(when (eql mode :insert)
- (if (string-match "^/me \\(.*\\)$" body)
- (let ((action (match-string 1 body))
+ (if (and (> (length body) 4)
+ (string= (substring body 0 4) "/me "))
+ (let ((action (substring body 4))
(nick (cond
((eq who :local)
- jabber-nickname)
+ (plist-get (fsm-get-state-data jabber-buffer-connection) :username))
((jabber-muc-message-p xml-data)
(jabber-jid-resource (jabber-xml-get-attribute xml-data 'from)))
(t
@@ -526,8 +573,8 @@ If DELAYED is true, print long timestamp
(insert (jabber-propertize
body
'face (case who
- (:foreign 'jabber-chat-text-foreign)
- (:local 'jabber-chat-text-local))))))
+ ((:foreign :muc-foreign) 'jabber-chat-text-foreign)
+ ((:local :muc-local) 'jabber-chat-text-local))))))
t)))
(defun jabber-chat-print-url (xml-data who mode)
@@ -551,19 +598,22 @@ If DELAYED is true, print long timestamp
(defun jabber-chat-goto-address (&rest ignore)
"Call `goto-address' on the newly written text."
- (goto-address))
+ (ignore-errors
+ (goto-address)))
;; jabber-compose is autoloaded in jabber.el
(add-to-list 'jabber-jid-chat-menu
(cons "Compose message" 'jabber-compose))
-(defun jabber-send-message (to subject body type)
+(defun jabber-send-message (jc to subject body type)
"send a message tag to the server"
- (interactive (list (jabber-read-jid-completing "to: ")
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "to: ")
(jabber-read-with-input-method "subject: ")
(jabber-read-with-input-method "body: ")
(read-string "type: ")))
- (jabber-send-sexp `(message ((to . ,to)
+ (jabber-send-sexp jc
+ `(message ((to . ,to)
,(if (> (length type) 0)
`(type . ,type)))
,(if (> (length subject) 0)
@@ -576,13 +626,17 @@ If DELAYED is true, print long timestamp
(add-to-list 'jabber-jid-chat-menu
(cons "Start chat" 'jabber-chat-with))
-(defun jabber-chat-with (jid &optional other-window)
+(defun jabber-chat-with (jc jid &optional other-window)
"Open an empty chat window for chatting with JID.
With a prefix argument, open buffer in other window.
Returns the chat buffer."
- (interactive (list (jabber-read-jid-completing "chat with:")
- current-prefix-arg))
- (let ((buffer (jabber-chat-create-buffer jid)))
+ (interactive (let ((jid
+ (jabber-read-jid-completing "chat with:"))
+ (account
+ (jabber-read-account)))
+ (list
+ account jid current-prefix-arg)))
+ (let ((buffer (jabber-chat-create-buffer jc jid)))
(if other-window
(switch-to-buffer-other-window buffer)
(switch-to-buffer buffer))))
@@ -593,9 +647,11 @@ Signal an error if there is no JID at point.
With a prefix argument, open buffer in other window."
(interactive "P")
(let ((jid-at-point (get-text-property (point)
- 'jabber-jid)))
- (if jid-at-point
- (jabber-chat-with jid-at-point other-window)
+ 'jabber-jid))
+ (account (get-text-property (point)
+ 'jabber-account)))
+ (if (and jid-at-point account)
+ (jabber-chat-with account jid-at-point other-window)
(error "No contact at point"))))
(provide 'jabber-chat)
diff --git a/jabber-chatbuffer.el b/jabber-chatbuffer.el
index 2001517..df0a095 100644
--- a/jabber-chatbuffer.el
+++ b/jabber-chatbuffer.el
@@ -1,6 +1,6 @@
;; jabber-chatbuffer.el - functions common to all chat buffers
-;; Copyright (C) 2005 - Magnus Henoch - mange@freemail.hu
+;; Copyright (C) 2005, 2007 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -41,12 +41,18 @@ window or at `fill-column', whichever is shorter."
(defvar jabber-chat-ewoc nil
"The ewoc showing the messages of this chat buffer.")
-(defun jabber-chat-mode (ewoc-pp)
+(defvar jabber-buffer-connection nil
+ "The connection used by this buffer.")
+(make-variable-buffer-local 'jabber-buffer-connection)
+
+(defun jabber-chat-mode (jc ewoc-pp)
"\\{jabber-chat-mode-map}"
(kill-all-local-variables)
;; Make sure to set this variable somewhere
(make-local-variable 'jabber-send-function)
+ (setq jabber-buffer-connection jc)
+
(make-local-variable 'scroll-conservatively)
(setq scroll-conservatively 5)
@@ -88,12 +94,21 @@ window or at `fill-column', whichever is shorter."
(defun jabber-chat-buffer-send ()
(interactive)
- (let ((body (delete-and-extract-region jabber-point-insert (point-max))))
- ;; If user accidentally hits RET without writing anything,
- ;; delete-and-extract-region returns "". In that case,
- ;; no message should be sent.
- (unless (zerop (length body))
- (funcall jabber-send-function body))))
+ ;; If user accidentally hits RET without writing anything, just
+ ;; ignore it.
+ (when (plusp (- (point-max) jabber-point-insert))
+ ;; If connection was lost...
+ (unless (memq jabber-buffer-connection jabber-connections)
+ ;; ...maybe there is a new connection to the same account.
+ (let ((new-jc (jabber-find-active-connection jabber-buffer-connection)))
+ (if new-jc
+ ;; If so, just use it.
+ (setq jabber-buffer-connection new-jc)
+ ;; Otherwise, ask for a new account.
+ (setq jabber-buffer-connection (jabber-read-account t)))))
+
+ (let ((body (delete-and-extract-region jabber-point-insert (point-max))))
+ (funcall jabber-send-function jabber-buffer-connection body))))
(defun jabber-chat-buffer-fill-long-lines ()
"Fill lines that are wider than the window width."
diff --git a/jabber-chatstates.el b/jabber-chatstates.el
new file mode 100644
index 0000000..acb6afa
--- /dev/null
+++ b/jabber-chatstates.el
@@ -0,0 +1,174 @@
+;;; jabber-chatstate.el --- Chat state notification (XEP-0085) implementation
+
+;; Author: Ami Fischman <ami@fischman.org>
+;; (based entirely on jabber-events.el by Magnus Henoch <mange@freemail.hu>)
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;; TODO
+;; - Currently only active/composing notifications are /sent/ though all 5
+;; notifications are handled on receipt.
+
+(require 'cl)
+
+(defgroup jabber-chatstates nil
+ "Chat state notifications."
+ :group 'jabber)
+
+(defconst jabber-chatstates-xmlns "http://jabber.org/protocol/chatstates"
+ "XML namespace for the chatstates feature.")
+
+;;; INCOMING
+;;; Code for requesting chat state notifications from others and handling
+;;; them.
+
+(defvar jabber-chatstates-last-state nil
+ "The last seen chat state.")
+(make-variable-buffer-local 'jabber-chatstates-last-state)
+
+(defvar jabber-chatstates-message ""
+ "Human-readable presentation of chat state information")
+(make-variable-buffer-local 'jabber-chatstates-message)
+
+(defun jabber-chatstates-update-message ()
+ (setq jabber-chatstates-message
+ (if (and jabber-chatstates-last-state
+ (not (eq 'active jabber-chatstates-last-state)))
+ (format " (%s)" (symbol-name jabber-chatstates-last-state))
+ "")))
+
+(add-hook 'jabber-chat-send-hooks 'jabber-chatstates-when-sending)
+(defun jabber-chatstates-when-sending (text id)
+ (jabber-chatstates-update-message)
+ (jabber-chatstates-stop-timer)
+ (when (and jabber-chatstates-confirm jabber-chatstates-requested)
+ (when (eq jabber-chatstates-requested 'first-time)
+ ;; don't send more notifications until we know that the other
+ ;; side wants them.
+ (setq jabber-chatstates-requested nil))
+ `((active ((xmlns . ,jabber-chatstates-xmlns))))))
+
+;;; OUTGOING
+;;; Code for handling requests for chat state notifications and providing
+;;; them, modulo user preferences.
+
+(defcustom jabber-chatstates-confirm t
+ "Send notifications about chat states?"
+ :group 'jabber-chatstates
+ :type 'boolean)
+
+(defvar jabber-chatstates-requested 'first-time
+ "Whether or not chat states notification was requested.
+This is one of the following:
+first-time - send state in first stanza, then switch to nil
+t - send states
+nil - don't send states")
+(make-variable-buffer-local 'jabber-chatstates-requested)
+
+(defvar jabber-chatstates-composing-sent nil
+ "Has composing notification been sent?
+It can be sent and cancelled several times.")
+(make-variable-buffer-local 'jabber-chatstates-composing-sent)
+
+(defvar jabber-chatstates-paused-timer nil
+ "Timer that counts down from 'composing state to 'paused.")
+(make-variable-buffer-local 'jabber-chatstates-paused-timer)
+
+(defun jabber-chatstates-stop-timer ()
+ "Stop the 'paused timer."
+ (when jabber-chatstates-paused-timer
+ (cancel-timer jabber-chatstates-paused-timer)))
+
+(defun jabber-chatstates-kick-timer ()
+ "Start (or restart) the 'paused timer as approriate."
+ (jabber-chatstates-stop-timer)
+ (setq jabber-chatstates-paused-timer
+ (run-with-timer 5 nil 'jabber-chatstates-send-paused)))
+
+(defun jabber-chatstates-send-paused ()
+ "Send an 'paused state notification."
+ (when (and jabber-chatstates-requested jabber-chatting-with)
+ (setq jabber-chatstates-composing-sent nil)
+ (jabber-send-sexp
+ jabber-buffer-connection
+ `(message
+ ((to . ,jabber-chatting-with))
+ (paused ((xmlns . ,jabber-chatstates-xmlns)))))))
+
+(defun jabber-chatstates-after-change ()
+ (let* ((composing-now (not (= (point-max) jabber-point-insert)))
+ (state (if composing-now 'composing 'active)))
+ (when (and jabber-chatstates-confirm
+ jabber-chatting-with
+ jabber-chatstates-requested
+ (not (eq composing-now jabber-chatstates-composing-sent)))
+ (jabber-send-sexp
+ jabber-buffer-connection
+ `(message
+ ((to . ,jabber-chatting-with))
+ (,state ((xmlns . ,jabber-chatstates-xmlns)))))
+ (when (setq jabber-chatstates-composing-sent composing-now)
+ (jabber-chatstates-kick-timer)))))
+
+;;; COMMON
+
+(defun jabber-handle-incoming-message-chatstates (jc xml-data)
+ (when (get-buffer (jabber-chat-get-buffer (jabber-xml-get-attribute xml-data 'from)))
+ (with-current-buffer (jabber-chat-get-buffer (jabber-xml-get-attribute xml-data 'from))
+ (cond
+ ;; If we get an error message, we shouldn't report any
+ ;; events, as the requests are mirrored from us.
+ ((string= (jabber-xml-get-attribute xml-data 'type) "error")
+ (remove-hook 'post-command-hook 'jabber-chatstates-after-change t)
+ (setq jabber-chatstates-requested nil))
+
+ (t
+ (let ((state
+ (or
+ (let ((node
+ (find jabber-chatstates-xmlns
+ (jabber-xml-node-children xml-data)
+ :key #'(lambda (x) (jabber-xml-get-attribute x 'xmlns))
+ :test #'string=)))
+ (jabber-xml-node-name node))
+ (let ((node
+ ;; XXX: this is how we interoperate with
+ ;; Google Talk. We should really use a
+ ;; namespace-aware XML parser.
+ (find jabber-chatstates-xmlns
+ (jabber-xml-node-children xml-data)
+ :key #'(lambda (x) (jabber-xml-get-attribute x 'xmlns:cha))
+ :test #'string=)))
+ (when node
+ ;; Strip the "cha:" prefix
+ (let ((name (symbol-name (jabber-xml-node-name node))))
+ (when (> (length name) 4)
+ (intern (substring name 4)))))))))
+ ;; Set up hooks for composition notification
+ (when (and jabber-chatstates-confirm state)
+ (setq jabber-chatstates-requested t)
+ (add-hook 'post-command-hook 'jabber-chatstates-after-change nil t))
+
+ (setq jabber-chatstates-last-state state)
+ (jabber-chatstates-update-message)))))))
+
+;; Add function last in chain, so a chat buffer is already created.
+(add-to-list 'jabber-message-chain 'jabber-handle-incoming-message-chatstates t)
+
+(add-to-list 'jabber-advertised-features "http://jabber.org/protocol/chatstates")
+
+(provide 'jabber-chatstates)
+;; arch-tag: d879de90-51e1-11dc-909d-000a95c2fcd0
diff --git a/jabber-compose.el b/jabber-compose.el
index 946f165..8b721ab 100644
--- a/jabber-compose.el
+++ b/jabber-compose.el
@@ -1,6 +1,6 @@
;;; jabber-compose.el --- compose a Jabber message in a buffer
-;; Copyright (C) 2006 Magnus Henoch
+;; Copyright (C) 2006, 2007 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
;; Keywords:
@@ -23,9 +23,10 @@
;;; Code:
;;;###autoload
-(defun jabber-compose (&optional recipient)
+(defun jabber-compose (jc &optional recipient)
"Create a buffer for composing a Jabber message."
- (interactive (list (jabber-read-jid-completing "To whom? ")))
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "To whom? ")))
(with-current-buffer (get-buffer-create
(generate-new-buffer-name
@@ -34,6 +35,7 @@
(when recipient
(format "-%s" (jabber-jid-displayname recipient))))))
(set (make-local-variable 'jabber-widget-alist) nil)
+ (setq jabber-buffer-connection jc)
(use-local-map widget-keymap)
(insert (jabber-propertize "Compose Jabber message\n" 'face 'jabber-title-large))
@@ -71,7 +73,7 @@
(error "No recipients specified"))
(dolist (to recipients)
- (jabber-send-message to subject text nil))
+ (jabber-send-message jabber-buffer-connection to subject text nil))
(bury-buffer)
(message "Message sent")))
diff --git a/jabber-conn.el b/jabber-conn.el
index 07d3c52..ed82e9b 100644
--- a/jabber-conn.el
+++ b/jabber-conn.el
@@ -47,37 +47,24 @@
(defgroup jabber-conn nil "Jabber Connection Settings"
:group 'jabber)
-(defcustom jabber-network-server nil
- "hostname or IP address of server to connect to, if different from `jabber-server'."
- :type '(radio (const :tag "Same as `jabber-server'" nil)
- (string :tag "Hostname or IP address"))
- :group 'jabber-conn)
-
-(defcustom jabber-port nil
- "jabber port
-The default depends on the connection type: 5222 for ordinary connections
-and 5223 for SSL connections."
- :type '(choice (const :tag "Default" nil)
- (integer :tag "Port number"))
- :group 'jabber-conn)
-
-(defcustom jabber-connection-type
+(defun jabber-have-starttls ()
+ "Return true if we can use STARTTLS."
+ (and (featurep 'starttls)
+ (or (and (bound-and-true-p starttls-gnutls-program)
+ (executable-find starttls-gnutls-program))
+ (and (bound-and-true-p starttls-program)
+ (executable-find starttls-program)))))
+
+(defconst jabber-default-connection-type
(cond
;; Use STARTTLS if we can...
- ((and (featurep 'starttls)
- (or (and (bound-and-true-p starttls-gnutls-program)
- (executable-find starttls-gnutls-program))
- (and (bound-and-true-p starttls-program)
- (executable-find starttls-program))))
+ ((jabber-have-starttls)
'starttls)
;; ...else default to unencrypted connection.
(t
'network))
- "Type of connection to the jabber server, ssl or network most likely."
- :type '(radio (const :tag "Encrypted connection, SSL" ssl)
- (const :tag "Negotiate encrypted connection when available (STARTTLS)" starttls)
- (const :tag "Standard TCP/IP connection" network))
- :group 'jabber-conn)
+ "Default connection type.
+See `jabber-connect-methods'.")
(defcustom jabber-connection-ssl-program nil
"Program used for SSL/TLS connections.
@@ -98,133 +85,138 @@ First item is the symbol naming the method.
Second item is the connect function.
Third item is the send function.")
-(defvar jabber-connect-function nil
- "function that connects to the jabber server")
-
-(defvar jabber-conn-send-function nil
- "function that sends a line to the server")
+(defun jabber-get-connect-function (type)
+ "Get the connect function associated with TYPE.
+TYPE is a symbol; see `jabber-connection-type'."
+ (let ((entry (assq type jabber-connect-methods)))
+ (nth 1 entry)))
-(defun jabber-setup-connect-method ()
- (let ((entry (assq jabber-connection-type jabber-connect-methods)))
- (setq jabber-connect-function (nth 1 entry))
- (setq jabber-conn-send-function (nth 2 entry))))
+(defun jabber-get-send-function (type)
+ "Get the send function associated with TYPE.
+TYPE is a symbol; see `jabber-connection-type'."
+ (let ((entry (assq type jabber-connect-methods)))
+ (nth 2 entry)))
-(defun jabber-srv-targets ()
+(defun jabber-srv-targets (server network-server port)
"Find host and port to connect to.
+If NETWORK-SERVER and/or PORT are specified, use them.
If we can't find SRV records, use standard defaults."
;; If the user has specified a host or a port, obey that.
- (if (or jabber-network-server jabber-port)
- (list (cons (or jabber-network-server jabber-server)
- (or jabber-port 5222)))
+ (if (or network-server port)
+ (list (cons (or network-server server)
+ (or port 5222)))
(or (condition-case nil
- (srv-lookup (concat "_xmpp-client._tcp." jabber-server))
+ (srv-lookup (concat "_xmpp-client._tcp." server))
(error nil))
- (list (cons jabber-server 5222)))))
+ (list (cons server 5222)))))
;; Plain TCP/IP connection
-(defun jabber-network-connect ()
+(defun jabber-network-connect (fsm server network-server port)
+ "Connect to a Jabber server with a plain network connection.
+Send a message of the form (:connected CONNECTION) to FSM if
+connection succeeds. Send a message :connection-failed if
+connection fails."
+ ;; XXX: asynchronous connection
(let ((coding-system-for-read 'utf-8)
(coding-system-for-write 'utf-8)
- (targets (jabber-srv-targets)))
+ (targets (jabber-srv-targets server network-server port)))
(catch 'connected
(dolist (target targets)
(condition-case e
- (when (setq *jabber-connection*
- (open-network-stream
- "jabber"
- jabber-process-buffer
- (car target)
- (cdr target)))
- (throw 'connected t))
+ (let ((connection
+ (open-network-stream
+ "jabber"
+ (generate-new-buffer jabber-process-buffer)
+ (car target)
+ (cdr target))))
+ (when connection
+ (fsm-send fsm (list :connected connection))
+ (throw 'connected connection)))
(error
(message "Couldn't connect to %s: %s" target
- (error-message-string e))))))))
+ (error-message-string e)))))
+ (fsm-send fsm :connection-failed))))
-(defun jabber-network-send (string)
+(defun jabber-network-send (connection string)
"Send a string via a plain TCP/IP connection to the Jabber Server."
- (process-send-string *jabber-connection* string))
+ (process-send-string connection string))
;; SSL connection, we use openssl's s_client function for encryption
;; of the link
;; TODO: make this configurable
-(defun jabber-ssl-connect ()
- "connect via OpenSSL or GnuTLS to a Jabber Server"
- (let ((coding-system-for-read 'utf-8)
- (coding-system-for-write 'utf-8)
- (connect-function
- (cond
- ((and (memq jabber-connection-ssl-program '(nil gnutls))
- (fboundp 'open-tls-stream))
- 'open-tls-stream)
- ((and (memq jabber-connection-ssl-program '(nil openssl))
- (fboundp 'open-ssl-stream))
- 'open-ssl-stream)
- (t
- (error "Neither TLS nor SSL connect functions available")))))
- (setq *jabber-encrypted* t)
- (setq *jabber-connection*
- (funcall connect-function
- "jabber"
- jabber-process-buffer
- (or jabber-network-server jabber-server)
- (or jabber-port 5223)))))
-
-(defun jabber-ssl-send (string)
- "Send a string via an SSL-encrypted connection to the Jabber Server,
- it seems we need to send a linefeed afterwards"
- (process-send-string *jabber-connection* string)
- (process-send-string *jabber-connection* "\n"))
-
-(defun jabber-starttls-connect ()
- "connect via GnuTLS to a Jabber Server"
+(defun jabber-ssl-connect (fsm server network-server port)
+ "connect via OpenSSL or GnuTLS to a Jabber Server
+Send a message of the form (:connected CONNECTION) to FSM if
+connection succeeds. Send a message :connection-failed if
+connection fails."
+ (let ((coding-system-for-read 'utf-8)
+ (coding-system-for-write 'utf-8)
+ (connect-function
+ (cond
+ ((and (memq jabber-connection-ssl-program '(nil gnutls))
+ (fboundp 'open-tls-stream))
+ 'open-tls-stream)
+ ((and (memq jabber-connection-ssl-program '(nil openssl))
+ (fboundp 'open-ssl-stream))
+ 'open-ssl-stream)
+ (t
+ (error "Neither TLS nor SSL connect functions available")))))
+ (let ((connection
+ (funcall connect-function
+ "jabber"
+ (generate-new-buffer jabber-process-buffer)
+ (or network-server server)
+ (or port 5223))))
+ (if connection
+ (fsm-send fsm (list :connected connection))
+ (fsm-send fsm :connection-failed)))))
+
+(defun jabber-ssl-send (connection string)
+ "Send a string via an SSL-encrypted connection to the Jabber Server."
+ ;; It seems we need to send a linefeed afterwards.
+ (process-send-string connection string)
+ (process-send-string connection "\n"))
+
+(defun jabber-starttls-connect (fsm server network-server port)
+ "Connect via GnuTLS to a Jabber Server.
+Send a message of the form (:connected CONNECTION) to FSM if
+connection succeeds. Send a message :connection-failed if
+connection fails."
(let ((coding-system-for-read 'utf-8)
(coding-system-for-write 'utf-8)
- (targets (jabber-srv-targets)))
+ (targets (jabber-srv-targets server network-server port)))
(unless (fboundp 'starttls-open-stream)
(error "starttls.el not available"))
(catch 'connected
(dolist (target targets)
(condition-case e
- (when (setq *jabber-connection*
- (starttls-open-stream
- "jabber"
- (get-buffer-create jabber-process-buffer)
- (car target)
- (cdr target)))
- (throw 'connected t))
+ (let ((connection
+ (starttls-open-stream
+ "jabber"
+ (generate-new-buffer jabber-process-buffer)
+ (car target)
+ (cdr target))))
+ (when connection
+ (fsm-send fsm (list :connected connection))
+ (throw 'connected connection)))
(error
(message "Couldn't connect to %s: %s" target
- (error-message-string e))))))))
+ (error-message-string e))))
+ (fsm-send fsm :connection-failed)))))
-(defun jabber-starttls-initiate ()
+(defun jabber-starttls-initiate (fsm)
"Initiate a starttls connection"
- (setq jabber-short-circuit-input #'jabber-starttls-process-input)
- (jabber-send-sexp
+ (jabber-send-sexp fsm
'(starttls ((xmlns . "urn:ietf:params:xml:ns:xmpp-tls")))))
-(defun jabber-starttls-process-input (xml-data)
- "Process result of starttls request"
+(defun jabber-starttls-process-input (fsm xml-data)
+ "Process result of starttls request.
+Return non-nil on success, nil on failure."
(cond
((eq (car xml-data) 'proceed)
- (message "STARTTLS result:\n%s\n" (starttls-negotiate *jabber-connection*)))
+ (starttls-negotiate (plist-get (fsm-get-state-data fsm) :connection)))
((eq (car xml-data) 'failure)
- (ding)
- (message "STARTTLS negotiation failure: %s"
- (jabber-xml-node-name (car (jabber-xml-node-children xml-data))))
- (sit-for 3)
- (jabber-disconnect)))
-
- (setq jabber-short-circuit-input nil)
- (setq *jabber-encrypted* t)
-
- ;; Now, we send another stream header.
- (funcall jabber-conn-send-function
- (concat
- "<stream:stream to='"
- jabber-server
- "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>"))
- ;; now see what happens
- )
+ nil)))
(provide 'jabber-conn)
;; arch-tag: f95ec240-8cd3-11d9-9dbf-000a95c2fcd0
diff --git a/jabber-core.el b/jabber-core.el
index eb9d07f..ba168c7 100644
--- a/jabber-core.el
+++ b/jabber-core.el
@@ -1,7 +1,7 @@
;; jabber-core.el - core functions
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; SSL-Connection Parts:
;; Copyright (C) 2005 - Georg Lehner - jorge@magma.com.ni
@@ -22,17 +22,17 @@
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-(eval-when-compile (require 'cl))
+(require 'cl)
(require 'jabber-util)
(require 'jabber-logon)
(require 'jabber-conn)
+(require 'fsm)
-;; SASL depends on FLIM.
-(eval-and-compile
- (condition-case nil
- (require 'jabber-sasl)
- (error nil)))
+(require 'jabber-sasl)
+
+(defvar jabber-connections nil
+ "List of jabber-connection FSMs.")
(defvar *jabber-roster* nil
"the roster list")
@@ -46,36 +46,9 @@
(defvar *jabber-authenticated* nil
"boolean - are we authenticated")
-(defvar *jabber-encrypted* nil
- "boolean - is the connection encrypted")
-
(defvar *jabber-disconnecting* nil
"boolean - are we in the process of disconnecting by free will")
-(defvar *xmlq* ""
- "a string with all the incoming xml that is waiting to be parsed")
-
-(defvar jabber-register-p nil
- "Register a new account in this session?")
-
-(defvar jabber-session-id nil
- "id of the current session")
-
-(defvar jabber-stream-version nil
- "Stream version indicated by server")
-
-(defvar jabber-register-p nil
- "Is account registration occurring in this session?")
-
-(defvar jabber-call-on-connection nil
- "Function to be called on connection.
-This is set by `jabber-connect' on each call, and later picked up in
-`jabber-filter'.")
-
-(defvar jabber-short-circuit-input nil
- "Function that receives all stanzas, instead of the usual ones.
-Used for SASL authentication.")
-
(defvar jabber-message-chain nil
"Incoming messages are sent to these functions, in order.")
@@ -85,9 +58,6 @@ Used for SASL authentication.")
(defvar jabber-presence-chain nil
"Incoming presence notifications are sent to these functions, in order.")
-(defvar jabber-stream-error-chain '(jabber-process-stream-error)
- "Stream errors are sent to these functions, in order")
-
(defvar jabber-choked-count 0
"Number of successive times that the process buffer has been nonempty.")
@@ -96,9 +66,10 @@ Used for SASL authentication.")
(defgroup jabber-core nil "customize core functionality"
:group 'jabber)
-(defcustom jabber-post-connect-hook '(jabber-send-default-presence
- jabber-muc-autojoin)
- "*Hooks run after successful connection and authentication."
+(defcustom jabber-post-connect-hooks '(jabber-send-current-presence
+ jabber-muc-autojoin)
+ "*Hooks run after successful connection and authentication.
+The functions should accept one argument, the connection object."
:type 'hook
:group 'jabber-core)
@@ -118,6 +89,19 @@ This might be due to failed authentication. Check `*jabber-authenticated*'."
:type 'hook
:group 'jabber-core)
+(defcustom jabber-auto-reconnect nil
+ "Reconnect automatically after losing connection?
+This will be of limited use unless you have the password library
+installed, and have configured it to cache your password
+indefinitely. See `password-cache' and `password-cache-expiry'."
+ :type 'boolean
+ :group 'jabber-core)
+
+(defcustom jabber-reconnect-delay 5
+ "Seconds to wait before reconnecting"
+ :type 'integer
+ :group 'jabber-core)
+
(defcustom jabber-roster-buffer "*-jabber-*"
"The name of the roster buffer"
:type 'string
@@ -138,95 +122,639 @@ problems."
(defsubst jabber-have-sasl-p ()
"Return non-nil if SASL functions are available."
- (fboundp 'jabber-sasl-start-auth))
+ (featurep 'sasl))
+
+;; jabber-connect and jabber-connect-all should load jabber.el, not
+;; just jabber-core.el, when autoloaded.
-(defun jabber-connect (&optional registerp)
- "connect to the jabber server and start a jabber xml stream
-With prefix argument, register a new account."
+;;;###autoload (autoload 'jabber-connect-all "jabber" "Connect to all configured Jabber accounts.\nSee `jabber-account-list'.\nIf no accounts are configured (or ARG supplied), call `jabber-connect' interactively." t)
+(defun jabber-connect-all (&optional arg)
+ "Connect to all configured Jabber accounts.
+See `jabber-account-list'.
+If no accounts are configured (or ARG supplied), call `jabber-connect' interactively."
(interactive "P")
- (if *jabber-connected*
- (message "Already connected")
- (setq *xmlq* "")
+ (let ((accounts
+ (remove-if (lambda (account)
+ (cdr (assq :disabled (cdr account))))
+ jabber-account-list)))
+ (if (or (null accounts) arg)
+ (progn (setq current-prefix-arg nil) (call-interactively 'jabber-connect))
+ ;; Only connect those accounts that are not yet connected.
+ (let ((already-connected (mapcar #'jabber-connection-bare-jid jabber-connections))
+ (connected-one nil))
+ (dolist (account accounts)
+ (unless (member (jabber-jid-user (car account)) already-connected)
+ (let* ((jid (car account))
+ (alist (cdr account))
+ (password (cdr (assq :password alist)))
+ (network-server (cdr (assq :network-server alist)))
+ (port (cdr (assq :port alist)))
+ (connection-type (cdr (assq :connection-type alist))))
+ (jabber-connect
+ (jabber-jid-username jid)
+ (jabber-jid-server jid)
+ (jabber-jid-resource jid)
+ nil password network-server
+ port connection-type))))))))
+
+;;;###autoload (autoload 'jabber-connect "jabber" "Connect to the Jabber server and start a Jabber XML stream.\nWith prefix argument, register a new account.\nWith double prefix argument, specify more connection details." t)
+(defun jabber-connect (username server resource &optional
+ registerp password network-server
+ port connection-type)
+ "Connect to the Jabber server and start a Jabber XML stream.
+With prefix argument, register a new account.
+With double prefix argument, specify more connection details."
+ (interactive
+ (let* ((jid (completing-read "Enter your JID: " jabber-account-list))
+ (entry (assoc jid jabber-account-list))
+ (alist (cdr entry))
+ password network-server port connection-type registerp)
+ (flet ((nonempty
+ (s)
+ (unless (zerop (length s)) s)))
+ (when entry
+ ;; If the user entered the JID of one of the preconfigured
+ ;; accounts, use that data.
+ (setq password (cdr (assq :password alist)))
+ (setq network-server (cdr (assq :network-server alist)))
+ (setq port (cdr (assq :port alist)))
+ (setq connection-type (cdr (assq :connection-type alist))))
+ (when (equal current-prefix-arg '(16))
+ ;; Double prefix arg: ask about everything.
+ ;; (except password, which is asked about later anyway)
+ (setq password nil)
+ (setq network-server
+ (read-string (format "Network server: (default `%s') " network-server)
+ nil nil network-server))
+ (setq port
+ (car
+ (read-from-string
+ (read-string (format "Port: (default `%s') " port)
+ nil nil (if port (number-to-string port) "nil")))))
+ (setq connection-type
+ (car
+ (read-from-string
+ (let ((default (symbol-name (or connection-type jabber-default-connection-type))))
+ (completing-read
+ (format "Connection type: (default `%s') " default)
+ (mapcar (lambda (type)
+ (cons (symbol-name (car type)) nil))
+ jabber-connect-methods)
+ nil t nil nil default)))))
+ (setq registerp (yes-or-no-p "Register new account? ")))
+ (when (equal current-prefix-arg '(4))
+ (setq registerp t))
+
+ (list (jabber-jid-username jid)
+ (jabber-jid-server jid)
+ (jabber-jid-resource jid)
+ registerp password network-server port connection-type))))
+ (if (member (list username
+ server)
+ (mapcar
+ (lambda (c)
+ (let ((data (fsm-get-state-data c)))
+ (list (plist-get data :username)
+ (plist-get data :server))))
+ jabber-connections))
+ (message "Already connected to %s@%s"
+ username server)
(setq *jabber-authenticated* nil)
- (jabber-clear-roster)
+ ;;(jabber-clear-roster)
(jabber-reset-choked)
- ;; Call the function responsible for establishing a bidirectional
- ;; data stream to the Jabber Server, *jabber-connection* is set
- ;; afterwards.
- (jabber-setup-connect-method)
- (funcall jabber-connect-function)
- (unless *jabber-connection*
- (error "Connection failed"))
-
- ;; TLS connections leave data in the process buffer, which
- ;; the XML parser will choke on.
- (with-current-buffer (process-buffer *jabber-connection*)
- (erase-buffer))
- (set-process-filter *jabber-connection* #'jabber-pre-filter)
- (set-process-sentinel *jabber-connection* #'jabber-sentinel)
-
- (setq jabber-short-circuit-input nil)
- (setq jabber-register-p registerp)
-
- (setq jabber-call-on-connection (if registerp
- #'(lambda (stream-features) (jabber-get-register jabber-server))
- #'jabber-auth-somehow))
- (let ((stream-header (concat "<?xml version='1.0'?><stream:stream to='"
- jabber-server
- "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'"
- ;; Not supporting SASL is not XMPP compliant,
- ;; so don't pretend we are.
- (if (and (jabber-have-sasl-p) jabber-use-sasl)
- " version='1.0'"
- "")
- ">
-")))
-
- (funcall jabber-conn-send-function stream-header)
- (if jabber-debug-log-xml
- (with-current-buffer (get-buffer-create "*-jabber-xml-log-*")
- (save-excursion
- (goto-char (point-max))
- (insert (format "sending %S\n\n" stream-header)))))
-
- (setq jabber-choked-timer
- (run-with-timer 5 5 #'jabber-check-choked))
-
- (accept-process-output *jabber-connection*))
- ;; Next thing happening is the server sending its own <stream:stream> start tag.
- ;; That is handled in jabber-filter.
-
- (setq *jabber-connected* t)))
-
-(defun jabber-auth-somehow (stream-features)
- "Start authentication with SASL if the server supports it,
-otherwise JEP-0077. The STREAM-FEATURES argument is the stream features
-tag, or nil if we're connecting to a pre-XMPP server."
- (if (and stream-features
- jabber-use-sasl
- (jabber-have-sasl-p)
- jabber-stream-version
- (>= (string-to-number jabber-stream-version) 1.0))
- (jabber-sasl-start-auth stream-features)
- (jabber-get-auth jabber-server)))
-
-(defun jabber-disconnect ()
- "disconnect from the jabber server and re-initialise the jabber package variables"
- (interactive)
- (unless *jabber-disconnecting* ; avoid reentry
+ (push (start-jabber-connection username server resource
+ registerp password
+ network-server port connection-type)
+ jabber-connections)))
+
+(define-state-machine jabber-connection
+ :start ((username server resource registerp password network-server port connection-type)
+ "Start a Jabber connection."
+ (let* ((connection-type
+ (or connection-type jabber-default-connection-type))
+ (send-function
+ (jabber-get-send-function connection-type)))
+
+ (list :connecting
+ (list :send-function send-function
+ :username username
+ :server server
+ :resource resource
+ :password password
+ :registerp registerp
+ :connection-type connection-type
+ :encrypted (eq connection-type 'ssl)
+ :network-server network-server
+ :port port)))))
+
+(define-enter-state jabber-connection nil
+ (fsm state-data)
+ ;; `nil' is the error state.
+
+ ;; Close the network connection.
+ (let ((connection (plist-get state-data :connection)))
+ (when (processp connection)
+ (delete-process connection)))
+ (setq state-data (plist-put state-data :connection nil))
+ ;; Remove lost connections from the roster buffer.
+ (jabber-display-roster)
+ (let ((expected (plist-get state-data :disconnection-expected))
+ (reason (plist-get state-data :disconnection-reason))
+ (ever-session-established (plist-get state-data :ever-session-established)))
+ (unless expected
+ (run-hooks 'jabber-lost-connection-hook)
+ (message "%s@%s/%s: connection lost: `%s'"
+ (plist-get state-data :username)
+ (plist-get state-data :server)
+ (plist-get state-data :resource)
+ reason))
+
+ (if (and jabber-auto-reconnect (not expected) ever-session-established)
+ ;; Reconnect after a short delay?
+ (list state-data jabber-reconnect-delay)
+ ;; Else the connection is really dead. Remove it from the list
+ ;; of connections.
+ (setq jabber-connections
+ (delq fsm jabber-connections))
+ ;; And let the FSM sleep...
+ (list state-data nil))))
+
+(define-state jabber-connection nil
+ (fsm state-data event callback)
+ ;; In the `nil' state, the connection is dead. We wait for a
+ ;; :timeout message, meaning to reconnect, or :do-disconnect,
+ ;; meaning to cancel reconnection.
+ (case event
+ (:timeout
+ (list :connecting state-data))
+ (:do-disconnect
+ (setq jabber-connections
+ (delq fsm jabber-connections))
+ (list nil state-data nil))))
+
+(define-enter-state jabber-connection :connecting
+ (fsm state-data)
+ (let* ((connection-type (plist-get state-data :connection-type))
+ (connect-function (jabber-get-connect-function connection-type))
+ (server (plist-get state-data :server))
+ (network-server (plist-get state-data :network-server))
+ (port (plist-get state-data :port)))
+ (funcall connect-function fsm server network-server port))
+ (list state-data nil))
+
+(define-state jabber-connection :connecting
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:connected
+ (let ((connection (cadr event))
+ (registerp (plist-get state-data :registerp)))
+
+ ;; TLS connections leave data in the process buffer, which
+ ;; the XML parser will choke on.
+ (with-current-buffer (process-buffer connection)
+ (erase-buffer))
+
+ (setq state-data (plist-put state-data :connection connection))
+
+ (set-process-filter connection (fsm-make-filter fsm))
+ (set-process-sentinel connection (fsm-make-sentinel fsm))
+
+ (list :connected state-data)))
+
+ (:connection-failed
+ (message "Jabber connection failed")
+ (list nil state-data))
+
+ (:do-disconnect
+ ;; We don't have the connection object, so defer the disconnection.
+ :defer)))
+
+(defsubst jabber-fsm-handle-sentinel (state-data event)
+ "Handle sentinel event for jabber fsm."
+ ;; We do the same thing for every state, so avoid code duplication.
+ (let* ((string (car (cddr event)))
+ (new-state-data
+ ;; If we already know the reason (e.g. a stream error), don't
+ ;; overwrite it.
+ (if (plist-get state-data :disconnection-reason)
+ state-data
+ (plist-put state-data :disconnection-reason string))))
+ (list nil new-state-data)))
+
+(define-enter-state jabber-connection :connected
+ (fsm state-data)
+
+ (jabber-send-stream-header fsm)
+
+ ;; XXX: Update to multiaccount? Remove?
+ ;; (setq jabber-choked-timer
+ ;; (run-with-timer 5 5 #'jabber-check-choked))
+
+ ;;XXX: why is this here? I'll try commenting it out...
+ ;;(accept-process-output *jabber-connection*)
+
+ ;; Next thing happening is the server sending its own <stream:stream> start tag.
+
+ (setq *jabber-connected* t)
+ (list state-data nil))
+
+(define-state jabber-connection :connected
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :connected state-data)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stream-start
+ (let ((session-id (cadr event))
+ (stream-version (car (cddr event))))
+ (setq state-data
+ (plist-put state-data :session-id session-id))
+ ;; the stream feature is only sent if the initiating entity has
+ ;; sent 1.0 in the stream header. if sasl is not supported then
+ ;; we don't send 1.0 in the header and therefore we shouldn't wait
+ ;; even if 1.0 is present in the receiving stream.
+ (cond
+ ;; Wait for stream features?
+ ((and stream-version
+ (>= (string-to-number stream-version) 1.0)
+ jabber-use-sasl
+ (jabber-have-sasl-p))
+ ;; Stay in same state...
+ (list :connected state-data))
+ ;; Register account?
+ ((plist-get state-data :registerp)
+ ;; XXX: require encryption for registration?
+ (list :register-account state-data))
+ ;; Legacy authentication?
+ (t
+ (list :legacy-auth state-data)))))
+
+ (:stanza
+ (let ((stanza (cadr event)))
+ (cond
+ ;; At this stage, we only expect a stream:features stanza.
+ ((not (eq (jabber-xml-node-name stanza) 'stream:features))
+ (list nil (plist-put state-data
+ :disconnection-reason
+ (format "Unexpected stanza %s" stanza))))
+ ((and (jabber-xml-get-children stanza 'starttls)
+ (eq (plist-get state-data :connection-type) 'starttls))
+ (list :starttls state-data))
+ ;; XXX: require encryption for registration?
+ ((plist-get state-data :registerp)
+ ;; We could check for the <register/> element in stream
+ ;; features, but as a client we would only lose by doing
+ ;; that.
+ (list :register-account state-data))
+ (t
+ (list :sasl-auth (plist-put state-data :stream-features stanza))))))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(define-enter-state jabber-connection :starttls
+ (fsm state-data)
+ (jabber-starttls-initiate fsm)
+ (list state-data nil))
+
+(define-state jabber-connection :starttls
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :starttls state-data)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stanza
+ (if (jabber-starttls-process-input fsm (cadr event))
+ ;; Connection is encrypted. Send a stream tag again.
+ (list :connected (plist-put state-data :encrypted t))
+ (message "STARTTLS negotiation failed")
+ (list nil state-data)))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(define-enter-state jabber-connection :register-account
+ (fsm state-data)
+ (jabber-get-register fsm nil)
+ (list state-data nil))
+
+(define-state jabber-connection :register-account
+ (fsm state-data event callback)
+ ;; The connection will be closed in jabber-register
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :register-account state-data)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stanza
+ (or
+ (jabber-process-stream-error (cadr event) state-data)
+ (progn
+ (jabber-process-input fsm (cadr event))
+ (list :register-account state-data))))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(define-enter-state jabber-connection :legacy-auth
+ (fsm state-data)
+ (jabber-get-auth fsm (plist-get state-data :server)
+ (plist-get state-data :session-id))
+ (list state-data nil))
+
+(define-state jabber-connection :legacy-auth
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :legacy-auth state-data)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stanza
+ (or
+ (jabber-process-stream-error (cadr event) state-data)
+ (progn
+ (jabber-process-input fsm (cadr event))
+ (list :legacy-auth state-data))))
+
+ (:authentication-success
+ (jabber-cache-password (jabber-connection-bare-jid fsm) (cdr event))
+ (list :session-established state-data))
+
+ (:authentication-failure
+ (jabber-uncache-password (jabber-connection-bare-jid fsm))
+ ;; jabber-logon has already displayed a message
+ (list nil (plist-put state-data
+ :disconnection-expected t)))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(define-enter-state jabber-connection :sasl-auth
+ (fsm state-data)
+ (let ((new-state-data
+ (plist-put state-data
+ :sasl-data
+ (jabber-sasl-start-auth
+ fsm
+ (plist-get state-data
+ :stream-features)))))
+ (list new-state-data nil)))
+
+(define-state jabber-connection :sasl-auth
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :sasl-auth state-data)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stanza
+ (let ((new-sasl-data
+ (jabber-sasl-process-input
+ fsm (cadr event)
+ (plist-get state-data :sasl-data))))
+ (list :sasl-auth (plist-put state-data :sasl-data new-sasl-data))))
+
+ (:use-legacy-auth-instead
+ (list :legacy-auth (plist-put state-data :sasl-data nil)))
+
+ (:authentication-success
+ (jabber-cache-password (jabber-connection-bare-jid fsm) (cdr event))
+ (list :bind (plist-put state-data :sasl-data nil)))
+
+ (:authentication-failure
+ (jabber-uncache-password (jabber-connection-bare-jid fsm))
+ ;; jabber-sasl has already displayed a message
+ (list nil (plist-put state-data
+ :disconnection-expected t)))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(define-enter-state jabber-connection :bind
+ (fsm state-data)
+ (jabber-send-stream-header fsm)
+ (list state-data nil))
+
+(define-state jabber-connection :bind
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :bind state-data)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stream-start
+ ;; we wait for stream features...
+ (list :bind state-data))
+
+ (:stanza
+ (let ((stanza (cadr event)))
+ (cond
+ ((eq (jabber-xml-node-name stanza) 'stream:features)
+ (if (and (jabber-xml-get-children stanza 'bind)
+ (jabber-xml-get-children stanza 'session))
+ (labels
+ ((handle-bind
+ (jc xml-data success)
+ (fsm-send jc (list
+ (if success :bind-success :bind-failure)
+ xml-data))))
+ ;; So let's bind a resource. We can either pick a resource ourselves,
+ ;; or have the server pick one for us.
+ (let ((resource (plist-get state-data :resource)))
+ (jabber-send-iq fsm nil "set"
+ `(bind ((xmlns . "urn:ietf:params:xml:ns:xmpp-bind"))
+ ,@(when resource
+ `((resource () ,resource))))
+ #'handle-bind t
+ #'handle-bind nil))
+ (list :bind state-data))
+ (message "Server doesn't permit resource binding and session establishing")
+ (list nil state-data)))
+ (t
+ (or
+ (jabber-process-stream-error (cadr event) state-data)
+ (progn
+ (jabber-process-input fsm (cadr event))
+ (list :bind state-data)))))))
+
+ (:bind-success
+ (let ((jid (jabber-xml-path (cadr event) '(bind jid ""))))
+ ;; Maybe this isn't the JID we asked for.
+ (plist-put state-data :username (jabber-jid-username jid))
+ (plist-put state-data :server (jabber-jid-server jid))
+ (plist-put state-data :resource (jabber-jid-resource jid)))
+
+ ;; Been there, done that. Time to establish a session.
+ (labels
+ ((handle-session
+ (jc xml-data success)
+ (fsm-send jc (list
+ (if success :session-success :session-failure)
+ xml-data))))
+ (jabber-send-iq fsm nil "set"
+ '(session ((xmlns . "urn:ietf:params:xml:ns:xmpp-session")))
+ #'handle-session t
+ #'handle-session nil)
+ (list :bind state-data)))
+
+ (:session-success
+ ;; We have a session
+ (list :session-established state-data))
+
+ (:bind-failure
+ (message "Resource binding failed: %s"
+ (jabber-parse-error
+ (jabber-iq-error (cadr event))))
+ (list nil state-data))
+
+ (:session-failure
+ (message "Session establishing failed: %s"
+ (jabber-parse-error
+ (jabber-iq-error (cadr event))))
+ (list nil state-data))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(define-enter-state jabber-connection :session-established
+ (fsm state-data)
+ (jabber-send-iq fsm nil
+ "get"
+ '(query ((xmlns . "jabber:iq:roster")))
+ #'jabber-process-roster 'initial
+ #'jabber-report-success "Roster retrieval")
+ (list (plist-put state-data :ever-session-established t) nil))
+
+(defvar jabber-pending-presence-timeout 0.5
+ "Wait this long before doing presence packet batch processing.")
+
+(define-state jabber-connection :session-established
+ (fsm state-data event callback)
+ (case (or (car-safe event) event)
+ (:filter
+ (let ((process (cadr event))
+ (string (car (cddr event))))
+ (jabber-pre-filter process string fsm)
+ (list :session-established state-data :keep)))
+
+ (:sentinel
+ (jabber-fsm-handle-sentinel state-data event))
+
+ (:stanza
+ (or
+ (jabber-process-stream-error (cadr event) state-data)
+ (progn
+ (jabber-process-input fsm (cadr event))
+ (list :session-established state-data :keep))))
+
+ (:roster-update
+ ;; Batch up roster updates
+ (let* ((jid-symbol-to-update (cdr event))
+ (pending-updates (plist-get state-data :roster-pending-updates)))
+ ;; If there are pending updates, there is a timer running
+ ;; already; just add the new symbol and wait.
+ (if pending-updates
+ (progn
+ (unless (memq jid-symbol-to-update pending-updates)
+ (nconc pending-updates (list jid-symbol-to-update)))
+ (list :session-established state-data :keep))
+ ;; Otherwise, we need to create the list and start the timer.
+ (setq state-data
+ (plist-put state-data
+ :roster-pending-updates
+ (list jid-symbol-to-update)))
+ (list :session-established state-data jabber-pending-presence-timeout))))
+
+ (:timeout
+ ;; Update roster
+ (let ((pending-updates (plist-get state-data :roster-pending-updates)))
+ (setq state-data (plist-put state-data :roster-pending-updates nil))
+ (jabber-roster-update fsm nil pending-updates nil)
+ (list :session-established state-data)))
+
+ (:send-if-connected
+ ;; This is the only state in which we respond to such messages.
+ ;; This is to make sure we don't send anything inappropriate
+ ;; during authentication etc.
+ (jabber-send-sexp fsm (cdr event))
+ (list :session-established state-data :keep))
+
+ (:do-disconnect
+ (jabber-send-string fsm "</stream:stream>")
+ (list nil (plist-put state-data
+ :disconnection-expected t)))))
+
+(defun jabber-disconnect (&optional arg)
+ "Disconnect from all Jabber servers. If ARG supplied, disconnect one account."
+ (interactive "P")
+ (if arg
+ (jabber-disconnect-one (jabber-read-account))
+ (unless *jabber-disconnecting* ; avoid reentry
(let ((*jabber-disconnecting* t))
- (when (and *jabber-connection*
- (memq (process-status *jabber-connection*) '(open run)))
- (run-hooks 'jabber-pre-disconnect-hook)
- (funcall jabber-conn-send-function "</stream:stream>")
- ;; let the server close the stream
- (accept-process-output *jabber-connection* 3)
- ;; and do it ourselves as well, just to be sure
- (delete-process *jabber-connection*))
+ (dolist (c jabber-connections)
+ (jabber-disconnect-one c t))
+ (setq jabber-connections nil)
+
(jabber-disconnected)
- (if (interactive-p)
- (message "Disconnected from Jabber server")))))
+ (when (interactive-p)
+ (message "Disconnected from Jabber server(s)"))))))
+
+(defun jabber-disconnect-one (jc &optional dont-redisplay)
+ "Disconnect from one Jabber server.
+If DONT-REDISPLAY is non-nil, don't update roster buffer."
+ (interactive (list (jabber-read-account)))
+ ;;(run-hooks 'jabber-pre-disconnect-hook)
+ (fsm-send-sync jc :do-disconnect)
+ (when (interactive-p)
+ (message "Disconnected from %s"
+ (jabber-connection-jid jc)))
+ (unless dont-redisplay
+ (jabber-display-roster)))
(defun jabber-disconnected ()
"Re-initialise jabber package variables.
@@ -242,27 +770,24 @@ Call this function after disconnection."
(setq *jabber-connection* nil)
(jabber-clear-roster)
- (setq *xmlq* "")
(setq *jabber-authenticated* nil)
- (setq *jabber-encrypted* nil)
(setq *jabber-connected* nil)
(setq *jabber-active-groupchats* nil)
- (setq jabber-session-id nil)
(run-hooks 'jabber-post-disconnect-hook))
-(defun jabber-sentinel (process event)
- "alert user about lost connection"
- (unless (or *jabber-disconnecting* (not *jabber-connected*))
- (beep)
- (run-hooks 'jabber-lost-connection-hook)
- (message "Jabber connection lost: `%s'" event)
- ;; If there is data left (maybe a stream error) process it first
- (with-current-buffer (process-buffer process)
- (unless (zerop (buffer-size))
- (jabber-filter process)))
- (jabber-disconnected)))
-
-(defun jabber-pre-filter (process string)
+(defun jabber-log-xml (fsm direction data)
+ "Print DATA to XML log.
+If `jabber-debug-log-xml' is nil, do nothing.
+FSM is the connection that is sending/receiving.
+DIRECTION is a string, either \"sending\" or \"receive\".
+DATA is any sexp."
+ (when jabber-debug-log-xml
+ (with-current-buffer (get-buffer-create (format "*-jabber-xml-log-%s-*" (jabber-connection-bare-jid fsm)))
+ (save-excursion
+ (goto-char (point-max))
+ (insert (format "%s %S\n\n" direction data))))))
+
+(defun jabber-pre-filter (process string fsm)
(with-current-buffer (process-buffer process)
;; Append new data
(goto-char (point-max))
@@ -270,9 +795,9 @@ Call this function after disconnection."
(unless (boundp 'jabber-filtering)
(let (jabber-filtering)
- (jabber-filter process)))))
+ (jabber-filter process fsm)))))
-(defun jabber-filter (process)
+(defun jabber-filter (process fsm)
"the filter function for the jabber process"
(with-current-buffer (process-buffer process)
;; Start from the beginning
@@ -289,44 +814,32 @@ Call this function after disconnection."
;; Stream end?
(when (looking-at "</stream:stream>")
- (return (jabber-disconnect)))
+ (return (fsm-send fsm :stream-end)))
;; Stream header?
(when (looking-at "<stream:stream[^>]*>")
(let ((stream-header (match-string 0))
- (ending-at (match-end 0)))
+ (ending-at (match-end 0))
+ session-id stream-version)
;; These regexps extract attribute values from the stream
;; header, taking into account that the quotes may be either
;; single or double quotes.
- (setq jabber-session-id
+ (setq session-id
(and (or (string-match "id='\\([^']+\\)'" stream-header)
(string-match "id=\"\\([^\"]+\\)\"" stream-header))
(jabber-unescape-xml (match-string 1 stream-header))))
- (setq jabber-stream-version
+ (setq stream-version
(and (or
(string-match "version='\\([0-9.]+\\)'" stream-header)
(string-match "version=\"\\([0-9.]+\\)\"" stream-header))
(match-string 1 stream-header)))
- (if jabber-debug-log-xml
- (with-current-buffer (get-buffer-create "*-jabber-xml-log-*")
- (save-excursion
- (goto-char (point-max))
- (insert (format "receive %S\n\n" stream-header)))))
-
+ (jabber-log-xml fsm "receive" stream-header)
+
;; If the server is XMPP compliant, i.e. there is a version attribute
;; and it's >= 1.0, there will be a stream:features tag shortly,
;; so just wait for that.
- ;; the stream feature is only sent if the initiating entity has
- ;; sent 1.0 in the stream header. if sasl is not supported then
- ;; we don't send 1.0 in the header and therefore we shouldn't wait
- ;; even if 1.0 is present in the receiving stream.
- (unless (and jabber-stream-version
- (>= (string-to-number jabber-stream-version) 1.0)
- jabber-use-sasl
- (jabber-have-sasl-p))
- ;; Logon or register
- (funcall jabber-call-on-connection nil))
+ (fsm-send fsm (list :stream-start session-id stream-version))
(delete-region (point-min) ending-at)))
@@ -354,19 +867,19 @@ Call this function after disconnection."
;; If there's a problem with writing the XML log,
;; make sure the stanza is delivered, at least.
(condition-case e
- (if jabber-debug-log-xml
- (with-current-buffer (get-buffer-create "*-jabber-xml-log-*")
- (save-excursion
- (goto-char (point-max))
- (insert (format "receive %S\n\n" (car xml-data))))))
+ (jabber-log-xml fsm "receive" (car xml-data))
(error
(ding)
(message "Couldn't write XML log: %s" (error-message-string e))
(sit-for 2)))
(delete-region (point-min) (point))
+
+ (fsm-send fsm (list :stanza (car xml-data)))
+ ;; XXX: move this logic elsewhere
;; We explicitly don't catch errors in jabber-process-input,
;; to facilitate debugging.
- (jabber-process-input (car xml-data))))))
+ ;; (jabber-process-input (car xml-data))
+ ))))
(defun jabber-reset-choked ()
(setq jabber-choked-count 0))
@@ -407,93 +920,37 @@ submit a bug report, including the information below.
(switch-to-buffer (current-buffer)))
(jabber-disconnect))
-(defun jabber-process-input (xml-data)
+(defun jabber-process-input (jc xml-data)
"process an incoming parsed tag"
(let* ((tag (jabber-xml-node-name xml-data))
(functions (eval (cdr (assq tag '((iq . jabber-iq-chain)
(presence . jabber-presence-chain)
- (message . jabber-message-chain)
- (stream:error . jabber-stream-error-chain)))))))
-
- ;; Special treatment of the stream:features tag, which we get up
- ;; to three times, in the following order:
- ;; - To initiate STARTTLS (we can skip this step)
- ;; - To authenticate
- ;; - To establish a session
- (if (eq tag 'stream:features)
- (cond
- ((and (not *jabber-encrypted*)
- (eq jabber-connection-type 'starttls)
- (jabber-xml-get-children xml-data 'starttls))
- (jabber-starttls-initiate))
- (*jabber-authenticated*
- (jabber-bind-and-establish-session xml-data))
- (t
- (funcall jabber-call-on-connection xml-data)))
- (if jabber-short-circuit-input
- (funcall jabber-short-circuit-input xml-data)
- (dolist (f functions)
- (funcall f xml-data))))))
-
-(defun jabber-process-stream-error (xml-data)
- "Process an incoming stream error."
- (beep)
- (run-hooks 'jabber-lost-connection-hook)
- (message "Stream error, connection lost: %s" (jabber-parse-stream-error xml-data))
- (jabber-disconnect))
-
-(defun jabber-bind-and-establish-session (xml-data)
- ;; Now we have a stream:features tag. We expect it to contain bind and
- ;; session tags. If it doesn't, the server we are connecting to is no
- ;; IM server.
- (unless (and (jabber-xml-get-children xml-data 'bind)
- (jabber-xml-get-children xml-data 'session))
- (jabber-disconnect)
- (error "Server doesn't permit resource binding and session establishing"))
-
- ;; So let's bind a resource. We can either pick a resource ourselves,
- ;; or have the server pick one for us.
- (jabber-send-iq nil "set"
- `(bind ((xmlns . "urn:ietf:params:xml:ns:xmpp-bind"))
- (resource () ,jabber-resource))
- #'jabber-process-bind t
- #'jabber-process-bind nil))
-
-(defun jabber-process-bind (xml-data successp)
- (unless successp
- (jabber-disconnect)
- (error "Resource binding failed: %s"
- (jabber-parse-error (car (jabber-xml-get-children xml-data 'error)))))
-
- (let ((jid (car
- (jabber-xml-node-children
- (car
- (jabber-xml-get-children
- (jabber-iq-query xml-data) 'jid))))))
- ;; Maybe this isn't the JID we asked for.
- (setq jabber-username (jabber-jid-username jid))
- (setq jabber-server (jabber-jid-server jid))
- (setq jabber-resource (jabber-jid-resource jid)))
-
- ;; Been there, done that. Time to establish a session.
- (jabber-send-iq nil "set"
- '(session ((xmlns . "urn:ietf:params:xml:ns:xmpp-session")))
- #'jabber-process-session t
- #'jabber-process-session nil))
-
-(defun jabber-process-session (xml-data successp)
- (unless successp
- (jabber-disconnect)
- (error "Session establishing failed: %s"
- (jabber-parse-error (car (jabber-xml-get-children xml-data 'error)))))
-
- ;; Now, request roster.
- (jabber-send-iq nil
- "get"
- '(query ((xmlns . "jabber:iq:roster")))
- #'jabber-process-roster 'initial
- #'jabber-report-success "Roster retrieval"))
-
+ (message . jabber-message-chain)))))))
+ (dolist (f functions)
+ (condition-case e
+ (funcall f jc xml-data)
+ ((debug error)
+ (fsm-debug-output "Error %S while processing %S with function %s" e xml-data f))))))
+
+(defun jabber-process-stream-error (xml-data state-data)
+ "Process an incoming stream error.
+Return nil if XML-DATA is not a stream:error stanza.
+Return an fsm result list if it is."
+ (when (eq (jabber-xml-node-name xml-data) 'stream:error)
+ (let ((condition (jabber-stream-error-condition xml-data))
+ (text (jabber-parse-stream-error xml-data)))
+ (setq state-data (plist-put state-data :disconnection-reason
+ (format "Stream error: %s" text)))
+ ;; Special case: when the error is `conflict', we have been
+ ;; forcibly disconnected by the same user. Don't reconnect
+ ;; automatically.
+ (when (eq condition 'conflict)
+ (setq state-data (plist-put state-data :disconnection-expected t)))
+ (list nil state-data))))
+
+;; XXX: This function should probably die. The roster is stored
+;; inside the connection plists, and the obarray shouldn't be so big
+;; that we need to clean it.
(defun jabber-clear-roster ()
"Clean up the roster."
;; This is made complicated by the fact that the JIDs are symbols with properties.
@@ -502,19 +959,44 @@ submit a bug report, including the information below.
jabber-jid-obarray)
(setq *jabber-roster* nil))
-(defun jabber-send-sexp (sexp)
- "send the xml corresponding to SEXP to the jabber server"
+(defun jabber-send-sexp (jc sexp)
+ "Send the xml corresponding to SEXP to connection JC."
(condition-case e
- (if jabber-debug-log-xml
- (with-current-buffer (get-buffer-create "*-jabber-xml-log-*")
- (save-excursion
- (goto-char (point-max))
- (insert (format "sending %S\n\n" sexp)))))
+ (jabber-log-xml jc "sending" sexp)
(error
(ding)
(message "Couldn't write XML log: %s" (error-message-string e))
(sit-for 2)))
- (funcall jabber-conn-send-function (jabber-sexp2xml sexp)))
+ (jabber-send-string jc (jabber-sexp2xml sexp)))
+
+(defun jabber-send-sexp-if-connected (jc sexp)
+ "Send the stanza SEXP only if JC has established a session."
+ (fsm-send-sync jc (cons :send-if-connected sexp)))
+
+(defun jabber-send-stream-header (jc)
+ "Send stream header to connection JC."
+ (let ((stream-header
+ (concat "<?xml version='1.0'?><stream:stream to='"
+ (plist-get (fsm-get-state-data jc) :server)
+ "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'"
+ ;; Not supporting SASL is not XMPP compliant,
+ ;; so don't pretend we are.
+ (if (and (jabber-have-sasl-p) jabber-use-sasl)
+ " version='1.0'"
+ "")
+ ">
+")))
+ (jabber-send-string jc stream-header)
+ (jabber-log-xml jc "sending" stream-header)))
+
+(defun jabber-send-string (jc string)
+ "Send STRING to the connection JC."
+ (let* ((state-data (fsm-get-state-data jc))
+ (connection (plist-get state-data :connection))
+ (send-function (plist-get state-data :send-function)))
+ (unless connection
+ (error "%s has no connection" (jabber-connection-jid jc)))
+ (funcall send-function connection string)))
(provide 'jabber-core)
diff --git a/jabber-disco.el b/jabber-disco.el
index 00a9d9c..6c8f62a 100644
--- a/jabber-disco.el
+++ b/jabber-disco.el
@@ -1,7 +1,7 @@
;; jabber-disco.el - service discovery functions
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -75,7 +75,7 @@ Second item is access control function. That function is passed the
JID, and returns non-nil if access is granted. If the second item is
nil, access is always granted.")
-(defun jabber-process-disco-info (xml-data)
+(defun jabber-process-disco-info (jc xml-data)
"Handle results from info disco requests."
(let ((beginning (point)))
@@ -96,9 +96,12 @@ nil, access is always granted.")
((eq (jabber-xml-node-name x) 'feature)
(let ((var (jabber-xml-get-attribute x 'var)))
(insert "Feature:\t" var "\n")))))
- (put-text-property beginning (point) 'jabber-jid (jabber-xml-get-attribute xml-data 'from))))
+ (put-text-property beginning (point)
+ 'jabber-jid (jabber-xml-get-attribute xml-data 'from))
+ (put-text-property beginning (point)
+ 'jabber-account jc)))
-(defun jabber-process-disco-items (xml-data)
+(defun jabber-process-disco-items (jc xml-data)
"Handle results from items disco requests."
(let ((items (jabber-xml-get-children (jabber-iq-query xml-data) 'item)))
@@ -115,6 +118,7 @@ nil, access is always granted.")
'face 'jabber-title-medium)
name "\n\n")
'jabber-jid jid
+ 'jabber-account jc
'jabber-node node))))
(insert "No items found.\n"))))
@@ -122,7 +126,7 @@ nil, access is always granted.")
(cons "http://jabber.org/protocol/disco#info" 'jabber-return-disco-info))
(add-to-list 'jabber-iq-get-xmlns-alist
(cons "http://jabber.org/protocol/disco#items" 'jabber-return-disco-info))
-(defun jabber-return-disco-info (xml-data)
+(defun jabber-return-disco-info (jc xml-data)
"Respond to a service discovery request.
See JEP-0030."
(let* ((to (jabber-xml-get-attribute xml-data 'from))
@@ -144,9 +148,9 @@ See JEP-0030."
(jabber-signal-error "cancel" 'not-allowed)
;; Access control passed
(let ((result (if (functionp func)
- (funcall func xml-data)
+ (funcall func jc xml-data)
func)))
- (jabber-send-iq to "result"
+ (jabber-send-iq jc to "result"
`(query ((xmlns . ,xmlns)
,@(when node
(list (cons 'node node))))
@@ -156,7 +160,7 @@ See JEP-0030."
;; No such node
(jabber-signal-error "cancel" 'item-not-found))))
-(defun jabber-disco-return-client-info (xml-data)
+(defun jabber-disco-return-client-info (jc xml-data)
`(
;; If running under a window system, this is
;; a GUI client. If not, it is a console client.
@@ -173,11 +177,12 @@ See JEP-0030."
(add-to-list 'jabber-jid-info-menu
(cons "Send items disco query" 'jabber-get-disco-items))
-(defun jabber-get-disco-items (to &optional node)
+(defun jabber-get-disco-items (jc to &optional node)
"Send a service discovery request for items"
- (interactive (list (jabber-read-jid-completing "Send items disco request to: ")
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Send items disco request to: ")
(jabber-read-node "Node (or leave empty): ")))
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
(list 'query (append (list (cons 'xmlns "http://jabber.org/protocol/disco#items"))
(if (> (length node) 0)
@@ -187,11 +192,12 @@ See JEP-0030."
(add-to-list 'jabber-jid-info-menu
(cons "Send info disco query" 'jabber-get-disco-info))
-(defun jabber-get-disco-info (to &optional node)
+(defun jabber-get-disco-info (jc to &optional node)
"Send a service discovery request for info"
- (interactive (list (jabber-read-jid-completing "Send info disco request to: ")
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Send info disco request to: ")
(jabber-read-node "Node (or leave empty): ")))
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
(list 'query (append (list (cons 'xmlns "http://jabber.org/protocol/disco#info"))
(if (> (length node) 0)
diff --git a/jabber-events.el b/jabber-events.el
index 750175f..f78030a 100644
--- a/jabber-events.el
+++ b/jabber-events.el
@@ -1,6 +1,6 @@
;;; jabber-events.el --- Message events (JEP-0022) implementation
-;; Copyright (C) 2005 Magnus Henoch
+;; Copyright (C) 2005, 2008 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
@@ -124,9 +124,14 @@ and it hasn't been sent before."
(when (and jabber-events-confirm-displayed
(not jabber-events-display-confirmed)
(memq 'displayed jabber-events-requested)
+ ;; XXX: if jabber-events-requested is non-nil, how can
+ ;; jabber-chatting-with be nil? See
+ ;; http://sourceforge.net/tracker/index.php?func=detail&aid=1872560&group_id=88346&atid=586350
+ jabber-chatting-with
;; don't send to bare jids
(jabber-jid-resource jabber-chatting-with))
(jabber-send-sexp
+ jabber-buffer-connection
`(message
((to . ,jabber-chatting-with))
(x ((xmlns . "jabber:x:event"))
@@ -140,6 +145,7 @@ and it hasn't been sent before."
jabber-chatting-with
(not (eq composing-now jabber-events-composing-sent)))
(jabber-send-sexp
+ jabber-buffer-connection
`(message
((to . ,jabber-chatting-with))
(x ((xmlns . "jabber:x:event"))
@@ -152,7 +158,7 @@ and it hasn't been sent before."
;; Add function last in chain, so a chat buffer is already created.
(add-to-list 'jabber-message-chain 'jabber-handle-incoming-message-events t)
-(defun jabber-handle-incoming-message-events (xml-data)
+(defun jabber-handle-incoming-message-events (jc xml-data)
(when (and (not (jabber-muc-message-p xml-data))
(get-buffer (jabber-chat-get-buffer (jabber-xml-get-attribute xml-data 'from))))
(with-current-buffer (jabber-chat-get-buffer (jabber-xml-get-attribute xml-data 'from))
@@ -191,6 +197,7 @@ and it hasn't been sent before."
(flet ((send-notification
(type)
(jabber-send-sexp
+ jc
`(message
((to . ,(jabber-xml-get-attribute xml-data 'from)))
(x ((xmlns . "jabber:x:event"))
diff --git a/jabber-export.el b/jabber-export.el
index a71f729..63b7df5 100644
--- a/jabber-export.el
+++ b/jabber-export.el
@@ -1,6 +1,6 @@
;;; jabber-export.el --- export Jabber roster to file
-;; Copyright (C) 2005 Magnus Henoch
+;; Copyright (C) 2005, 2007 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
@@ -25,8 +25,16 @@
(defvar jabber-import-subscription-p-widget nil)
-(defun jabber-export-roster (&optional roster)
- "Create buffer from which roster can be exported to a file."
+;;;###autoload
+(defun jabber-export-roster (jc)
+ "Export roster for connection JC."
+ (interactive (list (jabber-read-account)))
+ (let ((state-data (fsm-get-state-data jc)))
+ (jabber-export-roster-do-it
+ (jabber-roster-to-sexp (plist-get state-data :roster)))))
+
+(defun jabber-export-roster-do-it (roster)
+ "Create buffer from which ROSTER can be exported to a file."
(interactive)
(with-current-buffer (get-buffer-create "Export roster")
(jabber-init-widget-buffer nil)
@@ -45,22 +53,26 @@ not affect your actual roster.
(widget-insert "\n\n")
(make-local-variable 'jabber-export-roster-widget)
- (jabber-export-display (or roster (jabber-roster-to-sexp *jabber-roster*)))
+ (jabber-export-display roster)
(widget-setup)
(widget-minor-mode 1)
(goto-char (point-min))
(switch-to-buffer (current-buffer))))
-(defun jabber-import-roster (file)
- "Create buffer for roster import from FILE."
- (interactive "fImport roster from file: ")
+;;;###autoload
+(defun jabber-import-roster (jc file)
+ "Create buffer for roster import for connection JC from FILE."
+ (interactive (list (jabber-read-account)
+ (read-file-name "Import roster from file: ")))
(let ((roster
(with-temp-buffer
(let ((coding-system-for-read 'utf-8))
(jabber-roster-xml-to-sexp
(car (xml-parse-file file)))))))
(with-current-buffer (get-buffer-create "Import roster")
+ (setq jabber-buffer-connection jc)
+
(jabber-init-widget-buffer nil)
(widget-insert (jabber-propertize "Import roster\n"
@@ -72,7 +84,7 @@ not affect your actual roster.
(make-local-variable 'jabber-import-subscription-p-widget)
(setq jabber-import-subscription-p-widget
(widget-create 'checkbox))
- (widget-insert "Adjust subscriptions\n")
+ (widget-insert " Adjust subscriptions\n")
(widget-create 'push-button :notify #'jabber-import-doit "Import to roster")
(widget-insert " ")
@@ -112,7 +124,10 @@ not affect your actual roster.
(defun jabber-import-doit (&rest ignore)
"Import roster being edited in widget."
- (let (roster-delta)
+ (let* ((state-data (fsm-get-state-data jabber-buffer-connection))
+ (jabber-roster (plist-get state-data :roster))
+ roster-delta)
+
(dolist (n (widget-value jabber-export-roster-widget))
(let* ((jid (nth 0 n))
(name (and (not (zerop (length (nth 1 n))))
@@ -120,7 +135,7 @@ not affect your actual roster.
(subscription (nth 2 n))
(groups (nth 3 n))
(jid-symbol (jabber-jid-symbol jid))
- (in-roster-p (memq jid-symbol *jabber-roster*))
+ (in-roster-p (memq jid-symbol jabber-roster))
(jid-name (and in-roster-p (get jid-symbol 'name)))
(jid-subscription (and in-roster-p (get jid-symbol 'subscription)))
(jid-groups (and in-roster-p (get jid-symbol 'groups))))
@@ -146,7 +161,8 @@ not affect your actual roster.
(have-from (member jid-subscription '("from" "both"))))
(flet ((request-subscription
(type)
- (jabber-send-sexp `(presence ((to . ,jid)
+ (jabber-send-sexp jabber-buffer-connection
+ `(presence ((to . ,jid)
(type . ,type))))))
(cond
((and want-to (not have-to))
@@ -160,7 +176,8 @@ not affect your actual roster.
((and have-from (not want-from))
(request-subscription "unsubscribed"))))))))
(when roster-delta
- (jabber-send-iq nil "set"
+ (jabber-send-iq jabber-buffer-connection
+ nil "set"
`(query ((xmlns . "jabber:iq:roster")) ,@roster-delta)
#'jabber-report-success "Roster import"
#'jabber-report-success "Roster import"))))
diff --git a/jabber-festival.el b/jabber-festival.el
index 23b0b96..82b80f0 100644
--- a/jabber-festival.el
+++ b/jabber-festival.el
@@ -19,6 +19,8 @@
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
+(eval-when-compile (require 'jabber-alert))
+
(condition-case e
(progn
;; Most people don't have Festival, so this will often fail
diff --git a/jabber-ft-client.el b/jabber-ft-client.el
index 64d26bb..20dbaa6 100644
--- a/jabber-ft-client.el
+++ b/jabber-ft-client.el
@@ -25,9 +25,10 @@
(require 'jabber-ft-common)
-(defun jabber-ft-send (jid filename desc)
+(defun jabber-ft-send (jc jid filename desc)
"Attempt to send FILENAME to JID."
- (interactive (list (jabber-read-jid-completing "Send file to: " nil nil nil 'full)
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Send file to: " nil nil nil 'full)
(read-file-name "Send which file: " nil nil t)
(jabber-read-with-input-method "Description (optional): ")))
(if (zerop (length desc)) (setq desc nil))
@@ -38,7 +39,7 @@
(size (nth 7 attributes))
(date (nth 5 attributes))
(hash (jabber-ft-get-md5 filename)))
- (jabber-si-initiate jid "http://jabber.org/protocol/si/profile/file-transfer"
+ (jabber-si-initiate jc jid "http://jabber.org/protocol/si/profile/file-transfer"
`(file ((xmlns . "http://jabber.org/protocol/si/profile/file-transfer")
(name . ,(file-name-nondirectory filename))
(size . ,size)
@@ -47,7 +48,7 @@
(list (cons 'hash hash))))
(desc () ,desc))
(lexical-let ((filename filename))
- (lambda (jid sid send-data-function)
+ (lambda (jc jid sid send-data-function)
(jabber-ft-do-send
jid sid send-data-function filename))))))
diff --git a/jabber-ft-server.el b/jabber-ft-server.el
index 0a0e72f..cd889d5 100644
--- a/jabber-ft-server.el
+++ b/jabber-ft-server.el
@@ -1,7 +1,7 @@
;; jabber-ft-server.el - handle incoming file transfers, by JEP-0096
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -28,6 +28,9 @@
(defvar jabber-ft-size nil
"Size of the file that is being downloaded")
+(defvar jabber-ft-md5-hash nil
+ "MD5 hash of the file that is being downloaded")
+
(add-to-list 'jabber-advertised-features "http://jabber.org/protocol/si/profile/file-transfer")
(add-to-list 'jabber-si-profiles
@@ -35,7 +38,7 @@
'jabber-ft-accept
'jabber-ft-server-connected))
-(defun jabber-ft-accept (xml-data)
+(defun jabber-ft-accept (jc xml-data)
"Receive IQ stanza containing file transfer request, ask user"
(let* ((from (jabber-xml-get-attribute xml-data 'from))
(query (jabber-iq-query xml-data))
@@ -78,15 +81,17 @@
(if (fboundp 'set-buffer-multibyte)
(set-buffer-multibyte nil))
(set-visited-file-name file-name t)
- (make-local-variable 'jabber-ft-size)
- (setq jabber-ft-size (string-to-number size)))
+ (set (make-local-variable 'jabber-ft-size)
+ (string-to-number size))
+ (set (make-local-variable 'jabber-ft-md5-hash)
+ md5-hash))
(add-to-list 'jabber-ft-sessions
(cons (list si-id from) buffer)))
;; to support range, return something sensible here
nil))
-(defun jabber-ft-server-connected (jid sid send-data-function)
+(defun jabber-ft-server-connected (jc jid sid send-data-function)
;; We don't really care about the send-data-function. But if it's
;; a string, it means that we have no connection.
(if (stringp send-data-function)
@@ -94,7 +99,7 @@
;; On success, we just return our data receiving function.
'jabber-ft-data))
-(defun jabber-ft-data (jid sid data)
+(defun jabber-ft-data (jc jid sid data)
"Receive chunk of transferred file."
(let ((buffer (cdr (assoc (list sid jid) jabber-ft-sessions))))
(with-current-buffer buffer
@@ -107,7 +112,17 @@
(if (and data (< (buffer-size) jabber-ft-size))
t
(basic-save-buffer)
- (message "%s downloaded" (file-name-nondirectory buffer-file-name))
+ (if (and jabber-ft-md5-hash
+ (let ((file-hash (jabber-ft-get-md5 buffer-file-name)))
+ (and file-hash
+ (not (string= file-hash jabber-ft-md5-hash)))))
+ ;; hash mismatch!
+ (progn
+ (message "%s downloaded - CHECKSUM MISMATCH!"
+ (file-name-nondirectory buffer-file-name))
+ (sleep-for 5))
+ ;; all is fine
+ (message "%s downloaded" (file-name-nondirectory buffer-file-name)))
(kill-buffer buffer)
nil))))
diff --git a/jabber-gmail.el b/jabber-gmail.el
new file mode 100644
index 0000000..3a8d299
--- /dev/null
+++ b/jabber-gmail.el
@@ -0,0 +1,98 @@
+;;; jabber-gmail.el --- Gmail notifications via emacs-jabber
+
+;; Copyright (C) 2008 Magnus Henoch <mange@freemail.hu>
+;; Copyright (C) 2007 Valery V. Vorotyntsev <valery.vv@gmail.com>
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License
+;; as published by the Free Software Foundation; either version 2
+;; of the License, or (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Usage:
+
+;; Add the following line to your ~/.emacs:
+;;
+;; (require 'jabber-gmail)
+;;
+;; If you prefer on demand loading
+;; [http://a-nickels-worth.blogspot.com/2007/11/effective-emacs.html]:
+;;
+;; (autoload 'jabber-gmail-query "jabber-gmail")
+;; (autoload 'jabber-gmail-subscribe "jabber-gmail")
+;; (add-hook 'jabber-post-connect-hook 'jabber-gmail-subscribe)
+;;
+;; You may wish to bind a shortcut for `jabber-gmail-query'
+;;
+;; (global-set-key (kbd "<f9> g") 'jabber-gmail-query)
+;;
+;; or to customize `jabber-gmail-dothreads'
+;;
+;; (defun jabber-gmail-dothreads (ts)
+;; (let ((msg (format "%d new messages in gmail inbox" (length ts))))
+;; (message msg)
+;; (jabber-screen-message msg)))
+
+;;;###autoload
+(defun jabber-gmail-subscribe (jc)
+ "Subscribe to gmail notifications.
+See http://code.google.com/apis/talk/jep_extensions/usersettings.html#4"
+ (interactive (list (jabber-read-account)))
+ (jabber-send-iq jc (jabber-connection-bare-jid jc) "set"
+ '(usersetting ((xmlns . "google:setting"))
+ (mailnotifications ((value . "true"))))
+ #'jabber-report-success "Gmail subscription"
+ #'jabber-process-data "Gmail subscription")
+
+ ;; Looks like "one shot" request is still needed to activate
+ ;; notifications machinery.
+ (jabber-gmail-query jc))
+
+(add-to-list 'jabber-iq-set-xmlns-alist
+ (cons "google:mail:notify" #'jabber-gmail-process-new-mail))
+(defun jabber-gmail-process-new-mail (jc xml-sexp)
+ "Process new gmail notification.
+See http://code.google.com/apis/talk/jep_extensions/gmail.html#notifications"
+ (let ((from (jabber-xml-get-attribute xml-sexp 'from))
+ (id (jabber-xml-get-attribute xml-sexp 'id)))
+ ;; respond to server
+ (jabber-send-iq jc from "result" nil
+ nil nil nil nil
+ id))
+
+ (jabber-gmail-query jc))
+
+;;;###autoload
+(defun jabber-gmail-query (jc)
+ "Request mail information from the Google Talk server (a.k.a. one shot query).
+See http://code.google.com/apis/talk/jep_extensions/gmail.html#requestmail"
+ (interactive (list (jabber-read-account)))
+ (jabber-send-iq jc (jabber-connection-bare-jid jc) "get"
+ '(query ((xmlns . "google:mail:notify")))
+ #'jabber-gmail-process-mailbox nil
+ #'jabber-process-data "Gmail query" "gmail-query"))
+
+(defun jabber-gmail-process-mailbox (jc xml-sexp &rest ignore)
+ "Process gmail query response.
+See http://code.google.com/apis/talk/jep_extensions/gmail.html#response"
+ (let ((ts (jabber-xml-node-children
+ (car (jabber-xml-get-children xml-sexp 'mailbox)))))
+ (when ts (jabber-gmail-dothreads ts))))
+
+(defun jabber-gmail-dothreads (threads)
+ "Process <mail-thread-info/> elements.
+THREADS is a list of XML sexps, corresponding to <mail-thread-info/> elements.
+See http://code.google.com/apis/talk/jep_extensions/gmail.html#response"
+ (message "%d new messages in gmail inbox" (length threads)))
+
+(provide 'jabber-gmail)
+;; arch-tag: 102bc8e4-e08f-11dc-ab66-000a95c2fcd0
diff --git a/jabber-history.el b/jabber-history.el
index 78f57f1..8b854bd 100644
--- a/jabber-history.el
+++ b/jabber-history.el
@@ -1,7 +1,7 @@
;; jabber-history.el - recording message history
+;; Copyright (C) 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2004 - Mathias Dahl
-;; Copyright (C) 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -32,6 +32,7 @@
;; enough backlog entries.
(require 'jabber-core)
+(require 'jabber-util)
(defgroup jabber-history nil "Customization options for Emacs
Jabber history files."
@@ -95,7 +96,7 @@ Jabber history files."
(rename-file history-file (concat history-file "-" suffix)))))
(add-to-list 'jabber-message-chain 'jabber-message-history)
-(defun jabber-message-history (xml-data)
+(defun jabber-message-history (jc xml-data)
"Log message to log file."
(when (and (not jabber-use-global-history)
(not (file-directory-p jabber-history-dir)))
@@ -125,7 +126,9 @@ Jabber history files."
loggin strategy is used or the global history filename."
(if jabber-use-global-history
jabber-global-history-filename
- (concat jabber-history-dir "/" (jabber-jid-user contact))))
+ ;; jabber-jid-symbol is the best canonicalization we have.
+ (concat jabber-history-dir
+ "/" (symbol-name (jabber-jid-symbol contact)))))
(defun jabber-history-log-message (direction from to body timestamp)
"Log a message"
@@ -179,7 +182,19 @@ of the log file."
(when (file-readable-p history-file)
(with-temp-buffer
(let ((coding-system-for-read 'utf-8))
- (insert-file-contents history-file))
+ (if jabber-use-global-history
+ (insert-file-contents history-file)
+ (let* ((lines-collected nil)
+ (matched-files (directory-files jabber-history-dir t (file-name-nondirectory history-file)))
+ (matched-files (cons (car matched-files) (sort (cdr matched-files) 'string>-numerical))))
+ (while (not lines-collected)
+ (if (null matched-files)
+ (setq lines-collected t)
+ (let ((file (pop matched-files)))
+ (progn
+ (insert-file-contents file)
+ (if (>= (count-lines (point-min) (point-max)) number)
+ (setq lines-collected t)))))))))
(let (collected current-line)
(goto-char (point-max))
(catch 'beginning-of-file
@@ -231,7 +246,6 @@ Return a list of history entries (vectors), limited by
If BEFORE is non-nil, it should be a float-time after which
no entries will be fetched. `jabber-backlog-days' still
applies, though."
- (interactive)
(jabber-history-query
(and jabber-backlog-days
(- (jabber-float-time) (* jabber-backlog-days 86400.0)))
@@ -241,6 +255,48 @@ applies, though."
(concat "^" (regexp-quote (jabber-jid-user jid)) "\\(/.*\\)?$")
(jabber-history-filename jid)))
+(defun jabber-history-move-to-per-user ()
+ "Migrate global history to per-user files."
+ (interactive)
+ (when (file-directory-p jabber-history-dir)
+ (error "Per-user history directory already exists"))
+ (make-directory jabber-history-dir)
+ (let ((jabber-use-global-history nil))
+ (with-temp-buffer
+ (let ((coding-system-for-read 'utf-8))
+ (insert-file-contents jabber-global-history-filename))
+ (let ((progress-reporter
+ (when (fboundp 'make-progress-reporter)
+ (make-progress-reporter "Migrating history..."
+ (point-min) (point-max))))
+ ;;(file-table (make-hash-table :test 'equal))
+ ;; Keep track of blocks of entries pertaining to the same JID.
+ current-jid jid-start)
+ (while (not (eobp))
+ (let* ((start (point))
+ (end (progn (forward-line) (point)))
+ (line (buffer-substring start end))
+ (parsed (car (read-from-string line)))
+ (jid (if (string= (aref parsed 2) "me")
+ (aref parsed 3)
+ (aref parsed 2))))
+ ;; Whenever there is a change in JID...
+ (when (not (equal jid current-jid))
+ (when current-jid
+ ;; ...save data for previous JID...
+ (let ((history-file (jabber-history-filename current-jid)))
+ (write-region jid-start start history-file t 'quiet)))
+ ;; ...and switch to new JID.
+ (setq current-jid jid)
+ (setq jid-start start))
+ (when (fboundp 'progress-reporter-update)
+ (progress-reporter-update progress-reporter (point)))))
+ ;; Finally, save the last block, if any.
+ (when current-jid
+ (let ((history-file (jabber-history-filename current-jid)))
+ (write-region jid-start (point-max) history-file t 'quiet))))))
+ (message "Done. Please change `jabber-use-global-history' now."))
+
(provide 'jabber-history)
;; arch-tag: 0AA0C235-3FC0-11D9-9FE7-000A95C2FCD0
diff --git a/jabber-iq.el b/jabber-iq.el
index 4992fc9..4ab489b 100644
--- a/jabber-iq.el
+++ b/jabber-iq.el
@@ -1,7 +1,7 @@
;; jabber-iq.el - infoquery functions
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -43,6 +43,18 @@
:group 'jabber
:type 'hook)
+(defgroup jabber-browse nil "browse display options"
+ :group 'jabber)
+
+(defcustom jabber-browse-buffer-format "*-jabber-browse:-%n-*"
+ "The format specification for the name of browse buffers.
+
+These fields are available at this moment:
+
+%n JID to browse"
+ :type 'string
+ :group 'jabber-browse)
+
(defun jabber-browse-mode ()
"\\{jabber-browse-mode-map}"
(kill-all-local-variables)
@@ -57,7 +69,7 @@
(put 'jabber-browse-mode 'mode-class 'special)
(add-to-list 'jabber-iq-chain 'jabber-process-iq)
-(defun jabber-process-iq (xml-data)
+(defun jabber-process-iq (jc xml-data)
"process an incoming iq stanza"
(let* ((id (jabber-xml-get-attribute xml-data 'id))
(type (jabber-xml-get-attribute xml-data 'type))
@@ -71,7 +83,7 @@
(let ((callback-cons (nth (cdr (assoc type '(("result" . 0)
("error" . 1)))) (cdr callback))))
(if (consp callback-cons)
- (funcall (car callback-cons) xml-data (cdr callback-cons))))
+ (funcall (car callback-cons) jc xml-data (cdr callback-cons))))
(setq *jabber-open-info-queries* (delq callback *jabber-open-info-queries*)))
;; if type is "get" or "set", correct action depends on namespace of request.
@@ -85,39 +97,45 @@
(handler (cdr (assoc (jabber-xml-get-attribute query 'xmlns) which-alist))))
(if handler
(condition-case error-var
- (funcall handler xml-data)
+ (funcall handler jc xml-data)
(jabber-error
- (apply 'jabber-send-iq-error from id query (cdr error-var)))
- (error (jabber-send-iq-error from id query "wait" 'internal-server-error (error-message-string error-var))))
- (jabber-send-iq-error from id query "cancel" 'feature-not-implemented)))))))
+ (apply 'jabber-send-iq-error jc from id query (cdr error-var)))
+ (error (jabber-send-iq-error jc from id query "wait" 'internal-server-error (error-message-string error-var))))
+ (jabber-send-iq-error jc from id query "cancel" 'feature-not-implemented)))))))
-(defun jabber-send-iq (to type query success-callback success-closure-data
+(defun jabber-send-iq (jc to type query success-callback success-closure-data
error-callback error-closure-data &optional result-id)
"Send an iq stanza to the specified entity, and optionally set up a callback.
+JC is the Jabber connection.
TO is the addressee.
TYPE is one of \"get\", \"set\", \"result\" or \"error\".
QUERY is a list containing the child of the iq node in the format `jabber-sexp2xml'
accepts.
SUCCESS-CALLBACK is the function to be called when a successful result arrives.
-SUCCESS-CLOSURE-DATA is the second argument to SUCCESS-CALLBACK.
+SUCCESS-CLOSURE-DATA is an extra argument to SUCCESS-CALLBACK.
ERROR-CALLBACK is the function to be called when an error arrives.
-ERROR-CLOSURE-DATA is the second argument to ERROR-CALLBACK.
+ERROR-CLOSURE-DATA is an extra argument to ERROR-CALLBACK.
RESULT-ID is the id to be used for a response to a received iq message.
-`jabber-report-success' and `jabber-process-data' are common callbacks."
+`jabber-report-success' and `jabber-process-data' are common callbacks.
+
+The callback functions are called like this:
+\(funcall CALLBACK JC XML-DATA CLOSURE-DATA)
+with XML-DATA being the IQ stanza received in response. "
(let ((id (or result-id (apply 'format "emacs-iq-%d.%d.%d" (current-time)))))
(if (or success-callback error-callback)
- (setq *jabber-open-info-queries* (cons (list id
+ (setq *jabber-open-info-queries* (cons (list id
(cons success-callback success-closure-data)
(cons error-callback error-closure-data))
*jabber-open-info-queries*)))
- (jabber-send-sexp (list 'iq (append
+ (jabber-send-sexp jc
+ (list 'iq (append
(if to (list (cons 'to to)))
(list (cons 'type type))
(list (cons 'id id)))
query))))
-(defun jabber-send-iq-error (to id original-query error-type condition
+(defun jabber-send-iq-error (jc to id original-query error-type condition
&optional text app-specific)
"Send an error iq stanza to the specified entity in response to a
previously sent iq stanza.
@@ -132,23 +150,26 @@ TEXT is a string to be sent in the error message, or nil for no text.
APP-SPECIFIC is a list of extra XML tags.
See section 9.3 of XMPP Core."
- (jabber-send-sexp `(iq ((to . ,to)
- (type . "error")
- (id . ,id))
- ,original-query
- (error ((type . ,error-type))
- (,condition ((xmlns . "urn:ietf:params:xml:ns:xmpp-stanzas")))
- ,(if text
- `(text ((xmlns . "urn:ietf:params:xml:ns:xmpp-stanzas"))
- ,text))
- ,@app-specific))))
-
-(defun jabber-process-data (xml-data closure-data)
+ (jabber-send-sexp
+ jc
+ `(iq ((to . ,to)
+ (type . "error")
+ (id . ,id))
+ ,original-query
+ (error ((type . ,error-type))
+ (,condition ((xmlns . "urn:ietf:params:xml:ns:xmpp-stanzas")))
+ ,(if text
+ `(text ((xmlns . "urn:ietf:params:xml:ns:xmpp-stanzas"))
+ ,text))
+ ,@app-specific))))
+
+(defun jabber-process-data (jc xml-data closure-data)
"Process random results from various requests."
- (let ((from (or (jabber-xml-get-attribute xml-data 'from) jabber-server))
+ (let ((from (or (jabber-xml-get-attribute xml-data 'from) (plist-get (fsm-get-state-data jc) :server)))
(xmlns (jabber-iq-xmlns xml-data))
(type (jabber-xml-get-attribute xml-data 'type)))
- (with-current-buffer (get-buffer-create (concat "*-jabber-browse-:-" from "-*"))
+ (with-current-buffer (get-buffer-create (format-spec jabber-browse-buffer-format
+ (list (cons ?n from))))
(if (not (eq major-mode 'jabber-browse-mode))
(jabber-browse-mode))
@@ -165,7 +186,7 @@ See section 9.3 of XMPP Core."
;; values (e.g. nil), just dump the XML.
(cond
((functionp closure-data)
- (funcall closure-data xml-data))
+ (funcall closure-data jc xml-data))
((stringp closure-data)
(insert closure-data ": " (jabber-parse-error (jabber-iq-error xml-data)) "\n\n"))
(t
diff --git a/jabber-keepalive.el b/jabber-keepalive.el
index 7c43ecb..7063db1 100644
--- a/jabber-keepalive.el
+++ b/jabber-keepalive.el
@@ -1,5 +1,6 @@
;; jabber-keepalive.el - try to detect lost connection
+;; Copyright (C) 2007 - Detlev Zundel - dzu@gnu.org
;; Copyright (C) 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -42,8 +43,17 @@
(defvar jabber-keepalive-timeout-timer nil
"Timer object for keepalive timeout function")
-(defun jabber-keepalive-start ()
- "Activate keepalive"
+(defvar jabber-keepalive-pending nil
+ "List of outstanding keepalive connections")
+
+(defvar jabber-keepalive-debug nil
+ "Log keepalive traffic when non-nil")
+
+(defun jabber-keepalive-start (&optional jc)
+ "Activate keepalive.
+The JC argument makes it possible to add this function to
+`jabber-post-connect-hooks'; it is ignored. Keepalive is activated
+for all accounts regardless of the argument."
(interactive)
(when jabber-keepalive-timer
@@ -55,7 +65,7 @@
'jabber-keepalive-do))
(add-hook 'jabber-post-disconnect-hook 'jabber-keepalive-stop))
-(defun jabber-keepalive-stop()
+(defun jabber-keepalive-stop ()
"Deactivate keepalive"
(interactive)
@@ -64,31 +74,42 @@
(setq jabber-keepalive-timer nil)))
(defun jabber-keepalive-do ()
- (message "%s: sending keepalive packet" (current-time-string))
+ (when jabber-keepalive-debug
+ (message "%s: sending keepalive packet(s)" (current-time-string)))
(setq jabber-keepalive-timeout-timer
(run-with-timer jabber-keepalive-timeout
nil
'jabber-keepalive-timeout))
-
- ;; Whether we get an error or not is not interesting.
- ;; Getting a response at all is.
- (jabber-send-iq jabber-server "get"
- '(query ((xmlns . "jabber:iq:time")))
- 'jabber-keepalive-got-response nil
- 'jabber-keepalive-got-response nil))
-
-(defun jabber-keepalive-got-response (&rest args)
- (message "%s: got keepalive response" (current-time-string))
- (jabber-cancel-timer jabber-keepalive-timeout-timer)
- (setq jabber-keepalive-timeout-timer nil))
+ (setq jabber-keepalive-pending jabber-connections)
+ (dolist (c jabber-connections)
+ ;; Whether we get an error or not is not interesting.
+ ;; Getting a response at all is.
+ (jabber-send-iq c nil "get"
+ '(query ((xmlns . "jabber:iq:time")))
+ 'jabber-keepalive-got-response nil
+ 'jabber-keepalive-got-response nil)))
+
+(defun jabber-keepalive-got-response (jc &rest args)
+ (when jabber-keepalive-debug
+ (message "%s: got keepalive response from %s"
+ (current-time-string)
+ (plist-get (fsm-get-state-data jc) :server)))
+ (setq jabber-keepalive-pending (remq jc jabber-keepalive-pending))
+ (when (null jabber-keepalive-pending)
+ (jabber-cancel-timer jabber-keepalive-timeout-timer)
+ (setq jabber-keepalive-timeout-timer nil)))
(defun jabber-keepalive-timeout ()
- (message "%s: keepalive timeout, connection considered lost" (current-time-string))
(jabber-cancel-timer jabber-keepalive-timer)
(setq jabber-keepalive-timer nil)
- (run-hooks jabber-lost-connection-hook)
- (jabber-disconnect))
+ (dolist (c jabber-keepalive-pending)
+ (message "%s: keepalive timeout, connection to %s considered lost"
+ (current-time-string)
+ (plist-get (fsm-get-state-data c) :server))
+
+ (run-hooks jabber-lost-connection-hook)
+ (jabber-disconnect-one c nil)))
(provide 'jabber-keepalive)
diff --git a/jabber-keymap.el b/jabber-keymap.el
index 3049b05..6be8833 100644
--- a/jabber-keymap.el
+++ b/jabber-keymap.el
@@ -1,7 +1,7 @@
;; jabber-keymap.el - common keymap for many modes
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -39,12 +39,14 @@
(define-key map [backtab] 'backward-button))
map))
+;;;###autoload
(defvar jabber-global-keymap
(let ((map (make-sparse-keymap)))
- (define-key map "\C-c" 'jabber-connect)
+ (define-key map "\C-c" 'jabber-connect-all)
(define-key map "\C-d" 'jabber-disconnect)
(define-key map "\C-r" 'jabber-switch-to-roster-buffer)
(define-key map "\C-j" 'jabber-chat-with)
+ (define-key map "\C-l" 'jabber-activity-switch-to)
(define-key map "\C-a" 'jabber-send-away-presence)
(define-key map "\C-o" 'jabber-send-default-presence)
(define-key map "\C-x" 'jabber-send-xa-presence)
@@ -52,6 +54,7 @@
map)
"Global Jabber keymap (usually under C-x C-j)")
+;;;###autoload
(define-key ctl-x-map "\C-j" jabber-global-keymap)
(provide 'jabber-keymap)
diff --git a/jabber-logon.el b/jabber-logon.el
index 194de50..62bc6ea 100644
--- a/jabber-logon.el
+++ b/jabber-logon.el
@@ -1,7 +1,7 @@
;; jabber-logon.el - logon functions
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -26,62 +26,55 @@
(require 'sha1)
(error (require 'sha1-el)))
-(defun jabber-get-auth (to)
+(defun jabber-get-auth (jc to session-id)
"Send IQ get request in namespace \"jabber:iq:auth\"."
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
`(query ((xmlns . "jabber:iq:auth"))
- (username () ,jabber-username))
- #'jabber-do-logon nil
+ (username () ,(plist-get (fsm-get-state-data jc) :username)))
+ #'jabber-do-logon session-id
#'jabber-report-success "Impossible error - auth field request"))
-(defun jabber-do-logon (xml-data closure-data)
+(defun jabber-do-logon (jc xml-data session-id)
"send username and password in logon attempt"
- (cond
- ((string= (jabber-xml-get-attribute xml-data 'type) "result")
- (let (auth)
- (if (jabber-xml-get-children (jabber-iq-query xml-data) 'digest)
- ;; SHA1 digest passwords allowed
- (let ((passwd (jabber-read-passwd)))
- (if passwd
- (setq auth `(digest () ,(sha1 (concat jabber-session-id passwd))))))
- ;; Plaintext passwords - allow on encrypted connections
- (if (or *jabber-encrypted*
- (yes-or-no-p "Jabber server only allows cleartext password transmission! Continue? "))
- (let ((passwd (jabber-read-passwd)))
- (if passwd
- (setq auth `(password () ,passwd))))))
-
- ;; If auth is still nil, user cancelled process somewhere
- (if auth
- (jabber-send-iq jabber-server
- "set"
- `(query ((xmlns . "jabber:iq:auth"))
- (username () ,jabber-username)
- ,auth
- (resource () ,jabber-resource))
- #'jabber-process-logon t
- #'jabber-process-logon nil)
- (jabber-disconnect))))
- (t
- (error "Logon error ended up in the wrong place"))))
+ (let* ((digest-allowed (jabber-xml-get-children (jabber-iq-query xml-data) 'digest))
+ (passwd (when
+ (or digest-allowed
+ (plist-get (fsm-get-state-data jc) :encrypted)
+ (yes-or-no-p "Jabber server only allows cleartext password transmission! Continue? "))
+ (or (plist-get (fsm-get-state-data jc) :password)
+ (jabber-read-password (jabber-connection-bare-jid jc)))))
+ auth)
+ (if (null passwd)
+ (fsm-send jc :authentication-failure)
+ (if digest-allowed
+ (setq auth `(digest () ,(sha1 (concat session-id passwd))))
+ (setq auth `(password () ,passwd)))
-(defun jabber-process-logon (xml-data closure-data)
+ ;; For legacy authentication we must specify a resource.
+ (unless (plist-get (fsm-get-state-data jc) :resource)
+ ;; Yes, this is ugly. Where is my encapsulation?
+ (plist-put (fsm-get-state-data jc) :resource "emacs-jabber"))
+
+ (jabber-send-iq jc (plist-get (fsm-get-state-data jc) :server)
+ "set"
+ `(query ((xmlns . "jabber:iq:auth"))
+ (username () ,(plist-get (fsm-get-state-data jc) :username))
+ ,auth
+ (resource () ,(plist-get (fsm-get-state-data jc) :resource)))
+ #'jabber-process-logon passwd
+ #'jabber-process-logon nil))))
+
+(defun jabber-process-logon (jc xml-data closure-data)
"receive login success or failure, and request roster.
-CLOSURE-DATA should be t on success and nil on failure."
+CLOSURE-DATA should be the password on success and nil on failure."
(if closure-data
;; Logon success
- (progn
- (setq *jabber-authenticated* t)
- (jabber-send-iq nil
- "get"
- '(query ((xmlns . "jabber:iq:roster")))
- #'jabber-process-roster 'initial
- #'jabber-report-success "Roster retrieval"))
+ (fsm-send jc (cons :authentication-success closure-data))
;; Logon failure
- (jabber-report-success xml-data "Logon")
- (jabber-disconnect)))
+ (jabber-report-success jc xml-data "Logon")
+ (fsm-send jc :authentication-failure)))
(provide 'jabber-logon)
diff --git a/jabber-modeline.el b/jabber-modeline.el
index 6d41093..13ef38a 100644
--- a/jabber-modeline.el
+++ b/jabber-modeline.el
@@ -40,7 +40,7 @@
(jabber-mode-line-presence-update))
(defun jabber-mode-line-presence-update ()
- (setq jabber-mode-line-presence (if (and *jabber-connected* (not *jabber-disconnecting*))
+ (setq jabber-mode-line-presence (if (and jabber-connections (not *jabber-disconnecting*))
(cdr (assoc *jabber-current-show* jabber-presence-strings))
"Offline")))
@@ -51,9 +51,10 @@
(cons "xa" 0)
(cons "dnd" 0)
(cons nil 0))))
- (dolist (buddy *jabber-roster*)
- (when (assoc (get buddy 'show) count)
- (incf (cdr (assoc (get buddy 'show) count)))))
+ (dolist (jc jabber-connections)
+ (dolist (buddy (plist-get (fsm-get-state-data jc) :roster))
+ (when (assoc (get buddy 'show) count)
+ (incf (cdr (assoc (get buddy 'show) count))))))
(setq jabber-mode-line-contacts
(if jabber-mode-line-compact
(format "(%d/%d/%d)"
diff --git a/jabber-muc-nick-completion.el b/jabber-muc-nick-completion.el
new file mode 100644
index 0000000..70869f4
--- /dev/null
+++ b/jabber-muc-nick-completion.el
@@ -0,0 +1,190 @@
+;;; jabber-muc-nick-completion.el --- Add nick completion abilyty to emacs-jabber
+
+;; Copyright (C) 2008 - Terechkov Evgenii - evg@altlinux.org
+;; Copyright (C) 2007, 2008 - Kirill A. Korinskiy - catap@catap.ru
+;; Copyright (C) 2007 - Serguei Jidkov - jsv@e-mail.ru
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+;;; User customizations here:
+(defcustom jabber-muc-completion-delimiter ": "
+ "String to add to end of completion line."
+ :type 'string
+ :group 'jabber-chat)
+
+(defcustom jabber-muc-looks-personaling-symbols '("," ":" ">")
+ "Symbols for personaling messages"
+ :type '(repeat string)
+ :group 'jabber-chat)
+
+(defcustom jabber-muc-personal-message-bonus (* 60 20)
+ "Bonus for personal message, in seconds."
+ :type 'integer
+ :group 'jabber-chat)
+
+(defcustom jabber-muc-all-string "all"
+ "String meaning all conference members (to insert in completion). Note that \":\" or alike not needed (it appended in other string)"
+ :type 'string
+ :group 'jabber-chat)
+
+;;; History:
+;;
+
+;;; Code:
+
+(require 'cl)
+(require 'jabber-muc)
+(require 'hippie-exp)
+
+(defvar *jabber-muc-participant-last-speaking* nil
+ "Global alist in form (group . ((member . time-of-last-speaking) ...) ...).")
+
+(defun modify-alist (key val alist)
+ "Update of ALIST's element (KEY . VAL), possibly destructive."
+ (let ((entry (assoc key alist)))
+ (if (not entry)
+ (acons key val alist)
+ (setf (cdr entry) val)
+ alist)))
+
+(defun jabber-my-nick (&optional group)
+ "Return my jabber nick in GROUP."
+ (let ((room (or group jabber-group)))
+ (cdr (or (assoc room *jabber-active-groupchats*)
+ (assoc room jabber-muc-default-nicknames)))
+ ))
+
+;;;###autoload
+(defun jabber-muc-looks-like-personal-p (message &optional group)
+ "Return non-nil if jabber MESSAGE is addresed to me.
+Optional argument GROUP to look."
+ (if message (string-match (concat
+ "^"
+ (jabber-my-nick group)
+ (regexp-opt jabber-muc-looks-personaling-symbols))
+ message)
+ nil))
+
+(defun jabber-muc-nicknames ()
+ "List of conference participants, excluding self, or nil if we not in conference."
+ (delete-if '(lambda (nick)
+ (string= nick (jabber-my-nick)))
+ (append (mapcar 'car (cdr (assoc jabber-group jabber-muc-participants))) (list jabber-muc-all-string))))
+
+;; TODO: optimize this function
+(defun jabber-muc-participant-update-activity (group nick time)
+ "Updates NICK's time of last speaking in GROUP to TIME."
+ (let* ((room-activity (cdr (assoc group *jabber-muc-participant-last-speaking*)))
+ (old-time (or (cdr (assoc nick room-activity)) 0)))
+ (when (> time old-time)
+ (setq *jabber-muc-participant-last-speaking*
+ (modify-alist group (modify-alist nick time room-activity)
+ *jabber-muc-participant-last-speaking*)))))
+
+(defun jabber-muc-track-message-time (nick group buffer text proposed-alert)
+ "Tracks time of NICK's last speaking in GROUP."
+ (when nick
+ (let ((time (float-time)))
+ (jabber-muc-participant-update-activity
+ group
+ nick
+ (if (jabber-muc-looks-like-personal-p text group)
+ (+ time jabber-muc-personal-message-bonus)
+ time)))))
+
+(defun jabber-sort-nicks (nicks group)
+ "Return list of NICKS in GROUP, sorted."
+ (let ((times (cdr (assoc group *jabber-muc-participant-last-speaking*))))
+ (flet ((fetch-time (nick) (or (assoc nick times) (cons nick 0)))
+ (cmp (nt1 nt2)
+ (let ((t1 (cdr nt1))
+ (t2 (cdr nt2)))
+ (if (and (zerop t1) (zerop t2))
+ (minusp (compare-strings
+ (car nt1) 0 nil
+ (car nt2) 0 nil
+ t))
+ (> t1 t2)))))
+ (mapcar 'car (sort (mapcar 'fetch-time nicks)
+ 'cmp)))))
+
+(defun jabber-muc-beginning-of-line ()
+ "Return position of line begining."
+ (save-excursion
+ (if (looking-back jabber-muc-completion-delimiter)
+ (backward-char (+ (length jabber-muc-completion-delimiter) 1)))
+ (skip-syntax-backward "^-")
+ (point)))
+
+;;; One big hack:
+(defun jabber-muc-completion-delete-last-tried ()
+ "Delete last tried competion variand from line."
+ (let ((last-tried (car he-tried-table)))
+ (when last-tried
+ (goto-char he-string-beg)
+ (delete-char (length last-tried))
+ (ignore-errors (delete-char (length jabber-muc-completion-delimiter)))
+ )))
+
+(defun try-expand-jabber-muc (old)
+ "Try to expand target nick in MUC according to last speaking time.
+OLD is last tried nickname."
+ (unless jabber-chatting-with
+ (unless old
+ (let ((nicknames (jabber-muc-nicknames)))
+ (he-init-string (jabber-muc-beginning-of-line) (point))
+ (setq he-expand-list (jabber-sort-nicks (all-completions he-search-string (mapcar 'list nicknames)) jabber-group))))
+
+ (setq he-expand-list
+ (delete-if '(lambda (x)
+ (he-string-member x he-tried-table))
+ he-expand-list))
+ (if (null he-expand-list)
+ (progn
+ (when old
+ ;; here and later : its hack to workaround
+ ;; he-substitute-string work which cant substitute empty
+ ;; lines
+ (if (string= he-search-string "")
+ (jabber-muc-completion-delete-last-tried)
+ (he-reset-string)))
+ ())
+ (let ((subst (if (eq (line-beginning-position) (jabber-muc-beginning-of-line))
+ (concat (car he-expand-list) jabber-muc-completion-delimiter)
+ (car he-expand-list))))
+ (if (not (string= he-search-string ""))
+ (he-substitute-string subst)
+ (jabber-muc-completion-delete-last-tried)
+ (progn
+ (insert subst)
+ (if (looking-back (concat "^" (regexp-quote (car he-expand-list))))
+ (unless (looking-back (concat "^" (regexp-quote (car he-expand-list)) jabber-muc-completion-delimiter))
+ (insert jabber-muc-completion-delimiter)))
+ )
+ ))
+ (setq he-tried-table (cons (car he-expand-list) (cdr he-tried-table)))
+ (setq he-expand-list (cdr he-expand-list))
+ t)))
+
+(add-hook 'jabber-muc-hooks 'jabber-muc-track-message-time)
+(fset 'jabber-muc-completion (make-hippie-expand-function '(try-expand-jabber-muc)))
+(define-key jabber-chat-mode-map [?\t] 'jabber-muc-completion)
+
+(provide 'jabber-muc-nick-completion)
+
+;; arch-tag: 2a81ac72-d261-11dc-be91-000a95c2fcd0
+;;; jabber-muc-completion.el ends here
diff --git a/jabber-muc.el b/jabber-muc.el
index 16ccaca..b00b17d 100644
--- a/jabber-muc.el
+++ b/jabber-muc.el
@@ -1,7 +1,7 @@
;; jabber-muc.el - advanced MUC functions
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -56,7 +56,10 @@ Values are lists of nickname strings.")
(string :tag "Nickname"))))
(defcustom jabber-muc-autojoin nil
- "List of MUC rooms to automatically join on connection."
+ "List of MUC rooms to automatically join on connection.
+This list is saved in your Emacs customizations. You can also store
+such a list on the Jabber server, where it is available to every
+client; see `jabber-edit-bookmarks'."
:group 'jabber-chat
:type '(repeat (string :tag "JID of room")))
@@ -124,7 +127,8 @@ These fields are available:
(defcustom jabber-muc-private-header-line-format
'(" " (:eval (jabber-jid-resource jabber-chatting-with))
" in " (:eval (jabber-jid-displayname (jabber-jid-user jabber-chatting-with)))
- "\t" jabber-events-message)
+ "\t" jabber-events-message
+ "\t" jabber-chatstates-message)
"The specification for the header line of private MUC chat buffers.
The format is that of `mode-line-format' and `header-line-format'."
@@ -144,12 +148,14 @@ Either a string or a buffer is returned, so use `get-buffer' or
(cons ?n (jabber-jid-displayname group))
(cons ?j (jabber-jid-user group)))))
-(defun jabber-muc-create-buffer (group)
+(defun jabber-muc-create-buffer (jc group)
"Prepare a buffer for chatroom GROUP.
This function is idempotent."
(with-current-buffer (get-buffer-create (jabber-muc-get-buffer group))
(unless (eq major-mode 'jabber-chat-mode)
- (jabber-chat-mode #'jabber-chat-pp))
+ (jabber-chat-mode jc #'jabber-chat-pp))
+ ;; Make sure the connection variable is up to date.
+ (setq jabber-buffer-connection jc)
(set (make-local-variable 'jabber-group) group)
(make-local-variable 'jabber-muc-topic)
@@ -166,12 +172,12 @@ Either a string or a buffer is returned, so use `get-buffer' or
(cons ?g (jabber-jid-displayname group))
(cons ?n nickname))))
-(defun jabber-muc-private-create-buffer (group nickname)
+(defun jabber-muc-private-create-buffer (jc group nickname)
"Prepare a buffer for chatting with NICKNAME in GROUP.
This function is idempotent."
(with-current-buffer (get-buffer-create (jabber-muc-private-get-buffer group nickname))
(unless (eq major-mode 'jabber-chat-mode)
- (jabber-chat-mode #'jabber-chat-pp))
+ (jabber-chat-mode jc #'jabber-chat-pp))
(set (make-local-variable 'jabber-chatting-with) (concat group "/" nickname))
(setq jabber-send-function 'jabber-chat-send)
@@ -179,11 +185,12 @@ This function is idempotent."
(current-buffer)))
-(defun jabber-muc-send (body)
+(defun jabber-muc-send (jc body)
"Send BODY to MUC room in current buffer."
;; There is no need to display the sent message in the buffer, as
;; we will get it back from the MUC server.
- (jabber-send-sexp `(message
+ (jabber-send-sexp jc
+ `(message
((to . ,jabber-group)
(type . "groupchat"))
(body () ,body))))
@@ -234,6 +241,12 @@ are the corresponding presence fields.
This function is only concerned with presence stanzas resulting
in the user entering/staying in the room."
;; The keys in the plist are affiliation, role and jid.
+ (when (plist-get new-plist 'jid)
+ ;; nickname is only used for displaying, so we can modify it if we
+ ;; want to.
+ (setq nickname (concat nickname " <"
+ (jabber-jid-user (plist-get new-plist 'jid))
+ ">")))
(cond
((null old-plist)
;; User enters the room
@@ -303,6 +316,14 @@ in the user entering/staying in the room."
(let ((participant (assoc nickname (cdr participants))))
(setf (cdr participants) (delq participant (cdr participants)))))))
+(defmacro jabber-muc-argument-list (&optional args)
+ "Prepend connection and group name to ARGS.
+If the current buffer is not an MUC buffer, signal an error.
+This macro is meant for use as an argument to `interactive'."
+ `(if (null jabber-group)
+ (error "Not in MUC buffer")
+ (nconc (list jabber-buffer-connection jabber-group) ,args)))
+
(defun jabber-muc-read-completing (prompt &optional allow-not-joined)
"Read the name of a joined chatroom, or use chatroom of current buffer, if any.
If ALLOW-NOT-JOINED is provided and true, permit choosing any
@@ -325,16 +346,16 @@ JID; only provide completion as a guide."
(add-to-list 'jabber-jid-muc-menu
(cons "Configure groupchat" 'jabber-groupchat-get-config))
-(defun jabber-groupchat-get-config (group)
+(defun jabber-groupchat-get-config (jc group)
"Ask for MUC configuration form"
- (interactive (list (jabber-muc-read-completing "Configure group: " t)))
- (jabber-send-iq group
+ (interactive (jabber-muc-argument-list))
+ (jabber-send-iq jc group
"get"
'(query ((xmlns . "http://jabber.org/protocol/muc#owner")))
#'jabber-process-data #'jabber-groupchat-render-config
#'jabber-process-data "MUC configuration request failed"))
-(defun jabber-groupchat-render-config (xml-data)
+(defun jabber-groupchat-render-config (jc xml-data)
"Render MUC configuration form"
(let ((query (jabber-iq-query xml-data))
@@ -346,6 +367,7 @@ JID; only provide completion as a guide."
(insert "No configuration possible.\n")
(jabber-init-widget-buffer (jabber-xml-get-attribute xml-data 'from))
+ (setq jabber-buffer-connection jc)
(jabber-render-xdata-form xdata)
@@ -360,7 +382,7 @@ JID; only provide completion as a guide."
(defun jabber-groupchat-submit-config (&rest ignore)
"Submit MUC configuration form."
- (jabber-send-iq jabber-submit-to
+ (jabber-send-iq jabber-buffer-connection jabber-submit-to
"set"
`(query ((xmlns . "http://jabber.org/protocol/muc#owner"))
,(jabber-parse-xdata-form))
@@ -370,7 +392,7 @@ JID; only provide completion as a guide."
(defun jabber-groupchat-cancel-config (&rest ignore)
"Cancel MUC configuration form."
- (jabber-send-iq jabber-submit-to
+ (jabber-send-iq jabber-buffer-connection jabber-submit-to
"set"
'(query ((xmlns . "http://jabber.org/protocol/muc#owner"))
(x ((xmlns . "jabber:x:data") (type . "cancel"))))
@@ -379,25 +401,26 @@ JID; only provide completion as a guide."
(add-to-list 'jabber-jid-muc-menu
(cons "Join groupchat" 'jabber-groupchat-join))
-(defun jabber-groupchat-join (group nickname &optional popup)
+(defun jabber-groupchat-join (jc group nickname &optional popup)
"join a groupchat, or change nick.
In interactive calls, or if POPUP is true, switch to the
groupchat buffer."
(interactive
- (let ((group (jabber-read-jid-completing "group: ")))
- (list group (jabber-muc-read-my-nickname group) t)))
+ (let ((account (jabber-read-account))
+ (group (jabber-read-jid-completing "group: ")))
+ (list account group (jabber-muc-read-my-nickname group (plist-get (fsm-get-state-data account) :username)) t)))
;; If the user is already in the room, we don't need as many checks.
(if (or (assoc group *jabber-active-groupchats*)
;; Or if the users asked us not to check disco info.
jabber-muc-disable-disco-check)
- (jabber-groupchat-join-3 group nickname nil popup)
+ (jabber-groupchat-join-3 jc group nickname nil popup)
;; Else, send a disco request to find out what we are connecting
;; to.
- (jabber-disco-get-info group nil #'jabber-groupchat-join-2
+ (jabber-disco-get-info jc group nil #'jabber-groupchat-join-2
(list group nickname popup))))
-(defun jabber-groupchat-join-2 (closure result)
+(defun jabber-groupchat-join-2 (jc closure result)
(destructuring-bind (group nickname popup) closure
(let ( ;; Either success...
(identities (car result))
@@ -429,20 +452,21 @@ groupchat buffer."
(when (member "muc_passwordprotected" features)
(read-passwd (format "Password for %s: " (jabber-jid-displayname group))))))
- (jabber-groupchat-join-3 group nickname password popup)))))
+ (jabber-groupchat-join-3 jc group nickname password popup)))))
-(defun jabber-groupchat-join-3 (group nickname password popup)
+(defun jabber-groupchat-join-3 (jc group nickname password popup)
;; Remember that this is a groupchat _before_ sending the stanza.
;; The response might come quicker than you think.
(puthash (jabber-jid-symbol group) nickname jabber-pending-groupchats)
- (jabber-send-sexp `(presence ((to . ,(format "%s/%s" group nickname)))
+ (jabber-send-sexp jc
+ `(presence ((to . ,(format "%s/%s" group nickname)))
(x ((xmlns . "http://jabber.org/protocol/muc"))
,@(when password
`((password () ,password))))
- ,@(jabber-presence-children)))
+ ,@(jabber-presence-children jc)))
;; There, stanza sent. Now we just wait for the MUC service to
;; mirror the stanza. This is handled in
@@ -452,14 +476,15 @@ groupchat buffer."
;; But if the user interactively asked to join, he/she probably
;; wants the buffer to pop up right now.
(when popup
- (let ((buffer (jabber-muc-create-buffer group)))
+ (let ((buffer (jabber-muc-create-buffer jc group)))
(switch-to-buffer buffer))))
-(defun jabber-muc-read-my-nickname (group)
+(defun jabber-muc-read-my-nickname (group default)
"Read nickname for joining GROUP."
(let ((default-nickname (or
+ ;; XXX: use bookmarks
(cdr (assoc group jabber-muc-default-nicknames))
- jabber-nickname)))
+ default)))
(jabber-read-with-input-method (format "Nickname: (default %s) "
default-nickname)
nil nil default-nickname)))
@@ -472,30 +497,25 @@ groupchat buffer."
(add-to-list 'jabber-jid-muc-menu
(cons "Leave groupchat" 'jabber-groupchat-leave))
-(defun jabber-groupchat-leave (group)
+(defun jabber-groupchat-leave (jc group)
"leave a groupchat"
- (interactive (list (jabber-muc-read-completing "Leave which group: ")))
+ (interactive (jabber-muc-argument-list))
(let ((whichgroup (assoc group *jabber-active-groupchats*)))
;; send unavailable presence to our own nick in room
- (jabber-send-sexp `(presence ((to . ,(format "%s/%s" group (cdr whichgroup)))
+ (jabber-send-sexp jc
+ `(presence ((to . ,(format "%s/%s" group (cdr whichgroup)))
(type . "unavailable"))))))
(add-to-list 'jabber-jid-muc-menu
(cons "List participants" 'jabber-muc-names))
-(defun jabber-muc-names (group)
- "Print names, affiliations, and roles of participants in GROUP."
- (interactive (list (jabber-muc-read-completing "Group: ")))
- (with-current-buffer (jabber-muc-create-buffer group)
- (ewoc-enter-last jabber-chat-ewoc (list :notice
- (jabber-muc-print-names
- (cdr (assoc group jabber-muc-participants)))
- :time (current-time)))
- ;; (let ((jabber-chat-fill-long-lines nil))
-;; (jabber-chat-buffer-display 'jabber-muc-system-prompt nil
-;; '(jabber-muc-print-names)
-;; (cdr (assoc group jabber-muc-participants))))
- ))
+(defun jabber-muc-names ()
+ "Print names, affiliations, and roles of participants in current buffer."
+ (interactive)
+ (ewoc-enter-last jabber-chat-ewoc (list :notice
+ (jabber-muc-print-names
+ (cdr (assoc jabber-group jabber-muc-participants)))
+ :time (current-time))))
(defun jabber-muc-print-names (participants)
"Format and return data in PARTICIPANTS."
@@ -513,13 +533,12 @@ groupchat buffer."
(add-to-list 'jabber-jid-muc-menu
(cons "Set topic" 'jabber-muc-set-topic))
-(defun jabber-muc-set-topic (group topic)
+(defun jabber-muc-set-topic (jc group topic)
"Set topic of GROUP to TOPIC."
(interactive
- (let ((group (jabber-muc-read-completing "Group: ")))
- (list group
- (jabber-read-with-input-method "New topic: " jabber-muc-topic))))
- (jabber-send-message group topic nil "groupchat"))
+ (jabber-muc-argument-list
+ (list (jabber-read-with-input-method "New topic: " jabber-muc-topic))))
+ (jabber-send-message jc group topic nil "groupchat"))
(defun jabber-muc-snarf-topic (xml-data)
"Record subject (topic) of the given <message/>, if any."
@@ -530,16 +549,16 @@ groupchat buffer."
(add-to-list 'jabber-jid-muc-menu
(cons "Set role (kick, voice, op)" 'jabber-muc-set-role))
-(defun jabber-muc-set-role (group nickname role reason)
+(defun jabber-muc-set-role (jc group nickname role reason)
"Set role of NICKNAME in GROUP to ROLE, specifying REASON."
(interactive
- (let* ((group (jabber-muc-read-completing "Group: "))
- (nickname (jabber-muc-read-nickname group "Nickname: ")))
- (list group nickname
- (completing-read "New role: " '(("none") ("visitor") ("participant") ("moderator")) nil t)
- (read-string "Reason: "))))
+ (jabber-muc-argument-list
+ (let ((nickname (jabber-muc-read-nickname jabber-group "Nickname: ")))
+ (list nickname
+ (completing-read "New role: " '(("none") ("visitor") ("participant") ("moderator")) nil t)
+ (read-string "Reason: ")))))
(unless (or (zerop (length nickname)) (zerop (length role)))
- (jabber-send-iq group "set"
+ (jabber-send-iq jc group "set"
`(query ((xmlns . "http://jabber.org/protocol/muc#admin"))
(item ((nick . ,nickname)
(role . ,role))
@@ -551,22 +570,21 @@ groupchat buffer."
(add-to-list 'jabber-jid-muc-menu
(cons "Set affiliation (ban, member, admin)" 'jabber-muc-set-affiliation))
-(defun jabber-muc-set-affiliation (group nickname-or-jid nickname-p affiliation reason)
+(defun jabber-muc-set-affiliation (jc group nickname-or-jid nickname-p affiliation reason)
"Set affiliation of NICKNAME-OR-JID in GROUP to AFFILIATION.
If NICKNAME-P is non-nil, NICKNAME-OR-JID is a nickname in the
group, else it is a JID."
(interactive
- (let ((group (jabber-muc-read-completing "Group: "))
- (nickname-p (y-or-n-p "Specify user by room nickname? ")))
- (list
- group
- (if nickname-p
- (jabber-muc-read-nickname group "Nickname: ")
- (jabber-read-jid-completing "User: "))
- nickname-p
- (completing-read "New affiliation: "
- '(("none") ("outcast") ("member") ("admin") ("owner")) nil t)
- (read-string "Reason: "))))
+ (jabber-muc-argument-list
+ (let ((nickname-p (y-or-n-p "Specify user by room nickname? ")))
+ (list
+ (if nickname-p
+ (jabber-muc-read-nickname jabber-group "Nickname: ")
+ (jabber-read-jid-completing "User: "))
+ nickname-p
+ (completing-read "New affiliation: "
+ '(("none") ("outcast") ("member") ("admin") ("owner")) nil t)
+ (read-string "Reason: ")))))
(let ((jid
(if nickname-p
(let ((participants (cdr (assoc group jabber-muc-participants))))
@@ -578,7 +596,7 @@ group, else it is a JID."
(or (plist-get participant 'jid)
(error "JID of %s in group %s is unknown" nickname-or-jid group))))
nickname-or-jid)))
- (jabber-send-iq group "set"
+ (jabber-send-iq jc group "set"
`(query ((xmlns . "http://jabber.org/protocol/muc#admin"))
(item ((jid . ,jid)
(affiliation . ,affiliation))
@@ -590,13 +608,15 @@ group, else it is a JID."
(add-to-list 'jabber-jid-muc-menu
(cons "Invite someone to chatroom" 'jabber-muc-invite))
-(defun jabber-muc-invite (jid group reason)
+(defun jabber-muc-invite (jc jid group reason)
"Invite JID to GROUP, stating REASON."
(interactive
- (list (jabber-read-jid-completing "Invite whom: ")
+ (list (jabber-read-account)
+ (jabber-read-jid-completing "Invite whom: ")
(jabber-muc-read-completing "To group: ")
(jabber-read-with-input-method "Reason: ")))
(jabber-send-sexp
+ jc
`(message ((to . ,group))
(x ((xmlns . "http://jabber.org/protocol/muc#user"))
(invite ((to . ,jid))
@@ -626,8 +646,8 @@ group, else it is a JID."
(let ((action
`(lambda (&rest ignore) (interactive)
- (jabber-groupchat-join ,group
- (jabber-muc-read-my-nickname ,group)))))
+ (jabber-groupchat-join jabber-buffer-connection ,group
+ (jabber-muc-read-my-nickname ,group ,(plist-get (fsm-get-state-data jabber-buffer-connection) :username))))))
(if (fboundp 'insert-button)
(insert-button "Accept"
'action action)
@@ -646,6 +666,7 @@ group, else it is a JID."
(jabber-read-with-input-method
"Reason: ")))
(jabber-send-sexp
+ jabber-buffer-connection
(list 'message
(list (cons 'to ,group))
(list 'x
@@ -665,13 +686,24 @@ group, else it is a JID."
'face 'highlight))))))))
(return t))))))
-(defun jabber-muc-autojoin ()
- "Join rooms specified in variable `jabber-muc-autojoin'."
- (interactive)
- (dolist (group jabber-muc-autojoin)
- (jabber-groupchat-join group (or
- (cdr (assoc group jabber-muc-default-nicknames))
- jabber-nickname))))
+(defun jabber-muc-autojoin (jc)
+ "Join rooms specified in account bookmarks and global `jabber-muc-autojoin'."
+ (interactive (list (jabber-read-account)))
+ (let ((nickname (plist-get (fsm-get-state-data jc) :username)))
+ (when (bound-and-true-p jabber-muc-autojoin)
+ (dolist (group jabber-muc-autojoin)
+ (jabber-groupchat-join jc group (or
+ (cdr (assoc group jabber-muc-default-nicknames))
+ (plist-get (fsm-get-state-data jc) :username)))))
+ (jabber-get-bookmarks
+ jc
+ (lambda (jc bookmarks)
+ (dolist (bookmark bookmarks)
+ (setq bookmark (jabber-parse-conference-bookmark bookmark))
+ (when (and bookmark (plist-get bookmark :autojoin))
+ (jabber-groupchat-join jc (plist-get bookmark :jid)
+ (or (plist-get bookmark :nick)
+ (plist-get (fsm-get-state-data jc) :username)))))))))
(defun jabber-muc-message-p (message)
"Return non-nil if MESSAGE is a groupchat message.
@@ -704,13 +736,12 @@ include groupchat invites."
(add-to-list 'jabber-jid-muc-menu
(cons "Open private chat" 'jabber-muc-private))
-(defun jabber-muc-private (group nickname)
+(defun jabber-muc-private (jc group nickname)
"Open private chat with NICKNAME in GROUP."
(interactive
- (let* ((group (jabber-muc-read-completing "Group: "))
- (nickname (jabber-muc-read-nickname group "Nickname: ")))
- (list group nickname)))
- (switch-to-buffer (jabber-muc-private-create-buffer group nickname)))
+ (jabber-muc-argument-list
+ (list (jabber-muc-read-nickname jabber-group "Nickname: "))))
+ (switch-to-buffer (jabber-muc-private-create-buffer jabber-buffer-connection group nickname)))
(defun jabber-muc-presence-p (presence)
"Return non-nil if PRESENCE is presence from groupchat."
@@ -734,7 +765,7 @@ Return nil if X-MUC is nil."
(jabber-xml-node-attributes
(car (jabber-xml-get-children x-muc 'item))))))
-(defun jabber-muc-print-prompt (xml-data &optional local)
+(defun jabber-muc-print-prompt (xml-data &optional local dont-print-nick-p)
"Print MUC prompt for message in XML-DATA."
(let ((nick (jabber-jid-resource (jabber-xml-get-attribute xml-data 'from)))
(timestamp (car (delq nil (mapcar 'jabber-x-delay (jabber-xml-get-children xml-data 'x))))))
@@ -747,7 +778,7 @@ Return nil if X-MUC is nil."
jabber-chat-delayed-time-format
jabber-chat-time-format)
timestamp))
- (cons ?n nick)
+ (cons ?n (if dont-print-nick-p "" nick))
(cons ?u nick)
(cons ?r nick)
(cons ?j (concat jabber-group "/" nick))))
@@ -790,7 +821,7 @@ Return nil if X-MUC is nil."
(add-to-list 'jabber-message-chain 'jabber-muc-process-message)
-(defun jabber-muc-process-message (xml-data)
+(defun jabber-muc-process-message (jc xml-data)
"If XML-DATA is a groupchat message, handle it as such."
(when (jabber-muc-message-p xml-data)
(let* ((from (jabber-xml-get-attribute xml-data 'from))
@@ -808,21 +839,27 @@ Return nil if X-MUC is nil."
(printers (append jabber-muc-printers jabber-chat-printers)))
- (with-current-buffer (jabber-muc-create-buffer group)
+ (with-current-buffer (jabber-muc-create-buffer jc group)
(jabber-muc-snarf-topic xml-data)
;; Call alert hooks only when something is output
(when (or error-p
(run-hook-with-args-until-success 'printers xml-data type :printp))
(jabber-maybe-print-rare-time
(ewoc-enter-last jabber-chat-ewoc (list type xml-data :time (current-time))))
-
- (dolist (hook '(jabber-muc-hooks jabber-alert-muc-hooks))
- (run-hook-with-args hook
- nick group (current-buffer) body-text
- (funcall jabber-alert-muc-function
- nick group (current-buffer) body-text))))))))
-
-(defun jabber-muc-process-presence (presence)
+
+ ;; ...except if the message is part of history, in which
+ ;; case we don't want an alert.
+ (let ((children-namespaces (mapcar (lambda (x) (when (listp x) (jabber-xml-get-attribute x 'xmlns)))
+ (jabber-xml-node-children xml-data))))
+ (unless (or (member "urn:xmpp:delay" children-namespaces)
+ (member "jabber:x:delay" children-namespaces))
+ (dolist (hook '(jabber-muc-hooks jabber-alert-muc-hooks))
+ (run-hook-with-args hook
+ nick group (current-buffer) body-text
+ (funcall jabber-alert-muc-function
+ nick group (current-buffer) body-text))))))))))
+
+(defun jabber-muc-process-presence (jc presence)
(let* ((from (jabber-xml-get-attribute presence 'from))
(type (jabber-xml-get-attribute presence 'type))
(x-muc (find-if
@@ -842,8 +879,9 @@ Return nil if X-MUC is nil."
;; handle leaving a room
(cond
((or (string= type "unavailable") (string= type "error"))
- ;; are we leaving?
- (if (string= nickname (gethash (jabber-jid-symbol group) jabber-pending-groupchats))
+ ;; error from room itself? or are we leaving?
+ (if (or (null nickname)
+ (string= nickname (gethash (jabber-jid-symbol group) jabber-pending-groupchats)))
(let ((message (cond
((string= type "error")
(concat "Error entering room"
@@ -874,27 +912,34 @@ Return nil if X-MUC is nil."
:time (current-time)))))
(message "%s: %s" (jabber-jid-displayname group) message))))
;; or someone else?
- (jabber-muc-remove-participant group nickname)
- (with-current-buffer (jabber-muc-create-buffer group)
- (jabber-maybe-print-rare-time
- (ewoc-enter-last
- jabber-chat-ewoc
- (list :muc-notice
- (cond
- ((equal status-code "301")
- (concat nickname " has been banned"
- (when actor (concat " by " actor))
- (when reason (concat " - '" reason "'"))))
- ((equal status-code "307")
- (concat nickname " has been kicked"
- (when actor (concat " by " actor))
- (when reason (concat " - '" reason "'"))))
- ((equal status-code "303")
- (concat nickname " changes nickname to "
- (jabber-xml-get-attribute item 'nick)))
- (t
- (concat nickname " has left the chatroom")))
- :time (current-time)))))))
+ (let* ((plist (jabber-muc-participant-plist group nickname))
+ (jid (plist-get plist 'jid))
+ (name (concat nickname
+ (when jid
+ (concat " <"
+ (jabber-jid-user jid)
+ ">")))))
+ (jabber-muc-remove-participant group nickname)
+ (with-current-buffer (jabber-muc-create-buffer jc group)
+ (jabber-maybe-print-rare-time
+ (ewoc-enter-last
+ jabber-chat-ewoc
+ (list :muc-notice
+ (cond
+ ((equal status-code "301")
+ (concat name " has been banned"
+ (when actor (concat " by " actor))
+ (when reason (concat " - '" reason "'"))))
+ ((equal status-code "307")
+ (concat name " has been kicked"
+ (when actor (concat " by " actor))
+ (when reason (concat " - '" reason "'"))))
+ ((equal status-code "303")
+ (concat name " changes nickname to "
+ (jabber-xml-get-attribute item 'nick)))
+ (t
+ (concat name " has left the chatroom")))
+ :time (current-time))))))))
(t
;; someone is entering
@@ -915,7 +960,7 @@ Return nil if X-MUC is nil."
(let ((report (jabber-muc-report-delta nickname old-plist new-plist
reason actor)))
(when report
- (with-current-buffer (jabber-muc-create-buffer group)
+ (with-current-buffer (jabber-muc-create-buffer jc group)
(jabber-maybe-print-rare-time
(ewoc-enter-last
jabber-chat-ewoc
diff --git a/jabber-newdisco.el b/jabber-newdisco.el
index 8188ff3..32715dd 100644
--- a/jabber-newdisco.el
+++ b/jabber-newdisco.el
@@ -31,10 +31,10 @@
;;; Info
-(defun jabber-disco-get-info (jid node callback closure-data &optional force)
- "Get disco info for JID and NODE.
-Call CALLBACK with CLOSURE-DATA as first argument and result as
-second argument when result is available.
+(defun jabber-disco-get-info (jc jid node callback closure-data &optional force)
+ "Get disco info for JID and NODE, using connection JC.
+Call CALLBACK with JC and CLOSURE-DATA as first and second
+arguments and result as third argument when result is available.
On success, result is (IDENTITIES FEATURES), where each identity is [\"name\"
\"category\" \"type\"], and each feature is a string.
On error, result is the error node, recognizable by (eq (car result) 'error).
@@ -45,18 +45,18 @@ invalidate cache and get fresh data."
(remhash (cons jid node) jabber-disco-info-cache))
(let ((result (gethash (cons jid node) jabber-disco-info-cache)))
(if result
- (and callback (run-with-timer 0.1 nil callback closure-data result))
- (jabber-send-iq jid
+ (and callback (run-with-timer 0.1 nil callback jc closure-data result))
+ (jabber-send-iq jc jid
"get"
`(query ((xmlns . "http://jabber.org/protocol/disco#info")
,(when node `(node . ,node))))
#'jabber-disco-got-info (cons callback closure-data)
- (lambda (xml-data callback-data)
+ (lambda (jc xml-data callback-data)
(when (car callback-data)
- (funcall (car callback-data) (cdr callback-data) (jabber-iq-error xml-data))))
+ (funcall (car callback-data) jc (cdr callback-data) (jabber-iq-error xml-data))))
(cons callback closure-data)))))
-(defun jabber-disco-got-info (xml-data callback-data)
+(defun jabber-disco-got-info (jc xml-data callback-data)
(let ((jid (jabber-xml-get-attribute xml-data 'from))
(node (jabber-xml-get-attribute (jabber-iq-query xml-data)
'node))
@@ -74,7 +74,7 @@ invalidate cache and get fresh data."
(jabber-xml-get-children (jabber-iq-query xml-data) 'feature)))))
(puthash (cons jid node) result jabber-disco-info-cache)
(when (car callback-data)
- (funcall (car callback-data) (cdr callback-data) result))))
+ (funcall (car callback-data) jc (cdr callback-data) result))))
(defun jabber-disco-get-info-immediately (jid node)
"Get cached disco info for JID and NODE.
@@ -85,10 +85,11 @@ Fill the cache with `jabber-disco-get-info'."
;;; Items
-(defun jabber-disco-get-items (jid node callback closure-data &optional force)
- "Get disco items for JID and NODE.
-Call CALLBACK with CLOSURE-DATA as first argument and items
-result as second argument when result is available.
+(defun jabber-disco-get-items (jc jid node callback closure-data &optional force)
+ "Get disco items for JID and NODE, using connection JC.
+Call CALLBACK with JC and CLOSURE-DATA as first and second
+arguments and items result as third argument when result is
+available.
On success, result is a list of items, where each
item is [\"name\" \"jid\" \"node\"] (some values may be nil).
On error, result is the error node, recognizable by (eq (car result) 'error).
@@ -99,18 +100,18 @@ invalidate cache and get fresh data."
(remhash (cons jid node) jabber-disco-items-cache))
(let ((result (gethash (cons jid node) jabber-disco-items-cache)))
(if result
- (and callback (run-with-timer 0.1 nil callback closure-data result))
- (jabber-send-iq jid
+ (and callback (run-with-timer 0.1 nil callback jc closure-data result))
+ (jabber-send-iq jc jid
"get"
`(query ((xmlns . "http://jabber.org/protocol/disco#items")
,(when node `(node . ,node))))
#'jabber-disco-got-items (cons callback closure-data)
- #'(lambda (xml-data callback-data)
- (when (car callback-data)
- (funcall (car callback-data) (cdr callback-data) (jabber-iq-error xml-data))))
+ (lambda (jc xml-data callback-data)
+ (when (car callback-data)
+ (funcall (car callback-data) jc (cdr callback-data) (jabber-iq-error xml-data))))
(cons callback closure-data)))))
-(defun jabber-disco-got-items (xml-data callback-data)
+(defun jabber-disco-got-items (jc xml-data callback-data)
(let ((jid (jabber-xml-get-attribute xml-data 'from))
(node (jabber-xml-get-attribute (jabber-iq-query xml-data)
'node))
@@ -124,16 +125,16 @@ invalidate cache and get fresh data."
(jabber-xml-get-children (jabber-iq-query xml-data) 'item))))
(puthash (cons jid node) result jabber-disco-items-cache)
(when (car callback-data)
- (funcall (car callback-data) (cdr callback-data) result))))
+ (funcall (car callback-data) jc (cdr callback-data) result))))
(defun jabber-disco-get-items-immediately (jid node)
(gethash (cons jid node) jabber-disco-items-cache))
;;; Publish
-(defun jabber-disco-publish (node item-name item-jid item-node)
+(defun jabber-disco-publish (jc node item-name item-jid item-node)
"Publish the given item under disco node NODE."
- (jabber-send-iq nil
+ (jabber-send-iq jc nil
"set"
`(query ((xmlns . "http://jabber.org/protocol/disco#items")
,(when node `(node . ,node)))
@@ -146,9 +147,9 @@ invalidate cache and get fresh data."
'jabber-report-success "Disco publish"
'jabber-report-success "Disco publish"))
-(defun jabber-disco-publish-remove (node item-jid item-node)
+(defun jabber-disco-publish-remove (jc node item-jid item-node)
"Remove the given item from published disco items."
- (jabber-send-iq nil
+ (jabber-send-iq jc nil
"set"
`(query ((xmlns . "http://jabber.org/protocol/disco#items")
,(when node `(node . ,node)))
diff --git a/jabber-osd.el b/jabber-osd.el
new file mode 100644
index 0000000..ce0b0e2
--- /dev/null
+++ b/jabber-osd.el
@@ -0,0 +1,35 @@
+;;; jabber-osd.el --- OSD support for jabber.el
+
+;; Copyright (C) 2008 - Terechkov Evgenii - evg@altlinux.org
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+(eval-when-compile (require 'jabber-alert))
+
+(condition-case e
+ (progn
+ ;; Most people don't have osd.el, so this will often fail
+ (require 'osd)
+ (define-jabber-alert osd "Display a message in osd" 'osd-show-string)
+ (define-personal-jabber-alert jabber-muc-osd)
+ )
+ (error nil))
+
+(provide 'jabber-osd)
+
+;; arch-tag: 3eb8d55a-dd86-11dc-b2c6-000a95c2fcd0
diff --git a/jabber-pkg.el.in b/jabber-pkg.el.in
new file mode 100644
index 0000000..f255fc4
--- /dev/null
+++ b/jabber-pkg.el.in
@@ -0,0 +1,4 @@
+;; For ELPA: http://tromey.com/elpa/
+(define-package "jabber" "@PACKAGE_VERSION@" "A Jabber client for Emacs.")
+
+;; arch-tag: fa652136-12f7-11dd-b4c4-000a95c2fcd0
diff --git a/jabber-presence.el b/jabber-presence.el
index 5b77610..8a45523 100644
--- a/jabber-presence.el
+++ b/jabber-presence.el
@@ -1,7 +1,7 @@
;; jabber-presence.el - roster and presence bookkeeping
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -26,85 +26,99 @@
(require 'jabber-menu)
(require 'jabber-muc)
+(require 'assoc)
+
(defvar jabber-presence-element-functions nil
"List of functions returning extra elements for <presence/> stanzas.
-Each function takes no arguments and returns a possibly empty list of
-extra child element of the <presence/> stanza.")
+Each function takes one argument, the connection, and returns a
+possibly empty list of extra child element of the <presence/>
+stanza.")
(add-to-list 'jabber-iq-set-xmlns-alist
- (cons "jabber:iq:roster" (function (lambda (x) (jabber-process-roster x nil)))))
-(defun jabber-process-roster (xml-data closure-data)
+ (cons "jabber:iq:roster" (function (lambda (jc x) (jabber-process-roster jc x nil)))))
+(defun jabber-process-roster (jc xml-data closure-data)
"process an incoming roster infoquery result
CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
-
- ;; Perform sanity check on "from" attribute: it should be either absent
- ;; or match our own JID.
- (let ((from (jabber-xml-get-attribute xml-data 'from))
+ (let ((roster (plist-get (fsm-get-state-data jc) :roster))
+ (from (jabber-xml-get-attribute xml-data 'from))
(type (jabber-xml-get-attribute xml-data 'type))
- (id (jabber-xml-get-attribute xml-data 'id)))
+ (id (jabber-xml-get-attribute xml-data 'id))
+ (username (plist-get (fsm-get-state-data jc) :username))
+ (server (plist-get (fsm-get-state-data jc) :server))
+ (resource (plist-get (fsm-get-state-data jc) :resource))
+ new-items changed-items deleted-items)
+ ;; Perform sanity check on "from" attribute: it should be either absent
+ ;; or match our own JID.
(if (not (or (null from)
- (string= from (concat jabber-username "@" jabber-server))
- (string= from (concat jabber-username "@" jabber-server "/" jabber-resource))))
- (message "Roster push with invalid \"from\": \"%s\"" from)
-
- ;; If *jabber-roster* is empty, we just fill up the roster with
- ;; the given data. If not, we have received a partial roster
- ;; update, so just fill in that data. These cases can be
- ;; differentiated by the type attribute of the iq tag: if
- ;; type='result', we asked for the whole roster. If type='set',
- ;; we are getting a "roster push".
+ (string= from (concat username "@" server))
+ (string= from (concat username "@" server "/" resource))))
+ (message "Roster push with invalid \"from\": \"%s\" (expected \"%s@%s\" or \"%s@%s/%s\")"
+ from
+ username server username server resource)
+
(dolist (item (jabber-xml-get-children (car (jabber-xml-get-children xml-data 'query)) 'item))
(let (roster-item
(jid (jabber-jid-symbol (jabber-xml-get-attribute item 'jid))))
- ;; Find contact if already in roster
- (setq roster-item (car (memq jid *jabber-roster*)))
-
- ;; If not found, create a new roster item.
- (when (null roster-item)
- (message "%s added to roster" jid)
- (setq roster-item jid)
- (setq *jabber-roster* (cons roster-item *jabber-roster*)))
-
- ;; Now, get all data associated with the contact.
- (put roster-item 'name (jabber-xml-get-attribute item 'name))
- (put roster-item 'subscription (jabber-xml-get-attribute item 'subscription))
- (put roster-item 'ask (jabber-xml-get-attribute item 'ask))
-
- ;; Since roster items can't be changed incrementally, we
- ;; save the original XML to be able to modify it, instead of
- ;; having to reproduce it. This is for forwards
- ;; compatibility.
- (put roster-item 'xml item)
-
- ;; xml-parse-tag will put "" as the only child element of an
- ;; empty element, (e.g. <item jid="foo@bar"/> as opposed to
- ;; <item jid="foo@bar"><group>baz</group></item>) which
- ;; xml-get-children subsequently will choke on. We want to
- ;; avoid that with an extra check.
- (put roster-item 'groups (mapcar #'(lambda (foo) (nth 2 foo)) (jabber-xml-get-children item 'group)))
-
;; If subscripton="remove", contact is to be removed from roster
- (when (string= (get roster-item 'subscription) "remove")
- (message "%s removed from roster" jid)
- (setq *jabber-roster* (delq roster-item *jabber-roster*)))
-
- )))
- (jabber-display-roster)
+ (if (string= (jabber-xml-get-attribute item 'subscription) "remove")
+ (progn
+ (message "%s removed from roster" jid)
+ (push jid deleted-items))
+
+ ;; Find contact if already in roster
+ (setq roster-item (car (memq jid roster)))
+
+ (if roster-item
+ (push roster-item changed-items)
+ ;; If not found, create a new roster item.
+ (message "%s added to roster" jid)
+ (setq roster-item jid)
+ (push roster-item new-items))
+
+ ;; If this is an initial push, we want to forget
+ ;; everything we knew about this contact before - e.g. if
+ ;; the contact was online when we disconnected and offline
+ ;; when we reconnect, we don't want to see stale presence
+ ;; information. This assumes that no contacts are shared
+ ;; between accounts.
+ (when (eq closure-data 'initial)
+ (setplist roster-item nil))
+
+ ;; Now, get all data associated with the contact.
+ (put roster-item 'name (jabber-xml-get-attribute item 'name))
+ (put roster-item 'subscription (jabber-xml-get-attribute item 'subscription))
+ (put roster-item 'ask (jabber-xml-get-attribute item 'ask))
+
+ ;; Since roster items can't be changed incrementally, we
+ ;; save the original XML to be able to modify it, instead of
+ ;; having to reproduce it. This is for forwards
+ ;; compatibility.
+ (put roster-item 'xml item)
+
+ (put roster-item 'groups
+ (mapcar (lambda (foo) (nth 2 foo))
+ (jabber-xml-get-children item 'group)))))))
+ ;; This is the function that does the actual updating and
+ ;; redrawing of the roster.
+ (jabber-roster-update jc new-items changed-items deleted-items)
+
(if (and id (string= type "set"))
- (jabber-send-iq jabber-server "result" nil
+ (jabber-send-iq jc nil "result" nil
nil nil nil nil id)))
- ;; After initial roster push, run jabber-post-connect-hook. We do
+ ;; After initial roster push, run jabber-post-connect-hooks. We do
;; it here and not before since we want to have the entire roster
;; before we receive any presence stanzas.
(when (eq closure-data 'initial)
- (run-hooks 'jabber-post-connect-hook)))
+ (run-hook-with-args 'jabber-post-connect-hooks jc)))
(add-to-list 'jabber-presence-chain 'jabber-process-presence)
-(defun jabber-process-presence (xml-data)
+(defun jabber-process-presence (jc xml-data)
"process incoming presence tags"
- (let ((from (jabber-xml-get-attribute xml-data 'from))
+ ;; XXX: use JC argument
+ (let ((roster (plist-get (fsm-get-state-data jc) :roster))
+ (from (jabber-xml-get-attribute xml-data 'from))
(to (jabber-xml-get-attribute xml-data 'to))
(type (jabber-xml-get-attribute xml-data 'type))
(presence-show (car (jabber-xml-node-children
@@ -116,21 +130,35 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
"0"))))
(cond
((string= type "subscribe")
- (run-with-idle-timer 0.01 nil #'jabber-process-subscription-request from presence-status))
+ (run-with-idle-timer 0.01 nil #'jabber-process-subscription-request jc from presence-status))
((jabber-muc-presence-p xml-data)
- (jabber-muc-process-presence xml-data))
+ (jabber-muc-process-presence jc xml-data))
(t
;; XXX: Think about what to do about out-of-roster presences.
(let ((buddy (jabber-jid-symbol from)))
- (if (memq buddy *jabber-roster*)
+ (if (memq buddy roster)
(let* ((oldstatus (get buddy 'show))
(resource (or (jabber-jid-resource from) ""))
(resource-plist (cdr (assoc resource
(get buddy 'resources))))
newstatus)
(cond
+ ((and (string= resource "") (member type '("unavailable" "error")))
+ ;; 'unavailable' or 'error' from bare JID means that all resources
+ ;; are offline.
+ (setq resource-plist nil)
+ (setq newstatus (if (string= type "error") "error" nil))
+ (let ((new-message (if error
+ (jabber-parse-error error)
+ presence-status)))
+ ;; erase any previous information
+ (put buddy 'resources nil)
+ (put buddy 'connected nil)
+ (put buddy 'show newstatus)
+ (put buddy 'status new-message)))
+
((string= type "unavailable")
(setq resource-plist
(plist-put resource-plist 'connected nil))
@@ -170,11 +198,14 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
(plist-put resource-plist 'priority priority))
(setq newstatus (or presence-show ""))))
- ;; this is for `assoc-set!' in guile
- (if (assoc resource (get buddy 'resources))
- (setcdr (assoc resource (get buddy 'resources)) resource-plist)
- (put buddy 'resources (cons (cons resource resource-plist) (get buddy 'resources))))
- (jabber-prioritize-resources buddy)
+ (when resource-plist
+ ;; this is for `assoc-set!' in guile
+ (if (assoc resource (get buddy 'resources))
+ (setcdr (assoc resource (get buddy 'resources)) resource-plist)
+ (put buddy 'resources (cons (cons resource resource-plist) (get buddy 'resources))))
+ (jabber-prioritize-resources buddy))
+
+ (fsm-send jc (cons :roster-update buddy))
(dolist (hook '(jabber-presence-hooks jabber-alert-presence-hooks))
(run-hook-with-args hook
@@ -188,23 +219,30 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
newstatus
(plist-get resource-plist 'status)))))))))))
-(defun jabber-process-subscription-request (from presence-status)
+(defun jabber-process-subscription-request (jc from presence-status)
"process an incoming subscription request"
- (dolist (hook '(jabber-presence-hooks jabber-alert-presence-hooks))
- (run-hook-with-args hook (jabber-jid-symbol from) nil "subscribe" presence-status (funcall jabber-alert-presence-message-function (jabber-jid-symbol from) nil "subscribe" presence-status)))
- (jabber-send-sexp
- (list 'presence
- (list (cons 'to from)
- (cons 'type
- (if (yes-or-no-p (format "the user - %s - has requested to subscribe to your presence (%s). allow? "
- (jabber-jid-displayname from)
- presence-status))
- "subscribed"
- "unsubscribed")))))
- (when (yes-or-no-p (format "Do you want to subscribe to %s's presence? " from))
- (jabber-send-sexp
- (list 'presence (list (cons 'to from)
- (cons 'type "subscribe"))))))
+ (with-current-buffer (jabber-chat-create-buffer jc from)
+ (ewoc-enter-last jabber-chat-ewoc (list :subscription-request presence-status :time (current-time)))
+
+ (dolist (hook '(jabber-presence-hooks jabber-alert-presence-hooks))
+ (run-hook-with-args hook (jabber-jid-symbol from) nil "subscribe" presence-status (funcall jabber-alert-presence-message-function (jabber-jid-symbol from) nil "subscribe" presence-status)))))
+
+(defun jabber-subscription-accept-mutual (&rest ignored)
+ (message "Subscription accepted; reciprocal subscription request sent")
+ (jabber-subscription-reply "subscribed" "subscribe"))
+
+(defun jabber-subscription-accept-one-way (&rest ignored)
+ (message "Subscription accepted")
+ (jabber-subscription-reply "subscribed"))
+
+(defun jabber-subscription-decline (&rest ignored)
+ (message "Subscription declined")
+ (jabber-subscription-reply "unsubscribed"))
+
+(defun jabber-subscription-reply (&rest types)
+ (let ((to (jabber-jid-user jabber-chatting-with)))
+ (dolist (type types)
+ (jabber-send-sexp jabber-buffer-connection `(presence ((to . ,to) (type . ,type)))))))
(defun jabber-prioritize-resources (buddy)
"Set connected, show and status properties for BUDDY from highest-priority resource."
@@ -248,7 +286,7 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
count))
(defun jabber-send-presence (show status priority)
- "send a presence tag to the server"
+ "Set presence for all accounts."
(interactive (list (completing-read "show:"
'(("" . nil)
("away" . nil)
@@ -267,27 +305,58 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
(setq *jabber-current-status* status)
(setq *jabber-current-show* show)
(setq *jabber-current-priority* (string-to-number priority))
- (let ((subelements (jabber-presence-children)))
- ;; First send presence to everyone subscribed
- (jabber-send-sexp `(presence () ,@subelements))
- ;; Then send to every joined MUC room
+ (let (subelements-map)
+ ;; For each connection, we use a different set of subelements. We
+ ;; cache them, to only generate them once.
+
+ ;; Ordinary presence, with no specified recipient
+ (dolist (jc jabber-connections)
+ (let ((subelements (jabber-presence-children jc)))
+ (aput 'subelements-map jc subelements)
+ (jabber-send-sexp-if-connected jc `(presence () ,@subelements))))
+ ;; Then send presence to groupchats
(dolist (groupchat *jabber-active-groupchats*)
- (jabber-send-sexp `(presence ((to . ,(car groupchat))) ,@subelements))))
+ (let* ((buffer (get-buffer (jabber-muc-get-buffer (car groupchat))))
+ (jc (when buffer
+ (buffer-local-value 'jabber-buffer-connection buffer)))
+ (subelements (cdr (assq jc subelements-map))))
+ (when jc
+ (jabber-send-sexp-if-connected jc `(presence ((to . ,(car groupchat))) ,@subelements))))))
(jabber-display-roster))
-(defun jabber-presence-children ()
+(defun jabber-presence-children (jc)
"Return the children for a <presence/> stanza."
`(,(when (> (length *jabber-current-status*) 0)
`(status () ,*jabber-current-status*))
,(when (> (length *jabber-current-show*) 0)
`(show () ,*jabber-current-show*))
(priority () ,(number-to-string *jabber-current-priority*))
- ,@(apply 'append (mapcar 'funcall jabber-presence-element-functions))))
-
-(defun jabber-send-directed-presence (jid type)
- "Send a directed presence stanza to JID."
+ ,@(apply 'append (mapcar (lambda (f)
+ (funcall f jc))
+ jabber-presence-element-functions))))
+
+(defun jabber-send-directed-presence (jc jid type)
+ "Send a directed presence stanza to JID.
+TYPE is one of:
+\"online\", \"away\", \"xa\", \"dnd\", \"chatty\":
+ Appear as present with the given status.
+\"unavailable\":
+ Appear as offline.
+\"probe\":
+ Ask the contact's server for updated presence.
+\"subscribe\":
+ Ask for subscription to contact's presence.
+ (see also `jabber-send-subscription-request')
+\"unsubscribe\":
+ Cancel your subscription to contact's presence.
+\"subscribed\":
+ Accept contact's request for presence subscription.
+ (this is usually done within a chat buffer)
+\"unsubscribed\":
+ Cancel contact's subscription to your presence."
(interactive
- (list (jabber-read-jid-completing "Send directed presence to: ")
+ (list (jabber-read-account)
+ (jabber-read-jid-completing "Send directed presence to: ")
(completing-read "Type (default is online): "
'(("online")
("away")
@@ -295,12 +364,18 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
("dnd")
("chatty")
("probe")
- ("unavailable"))
+ ("unavailable")
+ ("subscribe")
+ ("unsubscribe")
+ ("subscribed")
+ ("unsubscribed"))
nil t nil nil "online")))
(cond
- ((member type '("probe" "unavailable"))
- (jabber-send-sexp `(presence ((to . ,jid)
- (type . ,type)))))
+ ((member type '("probe" "unavailable"
+ "subscribe" "unsubscribe"
+ "subscribed" "unsubscribed"))
+ (jabber-send-sexp jc `(presence ((to . ,jid)
+ (type . ,type)))))
(t
(let ((*jabber-current-show*
@@ -308,8 +383,8 @@ CLOSURE-DATA should be 'initial if initial roster push, nil otherwise."
""
type))
(*jabber-current-status* nil))
- (jabber-send-sexp `(presence ((to . ,jid))
- ,@(jabber-presence-children)))))))
+ (jabber-send-sexp jc `(presence ((to . ,jid))
+ ,@(jabber-presence-children jc)))))))
(defun jabber-send-away-presence (&optional status)
"Set status to away.
@@ -327,20 +402,35 @@ With prefix argument, ask for status message."
(jabber-read-with-input-method "status message: " *jabber-current-status* '*jabber-status-history*))))
(jabber-send-presence "xa" status *jabber-current-priority*))
-(defun jabber-send-default-presence ()
+(defun jabber-send-default-presence (&optional jc)
"Send default presence.
Default presence is specified by `jabber-default-priority', `jabber-default-show',
and `jabber-default-status'."
(interactive)
+ ;; jc is ignored. It's only there so this function can be in
+ ;; jabber-post-connect-hooks.
(jabber-send-presence jabber-default-show jabber-default-status jabber-default-priority))
+(defun jabber-send-current-presence (&optional jc)
+ "(Re-)send current presence.
+That is, if presence has already been sent, use current settings,
+else send defaults (see `jabber-send-default-presence')."
+ (interactive)
+ ;; jc is ignored. It's only there so this function can be in
+ ;; jabber-post-connect-hooks.
+ (if *jabber-current-show*
+ (jabber-send-presence *jabber-current-show* *jabber-current-status* *jabber-current-priority*)
+ (jabber-send-default-presence)))
+
(add-to-list 'jabber-jid-roster-menu
(cons "Send subscription request" 'jabber-send-subscription-request))
-(defun jabber-send-subscription-request (to &optional request)
+(defun jabber-send-subscription-request (jc to &optional request)
"send a subscription request to jid, showing him your request text, if specified"
- (interactive (list (jabber-read-jid-completing "to: ")
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "to: ")
(jabber-read-with-input-method "request: ")))
- (jabber-send-sexp `(presence
+ (jabber-send-sexp jc
+ `(presence
((to . ,to)
(type . "subscribe"))
,@(when (and request (> (length request) 0))
@@ -348,17 +438,19 @@ and `jabber-default-status'."
(add-to-list 'jabber-jid-roster-menu
(cons "Add/modify roster entry" 'jabber-roster-change))
-(defun jabber-roster-change (jid name groups)
+(defun jabber-roster-change (jc jid name groups)
"Add or change a roster item."
(interactive (let* ((jid (jabber-jid-symbol
(jabber-read-jid-completing "Add/change JID: ")))
(name (get jid 'name))
(groups (get jid 'groups)))
- (list jid (jabber-read-with-input-method (format "Name: (default `%s') " name) nil nil name)
+ (list (jabber-read-account)
+ jid (jabber-read-with-input-method (format "Name: (default `%s') " name) nil nil name)
(car (read-from-string (jabber-read-with-input-method (format "Groups: (default `%S') " groups) nil nil (format "%S" groups)))))))
;; If new fields are added to the roster XML structure in a future standard,
;; they will be clobbered by this function.
- (jabber-send-iq nil "set"
+ ;; XXX: specify account
+ (jabber-send-iq jc nil "set"
(list 'query (list (cons 'xmlns "jabber:iq:roster"))
(list 'item (append
(list (cons 'jid (symbol-name jid)))
@@ -371,9 +463,10 @@ and `jabber-default-status'."
(add-to-list 'jabber-jid-roster-menu
(cons "Delete roster entry" 'jabber-roster-delete))
-(defun jabber-roster-delete (jid)
- (interactive (list (jabber-read-jid-completing "Delete from roster: ")))
- (jabber-send-iq nil "set"
+(defun jabber-roster-delete (jc jid)
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Delete from roster: ")))
+ (jabber-send-iq jc nil "set"
`(query ((xmlns . "jabber:iq:roster"))
(item ((jid . ,jid)
(subscription . "remove"))))
@@ -385,10 +478,11 @@ and `jabber-default-status'."
Signal an error if there is no JID at point."
(interactive)
(let ((jid-at-point (get-text-property (point)
- 'jabber-jid)))
- (if (and jid-at-point
+ 'jabber-jid))
+ (account (get-text-property (point) 'jabber-account)))
+ (if (and jid-at-point account
(yes-or-no-p (format "Really delete %s from roster? " jid-at-point)))
- (jabber-roster-delete jid-at-point)
+ (jabber-roster-delete account jid-at-point)
(error "No contact at point"))))
(provide 'jabber-presence)
diff --git a/jabber-private.el b/jabber-private.el
index cade7f4..d748f0f 100644
--- a/jabber-private.el
+++ b/jabber-private.el
@@ -19,32 +19,38 @@
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
-(defun jabber-private-get (node-name namespace success-callback error-callback)
+;;;###autoload
+(defun jabber-private-get (jc node-name namespace success-callback error-callback)
"Retrieve an item from private XML storage.
The item to retrieve is identified by NODE-NAME (a symbol) and
NAMESPACE (a string).
-On success, SUCCESS-CALLBACK is called with the retrieved XML fragment.
-On error, ERROR-CALLBACK is called with the entire IQ result."
- (jabber-send-iq nil "get"
+
+On success, SUCCESS-CALLBACK is called with JC and the retrieved
+XML fragment.
+
+On error, ERROR-CALLBACK is called with JC and the entire IQ
+result."
+ (jabber-send-iq jc nil "get"
`(query ((xmlns . "jabber:iq:private"))
(,node-name ((xmlns . ,namespace))))
#'jabber-private-get-1 success-callback
- #'(lambda (xml-data error-callback)
- (funcall error-callback xml-data))
+ #'(lambda (jc xml-data error-callback)
+ (funcall error-callback jc xml-data))
error-callback))
-(defun jabber-private-get-1 (xml-data success-callback)
- (funcall success-callback
+(defun jabber-private-get-1 (jc xml-data success-callback)
+ (funcall success-callback jc
(car (jabber-xml-node-children
(jabber-iq-query xml-data)))))
-(defun jabber-private-set (fragment &optional
- success-callback success-closure-data
- error-callback error-closure-data)
+;;;###autoload
+(defun jabber-private-set (jc fragment &optional
+ success-callback success-closure-data
+ error-callback error-closure-data)
"Store FRAGMENT in private XML storage.
SUCCESS-CALLBACK, SUCCESS-CLOSURE-DATA, ERROR-CALLBACK and
ERROR-CLOSURE-DATA are used as in `jabber-send-iq'."
- (jabber-send-iq nil "set"
+ (jabber-send-iq jc nil "set"
`(query ((xmlns . "jabber:iq:private"))
,fragment)
success-callback success-closure-data
diff --git a/jabber-ratpoison.el b/jabber-ratpoison.el
index 141f290..910ca0c 100644
--- a/jabber-ratpoison.el
+++ b/jabber-ratpoison.el
@@ -18,6 +18,8 @@
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+(eval-when-compile (require 'jabber-alert))
+
(defun jabber-ratpoison-message (msg)
"Show MSG in Ratpoison"
;; Possible errors include not finding the ratpoison binary, and
diff --git a/jabber-register.el b/jabber-register.el
index 85aca60..7415f1a 100644
--- a/jabber-register.el
+++ b/jabber-register.el
@@ -1,7 +1,7 @@
;; jabber-register.el - registration according to JEP-0077
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -24,16 +24,17 @@
(add-to-list 'jabber-jid-service-menu
(cons "Register with service" 'jabber-get-register))
-(defun jabber-get-register (to)
+(defun jabber-get-register (jc to)
"Send IQ get request in namespace \"jabber:iq:register\"."
- (interactive (list (jabber-read-jid-completing "Register with: ")))
- (jabber-send-iq to
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Register with: ")))
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:register")))
#'jabber-process-data #'jabber-process-register-or-search
#'jabber-report-success "Registration"))
-(defun jabber-process-register-or-search (xml-data)
+(defun jabber-process-register-or-search (jc xml-data)
"Display results from jabber:iq:{register,search} query as a form."
(let ((query (jabber-iq-query xml-data))
@@ -44,39 +45,42 @@
((string= (jabber-iq-xmlns xml-data) "jabber:iq:search")
'search)
(t
- (error "Namespace %s not handled by jabber-process-register-or-search" (jabber-iq-xmlns xml-data))))))
+ (error "Namespace %s not handled by jabber-process-register-or-search" (jabber-iq-xmlns xml-data)))))
+ (register-account
+ (plist-get (fsm-get-state-data jc) :registerp))
+ (username
+ (plist-get (fsm-get-state-data jc) :username))
+ (server
+ (plist-get (fsm-get-state-data jc) :server)))
(cond
((eq type 'register)
;; If there is no `from' attribute, we are registering with the server
- (jabber-init-widget-buffer (or (jabber-xml-get-attribute xml-data 'from) jabber-server)))
+ (jabber-init-widget-buffer (or (jabber-xml-get-attribute xml-data 'from)
+ server)))
((eq type 'search)
;; no such thing here
(jabber-init-widget-buffer (jabber-xml-get-attribute xml-data 'from))))
- (widget-insert (if (eq type 'register) "Register with " "Search ") jabber-submit-to "\n\n")
- (when (and (eq type 'register)
- jabber-register-p)
- (widget-insert "Don't change the username here unless you also change ")
- (widget-create 'link
- :notify (lambda (&rest ignore)
- (customize-variable 'jabber-username))
- "jabber-username")
- (widget-insert ".\n\n"))
+ (setq jabber-buffer-connection jc)
+ (widget-insert (if (eq type 'register) "Register with " "Search ") jabber-submit-to "\n\n")
+
(dolist (x (jabber-xml-get-children query 'x))
(when (string= (jabber-xml-get-attribute x 'xmlns) "jabber:x:data")
(setq have-xdata t)
;; If the registration form obeys JEP-0068, we know
;; for sure how to put a default username in it.
(jabber-render-xdata-form x
- (if (and jabber-register-p
+ (if (and register-account
(string= (jabber-xdata-formtype x) "jabber:iq:register"))
- (list (cons "username" jabber-username))
+ (list (cons "username" username))
nil))))
(if (not have-xdata)
- (jabber-render-register-form query))
+ (jabber-render-register-form query
+ (when register-account
+ username)))
(widget-create 'push-button :notify (if (eq type 'register)
#'jabber-submit-register
@@ -91,11 +95,12 @@
(defun jabber-submit-register (&rest ignore)
"Submit registration input. See `jabber-process-register-or-search'."
- (let ((handler (if jabber-register-p
- #'jabber-process-register-secondtime
- #'jabber-report-success))
- (text (concat "Registration with " jabber-submit-to)))
- (jabber-send-iq jabber-submit-to
+ (let* ((registerp (plist-get (fsm-get-state-data jabber-buffer-connection) :registerp))
+ (handler (if registerp
+ #'jabber-process-register-secondtime
+ #'jabber-report-success))
+ (text (concat "Registration with " jabber-submit-to)))
+ (jabber-send-iq jabber-buffer-connection jabber-submit-to
"set"
(cond
@@ -107,29 +112,27 @@
,(jabber-parse-xdata-form)))
(t
(error "Unknown form type: %s" jabber-form-type)))
- handler (if jabber-register-p 'success text)
- handler (if jabber-register-p 'failure text)))
+ handler (if registerp 'success text)
+ handler (if registerp 'failure text)))
(message "Registration sent"))
-(defun jabber-process-register-secondtime (xml-data closure-data)
+(defun jabber-process-register-secondtime (jc xml-data closure-data)
"Receive registration success or failure.
CLOSURE-DATA is either 'success or 'error."
(cond
((eq closure-data 'success)
- (message "Registration successful. Your JID is %s@%s. You may now connect to the server."
- jabber-username jabber-server)
- (sit-for 3)
- (jabber-disconnect))
+ (message "Registration successful. You may now connect to the server."))
(t
- (jabber-report-success xml-data "Account registration")
- (sit-for 3))))
+ (jabber-report-success jc xml-data "Account registration")))
+ (sit-for 3)
+ (jabber-disconnect-one jc))
(defun jabber-remove-register (&rest ignore)
"Cancel registration. See `jabber-process-register-or-search'."
(if (yes-or-no-p (concat "Are you sure that you want to cancel your registration to " jabber-submit-to "? "))
- (jabber-send-iq jabber-submit-to
+ (jabber-send-iq jabber-buffer-connection jabber-submit-to
"set"
'(query ((xmlns . "jabber:iq:register"))
(remove))
diff --git a/jabber-roster.el b/jabber-roster.el
index 3839b1b..cd1ae8e 100644
--- a/jabber-roster.el
+++ b/jabber-roster.el
@@ -1,7 +1,7 @@
;; jabber-roster.el - displaying the roster -*- coding: utf-8; -*-
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -28,7 +28,7 @@
(defgroup jabber-roster nil "roster display options"
:group 'jabber)
-(defcustom jabber-roster-line-format " %a %c %-25n %u %-8s %S\n"
+(defcustom jabber-roster-line-format " %a %c %-25n %u %-8s %S"
"The format specification of the lines in the roster display.
These fields are available:
@@ -71,7 +71,7 @@ display them: ← → ⇄ ↔"
(cons :format "%v" (const :format "" "both") (string :tag "Both")))
:group 'jabber-roster)
-(defcustom jabber-resource-line-format " %r - %s (%S), priority %p\n"
+(defcustom jabber-resource-line-format " %r - %s (%S), priority %p"
"The format specification of resource lines in the roster display.
These are displayed when `jabber-show-resources' permits it.
@@ -113,6 +113,11 @@ Offline is represented as nil."
(const :tag "Always" always))
:group 'jabber-roster)
+(defcustom jabber-show-offline-contacts t
+ "Show offline contacts in roster when non-nil"
+ :type 'boolean
+ :group 'jabber-roster)
+
(defcustom jabber-remove-newlines t
"Remove newlines in status messages?
Newlines in status messages mess up the roster display. However,
@@ -191,6 +196,8 @@ Trailing newlines are always removed, regardless of this variable."
(define-key map "a" 'jabber-send-presence)
(define-key map "g" 'jabber-display-roster)
(define-key map "S" 'jabber-ft-send)
+ (define-key map "o" 'jabber-roster-toggle-offline-display)
+ (define-key map "H" 'jabber-roster-toggle-binding-display)
;;(define-key map "D" 'jabber-disconnect)
map))
@@ -210,15 +217,22 @@ bring up menus of actions.
(put 'jabber-roster-mode 'mode-class 'special)
-(defun jabber-switch-to-roster-buffer ()
- "Switch to roster buffer."
+(defun jabber-switch-to-roster-buffer (&optional jc)
+ "Switch to roster buffer.
+Optional JC argument is ignored; it's there so this function can
+be used in `jabber-post-connection-hooks'."
(interactive)
- (switch-to-buffer jabber-roster-buffer))
+ (if (not (get-buffer jabber-roster-buffer))
+ (jabber-display-roster)
+ (switch-to-buffer jabber-roster-buffer)))
-(defun jabber-sort-roster ()
+(defun jabber-sort-roster (jc)
"sort roster according to online status"
- (setq *jabber-roster*
- (sort *jabber-roster* #'jabber-roster-sort-items)))
+ (let ((state-data (fsm-get-state-data jc)))
+ (plist-put state-data :roster
+ (sort
+ (plist-get state-data :roster)
+ #'jabber-roster-sort-items))))
(defun jabber-roster-sort-items (a b)
"Sort roster items A and B according to `jabber-roster-sort-functions'.
@@ -265,10 +279,30 @@ See `jabber-sort-order' for order used."
(setq status (replace-match " " t t status))))
status))
-(defvar jabber-roster-positions nil
- "Alist tracking positions of items in the roster.
-Keys are bare JID symbols. Values are conses of markers,
-marking the extent of the roster entry.")
+(defvar jabber-roster-ewoc nil
+ "Ewoc displaying the roster.
+There is only one; we don't rely on buffer-local variables or
+such.")
+
+(defun jabber-roster-filter-display (buddies)
+ "Filter BUDDIES for items to be displayed in the roster"
+ (remove-if-not (lambda (buddy) (or jabber-show-offline-contacts
+ (get buddy 'connected)))
+ buddies))
+
+(defun jabber-roster-toggle-offline-display ()
+ "Toggle display of offline contacts."
+ (interactive)
+ (setq jabber-show-offline-contacts
+ (not jabber-show-offline-contacts))
+ (jabber-display-roster))
+
+(defun jabber-roster-toggle-binding-display ()
+ "Toggle display of the roster binding text."
+ (interactive)
+ (setq jabber-roster-show-bindings
+ (not jabber-roster-show-bindings))
+ (jabber-display-roster))
(defun jabber-display-roster ()
"switch to the main jabber buffer and refresh the roster display to reflect the current information"
@@ -283,51 +317,63 @@ marking the extent of the roster entry.")
(let ((current-line (and (fboundp 'line-number-at-pos) (line-number-at-pos)))
(current-column (current-column)))
(erase-buffer)
- (setq jabber-roster-positions nil)
- (insert (jabber-propertize jabber-server 'face 'jabber-title-large) "\n")
+ (setq jabber-roster-ewoc nil)
+ (insert (jabber-propertize "Jabber roster" 'face 'jabber-title-large) "\n")
(when jabber-roster-show-bindings
(insert "RET Open chat buffer C-k Delete roster item
e Edit item s Send subscription request
q Bury buffer i Get disco items
I Get disco info b Browse
j Join groupchat (MUC) v Get client version
-a Send presence
+a Send presence o Show offline contacts on/off
C-c C-c Chat menu C-c C-m Multi-User Chat menu
C-c C-i Info menu C-c C-r Roster menu
C-c C-s Service menu
+
+H Toggle displaying this text
"))
(insert "__________________________________\n\n")
- (let ((map (make-sparse-keymap)))
- (define-key map [mouse-2] #'jabber-send-presence)
- (insert (jabber-propertize (concat (format " - %s"
- (cdr (assoc *jabber-current-show* jabber-presence-strings)))
- (if (not (zerop (length *jabber-current-status*)))
- (format " (%s)"
- (jabber-fix-status *jabber-current-status*)))
- " -")
- 'face (or (cdr (assoc *jabber-current-show* jabber-presence-faces))
- 'jabber-roster-user-online)
- ;;'mouse-face (cons 'background-color "light grey")
- 'keymap map)
- "\n__________________________________\n\n"))
-
- (jabber-sort-roster)
- (dolist (buddy *jabber-roster*)
- (let ((entry-start (point)))
- (jabber-display-roster-entry buddy)
-
- ;; Keep track of this roster entry's position
- (let ((entry (assq buddy jabber-roster-positions)))
- (unless entry
- (setq entry (cons buddy nil))
- (push entry jabber-roster-positions))
- (let ((marker-start (set-marker (make-marker) entry-start))
- (marker-end (set-marker (make-marker) (point))))
- ;; Text is inserted before start markers, but after
- ;; end markers.
- (set-marker-insertion-type marker-start t)
- (setcdr entry (cons marker-start marker-end))))))
- (insert "__________________________________")
+ (if (null jabber-connections)
+ (insert "Not connected\n")
+ (let ((map (make-sparse-keymap)))
+ (define-key map [mouse-2] #'jabber-send-presence)
+ (insert (jabber-propertize (concat (format " - %s"
+ (cdr (assoc *jabber-current-show* jabber-presence-strings)))
+ (if (not (zerop (length *jabber-current-status*)))
+ (format " (%s)"
+ (jabber-fix-status *jabber-current-status*)))
+ " -")
+ 'face (or (cdr (assoc *jabber-current-show* jabber-presence-faces))
+ 'jabber-roster-user-online)
+ ;;'mouse-face (cons 'background-color "light grey")
+ 'keymap map)
+ "\n")))
+
+ (dolist (jc jabber-connections)
+ ;; We sort everything before putting it in the ewoc
+ (jabber-sort-roster jc)
+ (let ((before-ewoc (point))
+ (ewoc (ewoc-create
+ (lexical-let ((jc jc))
+ (lambda (buddy)
+ (jabber-display-roster-entry jc buddy)))
+ (concat
+ (jabber-propertize (concat
+ (plist-get (fsm-get-state-data jc) :username)
+ "@"
+ (plist-get (fsm-get-state-data jc) :server))
+ 'face 'jabber-title-medium)
+ "\n__________________________________\n")
+ "__________________________________")))
+ (plist-put (fsm-get-state-data jc) :roster-ewoc ewoc)
+ (dolist (buddy (jabber-roster-filter-display
+ (plist-get (fsm-get-state-data jc) :roster)))
+ (ewoc-enter-last ewoc buddy))
+ (goto-char (point-max))
+ (insert "\n")
+ (put-text-property before-ewoc (point)
+ 'jabber-account jc)))
+
(goto-char (point-min))
(setq buffer-read-only t)
(if (interactive-p)
@@ -337,7 +383,7 @@ C-c C-s Service menu
(goto-line current-line)
(move-to-column current-column)))))
-(defun jabber-display-roster-entry (buddy)
+(defun jabber-display-roster-entry (jc buddy)
"Format and insert a roster entry for BUDDY at point.
BUDDY is a JID symbol."
(let ((buddy-str (format-spec jabber-roster-line-format
@@ -369,7 +415,9 @@ BUDDY is a JID symbol."
'help-echo
(symbol-name buddy)
'jabber-jid
- (symbol-name buddy))
+ (symbol-name buddy)
+ 'jabber-account
+ jc)
buddy-str)
;; (let ((map (make-sparse-keymap))
;; (chat-with-func (make-symbol (concat "jabber-chat-with" (symbol-name buddy)))))
@@ -411,45 +459,61 @@ BUDDY is a JID symbol."
(or (cdr (assoc (plist-get (cdr resource) 'show) jabber-presence-faces))
'jabber-roster-user-online)
'jabber-jid
- (format "%s/%s" (symbol-name buddy) (car resource)))
+ (format "%s/%s" (symbol-name buddy) (car resource))
+ 'jabber-account
+ jc)
resource-str)
- (insert resource-str)))))))
+ (insert "\n" resource-str)))))))
+
+(defun jabber-roster-update (jc new-items changed-items deleted-items)
+ "Update roster, in memory and on display.
+Add NEW-ITEMS, update CHANGED-ITEMS and remove DELETED-ITEMS, all
+three being lists of JID symbols."
+ (let ((roster (plist-get (fsm-get-state-data jc) :roster))
+ (ewoc (plist-get (fsm-get-state-data jc) :roster-ewoc)))
+ (dolist (delete-this deleted-items)
+ (setq roster (delq delete-this roster)))
+ (setq roster (append new-items roster))
+ (plist-put (fsm-get-state-data jc) :roster roster)
+
+ ;; If there is no ewoc yet, create the roster buffer.
+ (if (null ewoc)
+ (jabber-display-roster)
+ ;; Otherwise, do incremental changes.
-(defun jabber-presence-update-roster (who &rest ignore)
- "Update roster without redrawing all of it, if possible.
-WHO is a JID symbol."
+ ;; The changed items need to be resorted, so we start by removing
+ ;; them as well.
+ (ewoc-filter ewoc
+ (lambda (a) (not (or (member a changed-items)
+ (member a deleted-items)))))
- (let* ((bare-jid (jabber-jid-symbol
- (jabber-jid-user
- (symbol-name who))))
- (entry (assq bare-jid jabber-roster-positions))
- (inhibit-read-only t))
- (jabber-sort-roster)
- (if (null entry)
- (jabber-display-roster)
- (let ((old-start (cadr entry))
- (old-end (cddr entry))
- (insert-before-this (cadr (memq bare-jid *jabber-roster*))))
- (with-current-buffer jabber-roster-buffer
- (delete-region old-start old-end)
- (save-excursion
- (let ((new-start
- (marker-position
- (if insert-before-this
- ;; If this is not the last entry, go to start
- ;; position of next entry.
- (cadr (assq insert-before-this jabber-roster-positions))
- ;; If this is the last entry, go to end position of second
- ;; to last entry.
- (cddr (car (last jabber-roster-positions 2)))))))
- (goto-char new-start)
- (jabber-display-roster-entry bare-jid)
- (let ((marker-start (set-marker (make-marker) new-start))
- (marker-end (set-marker (make-marker) (point))))
- ;; Text is inserted before start markers, but after
- ;; end markers.
- (set-marker-insertion-type marker-start t)
- (setcdr entry (cons marker-start marker-end))))))))))
+ ;; Now, insert items into ewoc.
+ (let* ((to-be-inserted
+ (sort (jabber-roster-filter-display
+ (append new-items changed-items))
+ #'jabber-roster-sort-items))
+ (where (ewoc-nth ewoc 0)))
+ (while to-be-inserted
+ (cond
+ ;; If we are at the end of the ewoc, put all elements there.
+ ((null where)
+ (dolist (a to-be-inserted)
+ (ewoc-enter-last ewoc a))
+ (setq to-be-inserted nil))
+ ;; If the next element should go here, put it here.
+ ((jabber-roster-sort-items (car to-be-inserted)
+ (ewoc-data where))
+ (ewoc-enter-before ewoc where
+ (car to-be-inserted))
+ (setq to-be-inserted (cdr to-be-inserted)))
+ ;; Else, advance through the ewoc.
+ (t
+ (setq where (ewoc-next ewoc where)))))))))
+
+(defalias 'jabber-presence-update-roster 'ignore)
+;;jabber-presence-update-roster is not needed anymore.
+;;Its work is done in `jabber-process-presence'."
+(make-obsolete 'jabber-presence-update-roster 'ignore)
(defun jabber-go-to-next-jid ()
"Move the cursor to the next jid in the buffer"
diff --git a/jabber-sasl.el b/jabber-sasl.el
index 4bbc71a..fbcbe7c 100644
--- a/jabber-sasl.el
+++ b/jabber-sasl.el
@@ -1,6 +1,6 @@
;; jabber-sasl.el - SASL authentication
-;; Copyright (C) 2004 - Magnus Henoch - mange@freemail.hu
+;; Copyright (C) 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -20,9 +20,12 @@
(require 'cl)
-;;; This file uses sasl.el from FLIM, and expects to find it. If it
-;;; can't be found, jabber-core.el catches the error.
-(require 'sasl)
+;;; This file uses sasl.el from FLIM or Gnus. If it can't be found,
+;;; jabber-core.el won't use the SASL functions.
+(eval-and-compile
+ (condition-case nil
+ (require 'sasl)
+ (error nil)))
;;; Alternatives to FLIM would be the command line utility of GNU SASL,
;;; or anything the Gnus people decide to use.
@@ -31,95 +34,92 @@
(require 'jabber-xml)
-(defvar jabber-sasl-mechanism nil)
-(defvar jabber-sasl-client nil)
-(defvar jabber-sasl-step nil)
-
-(defun jabber-sasl-start-auth (stream-features)
- ;; This shouldn't be necessary
- ;;(setq jabber-call-on-connection nil)
-
- ;; Reset our own state.
- (setq jabber-sasl-mechanism nil)
- (setq jabber-sasl-client nil)
- (setq jabber-sasl-step nil)
-
- ;; Hijack all stanzas for a while.
- (setq jabber-short-circuit-input #'jabber-sasl-process-input)
-
+(defun jabber-sasl-start-auth (jc stream-features)
;; Find a suitable common mechanism.
- (let ((mechanisms (car (jabber-xml-get-children stream-features 'mechanisms))))
- (setq jabber-sasl-mechanism
- (sasl-find-mechanism
- (mapcar
- (lambda (tag)
- (car (jabber-xml-node-children tag)))
- (jabber-xml-get-children mechanisms 'mechanism)))))
-
- ;; No suitable mechanism?
- (if (null jabber-sasl-mechanism)
- ;; Maybe we can use legacy authentication
- (let ((node (find "http://jabber.org/features/iq-auth"
- (jabber-xml-get-children stream-features 'auth)
- :key #'(lambda (node) (jabber-xml-get-attribute node 'xmlns))
- :test #'string=)))
- (if node
- (progn
- (setq jabber-short-circuit-input nil)
- (jabber-get-auth jabber-server))
- (error "No suitable SASL mechanism found")))
-
- ;; Watch for plaintext logins over unencrypted connections
- (when (and (not *jabber-encrypted*)
- (member (sasl-mechanism-name jabber-sasl-mechanism)
+ (let* ((mechanism-elements (car (jabber-xml-get-children stream-features 'mechanisms)))
+ (mechanisms (mapcar
+ (lambda (tag)
+ (car (jabber-xml-node-children tag)))
+ (jabber-xml-get-children mechanism-elements 'mechanism)))
+ (mechanism
+ (if (and (member "ANONYMOUS" mechanisms)
+ (yes-or-no-p "Use anonymous authentication? "))
+ (sasl-find-mechanism '("ANONYMOUS"))
+ (sasl-find-mechanism mechanisms))))
+
+ ;; No suitable mechanism?
+ (if (null mechanism)
+ ;; Maybe we can use legacy authentication
+ (let ((node (find "http://jabber.org/features/iq-auth"
+ (jabber-xml-get-children stream-features 'auth)
+ :key #'(lambda (node) (jabber-xml-get-attribute node 'xmlns))
+ :test #'string=)))
+ (if node
+ (fsm-send jc :use-legacy-auth-instead)
+ (message "No suitable SASL mechanism found")
+ (fsm-send jc :authentication-failure)))
+
+ ;; Watch for plaintext logins over unencrypted connections
+ (if (and (not (plist-get (fsm-get-state-data jc) :encrypted))
+ (member (sasl-mechanism-name mechanism)
'("PLAIN" "LOGIN"))
(not (yes-or-no-p "Jabber server only allows cleartext password transmission! Continue? ")))
- (error "Login cancelled"))
-
- ;; Start authentication.
- (setq jabber-sasl-client (sasl-make-client jabber-sasl-mechanism jabber-username "xmpp" jabber-server))
- (setq jabber-sasl-step (sasl-next-step jabber-sasl-client nil))
- (jabber-send-sexp
- `(auth ((xmlns . "urn:ietf:params:xml:ns:xmpp-sasl")
- (mechanism . ,(sasl-mechanism-name jabber-sasl-mechanism)))
- ,(when (sasl-step-data jabber-sasl-step)
- (base64-encode-string (sasl-step-data jabber-sasl-step) t))))))
-
-(defun jabber-sasl-stop ()
- (setq jabber-short-circuit-input nil))
-
-(defun jabber-sasl-process-input (xml-data)
- (let ((sasl-read-passphrase #'jabber-read-passwd))
+ (fsm-send jc :authentication-failure)
+
+ ;; Start authentication.
+ (let* (passphrase
+ (client (sasl-make-client mechanism
+ (plist-get (fsm-get-state-data jc) :username)
+ "xmpp"
+ (plist-get (fsm-get-state-data jc) :server)))
+ (sasl-read-passphrase (jabber-sasl-read-passphrase-closure
+ jc
+ (lambda (p) (setq passphrase (copy-sequence p)) p)))
+ (step (sasl-next-step client nil)))
+ (jabber-send-sexp
+ jc
+ `(auth ((xmlns . "urn:ietf:params:xml:ns:xmpp-sasl")
+ (mechanism . ,(sasl-mechanism-name mechanism)))
+ ,(when (sasl-step-data step)
+ (base64-encode-string (sasl-step-data step) t))))
+ (list client step passphrase))))))
+
+(defun jabber-sasl-read-passphrase-closure (jc remember)
+ "Return a lambda function suitable for `sasl-read-passphrase' for JC.
+Call REMEMBER with the password. REMEMBER is expected to return it as well."
+ (lexical-let ((password (plist-get (fsm-get-state-data jc) :password))
+ (bare-jid (jabber-connection-bare-jid jc))
+ (remember remember))
+ (if password
+ (lambda (prompt) (funcall remember (copy-sequence password)))
+ (lambda (prompt) (funcall remember (jabber-read-password bare-jid))))))
+
+(defun jabber-sasl-process-input (jc xml-data sasl-data)
+ (let* ((client (first sasl-data))
+ (step (second sasl-data))
+ (passphrase (third sasl-data))
+ (sasl-read-passphrase (jabber-sasl-read-passphrase-closure
+ jc
+ (lambda (p) (setq passphrase (copy-sequence p)) p))))
(cond
((eq (car xml-data) 'challenge)
- (sasl-step-set-data jabber-sasl-step (base64-decode-string (car (jabber-xml-node-children xml-data))))
- (setq jabber-sasl-step (sasl-next-step jabber-sasl-client jabber-sasl-step))
+ (sasl-step-set-data step (base64-decode-string (car (jabber-xml-node-children xml-data))))
+ (setq step (sasl-next-step client step))
(jabber-send-sexp
+ jc
`(response ((xmlns . "urn:ietf:params:xml:ns:xmpp-sasl"))
- ,(when (sasl-step-data jabber-sasl-step)
- (base64-encode-string (sasl-step-data jabber-sasl-step) t)))))
+ ,(when (sasl-step-data step)
+ (base64-encode-string (sasl-step-data step) t)))))
((eq (car xml-data) 'failure)
- (ding)
(message "SASL authentication failure: %s"
(jabber-xml-node-name (car (jabber-xml-node-children xml-data))))
- (sit-for 3)
- (jabber-disconnect)
- (jabber-sasl-stop))
+ (fsm-send jc :authentication-failure))
((eq (car xml-data) 'success)
(message "Authentication succeeded")
- (setq *jabber-authenticated* t)
- (jabber-sasl-stop)
-
- ;; Now, we send another stream header.
- (funcall jabber-conn-send-function
- (concat
- "<stream:stream to='"
- jabber-server
- "' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>"))
- ;; now see what happens
-))))
+ (fsm-send jc (cons :authentication-success passphrase))))
+ (list client step passphrase)))
(provide 'jabber-sasl)
;;; arch-tag: 2a4a234d-34d3-49dd-950d-518c899c0fd0
diff --git a/jabber-sawfish.el b/jabber-sawfish.el
index 378eb20..15546f5 100644
--- a/jabber-sawfish.el
+++ b/jabber-sawfish.el
@@ -18,6 +18,8 @@
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+(eval-when-compile (require 'jabber-alert))
+
(defcustom jabber-sawfish-display-time 3
"Time in seconds for displaying a jabber message through the
Sawfish window manager."
@@ -29,9 +31,11 @@ Sawfish window manager."
(let ((process-connection-type nil))
(start-process-shell-command
"jabber-sawfish" nil "echo"
- (concat "'(progn (display-message \""
+ (concat "'(progn (require (quote timers)) (display-message \""
message
- "\")(make-timer (lambda () (display-message nil)) 3))' | sawfish-client - &> /dev/null"))))
+ "\")(make-timer (lambda () (display-message nil)) "
+ (number-to-string jabber-sawfish-display-time)
+ "))' | sawfish-client - &> /dev/null"))))
(define-jabber-alert sawfish "Display a message through the Sawfish window manager"
'jabber-sawfish-display-message)
diff --git a/jabber-screen.el b/jabber-screen.el
index 7b00320..851aba2 100644
--- a/jabber-screen.el
+++ b/jabber-screen.el
@@ -18,6 +18,8 @@
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+(eval-when-compile (require 'jabber-alert))
+
(defun jabber-screen-message (msg)
"Show MSG in screen"
(call-process "screen" nil nil nil "-X" "echo" msg))
diff --git a/jabber-search.el b/jabber-search.el
index d88a466..c5a2f9e 100644
--- a/jabber-search.el
+++ b/jabber-search.el
@@ -23,10 +23,11 @@
(add-to-list 'jabber-jid-service-menu
(cons "Search directory" 'jabber-get-search))
-(defun jabber-get-search (to)
+(defun jabber-get-search (jc to)
"Send IQ get request in namespace \"jabber:iq:search\"."
- (interactive (list (jabber-read-jid-completing "Search what database: ")))
- (jabber-send-iq to
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Search what database: ")))
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:search")))
#'jabber-process-data #'jabber-process-register-or-search
@@ -41,9 +42,9 @@
;; search form is activated.
(defun jabber-submit-search (&rest ignore)
"Submit search. See `jabber-process-register-or-search'."
-
+
(let ((text (concat "Search at " jabber-submit-to)))
- (jabber-send-iq jabber-submit-to
+ (jabber-send-iq jabber-buffer-connection jabber-submit-to
"set"
(cond
@@ -60,7 +61,7 @@
(message "Search sent"))
-(defun jabber-process-search-result (xml-data)
+(defun jabber-process-search-result (jc xml-data)
"Receive and display search results."
;; This function assumes that all search results come in one packet,
@@ -79,7 +80,7 @@
(jabber-render-xdata-search-results xdata)
(insert (jabber-propertize "Search results" 'face 'jabber-title-medium) "\n")
-
+
(setq fields '((first . (label "First name" column 0))
(last . (label "Last name" column 15))
(nick . (label "Nickname" column 30))
@@ -99,12 +100,12 @@
(dolist (field-cons fields)
(let ((field-plist (cdr field-cons))
- (value (if (eq (car field-cons) 'jid)
+ (value (if (eq (car field-cons) 'jid)
(setq jid (jabber-xml-get-attribute item 'jid))
(car (jabber-xml-node-children (car (jabber-xml-get-children item (car field-cons))))))))
(indent-to (plist-get field-plist 'column) 1)
(if value (insert value))))
-
+
(if jid
(put-text-property start-of-line (point)
'jabber-jid jid))
diff --git a/jabber-si-client.el b/jabber-si-client.el
index 9b517df..8e1c5a2 100644
--- a/jabber-si-client.el
+++ b/jabber-si-client.el
@@ -23,7 +23,7 @@
(require 'jabber-si-common)
-(defun jabber-si-initiate (jid profile-namespace profile-data profile-function &optional mime-type)
+(defun jabber-si-initiate (jc jid profile-namespace profile-data profile-function &optional mime-type)
"Try to initiate a stream to JID.
PROFILE-NAMESPACE is, well, the namespace of the profile to use.
PROFILE-DATA is the XML data to send within the SI request.
@@ -33,7 +33,7 @@ MIME-TYPE is the MIME type to specify.
Returns the SID."
(let ((sid (apply 'format "emacs-sid-%d.%d.%d" (current-time))))
- (jabber-send-iq jid "set"
+ (jabber-send-iq jc jid "set"
`(si ((xmlns . "http://jabber.org/protocol/si")
(id . ,sid)
,(if mime-type
@@ -50,7 +50,7 @@ Returns the SID."
#'jabber-report-success "Stream initiation")
sid))
-(defun jabber-si-initiate-process (xml-data closure-data)
+(defun jabber-si-initiate-process (jc xml-data closure-data)
"Act on response to our SI query."
(let* ((profile-function (car closure-data))
@@ -63,7 +63,7 @@ Returns the SID."
(method-data (assoc chosen-method jabber-si-stream-methods)))
;; Our work is done. Hand it over to the stream method.
(let ((stream-negotiate (nth 1 method-data)))
- (funcall stream-negotiate from sid profile-function))))
+ (funcall stream-negotiate jc from sid profile-function))))
(provide 'jabber-si-client)
diff --git a/jabber-si-server.el b/jabber-si-server.el
index a84fb4e..286ad29 100644
--- a/jabber-si-server.el
+++ b/jabber-si-server.el
@@ -41,7 +41,7 @@ Each entry is a list, containing:
(add-to-list 'jabber-iq-set-xmlns-alist
(cons "http://jabber.org/protocol/si" 'jabber-si-process))
-(defun jabber-si-process (xml-data)
+(defun jabber-si-process (jc xml-data)
(let* ((to (jabber-xml-get-attribute xml-data 'from))
(id (jabber-xml-get-attribute xml-data 'id))
@@ -70,15 +70,15 @@ Each entry is a list, containing:
(let* ((profile-accept-function (nth 1 profile-data))
;; accept-function might throw a "forbidden" error
;; on user cancel
- (profile-response (funcall profile-accept-function xml-data))
+ (profile-response (funcall profile-accept-function jc xml-data))
(profile-connected-function (nth 2 profile-data))
(stream-method-id (nth 1 (assoc "stream-method" stream-method)))
(stream-data (assoc stream-method-id jabber-si-stream-methods))
(stream-accept-function (nth 2 stream-data)))
;; prepare stream for the transfer
- (funcall stream-accept-function to si-id profile-connected-function)
+ (funcall stream-accept-function jc to si-id profile-connected-function)
;; return result of feature negotiation of stream type
- (jabber-send-iq to "result"
+ (jabber-send-iq jc to "result"
`(si ((xmlns . "http://jabber.org/protocol/si"))
,@profile-response
(feature ((xmlns . "http://jabber.org/protocol/feature-neg"))
diff --git a/jabber-socks5.el b/jabber-socks5.el
index 9d390d7..ee64033 100644
--- a/jabber-socks5.el
+++ b/jabber-socks5.el
@@ -1,7 +1,7 @@
;; jabber-socks5.el - SOCKS5 bytestreams by JEP-0065
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -72,23 +72,23 @@ This is the set function of `jabber-socks5-proxies-data'."
(when *jabber-connected*
(jabber-socks5-query-all-proxies)))
-(defun jabber-socks5-query-all-proxies (&optional callback)
+(defun jabber-socks5-query-all-proxies (jc &optional callback)
"Ask all proxies in `jabber-socks5-proxies' for connection information.
If CALLBACK is non-nil, call it with no arguments when all
proxies have answered."
- (interactive)
+ (interactive (list (jabber-read-account)))
(setq jabber-socks5-proxies-data nil)
(dolist (proxy jabber-socks5-proxies)
- (jabber-socks5-query-proxy proxy callback)))
+ (jabber-socks5-query-proxy jc proxy callback)))
-(defun jabber-socks5-query-proxy (jid &optional callback)
+(defun jabber-socks5-query-proxy (jc jid &optional callback)
"Query the SOCKS5 proxy specified by JID for IP and port number."
- (jabber-send-iq jid "get"
+ (jabber-send-iq jc jid "get"
'(query ((xmlns . "http://jabber.org/protocol/bytestreams")))
#'jabber-socks5-process-proxy-response (list callback t)
#'jabber-socks5-process-proxy-response (list callback nil)))
-(defun jabber-socks5-process-proxy-response (xml-data closure-data)
+(defun jabber-socks5-process-proxy-response (jc xml-data closure-data)
"Process response from proxy query."
(let* ((query (jabber-iq-query xml-data))
(from (jabber-xml-get-attribute xml-data 'from))
@@ -111,13 +111,14 @@ proxies have answered."
(funcall callback)))))
(define-state-machine jabber-socks5
- :start ((jid sid profile-function role)
+ :start ((jc jid sid profile-function role)
"Start JEP-0065 bytestream with JID.
SID is the session ID used.
PROFILE-FUNCTION is the function to call upon success. See `jabber-si-stream-methods'.
ROLE is either :initiator or :target. The initiator sends an IQ
set; the target waits for one."
- (let ((new-state-data (list :jid jid
+ (let ((new-state-data (list :jc jc
+ :jid jid
:sid sid
:profile-function profile-function
:role role))
@@ -136,18 +137,22 @@ set; the target waits for one."
'initiate))))
(list new-state new-state-data nil))))
-(defun jabber-socks5-accept (jid sid profile-function)
+(defun jabber-socks5-accept (jc jid sid profile-function)
"Remember that we are waiting for connection from JID, with stream id SID"
;; asking the user for permission is done in the profile
(add-to-list 'jabber-socks5-pending-sessions
- (list sid jid (start-jabber-socks5 jid sid profile-function :target))))
+ (list sid jid (start-jabber-socks5 jc jid sid profile-function :target))))
(define-enter-state jabber-socks5 seek-proxies (fsm state-data)
;; Look for items at the server.
- (jabber-disco-get-items jabber-server nil
- (lambda (fsm result)
- (fsm-send-sync fsm (cons :items result)))
- fsm)
+ (let* ((jc (plist-get state-data :jc))
+ (server (jabber-jid-server (jabber-connection-jid jc))))
+ (jabber-disco-get-items jc
+ server
+ nil
+ (lambda (jc fsm result)
+ (fsm-send-sync fsm (cons :items result)))
+ fsm))
;; Spend no more than five seconds looking for a proxy.
(list state-data 5))
@@ -168,8 +173,9 @@ set; the target waits for one."
(when (null (aref entry 2))
(lexical-let ((jid (aref entry 1)))
(jabber-disco-get-info
+ (plist-get state-data :jc)
jid nil
- (lambda (fsm result)
+ (lambda (jc fsm result)
(fsm-send-sync fsm (list :info jid result)))
fsm))))
;; Remember number of requests sent. But if none, we just go on.
@@ -205,8 +211,9 @@ set; the target waits for one."
(define-enter-state jabber-socks5 query-proxies (fsm state-data)
(jabber-socks5-query-all-proxies
- (lexical-let ((fsm fsm))
- (lambda () (fsm-send-sync fsm :proxies))))
+ (plist-get state-data :jc)
+ (lexical-let ((fsm fsm))
+ (lambda () (fsm-send-sync fsm :proxies))))
(list state-data 5))
(define-state jabber-socks5 query-proxies (fsm state-data event callback)
@@ -238,6 +245,7 @@ set; the target waits for one."
;; This is where initiation of server sockets would go
(jabber-send-iq
+ (plist-get state-data :jc)
(plist-get state-data :jid) "set"
`(query ((xmlns . "http://jabber.org/protocol/bytestreams")
(sid . ,(plist-get state-data :sid)))
@@ -256,18 +264,18 @@ set; the target waits for one."
;; (fast ((xmlns . "http://affinix.com/jabber/stream")))
)
(lexical-let ((fsm fsm))
- (lambda (xml-data closure-data)
+ (lambda (jc xml-data closure-data)
(fsm-send-sync fsm (list :iq xml-data))))
nil
;; TODO: error handling
#'jabber-report-success "SOCKS5 negotiation"))
;; If we're the target, we just wait for an incoming stanza.
- (list state-data 30))
+ (list state-data nil))
(add-to-list 'jabber-iq-set-xmlns-alist
(cons "http://jabber.org/protocol/bytestreams" 'jabber-socks5-process))
-(defun jabber-socks5-process (xml-data)
+(defun jabber-socks5-process (jc xml-data)
"Accept IQ get for SOCKS5 bytestream"
(let* ((jid (jabber-xml-get-attribute xml-data 'from))
(id (jabber-xml-get-attribute xml-data 'id))
@@ -309,7 +317,11 @@ set; the target waits for one."
))
(define-state jabber-socks5 initiate (fsm state-data event callback)
- (let* ((our-jid (concat jabber-username "@" jabber-server "/" jabber-resource))
+ (let* ((jc (plist-get state-data :jc))
+ (jc-data (fsm-get-state-data jc))
+ (our-jid (concat (plist-get jc-data :username) "@"
+ (plist-get jc-data :server) "/"
+ (plist-get jc-data :resource)))
(their-jid (plist-get state-data :jid))
(initiator-jid (if (eq (plist-get state-data :role) :initiator) our-jid their-jid))
(target-jid (if (eq (plist-get state-data :role) :initiator) their-jid our-jid)))
@@ -335,7 +347,7 @@ set; the target waits for one."
;; This is where we would attempt to support zeroconf
(when (and jid host port)
(start-jabber-socks5-connection
- initiator-jid target-jid jid
+ jc initiator-jid target-jid jid
(plist-get state-data :sid) host port fsm))))
(list 'wait-for-connection (plist-put state-data :iq-id (jabber-xml-get-attribute xml-data 'id)) 30))
@@ -352,14 +364,14 @@ set; the target waits for one."
(jid host port) streamhost
(when (and jid host port)
(start-jabber-socks5-connection
- initiator-jid target-jid jid
+ jc initiator-jid target-jid jid
(plist-get state-data :sid) host port fsm)))))
(list 'wait-for-connection state-data 30))))))))
(define-state-machine jabber-socks5-connection
:start
- ((initiator-jid target-jid streamhost-jid sid host port socks5-fsm)
+ ((jc initiator-jid target-jid streamhost-jid sid host port socks5-fsm)
"Connect to a single JEP-0065 streamhost."
(let ((coding-system-for-read 'binary)
(coding-system-for-write 'binary))
@@ -376,7 +388,8 @@ set; the target waits for one."
:filter (fsm-make-filter fsm)
:sentinel (fsm-make-sentinel fsm))))
(list 'wait-for-connection
- (list :connection connection
+ (list :jc jc
+ :connection connection
:initiator-jid initiator-jid
:target-jid target-jid
:streamhost-jid streamhost-jid
@@ -391,7 +404,8 @@ set; the target waits for one."
(set-process-filter connection (fsm-make-filter fsm))
(set-process-sentinel connection (fsm-make-sentinel fsm))
(list 'authenticate
- (list :connection connection
+ (list :jc jc
+ :connection connection
:initiator-jid initiator-jid
:target-jid target-jid
:streamhost-jid streamhost-jid
@@ -497,6 +511,7 @@ set; the target waits for one."
(let ((iq-id (plist-get state-data :iq-id)))
(when iq-id
(jabber-send-iq
+ (plist-get state-data :jc)
(plist-get state-data :jid) "result"
`(query ((xmlns . "http://jabber.org/protocol/bytestreams"))
(streamhost-used ((jid . ,streamhost-jid))))
@@ -507,12 +522,13 @@ set; the target waits for one."
(if (eq (plist-get state-data :role) :initiator)
(progn
(jabber-send-iq
+ (plist-get state-data :jc)
streamhost-jid "set"
`(query ((xmlns . "http://jabber.org/protocol/bytestreams")
(sid . ,(plist-get state-data :sid)))
(activate nil ,(plist-get state-data :jid)))
- (lambda (xml-data fsm) (fsm-send-sync fsm :activated)) fsm
- (lambda (xml-data fsm) (fsm-send-sync fsm :activation-failed)) fsm)
+ (lambda (jc xml-data fsm) (fsm-send-sync fsm :activated)) fsm
+ (lambda (jc xml-data fsm) (fsm-send-sync fsm :activation-failed)) fsm)
(list 'wait-for-activation state-data 10))
;; Otherwise, we just let the data flow.
(list 'stream-activated state-data nil))))
@@ -544,6 +560,7 @@ set; the target waits for one."
(define-enter-state jabber-socks5 stream-activated
(fsm state-data)
(let ((connection (plist-get state-data :connection))
+ (jc (plist-get state-data :jc))
(jid (plist-get state-data :jid))
(sid (plist-get state-data :sid))
(profile-function (plist-get state-data :profile-function)))
@@ -555,7 +572,7 @@ set; the target waits for one."
(list (plist-put state-data
:profile-data-function
(funcall profile-function
- jid sid
+ jc jid sid
(lexical-let ((fsm fsm))
(lambda (data)
(fsm-send fsm (list :send data))))))
@@ -564,7 +581,8 @@ set; the target waits for one."
(define-state jabber-socks5 stream-activated
(fsm state-data event callback)
- (let ((connection (plist-get state-data :connection))
+ (let ((jc (plist-get state-data :jc))
+ (connection (plist-get state-data :connection))
(profile-data-function (plist-get state-data :profile-data-function))
(sid (plist-get state-data :sid))
(jid (plist-get state-data :jid)))
@@ -576,7 +594,7 @@ set; the target waits for one."
((eq (car-safe event) :filter)
;; Pass data from connection to profile data function
;; If the data function requests it, tear down the connection.
- (unless (funcall profile-data-function jid sid (third event))
+ (unless (funcall profile-data-function jc jid sid (third event))
(fsm-send fsm (list :sentinel (second event) "shutdown")))
(list 'stream-activated state-data nil))
@@ -585,7 +603,7 @@ set; the target waits for one."
;; Connection terminated. Shuffle together the remaining data,
;; and kill the buffer.
(delete-process (second event))
- (funcall profile-data-function jid sid nil)
+ (funcall profile-data-function jc jid sid nil)
(list 'closed nil nil))
;; Stray events from earlier state
@@ -598,22 +616,23 @@ set; the target waits for one."
(define-enter-state jabber-socks5 fail (fsm state-data)
"Tell our caller that we failed."
- (let ((jid (plist-get state-data :jid))
+ (let ((jc (plist-get state-data :jc))
+ (jid (plist-get state-data :jid))
(sid (plist-get state-data :sid))
(profile-function (plist-get state-data :profile-function))
(iq-id (plist-get state-data :iq-id)))
- (funcall profile-function jid sid (plist-get state-data :error))
+ (funcall profile-function jc jid sid (plist-get state-data :error))
(when iq-id
- (jabber-send-iq-error jid iq-id nil "cancel"
+ (jabber-send-iq-error jc jid iq-id nil "cancel"
'remote-server-not-found)))
(list nil nil))
-(defun jabber-socks5-client-1 (jid sid profile-function)
+(defun jabber-socks5-client-1 (jc jid sid profile-function)
"Negotiate a SOCKS5 connection with JID.
This function simply starts a state machine."
(add-to-list 'jabber-socks5-pending-sessions
- (list sid jid (start-jabber-socks5 jid sid profile-function :initiator))))
+ (list sid jid (start-jabber-socks5 jc jid sid profile-function :initiator))))
;; (defun jabber-socks5-client-2 (xml-data jid sid profile-function)
;; "Contact has selected a streamhost to use. Connect to the proxy."
diff --git a/jabber-time.el b/jabber-time.el
index ae0eca1..bdeef5f 100644
--- a/jabber-time.el
+++ b/jabber-time.el
@@ -27,18 +27,19 @@
(add-to-list 'jabber-jid-info-menu
(cons "Request time" 'jabber-get-time))
-(defun jabber-get-time (to)
+(defun jabber-get-time (jc to)
"Request time"
- (interactive (list (jabber-read-jid-completing "Request time of: "
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Request time of: "
nil nil nil 'full)))
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:time")))
#'jabber-process-data #'jabber-process-time
#'jabber-process-data "Time request failed"))
;; called by jabber-process-data
-(defun jabber-process-time (xml-data)
+(defun jabber-process-time (jc xml-data)
"Handle results from jabber:iq:time requests."
(let ((query (jabber-iq-query xml-data)))
(let ((display
@@ -65,27 +66,29 @@
;; the only difference between these two functions is the
;; jabber-read-jid-completing call.
-(defun jabber-get-last-online (to)
+(defun jabber-get-last-online (jc to)
"Request time since a user was last online, or uptime of a component."
- (interactive (list (jabber-read-jid-completing "Get last online for: "
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Get last online for: "
nil nil nil 'bare-or-muc)))
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:last")))
#'jabber-process-data #'jabber-process-last
#'jabber-process-data "Last online request failed"))
-(defun jabber-get-idle-time (to)
+(defun jabber-get-idle-time (jc to)
"Request idle time of user."
- (interactive (list (jabber-read-jid-completing "Get idle time for: "
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Get idle time for: "
nil nil nil 'full)))
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:last")))
#'jabber-process-data #'jabber-process-last
#'jabber-process-data "Idle time request failed"))
-(defun jabber-process-last (xml-data)
+(defun jabber-process-last (jc xml-data)
"Handle resultts from jabber:iq:last requests."
(let* ((from (jabber-xml-get-attribute xml-data 'from))
(query (jabber-iq-query xml-data))
@@ -113,12 +116,12 @@
(add-to-list 'jabber-iq-get-xmlns-alist (cons "jabber:iq:time" 'jabber-return-time))
(add-to-list 'jabber-advertised-features "jabber:iq:time")
-(defun jabber-return-time (xml-data)
+(defun jabber-return-time (jc xml-data)
"Return client time as defined in JEP-0090. Sender and ID are
determined from the incoming packet passed in XML-DATA."
(let ((to (jabber-xml-get-attribute xml-data 'from))
(id (jabber-xml-get-attribute xml-data 'id)))
- (jabber-send-iq to "result"
+ (jabber-send-iq jc to "result"
`(query ((xmlns . "jabber:iq:time"))
;; what is ``human-readable'' format?
;; the same way as formating using by tkabber
diff --git a/jabber-truncate.el b/jabber-truncate.el
new file mode 100644
index 0000000..f0e6917
--- /dev/null
+++ b/jabber-truncate.el
@@ -0,0 +1,69 @@
+;; jabber-truncate.el - cleanup top lines in chatbuffers
+
+;; Copyright (C) 2007 - Kirill A. Korinskiy - catap@catap.ru
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+(require 'jabber-chat)
+(eval-when-compile (require 'cl))
+
+(defvar jabber-log-lines-to-keep 1000
+ "Maximum number of lines in chat buffer")
+
+(defun jabber-truncate-top ()
+ "Clean old history from a chat buffer.
+`jabber-log-lines-to-keep' specifies the number of lines to
+keep."
+ (interactive)
+ (let ((inhibit-read-only t)
+ (delete-before
+ ;; go back one node, to make this function "idempotent"
+ (ewoc-prev
+ jabber-chat-ewoc
+ (ewoc-locate jabber-chat-ewoc
+ (save-excursion
+ (goto-char (point-max))
+ (forward-line (- jabber-log-lines-to-keep))
+ (point))))))
+ (while delete-before
+ (setq delete-before
+ (prog1
+ (ewoc-prev jabber-chat-ewoc delete-before)
+ (ewoc-delete jabber-chat-ewoc delete-before))))))
+
+(defun jabber-truncate-muc (nick group buffer text proposed-alert)
+ "Clean old history from MUC buffers.
+`jabber-log-lines-to-keep' specifies the number of lines to
+keep."
+ (jabber-truncate-top))
+
+(defun jabber-truncate-chat (from buffer text proposed-alert)
+ "Clean old history from chat buffers.
+`jabber-log-lines-to-keep' specifies the number of lines to
+keep.
+
+Note that this might interfer with
+`jabber-chat-display-more-backlog': you ask for more history, you
+get it, and then it just gets deleted."
+ (jabber-truncate-top))
+
+(pushnew 'jabber-truncate-muc (get 'jabber-alert-muc-hooks 'custom-options))
+(pushnew 'jabber-truncate-chat (get 'jabber-alert-message-hooks 'custom-options))
+
+(provide 'jabber-truncate)
+
+;; arch-tag: 3d1e3428-f598-11db-a314-000a95c2fcd0
diff --git a/jabber-util.el b/jabber-util.el
index 5d9dc1f..55e9c18 100644
--- a/jabber-util.el
+++ b/jabber-util.el
@@ -1,7 +1,8 @@
;; jabber-util.el - various utility functions -*- coding: utf-8; -*-
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
+;; Copyright (C) 2008 - Terechkov Evgenii - evg@altlinux.org
;; This file is a part of jabber.el.
@@ -20,17 +21,32 @@
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(eval-when-compile (require 'cl))
+(condition-case nil
+ (require 'password)
+ (error nil))
(defvar jabber-jid-history nil
"History of entered JIDs")
+;; Define `jabber-replace-in-string' somehow.
(cond
+ ;; Emacs 21 has replace-regexp-in-string.
+ ((fboundp 'replace-regexp-in-string)
+ (defsubst jabber-replace-in-string (str regexp newtext)
+ (replace-regexp-in-string regexp newtext str t t)))
+ ;; XEmacs has replace-in-string. However, color-theme defines it as
+ ;; well on Emacs 2x, so this check must be last.
((fboundp 'replace-in-string)
+ ;; And the version in color-theme takes only three arguments. Check
+ ;; just to be sure.
+ (condition-case nil
+ (replace-in-string "foobar" "foo" "bar" t)
+ (wrong-number-of-arguments
+ (error "`replace-in-string' doesn't accept fourth argument")))
(defsubst jabber-replace-in-string (str regexp newtext)
(replace-in-string str regexp newtext t)))
- ((fboundp 'replace-regexp-in-string)
- (defsubst jabber-replace-in-string (str regexp newtext)
- (replace-regexp-in-string regexp newtext str t t))))
+ (t
+ (error "No implementation of `jabber-replace-in-string' available")))
;;; XEmacs compatibility. Stolen from ibuffer.el
(if (fboundp 'propertize)
@@ -91,6 +107,35 @@ properties to add to the result."
(t
(error "No `cancel-timer' function found")))
+(defun jabber-concat-rosters ()
+ "Concatenate the rosters of all connected accounts."
+ (apply #'append
+ (mapcar
+ (lambda (jc)
+ (plist-get (fsm-get-state-data jc) :roster))
+ jabber-connections)))
+
+(defun jabber-connection-jid (jc)
+ "Return the full JID of the given connection."
+ (let ((sd (fsm-get-state-data jc)))
+ (concat (plist-get sd :username) "@"
+ (plist-get sd :server) "/"
+ (plist-get sd :resource))))
+
+(defun jabber-connection-bare-jid (jc)
+ "Return the bare JID of the given connection."
+ (let ((sd (fsm-get-state-data jc)))
+ (concat (plist-get sd :username) "@"
+ (plist-get sd :server))))
+
+(defun jabber-find-active-connection (dead-jc)
+ "Given a dead connection, find an active connection to the same account.
+Return nil if none found."
+ (let ((jid (jabber-connection-bare-jid dead-jc)))
+ (dolist (jc jabber-connections)
+ (when (string= jid (jabber-connection-bare-jid jc))
+ (return jc)))))
+
(defun jabber-jid-username (string)
"return the username portion of a JID, or nil if no username"
(when (string-match "\\(.*\\)@.*\\(/.*\\)?" string)
@@ -134,10 +179,9 @@ properties to add to the result."
;; XXX: "downcase" is poor man's nodeprep. See XMPP CORE.
(intern (downcase (jabber-jid-user string)) jabber-jid-obarray)))
-(defun jabber-my-jid-p (jid)
- "Return non-nil if the specified JID is equal to the user's JID, modulo resource."
- (equal (jabber-jid-user jid)
- (concat jabber-username "@" jabber-server)))
+(defun jabber-my-jid-p (jc jid)
+ "Return non-nil if the specified JID is in jabber-account-list (modulo resource). JC arg placed for compatibility and may be removed in future."
+ (member (jabber-jid-user jid) (mapcar (lambda (x) (jabber-jid-user (car x))) jabber-account-list)))
(defun jabber-read-jid-completing (prompt &optional subset require-match default resource)
"read a jid out of the current roster from the minibuffer.
@@ -163,9 +207,9 @@ bare-or-muc Turn full JIDs to bare ones, except for in MUC"
(completion-ignore-case t)
(jid-completion-table (mapcar #'(lambda (item)
(cons (symbol-name item) item))
- (or subset *jabber-roster*)))
+ (or subset (jabber-concat-rosters))))
chosen)
- (dolist (item (or subset *jabber-roster*))
+ (dolist (item (or subset (jabber-concat-rosters)))
(if (get item 'name)
(push (cons (get item 'name) item) jid-completion-table)))
;; if the default is not in the allowed subset, it's not a good default
@@ -212,15 +256,71 @@ bare-or-muc Turn full JIDs to bare ones, except for in MUC"
(format "(default %s) " node-at-point)))
node-at-point)))
-(defun jabber-read-passwd (&optional prompt)
- "Read Jabber password, either from customized variable or from minibuffer.
-See `jabber-password'."
- (if jabber-password
- ;; Need to copy the password, as sasl.el wants to erase it. The
- ;; variable jabber-password is a high-convenience low-security
- ;; alternative anyway.
- (copy-sequence jabber-password)
- (read-passwd (or prompt "Jabber password: "))))
+(defun jabber-password-key (bare-jid)
+ "Construct key for `password' library from BARE-JID."
+ (concat "xmpp:" bare-jid))
+
+(defun jabber-read-password (bare-jid)
+ "Read Jabber password from minibuffer."
+ (let ((prompt (format "Jabber password for %s: " bare-jid)))
+ (if (fboundp 'password-read)
+ ;; Need to copy the password, as sasl.el wants to erase it.
+ (copy-sequence
+ (password-read prompt (jabber-password-key bare-jid)))
+ (read-passwd prompt))))
+
+(defun jabber-cache-password (bare-jid password)
+ "Cache PASSWORD for BARE-JID."
+ (when (fboundp 'password-cache-add)
+ (password-cache-add (jabber-password-key bare-jid) password)))
+
+(defun jabber-uncache-password (bare-jid)
+ "Uncache cached password for BARE-JID.
+Useful if the password proved to be wrong."
+ (interactive (list (jabber-jid-user
+ (completing-read "Forget password of account: " jabber-account-list))))
+ (when (fboundp 'password-cache-remove)
+ (password-cache-remove (jabber-password-key bare-jid))))
+
+(defun jabber-read-account (&optional always-ask)
+ "Ask for which connected account to use.
+If ALWAYS-ASK is nil and there is only one account, return that
+account."
+ (let ((completions
+ (mapcar (lambda (c)
+ (cons
+ (jabber-connection-bare-jid c)
+ c))
+ jabber-connections)))
+ (cond
+ ((null jabber-connections)
+ (error "Not connected to Jabber"))
+ ((and (null (cdr jabber-connections)) (not always-ask))
+ ;; only one account
+ (car jabber-connections))
+ (t
+ (or
+ ;; if there is a jabber-account property at point,
+ ;; present it as default value
+ (cdr (assoc (let ((at-point (get-text-property (point) 'jabber-account)))
+ (when (and at-point
+ (memq at-point jabber-connections))
+ (jabber-connection-bare-jid at-point))) completions))
+ (let* ((default
+ (or
+ ;; if the buffer is associated with a connection, use it
+ (when (and jabber-buffer-connection
+ (memq jabber-buffer-connection jabber-connections))
+ (jabber-connection-bare-jid jabber-buffer-connection))
+ ;; else, use the first connection in the list
+ (caar completions)))
+ (input (completing-read
+ (concat "Select Jabber account (default "
+ default
+ "): ")
+ completions nil t nil nil
+ default)))
+ (cdr (assoc input completions))))))))
(defun jabber-iq-query (xml-data)
"Return the query part of an IQ stanza.
@@ -306,7 +406,7 @@ TIME is in a format accepted by `format-time-string'."
(string-to-number (substring timezone 4 6))))))))
(encode-time second minute hour day month year timezone-seconds))))
-(defun jabber-report-success (xml-data context)
+(defun jabber-report-success (jc xml-data context)
"IQ callback reporting success or failure of the operation.
CONTEXT is a string describing the action."
(let ((type (jabber-xml-get-attribute xml-data 'type)))
@@ -427,19 +527,21 @@ See secton 9.3, Stanza Errors, of XMPP Core, and JEP-0086, Legacy Errors."
(cons 'xml-not-well-formed "XML not well formed"))
"String descriptions of XMPP stream errors")
+(defun jabber-stream-error-condition (error-xml)
+ "Return the condition of a <stream:error/> tag."
+ ;; as we don't know the node name of the condition, we have to
+ ;; search for it.
+ (dolist (node (jabber-xml-node-children error-xml))
+ (when (and (string= (jabber-xml-get-attribute node 'xmlns)
+ "urn:ietf:params:xml:ns:xmpp-streams")
+ (assq (jabber-xml-node-name node)
+ jabber-stream-error-messages))
+ (return (jabber-xml-node-name node)))))
+
(defun jabber-parse-stream-error (error-xml)
"Parse the given <stream:error/> tag and return a sting fit for human consumption."
(let ((text-node (car (jabber-xml-get-children error-xml 'text)))
- condition)
- ;; as we don't know the node name of the condition, we have to
- ;; search for it.
- (dolist (node (jabber-xml-node-children error-xml))
- (when (and (string= (jabber-xml-get-attribute node 'xmlns)
- "urn:ietf:params:xml:ns:xmpp-streams")
- (assq (jabber-xml-node-name node)
- jabber-stream-error-messages))
- (setq condition (jabber-xml-node-name node))
- (return)))
+ (condition (jabber-stream-error-condition error-xml)))
(concat (if condition (cdr (assq condition jabber-stream-error-messages))
"Unknown stream error")
(if (and text-node (stringp (car (jabber-xml-node-children text-node))))
@@ -507,17 +609,19 @@ See Info node `(jabber)XMPP URIs'."
(cond
;; Join an MUC.
((string= method "join")
- (jabber-groupchat-join jid (jabber-muc-read-my-nickname jid) t))
+ (jabber-groupchat-join
+ (jabber-read-account) jid (jabber-muc-read-my-nickname jid) t))
;; Register with a service.
((string= method "register")
- (jabber-get-register jid))
+ (jabber-get-register (jabber-read-account) jid))
;; Run an ad-hoc command
((string= method "command")
;; XXX: does the 'action' attribute make sense?
- (jabber-ahc-execute-command jid (cdr (assoc "node" args))))
+ (jabber-ahc-execute-command
+ (jabber-read-account) jid (cdr (assoc "node" args))))
;; Everything else: open a chat buffer.
(t
- (jabber-chat-with jid)))))
+ (jabber-chat-with (jabber-read-account) jid)))))
(defun url-xmpp (url)
"Handle XMPP URLs from internal Emacs functions."
@@ -525,6 +629,15 @@ See Info node `(jabber)XMPP URIs'."
;; url package might lose information.
(jabber-handle-uri (url-recreate-url url)))
+(defun string>-numerical (s1 s2)
+ "Return t if first arg string is more than second in numerical order."
+ (cond ((string= s1 s2) nil)
+ ((> (length s1) (length s2)) t)
+ ((< (length s1) (length s2)) nil)
+ ((< (string-to-number (substring s1 0 1)) (string-to-number (substring s2 0 1))) nil)
+ ((> (string-to-number (substring s1 0 1)) (string-to-number (substring s2 0 1))) t)
+ (t (string>-numerical (substring s1 1) (substring s2 1)))))
+
(provide 'jabber-util)
;;; arch-tag: cfbb73ac-e2d7-4652-a08d-dc789bcded8a
diff --git a/jabber-vcard-avatars.el b/jabber-vcard-avatars.el
index e44a9f9..8d259a9 100644
--- a/jabber-vcard-avatars.el
+++ b/jabber-vcard-avatars.el
@@ -1,6 +1,6 @@
;;; jabber-vcard-avatars.el --- Avatars by JEP-0153
-;; Copyright (C) 2006 Magnus Henoch
+;; Copyright (C) 2006, 2007 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
@@ -38,11 +38,13 @@
:group 'jabber-avatar
:type 'boolean)
-(defvar jabber-vcard-avatars-current-hash nil
- "SHA1 hash of avatar currently published through presence.")
+(defvar jabber-vcard-avatars-current-hash
+ (make-hash-table :test 'equal)
+ "For each connection, SHA1 hash of current avatar.
+Keys are full JIDs.")
(add-to-list 'jabber-presence-chain 'jabber-vcard-avatars-presence)
-(defun jabber-vcard-avatars-presence (xml-data)
+(defun jabber-vcard-avatars-presence (jc xml-data)
"Look for vCard avatar mark in <presence/> stanza."
;; Only look at ordinary presence
(when (and jabber-vcard-avatars-retrieve
@@ -57,35 +59,45 @@
;; Avatar is cached
(jabber-avatar-set from sha1-hash)
;; Avatar is not cached; retrieve it
- (jabber-vcard-avatars-fetch from))))))
+ (jabber-vcard-avatars-fetch jc from sha1-hash))))))
-(defun jabber-vcard-avatars-vcard (iq from)
+(defun jabber-vcard-avatars-fetch (jc who sha1-hash)
+ "Fetch WHO's vCard, and extract avatar."
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Fetch whose vCard avatar: ")))
+ (jabber-send-iq jc who "get" '(vCard ((xmlns . "vcard-temp")))
+ #'jabber-vcard-avatars-vcard (cons who sha1-hash)
+ #'ignore nil))
+
+(defun jabber-vcard-avatars-vcard (jc iq closure)
"Get the photo from the vCard, and set the avatar."
- (let ((photo (assq 'PHOTO (jabber-vcard-parse (jabber-iq-query iq)))))
+ (let ((from (car closure))
+ (sha1-hash (cdr closure))
+ (photo (assq 'PHOTO (jabber-vcard-parse (jabber-iq-query iq)))))
(if photo
(let ((avatar (jabber-avatar-from-base64-string (nth 2 photo)
(nth 1 photo))))
+ (unless (string= sha1-hash (avatar-sha1-sum avatar))
+ (when jabber-avatar-verbose
+ (message "%s's avatar should have SHA1 sum %s, but has %s"
+ (jabber-jid-displayname from)
+ sha1-hash
+ (avatar-sha1-sum avatar))))
(jabber-avatar-cache avatar)
(jabber-avatar-set from avatar))
(jabber-avatar-set from nil))))
-(defun jabber-vcard-avatars-fetch (who)
- "Fetch WHO's vCard, and extract avatar."
- (interactive (list (jabber-read-jid-completing "Fetch whose vCard avatar: ")))
- (jabber-send-iq who "get" '(vCard ((xmlns . "vcard-temp")))
- #'jabber-vcard-avatars-vcard who
- #'ignore nil))
-
-(add-hook 'jabber-post-connect-hook 'jabber-vcard-avatars-find-current)
-(defun jabber-vcard-avatars-find-current ()
+(add-hook 'jabber-post-connect-hooks 'jabber-vcard-avatars-find-current)
+(defun jabber-vcard-avatars-find-current (jc)
"Request our own vCard, to find hash of avatar."
(when jabber-vcard-avatars-publish
- (jabber-send-iq nil "get" '(vCard ((xmlns . "vcard-temp")))
+ (jabber-send-iq jc nil "get" '(vCard ((xmlns . "vcard-temp")))
#'jabber-vcard-avatars-find-current-1 t
#'jabber-vcard-avatars-find-current-1 nil)))
-(defun jabber-vcard-avatars-find-current-1 (xml-data success)
+(defun jabber-vcard-avatars-find-current-1 (jc xml-data success)
(jabber-vcard-avatars-update-current
+ jc
(and success
(let ((photo (assq 'PHOTO (jabber-vcard-parse (jabber-iq-query xml-data)))))
(when photo
@@ -93,24 +105,30 @@
(nth 1 photo))))
(avatar-sha1-sum avatar)))))))
-(defun jabber-vcard-avatars-update-current (new-hash)
- (let ((old-hash jabber-vcard-avatars-current-hash))
+(defun jabber-vcard-avatars-update-current (jc new-hash)
+ (let ((old-hash (gethash
+ (jabber-connection-bare-jid jc)
+ jabber-vcard-avatars-current-hash)))
(when (not (string= old-hash new-hash))
- (setq jabber-vcard-avatars-current-hash new-hash)
- (jabber-vcard-avatars-send-presence))))
+ (puthash (jabber-connection-bare-jid jc)
+ new-hash jabber-vcard-avatars-current-hash)
+ (jabber-vcard-avatars-send-presence jc))))
-(defun jabber-vcard-avatars-send-presence ()
+(defun jabber-vcard-avatars-send-presence (jc)
(jabber-send-presence *jabber-current-show* *jabber-current-status* *jabber-current-priority*))
(add-to-list 'jabber-presence-element-functions 'jabber-vcard-avatars-presence-element)
-(defun jabber-vcard-avatars-presence-element ()
+(defun jabber-vcard-avatars-presence-element (jc)
(when jabber-vcard-avatars-publish
- (list
- `(x ((xmlns . "vcard-temp:x:update"))
- ;; if "not yet ready to advertise image", don't.
- ;; that is, we haven't yet checked what avatar we have.
- ,(when jabber-vcard-avatars-current-hash
- `(photo () ,jabber-vcard-avatars-current-hash))))))
+ (let ((hash (gethash
+ (jabber-connection-bare-jid jc)
+ jabber-vcard-avatars-current-hash)))
+ (list
+ `(x ((xmlns . "vcard-temp:x:update"))
+ ;; if "not yet ready to advertise image", don't.
+ ;; that is, we haven't yet checked what avatar we have.
+ ,(when hash
+ `(photo () ,hash)))))))
(provide 'jabber-vcard-avatars)
;; arch-tag: 3e50d460-8eae-11da-826c-000a95c2fcd0
diff --git a/jabber-vcard.el b/jabber-vcard.el
index 7386183..fd347da 100644
--- a/jabber-vcard.el
+++ b/jabber-vcard.el
@@ -1,6 +1,6 @@
;;; jabber-vcard.el --- vcards according to JEP-0054
-;; Copyright (C) 2005 Magnus Henoch
+;; Copyright (C) 2005, 2007 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
@@ -253,19 +253,20 @@ The top node should be the `vCard' node."
(add-to-list 'jabber-jid-info-menu
(cons "Request vcard" 'jabber-vcard-get))
-(defun jabber-vcard-get (jid)
+(defun jabber-vcard-get (jc jid)
"Request vcard from JID."
- (interactive (list (jabber-read-jid-completing "Request vcard from: " nil nil nil 'bare-or-muc)))
- (jabber-send-iq jid
+ (interactive (list (jabber-read-account)
+ (jabber-read-jid-completing "Request vcard from: " nil nil nil 'bare-or-muc)))
+ (jabber-send-iq jc jid
"get"
'(vCard ((xmlns . "vcard-temp")))
#'jabber-process-data #'jabber-vcard-display
#'jabber-process-data "Vcard request failed"))
-(defun jabber-vcard-edit ()
+(defun jabber-vcard-edit (jc)
"Edit your own vcard."
- (interactive)
- (jabber-send-iq nil
+ (interactive (list (jabber-read-account)))
+ (jabber-send-iq jc nil
"get"
'(vCard ((xmlns . "vcard-temp")))
#'jabber-vcard-do-edit nil
@@ -325,7 +326,7 @@ The top node should be the `vCard' node."
(PCODE . "Post code")
(CTRY . "Country")))
-(defun jabber-vcard-display (xml-data)
+(defun jabber-vcard-display (jc xml-data)
"Display received vcard."
(let ((parsed (jabber-vcard-parse (jabber-iq-query xml-data))))
(dolist (simple-field jabber-vcard-fields)
@@ -400,12 +401,14 @@ The top node should be the `vCard' node."
(insert "\n"))
(error (insert "Couldn't display photo\n")))))))
-(defun jabber-vcard-do-edit (xml-data closure-data)
+(defun jabber-vcard-do-edit (jc xml-data closure-data)
(let ((parsed (jabber-vcard-parse (jabber-iq-query xml-data)))
start-position)
(with-current-buffer (get-buffer-create "Edit vcard")
(jabber-init-widget-buffer nil)
+ (setq jabber-buffer-connection jc)
+
(setq start-position (point))
(dolist (simple-field jabber-vcard-fields)
@@ -533,13 +536,14 @@ The top node should be the `vCard' node."
(mapcar (lambda (entry)
(cons (car entry) (widget-value (cdr entry))))
jabber-widget-alist))))
- (jabber-send-iq nil
+ (jabber-send-iq jabber-buffer-connection nil
"set"
to-publish
#'jabber-report-success "Changing vCard"
#'jabber-report-success "Changing vCard")
(when (bound-and-true-p jabber-vcard-avatars-publish)
(jabber-vcard-avatars-update-current
+ jabber-buffer-connection
(and jabber-vcard-photo (avatar-sha1-sum jabber-vcard-photo))))))
(provide 'jabber-vcard)
diff --git a/jabber-version.el b/jabber-version.el
index 8846ff0..f641ad3 100644
--- a/jabber-version.el
+++ b/jabber-version.el
@@ -22,23 +22,25 @@
(require 'jabber-iq)
(require 'jabber-util)
-(defconst jabber-version "0.7.1"
+(defconst jabber-version "0.7.1-dev1"
"version returned to those who query us")
(add-to-list 'jabber-jid-info-menu
(cons "Request software version" 'jabber-get-version))
-(defun jabber-get-version (to)
+(defun jabber-get-version (jc to)
"Request software version"
- (interactive (list (jabber-read-jid-completing "Request version of: " nil nil nil 'full)))
+ (interactive (list
+ (jabber-read-account)
+ (jabber-read-jid-completing "Request version of: " nil nil nil 'full)))
;; XXX: you will not get any result unless you add the resource to the JID.
- (jabber-send-iq to
+ (jabber-send-iq jc to
"get"
'(query ((xmlns . "jabber:iq:version")))
#'jabber-process-data #'jabber-process-version
#'jabber-process-data "Version request failed"))
;; called by jabber-process-data
-(defun jabber-process-version (xml-data)
+(defun jabber-process-version (jc xml-data)
"Handle results from jabber:iq:version requests."
(let ((query (jabber-iq-query xml-data)))
@@ -49,7 +51,7 @@
(add-to-list 'jabber-iq-get-xmlns-alist (cons "jabber:iq:version" 'jabber-return-version))
(add-to-list 'jabber-advertised-features "jabber:iq:version")
-(defun jabber-return-version (xml-data)
+(defun jabber-return-version (jc xml-data)
"Return client version as defined in JEP-0092. Sender and ID are
determined from the incoming packet passed in XML-DATA."
;; Things we might check: does this iq message really have type='get' and
@@ -57,7 +59,7 @@ determined from the incoming packet passed in XML-DATA."
;; Then again, jabber-process-iq should take care of that.
(let ((to (jabber-xml-get-attribute xml-data 'from))
(id (jabber-xml-get-attribute xml-data 'id)))
- (jabber-send-iq to "result"
+ (jabber-send-iq jc to "result"
`(query ((xmlns . "jabber:iq:version"))
(name () "jabber.el")
(version () ,jabber-version)
diff --git a/jabber-widget.el b/jabber-widget.el
index d706339..9c31baf 100644
--- a/jabber-widget.el
+++ b/jabber-widget.el
@@ -1,7 +1,7 @@
;; jabber-widget.el - display various kinds of forms
+;; Copyright (C) 2003, 2004, 2007 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -91,8 +91,9 @@
;; better way.
(rename-uniquely))
-(defun jabber-render-register-form (query)
- "Display widgets from <query/> element in jabber:iq:{register,search} namespace."
+(defun jabber-render-register-form (query &optional default-username)
+ "Display widgets from <query/> element in jabber:iq:{register,search} namespace.
+DEFAULT-USERNAME is the default value for the username field."
(make-local-variable 'jabber-widget-alist)
(setq jabber-widget-alist nil)
(make-local-variable 'jabber-form-type)
@@ -127,10 +128,9 @@
;; Special case: when registering a new account, the default
;; username is the one specified in jabber-username. Things
;; will break if the user changes that name, though...
- (let ((default-value (if (and jabber-register-p
- (eq (jabber-xml-node-name field) 'username))
- jabber-username
- "")))
+ (let ((default-value (or (when (eq (jabber-xml-node-name field) 'username)
+ default-username)
+ "")))
(setq jabber-widget-alist
(cons
(cons (car entry)
diff --git a/jabber-wmii.el b/jabber-wmii.el
new file mode 100644
index 0000000..b5df044
--- /dev/null
+++ b/jabber-wmii.el
@@ -0,0 +1,58 @@
+;; jabber-wmii.el - emacs-jabber interface to wmii
+
+;; Copyright (C) 2007 - Detlev Zundel - dzu@gnu.org
+
+;; This file is a part of jabber.el.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+(eval-when-compile (require 'jabber-alert))
+
+(defvar jabber-wmii-color "#ffffff #335577 #447799"
+ "Color specification as needed by the wmii window manager for the jabber alert messages.")
+
+(defvar jabber-wmii-reset-time "20 sec"
+ "If non-nil time to reset wmii message. If nil the message has to be cleared by other means, i.e. from wmiirc.")
+
+(defvar jabber-wmii-timer nil
+ "Timer to clear wmii message.")
+
+(defun jabber-wmii-clear ()
+ "Clear any previous message output through wmii window manager."
+ (condition-case e
+ (call-process "wmiir" nil nil nil "remove" "/rbar/jabber")
+ (error nil)))
+
+(defun jabber-wmii-message (msg)
+ "Show MSG in wmii."
+ (when jabber-wmii-timer
+ (cancel-timer jabber-wmii-timer))
+ (let ((tmp (make-temp-file temporary-file-directory)))
+ (with-temp-file tmp
+ (insert jabber-wmii-color " " msg))
+ ;; Possible errors include not finding the wmiir binary, and
+ ;; too many pipes open because of message flood.
+ (condition-case e
+ (call-process "wmiir" tmp nil nil "create" "/rbar/jabber")
+ (error nil))
+ (delete-file tmp))
+ (when jabber-wmii-reset-time
+ (setq jabber-wmii-timer
+ (run-at-time jabber-wmii-reset-time nil 'jabber-wmii-clear))))
+
+(define-jabber-alert wmii "Show a message through the wmii window manager."
+ 'jabber-wmii-message)
+
+(provide 'jabber-wmii)
diff --git a/jabber-xmessage.el b/jabber-xmessage.el
index f15334d..814593a 100644
--- a/jabber-xmessage.el
+++ b/jabber-xmessage.el
@@ -1,5 +1,6 @@
;; jabber-xmessage.el - emacs-jabber interface to xmessage
+;; Copyright (C) 2008 - Magnus Henoch
;; Copyright (C) 2005 - Mario Domenech Goulart
;; This file is a part of jabber.el.
@@ -18,10 +19,22 @@
;; along with this program; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+(eval-when-compile (require 'jabber-alert))
+
+(defcustom jabber-xmessage-timeout 15
+ "Timeout in seconds for xmessage alerts.
+Set this to nil to have no timeout."
+ :type '(choice (integer :tag "Seconds")
+ (const :tag "No timeout" nil))
+ :group 'jabber-alerts)
+
(defun jabber-xmessage-display-message (message)
"Displays MESSAGE using the xmessage program."
- (let ((process-connection-type nil))
- (start-process "xmessage" nil "xmessage" message)))
+ (let* ((process-connection-type nil)
+ (timeout-args (when jabber-xmessage-timeout
+ (list "-timeout" (number-to-string jabber-xmessage-timeout))))
+ (args (append timeout-args (list message))))
+ (apply 'start-process "xmessage" nil "xmessage" args)))
(define-jabber-alert xmessage "Display a message using the xmessage program."
'jabber-xmessage-display-message)
diff --git a/jabber-xml.el b/jabber-xml.el
index a81df65..a3dd89c 100644
--- a/jabber-xml.el
+++ b/jabber-xml.el
@@ -1,7 +1,7 @@
;; jabber-xml.el - XML functions
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; This file is a part of jabber.el.
@@ -102,8 +102,12 @@ tag with value nil.
The version of `sgml-skip-tag-forward' in Emacs 21 isn't good
enough for us."
(skip-chars-forward "^<")
- (if (not (looking-at "<\\([^ \t\n/>]+\\)\\([ \t\n]+[^=]+='[^']*'\\|[ \t\n]+[^=]+=\"[^\"]*\"\\)*"))
- (throw 'unfinished nil)
+ (cond
+ ((looking-at "<!\\[CDATA\\[")
+ (if (search-forward "]]>" nil t)
+ (goto-char (match-end 0))
+ (throw 'unfinished nil)))
+ ((looking-at "<\\([^ \t\n/>]+\\)\\([ \t\n]+[^=]+='[^']*'\\|[ \t\n]+[^=]+=\"[^\"]*\"\\)*")
(let ((node-name (match-string 1)))
(goto-char (match-end 0))
(cond
@@ -119,7 +123,9 @@ enough for us."
(goto-char (match-end 0))
t)
(t
- (throw 'unfinished nil))))))
+ (throw 'unfinished nil)))))
+ (t
+ (throw 'unfinished nil))))
(defsubst jabber-xml-node-name (node)
"Return the tag associated with NODE.
@@ -158,12 +164,18 @@ CHILD-NAME should be a lower case symbol."
(defsubst jabber-xml-get-attribute (node attribute)
"Get from NODE the value of ATTRIBUTE.
Return nil if the attribute was not found."
- (xml-get-attribute-or-nil node attribute))
+ (when (consp node)
+ (xml-get-attribute-or-nil node attribute)))
(defsubst jabber-xml-get-attribute (node attribute)
"Get from NODE the value of ATTRIBUTE.
Return nil if the attribute was not found."
- (let ((result (xml-get-attribute node attribute)))
- (and (> (length result) 0) result)))))
+ (when (consp node)
+ (let ((result (xml-get-attribute node attribute)))
+ (and (> (length result) 0) result))))))
+
+(defsubst jabber-xml-get-xmlns (node)
+ "Get \"xmlns\" attribute of NODE, or nil if not present."
+ (jabber-xml-get-attribute node 'xmlns))
(defun jabber-xml-path (xml-data path)
"Find sub-node of XML-DATA according to PATH.
diff --git a/jabber.el b/jabber.el
index 3ab9387..86bc72f 100644
--- a/jabber.el
+++ b/jabber.el
@@ -1,7 +1,7 @@
;; jabber.el - a minimal jabber client
+;; Copyright (C) 2003, 2004, 2007, 2008 - Magnus Henoch - mange@freemail.hu
;; Copyright (C) 2002, 2003, 2004 - tom berger - object@intelectronica.net
-;; Copyright (C) 2003, 2004 - Magnus Henoch - mange@freemail.hu
;; SSL - Support, mostly inspired by Gnus
;; Copyright (C) 2005 - Georg Lehner - jorge@magma.com.ni
@@ -30,25 +30,62 @@
(defgroup jabber nil "Jabber instant messaging"
:group 'applications)
-(defcustom jabber-username "emacs"
- "jabber username (user part of JID)"
- :type 'string
- :group 'jabber)
-
-(defcustom jabber-server "magaf.org"
- "jabber server (domain part of JID)"
- :type 'string
- :group 'jabber)
-
-(defcustom jabber-password nil
- "jabber password"
- :type '(radio (const :tag "Prompt for password" nil)
- (string :tag "Save password in .emacs"))
- :group 'jabber)
-
-(defcustom jabber-resource "emacs"
- "jabber resource"
- :type 'string
+;;;###autoload
+(defcustom jabber-account-list nil
+ "List of Jabber accounts.
+Each element of the list is a cons cell describing a Jabber account,
+where the car is a JID and the CDR is an alist.
+
+JID is a full Jabber ID string (e.g. foo@bar.tld). You can also
+specify the resource (e.g. foo@bar.tld/emacs).
+The following keys can be present in the alist:
+:password is a string to authenticate ourself against the server.
+It can be empty.
+:network-server is a string identifying the address to connect to,
+if it's different from the server part of the JID.
+:port is the port to use (default depends on connection type).
+:connection-type is a symbol. Valid symbols are `starttls',
+`network' and `ssl'.
+
+Only JID is mandatory. The rest can be guessed at run-time.
+
+Examples:
+
+Two accounts without any special configuration:
+\((\"foo@example.com\") (\"bar@example.net\"))
+
+One disabled account with a non-standard port:
+\((\"romeo@montague.net\" (:port . 5242) (:disabled . t)))
+
+If you don't have SRV and STARTTLS capabilities in your Emacs,
+configure a Google Talk account like this:
+\((\"username@gmail.com\"
+ (:network-server . \"talk.google.com\")
+ (:connection-type . ssl)))"
+ :type '(repeat
+ (cons :tag "Account information"
+ (string :tag "JID")
+ (set :format "%v"
+ (cons :format "%v"
+ (const :format "" :disabled)
+ (const :tag "Disabled" t))
+ (cons :format "%v"
+ (const :format "" :password)
+ (string :tag "Password"))
+ (cons :format "%v"
+ (const :format "" :network-server)
+ (string :tag "Network server"))
+ (cons :format "%v"
+ (const :format "" :port)
+ (integer :tag "Port" 5222))
+ (cons :format "%v"
+ (const :format "" :connection-type)
+ (choice :tag "Connection type"
+ ;; XXX: detect whether we have STARTTLS? option
+ ;; for enforcing encryption?
+ (const :tag "STARTTLS" starttls)
+ (const :tag "Unencrypted" network)
+ (const :tag "Legacy SSL/TLS" ssl))))))
:group 'jabber)
(defcustom jabber-default-show ""
@@ -70,11 +107,6 @@
:type 'integer
:group 'jabber)
-(defcustom jabber-nickname jabber-username
- "jabber nickname, used in chat buffer prompts and as default groupchat nickname."
- :type 'string
- :group 'jabber)
-
;;; guess internal dependencies!
(require 'jabber-util)
(require 'jabber-menu)
@@ -93,6 +125,7 @@
(require 'jabber-search)
(require 'jabber-browse)
(require 'jabber-muc)
+(require 'jabber-muc-nick-completion)
(require 'jabber-version)
(require 'jabber-ahc-presence)
(require 'jabber-modeline)
@@ -101,44 +134,35 @@
(require 'jabber-activity)
(require 'jabber-vcard)
(require 'jabber-events)
+(require 'jabber-chatstates)
(require 'jabber-vcard-avatars)
(require 'jabber-autoaway)
(require 'jabber-time)
+(require 'jabber-truncate)
(require 'jabber-ft-client)
(require 'jabber-ft-server)
(require 'jabber-socks5)
-;; XXX: automate this some time
-(autoload 'jabber-export-roster "jabber-export"
- "Create buffer from which roster can be exported to a file."
- t)
-(autoload 'jabber-import-roster "jabber-export"
- "Create buffer for roster import from FILE."
- t)
-(autoload 'jabber-compose "jabber-compose"
- "Create a buffer for composing a Jabber message."
- t)
-(autoload 'jabber-private-get "jabber-private"
- "Retrieve an item from private XML storage.
-The item to retrieve is identified by NODE-NAME (a symbol) and
-NAMESPACE (a string).
-On success, SUCCESS-CALLBACK is called with the retrieved XML fragment.
-On error, ERROR-CALLBACK is called with the entire IQ result."
- nil)
-(autoload 'jabber-private-set "jabber-private"
- "Store FRAGMENT in private XML storage.
-SUCCESS-CALLBACK, SUCCESS-CLOSURE-DATA, ERROR-CALLBACK and
-ERROR-CLOSURE-DATA are used as in `jabber-send-iq'."
- nil)
-
-(defvar *jabber-current-status* ""
+;; External notifiers
+(require 'jabber-screen)
+(require 'jabber-ratpoison)
+(require 'jabber-sawfish)
+(require 'jabber-festival)
+(require 'jabber-xmessage)
+(require 'jabber-wmii)
+(require 'jabber-osd)
+
+(load "jabber-autoloads")
+
+
+(defvar *jabber-current-status* nil
"the users current presence staus")
-(defvar *jabber-current-show* ""
+(defvar *jabber-current-show* nil
"the users current presence show")
-(defvar *jabber-current-priority* 10
+(defvar *jabber-current-priority* nil
"the user's current priority")
(defvar *jabber-status-history* nil
@@ -190,11 +214,13 @@ ERROR-CLOSURE-DATA are used as in `jabber-send-iq'."
(nil . "Offline"))
"Mapping from presence types to readable strings")
+;;;###autoload
(defun jabber-customize ()
"customize jabber options"
(interactive)
(customize-group 'jabber))
+;;;###autoload
(defun jabber-info ()
"open jabber.el manual"
(interactive)
diff --git a/jabber.info b/jabber.info
index c219b2b..90866d1 100644
--- a/jabber.info
+++ b/jabber.info
@@ -1,13 +1,14 @@
-This is jabber.info, produced by makeinfo version 4.7 from jabber.texi.
+This is ./jabber.info, produced by makeinfo version 4.7 from
+./jabber.texi.
INFO-DIR-SECTION Emacs
START-INFO-DIR-ENTRY
* jabber.el: (jabber). Emacs Jabber client
END-INFO-DIR-ENTRY
- This manual is for jabber.el, version 0.7.1.
+ This manual is for jabber.el, version 0.8.
- Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
+ Copyright (C) 2004, 2005, 2006, 2007, 2008 Magnus Henoch, Tom Berger.
Permission is granted to make and distribute verbatim copies or
modified versions of this manual, provided the copyright notice and
@@ -19,9 +20,9 @@ File: jabber.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
jabber.el manual
****************
-This manual is for jabber.el, version 0.7.1.
+This manual is for jabber.el, version 0.8.
- Copyright (C) 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
+ Copyright (C) 2004, 2005, 2006, 2007, 2008 Magnus Henoch, Tom Berger.
Permission is granted to make and distribute verbatim copies or
modified versions of this manual, provided the copyright notice and
@@ -40,7 +41,7 @@ This manual is for jabber.el, version 0.7.1.
* Time queries::
* Useful features::
* Message history::
-* Message events::
+* Typing notifications::
* Roster import and export::
* XMPP URIs::
* Customization::
@@ -63,13 +64,13 @@ on the open-protocol instant messaging network Jabber, please visit
As a Jabber client, jabber.el is mostly just a face in the crowd,
except that it uses buffers where GUI clients have windows. There is a
roster buffer, and to chat with someone you open a chat buffer, and
-there are browse buffers (increasingly inexactly named) for interaction
-with servers and services. Then again, jabber.el delivers excellent
-console performance and customizable hooks (if you have speech
-synthesizer software, hook it up to your presence alerts).
+there are buffers for interaction with servers and services. Then
+again, jabber.el delivers excellent console performance and
+customizable hooks (if you have speech synthesizer software, hook it up
+to your presence alerts).
- jabber.el does not yet support GPG, sending and receiving roster
-items, and various other things.
+ jabber.el does not yet support PGP encryption, sending and receiving
+roster items, and various other things.
* Menu:
@@ -81,12 +82,21 @@ File: jabber.info, Node: Contact, Prev: Introduction, Up: Introduction
1.1 Contact
===========
-jabber.el is developed by Tom Berger (e-mail
-<object@intellectronica.net>, JID `object@jabber.org.uk') and Magnus
-Henoch (e-mail <mange@freemail.hu>, JID
-`legoscia@jabber.cd.chalmers.se'). There is a web page at
-`http://intellectronica.net/emacs-jabber/', and a Sourceforge project
-page at `http://sourceforge.net/projects/emacs-jabber'.
+ * There is a web page at `http://emacs-jabber.sf.net/'.
+
+ * There is a Sourceforge project page at
+ `http://sourceforge.net/projects/emacs-jabber', with bug and patch
+ trackers.
+
+ * There is a mailing list:
+ `mailto:emacs-jabber-general@lists.sourceforge.net',
+ `https://lists.sourceforge.net/lists/listinfo/emacs-jabber-general',
+ `http://dir.gmane.org/gmane.emacs.jabber.general'
+
+ * There is a chat room, `jabber.el@conference.jabber.se'. If you
+ have successfully connected, you can join it by typing `M-x
+ jabber-groupchat-join' and entering the address.
+

File: jabber.info, Node: Basic operation, Next: Groupchat, Prev: Introduction, Up: Top
@@ -99,12 +109,18 @@ jabber.el. If you have used Jabber before and are familiar with the
terminology, you might find it a bit too basic -- in that case, just
skim it, making sure to pick up the commands mentioned.
+ I'll assume that you have already successfully installed jabber.el;
+if not, consult the `README' file. Also, make sure you have `(require
+'jabber)' or `(load "jabber-autoloads")' in your `.emacs'.
+
There are a handful of global keybindings for common commands. They
start with `C-x C-j', and you can get a list of them by typing `C-x C-j
C-h'.
* Menu:
+* Do you have a Jabber account?::
+* Registering an account::
* Connecting::
* Chatting::
* Presence::
@@ -112,46 +128,67 @@ C-h'.
* Roster buffer::

-File: jabber.info, Node: Connecting, Next: Chatting, Prev: Basic operation, Up: Basic operation
+File: jabber.info, Node: Do you have a Jabber account?, Next: Registering an account, Prev: Basic operation, Up: Basic operation
-2.1 Connecting
-==============
+2.1 Do you have a Jabber account?
+=================================
+
+Jabber has become rather popular as an instant messaging technology.
+Several sites use it, but often not under the names "Jabber" or "XMPP".
+Examples:
+
+ * Google Talk uses Jabber. If you have a Gmail address, you can use
+ it as a Jabber ID. *Note Account settings::, for Google-specific
+ configuration.
-I'll assume that you have already successfully installed jabber.el; if
-not, consult the `README' file. Also, make sure you have `(require
-'jabber)' in your `.emacs'.
+ * LJ Talk (of Livejournal) uses Jabber. Your Jabber ID is
+ ``ljusername'@livejournal.com'.
- Now, type `M-x jabber-customize'. This brings up a customize buffer
-for jabber.el. The most important variables to customize are
-`jabber-username' and `jabber-server'.(1) Save your changes, and type
-`M-x jabber-connect' to connect.
+
+File: jabber.info, Node: Registering an account, Next: Connecting, Prev: Do you have a Jabber account?, Up: Basic operation
+
+2.2 Registering an account
+==========================
+
+TBD
If you do not yet have a Jabber account, you can register one. Enter
-your desired username for `jabber-username' and the server you wish to
-use for `jabber-server', save, and type `C-u M-x jabber-connect' or
-`C-u C-x C-j C-c'. If the server supports in-band registration, you
-will be presented with a registration form to fill out and send. There
-the username you chose will be prefilled. Don't change it, otherwise
-jabber.el will be confused.
+your desired username and the server you wish to use in
+`jabber-account-list', save, and type `C-u M-x jabber-connect'. If the
+server supports in-band registration, you will be presented with a
+registration form to fill out and send. There the username you chose
+will be prefilled. Don't change it, otherwise jabber.el will be
+confused.
- If you successfully connect, jabber.el will download your roster and
-display it in a buffer called `*-jabber-*'.
+
+File: jabber.info, Node: Connecting, Next: Chatting, Prev: Registering an account, Up: Basic operation
+
+2.3 Connecting
+==============
+
+Now, type `C-x C-j C-c' and enter your JID and password. If you
+successfully connect, jabber.el will download your roster and display it
+in a buffer called `*-jabber-*'.
By default, you will appear as "online" to your contacts. To change
this to e.g. "away", type `M-x jabber-send-presence' or `C-x C-j C-p'.
*Note Presence::, for more information.
- To disconnect, type `M-x jabber-disconnect' or `C-x C-j C-d'.
+ To disconnect, type `M-x jabber-disconnect' or `C-x C-j C-d'. Use
+`M-x jabber-disconnect-one' to disconnect just one account (or just
+type `C-u C-x C-j C-d').
- ---------- Footnotes ----------
-
- (1) *Note Connection settings::, for other things you might have to
-change.
+ If you don't want to type your JID every time you connect, you can
+save it in the variable `jabber-account-list'. *Note Account
+settings::. If you configure more than one account, all of them will be
+connected when you type `C-x C-j C-c', as that key is bound to
+`jabber-connect-all'. To connect only one account, possibly one that's
+not in your list, type `M-x jabber-connect'.

File: jabber.info, Node: Chatting, Next: Presence, Prev: Connecting, Up: Basic operation
-2.2 Chatting
+2.4 Chatting
============
There are several ways to open a chat buffer. The shortest way is to
@@ -174,10 +211,14 @@ global keymap.
message at the end of the buffer, and hit `RET' to send it. To include
a newline in your message, use `C-j'.
+ When you receive a message from someone, you will see a red
+indicator in the mode line. You can click this indicator or type `C-x
+C-j C-l' to switch to the relevant buffer.
+

File: jabber.info, Node: Presence, Next: Presence subscription, Prev: Chatting, Up: Basic operation
-2.3 Presence
+2.5 Presence
============
"Presence" is the Jabber term for letting other people know that you
@@ -228,7 +269,7 @@ update.

File: jabber.info, Node: Presence subscription, Next: Roster buffer, Prev: Presence, Up: Basic operation
-2.4 Presence subscription
+2.6 Presence subscription
=========================
Having permission to view the presence status of a person is called
@@ -236,8 +277,8 @@ Having permission to view the presence status of a person is called
persons can be asymmetric.
When jabber.el receives a presence subscription request, it will
-present it to you in an alert requiring immediate response, and offer
-you to send a subscription request back to that person.
+present it to you in an chat buffer, and offer you to choose
+subscription mode and send a subscription request back to that person.
To request subscription to someone, type `M-x
jabber-send-subscription-request'. You will be prompted for the JID to
@@ -250,7 +291,7 @@ Roster menu or by typing `e' on a person in the roster buffer.

File: jabber.info, Node: Roster buffer, Prev: Presence subscription, Up: Basic operation
-2.5 The roster buffer
+2.7 The roster buffer
=====================
The roster buffer is called `*-jabber-*'. It simply contains a list of
@@ -279,6 +320,10 @@ to clients automatically.
presence changes (*note Presence alerts::). In that case, you need to
call `jabber-display-roster' manually.
+ Please note, that by default offline contacts showed in roster as any
+others. To hide them, you can use `o' in roster buffer. To permanently
+hide them, customize `jabber-show-offline-contacts' variable.
+
---------- Footnotes ----------
(1) For some reason, mouse menus don't work in XEmacs. Patches
@@ -293,6 +338,14 @@ File: jabber.info, Node: Groupchat, Next: Composing messages, Prev: Basic ope
The groupchat menu can be accessed by typing `C-c C-m' in the roster
buffer. You can also type the commands directly, as will be shown here.
+ Also, to save from repeating unnesesary typing you can press `Tab'
+key to complete nick of groupchat member, you a talking with. You can
+customize your form of personal talking in MUC
+(`jabber-muc-completion-delimiter') and form of personal talking to you
+(`jabber-muc-looks-personaling-symbols') - see "jabber-chat"
+customization group. Defaults are sane, so unlikely you could change
+this, but... it is Emacs!
+
To join a groupchat, type `M-x jabber-groupchat-join'. You will be
prompted for the groupchat to join, and your nickname in the groupchat.
This nickname doesn't need to have any correlation to your JID; in
@@ -329,30 +382,47 @@ affiliations.
* Menu:
* Automation::
+* Bookmarks::
* Invitations::
* Private messages::
* MUC Administration::

-File: jabber.info, Node: Automation, Next: Invitations, Prev: Groupchat, Up: Groupchat
+File: jabber.info, Node: Automation, Next: Bookmarks, Prev: Groupchat, Up: Groupchat
3.1 Automation
==============
-You can select a default nickname by setting `jabber-nickname'.
-Additionally, you can set different nicknames for different groups, by
-customizing `jabber-muc-default-nicknames'. There you specify the JID
-of the group, and your preferred nickname.
+You can select a default nickname by setting `jabber-account-list'
+(part of JID before `@'). Additionally, you can set different
+nicknames for different groups, by customizing
+`jabber-muc-default-nicknames'. There you specify the JID of the
+group, and your preferred nickname.
If you want to automatically join certain rooms when connecting, you
can set `jabber-muc-autojoin' to a list containing the JIDs of the
rooms you want to enter. To disable this feature, remove
`jabber-muc-autojoin' from `jabber-post-connect-hook'.
+ Please note, that `jabber-muc-default-nicknames' and
+`jabber-muc-autojoin' are machine-local. To make them available to any
+client on any machine, import them in your bookmarks. See *Note
+Bookmarks::.
+

-File: jabber.info, Node: Invitations, Next: Private messages, Prev: Automation, Up: Groupchat
+File: jabber.info, Node: Bookmarks, Next: Invitations, Prev: Automation, Up: Groupchat
-3.2 Invitations
+3.2 Bookmarks
+=============
+
+You can store your conference settings on server-side to make them
+available from any machine and client. Use `M-x jabber-edit-bookmarks'
+to edit server-side bookmarks.
+
+
+File: jabber.info, Node: Invitations, Next: Private messages, Prev: Bookmarks, Up: Groupchat
+
+3.3 Invitations
===============
You can invite someone to a groupchat with `M-x jabber-muc-invite'
@@ -369,7 +439,7 @@ to state the reason why you're not joining.

File: jabber.info, Node: Private messages, Next: MUC Administration, Prev: Invitations, Up: Groupchat
-3.3 Private messages
+3.4 Private messages
====================
You can open a private chat with a participant in a chat room with `M-x
@@ -385,14 +455,14 @@ sends a private message to you.

File: jabber.info, Node: MUC Administration, Prev: Private messages, Up: Groupchat
-3.4 Administration
+3.5 Administration
==================
Administration of a MUC room mostly consists of managing roles and
affiliations. Roles are temporary, and apply until the user leaves the
room. Affiliations are permanent, and based on JIDs.
-3.4.1 Roles
+3.5.1 Roles
-----------
If you have moderator privileges, you can change the role of a
@@ -416,7 +486,7 @@ obviously.
`none'
Not in room.
-3.4.2 Affiliations
+3.5.2 Affiliations
------------------
If you have admin or owner privileges, you can change the affiliation of
@@ -571,6 +641,9 @@ in the roster buffer, and if you call a function operating on a JID
while point is over a JID, that JID will be the default value, so you
don't have to type it or copy it yourself.
+ You can change browse buffer name creation template by customizing
+`jabber-browse-buffer-format' variable.
+
* Menu:
* Service discovery and browsing::
@@ -624,9 +697,9 @@ the password of your Jabber account, ask to register with your Jabber
server.
Please note that any passwords sent in this way will be sent in
-cleartext to your Jabber server, unless you have enabled SSL encryption
-(*note Connection settings::), and possibly sent in cleartext from your
-server to the server hosting the service.
+cleartext to your Jabber server, unless you have enabled SSL encryption,
+and possibly sent in cleartext from your server to the server hosting
+the service.
jabber.el will then request a registration form from that service.
If for some reason the service does not answer (maybe network problems,
@@ -674,7 +747,9 @@ and administering services (e.g. PyMSNt).
Currently, jabber.el uses ad-hoc commands for setting presence
remotely. If you realize that you forgot to set your client to "away"
-with a low priority, you can do it remotely.(1)
+with a low priority, you can do it remotely from any JID from
+`jabber-account-list'. So, you can add disabled JIDs in
+`jabber-account-list' to allow them control your presence.(1)
The commands for executing ad-hoc commands are available under the
Service menu, which is opened by typing `C-c C-s'.
@@ -730,7 +805,9 @@ Emacs can display images.
To disable retrieval of other people's avatars, set
`jabber-vcard-avatars-retrieve' to nil. To disable publishing of your
-own avatar, set `jabber-vcard-avatars-publish' to nil.
+own avatar, set `jabber-vcard-avatars-publish' to nil. To disable
+avatars in chat buffer header lines, set
+`jabber-chat-buffer-show-avatar' to nil.
Avatars are cached in the directory specified by
`jabber-avatar-cache-directory', by default `~/.jabber-avatars/'. The
@@ -769,6 +846,7 @@ interface and do other useful things.
* Autoaway::
* Modeline status::
* Keepalive::
+* Reconnecting::
* Tracking activity::
* Watch buddies::
* Spell checking::
@@ -800,7 +878,19 @@ activity in other programs.
If you are using the X Window System, you can use the xprintidle
(http://www.dtek.chalmers.se/~henoch/text/xprintidle.html) program.
Make sure that `jabber-xprintidle-program' is set to the correct file
-name. This uses the same method as XScreensaver to find your idle time.
+name. This uses the same method as XScreensaver
+(http://www.jwz.org/xscreensaver) to find your idle time.
+
+ If you use xscreensaver program, you can use
+"xscreensaver-emacs-jabber" perl-script for syncronize xscreensaver and
+jabber.el status. It is are simple perl-daemon that watch for
+xscreensaver status and set jabber.el's presence when needed. I.e.: its
+set XA presence when screen is blanked or locked (by hands or by idle
+timeout) and default presence when its unlocked/unblanked. To use it,
+just run "xscreensaver-emacs-jabber" after xscreensaver and make sure
+that your Emacs run in server mode (that you run (server-start) in init
+files. Alternativetily, you can add turn on and off server-mode by
+jabber.el's hooks).
If you are using Emacs on a GNU/Linux terminal, the function
`jabber-termatime-get-idle-time' is used by default.
@@ -823,7 +913,7 @@ the number of chatty, online, away, extended away, dnd, and offline
contacts, respectively.

-File: jabber.info, Node: Keepalive, Next: Tracking activity, Prev: Modeline status, Up: Useful features
+File: jabber.info, Node: Keepalive, Next: Reconnecting, Prev: Modeline status, Up: Useful features
10.3 Keepalive
==============
@@ -847,9 +937,23 @@ seconds).
respectively.

-File: jabber.info, Node: Tracking activity, Next: Watch buddies, Prev: Keepalive, Up: Useful features
+File: jabber.info, Node: Reconnecting, Next: Tracking activity, Prev: Keepalive, Up: Useful features
+
+10.4 Reconnecting
+=================
+
+Jabber.el support automatic reconnection to Jabber server(s) upon lost
+connection. By default it is off. To turn on, customize
+`jabber-auto-reconnect' variable. You will need `password.el' to fully
+use this feature. It may be found in recent Gnus (No Gnus) or
+downloaded and installed separately.
+
+ See also comments about password(s) in Custom's buffer help.
+
+
+File: jabber.info, Node: Tracking activity, Next: Watch buddies, Prev: Reconnecting, Up: Useful features
-10.4 Tracking activity
+10.5 Tracking activity
======================
When you're working on something important you might want to delay
@@ -884,7 +988,7 @@ based on `jabber-activity-jids', `jabber-activity-mode-string', and

File: jabber.info, Node: Watch buddies, Next: Spell checking, Prev: Tracking activity, Up: Useful features
-10.5 Watch buddies
+10.6 Watch buddies
==================
Sometimes you might be waiting for a certain person to come online, and
@@ -901,7 +1005,7 @@ it, type `M-x jabber-watch-remove'.

File: jabber.info, Node: Spell checking, Prev: Watch buddies, Up: Useful features
-10.6 Spell checking
+10.7 Spell checking
===================
You can activate spell checking in a chat buffer with `M-x
@@ -913,7 +1017,7 @@ what you receive or what you have already sent. You may want to add
Correcting Spelling: (emacs)Spelling.

-File: jabber.info, Node: Message history, Next: Message events, Prev: Useful features, Up: Top
+File: jabber.info, Node: Message history, Next: Typing notifications, Prev: Useful features, Up: Top
11 Message history
******************
@@ -954,15 +1058,28 @@ on. Although the example was presented with the per-contact history
file strategy, history rotation works for both per-contact and global
history logging strategies.
+ If you want also to truncate chat and muc buffer from growing too
+much, you can customize jabber-alert-message-hooks and
+jabber-alert-muc-hooks by adding truncation upon receiving message.
+Truncation limit may be set by customizing `jabber-log-lines-to-keep'
+variable.
+

-File: jabber.info, Node: Message events, Next: Roster import and export, Prev: Message history, Up: Top
+File: jabber.info, Node: Typing notifications, Next: Roster import and export, Prev: Message history, Up: Top
-12 Message events
-*****************
+12 Typing notifications
+***********************
+
+There are two protocols for "contact is typing" notifications in
+Jabber. jabber.el supports both of them, displaying various information
+in the header line of chat buffers.
+
+12.1 Message events
+===================
-In the status line of the chat buffer, you can sometimes see
-notifications about the progress of the message you just sent. These
-states are possible:
+The older protocol is called Message Events (*note XEP-0022::). Besides
+typing notification, it lets you know what happens to the messages you
+send. These states are possible:
* Delivered to offline storage (the user will receive it on next
logon)
@@ -971,7 +1088,7 @@ states are possible:
* Displayed to user
- * User is composing a reply
+ * User is typing a message
The first state is only reported by servers; the other three are
@@ -985,8 +1102,32 @@ set the variables `jabber-events-confirm-delivered',
to request such information by customizing
`jabber-events-request-these'.
+12.2 Chat states
+================
+
+The newer protocol is called Chat States (*note XEP-0085::). Rather
+than dealing with individual messages, it describes the state of the
+chat session between two people. The following states are possible:
+
+ * Active (the default state, not displayed)
+
+ * Inactive
+
+ * Composing
+
+ * Paused (i.e., taking a short pause in composing)
+
+ * Gone
+
+
+ jabber.el can display all five states, but only ever sends "active"
+and "composing" itself.
+
+ To customize sending of chat states, customize the variable
+`jabber-chatstates-confirm'.
+

-File: jabber.info, Node: Roster import and export, Next: XMPP URIs, Prev: Message events, Up: Top
+File: jabber.info, Node: Roster import and export, Next: XMPP URIs, Prev: Typing notifications, Up: Top
13 Roster import and export
***************************
@@ -1066,7 +1207,6 @@ jabber-customize'.
* Menu:
* Account settings::
-* Connection settings::
* Miscellaneous settings::
* Customizing the roster buffer::
* Customizing the chat buffer::
@@ -1075,71 +1215,61 @@ jabber-customize'.
* Debug options::

-File: jabber.info, Node: Account settings, Next: Connection settings, Prev: Customization, Up: Customization
+File: jabber.info, Node: Account settings, Next: Miscellaneous settings, Prev: Customization, Up: Customization
15.1 Account settings
=====================
-`jabber-username' is the username part of your JID.
-
- `jabber-server' is the JID of your server, i.e. the hostname part of
-your JID. This is usually, but not necessarily, the same as the
-hostname of the server.
-
- `jabber-password' is your password. You have the option to set it
-here, in which case it will be stored in cleartext in your `.emacs'
-file. If this is set to `nil', you will be prompted for your password
-every time you connect.
-
- `jabber-resource' is the resource you want to log in under. This
-only matters if you are connected to the same account from different
-clients or different computers, since each connection must have a
-unique resource. You might want to set this to your hostname.
-
- `jabber-default-priority' is the default priority sent with your
-presence. Regardless of what you have here, you can change your
-priority during a session with `jabber-send-presence'. *Note
-Presence::, for more information on priority.
-
- `jabber-nickname' is your default nickname for groupchats.
-
-
-File: jabber.info, Node: Connection settings, Next: Miscellaneous settings, Prev: Account settings, Up: Customization
-
-15.2 Connection settings
-========================
-
-`jabber-network-server' is the hostname or IP address of your server.
-If it is set to `nil', jabber.el will use the name in `jabber-server'.
-
- `jabber-port' is the TCP port of the server to connect to. If
-`nil', the default port is selected based on the chosen connection
-method.
+All account settings reside in `jabber-account-list' variable. Usually
+you only need to set the JID, in the form `username@server' (or
+`username@server/resource' to use a specific resource name). These are
+the other account options:
+
+Disabled
+ If the account is disabled, `jabber-connect-all' will not attempt
+ to connect it. You can still connect it manually with
+ `jabber-connect'.
+
+Password
+ You can set the password of the account, so you don't have to
+ enter it when you connect. Note that it will be stored
+ unencrypted in your customization file.
+
+Network server
+ If the JID of the Jabber server is not also its DNS name, you may
+ have to enter the real DNS name or IP address of the server here.
+
+Connection type
+ This option specifies whether to use an encrypted connection to the
+ server. Usually you want "STARTTLS" (`starttls'), which means
+ that encryption is activated if the server supports it. The other
+ possibilities are "unencrypted" (`network'), which means just
+ that, and "legacy SSL/TLS" (`ssl'), which means that encryption is
+ activated on connection.
+
+Port
+ If the Jabber server uses a nonstandard port, specify it here. The
+ default is 5222 for STARTTLS and unencrypted connections, and 5223
+ for legacy SSL connections.
+
+15.1.1 For Google Talk
+----------------------
- If both `jabber-network-server' and `jabber-port' are nil, and a
-sufficiently modern `dns.el' is available, jabber.el will use SRV
-records to find the right hostname and port.
+If you have a very new version of `dns.el', you can connect to Google
+Talk just by specifying your Gmail address. If not, set "network
+server" to `talk.google.com' and "connection type" to "legacy SSL".
- `jabber-connection-type' specifies what kind of connection to use.
-`network' means normal unencrypted network connection (usually on port
-5222), and `ssl' means encrypted connection through GnuTLS or OpenSSL
-(port 5223), while `starttls' will initiate an unencrypted connection
-and switch to encrypted if offered by the server. You can change the
-settings of the encryption program through `M-x customize-group RET
-tls', `M-x customize-group RET starttls' or `M-x customize-group RET
-ssl', respectively.
+15.1.2 Upgrade note
+-------------------
- By default, GnuTLS will be used if the `tls' library is available,
-and if that fails, OpenSSL will be used if the `ssl' library is
-available. You can force the use of either program by setting
-`jabber-connection-ssl-program' to `gnutls' or `openssl', respectively.
-If you use `starttls' the library with the same name is required, and
-it depends on the GnuTLS command line client.
+Previous versions of jabber.el had the variables `jabber-username',
+`jabber-server', `jabber-resource' and `jabber-password'. These are
+now obsolete and not used.

-File: jabber.info, Node: Miscellaneous settings, Next: Customizing the roster buffer, Prev: Connection settings, Up: Customization
+File: jabber.info, Node: Miscellaneous settings, Next: Customizing the roster buffer, Prev: Account settings, Up: Customization
-15.3 Miscellaneous settings
+15.2 Miscellaneous settings
===========================
If you want a Jabber menu on the menu bar with some common commands,
@@ -1151,7 +1281,7 @@ it permanently.

File: jabber.info, Node: Customizing the roster buffer, Next: Customizing the chat buffer, Prev: Miscellaneous settings, Up: Customization
-15.4 Customizing the roster buffer
+15.3 Customizing the roster buffer
==================================
`jabber-roster-sort-functions' controls how roster items are sorted.
@@ -1213,7 +1343,7 @@ display.

File: jabber.info, Node: Customizing the chat buffer, Next: Customizing alerts, Prev: Customizing the roster buffer, Up: Customization
-15.5 Customizing the chat buffer
+15.4 Customizing the chat buffer
================================
You can customize the look of the prompts in the chat buffer. There
@@ -1259,10 +1389,11 @@ timestamps everywhere except where you need long ones. You can always
see the complete timestamp in a tooltip by hovering over the prompt with
the mouse.
- "rare" times). This can be toggled with `jabber-print-rare-time'.
-You can customize the displayed time by setting
-`jabber-rare-time-format'. Rare timestamps will be printed whenever
-time formatted by that format string would change.
+ By default, timestamps are printed in the chat buffer every hour (at
+"rare" times). This can be toggled with `jabber-print-rare-time'. You
+can customize the displayed time by setting `jabber-rare-time-format'.
+Rare timestamps will be printed whenever time formatted by that format
+string would change.
You can also customize the header line of chat buffers, by modifying
the variable `jabber-chat-header-line-format'. The format of that
@@ -1276,7 +1407,7 @@ lines in the chat buffer are filled.

File: jabber.info, Node: Customizing alerts, Next: Hooks, Prev: Customizing the chat buffer, Up: Customization
-15.6 Customizing alerts
+15.5 Customizing alerts
=======================
When an event happens (currently including presence changes, incoming
@@ -1330,7 +1461,7 @@ same name as the alert hooks minus the `-alert' part, i.e.

File: jabber.info, Node: Standard alerts, Next: Presence alerts, Prev: Customizing alerts, Up: Customizing alerts
-15.6.1 Standard alerts
+15.5.1 Standard alerts
----------------------
Eight alerts are already written for all four alert categories. These
@@ -1383,6 +1514,12 @@ buffers that are visible but not active. Sometimes you want point to
scroll down, and sometimes not. These functions should do what you
mean; if they don't, it's a bug.
+ Also, in MUC you can use family of so-called "personal" alerts.
+Their like other MUC alerts, but fires only if incoming message
+addresed directly to you. One example of such alert is
+`jabber-muc-echo-personal', which show MUC message only if it addresed
+to you.
+
Some of these functions are in the `jabber-alert.el' file, and the
others are in their own files. You can use them as templates or
inspiration for your own alerts.
@@ -1390,7 +1527,7 @@ inspiration for your own alerts.

File: jabber.info, Node: Presence alerts, Next: Message alerts, Prev: Standard alerts, Up: Customizing alerts
-15.6.2 Presence alerts
+15.5.2 Presence alerts
----------------------
Set `jabber-alert-presence-message-function' to your desired function.
@@ -1418,7 +1555,7 @@ This last argument is usually the only one they use.

File: jabber.info, Node: Message alerts, Next: MUC alerts, Prev: Presence alerts, Up: Customizing alerts
-15.6.3 Message alerts
+15.5.3 Message alerts
---------------------
If you don't want message alerts when the chat buffer in question is
@@ -1453,7 +1590,7 @@ but that would be really ugly.

File: jabber.info, Node: MUC alerts, Next: Info alerts, Prev: Message alerts, Up: Customizing alerts
-15.6.4 MUC alerts
+15.5.4 MUC alerts
-----------------
Set `jabber-alert-muc-function' to your desired function. This
@@ -1480,7 +1617,7 @@ that, customize the variable `jabber-muc-alert-self'.

File: jabber.info, Node: Info alerts, Prev: MUC alerts, Up: Customizing alerts
-15.6.5 Info alerts
+15.5.5 Info alerts
------------------
Info alerts are sadly underdeveloped. The message function,
@@ -1494,7 +1631,7 @@ uses the browse buffer (basically anything except chatting).

File: jabber.info, Node: Hooks, Next: Debug options, Prev: Customizing alerts, Up: Customization
-15.7 Hooks
+15.6 Hooks
==========
jabber.el provides various hooks that you can use for whatever purpose.
@@ -1524,7 +1661,7 @@ jabber.el provides various hooks that you can use for whatever purpose.

File: jabber.info, Node: Debug options, Prev: Hooks, Up: Customization
-15.8 Debug options
+15.7 Debug options
==================
These settings provide a lot of information which is usually not very
@@ -1800,6 +1937,7 @@ jabber.el.
* XEP-0077:: In-Band Registration
* XEP-0078:: Non-SASL Authentication
* XEP-0082:: Jabber Date and Time Profiles
+* XEP-0085:: Chat State Notifications
* XEP-0086:: Error Condition Mappings
* XEP-0090:: Entity Time
* XEP-0091:: Delayed Delivery
@@ -2020,7 +2158,7 @@ Digest is preferred, and a warning is displayed to the user if only
plaintext is available.

-File: jabber.info, Node: XEP-0082, Next: XEP-0086, Prev: XEP-0078, Up: Protocol support
+File: jabber.info, Node: XEP-0082, Next: XEP-0085, Prev: XEP-0078, Up: Protocol support
A.18 XEP-0082 (Jabber Date and Time Profiles)
=============================================
@@ -2029,9 +2167,19 @@ The DateTime profile of XEP-0082 is supported. Currently this is only
used for file transfer.

-File: jabber.info, Node: XEP-0086, Next: XEP-0090, Prev: XEP-0082, Up: Protocol support
+File: jabber.info, Node: XEP-0085, Next: XEP-0086, Prev: XEP-0082, Up: Protocol support
+
+A.19 XEP-0085 (Chat State Notifications)
+========================================
+
+XEP-0085 is partially supported. Currently only active/composing
+notifications are _sent_ though all five notifications are handled on
+receipt.
+
+
+File: jabber.info, Node: XEP-0086, Next: XEP-0090, Prev: XEP-0085, Up: Protocol support
-A.19 XEP-0086 (Error Condition Mappings)
+A.20 XEP-0086 (Error Condition Mappings)
========================================
Legacy errors are interpreted, but never generated. XMPP style error
@@ -2040,7 +2188,7 @@ messages take precedence when errors are reported to the user.

File: jabber.info, Node: XEP-0090, Next: XEP-0091, Prev: XEP-0086, Up: Protocol support
-A.20 XEP-0090 (Entity Time)
+A.21 XEP-0090 (Entity Time)
===========================
jabber.el can query other entities for their time, and return the
@@ -2049,7 +2197,7 @@ current time to those who ask.

File: jabber.info, Node: XEP-0091, Next: XEP-0092, Prev: XEP-0090, Up: Protocol support
-A.21 XEP-0091 (Delayed Delivery)
+A.22 XEP-0091 (Delayed Delivery)
================================
The time specified on delayed incoming messages is interpreted, and
@@ -2058,7 +2206,7 @@ displayed in chat buffers instead of the current time.

File: jabber.info, Node: XEP-0092, Next: XEP-0095, Prev: XEP-0091, Up: Protocol support
-A.22 XEP-0092 (Software Version)
+A.23 XEP-0092 (Software Version)
================================
The user can request the version of any entity. jabber.el answers
@@ -2068,7 +2216,7 @@ version as OS.

File: jabber.info, Node: XEP-0095, Next: XEP-0096, Prev: XEP-0092, Up: Protocol support
-A.23 XEP-0095 (Stream Initiation)
+A.24 XEP-0095 (Stream Initiation)
=================================
XEP-0095 is supported, both incoming and outgoing, except that jabber.el
@@ -2078,7 +2226,7 @@ initiation request.

File: jabber.info, Node: XEP-0096, Next: XEP-0146, Prev: XEP-0095, Up: Protocol support
-A.24 XEP-0096 (File Transfer)
+A.25 XEP-0096 (File Transfer)
=============================
Both sending and receiving files is supported. If a suitable program is
@@ -2090,7 +2238,7 @@ XEP-0096 requires them.

File: jabber.info, Node: XEP-0146, Next: XEP-0153, Prev: XEP-0096, Up: Protocol support
-A.25 XEP-0146 (Remote Controlling Clients)
+A.26 XEP-0146 (Remote Controlling Clients)
==========================================
The "set-status" command in XEP-0146 is supported.
@@ -2098,7 +2246,7 @@ The "set-status" command in XEP-0146 is supported.

File: jabber.info, Node: XEP-0153, Prev: XEP-0146, Up: Protocol support
-A.26 XEP-0153 (vCard-Based Avatars)
+A.27 XEP-0153 (vCard-Based Avatars)
===================================
vCard-based avatars are supported, both publishing and displaying. The
@@ -2125,28 +2273,28 @@ Concept index
* Backlog: Message history. (line 6)
* Banning, MUC: MUC Administration. (line 37)
* Body printers: Chat printers. (line 6)
+* Bookmarks: Bookmarks. (line 6)
* Browse buffers: Services. (line 6)
* browser integration: XMPP URIs. (line 6)
* Browsing: Service discovery and browsing.
(line 6)
* Cancelling registration: Registering. (line 6)
-* Changing nickname: Groupchat. (line 9)
+* Changing nickname: Groupchat. (line 17)
* Changing password: Registering. (line 6)
* Chat buffer: Customizing the chat buffer.
(line 6)
* Chat printers: Chat printers. (line 6)
* Chatrooms: Groupchat. (line 6)
* Chatting: Chatting. (line 6)
-* Composing: Message events. (line 6)
+* Composing: Typing notifications. (line 13)
* composing messages: Composing messages. (line 6)
* Connecting: Connecting. (line 6)
-* Connection settings: Connection settings. (line 6)
* Customization: Customization. (line 6)
* Default MUC nickname: Automation. (line 6)
-* Delivered: Message events. (line 6)
+* Delivered: Typing notifications. (line 13)
* Detecting lost connections: Keepalive. (line 6)
* directed presence: Presence. (line 43)
-* Displayed: Message events. (line 6)
+* Displayed: Typing notifications. (line 13)
* Export roster: Roster import and export.
(line 6)
* Faces, chat buffer: Customizing the chat buffer.
@@ -2154,10 +2302,10 @@ Concept index
* File transfer: File transfer. (line 6)
* file transfer proxy: Sending files. (line 6)
* Filling long lines in chat buffer: Customizing the chat buffer.
- (line 60)
+ (line 61)
* flyspell: Spell checking. (line 6)
* Gateway registration: Registering. (line 6)
-* GnuTLS: Connection settings. (line 26)
+* Google Talk: Account settings. (line 41)
* Groupchat: Groupchat. (line 6)
* History: Message history. (line 6)
* idle: Autoaway. (line 6)
@@ -2165,24 +2313,25 @@ Concept index
* Import roster: Roster import and export.
(line 6)
* Invitations: Invitations. (line 6)
-* Joining a groupchat: Groupchat. (line 9)
+* JID: Account settings. (line 6)
+* Joining a groupchat: Groupchat. (line 17)
* Keepalive: Keepalive. (line 6)
* Key bindings: Roster buffer. (line 6)
* Kicking, MUC: MUC Administration. (line 13)
* last online: Time queries. (line 10)
* links: XMPP URIs. (line 6)
-* Menus <1>: Roster buffer. (line 6)
-* Menus: Miscellaneous settings.
+* Menus <1>: Miscellaneous settings.
(line 6)
+* Menus: Roster buffer. (line 6)
* message composition: Composing messages. (line 6)
* Modeline: Modeline status. (line 6)
* Moderator, MUC: MUC Administration. (line 13)
* Mozilla integration: XMPP URIs. (line 6)
* MUC: Groupchat. (line 6)
-* Network settings: Connection settings. (line 6)
-* Nickname, changing: Groupchat. (line 9)
+* Network server: Account settings. (line 6)
+* Nickname, changing: Groupchat. (line 17)
* Online notifications: Watch buddies. (line 6)
-* OpenSSL: Connection settings. (line 26)
+* Password: Account settings. (line 6)
* Password change: Registering. (line 6)
* Personal information: Personal information. (line 6)
* Presence: Presence. (line 6)
@@ -2190,8 +2339,11 @@ Concept index
(line 6)
* Private MUC messages: Private messages. (line 6)
* proxy, file transfer: Sending files. (line 6)
-* query groupchat: Groupchat. (line 16)
-* Registering an account: Connecting. (line 6)
+* query groupchat: Groupchat. (line 24)
+* Reconnect: Reconnecting. (line 6)
+* Reconnecting: Reconnecting. (line 6)
+* Registering an account: Registering an account.
+ (line 6)
* Registration: Registering. (line 6)
* Removing an account: Registering. (line 6)
* Resource: Account settings. (line 6)
@@ -2210,17 +2362,15 @@ Concept index
* Sorting the roster: Customizing the roster buffer.
(line 6)
* Spell checking: Spell checking. (line 6)
-* SRV records: Connection settings. (line 6)
-* SSL: Connection settings. (line 6)
-* STARTTLS: Connection settings. (line 6)
* Subscribing to someone's presence: Presence subscription.
(line 6)
* Supported protocols: Protocol support. (line 6)
* time query: Time queries. (line 6)
* Timestamps: Customizing the chat buffer.
(line 6)
-* TLS: Connection settings. (line 6)
-* Topic, MUC: Groupchat. (line 28)
+* Topic, MUC: Groupchat. (line 36)
+* Truncate: Message history. (line 6)
+* Truncation: Message history. (line 6)
* uptime, query: Time queries. (line 13)
* URIs: XMPP URIs. (line 6)
* URLs: XMPP URIs. (line 6)
@@ -2251,9 +2401,12 @@ Function index
* jabber-chat-with: Chatting. (line 6)
* jabber-compose: Composing messages. (line 6)
* jabber-connect: Connecting. (line 6)
+* jabber-connect-all: Connecting. (line 6)
* jabber-customize: Customization. (line 6)
* jabber-disconnect: Connecting. (line 6)
+* jabber-disconnect-one: Connecting. (line 6)
* jabber-display-roster: Roster buffer. (line 6)
+* jabber-edit-bookmarks: Bookmarks. (line 6)
* jabber-export-roster: Roster import and export.
(line 6)
* jabber-ft-send: Sending files. (line 17)
@@ -2268,9 +2421,9 @@ Function index
* jabber-get-register: Registering. (line 6)
* jabber-get-search: Searching. (line 6)
* jabber-get-time: Time queries. (line 6)
-* jabber-groupchat-get-config: Groupchat. (line 33)
-* jabber-groupchat-join: Groupchat. (line 9)
-* jabber-groupchat-leave: Groupchat. (line 31)
+* jabber-groupchat-get-config: Groupchat. (line 41)
+* jabber-groupchat-join: Groupchat. (line 17)
+* jabber-groupchat-leave: Groupchat. (line 39)
* jabber-handle-uri: XMPP URIs. (line 6)
* jabber-import-roster: Roster import and export.
(line 6)
@@ -2284,11 +2437,11 @@ Function index
* jabber-muc-autojoin: Automation. (line 6)
* jabber-muc-default-message: MUC alerts. (line 6)
* jabber-muc-invite: Invitations. (line 6)
-* jabber-muc-names: Groupchat. (line 37)
+* jabber-muc-names: Groupchat. (line 45)
* jabber-muc-private: Private messages. (line 6)
* jabber-muc-set-affiliation: MUC Administration. (line 37)
* jabber-muc-set-role: MUC Administration. (line 13)
-* jabber-muc-set-topic: Groupchat. (line 28)
+* jabber-muc-set-topic: Groupchat. (line 36)
* jabber-my-jid-p: Extending service discovery.
(line 6)
* jabber-presence-default-message: Presence alerts. (line 6)
@@ -2308,6 +2461,9 @@ Function index
* jabber-signal-error: Listening for new requests.
(line 6)
* jabber-socks5-query-all-proxies: Sending files. (line 13)
+* jabber-truncate-chat: Message history. (line 6)
+* jabber-truncate-muc: Message history. (line 6)
+* jabber-truncate-top: Message history. (line 6)
* jabber-vcard-edit: Personal information. (line 6)
* jabber-vcard-get: Personal information. (line 6)
* jabber-watch-add: Watch buddies. (line 6)
@@ -2333,19 +2489,21 @@ Variable index
* jabber-alert-message-function: Message alerts. (line 6)
* jabber-alert-muc-function: MUC alerts. (line 6)
* jabber-alert-presence-message-function: Presence alerts. (line 6)
+* jabber-auto-reconnect: Reconnecting. (line 6)
* jabber-autoaway-method: Autoaway. (line 6)
* jabber-avatar-cache-directory: Avatars. (line 6)
* jabber-backlog-days: Message history. (line 6)
* jabber-backlog-number: Message history. (line 6)
* jabber-body-printers: Chat printers. (line 6)
+* jabber-chat-buffer-show-avatar: Avatars. (line 6)
* jabber-chat-delayed-time-format: Customizing the chat buffer.
(line 42)
* jabber-chat-fill-long-lines: Customizing the chat buffer.
- (line 60)
+ (line 61)
* jabber-chat-foreign-prompt-format: Customizing the chat buffer.
(line 16)
* jabber-chat-header-line-format: Customizing the chat buffer.
- (line 54)
+ (line 55)
* jabber-chat-local-prompt-format: Customizing the chat buffer.
(line 16)
* jabber-chat-mode-hook: Hooks. (line 26)
@@ -2358,14 +2516,10 @@ Variable index
(line 10)
* jabber-chat-text-local: Customizing the chat buffer.
(line 10)
-* jabber-chat-text-localBy default, timestamps are printed in the chat buffer every hour (at: Customizing the chat buffer.
- (line 49)
* jabber-chat-time-format: Customizing the chat buffer.
(line 38)
-* jabber-connection-ssl-program: Connection settings. (line 6)
-* jabber-connection-type: Connection settings. (line 6)
+* jabber-chatstates-confirm: Typing notifications. (line 41)
* jabber-debug-log-xml: Debug options. (line 6)
-* jabber-default-priority <1>: Account settings. (line 6)
* jabber-default-priority: Presence. (line 6)
* jabber-default-show: Presence. (line 6)
* jabber-default-status: Presence. (line 6)
@@ -2373,10 +2527,10 @@ Variable index
(line 6)
* jabber-disco-items-nodes: Extending service discovery.
(line 6)
-* jabber-events-confirm-composing: Message events. (line 6)
-* jabber-events-confirm-delivered: Message events. (line 6)
-* jabber-events-confirm-displayed: Message events. (line 6)
-* jabber-events-request-these: Message events. (line 6)
+* jabber-events-confirm-composing: Typing notifications. (line 13)
+* jabber-events-confirm-delivered: Typing notifications. (line 13)
+* jabber-events-confirm-displayed: Typing notifications. (line 13)
+* jabber-events-request-these: Typing notifications. (line 13)
* jabber-global-history-filename: Message history. (line 6)
* jabber-history-dir: Message history. (line 6)
* jabber-history-enable-rotation: Message history. (line 6)
@@ -2390,6 +2544,7 @@ Variable index
* jabber-jid-obarray: Roster structure. (line 6)
* jabber-keepalive-interval: Keepalive. (line 6)
* jabber-keepalive-timeout: Keepalive. (line 6)
+* jabber-log-lines-to-keep: Message history. (line 6)
* jabber-lost-connection-hook: Hooks. (line 13)
* jabber-message-alert-same-buffer: Message alerts. (line 6)
* jabber-message-chain: Stanza chains. (line 6)
@@ -2398,14 +2553,10 @@ Variable index
* jabber-muc-alert-self: MUC alerts. (line 6)
* jabber-muc-autojoin: Automation. (line 6)
* jabber-muc-default-nicknames: Automation. (line 6)
-* jabber-muc-disable-disco-check: Groupchat. (line 16)
+* jabber-muc-disable-disco-check: Groupchat. (line 24)
* jabber-muc-header-line-format: Customizing the chat buffer.
- (line 54)
+ (line 55)
* jabber-muc-printers: Chat printers. (line 6)
-* jabber-network-server: Connection settings. (line 6)
-* jabber-nickname: Account settings. (line 6)
-* jabber-password: Account settings. (line 6)
-* jabber-port: Connection settings. (line 6)
* jabber-post-connect-hook: Hooks. (line 8)
* jabber-post-disconnect-hook: Hooks. (line 22)
* jabber-pre-disconnect-hook: Hooks. (line 17)
@@ -2414,7 +2565,6 @@ Variable index
(line 49)
* jabber-rare-time-format: Customizing the chat buffer.
(line 49)
-* jabber-resource: Account settings. (line 6)
* jabber-resource-line-format: Customizing the roster buffer.
(line 6)
* jabber-roster-buffer: Customizing the roster buffer.
@@ -2425,115 +2575,116 @@ Variable index
(line 6)
* jabber-roster-sort-functions: Customizing the roster buffer.
(line 6)
-* jabber-server: Account settings. (line 6)
* jabber-show-resources: Customizing the roster buffer.
(line 6)
* jabber-socks5-proxies: Sending files. (line 13)
* jabber-sort-order: Customizing the roster buffer.
(line 6)
* jabber-use-global-history: Message history. (line 6)
-* jabber-username: Account settings. (line 6)
* jabber-vcard-avatars-publish: Avatars. (line 6)
* jabber-vcard-avatars-retrieve: Avatars. (line 6)

Tag Table:
-Node: Top509
-Node: Introduction1330
-Node: Contact2212
-Node: Basic operation2654
-Node: Connecting3288
-Ref: Connecting-Footnote-14684
-Node: Chatting4764
-Node: Presence5831
-Node: Presence subscription8144
-Node: Roster buffer9123
-Ref: Roster buffer-Footnote-110549
-Node: Groupchat10626
-Node: Automation12575
-Node: Invitations13203
-Node: Private messages13880
-Node: MUC Administration14503
-Node: Composing messages16105
-Node: File transfer16730
-Ref: File transfer-Footnote-117483
-Node: Receiving files17651
-Node: Sending files19015
-Ref: Sending files-Footnote-120654
-Node: Services20814
-Node: Service discovery and browsing21613
-Node: Registering22809
-Node: Searching24539
-Node: Ad-Hoc Commands25250
-Ref: Ad-Hoc Commands-Footnote-126332
-Ref: Ad-Hoc Commands-Footnote-226468
-Node: Personal information26575
-Node: Avatars27380
-Node: Time queries28273
-Node: Useful features28878
-Node: Autoaway29238
-Node: Modeline status30610
-Node: Keepalive31322
-Node: Tracking activity32227
-Node: Watch buddies33760
-Node: Spell checking34457
-Node: Message history34941
-Node: Message events37112
-Node: Roster import and export38128
-Node: XMPP URIs39072
-Node: Customization40649
-Node: Account settings41146
-Node: Connection settings42329
-Node: Miscellaneous settings43864
-Node: Customizing the roster buffer44351
-Node: Customizing the chat buffer46331
-Node: Customizing alerts48664
-Node: Standard alerts50822
-Node: Presence alerts53498
-Node: Message alerts54516
-Ref: Message alerts-Footnote-155633
-Node: MUC alerts55736
-Node: Info alerts56616
-Node: Hooks57146
-Node: Debug options58138
-Node: Hacking and extending58562
-Node: XML representation59145
-Node: Roster structure60291
-Node: Listening for new requests61580
-Node: Sending new requests62732
-Node: Extending service discovery64672
-Node: Chat printers66056
-Node: Stanza chains67243
-Node: Protocol support67791
-Node: RFC 392069351
-Node: RFC 392170066
-Node: XEP-000470618
-Node: XEP-001271367
-Node: XEP-002071640
-Node: XEP-002271867
-Node: XEP-003072238
-Node: XEP-004572535
-Node: XEP-004972996
-Node: XEP-005073260
-Node: XEP-005473625
-Node: XEP-005573924
-Node: XEP-006574327
-Node: XEP-006674861
-Node: XEP-006875254
-Node: XEP-007775584
-Node: XEP-007876145
-Node: XEP-008276479
-Node: XEP-008676763
-Node: XEP-009077075
-Node: XEP-009177325
-Node: XEP-009277611
-Node: XEP-009577926
-Node: XEP-009678248
-Node: XEP-014678708
-Node: XEP-015378942
-Node: Concept index79213
-Node: Function index88146
-Node: Variable index93218
+Node: Top517
+Node: Introduction1348
+Node: Contact2203
+Node: Basic operation2905
+Node: Do you have a Jabber account?3802
+Node: Registering an account4423
+Node: Connecting5028
+Node: Chatting6075
+Node: Presence7320
+Node: Presence subscription9633
+Node: Roster buffer10618
+Ref: Roster buffer-Footnote-112251
+Node: Groupchat12328
+Node: Automation14707
+Node: Bookmarks15568
+Node: Invitations15861
+Node: Private messages16537
+Node: MUC Administration17160
+Node: Composing messages18762
+Node: File transfer19387
+Ref: File transfer-Footnote-120140
+Node: Receiving files20308
+Node: Sending files21672
+Ref: Sending files-Footnote-123311
+Node: Services23471
+Node: Service discovery and browsing24381
+Node: Registering25577
+Node: Searching27277
+Node: Ad-Hoc Commands27988
+Ref: Ad-Hoc Commands-Footnote-129202
+Ref: Ad-Hoc Commands-Footnote-229338
+Node: Personal information29445
+Node: Avatars30250
+Node: Time queries31237
+Node: Useful features31842
+Node: Autoaway32219
+Node: Modeline status34249
+Node: Keepalive34961
+Node: Reconnecting35861
+Node: Tracking activity36369
+Node: Watch buddies37905
+Node: Spell checking38602
+Node: Message history39086
+Node: Typing notifications41536
+Node: Roster import and export43389
+Node: XMPP URIs44339
+Node: Customization45916
+Node: Account settings46389
+Node: Miscellaneous settings48335
+Node: Customizing the roster buffer48819
+Node: Customizing the chat buffer50799
+Node: Customizing alerts53201
+Node: Standard alerts55359
+Node: Presence alerts58301
+Node: Message alerts59319
+Ref: Message alerts-Footnote-160436
+Node: MUC alerts60539
+Node: Info alerts61419
+Node: Hooks61949
+Node: Debug options62941
+Node: Hacking and extending63365
+Node: XML representation63948
+Node: Roster structure65094
+Node: Listening for new requests66383
+Node: Sending new requests67535
+Node: Extending service discovery69475
+Node: Chat printers70859
+Node: Stanza chains72046
+Node: Protocol support72594
+Node: RFC 392074211
+Node: RFC 392174926
+Node: XEP-000475478
+Node: XEP-001276227
+Node: XEP-002076500
+Node: XEP-002276727
+Node: XEP-003077098
+Node: XEP-004577395
+Node: XEP-004977856
+Node: XEP-005078120
+Node: XEP-005478485
+Node: XEP-005578784
+Node: XEP-006579187
+Node: XEP-006679721
+Node: XEP-006880114
+Node: XEP-007780444
+Node: XEP-007881005
+Node: XEP-008281339
+Node: XEP-008581623
+Node: XEP-008681946
+Node: XEP-009082258
+Node: XEP-009182508
+Node: XEP-009282794
+Node: XEP-009583109
+Node: XEP-009683431
+Node: XEP-014683891
+Node: XEP-015384125
+Node: Concept index84396
+Node: Function index93467
+Node: Variable index98977

End Tag Table
diff --git a/jabber.texi b/jabber.texi
index 4109d8d..7f141e8 100644
--- a/jabber.texi
+++ b/jabber.texi
@@ -1,7 +1,7 @@
\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename jabber.info
-@settitle jabber.el manual 0.7.1
+@settitle jabber.el manual 0.8
@c %**end of header
@dircategory Emacs
@@ -10,9 +10,9 @@
@end direntry
@copying
-This manual is for jabber.el, version 0.7.1.
+This manual is for jabber.el, version 0.8.
-Copyright @copyright{} 2004, 2005, 2006, 2007 Magnus Henoch, Tom Berger.
+Copyright @copyright{} 2004, 2005, 2006, 2007, 2008 Magnus Henoch, Tom Berger.
@quotation
Permission is granted to make and distribute verbatim copies or
@@ -23,7 +23,7 @@ this permission notice are preserved on all copies.
@titlepage
@title jabber.el
-@subtitle where Emacs and Jabber meet
+@subtitle instant messaging for Jabber
@author by Magnus Henoch and Tom Berger
@page
@@ -53,7 +53,7 @@ this permission notice are preserved on all copies.
* Time queries::
* Useful features::
* Message history::
-* Message events::
+* Typing notifications::
* Roster import and export::
* XMPP URIs::
* Customization::
@@ -75,12 +75,12 @@ please visit @uref{http://www.jabber.org}.
As a Jabber client, jabber.el is mostly just a face in the crowd,
except that it uses buffers where GUI clients have windows. There is
a roster buffer, and to chat with someone you open a chat buffer, and
-there are browse buffers (increasingly inexactly named) for
+there are buffers for
interaction with servers and services. Then again, jabber.el delivers
excellent console performance and customizable hooks (if you have
speech synthesizer software, hook it up to your presence alerts).
-jabber.el does not yet support GPG, sending and receiving
+jabber.el does not yet support PGP encryption, sending and receiving
roster items, and various other things.
@menu
@@ -90,12 +90,28 @@ roster items, and various other things.
@node Contact, , Introduction, Introduction
@section Contact
-jabber.el is developed by Tom Berger (e-mail
-@email{object@@intellectronica.net}, JID @code{object@@jabber.org.uk}) and
-Magnus Henoch (e-mail @email{mange@@freemail.hu}, JID
-@code{legoscia@@jabber.cd.chalmers.se}). There is a web page at
-@uref{http://intellectronica.net/emacs-jabber/}, and a Sourceforge
-project page at @uref{http://sourceforge.net/projects/emacs-jabber}.
+@itemize @bullet
+@item
+There is a web page at
+@uref{http://emacs-jabber.sf.net/}.
+
+@item
+There is a Sourceforge
+project page at @uref{http://sourceforge.net/projects/emacs-jabber},
+with bug and patch trackers.
+
+@item
+There is a mailing list:
+@uref{mailto:emacs-jabber-general@@lists.sourceforge.net},
+@uref{https://lists.sourceforge.net/lists/listinfo/emacs-jabber-general},
+@uref{http://dir.gmane.org/gmane.emacs.jabber.general}
+
+@item
+There is a chat room, @code{jabber.el@@conference.jabber.se}. If you
+have successfully connected, you can join it by typing @kbd{M-x
+jabber-groupchat-join} and entering the address.
+
+@end itemize
@node Basic operation, Groupchat, Introduction, Top
@chapter Basic operation
@@ -105,11 +121,18 @@ jabber.el. If you have used Jabber before and are familiar with the
terminology, you might find it a bit too basic --- in that case, just
skim it, making sure to pick up the commands mentioned.
+I'll assume that you have already successfully installed jabber.el; if
+not, consult the @file{README} file. Also, make sure you have
+@code{(require 'jabber)} or @code{(load "jabber-autoloads")} in your
+@file{.emacs}.
+
There are a handful of global keybindings for common commands. They
start with @kbd{C-x C-j}, and you can get a list of them by typing
@kbd{C-x C-j C-h}.
@menu
+* Do you have a Jabber account?::
+* Registering an account::
* Connecting::
* Chatting::
* Presence::
@@ -117,42 +140,65 @@ start with @kbd{C-x C-j}, and you can get a list of them by typing
* Roster buffer::
@end menu
-@node Connecting, Chatting, Basic operation, Basic operation
-@section Connecting
+@node Do you have a Jabber account?, Registering an account, Basic operation, Basic operation
+@section Do you have a Jabber account?
-@findex jabber-connect
-@findex jabber-disconnect
+Jabber has become rather popular as an instant messaging technology.
+Several sites use it, but often not under the names ``Jabber'' or
+``XMPP''. Examples:
-@cindex Connecting
-@cindex Registering an account
+@itemize @bullet
+@item
+Google Talk uses Jabber. If you have a Gmail address, you can use it as
+a Jabber ID. @xref{Account settings}, for Google-specific configuration.
-I'll assume that you have already successfully installed jabber.el; if
-not, consult the @file{README} file. Also, make sure you have
-@code{(require 'jabber)} in your @file{.emacs}.
+@item
+LJ Talk (of Livejournal) uses Jabber. Your Jabber ID is
+@code{@samp{ljusername}@@livejournal.com}.
+@end itemize
+
+@node Registering an account, Connecting, Do you have a Jabber account?, Basic operation
+@section Registering an account
+
+@cindex Registering an account
-Now, type @kbd{M-x jabber-customize}. This brings up a customize
-buffer for jabber.el. The most important variables to customize are
-@code{jabber-username} and
-@code{jabber-server}.@footnote{@xref{Connection settings}, for other
-things you might have to change.} Save your changes, and type
-@kbd{M-x jabber-connect} to connect.
+TBD
If you do not yet have a Jabber account, you can register one. Enter
-your desired username for @code{jabber-username} and the server you wish
-to use for @code{jabber-server}, save, and type @kbd{C-u M-x
-jabber-connect} or @kbd{C-u C-x C-j C-c}. If the server supports
+your desired username and the server you wish
+to use in @code{jabber-account-list}, save, and type @kbd{C-u M-x
+jabber-connect}. If the server supports
in-band registration, you will be presented with a registration form to
fill out and send. There the username you chose will be prefilled.
Don't change it, otherwise jabber.el will be confused.
-If you successfully connect, jabber.el will download your roster and
-display it in a buffer called @code{*-jabber-*}.
+@node Connecting, Chatting, Registering an account, Basic operation
+@section Connecting
+
+@findex jabber-connect-all
+@findex jabber-connect
+@findex jabber-disconnect-one
+@findex jabber-disconnect
+
+@cindex Connecting
+
+Now, type @kbd{C-x C-j C-c} and enter your JID and password. If you
+successfully connect, jabber.el will download your roster and display it
+in a buffer called @code{*-jabber-*}.
By default, you will appear as ``online'' to your contacts. To change
this to e.g. ``away'', type @kbd{M-x jabber-send-presence} or @kbd{C-x
C-j C-p}. @xref{Presence}, for more information.
To disconnect, type @kbd{M-x jabber-disconnect} or @kbd{C-x C-j C-d}.
+Use @kbd{M-x jabber-disconnect-one} to disconnect just one account (or just type @kbd{C-u C-x C-j C-d}).
+
+If you don't want to type your JID every time you connect, you can save
+it in the variable @code{jabber-account-list}. @xref{Account
+settings}. If you configure more than one account, all of them will be
+connected when you type @kbd{C-x C-j C-c}, as that key is bound to
+@code{jabber-connect-all}. To connect only one account, possibly one
+that's not in your list, type @kbd{M-x jabber-connect}.
@node Chatting, Presence, Connecting, Basic operation
@section Chatting
@@ -180,6 +226,10 @@ Now, try opening a chat with someone. A buffer named
Type your message at the end of the buffer, and hit @kbd{RET} to send
it. To include a newline in your message, use @kbd{C-j}.
+When you receive a message from someone, you will see a red indicator in
+the mode line. You can click this indicator or type @kbd{C-x C-j C-l}
+to switch to the relevant buffer.
+
@node Presence, Presence subscription, Chatting, Basic operation
@section Presence
@@ -250,9 +300,9 @@ Having permission to view the presence status of a person is called
@dfn{subscribing to his presence}. Presence subscription between two
persons can be asymmetric.
-When jabber.el receives a presence subscription request, it will
-present it to you in an alert requiring immediate response, and offer
-you to send a subscription request back to that person.
+When jabber.el receives a presence subscription request, it will present
+it to you in an chat buffer, and offer you to choose subscription mode
+and send a subscription request back to that person.
To request subscription to someone, type @kbd{M-x
jabber-send-subscription-request}. You will be prompted for the JID
@@ -299,6 +349,11 @@ You can choose not to have the roster updated automatically on
presence changes (@pxref{Presence alerts}). In that case, you need to
call @code{jabber-display-roster} manually.
+Please note, that by default offline contacts showed in roster as any
+others. To hide them, you can use @kbd{o} in roster buffer. To
+permanently hide them, customize @code{jabber-show-offline-contacts}
+variable.
+
@node Groupchat, Composing messages, Basic operation, Top
@chapter Groupchat
@@ -310,6 +365,14 @@ The groupchat menu can be accessed by typing @kbd{C-c C-m} in the
roster buffer. You can also type the commands directly, as will be
shown here.
+Also, to save from repeating unnesesary typing you can press @kbd{Tab}
+key to complete nick of groupchat member, you a talking with. You can
+customize your form of personal talking in MUC
+(@code{jabber-muc-completion-delimiter}) and form of personal talking
+to you (@code{jabber-muc-looks-personaling-symbols}) - see
+``jabber-chat'' customization group. Defaults are sane, so unlikely
+you could change this, but... it is Emacs!
+
@findex jabber-groupchat-join
@cindex Joining a groupchat
@cindex Changing nickname
@@ -359,12 +422,13 @@ the meaning of roles and affiliations.
@menu
* Automation::
+* Bookmarks::
* Invitations::
* Private messages::
* MUC Administration::
@end menu
-@node Automation, Invitations, Groupchat, Groupchat
+@node Automation, Bookmarks, Groupchat, Groupchat
@section Automation
@vindex jabber-muc-default-nicknames
@@ -373,7 +437,8 @@ the meaning of roles and affiliations.
@cindex Default MUC nickname
@cindex Autojoin chat rooms
-You can select a default nickname by setting @code{jabber-nickname}.
+You can select a default nickname by setting
+@code{jabber-account-list} (part of JID before @code{@@}).
Additionally, you can set different nicknames for different groups, by
customizing @code{jabber-muc-default-nicknames}. There you specify
the JID of the group, and your preferred nickname.
@@ -383,7 +448,22 @@ can set @code{jabber-muc-autojoin} to a list containing the JIDs of
the rooms you want to enter. To disable this feature, remove
@code{jabber-muc-autojoin} from @code{jabber-post-connect-hook}.
-@node Invitations, Private messages, Automation, Groupchat
+Please note, that @code{jabber-muc-default-nicknames} and
+@code{jabber-muc-autojoin} are machine-local. To make them available
+to any client on any machine, import them in your bookmarks. See
+@xref{Bookmarks}.
+
+@node Bookmarks, Invitations, Automation, Groupchat
+@section Bookmarks
+
+@cindex Bookmarks
+@findex jabber-edit-bookmarks
+
+You can store your conference settings on server-side to make them
+available from any machine and client. Use @code{M-x
+jabber-edit-bookmarks} to edit server-side bookmarks.
+
+@node Invitations, Private messages, Bookmarks, Groupchat
@section Invitations
@cindex Invitations
@@ -611,6 +691,9 @@ keybindings as in the roster buffer, and if you call a function
operating on a JID while point is over a JID, that JID will be the
default value, so you don't have to type it or copy it yourself.
+You can change browse buffer name creation template by customizing
+@code{jabber-browse-buffer-format} variable.
+
@menu
* Service discovery and browsing::
* Registering::
@@ -674,8 +757,8 @@ the password of your Jabber account, ask to register with your Jabber
server.
Please note that any passwords sent in this way will be sent in
-cleartext to your Jabber server, unless you have enabled SSL encryption
-(@pxref{Connection settings}), and possibly sent in cleartext from your
+cleartext to your Jabber server, unless you have enabled SSL encryption,
+ and possibly sent in cleartext from your
server to the server hosting the service.
jabber.el will then request a registration form from that service. If
@@ -726,7 +809,7 @@ and administering services (e.g. PyMSNt).
Currently, jabber.el uses ad-hoc commands for setting presence remotely.
If you realize that you forgot to set your client to ``away'' with a low
-priority, you can do it remotely.@footnote{Most Jabber servers also
+priority, you can do it remotely from any JID from @code{jabber-account-list}. So, you can add disabled JIDs in @code{jabber-account-list} to allow them control your presence.@footnote{Most Jabber servers also
support kicking a client off the net by logging in with another client
with exactly the same resource.}
@@ -774,6 +857,7 @@ your avatar file is limited to 8 kilobytes.
@vindex jabber-vcard-avatars-retrieve
@vindex jabber-vcard-avatars-publish
@vindex jabber-avatar-cache-directory
+@vindex jabber-chat-buffer-show-avatar
jabber.el supports viewing and publishing avatars according to XEP-0153,
vCard-Based Avatars. By default, if you have an avatar in your vCard
@@ -784,7 +868,9 @@ Emacs can display images.
To disable retrieval of other people's avatars, set
@code{jabber-vcard-avatars-retrieve} to nil. To disable publishing of
-your own avatar, set @code{jabber-vcard-avatars-publish} to nil.
+your own avatar, set @code{jabber-vcard-avatars-publish} to nil. To
+disable avatars in chat buffer header lines, set
+@code{jabber-chat-buffer-show-avatar} to nil.
Avatars are cached in the directory specified by
@code{jabber-avatar-cache-directory}, by default
@@ -823,6 +909,7 @@ interface and do other useful things.
* Autoaway::
* Modeline status::
* Keepalive::
+* Reconnecting::
* Tracking activity::
* Watch buddies::
* Spell checking::
@@ -859,9 +946,20 @@ activity in other programs.
If you are using the X Window System, you can use the
@uref{http://www.dtek.chalmers.se/~henoch/text/xprintidle.html,
xprintidle} program. Make sure that @code{jabber-xprintidle-program} is
-set to the correct file name. This uses the same method as XScreensaver
+set to the correct file name. This uses the same method as @uref{http://www.jwz.org/xscreensaver,XScreensaver}
to find your idle time.
+If you use xscreensaver program, you can use
+``xscreensaver-emacs-jabber'' perl-script for syncronize xscreensaver
+and jabber.el status. It is are simple perl-daemon that watch for
+xscreensaver status and set jabber.el's presence when needed. I.e.:
+its set XA presence when screen is blanked or locked (by hands or by
+idle timeout) and default presence when its unlocked/unblanked. To use
+it, just run ``xscreensaver-emacs-jabber'' after xscreensaver and make
+sure that your Emacs run in server mode (that you run (server-start)
+in init files. Alternativetily, you can add turn on and off
+server-mode by jabber.el's hooks).
+
If you are using Emacs on a GNU/Linux terminal, the function
@code{jabber-termatime-get-idle-time} is used by default.
@@ -885,7 +983,7 @@ breakdown of presence status. That gives you six numbers indicating
the number of chatty, online, away, extended away, dnd, and offline
contacts, respectively.
-@node Keepalive, Tracking activity, Modeline status, Useful features
+@node Keepalive, Reconnecting, Modeline status, Useful features
@section Keepalive
@cindex Keepalive
@@ -913,7 +1011,23 @@ You can customize the interval and the timeout with the variables
@code{jabber-keepalive-interval} and @code{jabber-keepalive-timeout},
respectively.
-@node Tracking activity, Watch buddies, Keepalive, Useful features
+@node Reconnecting, Tracking activity, Keepalive, Useful features
+@section Reconnecting
+
+@cindex Reconnect
+@cindex Reconnecting
+@vindex jabber-auto-reconnect
+
+Jabber.el support automatic reconnection to Jabber server(s) upon lost
+connection. By default it is off. To turn on, customize
+@code{jabber-auto-reconnect} variable. You will need
+@file{password.el} to fully use this feature. It may be found in
+recent Gnus (No Gnus) or downloaded and installed separately.
+
+See also comments about
+password(s) in Custom's buffer help.
+
+@node Tracking activity, Watch buddies, Reconnecting, Useful features
@section Tracking activity
@cindex Activity
@@ -987,12 +1101,17 @@ what you receive or what you have already sent. You may want to add
For more information about Emacs spell checking, @xref{Spelling, ,
Checking and Correcting Spelling, emacs, GNU Emacs Manual}.
-@node Message history, Message events, Useful features, Top
+@node Message history, Typing notifications, Useful features, Top
@chapter Message history
@cindex History
@cindex Backlog
@cindex Rotation
+@cindex Truncate
+@cindex Truncation
+@findex jabber-truncate-top
+@findex jabber-truncate-muc
+@findex jabber-truncate-chat
@vindex jabber-history-enabled
@vindex jabber-global-history-filename
@vindex jabber-use-global-history
@@ -1001,6 +1120,7 @@ Checking and Correcting Spelling, emacs, GNU Emacs Manual}.
@vindex jabber-history-size-limit
@vindex jabber-backlog-number
@vindex jabber-backlog-days
+@vindex jabber-log-lines-to-keep
If you want a record of messages sent and received, set
@code{jabber-history-enabled} to t. By default all messages to will
@@ -1040,9 +1160,20 @@ and @file{foo@@jabber-server} will be set empty. Next time
presented with the per-contact history file strategy, history rotation
works for both per-contact and global history logging strategies.
+If you want also to truncate chat and muc buffer from growing too
+much, you can customize jabber-alert-message-hooks and
+jabber-alert-muc-hooks by adding truncation upon receiving message.
+Truncation limit may be set by customizing
+@code{jabber-log-lines-to-keep} variable.
+
+@node Typing notifications, Roster import and export, Message history, Top
+@chapter Typing notifications
-@node Message events, Roster import and export, Message history, Top
-@chapter Message events
+There are two protocols for ``contact is typing'' notifications in
+Jabber. jabber.el supports both of them, displaying various information
+in the header line of chat buffers.
+
+@section Message events
@cindex Composing
@cindex Delivered
@@ -1052,9 +1183,9 @@ works for both per-contact and global history logging strategies.
@vindex jabber-events-confirm-displayed
@vindex jabber-events-confirm-composing
-In the status line of the chat buffer, you can sometimes see
-notifications about the progress of the message you just sent. These
-states are possible:
+The older protocol is called Message Events (@pxref{XEP-0022}). Besides
+typing notification, it lets you know what happens to the messages you send.
+These states are possible:
@itemize @bullet
@item
@@ -1067,7 +1198,7 @@ Delivered to user's client (but not necessarily displayed)
Displayed to user
@item
-User is composing a reply
+User is typing a message
@end itemize
@@ -1082,7 +1213,40 @@ the variables @code{jabber-events-confirm-delivered},
not to request such information by customizing
@code{jabber-events-request-these}.
-@node Roster import and export, XMPP URIs, Message events, Top
+@section Chat states
+
+@vindex jabber-chatstates-confirm
+
+The newer protocol is called Chat States (@pxref{XEP-0085}). Rather
+than dealing with individual messages, it describes the state of the
+chat session between two people. The following states are possible:
+
+@itemize @bullet
+@item
+Active (the default state, not displayed)
+
+@item
+Inactive
+
+@item
+Composing
+
+@item
+Paused (i.e., taking a short pause in composing)
+
+@item
+Gone
+
+@end itemize
+
+jabber.el can display all five states, but only ever sends ``active''
+and ``composing'' itself.
+
+To customize sending of chat states, customize the variable
+@code{jabber-chatstates-confirm}.
+
+
+@node Roster import and export, XMPP URIs, Typing notifications, Top
@chapter Roster import and export
@findex jabber-export-roster
@@ -1178,7 +1342,6 @@ this is Emacs. To open a customization buffer for jabber.el, type
@menu
* Account settings::
-* Connection settings::
* Miscellaneous settings::
* Customizing the roster buffer::
* Customizing the chat buffer::
@@ -1187,86 +1350,66 @@ this is Emacs. To open a customization buffer for jabber.el, type
* Debug options::
@end menu
-@node Account settings, Connection settings, Customization, Customization
+@node Account settings, Miscellaneous settings, Customization, Customization
@section Account settings
-@vindex jabber-username
-@vindex jabber-server
-@vindex jabber-password
-@vindex jabber-resource
-@vindex jabber-default-priority
-@vindex jabber-nickname
@cindex Username
@cindex Resource
+@cindex Password
+@cindex JID
+@cindex Resource
+@cindex Network server
+
+All account settings reside in @code{jabber-account-list} variable.
+Usually you only need to set the JID, in the form
+@samp{username@@server} (or @samp{username@@server/resource} to use a
+specific resource name). These are the other account options:
+
+@table @asis
+@item Disabled
+If the account is disabled, @code{jabber-connect-all} will not attempt
+to connect it. You can still connect it manually with
+@code{jabber-connect}.
+
+@item Password
+You can set the password of the account, so you don't have to enter it
+when you connect. Note that it will be stored unencrypted in your
+customization file.
+
+@item Network server
+If the JID of the Jabber server is not also its DNS name, you may have
+to enter the real DNS name or IP address of the server here.
+
+@item Connection type
+This option specifies whether to use an encrypted connection to the
+server. Usually you want ``STARTTLS'' (@code{starttls}), which means
+that encryption is activated if the server supports it. The other
+possibilities are ``unencrypted'' (@code{network}), which means just
+that, and ``legacy SSL/TLS'' (@code{ssl}), which means that encryption
+is activated on connection.
+
+@item Port
+If the Jabber server uses a nonstandard port, specify it here. The
+default is 5222 for STARTTLS and unencrypted connections, and 5223 for
+legacy SSL connections.
+@end table
+
+@subsection For Google Talk
+
+@cindex Google Talk
+
+If you have a very new version of @file{dns.el}, you can connect to
+Google Talk just by specifying your Gmail address. If not, set
+``network server'' to @kbd{talk.google.com} and ``connection type'' to
+``legacy SSL''.
+
+@subsection Upgrade note
-@code{jabber-username} is the username part of your JID.
-
-@code{jabber-server} is the JID of your server, i.e. the hostname part
-of your JID. This is usually, but not necessarily, the same as the
-hostname of the server.
-
-@code{jabber-password} is your password. You have the option to set
-it here, in which case it will be stored in cleartext in your
-@file{.emacs} file. If this is set to @code{nil}, you will be prompted for
-your password every time you connect.
-
-@code{jabber-resource} is the resource you want to log in under. This
-only matters if you are connected to the same account from different
-clients or different computers, since each connection must have a
-unique resource. You might want to set this to your hostname.
-
-@code{jabber-default-priority} is the default priority sent with your
-presence. Regardless of what you have here, you can change your
-priority during a session with @code{jabber-send-presence}.
-@xref{Presence}, for more information on priority.
-
-@code{jabber-nickname} is your default nickname for groupchats.
-
-@node Connection settings, Miscellaneous settings, Account settings, Customization
-@section Connection settings
-
-@vindex jabber-network-server
-@vindex jabber-port
-@vindex jabber-connection-type
-@vindex jabber-connection-ssl-program
-@cindex Connection settings
-@cindex Network settings
-@cindex SSL
-@cindex TLS
-@cindex STARTTLS
-@cindex SRV records
-
-@code{jabber-network-server} is the hostname or IP address of your
-server. If it is set to @code{nil}, jabber.el will use the name in
-@code{jabber-server}.
-
-@code{jabber-port} is the TCP port of the server to connect to. If
-@code{nil}, the default port is selected based on the chosen
-connection method.
-
-If both @code{jabber-network-server} and @code{jabber-port} are nil, and
-a sufficiently modern @code{dns.el} is available, jabber.el will use SRV
-records to find the right hostname and port.
-
-@code{jabber-connection-type} specifies what kind of connection to
-use. @code{network} means normal unencrypted network connection
-(usually on port 5222), and @code{ssl} means encrypted connection
-through GnuTLS or OpenSSL (port 5223), while @code{starttls} will
-initiate an unencrypted connection and switch to encrypted if offered
-by the server. You can change the settings of the encryption program
-through @kbd{M-x customize-group RET tls}, @kbd{M-x customize-group RET starttls}
-or @kbd{M-x customize-group RET ssl}, respectively.
-
-@cindex GnuTLS
-@cindex OpenSSL
-By default, GnuTLS will be used if the @code{tls} library is available,
-and if that fails, OpenSSL will be used if the @code{ssl} library is
-available. You can force the use of either program by setting
-@code{jabber-connection-ssl-program} to @code{gnutls} or @code{openssl},
-respectively. If you use @code{starttls} the library with the same name is
-required, and it depends on the GnuTLS command line client.
-
-@node Miscellaneous settings, Customizing the roster buffer, Connection settings, Customization
+Previous versions of jabber.el had the variables @code{jabber-username},
+@code{jabber-server}, @code{jabber-resource} and
+@code{jabber-password}. These are now obsolete and not used.
+
+@node Miscellaneous settings, Customizing the roster buffer, Account settings, Customization
@section Miscellaneous settings
@findex jabber-menu
@@ -1401,7 +1544,8 @@ the mouse.
@vindex jabber-print-rare-time
@vindex jabber-rare-time-format
-@vindex jabber-chat-text-localBy default, timestamps are printed in the chat buffer every hour (at
+@vindex jabber-chat-text-local
+By default, timestamps are printed in the chat buffer every hour (at
``rare'' times). This can be toggled with
@code{jabber-print-rare-time}. You can customize the displayed time by
setting @code{jabber-rare-time-format}. Rare timestamps will be printed
@@ -1537,6 +1681,12 @@ buffers that are visible but not active. Sometimes you want point to
scroll down, and sometimes not. These functions should do what you
mean; if they don't, it's a bug.
+Also, in MUC you can use family of so-called ``personal'' alerts.
+Their like other MUC alerts, but fires only if incoming message
+addresed directly to you. One example of such alert is
+@code{jabber-muc-echo-personal}, which show MUC message only if it
+addresed to you.
+
Some of these functions are in the @file{jabber-alert.el} file, and the
others are in their own files. You can use them as templates or
inspiration for your own alerts.
@@ -1992,6 +2142,7 @@ jabber.el.
* XEP-0077:: In-Band Registration
* XEP-0078:: Non-SASL Authentication
* XEP-0082:: Jabber Date and Time Profiles
+* XEP-0085:: Chat State Notifications
* XEP-0086:: Error Condition Mappings
* XEP-0090:: Entity Time
* XEP-0091:: Delayed Delivery
@@ -2163,13 +2314,20 @@ Non-SASL authentication is supported, both plaintext and digest.
Digest is preferred, and a warning is displayed to the user if only
plaintext is available.
-@node XEP-0082, XEP-0086, XEP-0078, Protocol support
+@node XEP-0082, XEP-0085, XEP-0078, Protocol support
@section XEP-0082 (Jabber Date and Time Profiles)
The DateTime profile of XEP-0082 is supported. Currently this is only
used for file transfer.
-@node XEP-0086, XEP-0090, XEP-0082, Protocol support
+@node XEP-0085, XEP-0086, XEP-0082, Protocol support
+@section XEP-0085 (Chat State Notifications)
+
+XEP-0085 is partially supported. Currently only active/composing
+notifications are @emph{sent} though all five notifications are handled on
+receipt.
+
+@node XEP-0086, XEP-0090, XEP-0085, Protocol support
@section XEP-0086 (Error Condition Mappings)
Legacy errors are interpreted, but never generated. XMPP style error
diff --git a/m4/emacs-lib.m4 b/m4/emacs-lib.m4
new file mode 100644
index 0000000..6562cfd
--- /dev/null
+++ b/m4/emacs-lib.m4
@@ -0,0 +1,24 @@
+# AX_EMACS_RUN_IFELSE(PROGRAM, ACTION-IF-TRUE, ACTION-IF-FALSE)
+# -------------------------------------------------------------
+# Run PROGRAM in emacs. If it finishes successfully, execute
+# ACTION-IF-TRUE, else ACTION-IF-FALSE.
+AC_DEFUN([AX_EMACS_RUN_IFELSE],
+[cat >conftest.el <<EOF
+$1
+EOF
+AC_RUN_LOG([$EMACS -batch -l conftest.el])
+AS_IF([test $ac_status -eq 0], [$2], [$3])])
+
+# AX_CHECK_EMACS_LIB(LIBRARY, ACTION-IF-PRESENT, ACTION-IF-NOT)
+# -------------------------------------------------------------
+# Check whether emacs can load LIBRARY with require. Execute
+# ACTION-IF-PRESENT if it can, else ACTION-IF-NOT.
+AC_DEFUN([AX_CHECK_EMACS_LIB],
+[
+AC_CACHE_CHECK([whether $EMACS has library $1],
+ [AS_TR_SH([ax_cv_emacs_lib_$1])],
+ [AX_EMACS_RUN_IFELSE([(require '$1)],
+ [AS_TR_SH([ax_cv_emacs_lib_$1])=yes],
+ [AS_TR_SH([ax_cv_emacs_lib_$1])=no])])
+AS_IF([test $AS_TR_SH([ax_cv_emacs_lib_$1]) = yes], [$2], [$3])
+])
diff --git a/missing b/missing
new file mode 100755
index 0000000..1c8ff70
--- /dev/null
+++ b/missing
@@ -0,0 +1,367 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2006-05-10.23
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ autom4te touch the output file, or create a stub one
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case $1 in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $1 in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case $f in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f y.tab.h; then
+ echo >y.tab.h
+ fi
+ if test ! -f y.tab.c; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if test $# -ne 1; then
+ eval LASTARG="\${$#}"
+ case $LASTARG in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if test -f "$SRCFILE"; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if test ! -f lex.yy.c; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n "$sed_output"`
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '
+ /^@setfilename/{
+ s/.* \([^ ]*\) *$/\1/
+ p
+ q
+ }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case $firstarg in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case $firstarg in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/srv.el b/srv.el
index ccd5aaf..42665e7 100644
--- a/srv.el
+++ b/srv.el
@@ -1,6 +1,6 @@
;;; srv.el --- perform SRV DNS requests
-;; Copyright (C) 2005 Magnus Henoch
+;; Copyright (C) 2005, 2007 Magnus Henoch
;; Author: Magnus Henoch <mange@freemail.hu>
;; Keywords: comm
@@ -29,7 +29,9 @@
;;; Code:
-(require 'dns)
+(condition-case nil
+ (require 'dns)
+ (error nil))
(eval-when-compile (require 'cl))
(defun srv-lookup (target)
@@ -40,6 +42,8 @@ Returns a list with elements of the form (HOST . PORT), where HOST is
a hostname and PORT is a numeric port. The caller is supposed to
make connection attempts in the order given, starting from the beginning
of the list. The list is empty if no SRV records were found."
+ (unless (boundp 'dns-query-types)
+ (error "No dns.el available"))
(unless (assq 'SRV dns-query-types)
(error "dns.el doesn't support SRV lookups"))
(let* ((result (query-dns target 'SRV t))
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..3892e34
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,3 @@
+TESTS_ENVIRONMENT = $(EMACS) -batch -L $(top_builddir) -l
+TESTS = skip-tag-forward.el
+dist_noinst_DATA = $(TESTS)
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..b922873
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,362 @@
+# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+subdir = tests
+DIST_COMMON = $(dist_noinst_DATA) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/emacs-lib.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DATA = $(dist_noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EMACS = @EMACS@
+EMACSLOADPATH = @EMACSLOADPATH@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+am__leading_dot = @am__leading_dot@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build_alias = @build_alias@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host_alias = @host_alias@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+lispdir = @lispdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+TESTS_ENVIRONMENT = $(EMACS) -batch -L $(top_builddir) -l
+TESTS = skip-tag-forward.el
+dist_noinst_DATA = $(TESTS)
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+check-TESTS: $(TESTS)
+ @failed=0; all=0; xfail=0; xpass=0; skip=0; ws='[ ]'; \
+ srcdir=$(srcdir); export srcdir; \
+ list=' $(TESTS) '; \
+ if test -n "$$list"; then \
+ for tst in $$list; do \
+ if test -f ./$$tst; then dir=./; \
+ elif test -f $$tst; then dir=; \
+ else dir="$(srcdir)/"; fi; \
+ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *$$ws$$tst$$ws*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *$$ws$$tst$$ws*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+ fi; \
+ else \
+ if test "$$xpass" -eq 0; then \
+ banner="$$failed of $$all tests failed"; \
+ else \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$skipped"; \
+ fi; \
+ report=""; \
+ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ report="Please report to $(PACKAGE_BUGREPORT)"; \
+ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ dashes="$$report"; \
+ fi; \
+ dashes=`echo "$$dashes" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-TESTS check-am clean clean-generic \
+ distclean distclean-generic distdir dvi dvi-am html html-am \
+ info info-am install install-am install-data install-data-am \
+ install-dvi install-dvi-am install-exec install-exec-am \
+ install-html install-html-am install-info install-info-am \
+ install-man install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \
+ uninstall-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/skip-tag-forward.el b/tests/skip-tag-forward.el
new file mode 100644
index 0000000..2e7bf44
--- /dev/null
+++ b/tests/skip-tag-forward.el
@@ -0,0 +1,23 @@
+;; Tests for jabber-xml-skip-tag-forward
+
+(require 'jabber-xml)
+(require 'cl)
+
+(flet ((parses-p
+ (text)
+ (with-temp-buffer
+ (insert text)
+ (goto-char (point-min))
+ (catch 'unfinished
+ (jabber-xml-skip-tag-forward)
+ (= (point) (point-max))))))
+
+ ;; 1. Just plain XML
+ (unless (parses-p "<stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>ANONYMOUS</mechanism><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism></mechanisms><register xmlns='http://jabber.org/features/iq-register'/></stream:features>")
+ (error "Testcase 1 failed"))
+
+ ;; 2. XML with CDATA
+ (unless (parses-p "<message><body><![CDATA[<foo & bar>]]></body></message>")
+ (error "Testcase 2 failed")))
+
+;; arch-tag: a99d8666-0e6b-11dd-bd33-000a95c2fcd0
diff --git a/texinfo.tex b/texinfo.tex
new file mode 100644
index 0000000..d2b264d
--- /dev/null
+++ b/texinfo.tex
@@ -0,0 +1,8962 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2007-12-02.17}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, 2007,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+% 2007 Free Software Foundation, Inc.
+%
+% This texinfo.tex file is free software: you can redistribute it and/or
+% modify it under the terms of the GNU General Public License as
+% published by the Free Software Foundation, either version 3 of the
+% License, or (at your option) any later version.
+%
+% This texinfo.tex file is distributed in the hope that it will be
+% useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+% General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+%
+% As a special exception, when this file is read by TeX when processing
+% a Texinfo source document, you may use the result without
+% restriction. (This has been our intent since Texinfo was invented.)
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or
+% ftp://tug.org/tex/texinfo.tex
+% (and all CTAN mirrors, see http://www.ctan.org).
+% The texinfo.tex in any given distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org. Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem. Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution. For a simple
+% manual foo.texi, however, you can get away with this:
+% tex foo.texi
+% texindex foo.??
+% tex foo.texi
+% tex foo.texi
+% dvips foo.dvi -o # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent. You can get the existing language-specific files from the
+% full Texinfo distribution.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+ \catcode`+=\active \catcode`\_=\active}
+
+
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexfootnote=\footnote
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexinsert=\insert
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexnewwrite\newwrite
+\let\ptexnoindent=\noindent
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+ \let\linenumber = \empty % Pre-3.0.
+\else
+ \def\linenumber{l.\the\inputlineno:\space}
+\fi
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi
+
+% Since the category of space is not known, we have to be careful.
+\chardef\spacecat = 10
+\def\spaceisspace{\catcode`\ =\spacecat}
+
+% sometimes characters are active, so we need control sequences.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dashChar = `\-
+\chardef\dotChar = `\.
+\chardef\exclamChar= `\!
+\chardef\lquoteChar= `\`
+\chardef\questChar = `\?
+\chardef\rquoteChar= `\'
+\chardef\semiChar = `\;
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% The following is used inside several \edef's.
+\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Hyphenation fixes.
+\hyphenation{
+ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script
+ ap-pen-dix bit-map bit-maps
+ data-base data-bases eshell fall-ing half-way long-est man-u-script
+ man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm
+ par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces
+ spell-ing spell-ings
+ stand-alone strong-est time-stamp time-stamps which-ever white-space
+ wide-spread wrap-around
+}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @| inserts a changebar to the left of the current line. It should
+% surround any changed text. This approach does *not* work if the
+% change spans more than two lines of output. To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+ % \vadjust can only be used in horizontal mode.
+ \leavevmode
+ %
+ % Append this vertical mode material after the current line in the output.
+ \vadjust{%
+ % We want to insert a rule with the height and depth of the current
+ % leading; that is exactly what \strutbox is supposed to record.
+ \vskip-\baselineskip
+ %
+ % \vadjust-items are inserted at the left edge of the type. So
+ % the \llap here moves out into the left-hand margin.
+ \llap{%
+ %
+ % For a thicker or thinner bar, change the `1pt'.
+ \vrule height\baselineskip width1pt
+ %
+ % This is the space between the bar and the text.
+ \hskip 12pt
+ }%
+ }%
+}
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal. We don't just call \tracingall here,
+% since that produces some useless output on the terminal. We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+ \tracingstats2
+ \tracingpages1
+ \tracinglostchars2 % 2 gives us more in etex
+ \tracingparagraphs1
+ \tracingoutput1
+ \tracingmacros2
+ \tracingrestores1
+ \showboxbreadth\maxdimen \showboxdepth\maxdimen
+ \ifx\eTeXversion\undefined\else % etex gives us more logging
+ \tracingscantokens1
+ \tracingifs1
+ \tracinggroups1
+ \tracingnesting2
+ \tracingassigns1
+ \fi
+ \tracingcommands3 % 3 gives us more in etex
+ \errorcontextlines16
+}%
+
+% add check for \lastpenalty to plain's definitions. If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Output a mark which sets \thischapter, \thissection and \thiscolor.
+% We dump everything together because we only have one kind of mark.
+% This works because we only use \botmark / \topmark, not \firstmark.
+%
+% A mark contains a subexpression of the \ifcase ... \fi construct.
+% \get*marks macros below extract the needed part using \ifcase.
+%
+% Another complication is to let the user choose whether \thischapter
+% (\thissection) refers to the chapter (section) in effect at the top
+% of a page, or that at the bottom of a page. The solution is
+% described on page 260 of The TeXbook. It involves outputting two
+% marks for the sectioning macros, one before the section break, and
+% one after. I won't pretend I can describe this better than DEK...
+\def\domark{%
+ \toks0=\expandafter{\lastchapterdefs}%
+ \toks2=\expandafter{\lastsectiondefs}%
+ \toks4=\expandafter{\prevchapterdefs}%
+ \toks6=\expandafter{\prevsectiondefs}%
+ \toks8=\expandafter{\lastcolordefs}%
+ \mark{%
+ \the\toks0 \the\toks2
+ \noexpand\or \the\toks4 \the\toks6
+ \noexpand\else \the\toks8
+ }%
+}
+% \topmark doesn't work for the very first chapter (after the title
+% page or the contents), so we use \firstmark there -- this gets us
+% the mark with the chapter defs, unless the user sneaks in, e.g.,
+% @setcolor (or @url, or @link, etc.) between @contents and the very
+% first @chapter.
+\def\gettopheadingmarks{%
+ \ifcase0\topmark\fi
+ \ifx\thischapter\empty \ifcase0\firstmark\fi \fi
+}
+\def\getbottomheadingmarks{\ifcase1\botmark\fi}
+\def\getcolormarks{\ifcase2\topmark\fi}
+
+% Avoid "undefined control sequence" errors.
+\def\lastchapterdefs{}
+\def\lastsectiondefs{}
+\def\prevchapterdefs{}
+\def\prevsectiondefs{}
+\def\lastcolordefs{}
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument. Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+ \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+ %
+ \ifodd\pageno \advance\hoffset by \bindingoffset
+ \else \advance\hoffset by -\bindingoffset\fi
+ %
+ % Do this outside of the \shipout so @code etc. will be expanded in
+ % the headline as they should be, not taken literally (outputting ''code).
+ \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi
+ \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+ \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi
+ \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+ %
+ {%
+ % Have to do this stuff outside the \shipout because we want it to
+ % take effect in \write's, yet the group defined by the \vbox ends
+ % before the \shipout runs.
+ %
+ \indexdummies % don't expand commands in the output.
+ \normalturnoffactive % \ in index entries must not stay \, e.g., if
+ % the page break happens to be in the middle of an example.
+ % We don't want .vr (or whatever) entries like this:
+ % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}}
+ % "\acronym" won't work when it's read back in;
+ % it needs to be
+ % {\code {{\tt \backslashcurfont }acronym}
+ \shipout\vbox{%
+ % Do this early so pdf references go to the beginning of the page.
+ \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi
+ %
+ \ifcropmarks \vbox to \outervsize\bgroup
+ \hsize = \outerhsize
+ \vskip-\topandbottommargin
+ \vtop to0pt{%
+ \line{\ewtop\hfil\ewtop}%
+ \nointerlineskip
+ \line{%
+ \vbox{\moveleft\cornerthick\nstop}%
+ \hfill
+ \vbox{\moveright\cornerthick\nstop}%
+ }%
+ \vss}%
+ \vskip\topandbottommargin
+ \line\bgroup
+ \hfil % center the page within the outer (page) hsize.
+ \ifodd\pageno\hskip\bindingoffset\fi
+ \vbox\bgroup
+ \fi
+ %
+ \unvbox\headlinebox
+ \pagebody{#1}%
+ \ifdim\ht\footlinebox > 0pt
+ % Only leave this space if the footline is nonempty.
+ % (We lessened \vsize for it in \oddfootingyyy.)
+ % The \baselineskip=24pt in plain's \makefootline has no effect.
+ \vskip 24pt
+ \unvbox\footlinebox
+ \fi
+ %
+ \ifcropmarks
+ \egroup % end of \vbox\bgroup
+ \hfil\egroup % end of (centering) \line\bgroup
+ \vskip\topandbottommargin plus1fill minus1fill
+ \boxmaxdepth = \cornerthick
+ \vbox to0pt{\vss
+ \line{%
+ \vbox{\moveleft\cornerthick\nsbot}%
+ \hfill
+ \vbox{\moveright\cornerthick\nsbot}%
+ }%
+ \nointerlineskip
+ \line{\ewbot\hfil\ewbot}%
+ }%
+ \egroup % \vbox from first cropmarks clause
+ \fi
+ }% end of \shipout\vbox
+ }% end of group with \indexdummies
+ \advancepageno
+ \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+ \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1\relax \unvbox#1\relax
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks. Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+ {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+ {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1. The argument is the rest of
+% the input line (except we remove a trailing comment). #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg{\parseargusing{}}
+\def\parseargusing#1#2{%
+ \def\argtorun{#2}%
+ \begingroup
+ \obeylines
+ \spaceisspace
+ #1%
+ \parseargline\empty% Insert the \empty token, see \finishparsearg below.
+}
+
+{\obeylines %
+ \gdef\parseargline#1^^M{%
+ \endgroup % End of the group started in \parsearg.
+ \argremovecomment #1\comment\ArgTerm%
+ }%
+}
+
+% First remove any @comment, then any @c comment.
+\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm}
+\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm}
+
+% Each occurence of `\^^M' or `<space>\^^M' is replaced by a single space.
+%
+% \argremovec might leave us with trailing space, e.g.,
+% @end itemize @c foo
+% This space token undergoes the same procedure and is eventually removed
+% by \finishparsearg.
+%
+\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M}
+\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M}
+\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{%
+ \def\temp{#3}%
+ \ifx\temp\empty
+ % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp:
+ \let\temp\finishparsearg
+ \else
+ \let\temp\argcheckspaces
+ \fi
+ % Put the space token in:
+ \temp#1 #3\ArgTerm
+}
+
+% If a _delimited_ argument is enclosed in braces, they get stripped; so
+% to get _exactly_ the rest of the line, we had to prevent such situation.
+% We prepended an \empty token at the very beginning and we expand it now,
+% just before passing the control to \argtorun.
+% (Similarily, we have to think about #3 of \argcheckspacesY above: it is
+% either the null string, or it ends with \^^M---thus there is no danger
+% that a pair of braces would be stripped.
+%
+% But first, we have to remove the trailing space token.
+%
+\def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}}
+
+% \parseargdef\foo{...}
+% is roughly equivalent to
+% \def\foo{\parsearg\Xfoo}
+% \def\Xfoo#1{...}
+%
+% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my
+% favourite TeX trick. --kasal, 16nov03
+
+\def\parseargdef#1{%
+ \expandafter \doparseargdef \csname\string#1\endcsname #1%
+}
+\def\doparseargdef#1#2{%
+ \def#2{\parsearg#1}%
+ \def#1##1%
+}
+
+% Several utility definitions with active space:
+{
+ \obeyspaces
+ \gdef\obeyedspace{ }
+
+ % Make each space character in the input produce a normal interword
+ % space in the output. Don't allow a line break at this space, as this
+ % is used only in environments like @example, where each line of input
+ % should produce a line of output anyway.
+ %
+ \gdef\sepspaces{\obeyspaces\let =\tie}
+
+ % If an index command is used in an @example environment, any spaces
+ % therein should become regular spaces in the raw index file, not the
+ % expansion of \tie (\leavevmode \penalty \@M \ ).
+ \gdef\unsepspaces{\let =\space}
+}
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+% Define the framework for environments in texinfo.tex. It's used like this:
+%
+% \envdef\foo{...}
+% \def\Efoo{...}
+%
+% It's the responsibility of \envdef to insert \begingroup before the
+% actual body; @end closes the group after calling \Efoo. \envdef also
+% defines \thisenv, so the current environment is known; @end checks
+% whether the environment name matches. The \checkenv macro can also be
+% used to check whether the current environment is the one expected.
+%
+% Non-false conditionals (@iftex, @ifset) don't fit into this, so they
+% are not treated as enviroments; they don't open a group. (The
+% implementation of @end takes care not to call \endgroup in this
+% special case.)
+
+
+% At runtime, environments start with this:
+\def\startenvironment#1{\begingroup\def\thisenv{#1}}
+% initialize
+\let\thisenv\empty
+
+% ... but they get defined via ``\envdef\foo{...}'':
+\long\def\envdef#1#2{\def#1{\startenvironment#1#2}}
+\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}}
+
+% Check whether we're in the right environment:
+\def\checkenv#1{%
+ \def\temp{#1}%
+ \ifx\thisenv\temp
+ \else
+ \badenverr
+ \fi
+}
+
+% Evironment mismatch, #1 expected:
+\def\badenverr{%
+ \errhelp = \EMsimple
+ \errmessage{This command can appear only \inenvironment\temp,
+ not \inenvironment\thisenv}%
+}
+\def\inenvironment#1{%
+ \ifx#1\empty
+ out of any environment%
+ \else
+ in environment \expandafter\string#1%
+ \fi
+}
+
+% @end foo executes the definition of \Efoo.
+% But first, it executes a specialized version of \checkenv
+%
+\parseargdef\end{%
+ \if 1\csname iscond.#1\endcsname
+ \else
+ % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03
+ \expandafter\checkenv\csname#1\endcsname
+ \csname E#1\endcsname
+ \endgroup
+ \fi
+}
+
+\newhelp\EMsimple{Press RETURN to continue.}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+ % Definitions to produce \{ and \} commands for indices,
+ % and @{ and @} for the aux/toc files.
+ \catcode`\{ = \other \catcode`\} = \other
+ \catcode`\[ = 1 \catcode`\] = 2
+ \catcode`\! = 0 \catcode`\\ = \other
+ !gdef!lbracecmd[\{]%
+ !gdef!rbracecmd[\}]%
+ !gdef!lbraceatcmd[@{]%
+ !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% @comma{} to avoid , parsing problems.
+\let\comma = ,
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown @ordf @ordm
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}}
+\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+ \def\temp{#1}%
+ \ifx\temp\imacro \ptexi
+ \else\ifx\temp\jmacro \j
+ \else \errmessage{@dotless can be used only with i or j}%
+ \fi\fi
+}
+
+% The \TeX{} logo, as in plain, but resetting the spacing so that a
+% period following counts as ending a sentence. (Idea found in latex.)
+%
+\edef\TeX{\TeX \spacefactor=1000 }
+
+% @LaTeX{} logo. Not quite the same results as the definition in
+% latex.ltx, since we use a different font for the raised A; it's most
+% convenient for us to use an explicitly smaller font, rather than using
+% the \scriptstyle font (since we don't reset \scriptstyle and
+% \scriptscriptstyle).
+%
+\def\LaTeX{%
+ L\kern-.36em
+ {\setbox0=\hbox{T}%
+ \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}%
+ \kern-.15em
+ \TeX
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=\endofsentencespacefactor\space}
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=\endofsentencespacefactor\space}
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=\endofsentencespacefactor\space}
+
+% @frenchspacing on|off says whether to put extra space after punctuation.
+%
+\def\onword{on}
+\def\offword{off}
+%
+\parseargdef\frenchspacing{%
+ \def\temp{#1}%
+ \ifx\temp\onword \plainfrenchspacing
+ \else\ifx\temp\offword \plainnonfrenchspacing
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @frenchspacing option `\temp', must be on/off}%
+ \fi\fi
+}
+
+% @w prevents a word break. Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox. We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line. According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0). If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large. This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material. In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom. The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\envdef\group{%
+ \ifnum\catcode`\^^M=\active \else
+ \errhelp = \groupinvalidhelp
+ \errmessage{@group invalid in context where filling is enabled}%
+ \fi
+ \startsavinginserts
+ %
+ \setbox\groupbox = \vtop\bgroup
+ % Do @comment since we are called inside an environment such as
+ % @example, where each end-of-line in the input causes an
+ % end-of-line in the output. We don't want the end-of-line after
+ % the `@group' to put extra space in the output. Since @group
+ % should appear on a line by itself (according to the Texinfo
+ % manual), we don't worry about eating any user text.
+ \comment
+}
+%
+% The \vtop produces a box with normal height and large depth; thus, TeX puts
+% \baselineskip glue before it, and (when the next line of text is done)
+% \lineskip glue after it. Thus, space below is not quite equal to space
+% above. But it's pretty close.
+\def\Egroup{%
+ % To get correct interline space between the last line of the group
+ % and the first line afterwards, we have to propagate \prevdepth.
+ \endgraf % Not \par, as it may have been set to \lisppar.
+ \global\dimen1 = \prevdepth
+ \egroup % End the \vtop.
+ % \dimen0 is the vertical size of the group's box.
+ \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox
+ % \dimen2 is how much space is left on the page (more or less).
+ \dimen2 = \pageheight \advance\dimen2 by -\pagetotal
+ % if the group doesn't fit on the current page, and it's a big big
+ % group, force a page break.
+ \ifdim \dimen0 > \dimen2
+ \ifdim \pagetotal < \vfilllimit\pageheight
+ \page
+ \fi
+ \fi
+ \box\groupbox
+ \prevdepth = \dimen1
+ \checkinserts
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil \mil=0.001in
+
+% Old definition--didn't work.
+%\parseargdef\need{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\parseargdef\need{%
+ % Ensure vertical mode, so we don't make a big box in the middle of a
+ % paragraph.
+ \par
+ %
+ % If the @need value is less than one line space, it's useless.
+ \dimen0 = #1\mil
+ \dimen2 = \ht\strutbox
+ \advance\dimen2 by \dp\strutbox
+ \ifdim\dimen0 > \dimen2
+ %
+ % Do a \strut just to make the height of this box be normal, so the
+ % normal leading is inserted relative to the preceding line.
+ % And a page break here is fine.
+ \vtop to #1\mil{\strut\vfil}%
+ %
+ % TeX does not even consider page breaks if a penalty added to the
+ % main vertical list is 10000 or more. But in order to see if the
+ % empty box we just added fits on the page, we must make it consider
+ % page breaks. On the other hand, we don't want to actually break the
+ % page after the empty box. So we use a penalty of 9999.
+ %
+ % There is an extremely small chance that TeX will actually break the
+ % page at this \penalty, if there are no other feasible breakpoints in
+ % sight. (If the user is using lots of big @group commands, which
+ % almost-but-not-quite fill up a page, TeX will have a hard time doing
+ % good page breaking, for example.) However, I could not construct an
+ % example where a page broke at this \penalty; if it happens in a real
+ % document, then we can reconsider our strategy.
+ \penalty9999
+ %
+ % Back up by the size of the box, whether we did a page break or not.
+ \kern -#1\mil
+ %
+ % Do not allow a page break right after this kern.
+ \nobreak
+ \fi
+}
+
+% @br forces paragraph break (and is undocumented).
+
+\let\br = \par
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}
+
+% This defn is used inside nofill environments such as @example.
+\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount
+ \leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph. For more general purposes, use the \margin insertion
+% class. WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+ \nobreak
+ \kern-\strutdepth
+ \vtop to \strutdepth{%
+ \baselineskip=\strutdepth
+ \vss
+ % if you have multiple lines of stuff to put here, you'll need to
+ % make the vbox yourself of the appropriate size.
+ \ifx#1l%
+ \llap{\ignorespaces #2\hskip\inmarginspacing}%
+ \else
+ \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+ \fi
+ \null
+ }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \def\lefttext{#1}% have both texts
+ \def\righttext{#2}%
+ \else
+ \def\lefttext{#1}% have only one text
+ \def\righttext{#1}%
+ \fi
+ %
+ \ifodd\pageno
+ \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+ \else
+ \def\temp{\inleftmargin\lefttext}%
+ \fi
+ \temp
+}
+
+% @include file insert text of that file as input.
+%
+\def\include{\parseargusing\filenamecatcodes\includezzz}
+\def\includezzz#1{%
+ \pushthisfilestack
+ \def\thisfile{#1}%
+ {%
+ \makevalueexpandable
+ \def\temp{\input #1 }%
+ \expandafter
+ }\temp
+ \popthisfilestack
+}
+\def\filenamecatcodes{%
+ \catcode`\\=\other
+ \catcode`~=\other
+ \catcode`^=\other
+ \catcode`_=\other
+ \catcode`|=\other
+ \catcode`<=\other
+ \catcode`>=\other
+ \catcode`+=\other
+ \catcode`-=\other
+}
+
+\def\pushthisfilestack{%
+ \expandafter\pushthisfilestackX\popthisfilestack\StackTerm
+}
+\def\pushthisfilestackX{%
+ \expandafter\pushthisfilestackY\thisfile\StackTerm
+}
+\def\pushthisfilestackY #1\StackTerm #2\StackTerm {%
+ \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}%
+}
+
+\def\popthisfilestack{\errthisfilestackempty}
+\def\errthisfilestackempty{\errmessage{Internal error:
+ the stack of filenames is empty.}}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\parseargdef\center{%
+ \ifhmode
+ \let\next\centerH
+ \else
+ \let\next\centerV
+ \fi
+ \next{\hfil \ignorespaces#1\unskip \hfil}%
+}
+\def\centerH#1{%
+ {%
+ \hfil\break
+ \advance\hsize by -\leftskip
+ \advance\hsize by -\rightskip
+ \line{#1}%
+ \break
+ }%
+}
+\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}}
+
+% @sp n outputs n lines of vertical space
+
+\parseargdef\sp{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\parseargdef\paragraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \defaultparindent = 0pt
+ \else
+ \defaultparindent = #1em
+ \fi
+ \fi
+ \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\parseargdef\exampleindent{%
+ \def\temp{#1}%
+ \ifx\temp\asisword
+ \else
+ \ifx\temp\noneword
+ \lispnarrowing = 0pt
+ \else
+ \lispnarrowing = #1em
+ \fi
+ \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading. If WORD is `insert', then do indent at such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.
+% We switch the definition of this back and forth according to WORD.
+% By default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\def\insertword{insert}
+%
+\parseargdef\firstparagraphindent{%
+ \def\temp{#1}%
+ \ifx\temp\noneword
+ \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+ \else\ifx\temp\insertword
+ \let\suppressfirstparagraphindent = \relax
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @firstparagraphindent option `\temp'}%
+ \fi\fi
+}
+
+% Here is how we actually suppress indentation. Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+ \gdef\indent{%
+ \restorefirstparagraphindent
+ \indent
+ }%
+ \gdef\noindent{%
+ \restorefirstparagraphindent
+ \noindent
+ }%
+ \global\everypar = {%
+ \kern -\parindent
+ \restorefirstparagraphindent
+ }%
+}
+
+\gdef\restorefirstparagraphindent{%
+ \global \let \indent = \ptexindent
+ \global \let \noindent = \ptexnoindent
+ \global \everypar = {}%
+}
+
+
+% @asis just yields its argument. Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}. So make
+% _ active, and distinguish by seeing if the current family is \slfam,
+% which is what @var uses.
+{
+ \catcode`\_ = \active
+ \gdef\mathunderscore{%
+ \catcode`\_=\active
+ \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+ }
+}
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care. Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+ \tex
+ \mathunderscore
+ \let\\ = \mathbackslash
+ \mathactive
+ $\finishmath
+}
+\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex.
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an argument
+% to a command which sets the catcodes (such as @item or @section).
+%
+{
+ \catcode`^ = \active
+ \catcode`< = \active
+ \catcode`> = \active
+ \catcode`+ = \active
+ \gdef\mathactive{%
+ \let^ = \ptexhat
+ \let< = \ptexless
+ \let> = \ptexgtr
+ \let+ = \ptexplus
+ }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% @dots{} outputs an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in the cm
+% typewriter fonts as three actual period characters; on the other hand,
+% in other typewriter fonts three periods are wider than 1.5em. So do
+% whichever is larger.
+%
+\def\dots{%
+ \leavevmode
+ \setbox0=\hbox{...}% get width of three periods
+ \ifdim\wd0 > 1.5em
+ \dimen0 = \wd0
+ \else
+ \dimen0 = 1.5em
+ \fi
+ \hbox to \dimen0{%
+ \hskip 0pt plus.25fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus1fil
+ .\hskip 0pt plus.5fil
+ }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+ \dots
+ \spacefactor=\endofsentencespacefactor
+}
+
+% @comma{} is so commas can be inserted into text without messing up
+% Texinfo's parsing.
+%
+\let\comma = ,
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+ \fixbackslash % Turn off hack to swallow `\input texinfo'.
+ \iflinks
+ \tryauxfile
+ % Open the new aux file. TeX will close it automatically at exit.
+ \immediate\openout\auxfile=\jobname.aux
+ \fi % \openindices needs to do some work in any case.
+ \openindices
+ \let\setfilename=\comment % Ignore extra @setfilename cmds.
+ %
+ % If texinfo.cnf is present on the system, read it.
+ % Useful for site-wide @afourpaper, etc.
+ \openin 1 texinfo.cnf
+ \ifeof 1 \else \input texinfo.cnf \fi
+ \closein 1
+ %
+ \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+ \newindex{cp}%
+ \newcodeindex{fn}%
+ \newcodeindex{vr}%
+ \newcodeindex{tp}%
+ \newcodeindex{ky}%
+ \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1
+% can be set). So we test for \relax and 0 as well as \undefined,
+% borrowed from ifpdf.sty.
+\ifx\pdfoutput\undefined
+\else
+ \ifx\pdfoutput\relax
+ \else
+ \ifcase\pdfoutput
+ \else
+ \pdftrue
+ \fi
+ \fi
+\fi
+
+% PDF uses PostScript string constants for the names of xref targets,
+% for display in the outlines, and in other places. Thus, we have to
+% double any backslashes. Otherwise, a name like "\node" will be
+% interpreted as a newline (\n), followed by o, d, e. Not good.
+% http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html
+% (and related messages, the final outcome is that it is up to the TeX
+% user to double the backslashes and otherwise make the string valid, so
+% that's what we do).
+
+% double active backslashes.
+%
+{\catcode`\@=0 \catcode`\\=\active
+ @gdef@activebackslashdouble{%
+ @catcode`@\=@active
+ @let\=@doublebackslash}
+}
+
+% To handle parens, we must adopt a different approach, since parens are
+% not active characters. hyperref.dtx (which has the same problem as
+% us) handles it with this amazing macro to replace tokens, with minor
+% changes for Texinfo. It is included here under the GPL by permission
+% from the author, Heiko Oberdiek.
+%
+% #1 is the tokens to replace.
+% #2 is the replacement.
+% #3 is the control sequence with the string.
+%
+\def\HyPsdSubst#1#2#3{%
+ \def\HyPsdReplace##1#1##2\END{%
+ ##1%
+ \ifx\\##2\\%
+ \else
+ #2%
+ \HyReturnAfterFi{%
+ \HyPsdReplace##2\END
+ }%
+ \fi
+ }%
+ \xdef#3{\expandafter\HyPsdReplace#3#1\END}%
+}
+\long\def\HyReturnAfterFi#1\fi{\fi#1}
+
+% #1 is a control sequence in which to do the replacements.
+\def\backslashparens#1{%
+ \xdef#1{#1}% redefine it as its expansion; the definition is simply
+ % \lastnode when called from \setref -> \pdfmkdest.
+ \HyPsdSubst{(}{\realbackslash(}{#1}%
+ \HyPsdSubst{)}{\realbackslash)}{#1}%
+}
+
+\newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images
+with PDF output, and none of those formats could be found. (.eps cannot
+be supported due to the design of the PDF format; use regular TeX (DVI
+output) for that.)}
+
+\ifpdf
+ %
+ % Color manipulation macros based on pdfcolor.tex.
+ \def\cmykDarkRed{0.28 1 1 0.35}
+ \def\cmykBlack{0 0 0 1}
+ %
+ \def\pdfsetcolor#1{\pdfliteral{#1 k}}
+ % Set color, and create a mark which defines \thiscolor accordingly,
+ % so that \makeheadline knows which color to restore.
+ \def\setcolor#1{%
+ \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}%
+ \domark
+ \pdfsetcolor{#1}%
+ }
+ %
+ \def\maincolor{\cmykBlack}
+ \pdfsetcolor{\maincolor}
+ \edef\thiscolor{\maincolor}
+ \def\lastcolordefs{}
+ %
+ \def\makefootline{%
+ \baselineskip24pt
+ \line{\pdfsetcolor{\maincolor}\the\footline}%
+ }
+ %
+ \def\makeheadline{%
+ \vbox to 0pt{%
+ \vskip-22.5pt
+ \line{%
+ \vbox to8.5pt{}%
+ % Extract \thiscolor definition from the marks.
+ \getcolormarks
+ % Typeset the headline with \maincolor, then restore the color.
+ \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}%
+ }%
+ \vss
+ }%
+ \nointerlineskip
+ }
+ %
+ %
+ \pdfcatalog{/PageMode /UseOutlines}
+ %
+ % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto).
+ \def\dopdfimage#1#2#3{%
+ \def\imagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}%
+ \def\imageheight{#3}\setbox2 = \hbox{\ignorespaces #3}%
+ %
+ % pdftex (and the PDF format) support .png, .jpg, .pdf (among
+ % others). Let's try in that order.
+ \let\pdfimgext=\empty
+ \begingroup
+ \openin 1 #1.png \ifeof 1
+ \openin 1 #1.jpg \ifeof 1
+ \openin 1 #1.jpeg \ifeof 1
+ \openin 1 #1.JPG \ifeof 1
+ \openin 1 #1.pdf \ifeof 1
+ \errhelp = \nopdfimagehelp
+ \errmessage{Could not find image file #1 for pdf}%
+ \else \gdef\pdfimgext{pdf}%
+ \fi
+ \else \gdef\pdfimgext{JPG}%
+ \fi
+ \else \gdef\pdfimgext{jpeg}%
+ \fi
+ \else \gdef\pdfimgext{jpg}%
+ \fi
+ \else \gdef\pdfimgext{png}%
+ \fi
+ \closein 1
+ \endgroup
+ %
+ % without \immediate, pdftex seg faults when the same image is
+ % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.)
+ \ifnum\pdftexversion < 14
+ \immediate\pdfimage
+ \else
+ \immediate\pdfximage
+ \fi
+ \ifdim \wd0 >0pt width \imagewidth \fi
+ \ifdim \wd2 >0pt height \imageheight \fi
+ \ifnum\pdftexversion<13
+ #1.\pdfimgext
+ \else
+ {#1.\pdfimgext}%
+ \fi
+ \ifnum\pdftexversion < 14 \else
+ \pdfrefximage \pdflastximage
+ \fi}
+ %
+ \def\pdfmkdest#1{{%
+ % We have to set dummies so commands such as @code, and characters
+ % such as \, aren't expanded when present in a section title.
+ \indexnofonts
+ \turnoffactive
+ \activebackslashdouble
+ \makevalueexpandable
+ \def\pdfdestname{#1}%
+ \backslashparens\pdfdestname
+ \safewhatsit{\pdfdest name{\pdfdestname} xyz}%
+ }}
+ %
+ % used to mark target names; must be expandable.
+ \def\pdfmkpgn#1{#1}
+ %
+ % by default, use a color that is dark enough to print on paper as
+ % nearly black, but still distinguishable for online viewing.
+ \def\urlcolor{\cmykDarkRed}
+ \def\linkcolor{\cmykDarkRed}
+ \def\endlink{\setcolor{\maincolor}\pdfendlink}
+ %
+ % Adding outlines to PDF; macros for calculating structure of outlines
+ % come from Petr Olsak
+ \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+ \else \csname#1\endcsname \fi}
+ \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+ \advance\tempnum by 1
+ \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+ %
+ % #1 is the section text, which is what will be displayed in the
+ % outline by the pdf viewer. #2 is the pdf expression for the number
+ % of subentries (or empty, for subsubsections). #3 is the node text,
+ % which might be empty if this toc entry had no corresponding node.
+ % #4 is the page number
+ %
+ \def\dopdfoutline#1#2#3#4{%
+ % Generate a link to the node text if that exists; else, use the
+ % page number. We could generate a destination for the section
+ % text in the case where a section has no node, but it doesn't
+ % seem worth the trouble, since most documents are normally structured.
+ \def\pdfoutlinedest{#3}%
+ \ifx\pdfoutlinedest\empty
+ \def\pdfoutlinedest{#4}%
+ \else
+ % Doubled backslashes in the name.
+ {\activebackslashdouble \xdef\pdfoutlinedest{#3}%
+ \backslashparens\pdfoutlinedest}%
+ \fi
+ %
+ % Also double the backslashes in the display string.
+ {\activebackslashdouble \xdef\pdfoutlinetext{#1}%
+ \backslashparens\pdfoutlinetext}%
+ %
+ \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}%
+ }
+ %
+ \def\pdfmakeoutlines{%
+ \begingroup
+ % Thanh's hack / proper braces in bookmarks
+ \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+ \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+ %
+ % Read toc silently, to get counts of subentries for \pdfoutline.
+ \def\numchapentry##1##2##3##4{%
+ \def\thischapnum{##2}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsecentry##1##2##3##4{%
+ \advancenumber{chap\thischapnum}%
+ \def\thissecnum{##2}%
+ \def\thissubsecnum{0}%
+ }%
+ \def\numsubsecentry##1##2##3##4{%
+ \advancenumber{sec\thissecnum}%
+ \def\thissubsecnum{##2}%
+ }%
+ \def\numsubsubsecentry##1##2##3##4{%
+ \advancenumber{subsec\thissubsecnum}%
+ }%
+ \def\thischapnum{0}%
+ \def\thissecnum{0}%
+ \def\thissubsecnum{0}%
+ %
+ % use \def rather than \let here because we redefine \chapentry et
+ % al. a second time, below.
+ \def\appentry{\numchapentry}%
+ \def\appsecentry{\numsecentry}%
+ \def\appsubsecentry{\numsubsecentry}%
+ \def\appsubsubsecentry{\numsubsubsecentry}%
+ \def\unnchapentry{\numchapentry}%
+ \def\unnsecentry{\numsecentry}%
+ \def\unnsubsecentry{\numsubsecentry}%
+ \def\unnsubsubsecentry{\numsubsubsecentry}%
+ \readdatafile{toc}%
+ %
+ % Read toc second time, this time actually producing the outlines.
+ % The `-' means take the \expnumber as the absolute number of
+ % subentries, which we calculated on our first read of the .toc above.
+ %
+ % We use the node names as the destinations.
+ \def\numchapentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}%
+ \def\numsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}%
+ \def\numsubsecentry##1##2##3##4{%
+ \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}%
+ \def\numsubsubsecentry##1##2##3##4{% count is always zero
+ \dopdfoutline{##1}{}{##3}{##4}}%
+ %
+ % PDF outlines are displayed using system fonts, instead of
+ % document fonts. Therefore we cannot use special characters,
+ % since the encoding is unknown. For example, the eogonek from
+ % Latin 2 (0xea) gets translated to a | character. Info from
+ % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100.
+ %
+ % xx to do this right, we have to translate 8-bit characters to
+ % their "best" equivalent, based on the @documentencoding. Right
+ % now, I guess we'll just let the pdf reader have its way.
+ \indexnofonts
+ \setupdatafile
+ \catcode`\\=\active \otherbackslash
+ \input \tocreadfilename
+ \endgroup
+ }
+ %
+ \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+ \ifx\PP\D\let\nextsp\relax
+ \else\let\nextsp\skipspaces
+ \ifx\p\space\else\addtokens{\filename}{\PP}%
+ \advance\filenamelength by 1
+ \fi
+ \fi
+ \nextsp}
+ \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+ \ifnum\pdftexversion < 14
+ \let \startlink \pdfannotlink
+ \else
+ \let \startlink \pdfstartlink
+ \fi
+ % make a live url in pdf output.
+ \def\pdfurl#1{%
+ \begingroup
+ % it seems we really need yet another set of dummies; have not
+ % tried to figure out what each command should do in the context
+ % of @url. for now, just make @/ a no-op, that's the only one
+ % people have actually reported a problem with.
+ %
+ \normalturnoffactive
+ \def\@{@}%
+ \let\/=\empty
+ \makevalueexpandable
+ \leavevmode\setcolor{\urlcolor}%
+ \startlink attr{/Border [0 0 0]}%
+ user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+ \endgroup}
+ \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+ \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+ \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+ \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+ \def\maketoks{%
+ \expandafter\poptoks\the\toksA|ENDTOKS|\relax
+ \ifx\first0\adn0
+ \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+ \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+ \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+ \else
+ \ifnum0=\countA\else\makelink\fi
+ \ifx\first.\let\next=\done\else
+ \let\next=\maketoks
+ \addtokens{\toksB}{\the\toksD}
+ \ifx\first,\addtokens{\toksB}{\space}\fi
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \next}
+ \def\makelink{\addtokens{\toksB}%
+ {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+ \def\pdflink#1{%
+ \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+ \setcolor{\linkcolor}#1\endlink}
+ \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\else
+ \let\pdfmkdest = \gobble
+ \let\pdfurl = \gobble
+ \let\endlink = \relax
+ \let\setcolor = \gobble
+ \let\pdfsetcolor = \gobble
+ \let\pdfmakeoutlines = \relax
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+
+% Change the current font style to #1, remembering it in \curfontstyle.
+% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in
+% italics, not bold italics.
+%
+\def\setfontstyle#1{%
+ \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd.
+ \csname ten#1\endcsname % change the current font
+}
+
+% Select #1 fonts with the current style.
+%
+\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname}
+
+\def\rm{\fam=0 \setfontstyle{rm}}
+\def\it{\fam=\itfam \setfontstyle{it}}
+\def\sl{\fam=\slfam \setfontstyle{sl}}
+\def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
+\def\tt{\fam=\ttfam \setfontstyle{tt}}
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf.
+\newfam\sffam
+\def\sf{\fam=\sffam \setfontstyle{sf}}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this font style.
+\def\ttsl{\setfontstyle{ttsl}}
+
+
+% Default leading.
+\newdimen\textleading \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly. There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+% can get a sort of poor man's double spacing by redefining this.
+\def\baselinefactor{1}
+%
+\def\setleading#1{%
+ \dimen0 = #1\relax
+ \normalbaselineskip = \baselinefactor\dimen0
+ \normallineskip = \lineskipfactor\normalbaselineskip
+ \normalbaselines
+ \setbox\strutbox =\hbox{%
+ \vrule width0pt height\strutheightpercent\baselineskip
+ depth \strutdepthpercent \baselineskip
+ }%
+}
+
+% PDF CMaps. See also LaTeX's t1.cmap.
+%
+% do nothing with this by default.
+\expandafter\let\csname cmapOT1\endcsname\gobble
+\expandafter\let\csname cmapOT1IT\endcsname\gobble
+\expandafter\let\csname cmapOT1TT\endcsname\gobble
+
+% if we are producing pdf, and we have \pdffontattr, then define cmaps.
+% (\pdffontattr was introduced many years ago, but people still run
+% older pdftex's; it's easy to conditionalize, so we do.)
+\ifpdf \ifx\pdffontattr\undefined \else
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1-0)
+%%Title: (TeX-OT1-0 TeX OT1 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<23> <26> <0023>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+40 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1IT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1IT-0)
+%%Title: (TeX-OT1IT-0 TeX OT1IT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1IT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1IT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+8 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<25> <26> <0025>
+<28> <3B> <0028>
+<3F> <5B> <003F>
+<5D> <5E> <005D>
+<61> <7A> <0061>
+<7B> <7C> <2013>
+endbfrange
+42 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <00660066>
+<0C> <00660069>
+<0D> <0066006C>
+<0E> <006600660069>
+<0F> <00660066006C>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<21> <0021>
+<22> <201D>
+<23> <0023>
+<24> <00A3>
+<27> <2019>
+<3C> <00A1>
+<3D> <003D>
+<3E> <00BF>
+<5C> <201C>
+<5F> <02D9>
+<60> <2018>
+<7D> <02DD>
+<7E> <007E>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1IT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+%
+% \cmapOT1TT
+ \begingroup
+ \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char.
+ \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (TeX-OT1TT-0)
+%%Title: (TeX-OT1TT-0 TeX OT1TT 0)
+%%Version: 1.000
+%%EndComments
+/CIDInit /ProcSet findresource begin
+12 dict begin
+begincmap
+/CIDSystemInfo
+<< /Registry (TeX)
+/Ordering (OT1TT)
+/Supplement 0
+>> def
+/CMapName /TeX-OT1TT-0 def
+/CMapType 2 def
+1 begincodespacerange
+<00> <7F>
+endcodespacerange
+5 beginbfrange
+<00> <01> <0393>
+<09> <0A> <03A8>
+<21> <26> <0021>
+<28> <5F> <0028>
+<61> <7E> <0061>
+endbfrange
+32 beginbfchar
+<02> <0398>
+<03> <039B>
+<04> <039E>
+<05> <03A0>
+<06> <03A3>
+<07> <03D2>
+<08> <03A6>
+<0B> <2191>
+<0C> <2193>
+<0D> <0027>
+<0E> <00A1>
+<0F> <00BF>
+<10> <0131>
+<11> <0237>
+<12> <0060>
+<13> <00B4>
+<14> <02C7>
+<15> <02D8>
+<16> <00AF>
+<17> <02DA>
+<18> <00B8>
+<19> <00DF>
+<1A> <00E6>
+<1B> <0153>
+<1C> <00F8>
+<1D> <00C6>
+<1E> <0152>
+<1F> <00D8>
+<20> <2423>
+<27> <2019>
+<60> <2018>
+<7F> <00A8>
+endbfchar
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
+ }\endgroup
+ \expandafter\edef\csname cmapOT1TT\endcsname#1{%
+ \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}%
+ }%
+\fi\fi
+
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor, #5 is the CMap
+% encoding (currently only OT1, OT1IT and OT1TT are allowed, pass
+% empty to omit).
+\def\setfont#1#2#3#4#5{%
+ \font#1=\fontprefix#2#3 scaled #4
+ \csname cmap#5\endcsname#1%
+}
+% This is what gets called when #5 of \setfont is empty.
+\let\cmap\gobble
+% emacs-page end of cmaps
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx} %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+% Definitions for a main text size of 11pt. This is the default in
+% Texinfo.
+%
+\def\definetextfontsizexi{%
+% Text fonts (11.2pt, magstep1).
+\def\textnominalsize{11pt}
+\edef\mainmagstep{\magstephalf}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1095}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstep1}{OT1}
+\setfont\deftt\ttshape{10}{\magstep1}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+\def\titleecsize{2074}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\def\chapnominalsize{17pt}
+\setfont\chaprm\rmbshape{12}{\magstep2}{OT1}
+\setfont\chapit\itbshape{10}{\magstep3}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep3}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT}
+\setfont\chapsf\sfbshape{17}{1000}{OT1}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}{OT1}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+\def\chapecsize{1728}
+
+% Section fonts (14.4pt).
+\def\secnominalsize{14pt}
+\setfont\secrm\rmbshape{12}{\magstep1}{OT1}
+\setfont\secit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep2}{OT1}
+\setfont\sectt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\secsf\sfbshape{12}{\magstep1}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}{OT1}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+\def\sececsize{1440}
+
+% Subsection fonts (13.15pt).
+\def\ssecnominalsize{13pt}
+\setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1}
+\setfont\ssecit\itbshape{10}{1315}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1315}{OT1}
+\setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1315}{OT1TT}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1315}{OT1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+\def\ssececsize{1200}
+
+% Reduced fonts for @acro in text (10pt).
+\def\reducednominalsize{10pt}
+\setfont\reducedrm\rmshape{10}{1000}{OT1}
+\setfont\reducedtt\ttshape{10}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{1000}{OT1}
+\setfont\reducedit\itshape{10}{1000}{OT1IT}
+\setfont\reducedsl\slshape{10}{1000}{OT1}
+\setfont\reducedsf\sfshape{10}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{1000}{OT1}
+\setfont\reducedttsl\ttslshape{10}{1000}{OT1TT}
+\font\reducedi=cmmi10
+\font\reducedsy=cmsy10
+\def\reducedecsize{1000}
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 11pt text font size definitions
+
+
+% Definitions to make the main text be 10pt Computer Modern, with
+% section, chapter, etc., sizes following suit. This is for the GNU
+% Press printing of the Emacs 22 manual. Maybe other manuals in the
+% future. Used with @smallbook, which sets the leading to 12pt.
+%
+\def\definetextfontsizex{%
+% Text fonts (10pt).
+\def\textnominalsize{10pt}
+\edef\mainmagstep{1000}
+\setfont\textrm\rmshape{10}{\mainmagstep}{OT1}
+\setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT}
+\setfont\textbf\bfshape{10}{\mainmagstep}{OT1}
+\setfont\textit\itshape{10}{\mainmagstep}{OT1IT}
+\setfont\textsl\slshape{10}{\mainmagstep}{OT1}
+\setfont\textsf\sfshape{10}{\mainmagstep}{OT1}
+\setfont\textsc\scshape{10}{\mainmagstep}{OT1}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+\def\textecsize{1000}
+
+% A few fonts for @defun names and args.
+\setfont\defbf\bfshape{10}{\magstephalf}{OT1}
+\setfont\deftt\ttshape{10}{\magstephalf}{OT1TT}
+\setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\def\smallnominalsize{9pt}
+\setfont\smallrm\rmshape{9}{1000}{OT1}
+\setfont\smalltt\ttshape{9}{1000}{OT1TT}
+\setfont\smallbf\bfshape{10}{900}{OT1}
+\setfont\smallit\itshape{9}{1000}{OT1IT}
+\setfont\smallsl\slshape{9}{1000}{OT1}
+\setfont\smallsf\sfshape{9}{1000}{OT1}
+\setfont\smallsc\scshape{10}{900}{OT1}
+\setfont\smallttsl\ttslshape{10}{900}{OT1TT}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+\def\smallecsize{0900}
+
+% Fonts for small examples (8pt).
+\def\smallernominalsize{8pt}
+\setfont\smallerrm\rmshape{8}{1000}{OT1}
+\setfont\smallertt\ttshape{8}{1000}{OT1TT}
+\setfont\smallerbf\bfshape{10}{800}{OT1}
+\setfont\smallerit\itshape{8}{1000}{OT1IT}
+\setfont\smallersl\slshape{8}{1000}{OT1}
+\setfont\smallersf\sfshape{8}{1000}{OT1}
+\setfont\smallersc\scshape{10}{800}{OT1}
+\setfont\smallerttsl\ttslshape{10}{800}{OT1TT}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+\def\smallerecsize{0800}
+
+% Fonts for title page (20.4pt):
+\def\titlenominalsize{20pt}
+\setfont\titlerm\rmbshape{12}{\magstep3}{OT1}
+\setfont\titleit\itbshape{10}{\magstep4}{OT1IT}
+\setfont\titlesl\slbshape{10}{\magstep4}{OT1}
+\setfont\titlett\ttbshape{12}{\magstep3}{OT1TT}
+\setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT}
+\setfont\titlesf\sfbshape{17}{\magstep1}{OT1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}{OT1}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+\def\titleecsize{2074}
+
+% Chapter fonts (14.4pt).
+\def\chapnominalsize{14pt}
+\setfont\chaprm\rmbshape{12}{\magstep1}{OT1}
+\setfont\chapit\itbshape{10}{\magstep2}{OT1IT}
+\setfont\chapsl\slbshape{10}{\magstep2}{OT1}
+\setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT}
+\setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT}
+\setfont\chapsf\sfbshape{12}{\magstep1}{OT1}
+\let\chapbf\chaprm
+\setfont\chapsc\scbshape{10}{\magstep2}{OT1}
+\font\chapi=cmmi12 scaled \magstep1
+\font\chapsy=cmsy10 scaled \magstep2
+\def\chapecsize{1440}
+
+% Section fonts (12pt).
+\def\secnominalsize{12pt}
+\setfont\secrm\rmbshape{12}{1000}{OT1}
+\setfont\secit\itbshape{10}{\magstep1}{OT1IT}
+\setfont\secsl\slbshape{10}{\magstep1}{OT1}
+\setfont\sectt\ttbshape{12}{1000}{OT1TT}
+\setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT}
+\setfont\secsf\sfbshape{12}{1000}{OT1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep1}{OT1}
+\font\seci=cmmi12
+\font\secsy=cmsy10 scaled \magstep1
+\def\sececsize{1200}
+
+% Subsection fonts (10pt).
+\def\ssecnominalsize{10pt}
+\setfont\ssecrm\rmbshape{10}{1000}{OT1}
+\setfont\ssecit\itbshape{10}{1000}{OT1IT}
+\setfont\ssecsl\slbshape{10}{1000}{OT1}
+\setfont\ssectt\ttbshape{10}{1000}{OT1TT}
+\setfont\ssecttsl\ttslshape{10}{1000}{OT1TT}
+\setfont\ssecsf\sfbshape{10}{1000}{OT1}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{1000}{OT1}
+\font\sseci=cmmi10
+\font\ssecsy=cmsy10
+\def\ssececsize{1000}
+
+% Reduced fonts for @acro in text (9pt).
+\def\reducednominalsize{9pt}
+\setfont\reducedrm\rmshape{9}{1000}{OT1}
+\setfont\reducedtt\ttshape{9}{1000}{OT1TT}
+\setfont\reducedbf\bfshape{10}{900}{OT1}
+\setfont\reducedit\itshape{9}{1000}{OT1IT}
+\setfont\reducedsl\slshape{9}{1000}{OT1}
+\setfont\reducedsf\sfshape{9}{1000}{OT1}
+\setfont\reducedsc\scshape{10}{900}{OT1}
+\setfont\reducedttsl\ttslshape{10}{900}{OT1TT}
+\font\reducedi=cmmi9
+\font\reducedsy=cmsy9
+\def\reducedecsize{0900}
+
+% reduce space between paragraphs
+\divide\parskip by 2
+
+% reset the current fonts
+\textfonts
+\rm
+} % end of 10pt text font size definitions
+
+
+% We provide the user-level command
+% @fonttextsize 10
+% (or 11) to redefine the text font size. pt is assumed.
+%
+\def\xword{10}
+\def\xiword{11}
+%
+\parseargdef\fonttextsize{%
+ \def\textsizearg{#1}%
+ \wlog{doing @fonttextsize \textsizearg}%
+ %
+ % Set \globaldefs so that documents can use this inside @tex, since
+ % makeinfo 4.8 does not support it, but we need it nonetheless.
+ %
+ \begingroup \globaldefs=1
+ \ifx\textsizearg\xword \definetextfontsizex
+ \else \ifx\textsizearg\xiword \definetextfontsizexi
+ \else
+ \errhelp=\EMsimple
+ \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'}
+ \fi\fi
+ \endgroup
+}
+
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families. Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+ \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+ \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+ \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE. We do this because \STYLE needs to also set the
+% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire
+% \tenSTYLE to set the current font.
+%
+% Each font-changing command also sets the names \lsize (one size lower)
+% and \lllsize (three sizes lower). These relative commands are used in
+% the LaTeX logo and acronyms.
+%
+% This all needs generalizing, badly.
+%
+\def\textfonts{%
+ \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+ \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+ \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+ \let\tenttsl=\textttsl
+ \def\curfontsize{text}%
+ \def\lsize{reduced}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+ \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+ \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+ \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+ \let\tenttsl=\titlettsl
+ \def\curfontsize{title}%
+ \def\lsize{chap}\def\lllsize{subsec}%
+ \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+ \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+ \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+ \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+ \let\tenttsl=\chapttsl
+ \def\curfontsize{chap}%
+ \def\lsize{sec}\def\lllsize{text}%
+ \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+ \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+ \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+ \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+ \let\tenttsl=\secttsl
+ \def\curfontsize{sec}%
+ \def\lsize{subsec}\def\lllsize{reduced}%
+ \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+ \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+ \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+ \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+ \let\tenttsl=\ssecttsl
+ \def\curfontsize{ssec}%
+ \def\lsize{text}\def\lllsize{small}%
+ \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts
+\def\reducedfonts{%
+ \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl
+ \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc
+ \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy
+ \let\tenttsl=\reducedttsl
+ \def\curfontsize{reduced}%
+ \def\lsize{small}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallfonts{%
+ \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+ \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+ \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+ \let\tenttsl=\smallttsl
+ \def\curfontsize{small}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+ \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+ \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+ \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+ \let\tenttsl=\smallerttsl
+ \def\curfontsize{smaller}%
+ \def\lsize{smaller}\def\lllsize{smaller}%
+ \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+% 8.5x11=86 smallbook=72 a4=90 a5=69
+% If we use \scriptfonts (8pt), then we can fit this many characters:
+% 8.5x11=90+ smallbook=80 a4=90+ a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt. So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+% 8.5x11=71 smallbook=60 a4=75 a5=58
+%
+% I wish the USA used A4 paper.
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\definetextfontsizexi
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}{OT1}
+\setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12
+\setfont\shortcontsl\slshape{12}{1000}{OT1}
+\setfont\shortconttt\ttshape{12}{1000}{OT1TT}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+ \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally uses \ttsl.
+% @var is set to this for defun arguments.
+\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx}
+
+% like \smartslanted except unconditionally use \sl. We never want
+% ttsl for book titles, do we?
+\def\cite#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\slanted=\smartslanted
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+
+% @b, explicit bold.
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% @sansserif, explicit sans.
+\def\sansserif#1{{\sf #1}}
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph. Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+ \def\plainfrenchspacing{%
+ \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+ \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+ \def\endofsentencespacefactor{1000}% for @. and friends
+ }
+ \def\plainnonfrenchspacing{%
+ \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250
+ \def\endofsentencespacefactor{3000}% for @. and friends
+ }
+\catcode`@=\other
+\def\endofsentencespacefactor{3000}% default
+
+\def\t#1{%
+ {\tt \rawbackslash \plainfrenchspacing #1}%
+ \null
+}
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}{OT1}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+ \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+ \vbox{\hrule\kern-0.4pt
+ \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+ \kern-0.4pt\hrule}%
+ \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+\def\key #1{{\nohyphenation \uppercase{#1}}\null}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+ {%
+ % Change normal interword space to be same as for the current font.
+ \spaceskip = \fontdimen2\font
+ %
+ % Switch to typewriter.
+ \tt
+ %
+ % But `\ ' produces the large typewriter interword space.
+ \def\ {{\spaceskip = 0pt{} }}%
+ %
+ % Turn off hyphenation.
+ \nohyphenation
+ %
+ \rawbackslash
+ \plainfrenchspacing
+ #1%
+ }%
+ \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in @code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+% -- rms.
+{
+ \catcode`\-=\active \catcode`\_=\active
+ \catcode`\'=\active \catcode`\`=\active
+ %
+ \global\def\code{\begingroup
+ \catcode\rquoteChar=\active \catcode\lquoteChar=\active
+ \let'\codequoteright \let`\codequoteleft
+ %
+ \catcode\dashChar=\active \catcode\underChar=\active
+ \ifallowcodebreaks
+ \let-\codedash
+ \let_\codeunder
+ \else
+ \let-\realdash
+ \let_\realunder
+ \fi
+ \codex
+ }
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+ % this is all so @math{@code{var_name}+1} can work. In math mode, _
+ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+ % will therefore expand the active definition of _, which is us
+ % (inside @code that is), therefore an endless loop.
+ \ifusingtt{\ifmmode
+ \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+ \else\normalunderscore \fi
+ \discretionary{}{}{}}%
+ {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% An additional complication: the above will allow breaks after, e.g.,
+% each of the four underscores in __typeof__. This is undesirable in
+% some manuals, especially if they don't have long identifiers in
+% general. @allowcodebreaks provides a way to control this.
+%
+\newif\ifallowcodebreaks \allowcodebreakstrue
+
+\def\keywordtrue{true}
+\def\keywordfalse{false}
+
+\parseargdef\allowcodebreaks{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\keywordtrue
+ \allowcodebreakstrue
+ \else\ifx\txiarg\keywordfalse
+ \allowcodebreaksfalse
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @allowcodebreaks option `\txiarg'}%
+ \fi\fi
+}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+% `example' (@kbd uses ttsl only inside of @example and friends),
+% or `code' (@kbd uses normal tty font always).
+\parseargdef\kbdinputstyle{%
+ \def\txiarg{#1}%
+ \ifx\txiarg\worddistinct
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+ \else\ifx\txiarg\wordexample
+ \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+ \else\ifx\txiarg\wordcode
+ \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+ \else
+ \errhelp = \EMsimple
+ \errmessage{Unknown @kbdinputstyle option `\txiarg'}%
+ \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
+\let\indicateurl=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself. First (mandatory) arg is the url. Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+ \unsepspaces
+ \pdfurl{#1}%
+ \setbox0 = \hbox{\ignorespaces #3}%
+ \ifdim\wd0 > 0pt
+ \unhbox0 % third arg given, show only that
+ \else
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0 > 0pt
+ \ifpdf
+ \unhbox0 % PDF: 2nd arg given, show only it
+ \else
+ \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+ \fi
+ \else
+ \code{#1}% only url given, so show it
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% @url synonym for @uref, since that's how everyone uses it.
+%
+\let\url=\uref
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+ \def\email#1{\doemail#1,,\finish}
+ \def\doemail#1,#2,#3\finish{\begingroup
+ \unsepspaces
+ \pdfurl{mailto:#1}%
+ \setbox0 = \hbox{\ignorespaces #2}%
+ \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+ \endlink
+ \endgroup}
+\else
+ \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font. Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'. The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find. We need it for
+% Polish suppressed-l. --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}} % roman font
+\def\sc#1{{\smallcaps#1}} % smallcaps font
+\def\ii#1{{\it #1}} % italic font
+
+% @acronym for "FBI", "NATO", and the like.
+% We print this one point size smaller, since it's intended for
+% all-uppercase.
+%
+\def\acronym#1{\doacronym #1,,\finish}
+\def\doacronym#1,#2,#3\finish{%
+ {\selectfonts\lsize #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @abbr for "Comput. J." and the like.
+% No font change, but don't do end-of-sentence spacing.
+%
+\def\abbr#1{\doabbr #1,,\finish}
+\def\doabbr#1,#2,#3\finish{%
+ {\plainfrenchspacing #1}%
+ \def\temp{#2}%
+ \ifx\temp\empty \else
+ \space ({\unsepspaces \ignorespaces \temp \unskip})%
+ \fi
+}
+
+% @pounds{} is a sterling sign, which Knuth put in the CM italic font.
+%
+\def\pounds{{\it\$}}
+
+% @euro{} comes from a separate font, depending on the current style.
+% We use the free feym* fonts from the eurosym package by Henrik
+% Theiling, which support regular, slanted, bold and bold slanted (and
+% "outlined" (blackboard board, sort of) versions, which we don't need).
+% It is available from http://www.ctan.org/tex-archive/fonts/eurosym.
+%
+% Although only regular is the truly official Euro symbol, we ignore
+% that. The Euro is designed to be slightly taller than the regular
+% font height.
+%
+% feymr - regular
+% feymo - slanted
+% feybr - bold
+% feybo - bold slanted
+%
+% There is no good (free) typewriter version, to my knowledge.
+% A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide.
+% Hmm.
+%
+% Also doesn't work in math. Do we need to do math with euro symbols?
+% Hope not.
+%
+%
+\def\euro{{\eurofont e}}
+\def\eurofont{%
+ % We set the font at each command, rather than predefining it in
+ % \textfonts and the other font-switching commands, so that
+ % installations which never need the symbol don't have to have the
+ % font installed.
+ %
+ % There is only one designed size (nominal 10pt), so we always scale
+ % that to the current nominal size.
+ %
+ % By the way, simply using "at 1em" works for cmr10 and the like, but
+ % does not work for cmbx10 and other extended/shrunken fonts.
+ %
+ \def\eurosize{\csname\curfontsize nominalsize\endcsname}%
+ %
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
+ \else
+ % regular:
+ \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize
+ \fi
+ \thiseurofont
+}
+
+% Hacks for glyphs from the EC fonts similar to \euro. We don't
+% use \let for the aliases, because sometimes we redefine the original
+% macro, and the alias should reflect the redefinition.
+\def\guillemetleft{{\ecfont \char"13}}
+\def\guillemotleft{\guillemetleft}
+\def\guillemetright{{\ecfont \char"14}}
+\def\guillemotright{\guillemetright}
+\def\guilsinglleft{{\ecfont \char"0E}}
+\def\guilsinglright{{\ecfont \char"0F}}
+\def\quotedblbase{{\ecfont \char"12}}
+\def\quotesinglbase{{\ecfont \char"0D}}
+%
+\def\ecfont{%
+ % We can't distinguish serif/sanserif and italic/slanted, but this
+ % is used for crude hacks anyway (like adding French and German
+ % quotes to documents typeset with CM, where we lose kerning), so
+ % hopefully nobody will notice/care.
+ \edef\ecsize{\csname\curfontsize ecsize\endcsname}%
+ \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}%
+ \ifx\curfontstyle\bfstylename
+ % bold:
+ \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize
+ \else
+ % regular:
+ \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize
+ \fi
+ \thisecfont
+}
+
+% @registeredsymbol - R in a circle. The font for the R should really
+% be smaller yet, but lllsize is the best we can do for now.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+ $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}%
+ \hfil\crcr\Orb}}%
+ }$%
+}
+
+% @textdegree - the normal degrees sign.
+%
+\def\textdegree{$^\circ$}
+
+% Laurent Siebenmann reports \Orb undefined with:
+% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38
+% so we'll define it if necessary.
+%
+\ifx\Orb\undefined
+\def\Orb{\mathhexbox20D}
+\fi
+
+% Quotes.
+\chardef\quotedblleft="5C
+\chardef\quotedblright=`\"
+\chardef\quoteleft=`\`
+\chardef\quoteright=`\'
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page. Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+ \endgroup\page\hbox{}\page}
+
+\envdef\titlepage{%
+ % Open one extra group, as we want to close it in the middle of \Etitlepage.
+ \begingroup
+ \parindent=0pt \textfonts
+ % Leave some space at the very top of the page.
+ \vglue\titlepagetopglue
+ % No rule at page bottom unless we print one at the top with @title.
+ \finishedtitlepagetrue
+ %
+ % Most title ``pages'' are actually two pages long, with space
+ % at the top of the second. We don't want the ragged left on the second.
+ \let\oldpage = \page
+ \def\page{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ \let\page = \oldpage
+ \page
+ \null
+ }%
+}
+
+\def\Etitlepage{%
+ \iffinishedtitlepage\else
+ \finishtitlepage
+ \fi
+ % It is important to do the page break before ending the group,
+ % because the headline and footline are only empty inside the group.
+ % If we use the new definition of \page, we always get a blank page
+ % after the title page, which we certainly don't want.
+ \oldpage
+ \endgroup
+ %
+ % Need this before the \...aftertitlepage checks so that if they are
+ % in effect the toc pages will come out with page numbers.
+ \HEADINGSon
+ %
+ % If they want short, they certainly want long too.
+ \ifsetshortcontentsaftertitlepage
+ \shortcontents
+ \contents
+ \global\let\shortcontents = \relax
+ \global\let\contents = \relax
+ \fi
+ %
+ \ifsetcontentsaftertitlepage
+ \contents
+ \global\let\contents = \relax
+ \global\let\shortcontents = \relax
+ \fi
+}
+
+\def\finishtitlepage{%
+ \vskip4pt \hrule height 2pt width \hsize
+ \vskip\titlepagebottomglue
+ \finishedtitlepagetrue
+}
+
+%%% Macros to be used within @titlepage:
+
+\let\subtitlerm=\tenrm
+\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}
+
+\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+ \let\tt=\authortt}
+
+\parseargdef\title{%
+ \checkenv\titlepage
+ \leftline{\titlefonts\rm #1}
+ % print a rule at the page bottom also.
+ \finishedtitlepagefalse
+ \vskip4pt \hrule height 4pt width \hsize \vskip4pt
+}
+
+\parseargdef\subtitle{%
+ \checkenv\titlepage
+ {\subtitlefont \rightline{#1}}%
+}
+
+% @author should come last, but may come many times.
+% It can also be used inside @quotation.
+%
+\parseargdef\author{%
+ \def\temp{\quotation}%
+ \ifx\thisenv\temp
+ \def\quotationauthor{#1}% printed in \Equotation.
+ \else
+ \checkenv\titlepage
+ \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
+ {\authorfont \leftline{#1}}%
+ \fi
+}
+
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline % headline on even pages
+\newtoks\oddheadline % headline on odd pages
+\newtoks\evenfootline % footline on even pages
+\newtoks\oddfootline % footline on odd pages
+
+% Now make TeX use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+ \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+ \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what @headings on does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish}
+\def\evenheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish}
+\def\oddheadingyyy #1\|#2\|#3\|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish}
+\def\evenfootingyyy #1\|#2\|#3\|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish}
+\def\oddfootingyyy #1\|#2\|#3\|#4\finish{%
+ \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+ %
+ % Leave some space for the footline. Hopefully ok to assume
+ % @evenfooting will not be used by itself.
+ \global\advance\pageheight by -12pt
+ \global\advance\vsize by -12pt
+}
+
+\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+
+% @evenheadingmarks top \thischapter <- chapter at the top of a page
+% @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page
+%
+% The same set of arguments for:
+%
+% @oddheadingmarks
+% @evenfootingmarks
+% @oddfootingmarks
+% @everyheadingmarks
+% @everyfootingmarks
+
+\def\evenheadingmarks{\headingmarks{even}{heading}}
+\def\oddheadingmarks{\headingmarks{odd}{heading}}
+\def\evenfootingmarks{\headingmarks{even}{footing}}
+\def\oddfootingmarks{\headingmarks{odd}{footing}}
+\def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1}
+ \headingmarks{odd}{heading}{#1} }
+\def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1}
+ \headingmarks{odd}{footing}{#1} }
+% #1 = even/odd, #2 = heading/footing, #3 = top/bottom.
+\def\headingmarks#1#2#3 {%
+ \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname
+ \global\expandafter\let\csname get#1#2marks\endcsname \temp
+}
+
+\everyheadingmarks bottom
+\everyfootingmarks bottom
+
+% @headings double turns headings on for double-sided printing.
+% @headings single turns headings on for single-sided printing.
+% @headings off turns them off.
+% @headings on same as @headings double, retained for compatibility.
+% @headings after turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{%
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{%
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+ \number\day\space
+ \ifcase\month
+ \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+ \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+ \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+ \fi
+ \space\number\year}
+\fi
+
+% @settitle line... specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg{\gdef\thistitle}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @ftable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\itemzzz #1{\begingroup %
+ \advance\hsize by -\rightskip
+ \advance\hsize by -\tableindent
+ \setbox0=\hbox{\itemindicate{#1}}%
+ \itemindex{#1}%
+ \nobreak % This prevents a break before @itemx.
+ %
+ % If the item text does not fit in the space we have, put it on a line
+ % by itself, and do not allow a page break either before or after that
+ % line. We do not start a paragraph here because then if the next
+ % command is, e.g., @kindex, the whatsit would get put into the
+ % horizontal list on a line by itself, resulting in extra blank space.
+ \ifdim \wd0>\itemmax
+ %
+ % Make this a paragraph so we get the \parskip glue and wrapping,
+ % but leave it ragged-right.
+ \begingroup
+ \advance\leftskip by-\tableindent
+ \advance\hsize by\tableindent
+ \advance\rightskip by0pt plus1fil
+ \leavevmode\unhbox0\par
+ \endgroup
+ %
+ % We're going to be starting a paragraph, but we don't want the
+ % \parskip glue -- logically it's part of the @item we just started.
+ \nobreak \vskip-\parskip
+ %
+ % Stop a page break at the \parskip glue coming up. However, if
+ % what follows is an environment such as @example, there will be no
+ % \parskip glue; then the negative vskip we just inserted would
+ % cause the example and the item to crash together. So we use this
+ % bizarre value of 10001 as a signal to \aboveenvbreak to insert
+ % \parskip glue after all. Section titles are handled this way also.
+ %
+ \penalty 10001
+ \endgroup
+ \itemxneedsnegativevskipfalse
+ \else
+ % The item text fits into the space. Start a paragraph, so that the
+ % following text (if any) will end up on the same line.
+ \noindent
+ % Do this with kerns and \unhbox so that if there is a footnote in
+ % the item text, it can migrate to the main vertical list and
+ % eventually be printed.
+ \nobreak\kern-\tableindent
+ \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+ \unhbox0
+ \nobreak\kern\dimen0
+ \endgroup
+ \itemxneedsnegativevskiptrue
+ \fi
+}
+
+\def\item{\errmessage{@item while not in a list environment}}
+\def\itemx{\errmessage{@itemx while not in a list environment}}
+
+% @table, @ftable, @vtable.
+\envdef\table{%
+ \let\itemindex\gobble
+ \tablecheck{table}%
+}
+\envdef\ftable{%
+ \def\itemindex ##1{\doind {fn}{\code{##1}}}%
+ \tablecheck{ftable}%
+}
+\envdef\vtable{%
+ \def\itemindex ##1{\doind {vr}{\code{##1}}}%
+ \tablecheck{vtable}%
+}
+\def\tablecheck#1{%
+ \ifnum \the\catcode`\^^M=\active
+ \endgroup
+ \errmessage{This command won't work in this context; perhaps the problem is
+ that we are \inenvironment\thisenv}%
+ \def\next{\doignore{#1}}%
+ \else
+ \let\next\tablex
+ \fi
+ \next
+}
+\def\tablex#1{%
+ \def\itemindicate{#1}%
+ \parsearg\tabley
+}
+\def\tabley#1{%
+ {%
+ \makevalueexpandable
+ \edef\temp{\noexpand\tablez #1\space\space\space}%
+ \expandafter
+ }\temp \endtablez
+}
+\def\tablez #1 #2 #3 #4\endtablez{%
+ \aboveenvbreak
+ \ifnum 0#1>0 \advance \leftskip by #1\mil \fi
+ \ifnum 0#2>0 \tableindent=#2\mil \fi
+ \ifnum 0#3>0 \advance \rightskip by #3\mil \fi
+ \itemmax=\tableindent
+ \advance \itemmax by -\itemmargin
+ \advance \leftskip by \tableindent
+ \exdentamount=\tableindent
+ \parindent = 0pt
+ \parskip = \smallskipamount
+ \ifdim \parskip=0pt \parskip=2pt \fi
+ \let\item = \internalBitem
+ \let\itemx = \internalBitemx
+}
+\def\Etable{\endgraf\afterenvbreak}
+\let\Eftable\Etable
+\let\Evtable\Etable
+\let\Eitemize\Etable
+\let\Eenumerate\Etable
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\envdef\itemize{\parsearg\doitemize}
+
+\def\doitemize#1{%
+ \aboveenvbreak
+ \itemmax=\itemindent
+ \advance\itemmax by -\itemmargin
+ \advance\leftskip by \itemindent
+ \exdentamount=\itemindent
+ \parindent=0pt
+ \parskip=\smallskipamount
+ \ifdim\parskip=0pt \parskip=2pt \fi
+ \def\itemcontents{#1}%
+ % @itemize with no arg is equivalent to @itemize @bullet.
+ \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+ \let\item=\itemizeitem
+}
+
+% Definition of @item while inside @itemize and @enumerate.
+%
+\def\itemizeitem{%
+ \advance\itemno by 1 % for enumerations
+ {\let\par=\endgraf \smallbreak}% reasonable place to break
+ {%
+ % If the document has an @itemize directly after a section title, a
+ % \nobreak will be last on the list, and \sectionheading will have
+ % done a \vskip-\parskip. In that case, we don't want to zero
+ % parskip, or the item text will crash with the heading. On the
+ % other hand, when there is normal text preceding the item (as there
+ % usually is), we do want to zero parskip, or there would be too much
+ % space. In that case, we won't have a \nobreak before. At least
+ % that's the theory.
+ \ifnum\lastpenalty<10000 \parskip=0in \fi
+ \noindent
+ \hbox to 0pt{\hss \itemcontents \kern\itemmargin}%
+ \vadjust{\penalty 1200}}% not good to break after first line of item.
+ \flushcr
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list. No
+% argument is the same as `1'.
+%
+\envparseargdef\enumerate{\enumeratey #1 \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+ % If we were given no argument, pretend we were given `1'.
+ \def\thearg{#1}%
+ \ifx\thearg\empty \def\thearg{1}\fi
+ %
+ % Detect if the argument is a single token. If so, it might be a
+ % letter. Otherwise, the only valid thing it can be is a number.
+ % (We will always have one token, because of the test we just made.
+ % This is a good thing, since \splitoff doesn't work given nothing at
+ % all -- the first parameter is undelimited.)
+ \expandafter\splitoff\thearg\endmark
+ \ifx\rest\empty
+ % Only one token in the argument. It could still be anything.
+ % A ``lowercase letter'' is one whose \lccode is nonzero.
+ % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+ % not equal to itself.
+ % Otherwise, we assume it's a number.
+ %
+ % We need the \relax at the end of the \ifnum lines to stop TeX from
+ % continuing to look for a <number>.
+ %
+ \ifnum\lccode\expandafter`\thearg=0\relax
+ \numericenumerate % a number (we hope)
+ \else
+ % It's a letter.
+ \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+ \lowercaseenumerate % lowercase letter
+ \else
+ \uppercaseenumerate % uppercase letter
+ \fi
+ \fi
+ \else
+ % Multiple tokens in the argument. We hope it's a number.
+ \numericenumerate
+ \fi
+}
+
+% An @enumerate whose labels are integers. The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+ \itemno = \thearg
+ \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more lowercase letters in @enumerate; get a bigger
+ alphabet}%
+ \fi
+ \char\lccode\itemno
+ }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+ \itemno = \expandafter`\thearg
+ \startenumeration{%
+ % Be sure we're not beyond the end of the alphabet.
+ \ifnum\itemno=0
+ \errmessage{No more uppercase letters in @enumerate; get a bigger
+ alphabet}
+ \fi
+ \char\uccode\itemno
+ }%
+}
+
+% Call \doitemize, adding a period to the first argument and supplying the
+% common last two arguments. Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+ \advance\itemno by -1
+ \doitemize{#1.}\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+% @multitable @columnfractions .25 .3 .45
+% @item ...
+%
+% Numbers following @columnfractions are the percent of the total
+% current hsize to be used for each column. You may use as many
+% columns as desired.
+
+
+% Or use a template:
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item ...
+% using the widest term desired in each column.
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab do not need to be on their own lines, but it will not hurt
+% if they are.
+
+% Sample multitable:
+
+% @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+% @item first col stuff @tab second col stuff @tab third col
+% @item
+% first col stuff
+% @tab
+% second col stuff
+% @tab
+% third col
+% @item first col stuff @tab second col stuff
+% @tab Many paragraphs of text may be used in any column.
+%
+% They will wrap at the width determined by the template.
+% @item@tab@tab This will be in third column.
+% @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+% to baseline.
+% 0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the @columnfraction, usually a decimal number like .5, but might
+% be just 1. We just use it, whatever it is.
+%
+\def\pickupwholefraction#1 {%
+ \global\advance\colcount by 1
+ \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}%
+ \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+ \def\firstarg{#1}%
+ \ifx\firstarg\xendsetuptable
+ \let\go = \relax
+ \else
+ \ifx\firstarg\xcolumnfractions
+ \global\setpercenttrue
+ \else
+ \ifsetpercent
+ \let\go\pickupwholefraction
+ \else
+ \global\advance\colcount by 1
+ \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+ % separator; typically that is always in the input, anyway.
+ \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+ \fi
+ \fi
+ \ifx\go\pickupwholefraction
+ % Put the argument back for the \pickupwholefraction call, so
+ % we'll always have a period there to be parsed.
+ \def\go{\pickupwholefraction#1}%
+ \else
+ \let\go = \setuptable
+ \fi%
+ \fi
+ \go
+}
+
+% multitable-only commands.
+%
+% @headitem starts a heading row, which we typeset in bold.
+% Assignments have to be global since we are inside the implicit group
+% of an alignment entry. Note that \everycr resets \everytab.
+\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}%
+%
+% A \tab used to include \hskip1sp. But then the space in a template
+% line is not enough. That is bad. So let's go back to just `&' until
+% we encounter the problem it was intended to solve again.
+% --karl, nathan@acm.org, 20apr99.
+\def\tab{\checkenv\multitable &\the\everytab}%
+
+% @multitable ... @end multitable definitions:
+%
+\newtoks\everytab % insert after every tab.
+%
+\envdef\multitable{%
+ \vskip\parskip
+ \startsavinginserts
+ %
+ % @item within a multitable starts a normal row.
+ % We use \def instead of \let so that if one of the multitable entries
+ % contains an @itemize, we don't choke on the \item (seen as \crcr aka
+ % \endtemplate) expanding \doitemize.
+ \def\item{\crcr}%
+ %
+ \tolerance=9500
+ \hbadness=9500
+ \setmultitablespacing
+ \parskip=\multitableparskip
+ \parindent=\multitableparindent
+ \overfullrule=0pt
+ \global\colcount=0
+ %
+ \everycr = {%
+ \noalign{%
+ \global\everytab={}%
+ \global\colcount=0 % Reset the column counter.
+ % Check for saved footnotes, etc.
+ \checkinserts
+ % Keeps underfull box messages off when table breaks over pages.
+ %\filbreak
+ % Maybe so, but it also creates really weird page breaks when the
+ % table breaks over pages. Wouldn't \vfil be better? Wait until the
+ % problem manifests itself, so it can be fixed for real --karl.
+ }%
+ }%
+ %
+ \parsearg\domultitable
+}
+\def\domultitable#1{%
+ % To parse everything between @multitable and @item:
+ \setuptable#1 \endsetuptable
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and
+ % continue for many paragraphs if desired.
+ \halign\bgroup &%
+ \global\advance\colcount by 1
+ \multistrut
+ \vtop{%
+ % Use the current \colcount to find the correct column width:
+ \hsize=\expandafter\csname col\the\colcount\endcsname
+ %
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \multitablecolspace to all columns after
+ % the first one.
+ %
+ % If a template has been used, we will add \multitablecolspace
+ % to the width of each template entry.
+ %
+ % If the user has set preamble in terms of percent of \hsize we will
+ % use that dimension as the width of the column, and the \leftskip
+ % will keep entries from bumping into each other. Table will start at
+ % left margin and final column will justify at right margin.
+ %
+ % Make sure we don't inherit \rightskip from the outer environment.
+ \rightskip=0pt
+ \ifnum\colcount=1
+ % The first column will be indented with the surrounding text.
+ \advance\hsize by\leftskip
+ \else
+ \ifsetpercent \else
+ % If user has not set preamble in terms of percent of \hsize
+ % we will advance \hsize by \multitablecolspace.
+ \advance\hsize by \multitablecolspace
+ \fi
+ % In either case we will make \leftskip=\multitablecolspace:
+ \leftskip=\multitablecolspace
+ \fi
+ % Ignoring space at the beginning and end avoids an occasional spurious
+ % blank line, when TeX decides to break the line at the space before the
+ % box from the multistrut, so the strut ends up on a line by itself.
+ % For example:
+ % @multitable @columnfractions .11 .89
+ % @item @code{#}
+ % @tab Legal holiday which is valid in major parts of the whole country.
+ % Is automatically provided with highlighting sequences respectively
+ % marking characters.
+ \noindent\ignorespaces##\unskip\multistrut
+ }\cr
+}
+\def\Emultitable{%
+ \crcr
+ \egroup % end the \halign
+ \global\setpercentfalse
+}
+
+\def\setmultitablespacing{%
+ \def\multistrut{\strut}% just use the standard line spacing
+ %
+ % Compute \multitablelinespace (if not defined by user) for use in
+ % \multitableparskip calculation. We used define \multistrut based on
+ % this, but (ironically) that caused the spacing to be off.
+ % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+\fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%% If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+ %% than skip between lines in the table.
+\fi}
+
+
+\message{conditionals,}
+
+% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext,
+% @ifnotxml always succeed. They currently do nothing; we don't
+% attempt to check whether the conditionals are properly nested. But we
+% have to remember that they are conditionals, so that @end doesn't
+% attempt to close an environment group.
+%
+\def\makecond#1{%
+ \expandafter\let\csname #1\endcsname = \relax
+ \expandafter\let\csname iscond.#1\endcsname = 1
+}
+\makecond{iftex}
+\makecond{ifnotdocbook}
+\makecond{ifnothtml}
+\makecond{ifnotinfo}
+\makecond{ifnotplaintext}
+\makecond{ifnotxml}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescription{\doignore{documentdescription}}
+\def\docbook{\doignore{docbook}}
+\def\html{\doignore{html}}
+\def\ifdocbook{\doignore{ifdocbook}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% Ignore text until a line `@end #1', keeping track of nested conditionals.
+%
+% A count to remember the depth of nesting.
+\newcount\doignorecount
+
+\def\doignore#1{\begingroup
+ % Scan in ``verbatim'' mode:
+ \obeylines
+ \catcode`\@ = \other
+ \catcode`\{ = \other
+ \catcode`\} = \other
+ %
+ % Make sure that spaces turn into tokens that match what \doignoretext wants.
+ \spaceisspace
+ %
+ % Count number of #1's that we've seen.
+ \doignorecount = 0
+ %
+ % Swallow text until we reach the matching `@end #1'.
+ \dodoignore{#1}%
+}
+
+{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source.
+ \obeylines %
+ %
+ \gdef\dodoignore#1{%
+ % #1 contains the command name as a string, e.g., `ifinfo'.
+ %
+ % Define a command to find the next `@end #1'.
+ \long\def\doignoretext##1^^M@end #1{%
+ \doignoretextyyy##1^^M@#1\_STOP_}%
+ %
+ % And this command to find another #1 command, at the beginning of a
+ % line. (Otherwise, we would consider a line `@c @ifset', for
+ % example, to count as an @ifset for nesting.)
+ \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}%
+ %
+ % And now expand that command.
+ \doignoretext ^^M%
+ }%
+}
+
+\def\doignoreyyy#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty % Nothing found.
+ \let\next\doignoretextzzz
+ \else % Found a nested condition, ...
+ \advance\doignorecount by 1
+ \let\next\doignoretextyyy % ..., look for another.
+ % If we're here, #1 ends with ^^M\ifinfo (for example).
+ \fi
+ \next #1% the token \_STOP_ is present just after this macro.
+}
+
+% We have to swallow the remaining "\_STOP_".
+%
+\def\doignoretextzzz#1{%
+ \ifnum\doignorecount = 0 % We have just found the outermost @end.
+ \let\next\enddoignore
+ \else % Still inside a nested condition.
+ \advance\doignorecount by -1
+ \let\next\doignoretext % Look for the next @end.
+ \fi
+ \next
+}
+
+% Finish off ignored text.
+{ \obeylines%
+ % Ignore anything after the last `@end #1'; this matters in verbatim
+ % environments, where otherwise the newline after an ignored conditional
+ % would result in a blank line in the output.
+ \gdef\enddoignore#1^^M{\endgroup\ignorespaces}%
+}
+
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+% We rely on the fact that \parsearg sets \catcode`\ =10.
+%
+\parseargdef\set{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+ {%
+ \makevalueexpandable
+ \def\temp{#2}%
+ \edef\next{\gdef\makecsname{SET#1}}%
+ \ifx\temp\empty
+ \next{}%
+ \else
+ \setzzz#2\endsetzzz
+ \fi
+ }%
+}
+% Remove the trailing space \setxxx inserted.
+\def\setzzz#1 \endsetzzz{\next{#1}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\parseargdef\clear{%
+ {%
+ \makevalueexpandable
+ \global\expandafter\let\csname SET#1\endcsname=\relax
+ }%
+}
+
+% @value{foo} gets the text saved in variable foo.
+\def\value{\begingroup\makevalueexpandable\valuexxx}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+{
+ \catcode`\- = \active \catcode`\_ = \active
+ %
+ \gdef\makevalueexpandable{%
+ \let\value = \expandablevalue
+ % We don't want these characters active, ...
+ \catcode`\-=\other \catcode`\_=\other
+ % ..., but we might end up with active ones in the argument if
+ % we're called from @code, as @code{@value{foo-bar_}}, though.
+ % So \let them to their normal equivalents.
+ \let-\realdash \let_\normalunderscore
+ }
+}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we call \makevalueexpandable in \indexdummies).
+% The command has to be fully expandable (if the variable is set), since
+% the result winds up in the index file. This means that if the
+% variable's value contains other Texinfo commands, it's almost certain
+% it will fail (although perhaps we could fix that with sufficient work
+% to do a one-level expansion on the result, instead of complete).
+%
+\def\expandablevalue#1{%
+ \expandafter\ifx\csname SET#1\endcsname\relax
+ {[No value for ``#1'']}%
+ \message{Variable `#1', used in @value, is not set.}%
+ \else
+ \csname SET#1\endcsname
+ \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+% To get special treatment of `@end ifset,' call \makeond and the redefine.
+%
+\makecond{ifset}
+\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}}
+\def\doifset#1#2{%
+ {%
+ \makevalueexpandable
+ \let\next=\empty
+ \expandafter\ifx\csname SET#2\endcsname\relax
+ #1% If not set, redefine \next.
+ \fi
+ \expandafter
+ }\next
+}
+\def\ifsetfail{\doignore{ifset}}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+% The `\else' inside the `\doifset' parameter is a trick to reuse the
+% above code: if the variable is not set, do nothing, if it is set,
+% then redefine \next to \ifclearfail.
+%
+\makecond{ifclear}
+\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}}
+\def\ifclearfail{\doignore{ifclear}}
+
+% @dircategory CATEGORY -- specify a category of the dir file
+% which this file should belong to. Ignore this in TeX.
+\let\dircategory=\comment
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within macros and \if's.
+\edef\newwrite{\makecsname{ptexnewwrite}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index. The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{% % Define @#1index
+ \noexpand\doindex{#1}}
+}
+
+% @defindex foo == \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+ \iflinks
+ \expandafter\newwrite \csname#1indfile\endcsname
+ \openout \csname#1indfile\endcsname \jobname.#1
+ \fi
+ \expandafter\xdef\csname#1index\endcsname{%
+ \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+ % Only do \closeout if we haven't already done it, else we'll end up
+ % closing the target index.
+ \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+ % The \closeout helps reduce unnecessary open files; the limit on the
+ % Acorn RISC OS is a mere 16 files.
+ \expandafter\closeout\csname#2indfile\endcsname
+ \expandafter\let\csname\donesynindex#2\endcsname = 1
+ \fi
+ % redefine \fooindfile:
+ \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+ \expandafter\let\csname#2indfile\endcsname=\temp
+ % redefine \fooindex:
+ \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+% and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+ \escapechar = `\\ % use backslash in output files.
+ \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+ \def\ {\realbackslash\space }%
+ %
+ % Need these in case \tex is in effect and \{ is a \delimiter again.
+ % But can't use \lbracecmd and \rbracecmd because texindex assumes
+ % braces and backslashes are used only as delimiters.
+ \let\{ = \mylbrace
+ \let\} = \myrbrace
+ %
+ % I don't entirely understand this, but when an index entry is
+ % generated from a macro call, the \endinput which \scanmacro inserts
+ % causes processing to be prematurely terminated. This is,
+ % apparently, because \indexsorttmp is fully expanded, and \endinput
+ % is an expandable command. The redefinition below makes \endinput
+ % disappear altogether for that purpose -- although logging shows that
+ % processing continues to some further point. On the other hand, it
+ % seems \endinput does not hurt in the printed index arg, since that
+ % is still getting written without apparent harm.
+ %
+ % Sample source (mac-idx3.tex, reported by Graham Percival to
+ % help-texinfo, 22may06):
+ % @macro funindex {WORD}
+ % @findex xyz
+ % @end macro
+ % ...
+ % @funindex commtest
+ %
+ % The above is not enough to reproduce the bug, but it gives the flavor.
+ %
+ % Sample whatsit resulting:
+ % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}}
+ %
+ % So:
+ \let\endinput = \empty
+ %
+ % Do the redefinitions.
+ \commondummies
+}
+
+% For the aux and toc files, @ is the escape character. So we want to
+% redefine everything using @ as the escape character (instead of
+% \realbackslash, still used for index files). When everything uses @,
+% this will be simpler.
+%
+\def\atdummies{%
+ \def\@{@@}%
+ \def\ {@ }%
+ \let\{ = \lbraceatcmd
+ \let\} = \rbraceatcmd
+ %
+ % Do the redefinitions.
+ \commondummies
+ \otherbackslash
+}
+
+% Called from \indexdummies and \atdummies.
+%
+\def\commondummies{%
+ %
+ % \definedummyword defines \#1 as \string\#1\space, thus effectively
+ % preventing its expansion. This is used only for control% words,
+ % not control letters, because the \space would be incorrect for
+ % control characters, but is needed to separate the control word
+ % from whatever follows.
+ %
+ % For control letters, we have \definedummyletter, which omits the
+ % space.
+ %
+ % These can be used both for control words that take an argument and
+ % those that do not. If it is followed by {arg} in the input, then
+ % that will dutifully get written to the index (or wherever).
+ %
+ \def\definedummyword ##1{\def##1{\string##1\space}}%
+ \def\definedummyletter##1{\def##1{\string##1}}%
+ \let\definedummyaccent\definedummyletter
+ %
+ \commondummiesnofonts
+ %
+ \definedummyletter\_%
+ %
+ % Non-English letters.
+ \definedummyword\AA
+ \definedummyword\AE
+ \definedummyword\L
+ \definedummyword\OE
+ \definedummyword\O
+ \definedummyword\aa
+ \definedummyword\ae
+ \definedummyword\l
+ \definedummyword\oe
+ \definedummyword\o
+ \definedummyword\ss
+ \definedummyword\exclamdown
+ \definedummyword\questiondown
+ \definedummyword\ordf
+ \definedummyword\ordm
+ %
+ % Although these internal commands shouldn't show up, sometimes they do.
+ \definedummyword\bf
+ \definedummyword\gtr
+ \definedummyword\hat
+ \definedummyword\less
+ \definedummyword\sf
+ \definedummyword\sl
+ \definedummyword\tclose
+ \definedummyword\tt
+ %
+ \definedummyword\LaTeX
+ \definedummyword\TeX
+ %
+ % Assorted special characters.
+ \definedummyword\bullet
+ \definedummyword\comma
+ \definedummyword\copyright
+ \definedummyword\registeredsymbol
+ \definedummyword\dots
+ \definedummyword\enddots
+ \definedummyword\equiv
+ \definedummyword\error
+ \definedummyword\euro
+ \definedummyword\guillemetleft
+ \definedummyword\guillemetright
+ \definedummyword\guilsinglleft
+ \definedummyword\guilsinglright
+ \definedummyword\expansion
+ \definedummyword\minus
+ \definedummyword\pounds
+ \definedummyword\point
+ \definedummyword\print
+ \definedummyword\quotedblbase
+ \definedummyword\quotedblleft
+ \definedummyword\quotedblright
+ \definedummyword\quoteleft
+ \definedummyword\quoteright
+ \definedummyword\quotesinglbase
+ \definedummyword\result
+ \definedummyword\textdegree
+ %
+ % We want to disable all macros so that they are not expanded by \write.
+ \macrolist
+ %
+ \normalturnoffactive
+ %
+ % Handle some cases of @value -- where it does not contain any
+ % (non-fully-expandable) commands.
+ \makevalueexpandable
+}
+
+% \commondummiesnofonts: common to \commondummies and \indexnofonts.
+%
+\def\commondummiesnofonts{%
+ % Control letters and accents.
+ \definedummyletter\!%
+ \definedummyaccent\"%
+ \definedummyaccent\'%
+ \definedummyletter\*%
+ \definedummyaccent\,%
+ \definedummyletter\.%
+ \definedummyletter\/%
+ \definedummyletter\:%
+ \definedummyaccent\=%
+ \definedummyletter\?%
+ \definedummyaccent\^%
+ \definedummyaccent\`%
+ \definedummyaccent\~%
+ \definedummyword\u
+ \definedummyword\v
+ \definedummyword\H
+ \definedummyword\dotaccent
+ \definedummyword\ringaccent
+ \definedummyword\tieaccent
+ \definedummyword\ubaraccent
+ \definedummyword\udotaccent
+ \definedummyword\dotless
+ %
+ % Texinfo font commands.
+ \definedummyword\b
+ \definedummyword\i
+ \definedummyword\r
+ \definedummyword\sc
+ \definedummyword\t
+ %
+ % Commands that take arguments.
+ \definedummyword\acronym
+ \definedummyword\cite
+ \definedummyword\code
+ \definedummyword\command
+ \definedummyword\dfn
+ \definedummyword\emph
+ \definedummyword\env
+ \definedummyword\file
+ \definedummyword\kbd
+ \definedummyword\key
+ \definedummyword\math
+ \definedummyword\option
+ \definedummyword\pxref
+ \definedummyword\ref
+ \definedummyword\samp
+ \definedummyword\strong
+ \definedummyword\tie
+ \definedummyword\uref
+ \definedummyword\url
+ \definedummyword\var
+ \definedummyword\verb
+ \definedummyword\w
+ \definedummyword\xref
+}
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names. It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexnofonts{%
+ % Accent commands should become @asis.
+ \def\definedummyaccent##1{\let##1\asis}%
+ % We can just ignore other control letters.
+ \def\definedummyletter##1{\let##1\empty}%
+ % Hopefully, all control words can become @asis.
+ \let\definedummyword\definedummyaccent
+ %
+ \commondummiesnofonts
+ %
+ % Don't no-op \tt, since it isn't a user-level command
+ % and is used in the definitions of the active chars like <, >, |, etc.
+ % Likewise with the other plain tex font commands.
+ %\let\tt=\asis
+ %
+ \def\ { }%
+ \def\@{@}%
+ % how to handle braces?
+ \def\_{\normalunderscore}%
+ %
+ % Non-English letters.
+ \def\AA{AA}%
+ \def\AE{AE}%
+ \def\L{L}%
+ \def\OE{OE}%
+ \def\O{O}%
+ \def\aa{aa}%
+ \def\ae{ae}%
+ \def\l{l}%
+ \def\oe{oe}%
+ \def\o{o}%
+ \def\ss{ss}%
+ \def\exclamdown{!}%
+ \def\questiondown{?}%
+ \def\ordf{a}%
+ \def\ordm{o}%
+ %
+ \def\LaTeX{LaTeX}%
+ \def\TeX{TeX}%
+ %
+ % Assorted special characters.
+ % (The following {} will end up in the sort string, but that's ok.)
+ \def\bullet{bullet}%
+ \def\comma{,}%
+ \def\copyright{copyright}%
+ \def\registeredsymbol{R}%
+ \def\dots{...}%
+ \def\enddots{...}%
+ \def\equiv{==}%
+ \def\error{error}%
+ \def\euro{euro}%
+ \def\guillemetleft{<<}%
+ \def\guillemetright{>>}%
+ \def\guilsinglleft{<}%
+ \def\guilsinglright{>}%
+ \def\expansion{==>}%
+ \def\minus{-}%
+ \def\pounds{pounds}%
+ \def\point{.}%
+ \def\print{-|}%
+ \def\quotedblbase{"}%
+ \def\quotedblleft{"}%
+ \def\quotedblright{"}%
+ \def\quoteleft{`}%
+ \def\quoteright{'}%
+ \def\quotesinglbase{,}%
+ \def\result{=>}%
+ \def\textdegree{degrees}%
+ %
+ % We need to get rid of all macros, leaving only the arguments (if present).
+ % Of course this is not nearly correct, but it is the best we can do for now.
+ % makeinfo does not expand macros in the argument to @deffn, which ends up
+ % writing an index entry, and texindex isn't prepared for an index sort entry
+ % that starts with \.
+ %
+ % Since macro invocations are followed by braces, we can just redefine them
+ % to take a single TeX argument. The case of a macro invocation that
+ % goes to end-of-line is not handled.
+ %
+ \macrolist
+}
+
+\let\indexbackslash=0 %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% Most index entries go through here, but \dosubind is the general case.
+% #1 is the index name, #2 is the entry text.
+\def\doind#1#2{\dosubind{#1}{#2}{}}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% empty if called from \doind, as we usually are (the main exception
+% is with most defuns, which call us directly).
+%
+\def\dosubind#1#2#3{%
+ \iflinks
+ {%
+ % Store the main index entry text (including the third arg).
+ \toks0 = {#2}%
+ % If third arg is present, precede it with a space.
+ \def\thirdarg{#3}%
+ \ifx\thirdarg\empty \else
+ \toks0 = \expandafter{\the\toks0 \space #3}%
+ \fi
+ %
+ \edef\writeto{\csname#1indfile\endcsname}%
+ %
+ \safewhatsit\dosubindwrite
+ }%
+ \fi
+}
+
+% Write the entry in \toks0 to the index file:
+%
+\def\dosubindwrite{%
+ % Put the index entry in the margin if desired.
+ \ifx\SETmarginindex\relax\else
+ \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}%
+ \fi
+ %
+ % Remember, we are within a group.
+ \indexdummies % Must do this here, since \bf, etc expand at this stage
+ \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now
+ % so it will be output as is; and it will print as backslash.
+ %
+ % Process the index entry with all font commands turned off, to
+ % get the string to sort by.
+ {\indexnofonts
+ \edef\temp{\the\toks0}% need full expansion
+ \xdef\indexsorttmp{\temp}%
+ }%
+ %
+ % Set up the complete index entry, with both the sort key and
+ % the original text, including any font commands. We write
+ % three arguments to \entry to the .?? file (four in the
+ % subentry case), texindex reduces to two when writing the .??s
+ % sorted result.
+ \edef\temp{%
+ \write\writeto{%
+ \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}%
+ }%
+ \temp
+}
+
+% Take care of unwanted page breaks/skips around a whatsit:
+%
+% If a skip is the last thing on the list now, preserve it
+% by backing up by \lastskip, doing the \write, then inserting
+% the skip again. Otherwise, the whatsit generated by the
+% \write or \pdfdest will make \lastskip zero. The result is that
+% sequences like this:
+% @end defun
+% @tindex whatever
+% @defun ...
+% will have extra space inserted, because the \medbreak in the
+% start of the @defun won't see the skip inserted by the @end of
+% the previous defun.
+%
+% But don't do any of this if we're not in vertical mode. We
+% don't want to do a \vskip and prematurely end a paragraph.
+%
+% Avoid page breaks due to these extra skips, too.
+%
+% But wait, there is a catch there:
+% We'll have to check whether \lastskip is zero skip. \ifdim is not
+% sufficient for this purpose, as it ignores stretch and shrink parts
+% of the skip. The only way seems to be to check the textual
+% representation of the skip.
+%
+% The following is almost like \def\zeroskipmacro{0.0pt} except that
+% the ``p'' and ``t'' characters have catcode \other, not 11 (letter).
+%
+\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname}
+%
+\newskip\whatsitskip
+\newcount\whatsitpenalty
+%
+% ..., ready, GO:
+%
+\def\safewhatsit#1{%
+\ifhmode
+ #1%
+\else
+ % \lastskip and \lastpenalty cannot both be nonzero simultaneously.
+ \whatsitskip = \lastskip
+ \edef\lastskipmacro{\the\lastskip}%
+ \whatsitpenalty = \lastpenalty
+ %
+ % If \lastskip is nonzero, that means the last item was a
+ % skip. And since a skip is discardable, that means this
+ % -\whatsitskip glue we're inserting is preceded by a
+ % non-discardable item, therefore it is not a potential
+ % breakpoint, therefore no \nobreak needed.
+ \ifx\lastskipmacro\zeroskipmacro
+ \else
+ \vskip-\whatsitskip
+ \fi
+ %
+ #1%
+ %
+ \ifx\lastskipmacro\zeroskipmacro
+ % If \lastskip was zero, perhaps the last item was a penalty, and
+ % perhaps it was >=10000, e.g., a \nobreak. In that case, we want
+ % to re-insert the same penalty (values >10000 are used for various
+ % signals); since we just inserted a non-discardable item, any
+ % following glue (such as a \parskip) would be a breakpoint. For example:
+ %
+ % @deffn deffn-whatever
+ % @vindex index-whatever
+ % Description.
+ % would allow a break between the index-whatever whatsit
+ % and the "Description." paragraph.
+ \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi
+ \else
+ % On the other hand, if we had a nonzero \lastskip,
+ % this make-up glue would be preceded by a non-discardable item
+ % (the whatsit from the \write), so we must insert a \nobreak.
+ \nobreak\vskip\whatsitskip
+ \fi
+\fi
+}
+
+% The index entry written in the file actually looks like
+% \entry {sortstring}{page}{topic}
+% or
+% \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+% \initial {c}
+% before the first topic whose initial is c
+% \entry {topic}{pagelist}
+% for a topic that is used without subtopics
+% \primary {topic}
+% for the beginning of a topic that is used with subtopics
+% \secondary {subtopic}{pagelist}
+% for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\parseargdef\printindex{\begingroup
+ \dobreak \chapheadingskip{10000}%
+ %
+ \smallfonts \rm
+ \tolerance = 9500
+ \plainfrenchspacing
+ \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+ %
+ % See if the index file exists and is nonempty.
+ % Change catcode of @ here so that if the index file contains
+ % \initial {@}
+ % as its first line, TeX doesn't complain about mismatched braces
+ % (because it thinks @} is a control sequence).
+ \catcode`\@ = 11
+ \openin 1 \jobname.#1s
+ \ifeof 1
+ % \enddoublecolumns gets confused if there is no text in the index,
+ % and it loses the chapter title and the aux file entries for the
+ % index. The easiest way to prevent this problem is to make sure
+ % there is some text.
+ \putwordIndexNonexistent
+ \else
+ %
+ % If the index file exists but is empty, then \openin leaves \ifeof
+ % false. We have to make TeX try to read something from the file, so
+ % it can discover if there is anything in it.
+ \read 1 to \temp
+ \ifeof 1
+ \putwordIndexIsEmpty
+ \else
+ % Index files are almost Texinfo source, but we use \ as the escape
+ % character. It would be better to use @, but that's too big a change
+ % to make right now.
+ \def\indexbackslash{\backslashcurfont}%
+ \catcode`\\ = 0
+ \escapechar = `\\
+ \begindoublecolumns
+ \input \jobname.#1s
+ \enddoublecolumns
+ \fi
+ \fi
+ \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+ % Some minor font changes for the special characters.
+ \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+ %
+ % Remove any glue we may have, we'll be inserting our own.
+ \removelastskip
+ %
+ % We like breaks before the index initials, so insert a bonus.
+ \nobreak
+ \vskip 0pt plus 3\baselineskip
+ \penalty 0
+ \vskip 0pt plus -3\baselineskip
+ %
+ % Typeset the initial. Making this add up to a whole number of
+ % baselineskips increases the chance of the dots lining up from column
+ % to column. It still won't often be perfect, because of the stretch
+ % we need before each entry, but it's better.
+ %
+ % No shrink because it confuses \balancecolumns.
+ \vskip 1.67\baselineskip plus .5\baselineskip
+ \leftline{\secbf #1}%
+ % Do our best not to break after the initial.
+ \nobreak
+ \vskip .33\baselineskip plus .1\baselineskip
+}}
+
+% \entry typesets a paragraph consisting of the text (#1), dot leaders, and
+% then page number (#2) flushed to the right margin. It is used for index
+% and table of contents entries. The paragraph is indented by \leftskip.
+%
+% A straightforward implementation would start like this:
+% \def\entry#1#2{...
+% But this frozes the catcodes in the argument, and can cause problems to
+% @code, which sets - active. This problem was fixed by a kludge---
+% ``-'' was active throughout whole index, but this isn't really right.
+%
+% The right solution is to prevent \entry from swallowing the whole text.
+% --kasal, 21nov03
+\def\entry{%
+ \begingroup
+ %
+ % Start a new paragraph if necessary, so our assignments below can't
+ % affect previous text.
+ \par
+ %
+ % Do not fill out the last line with white space.
+ \parfillskip = 0in
+ %
+ % No extra space above this paragraph.
+ \parskip = 0in
+ %
+ % Do not prefer a separate line ending with a hyphen to fewer lines.
+ \finalhyphendemerits = 0
+ %
+ % \hangindent is only relevant when the entry text and page number
+ % don't both fit on one line. In that case, bob suggests starting the
+ % dots pretty far over on the line. Unfortunately, a large
+ % indentation looks wrong when the entry text itself is broken across
+ % lines. So we use a small indentation and put up with long leaders.
+ %
+ % \hangafter is reset to 1 (which is the value we want) at the start
+ % of each paragraph, so we need not do anything with that.
+ \hangindent = 2em
+ %
+ % When the entry text needs to be broken, just fill out the first line
+ % with blank space.
+ \rightskip = 0pt plus1fil
+ %
+ % A bit of stretch before each entry for the benefit of balancing
+ % columns.
+ \vskip 0pt plus1pt
+ %
+ % Swallow the left brace of the text (first parameter):
+ \afterassignment\doentry
+ \let\temp =
+}
+\def\doentry{%
+ \bgroup % Instead of the swallowed brace.
+ \noindent
+ \aftergroup\finishentry
+ % And now comes the text of the entry.
+}
+\def\finishentry#1{%
+ % #1 is the page number.
+ %
+ % The following is kludged to not output a line of dots in the index if
+ % there are no page numbers. The next person who breaks this will be
+ % cursed by a Unix daemon.
+ \setbox\boxA = \hbox{#1}%
+ \ifdim\wd\boxA = 0pt
+ \ %
+ \else
+ %
+ % If we must, put the page number on a line of its own, and fill out
+ % this line with blank space. (The \hfil is overwhelmed with the
+ % fill leaders glue in \indexdotfill if the page number does fit.)
+ \hfil\penalty50
+ \null\nobreak\indexdotfill % Have leaders before the page number.
+ %
+ % The `\ ' here is removed by the implicit \unskip that TeX does as
+ % part of (the primitive) \par. Without it, a spurious underfull
+ % \hbox ensues.
+ \ifpdf
+ \pdfgettoks#1.%
+ \ \the\toksA
+ \else
+ \ #1%
+ \fi
+ \fi
+ \par
+ \endgroup
+}
+
+% Like plain.tex's \dotfill, except uses up at least 1 em.
+\def\indexdotfill{\cleaders
+ \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+ \parfillskip=0in
+ \parskip=0in
+ \hangindent=1in
+ \hangafter=1
+ \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+ \ifpdf
+ \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+ \else
+ #2
+ \fi
+ \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+ % Grab any single-column material above us.
+ \output = {%
+ %
+ % Here is a possibility not foreseen in manmac: if we accumulate a
+ % whole lot of material, we might end up calling this \output
+ % routine twice in a row (see the doublecol-lose test, which is
+ % essentially a couple of indexes with @setchapternewpage off). In
+ % that case we just ship out what is in \partialpage with the normal
+ % output routine. Generally, \partialpage will be empty when this
+ % runs and this will be a no-op. See the indexspread.tex test case.
+ \ifvoid\partialpage \else
+ \onepageout{\pagecontents\partialpage}%
+ \fi
+ %
+ \global\setbox\partialpage = \vbox{%
+ % Unvbox the main output page.
+ \unvbox\PAGE
+ \kern-\topskip \kern\baselineskip
+ }%
+ }%
+ \eject % run that output routine to set \partialpage
+ %
+ % Use the double-column output routine for subsequent pages.
+ \output = {\doublecolumnout}%
+ %
+ % Change the page size parameters. We could do this once outside this
+ % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+ % format, but then we repeat the same computation. Repeating a couple
+ % of assignments once per index is clearly meaningless for the
+ % execution time, so we may as well do it in one place.
+ %
+ % First we halve the line length, less a little for the gutter between
+ % the columns. We compute the gutter based on the line length, so it
+ % changes automatically with the paper format. The magic constant
+ % below is chosen so that the gutter has the same value (well, +-<1pt)
+ % as it did when we hard-coded it.
+ %
+ % We put the result in a separate register, \doublecolumhsize, so we
+ % can restore it in \pagesofar, after \hsize itself has (potentially)
+ % been clobbered.
+ %
+ \doublecolumnhsize = \hsize
+ \advance\doublecolumnhsize by -.04154\hsize
+ \divide\doublecolumnhsize by 2
+ \hsize = \doublecolumnhsize
+ %
+ % Double the \vsize as well. (We don't need a separate register here,
+ % since nobody clobbers \vsize.)
+ \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+ \splittopskip=\topskip \splitmaxdepth=\maxdepth
+ % Get the available space for the double columns -- the normal
+ % (undoubled) page height minus any material left over from the
+ % previous page.
+ \dimen@ = \vsize
+ \divide\dimen@ by 2
+ \advance\dimen@ by -\ht\partialpage
+ %
+ % box0 will be the left-hand column, box2 the right.
+ \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+ \onepageout\pagesofar
+ \unvbox255
+ \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+ \unvbox\partialpage
+ %
+ \hsize = \doublecolumnhsize
+ \wd0=\hsize \wd2=\hsize
+ \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+ % The following penalty ensures that the page builder is exercised
+ % _before_ we change the output routine. This is necessary in the
+ % following situation:
+ %
+ % The last section of the index consists only of a single entry.
+ % Before this section, \pagetotal is less than \pagegoal, so no
+ % break occurs before the last section starts. However, the last
+ % section, consisting of \initial and the single \entry, does not
+ % fit on the page and has to be broken off. Without the following
+ % penalty the page builder will not be exercised until \eject
+ % below, and by that time we'll already have changed the output
+ % routine to the \balancecolumns version, so the next-to-last
+ % double-column page will be processed with \balancecolumns, which
+ % is wrong: The two columns will go to the main vertical list, with
+ % the broken-off section in the recent contributions. As soon as
+ % the output routine finishes, TeX starts reconsidering the page
+ % break. The two columns and the broken-off section both fit on the
+ % page, because the two columns now take up only half of the page
+ % goal. When TeX sees \eject from below which follows the final
+ % section, it invokes the new output routine that we've set after
+ % \balancecolumns below; \onepageout will try to fit the two columns
+ % and the final section into the vbox of \pageheight (see
+ % \pagebody), causing an overfull box.
+ %
+ % Note that glue won't work here, because glue does not exercise the
+ % page builder, unlike penalties (see The TeXbook, pp. 280-281).
+ \penalty0
+ %
+ \output = {%
+ % Split the last of the double-column material. Leave it on the
+ % current page, no automatic page break.
+ \balancecolumns
+ %
+ % If we end up splitting too much material for the current page,
+ % though, there will be another page break right after this \output
+ % invocation ends. Having called \balancecolumns once, we do not
+ % want to call it again. Therefore, reset \output to its normal
+ % definition right away. (We hope \balancecolumns will never be
+ % called on to balance too much material, but if it is, this makes
+ % the output somewhat more palatable.)
+ \global\output = {\onepageout{\pagecontents\PAGE}}%
+ }%
+ \eject
+ \endgroup % started in \begindoublecolumns
+ %
+ % \pagegoal was set to the doubled \vsize above, since we restarted
+ % the current page. We're now back to normal single-column
+ % typesetting, so reset \pagegoal to the normal \vsize (after the
+ % \endgroup where \vsize got restored).
+ \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+ \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+ \dimen@ = \ht0
+ \advance\dimen@ by \topskip
+ \advance\dimen@ by-\baselineskip
+ \divide\dimen@ by 2 % target to split to
+ %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+ \splittopskip = \topskip
+ % Loop until we get a decent breakpoint.
+ {%
+ \vbadness = 10000
+ \loop
+ \global\setbox3 = \copy0
+ \global\setbox1 = \vsplit3 to \dimen@
+ \ifdim\ht3>\dimen@
+ \global\advance\dimen@ by 1pt
+ \repeat
+ }%
+ %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+ \setbox0=\vbox to\dimen@{\unvbox1}%
+ \setbox2=\vbox to\dimen@{\unvbox3}%
+ %
+ \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+% \unnumberedno is an oxymoron, of course. But we count the unnumbered
+% sections so that we can refer to them unambiguously in the pdf
+% outlines by their "section number". We avoid collisions with chapter
+% numbers by starting them at 10000. (If a document ever has 10000
+% chapters, we're in trouble anyway, I'm sure.)
+\newcount\unnumberedno \unnumberedno = 10000
+\newcount\chapno
+\newcount\secno \secno=0
+\newcount\subsecno \subsecno=0
+\newcount\subsubsecno \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno \appendixno = `\@
+%
+% \def\appendixletter{\char\the\appendixno}
+% We do the following ugly conditional instead of the above simple
+% construct for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+%
+\def\appendixletter{%
+ \ifnum\appendixno=`A A%
+ \else\ifnum\appendixno=`B B%
+ \else\ifnum\appendixno=`C C%
+ \else\ifnum\appendixno=`D D%
+ \else\ifnum\appendixno=`E E%
+ \else\ifnum\appendixno=`F F%
+ \else\ifnum\appendixno=`G G%
+ \else\ifnum\appendixno=`H H%
+ \else\ifnum\appendixno=`I I%
+ \else\ifnum\appendixno=`J J%
+ \else\ifnum\appendixno=`K K%
+ \else\ifnum\appendixno=`L L%
+ \else\ifnum\appendixno=`M M%
+ \else\ifnum\appendixno=`N N%
+ \else\ifnum\appendixno=`O O%
+ \else\ifnum\appendixno=`P P%
+ \else\ifnum\appendixno=`Q Q%
+ \else\ifnum\appendixno=`R R%
+ \else\ifnum\appendixno=`S S%
+ \else\ifnum\appendixno=`T T%
+ \else\ifnum\appendixno=`U U%
+ \else\ifnum\appendixno=`V V%
+ \else\ifnum\appendixno=`W W%
+ \else\ifnum\appendixno=`X X%
+ \else\ifnum\appendixno=`Y Y%
+ \else\ifnum\appendixno=`Z Z%
+ % The \the is necessary, despite appearances, because \appendixletter is
+ % expanded while writing the .toc file. \char\appendixno is not
+ % expandable, thus it is written literally, thus all appendixes come out
+ % with the same letter (or @) in the toc without it.
+ \else\char\the\appendixno
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines these (using marks) as the number+name, number
+% and name of the chapter. Page headings and footings can use
+% these. @section does likewise.
+\def\thischapter{}
+\def\thischapternum{}
+\def\thischaptername{}
+\def\thissection{}
+\def\thissectionnum{}
+\def\thissectionname{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% we only have subsub.
+\chardef\maxseclevel = 3
+%
+% A numbered section within an unnumbered changes to unnumbered too.
+% To achive this, remember the "biggest" unnum. sec. we are currently in:
+\chardef\unmlevel = \maxseclevel
+%
+% Trace whether the current chapter is an appendix or not:
+% \chapheadtype is "N" or "A", unnumbered chapters are ignored.
+\def\chapheadtype{N}
+
+% Choose a heading macro
+% #1 is heading type
+% #2 is heading level
+% #3 is text for heading
+\def\genhead#1#2#3{%
+ % Compute the abs. sec. level:
+ \absseclevel=#2
+ \advance\absseclevel by \secbase
+ % Make sure \absseclevel doesn't fall outside the range:
+ \ifnum \absseclevel < 0
+ \absseclevel = 0
+ \else
+ \ifnum \absseclevel > 3
+ \absseclevel = 3
+ \fi
+ \fi
+ % The heading type:
+ \def\headtype{#1}%
+ \if \headtype U%
+ \ifnum \absseclevel < \unmlevel
+ \chardef\unmlevel = \absseclevel
+ \fi
+ \else
+ % Check for appendix sections:
+ \ifnum \absseclevel = 0
+ \edef\chapheadtype{\headtype}%
+ \else
+ \if \headtype A\if \chapheadtype N%
+ \errmessage{@appendix... within a non-appendix chapter}%
+ \fi\fi
+ \fi
+ % Check for numbered within unnumbered:
+ \ifnum \absseclevel > \unmlevel
+ \def\headtype{U}%
+ \else
+ \chardef\unmlevel = 3
+ \fi
+ \fi
+ % Now print the heading:
+ \if \headtype U%
+ \ifcase\absseclevel
+ \unnumberedzzz{#3}%
+ \or \unnumberedseczzz{#3}%
+ \or \unnumberedsubseczzz{#3}%
+ \or \unnumberedsubsubseczzz{#3}%
+ \fi
+ \else
+ \if \headtype A%
+ \ifcase\absseclevel
+ \appendixzzz{#3}%
+ \or \appendixsectionzzz{#3}%
+ \or \appendixsubseczzz{#3}%
+ \or \appendixsubsubseczzz{#3}%
+ \fi
+ \else
+ \ifcase\absseclevel
+ \chapterzzz{#3}%
+ \or \seczzz{#3}%
+ \or \numberedsubseczzz{#3}%
+ \or \numberedsubsubseczzz{#3}%
+ \fi
+ \fi
+ \fi
+ \suppressfirstparagraphindent
+}
+
+% an interface:
+\def\numhead{\genhead N}
+\def\apphead{\genhead A}
+\def\unnmhead{\genhead U}
+
+% @chapter, @appendix, @unnumbered. Increment top-level counter, reset
+% all lower-level sectioning counters to zero.
+%
+% Also set \chaplevelprefix, which we prepend to @float sequence numbers
+% (e.g., figures), q.v. By default (before any chapter), that is empty.
+\let\chaplevelprefix = \empty
+%
+\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz#1{%
+ % section resetting is \global in case the chapter is in a group, such
+ % as an @include file.
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\chapno by 1
+ %
+ % Used for \float.
+ \gdef\chaplevelprefix{\the\chapno.}%
+ \resetallfloatnos
+ %
+ \message{\putwordChapter\space \the\chapno}%
+ %
+ % Write the actual heading.
+ \chapmacro{#1}{Ynumbered}{\the\chapno}%
+ %
+ % So @section and the like are numbered underneath this chapter.
+ \global\let\section = \numberedsec
+ \global\let\subsection = \numberedsubsec
+ \global\let\subsubsection = \numberedsubsubsec
+}
+
+\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\appendixno by 1
+ \gdef\chaplevelprefix{\appendixletter.}%
+ \resetallfloatnos
+ %
+ \def\appendixnum{\putwordAppendix\space \appendixletter}%
+ \message{\appendixnum}%
+ %
+ \chapmacro{#1}{Yappendix}{\appendixletter}%
+ %
+ \global\let\section = \appendixsec
+ \global\let\subsection = \appendixsubsec
+ \global\let\subsubsection = \appendixsubsubsec
+}
+
+\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz#1{%
+ \global\secno=0 \global\subsecno=0 \global\subsubsecno=0
+ \global\advance\unnumberedno by 1
+ %
+ % Since an unnumbered has no number, no prefix for figures.
+ \global\let\chaplevelprefix = \empty
+ \resetallfloatnos
+ %
+ % This used to be simply \message{#1}, but TeX fully expands the
+ % argument to \message. Therefore, if #1 contained @-commands, TeX
+ % expanded them. For example, in `@unnumbered The @cite{Book}', TeX
+ % expanded @cite (which turns out to cause errors because \cite is meant
+ % to be executed, not expanded).
+ %
+ % Anyway, we don't want the fully-expanded definition of @cite to appear
+ % as a result of the \message, we just want `@cite' itself. We use
+ % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+ % simply yielding the contents of <toks register>. (We also do this for
+ % the toc entries.)
+ \toks0 = {#1}%
+ \message{(\the\toks0)}%
+ %
+ \chapmacro{#1}{Ynothing}{\the\unnumberedno}%
+ %
+ \global\let\section = \unnumberedsec
+ \global\let\subsection = \unnumberedsubsec
+ \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\parseargdef\centerchap{%
+ % Well, we could do the following in a group, but that would break
+ % an assumption that \chapmacro is called at the outermost level.
+ % Thus we are safer this way: --kasal, 24feb04
+ \let\centerparametersmaybe = \centerparameters
+ \unnmhead0{#1}%
+ \let\centerparametersmaybe = \relax
+}
+
+% @top is like @unnumbered.
+\let\top\unnumbered
+
+% Sections.
+\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz
+\def\seczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}%
+}
+
+\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}%
+}
+\let\appendixsec\appendixsection
+
+\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz#1{%
+ \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1
+ \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}%
+}
+
+% Subsections.
+\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz#1{%
+ \global\subsubsecno=0 \global\advance\subsecno by 1
+ \sectionheading{#1}{subsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno}%
+}
+
+% Subsubsections.
+\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynumbered}%
+ {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Yappendix}%
+ {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz#1{%
+ \global\advance\subsubsecno by 1
+ \sectionheading{#1}{subsubsec}{Ynothing}%
+ {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}%
+}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\let\section = \numberedsec
+\let\subsection = \numberedsubsec
+\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+% 1) We use \vbox rather than the earlier \line to permit
+% overlong headings to fold.
+% 2) \hyphenpenalty is set to 10000 because hyphenation in a
+% heading is obnoxious; this forbids it.
+% 3) Likewise, headings look best if no \parindent is used, and
+% if justification is not attempted. Hence \raggedright.
+
+
+\def\majorheading{%
+ {\advance\chapheadingskip by 10pt \chapbreak }%
+ \parsearg\chapheadingzzz
+}
+
+\def\chapheading{\chapbreak \parsearg\chapheadingzzz}
+\def\chapheadingzzz#1{%
+ {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}%
+ \bigskip \par\penalty 200\relax
+ \suppressfirstparagraphindent
+}
+
+% @heading, @subheading, @subsubheading.
+\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{}
+ \suppressfirstparagraphindent}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+% Because \domark is called before \chapoddpage, the filler page will
+% get the headings for the next chapter, which is wrong. But we don't
+% care -- we just disable all headings on the filler page.
+\def\chapoddpage{%
+ \chappager
+ \ifodd\pageno \else
+ \begingroup
+ \evenheadline={\hfil}\evenfootline={\hfil}%
+ \oddheadline={\hfil}\oddfootline={\hfil}%
+ \hbox to 0pt{}%
+ \chappager
+ \endgroup
+ \fi
+}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{%
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+% Chapter opening.
+%
+% #1 is the text, #2 is the section type (Ynumbered, Ynothing,
+% Yappendix, Yomitfromtoc), #3 the chapter number.
+%
+% To test against our argument.
+\def\Ynothingkeyword{Ynothing}
+\def\Yomitfromtockeyword{Yomitfromtoc}
+\def\Yappendixkeyword{Yappendix}
+%
+\def\chapmacro#1#2#3{%
+ % Insert the first mark before the heading break (see notes for \domark).
+ \let\prevchapterdefs=\lastchapterdefs
+ \let\prevsectiondefs=\lastsectiondefs
+ \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}%
+ \gdef\thissection{}}%
+ %
+ \def\temptype{#2}%
+ \ifx\temptype\Ynothingkeyword
+ \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{\thischaptername}}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}%
+ \gdef\thischapter{}}%
+ \else\ifx\temptype\Yappendixkeyword
+ \toks0={#1}%
+ \xdef\lastchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\appendixletter}%
+ \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \else
+ \toks0={#1}%
+ \xdef\lastchapterdefs{%
+ \gdef\noexpand\thischaptername{\the\toks0}%
+ \gdef\noexpand\thischapternum{\the\chapno}%
+ \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum:
+ \noexpand\thischaptername}%
+ }%
+ \fi\fi\fi
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert the chapter heading break.
+ \pchapsepmacro
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \let\prevchapterdefs=\lastchapterdefs
+ \let\prevsectiondefs=\lastsectiondefs
+ \domark
+ %
+ {%
+ \chapfonts \rm
+ %
+ % Have to define \lastsection before calling \donoderef, because the
+ % xref code eventually uses it. On the other hand, it has to be called
+ % after \pchapsepmacro, or the headline will change too soon.
+ \gdef\lastsection{#1}%
+ %
+ % Only insert the separating space if we have a chapter/appendix
+ % number, and don't print the unnumbered ``number''.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unnchap}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ \setbox0 = \hbox{}% contents like unnumbered, but no toc entry
+ \def\toctype{omit}%
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{\putwordAppendix{} #3\enspace}%
+ \def\toctype{app}%
+ \else
+ \setbox0 = \hbox{#3\enspace}%
+ \def\toctype{numchap}%
+ \fi\fi\fi
+ %
+ % Write the toc entry for this chapter. Must come before the
+ % \donoderef, because we include the current node name in the toc
+ % entry, and \donoderef resets it to empty.
+ \writetocentry{\toctype}{#1}{#3}%
+ %
+ % For pdftex, we have to write out the node definition (aka, make
+ % the pdfdest) after any page break, but before the actual text has
+ % been typeset. If the destination for the pdf outline is after the
+ % text, then jumping from the outline may wind up with the text not
+ % being visible, for instance under high magnification.
+ \donoderef{#2}%
+ %
+ % Typeset the actual heading.
+ \nobreak % Avoid page breaks at the interline glue.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 \centerparametersmaybe
+ \unhbox0 #1\par}%
+ }%
+ \nobreak\bigskip % no page break after a chapter title
+ \nobreak
+}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerparameters{%
+ \advance\rightskip by 3\rightskip
+ \leftskip = \rightskip
+ \parfillskip = 0pt
+}
+
+
+% I don't think this chapter style is supported any more, so I'm not
+% updating it with the new noderef stuff. We'll see. --karl, 11aug03.
+%
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+%
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt\raggedright
+ \rm #1\hfill}}\bigskip \par\nobreak
+}
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+ \parindent=0pt
+ \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+\def\CHAPFopen{%
+ \global\let\chapmacro=\chfopen
+ \global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles. These macros combine the section number parts and
+% call the generic \sectionheading to do the printing.
+%
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip{-1000}}
+
+% Subsection titles.
+\newskip\subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}}
+
+% Subsubsection titles.
+\def\subsubsecheadingskip{\subsecheadingskip}
+\def\subsubsecheadingbreak{\subsecheadingbreak}
+
+
+% Print any size, any type, section title.
+%
+% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is
+% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the
+% section number.
+%
+\def\seckeyword{sec}
+%
+\def\sectionheading#1#2#3#4{%
+ {%
+ % Switch to the right set of fonts.
+ \csname #2fonts\endcsname \rm
+ %
+ \def\sectionlevel{#2}%
+ \def\temptype{#3}%
+ %
+ % Insert first mark before the heading break (see notes for \domark).
+ \let\prevsectiondefs=\lastsectiondefs
+ \ifx\temptype\Ynothingkeyword
+ \ifx\sectionlevel\seckeyword
+ \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}%
+ \gdef\thissection{\thissectionname}}%
+ \fi
+ \else\ifx\temptype\Yomitfromtockeyword
+ % Don't redefine \thissection.
+ \else\ifx\temptype\Yappendixkeyword
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\lastsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \else
+ \ifx\sectionlevel\seckeyword
+ \toks0={#1}%
+ \xdef\lastsectiondefs{%
+ \gdef\noexpand\thissectionname{\the\toks0}%
+ \gdef\noexpand\thissectionnum{#4}%
+ \gdef\noexpand\thissection{\putwordSection{} \noexpand\thissectionnum:
+ \noexpand\thissectionname}%
+ }%
+ \fi
+ \fi\fi\fi
+ %
+ % Output the mark. Pass it through \safewhatsit, to take care of
+ % the preceding space.
+ \safewhatsit\domark
+ %
+ % Insert space above the heading.
+ \csname #2headingbreak\endcsname
+ %
+ % Now the second mark, after the heading break. No break points
+ % between here and the heading.
+ \let\prevsectiondefs=\lastsectiondefs
+ \domark
+ %
+ % Only insert the space after the number if we have a section number.
+ \ifx\temptype\Ynothingkeyword
+ \setbox0 = \hbox{}%
+ \def\toctype{unn}%
+ \gdef\lastsection{#1}%
+ \else\ifx\temptype\Yomitfromtockeyword
+ % for @headings -- no section number, don't include in toc,
+ % and don't redefine \lastsection.
+ \setbox0 = \hbox{}%
+ \def\toctype{omit}%
+ \let\sectionlevel=\empty
+ \else\ifx\temptype\Yappendixkeyword
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{app}%
+ \gdef\lastsection{#1}%
+ \else
+ \setbox0 = \hbox{#4\enspace}%
+ \def\toctype{num}%
+ \gdef\lastsection{#1}%
+ \fi\fi\fi
+ %
+ % Write the toc entry (before \donoderef). See comments in \chapmacro.
+ \writetocentry{\toctype\sectionlevel}{#1}{#4}%
+ %
+ % Write the node reference (= pdf destination for pdftex).
+ % Again, see comments in \chapmacro.
+ \donoderef{#3}%
+ %
+ % Interline glue will be inserted when the vbox is completed.
+ % That glue will be a valid breakpoint for the page, since it'll be
+ % preceded by a whatsit (usually from the \donoderef, or from the
+ % \writetocentry if there was no node). We don't want to allow that
+ % break, since then the whatsits could end up on page n while the
+ % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000.
+ \nobreak
+ %
+ % Output the actual section heading.
+ \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+ \hangindent=\wd0 % zero if no section number
+ \unhbox0 #1}%
+ }%
+ % Add extra space after the heading -- half of whatever came above it.
+ % Don't allow stretch, though.
+ \kern .5 \csname #2headingskip\endcsname
+ %
+ % Do not let the kern be a potential breakpoint, as it would be if it
+ % was followed by glue.
+ \nobreak
+ %
+ % We'll almost certainly start a paragraph next, so don't let that
+ % glue accumulate. (Not a breakpoint because it's preceded by a
+ % discardable item.)
+ \vskip-\parskip
+ %
+ % This is purely so the last item on the list is a known \penalty >
+ % 10000. This is so \startdefun can avoid allowing breakpoints after
+ % section headings. Otherwise, it would insert a valid breakpoint between:
+ %
+ % @section sec-whatever
+ % @deffn def-whatever
+ \penalty 10001
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.
+%
+% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno}
+% We append the current node name (if any) and page number as additional
+% arguments for the \{chap,sec,...}entry macros which will eventually
+% read this. The node name is used in the pdf outlines as the
+% destination to jump to.
+%
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+% But if #1 is `omit', then we don't do anything. This is used for the
+% table of contents chapter openings themselves.
+%
+\newif\iftocfileopened
+\def\omitkeyword{omit}%
+%
+\def\writetocentry#1#2#3{%
+ \edef\writetoctype{#1}%
+ \ifx\writetoctype\omitkeyword \else
+ \iftocfileopened\else
+ \immediate\openout\tocfile = \jobname.toc
+ \global\tocfileopenedtrue
+ \fi
+ %
+ \iflinks
+ {\atdummies
+ \edef\temp{%
+ \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}%
+ \temp
+ }%
+ \fi
+ \fi
+ %
+ % Tell \shipout to create a pdf destination on each page, if we're
+ % writing pdf. These are used in the table of contents. We can't
+ % just write one on every page because the title pages are numbered
+ % 1 and 2 (the page numbers aren't printed), and so are the first
+ % two pages of the document. Thus, we'd have two destinations named
+ % `1', and two named `2'.
+ \ifpdf \global\pdfmakepagedesttrue \fi
+}
+
+
+% These characters do not print properly in the Computer Modern roman
+% fonts, so we must take special care. This is more or less redundant
+% with the Texinfo input format setup at the end of this file.
+%
+\def\activecatcodes{%
+ \catcode`\"=\active
+ \catcode`\$=\active
+ \catcode`\<=\active
+ \catcode`\>=\active
+ \catcode`\\=\active
+ \catcode`\^=\active
+ \catcode`\_=\active
+ \catcode`\|=\active
+ \catcode`\~=\active
+}
+
+
+% Read the toc file, which is essentially Texinfo input.
+\def\readtocfile{%
+ \setupdatafile
+ \activecatcodes
+ \input \tocreadfilename
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Prepare to read what we've written to \tocfile.
+%
+\def\startcontents#1{%
+ % If @setchapternewpage on, and @headings double, the contents should
+ % start on an odd page, unlike chapters. Thus, we maintain
+ % \contentsalignmacro in parallel with \pagealignmacro.
+ % From: Torbjorn Granlund <tege@matematik.su.se>
+ \contentsalignmacro
+ \immediate\closeout\tocfile
+ %
+ % Don't need to put `Contents' or `Short Contents' in the headline.
+ % It is abundantly clear what they are.
+ \chapmacro{#1}{Yomitfromtoc}{}%
+ %
+ \savepageno = \pageno
+ \begingroup % Set up to handle contents files properly.
+ \raggedbottom % Worry more about breakpoints than the bottom.
+ \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+ %
+ % Roman numerals for page numbers.
+ \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+% redefined for the two-volume lispref. We always output on
+% \jobname.toc even if this is redefined.
+%
+\def\tocreadfilename{\jobname.toc}
+
+% Normal (long) toc.
+%
+\def\contents{%
+ \startcontents{\putwordTOC}%
+ \openin 1 \tocreadfilename\space
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \ifeof 1 \else
+ \pdfmakeoutlines
+ \fi
+ \closein 1
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+ \startcontents{\putwordShortTOC}%
+ %
+ \let\numchapentry = \shortchapentry
+ \let\appentry = \shortchapentry
+ \let\unnchapentry = \shortunnchapentry
+ % We want a true roman here for the page numbers.
+ \secfonts
+ \let\rm=\shortcontrm \let\bf=\shortcontbf
+ \let\sl=\shortcontsl \let\tt=\shortconttt
+ \rm
+ \hyphenpenalty = 10000
+ \advance\baselineskip by 1pt % Open it up a little.
+ \def\numsecentry##1##2##3##4{}
+ \let\appsecentry = \numsecentry
+ \let\unnsecentry = \numsecentry
+ \let\numsubsecentry = \numsecentry
+ \let\appsubsecentry = \numsecentry
+ \let\unnsubsecentry = \numsecentry
+ \let\numsubsubsecentry = \numsecentry
+ \let\appsubsubsecentry = \numsecentry
+ \let\unnsubsubsecentry = \numsecentry
+ \openin 1 \tocreadfilename\space
+ \ifeof 1 \else
+ \readtocfile
+ \fi
+ \closein 1
+ \vfill \eject
+ \contentsalignmacro % in case @setchapternewpage odd is in effect
+ \endgroup
+ \lastnegativepageno = \pageno
+ \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `A' for an appendix, or `3' for a chapter.
+%
+\def\shortchaplabel#1{%
+ % This space should be enough, since a single number is .5em, and the
+ % widest letter (M) is 1em, at least in the Computer Modern fonts.
+ % But use \hss just in case.
+ % (This space doesn't include the extra space that gets added after
+ % the label; that gets put in by \shortchapentry above.)
+ %
+ % We'd like to right-justify chapter numbers, but that looks strange
+ % with appendix letters. And right-justifying numbers and
+ % left-justifying letters looks strange when there is less than 10
+ % chapters. Have to read the whole toc once to know how many chapters
+ % there are before deciding ...
+ \hbox to 1em{#1\hss}%
+}
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3#4{%
+ \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}%
+}
+
+% Appendices, in the main contents.
+% Need the word Appendix, and a fixed-size box.
+%
+\def\appendixbox#1{%
+ % We use M since it's probably the widest letter.
+ \setbox0 = \hbox{\putwordAppendix{} M}%
+ \hbox to \wd0{\putwordAppendix{} #1\hss}}
+%
+\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}}
+
+% Unnumbered chapters.
+\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}}
+\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}}
+
+% Sections.
+\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}}
+\let\appsecentry=\numsecentry
+\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsecentry=\numsubsecentry
+\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}}
+
+% And subsubsections.
+\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}}
+\let\appsubsubsecentry=\numsubsubsecentry
+\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}}
+
+% This parameter controls the indentation of the various levels.
+% Same as \defaultparindent.
+\newdimen\tocindent \tocindent = 15pt
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+ \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+ \begingroup
+ \chapentryfonts
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+ \endgroup
+ \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+ \secentryfonts \leftskip=\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+ \subsecentryfonts \leftskip=2\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+ \subsubsecentryfonts \leftskip=3\tocindent
+ \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% We use the same \entry macro as for the index entries.
+\let\tocentry = \entry
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\def\subsecentryfonts{\textfonts}
+\def\subsubsecentryfonts{\textfonts}
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \reducedsf error\kern-1.5pt}
+%
+\setbox\errorbox=\hbox to \dimen0{\hfil
+ \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+ \advance\hsize by -2\dimen2 % Rules.
+ \vbox{%
+ \hrule height\dimen2
+ \hbox{\vrule width\dimen2 \kern3pt % Space to left of text.
+ \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+ \kern3pt\vrule width\dimen2}% Space to right.
+ \hrule height\dimen2}
+ \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\envdef\tex{%
+ \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+ \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+ \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+ \catcode `\%=14
+ \catcode `\+=\other
+ \catcode `\"=\other
+ \catcode `\|=\other
+ \catcode `\<=\other
+ \catcode `\>=\other
+ \escapechar=`\\
+ %
+ \let\b=\ptexb
+ \let\bullet=\ptexbullet
+ \let\c=\ptexc
+ \let\,=\ptexcomma
+ \let\.=\ptexdot
+ \let\dots=\ptexdots
+ \let\equiv=\ptexequiv
+ \let\!=\ptexexclam
+ \let\i=\ptexi
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \let\{=\ptexlbrace
+ \let\+=\tabalign
+ \let\}=\ptexrbrace
+ \let\/=\ptexslash
+ \let\*=\ptexstar
+ \let\t=\ptext
+ \let\frenchspacing=\plainfrenchspacing
+ %
+ \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+ \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+ \def\@{@}%
+}
+% There is no need to define \Etex.
+
+% Define @lisp ... @end lisp.
+% @lisp environment forms a group so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments. \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical. We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+ % =10000 instead of <10000 because of a special case in \itemzzz and
+ % \sectionheading, q.v.
+ \ifnum \lastpenalty=10000 \else
+ \advance\envskipamount by \parskip
+ \endgraf
+ \ifdim\lastskip<\envskipamount
+ \removelastskip
+ % it's not a good place to break if the last penalty was \nobreak
+ % or better ...
+ \ifnum\lastpenalty<10000 \penalty-50 \fi
+ \vskip\envskipamount
+ \fi
+ \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will
+% also clear it, so that its embedded environments do the narrowing again.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+ \ctl\leaders\hrule height\circthick\hfil\ctr
+ \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+ \cbl\leaders\hrule height\circthick\hfil\cbr
+ \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\envdef\cartouche{%
+ \ifhmode\par\fi % can't be in the midst of a paragraph.
+ \startsavinginserts
+ \lskip=\leftskip \rskip=\rightskip
+ \leftskip=0pt\rightskip=0pt % we want these *outside*.
+ \cartinner=\hsize \advance\cartinner by-\lskip
+ \advance\cartinner by-\rskip
+ \cartouter=\hsize
+ \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+ % side, and for 6pt waste from
+ % each corner char, and rule thickness
+ \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+ % Flag to tell @lisp, etc., not to narrow margin.
+ \let\nonarrowing = t%
+ \vbox\bgroup
+ \baselineskip=0pt\parskip=0pt\lineskip=0pt
+ \carttop
+ \hbox\bgroup
+ \hskip\lskip
+ \vrule\kern3pt
+ \vbox\bgroup
+ \kern3pt
+ \hsize=\cartinner
+ \baselineskip=\normbskip
+ \lineskip=\normlskip
+ \parskip=\normpskip
+ \vskip -\parskip
+ \comment % For explanation, see the end of \def\group.
+}
+\def\Ecartouche{%
+ \ifhmode\par\fi
+ \kern3pt
+ \egroup
+ \kern3pt\vrule
+ \hskip\rskip
+ \egroup
+ \cartbot
+ \egroup
+ \checkinserts
+}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+ \aboveenvbreak
+ \hfuzz = 12pt % Don't be fussy
+ \sepspaces % Make spaces be word-separators rather than space tokens.
+ \let\par = \lisppar % don't ignore blank lines
+ \obeylines % each line of input is a line of output
+ \parskip = 0pt
+ \parindent = 0pt
+ \emergencystretch = 0pt % don't try to avoid overfull boxes
+ \ifx\nonarrowing\relax
+ \advance \leftskip by \lispnarrowing
+ \exdentamount=\lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \let\exdent=\nofillexdent
+}
+
+% If you want all examples etc. small: @set dispenvsize small.
+% If you want even small examples the full size: @set dispenvsize nosmall.
+% This affects the following displayed environments:
+% @example, @display, @format, @lisp
+%
+\def\smallword{small}
+\def\nosmallword{nosmall}
+\let\SETdispenvsize\relax
+\def\setnormaldispenv{%
+ \ifx\SETdispenvsize\smallword
+ % end paragraph for sake of leading, in case document has no blank
+ % line. This is redundant with what happens in \aboveenvbreak, but
+ % we need to do it before changing the fonts, and it's inconvenient
+ % to change the fonts afterward.
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+\def\setsmalldispenv{%
+ \ifx\SETdispenvsize\nosmallword
+ \else
+ \ifnum \lastpenalty=10000 \else \endgraf \fi
+ \smallexamplefonts \rm
+ \fi
+}
+
+% We often define two environments, @foo and @smallfoo.
+% Let's do it by one command:
+\def\makedispenv #1#2{
+ \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}
+ \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}
+ \expandafter\let\csname E#1\endcsname \afterenvbreak
+ \expandafter\let\csname Esmall#1\endcsname \afterenvbreak
+}
+
+% Define two synonyms:
+\def\maketwodispenvs #1#2#3{
+ \makedispenv{#1}{#3}
+ \makedispenv{#2}{#3}
+}
+
+% @lisp: indented, narrowed, typewriter font; @example: same as @lisp.
+%
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+%
+\maketwodispenvs {lisp}{example}{%
+ \nonfillstart
+ \tt\quoteexpand
+ \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+ \gobble % eat return
+}
+% @display/@smalldisplay: same as @lisp except keep current font.
+%
+\makedispenv {display}{%
+ \nonfillstart
+ \gobble
+}
+
+% @format/@smallformat: same as @display except don't narrow margins.
+%
+\makedispenv{format}{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+
+% @flushleft: same as @format, but doesn't obey \SETdispenvsize.
+\envdef\flushleft{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \gobble
+}
+\let\Eflushleft = \afterenvbreak
+
+% @flushright.
+%
+\envdef\flushright{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ \advance\leftskip by 0pt plus 1fill
+ \gobble
+}
+\let\Eflushright = \afterenvbreak
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins. We keep \parskip nonzero in general, since
+% we're doing normal filling. So, when using \aboveenvbreak and
+% \afterenvbreak, temporarily make \parskip 0.
+%
+\envdef\quotation{%
+ {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+ \parindent=0pt
+ %
+ % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+ \ifx\nonarrowing\relax
+ \advance\leftskip by \lispnarrowing
+ \advance\rightskip by \lispnarrowing
+ \exdentamount = \lispnarrowing
+ \else
+ \let\nonarrowing = \relax
+ \fi
+ \parsearg\quotationlabel
+}
+
+% We have retained a nonzero parskip for the environment, since we're
+% doing normal filling.
+%
+\def\Equotation{%
+ \par
+ \ifx\quotationauthor\undefined\else
+ % indent a bit.
+ \leftline{\kern 2\leftskip \sl ---\quotationauthor}%
+ \fi
+ {\parskip=0pt \afterenvbreak}%
+}
+
+% If we're given an argument, typeset it in bold with a colon after.
+\def\quotationlabel#1{%
+ \def\temp{#1}%
+ \ifx\temp\empty \else
+ {\bf #1: }%
+ \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too. Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+ \do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+ \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+ \def\do##1{\catcode`##1=\other}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+ \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+ \tt % easiest (and conventionally used) font for verbatim
+ \def\par{\leavevmode\endgraf}%
+ \catcode`\`=\active
+ \tabeightspaces
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+
+% Allow an option to not replace quotes with a regular directed right
+% quote/apostrophe (char 0x27), but instead use the undirected quote
+% from cmtt (char 0x0d). The undirected quote is ugly, so don't make it
+% the default, but it works for pasting with more pdf viewers (at least
+% evince), the lilypond developers report. xpdf does work with the
+% regular 0x27.
+%
+\def\codequoteright{%
+ \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax
+ \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax
+ '%
+ \else \char'15 \fi
+ \else \char'15 \fi
+}
+%
+% and a similar option for the left quote char vs. a grave accent.
+% Modern fonts display ASCII 0x60 as a grave accent, so some people like
+% the code environments to do likewise.
+%
+\def\codequoteleft{%
+ \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax
+ \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax
+ `%
+ \else \char'22 \fi
+ \else \char'22 \fi
+}
+%
+\begingroup
+ \catcode`\^^I=\active
+ \gdef\tabexpand{%
+ \catcode`\^^I=\active
+ \def^^I{\leavevmode\egroup
+ \dimen0=\wd0 % the width so far, or since the previous tab
+ \divide\dimen0 by\tabw
+ \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+ \advance\dimen0 by\tabw % advance to next multiple of \tabw
+ \wd0=\dimen0 \box0 \starttabbox
+ }%
+ }
+ \catcode`\'=\active
+ \gdef\rquoteexpand{\catcode\rquoteChar=\active \def'{\codequoteright}}%
+ %
+ \catcode`\`=\active
+ \gdef\lquoteexpand{\catcode\lquoteChar=\active \def`{\codequoteleft}}%
+ %
+ \gdef\quoteexpand{\rquoteexpand \lquoteexpand}%
+\endgroup
+
+% start the verbatim environment.
+\def\setupverbatim{%
+ \let\nonarrowing = t%
+ \nonfillstart
+ % Easiest (and conventionally used) font for verbatim
+ \tt
+ \def\par{\leavevmode\egroup\box0\endgraf}%
+ \catcode`\`=\active
+ \tabexpand
+ \quoteexpand
+ % Respect line breaks,
+ % print special symbols as themselves, and
+ % make each space count
+ % must do in this order:
+ \obeylines \uncatcodespecials \sepspaces
+ \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters. Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+% \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+ \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other
+ \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+% \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%
+\begingroup
+ \catcode`\ =\active
+ \obeylines %
+ % ignore everything up to the first ^^M, that's the newline at the end
+ % of the @verbatim input line itself. Otherwise we get an extra blank
+ % line in the output.
+ \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}%
+ % We really want {...\end verbatim} in the body of the macro, but
+ % without the active space; thus we have to use \xdef and \gobble.
+\endgroup
+%
+\envdef\verbatim{%
+ \setupverbatim\doverbatim
+}
+\let\Everbatim = \afterenvbreak
+
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude}
+%
+\def\doverbatiminclude#1{%
+ {%
+ \makevalueexpandable
+ \setupverbatim
+ \input #1
+ \afterenvbreak
+ }%
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\checkenv{}\begingroup\scanargctxt\docopying}
+\def\docopying#1@end copying{\endgroup\def\copyingtext{#1}}
+%
+\def\insertcopying{%
+ \begingroup
+ \parindent = 0pt % paragraph indentation looks wrong on title page
+ \scanexp\copyingtext
+ \endgroup
+}
+
+
+\message{defuns,}
+% @defun etc.
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+\newcount\defunpenalty
+
+% Start the processing of @deffn:
+\def\startdefun{%
+ \ifnum\lastpenalty<10000
+ \medbreak
+ \defunpenalty=10003 % Will keep this @deffn together with the
+ % following @def command, see below.
+ \else
+ % If there are two @def commands in a row, we'll have a \nobreak,
+ % which is there to keep the function description together with its
+ % header. But if there's nothing but headers, we need to allow a
+ % break somewhere. Check specifically for penalty 10002, inserted
+ % by \printdefunline, instead of 10000, since the sectioning
+ % commands also insert a nobreak penalty, and we don't want to allow
+ % a break between a section heading and a defun.
+ %
+ % As a minor refinement, we avoid "club" headers by signalling
+ % with penalty of 10003 after the very first @deffn in the
+ % sequence (see above), and penalty of 10002 after any following
+ % @def command.
+ \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi
+ %
+ % Similarly, after a section heading, do not allow a break.
+ % But do insert the glue.
+ \medskip % preceded by discardable penalty, so not a breakpoint
+ \fi
+ %
+ \parindent=0in
+ \advance\leftskip by \defbodyindent
+ \exdentamount=\defbodyindent
+}
+
+\def\dodefunx#1{%
+ % First, check whether we are in the right environment:
+ \checkenv#1%
+ %
+ % As above, allow line break if we have multiple x headers in a row.
+ % It's not a great place, though.
+ \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi
+ %
+ % And now, it's time to reuse the body of the original defun:
+ \expandafter\gobbledefun#1%
+}
+\def\gobbledefun#1\startdefun{}
+
+% \printdefunline \deffnheader{text}
+%
+\def\printdefunline#1#2{%
+ \begingroup
+ % call \deffnheader:
+ #1#2 \endheader
+ % common ending:
+ \interlinepenalty = 10000
+ \advance\rightskip by 0pt plus 1fil
+ \endgraf
+ \nobreak\vskip -\parskip
+ \penalty\defunpenalty % signal to \startdefun and \dodefunx
+ % Some of the @defun-type tags do not enable magic parentheses,
+ % rendering the following check redundant. But we don't optimize.
+ \checkparencounts
+ \endgroup
+}
+
+\def\Edefun{\endgraf\medbreak}
+
+% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
+% the only thing remainnig is to define \deffnheader.
+%
+\def\makedefun#1{%
+ \expandafter\let\csname E#1\endcsname = \Edefun
+ \edef\temp{\noexpand\domakedefun
+ \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}%
+ \temp
+}
+
+% \domakedefun \deffn \deffnx \deffnheader
+%
+% Define \deffn and \deffnx, without parameters.
+% \deffnheader has to be defined explicitly.
+%
+\def\domakedefun#1#2#3{%
+ \envdef#1{%
+ \startdefun
+ \parseargusing\activeparens{\printdefunline#3}%
+ }%
+ \def#2{\dodefunx#1}%
+ \def#3%
+}
+
+%%% Untyped functions:
+
+% @deffn category name args
+\makedefun{deffn}{\deffngeneral{}}
+
+% @deffn category class name args
+\makedefun{defop}#1 {\defopon{#1\ \putwordon}}
+
+% \defopon {category on}class name args
+\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deffngeneral {subind}category name args
+%
+\def\deffngeneral#1#2 #3 #4\endheader{%
+ % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}.
+ \dosubind{fn}{\code{#3}}{#1}%
+ \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}%
+}
+
+%%% Typed functions:
+
+% @deftypefn category type name args
+\makedefun{deftypefn}{\deftypefngeneral{}}
+
+% @deftypeop category class type name args
+\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}}
+
+% \deftypeopon {category on}class type name args
+\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypefngeneral {subind}category type name args
+%
+\def\deftypefngeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{fn}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Typed variables:
+
+% @deftypevr category type var args
+\makedefun{deftypevr}{\deftypecvgeneral{}}
+
+% @deftypecv category class type var args
+\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}}
+
+% \deftypecvof {category of}class type var args
+\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} }
+
+% \deftypecvgeneral {subind}category type var args
+%
+\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{%
+ \dosubind{vr}{\code{#4}}{#1}%
+ \defname{#2}{#3}{#4}\defunargs{#5\unskip}%
+}
+
+%%% Untyped variables:
+
+% @defvr category var args
+\makedefun{defvr}#1 {\deftypevrheader{#1} {} }
+
+% @defcv category class var args
+\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}}
+
+% \defcvof {category of}class var args
+\def\defcvof#1#2 {\deftypecvof{#1}#2 {} }
+
+%%% Type:
+% @deftp category name args
+\makedefun{deftp}#1 #2 #3\endheader{%
+ \doind{tp}{\code{#2}}%
+ \defname{#1}{}{#2}\defunargs{#3\unskip}%
+}
+
+% Remaining @defun-like shortcuts:
+\makedefun{defun}{\deffnheader{\putwordDeffunc} }
+\makedefun{defmac}{\deffnheader{\putwordDefmac} }
+\makedefun{defspec}{\deffnheader{\putwordDefspec} }
+\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} }
+\makedefun{defvar}{\defvrheader{\putwordDefvar} }
+\makedefun{defopt}{\defvrheader{\putwordDefopt} }
+\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} }
+\makedefun{defmethod}{\defopon\putwordMethodon}
+\makedefun{deftypemethod}{\deftypeopon\putwordMethodon}
+\makedefun{defivar}{\defcvof\putwordInstanceVariableof}
+\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the category, such as "Function".
+% #2 is the return type, if any.
+% #3 is the function name.
+%
+% We are followed by (but not passed) the arguments, if any.
+%
+\def\defname#1#2#3{%
+ % Get the values of \leftskip and \rightskip as they were outside the @def...
+ \advance\leftskip by -\defbodyindent
+ %
+ % How we'll format the type name. Putting it in brackets helps
+ % distinguish it from the body text that may end up on the next line
+ % just below it.
+ \def\temp{#1}%
+ \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi}
+ %
+ % Figure out line sizes for the paragraph shape.
+ % The first line needs space for \box0; but if \rightskip is nonzero,
+ % we need only space for the part of \box0 which exceeds it:
+ \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip
+ % The continuations:
+ \dimen2=\hsize \advance\dimen2 by -\defargsindent
+ % (plain.tex says that \dimen1 should be used only as global.)
+ \parshape 2 0in \dimen0 \defargsindent \dimen2
+ %
+ % Put the type name to the right margin.
+ \noindent
+ \hbox to 0pt{%
+ \hfil\box0 \kern-\hsize
+ % \hsize has to be shortened this way:
+ \kern\leftskip
+ % Intentionally do not respect \rightskip, since we need the space.
+ }%
+ %
+ % Allow all lines to be underfull without complaint:
+ \tolerance=10000 \hbadness=10000
+ \exdentamount=\defbodyindent
+ {%
+ % defun fonts. We use typewriter by default (used to be bold) because:
+ % . we're printing identifiers, they should be in tt in principle.
+ % . in languages with many accents, such as Czech or French, it's
+ % common to leave accents off identifiers. The result looks ok in
+ % tt, but exceedingly strange in rm.
+ % . we don't want -- and --- to be treated as ligatures.
+ % . this still does not fix the ?` and !` ligatures, but so far no
+ % one has made identifiers using them :).
+ \df \tt
+ \def\temp{#2}% return value type
+ \ifx\temp\empty\else \tclose{\temp} \fi
+ #3% output function name
+ }%
+ {\rm\enskip}% hskip 0.5 em of \tenrm
+ %
+ \boldbrax
+ % arguments will be output next, if any.
+}
+
+% Print arguments in slanted roman (not ttsl), inconsistently with using
+% tt for the name. This is because literal text is sometimes needed in
+% the argument list (groff manual), and ttsl and tt are not very
+% distinguishable. Prevent hyphenation at `-' chars.
+%
+\def\defunargs#1{%
+ % use sl by default (not ttsl),
+ % tt for the names.
+ \df \sl \hyphenchar\font=0
+ %
+ % On the other hand, if an argument has two dashes (for instance), we
+ % want a way to get ttsl. Let's try @var for that.
+ \let\var=\ttslanted
+ #1%
+ \sl\hyphenchar\font=45
+}
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+ \catcode`\(=\active \catcode`\)=\active
+ \catcode`\[=\active \catcode`\]=\active
+ \catcode`\&=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+% Be sure that we always have a definition for `(', etc. For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+{
+ \activeparens
+ \global\let(=\lparen \global\let)=\rparen
+ \global\let[=\lbrack \global\let]=\rbrack
+ \global\let& = \&
+
+ \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+ \gdef\magicamp{\let&=\amprm}
+}
+
+\newcount\parencount
+
+% If we encounter &foo, then turn on ()-hacking afterwards
+\newif\ifampseen
+\def\amprm#1 {\ampseentrue{\bf\&#1 }}
+
+\def\parenfont{%
+ \ifampseen
+ % At the first level, print parens in roman,
+ % otherwise use the default font.
+ \ifnum \parencount=1 \rm \fi
+ \else
+ % The \sf parens (in \boldbrax) actually are a little bolder than
+ % the contained text. This is especially needed for [ and ] .
+ \sf
+ \fi
+}
+\def\infirstlevel#1{%
+ \ifampseen
+ \ifnum\parencount=1
+ #1%
+ \fi
+ \fi
+}
+\def\bfafterword#1 {#1 \bf}
+
+\def\opnr{%
+ \global\advance\parencount by 1
+ {\parenfont(}%
+ \infirstlevel \bfafterword
+}
+\def\clnr{%
+ {\parenfont)}%
+ \infirstlevel \sl
+ \global\advance\parencount by -1
+}
+
+\newcount\brackcount
+\def\lbrb{%
+ \global\advance\brackcount by 1
+ {\bf[}%
+}
+\def\rbrb{%
+ {\bf]}%
+ \global\advance\brackcount by -1
+}
+
+\def\checkparencounts{%
+ \ifnum\parencount=0 \else \badparencount \fi
+ \ifnum\brackcount=0 \else \badbrackcount \fi
+}
+% these should not use \errmessage; the glibc manual, at least, actually
+% has such constructs (when documenting function pointers).
+\def\badparencount{%
+ \message{Warning: unbalanced parentheses in @def...}%
+ \global\parencount=0
+}
+\def\badbrackcount{%
+ \message{Warning: unbalanced square brackets in @def...}%
+ \global\brackcount=0
+}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scantokens#1{%
+ \toks0={#1}%
+ \immediate\openout\macscribble=\jobname.tmp
+ \immediate\write\macscribble{\the\toks0}%
+ \immediate\closeout\macscribble
+ \input \jobname.tmp
+ }
+\fi
+
+\def\scanmacro#1{%
+ \begingroup
+ \newlinechar`\^^M
+ \let\xeatspaces\eatspaces
+ % Undo catcode changes of \startcontents and \doprintindex
+ % When called from @insertcopying or (short)caption, we need active
+ % backslash to get it printed correctly. Previously, we had
+ % \catcode`\\=\other instead. We'll see whether a problem appears
+ % with macro expansion. --kasal, 19aug04
+ \catcode`\@=0 \catcode`\\=\active \escapechar=`\@
+ % ... and \example
+ \spaceisspace
+ %
+ % Append \endinput to make sure that TeX does not see the ending newline.
+ % I've verified that it is necessary both for e-TeX and for ordinary TeX
+ % --kasal, 29nov03
+ \scantokens{#1\endinput}%
+ \endgroup
+}
+
+\def\scanexp#1{%
+ \edef\temp{\noexpand\scanmacro{#1}}%
+ \temp
+}
+
+\newcount\paramno % Count of parameters
+\newtoks\macname % Macro name
+\newif\ifrecursive % Is it recursive?
+
+% List of all defined macros in the form
+% \definedummyword\macro1\definedummyword\macro2...
+% Currently is also contains all @aliases; the list can be split
+% if there is a need.
+\def\macrolist{}
+
+% Add the macro to \macrolist
+\def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname}
+\def\addtomacrolistxxx#1{%
+ \toks0 = \expandafter{\macrolist\definedummyword#1}%
+ \xdef\macrolist{\the\toks0}%
+}
+
+% Utility routines.
+% This does \let #1 = #2, with \csnames; that is,
+% \let \csname#1\endcsname = \csname#2\endcsname
+% (except of course we have to play expansion games).
+%
+\def\cslet#1#2{%
+ \expandafter\let
+ \csname#1\expandafter\endcsname
+ \csname#2\endcsname
+}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% Non-ASCII encodings make 8-bit characters active, so un-activate
+% them to avoid their expansion. Must do this non-globally, to
+% confine the change to the current group.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\scanctxt{%
+ \catcode`\"=\other
+ \catcode`\+=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\@=\other
+ \catcode`\^=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\~=\other
+ \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi
+}
+
+\def\scanargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+ \catcode`\^^M=\other
+}
+
+\def\macrobodyctxt{%
+ \scanctxt
+ \catcode`\{=\other
+ \catcode`\}=\other
+ \catcode`\^^M=\other
+ \usembodybackslash
+}
+
+\def\macroargctxt{%
+ \scanctxt
+ \catcode`\\=\other
+}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+ \getargs{#1}% now \macname is the macname and \argl the arglist
+ \ifx\argl\empty % no arguments
+ \paramno=0%
+ \else
+ \expandafter\parsemargdef \argl;%
+ \fi
+ \if1\csname ismacro.\the\macname\endcsname
+ \message{Warning: redefining \the\macname}%
+ \else
+ \expandafter\ifx\csname \the\macname\endcsname \relax
+ \else \errmessage{Macro name \the\macname\space already defined}\fi
+ \global\cslet{macsave.\the\macname}{\the\macname}%
+ \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+ \addtomacrolist{\the\macname}%
+ \fi
+ \begingroup \macrobodyctxt
+ \ifrecursive \expandafter\parsermacbody
+ \else \expandafter\parsemacbody
+ \fi}
+
+\parseargdef\unmacro{%
+ \if1\csname ismacro.#1\endcsname
+ \global\cslet{#1}{macsave.#1}%
+ \global\expandafter\let \csname ismacro.#1\endcsname=0%
+ % Remove the macro name from \macrolist:
+ \begingroup
+ \expandafter\let\csname#1\endcsname \relax
+ \let\definedummyword\unmacrodo
+ \xdef\macrolist{\macrolist}%
+ \endgroup
+ \else
+ \errmessage{Macro #1 not defined}%
+ \fi
+}
+
+% Called by \do from \dounmacro on each macro. The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+ \ifx #1\relax
+ % remove this
+ \else
+ \noexpand\definedummyword \noexpand#1%
+ \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list. Set up \paramno and \paramlist
+% so \defmacro knows what to do. Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX: let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+ \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+ \if#1;\let\next=\relax
+ \else \let\next=\parsemargdefxxx
+ \advance\paramno by 1%
+ \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+ {\xeatspaces{\hash\the\paramno}}%
+ \edef\paramlist{\paramlist\hash\the\paramno,}%
+ \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+ \let\hash=##% convert placeholders to macro parameter chars
+ \ifrecursive
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\scanmacro{\temp}}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup\noexpand\scanmacro{\temp}}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+ \fi
+ \else
+ \ifcase\paramno
+ % 0
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \or % 1
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \noexpand\braceorline
+ \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+ \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \else % many
+ \expandafter\xdef\csname\the\macname\endcsname{%
+ \bgroup\noexpand\macroargctxt
+ \expandafter\noexpand\csname\the\macname xx\endcsname}%
+ \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+ \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+ \expandafter\expandafter
+ \expandafter\xdef
+ \expandafter\expandafter
+ \csname\the\macname xxx\endcsname
+ \paramlist{%
+ \egroup
+ \noexpand\norecurse{\the\macname}%
+ \noexpand\scanmacro{\temp}\egroup}%
+ \fi
+ \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {. If so it reads up to the closing }, if not, it reads the whole
+% line. Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+ \ifx\nchar\bgroup\else
+ \expandafter\parsearg
+ \fi \macnamexxx}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign. Just make them active and then expand them all to nothing.
+\def\alias{\parseargusing\obeyspaces\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{%
+ {%
+ \expandafter\let\obeyedspace=\empty
+ \addtomacrolist{#1}%
+ \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}%
+ }%
+ \next
+}
+
+
+\message{cross references,}
+
+\newwrite\auxfile
+\newif\ifhavexrefs % True if xref values are known.
+\newif\ifwarnedxrefs % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+ node \samp{\ignorespaces#1{}}}
+
+% @node's only job in TeX is to define \lastnode, which is used in
+% cross-references. The @node line might or might not have commas, and
+% might or might not have spaces before the first comma, like:
+% @node foo , bar , ...
+% We don't want such trailing spaces in the node name.
+%
+\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse}
+%
+% also remove a trailing comma, in case of something like this:
+% @node Help-Cross, , , Cross-refs
+\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse}
+\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+
+\let\nwnode=\node
+\let\lastnode=\empty
+
+% Write a cross-reference definition for the current node. #1 is the
+% type (Ynumbered, Yappendix, Ynothing).
+%
+\def\donoderef#1{%
+ \ifx\lastnode\empty\else
+ \setref{\lastnode}{#1}%
+ \global\let\lastnode=\empty
+ \fi
+}
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+%
+\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), which consists of three parts:
+% 1) NAME-title - the current sectioning name taken from \lastsection,
+% or the anchor name.
+% 2) NAME-snt - section number and type, passed as the SNT arg, or
+% empty for anchors.
+% 3) NAME-pg - the page number.
+%
+% This is called from \donoderef, \anchor, and \dofloat. In the case of
+% floats, there is an additional part, which is not written here:
+% 4) NAME-lof - the text as it should appear in a @listoffloats.
+%
+\def\setref#1#2{%
+ \pdfmkdest{#1}%
+ \iflinks
+ {%
+ \atdummies % preserve commands, but don't expand them
+ \edef\writexrdef##1##2{%
+ \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef
+ ##1}{##2}}% these are parameters of \writexrdef
+ }%
+ \toks0 = \expandafter{\lastsection}%
+ \immediate \writexrdef{title}{\the\toks0 }%
+ \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc.
+ \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, during \shipout
+ }%
+ \fi
+}
+
+% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual. All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+ \unsepspaces
+ \def\printedmanual{\ignorespaces #5}%
+ \def\printedrefname{\ignorespaces #3}%
+ \setbox1=\hbox{\printedmanual\unskip}%
+ \setbox0=\hbox{\printedrefname\unskip}%
+ \ifdim \wd0 = 0pt
+ % No printed node name was explicitly given.
+ \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+ % Use the node name inside the square brackets.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ % Use the actual chapter/section title appear inside
+ % the square brackets. Use the real section title if we have it.
+ \ifdim \wd1 > 0pt
+ % It is in another manual, so we don't have it.
+ \def\printedrefname{\ignorespaces #1}%
+ \else
+ \ifhavexrefs
+ % We know the real title if we have the xref values.
+ \def\printedrefname{\refx{#1-title}{}}%
+ \else
+ % Otherwise just copy the Info node name.
+ \def\printedrefname{\ignorespaces #1}%
+ \fi%
+ \fi
+ \fi
+ \fi
+ %
+ % Make link in pdf output.
+ \ifpdf
+ \leavevmode
+ \getfilename{#4}%
+ {\indexnofonts
+ \turnoffactive
+ % See comments at \activebackslashdouble.
+ {\activebackslashdouble \xdef\pdfxrefdest{#1}%
+ \backslashparens\pdfxrefdest}%
+ %
+ \ifnum\filenamelength>0
+ \startlink attr{/Border [0 0 0]}%
+ goto file{\the\filename.pdf} name{\pdfxrefdest}%
+ \else
+ \startlink attr{/Border [0 0 0]}%
+ goto name{\pdfmkpgn{\pdfxrefdest}}%
+ \fi
+ }%
+ \setcolor{\linkcolor}%
+ \fi
+ %
+ % Float references are printed completely differently: "Figure 1.2"
+ % instead of "[somenode], p.3". We distinguish them by the
+ % LABEL-title being set to a magic string.
+ {%
+ % Have to otherify everything special to allow the \csname to
+ % include an _ in the xref name, etc.
+ \indexnofonts
+ \turnoffactive
+ \expandafter\global\expandafter\let\expandafter\Xthisreftitle
+ \csname XR#1-title\endcsname
+ }%
+ \iffloat\Xthisreftitle
+ % If the user specified the print name (third arg) to the ref,
+ % print it instead of our usual "Figure 1.2".
+ \ifdim\wd0 = 0pt
+ \refx{#1-snt}{}%
+ \else
+ \printedrefname
+ \fi
+ %
+ % if the user also gave the printed manual name (fifth arg), append
+ % "in MANUALNAME".
+ \ifdim \wd1 > 0pt
+ \space \putwordin{} \cite{\printedmanual}%
+ \fi
+ \else
+ % node/anchor (non-float) references.
+ %
+ % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+ % insert empty discretionaries after hyphens, which means that it will
+ % not find a line break at a hyphen in a node names. Since some manuals
+ % are best written with fairly long node names, containing hyphens, this
+ % is a loss. Therefore, we give the text of the node name again, so it
+ % is as if TeX is seeing it for the first time.
+ \ifdim \wd1 > 0pt
+ \putwordSection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}%
+ \else
+ % _ (for example) has to be the character _ for the purposes of the
+ % control sequence corresponding to the node, but it has to expand
+ % into the usual \leavevmode...\vrule stuff for purposes of
+ % printing. So we \turnoffactive for the \refx-snt, back on for the
+ % printing, back off for the \refx-pg.
+ {\turnoffactive
+ % Only output a following space if the -snt ref is nonempty; for
+ % @unnumbered and @anchor, it won't be.
+ \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+ \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+ }%
+ % output the `[mynode]' via a macro so it can be overridden.
+ \xrefprintnodename\printedrefname
+ %
+ % But we always want a comma and a space:
+ ,\space
+ %
+ % output the `page 3'.
+ \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+ \fi
+ \fi
+ \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output. It's a separate macro only so it can be changed more easily,
+% since square brackets don't work well in some documents. Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% Things referred to by \setref.
+%
+\def\Ynothing{}
+\def\Yomitfromtoc{}
+\def\Ynumbered{%
+ \ifnum\secno=0
+ \putwordChapter@tie \the\chapno
+ \else \ifnum\subsecno=0
+ \putwordSection@tie \the\chapno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+\def\Yappendix{%
+ \ifnum\secno=0
+ \putwordAppendix@tie @char\the\appendixno{}%
+ \else \ifnum\subsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno
+ \else \ifnum\subsubsecno=0
+ \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+ \else
+ \putwordSection@tie
+ @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+ \fi\fi\fi
+}
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+ {%
+ \indexnofonts
+ \otherbackslash
+ \expandafter\global\expandafter\let\expandafter\thisrefX
+ \csname XR#1\endcsname
+ }%
+ \ifx\thisrefX\relax
+ % If not defined, say something at least.
+ \angleleft un\-de\-fined\angleright
+ \iflinks
+ \ifhavexrefs
+ \message{\linenumber Undefined cross reference `#1'.}%
+ \else
+ \ifwarnedxrefs\else
+ \global\warnedxrefstrue
+ \message{Cross reference values unknown; you must run TeX again.}%
+ \fi
+ \fi
+ \fi
+ \else
+ % It's defined, so just use it.
+ \thisrefX
+ \fi
+ #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file. Usually it's
+% just a \def (we prepend XR to the control sequence name to avoid
+% collisions). But if this is a float type, we have more work to do.
+%
+\def\xrdef#1#2{%
+ {% The node name might contain 8-bit characters, which in our current
+ % implementation are changed to commands like @'e. Don't let these
+ % mess up the control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safexrefname{#1}%
+ }%
+ %
+ \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref
+ %
+ % Was that xref control sequence that we just defined for a float?
+ \expandafter\iffloat\csname XR\safexrefname\endcsname
+ % it was a float, and we have the (safe) float type in \iffloattype.
+ \expandafter\let\expandafter\floatlist
+ \csname floatlist\iffloattype\endcsname
+ %
+ % Is this the first time we've seen this float type?
+ \expandafter\ifx\floatlist\relax
+ \toks0 = {\do}% yes, so just \do
+ \else
+ % had it before, so preserve previous elements in list.
+ \toks0 = \expandafter{\floatlist\do}%
+ \fi
+ %
+ % Remember this xref in the control sequence \floatlistFLOATTYPE,
+ % for later use in \listoffloats.
+ \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0
+ {\safexrefname}}%
+ \fi
+}
+
+% Read the last existing aux file, if any. No error if none exists.
+%
+\def\tryauxfile{%
+ \openin 1 \jobname.aux
+ \ifeof 1 \else
+ \readdatafile{aux}%
+ \global\havexrefstrue
+ \fi
+ \closein 1
+}
+
+\def\setupdatafile{%
+ \catcode`\^^@=\other
+ \catcode`\^^A=\other
+ \catcode`\^^B=\other
+ \catcode`\^^C=\other
+ \catcode`\^^D=\other
+ \catcode`\^^E=\other
+ \catcode`\^^F=\other
+ \catcode`\^^G=\other
+ \catcode`\^^H=\other
+ \catcode`\^^K=\other
+ \catcode`\^^L=\other
+ \catcode`\^^N=\other
+ \catcode`\^^P=\other
+ \catcode`\^^Q=\other
+ \catcode`\^^R=\other
+ \catcode`\^^S=\other
+ \catcode`\^^T=\other
+ \catcode`\^^U=\other
+ \catcode`\^^V=\other
+ \catcode`\^^W=\other
+ \catcode`\^^X=\other
+ \catcode`\^^Z=\other
+ \catcode`\^^[=\other
+ \catcode`\^^\=\other
+ \catcode`\^^]=\other
+ \catcode`\^^^=\other
+ \catcode`\^^_=\other
+ % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+ % in xref tags, i.e., node names. But since ^^e4 notation isn't
+ % supported in the main text, it doesn't seem desirable. Furthermore,
+ % that is not enough: for node names that actually contain a ^
+ % character, we would end up writing a line like this: 'xrdef {'hat
+ % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+ % argument, and \hat is not an expandable control sequence. It could
+ % all be worked out, but why? Either we support ^^ or we don't.
+ %
+ % The other change necessary for this was to define \auxhat:
+ % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+ % and then to call \auxhat in \setq.
+ %
+ \catcode`\^=\other
+ %
+ % Special characters. Should be turned off anyway, but...
+ \catcode`\~=\other
+ \catcode`\[=\other
+ \catcode`\]=\other
+ \catcode`\"=\other
+ \catcode`\_=\other
+ \catcode`\|=\other
+ \catcode`\<=\other
+ \catcode`\>=\other
+ \catcode`\$=\other
+ \catcode`\#=\other
+ \catcode`\&=\other
+ \catcode`\%=\other
+ \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+ %
+ % This is to support \ in node names and titles, since the \
+ % characters end up in a \csname. It's easier than
+ % leaving it active and making its active definition an actual \
+ % character. What I don't understand is why it works in the *value*
+ % of the xrdef. Seems like it should be a catcode12 \, and that
+ % should not typeset properly. But it works, so I'm moving on for
+ % now. --karl, 15jan04.
+ \catcode`\\=\other
+ %
+ % Make the characters 128-255 be printing characters.
+ {%
+ \count1=128
+ \def\loop{%
+ \catcode\count1=\other
+ \advance\count1 by 1
+ \ifnum \count1<256 \loop \fi
+ }%
+ }%
+ %
+ % @ is our escape character in .aux files, and we need braces.
+ \catcode`\{=1
+ \catcode`\}=2
+ \catcode`\@=0
+}
+
+\def\readdatafile#1{%
+\begingroup
+ \setupdatafile
+ \input\jobname.#1
+\endgroup}
+
+
+\message{insertions,}
+% including footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+{\catcode `\@=11
+%
+% Auto-number footnotes. Otherwise like plain.
+\gdef\footnote{%
+ \let\indent=\ptexindent
+ \let\noindent=\ptexnoindent
+ \global\advance\footnoteno by \@ne
+ \edef\thisfootno{$^{\the\footnoteno}$}%
+ %
+ % In case the footnote comes at the end of a sentence, preserve the
+ % extra spacing after we do the footnote number.
+ \let\@sf\empty
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+ %
+ % Remove inadvertent blank space before typesetting the footnote number.
+ \unskip
+ \thisfootno\@sf
+ \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter. Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset (and anything else that uses
+% \parseargline) fails inside footnotes because the tokens are fixed when
+% the footnote is read. --karl, 16nov96.
+%
+\gdef\dofootnote{%
+ \insert\footins\bgroup
+ % We want to typeset this text as a normal paragraph, even if the
+ % footnote reference occurs in (for example) a display environment.
+ % So reset some parameters.
+ \hsize=\pagewidth
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox
+ \floatingpenalty\@MM
+ \leftskip\z@skip
+ \rightskip\z@skip
+ \spaceskip\z@skip
+ \xspaceskip\z@skip
+ \parindent\defaultparindent
+ %
+ \smallfonts \rm
+ %
+ % Because we use hanging indentation in footnotes, a @noindent appears
+ % to exdent this text, so make it be a no-op. makeinfo does not use
+ % hanging indentation so @noindent can still be needed within footnote
+ % text after an @example or the like (not that this is good style).
+ \let\noindent = \relax
+ %
+ % Hang the footnote text off the number. Use \everypar in case the
+ % footnote extends for more than one paragraph.
+ \everypar = {\hang}%
+ \textindent{\thisfootno}%
+ %
+ % Don't crash into the line above the footnote text. Since this
+ % expands into a box, it must come within the paragraph, lest it
+ % provide a place where TeX can split the footnote.
+ \footstrut
+ \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% In case a @footnote appears in a vbox, save the footnote text and create
+% the real \insert just after the vbox finished. Otherwise, the insertion
+% would be lost.
+% Similarily, if a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is finished.
+% And the same can be done for other insert classes. --kasal, 16nov03.
+
+% Replace the \insert primitive by a cheating macro.
+% Deeper inside, just make sure that the saved insertions are not spilled
+% out prematurely.
+%
+\def\startsavinginserts{%
+ \ifx \insert\ptexinsert
+ \let\insert\saveinsert
+ \else
+ \let\checkinserts\relax
+ \fi
+}
+
+% This \insert replacement works for both \insert\footins{foo} and
+% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}.
+%
+\def\saveinsert#1{%
+ \edef\next{\noexpand\savetobox \makeSAVEname#1}%
+ \afterassignment\next
+ % swallow the left brace
+ \let\temp =
+}
+\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}}
+\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1}
+
+\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi}
+
+\def\placesaveins#1{%
+ \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname
+ {\box#1}%
+}
+
+% eat @SAVE -- beware, all of them have catcode \other:
+{
+ \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-)
+ \gdef\gobblesave @SAVE{}
+}
+
+% initialization:
+\def\newsaveins #1{%
+ \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}%
+ \next
+}
+\def\newsaveinsX #1{%
+ \csname newbox\endcsname #1%
+ \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts
+ \checksaveins #1}%
+}
+
+% initialize:
+\let\checkinserts\empty
+\newsaveins\footins
+\newsaveins\margin
+
+
+% @image. We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front. If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+ % Do not bother showing banner with epsf.tex v2.7k (available in
+ % doc/epsf.tex and on ctan).
+ \def\epsfannounce{\toks0 = }%
+ \input epsf.tex
+\fi
+\closein 1
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+ work. It is also included in the Texinfo distribution, or you can get
+ it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+ \ifx\epsfbox\undefined
+ \ifwarnednoepsf \else
+ \errhelp = \noepsfhelp
+ \errmessage{epsf.tex not found, images will be ignored}%
+ \global\warnednoepsftrue
+ \fi
+ \else
+ \imagexxx #1,,,,,\finish
+ \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+ \catcode`\^^M = 5 % in case we're inside an example
+ \normalturnoffactive % allow _ et al. in names
+ % If the image is by itself, center it.
+ \ifvmode
+ \imagevmodetrue
+ \nobreak\bigskip
+ % Usually we'll have text after the image which will insert
+ % \parskip glue, so insert it here too to equalize the space
+ % above and below.
+ \nobreak\vskip\parskip
+ \nobreak
+ \line\bgroup
+ \fi
+ %
+ % Output the image.
+ \ifpdf
+ \dopdfimage{#1}{#2}{#3}%
+ \else
+ % \epsfbox itself resets \epsf?size at each figure.
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+ \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+ \epsfbox{#1.eps}%
+ \fi
+ %
+ \ifimagevmode \egroup \bigbreak \fi % space after the image
+\endgroup}
+
+
+% @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables,
+% etc. We don't actually implement floating yet, we always include the
+% float "here". But it seemed the best name for the future.
+%
+\envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish}
+
+% There may be a space before second and/or third parameter; delete it.
+\def\eatcommaspace#1, {#1,}
+
+% #1 is the optional FLOATTYPE, the text label for this float, typically
+% "Figure", "Table", "Example", etc. Can't contain commas. If omitted,
+% this float will not be numbered and cannot be referred to.
+%
+% #2 is the optional xref label. Also must be present for the float to
+% be referable.
+%
+% #3 is the optional positioning argument; for now, it is ignored. It
+% will somehow specify the positions allowed to float to (here, top, bottom).
+%
+% We keep a separate counter for each FLOATTYPE, which we reset at each
+% chapter-level command.
+\let\resetallfloatnos=\empty
+%
+\def\dofloat#1,#2,#3,#4\finish{%
+ \let\thiscaption=\empty
+ \let\thisshortcaption=\empty
+ %
+ % don't lose footnotes inside @float.
+ %
+ % BEWARE: when the floats start float, we have to issue warning whenever an
+ % insert appears inside a float which could possibly float. --kasal, 26may04
+ %
+ \startsavinginserts
+ %
+ % We can't be used inside a paragraph.
+ \par
+ %
+ \vtop\bgroup
+ \def\floattype{#1}%
+ \def\floatlabel{#2}%
+ \def\floatloc{#3}% we do nothing with this yet.
+ %
+ \ifx\floattype\empty
+ \let\safefloattype=\empty
+ \else
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ \fi
+ %
+ % If label is given but no type, we handle that as the empty type.
+ \ifx\floatlabel\empty \else
+ % We want each FLOATTYPE to be numbered separately (Figure 1,
+ % Table 1, Figure 2, ...). (And if no label, no number.)
+ %
+ \expandafter\getfloatno\csname\safefloattype floatno\endcsname
+ \global\advance\floatno by 1
+ %
+ {%
+ % This magic value for \lastsection is output by \setref as the
+ % XREFLABEL-title value. \xrefX uses it to distinguish float
+ % labels (which have a completely different output format) from
+ % node and anchor labels. And \xrdef uses it to construct the
+ % lists of floats.
+ %
+ \edef\lastsection{\floatmagic=\safefloattype}%
+ \setref{\floatlabel}{Yfloat}%
+ }%
+ \fi
+ %
+ % start with \parskip glue, I guess.
+ \vskip\parskip
+ %
+ % Don't suppress indentation if a float happens to start a section.
+ \restorefirstparagraphindent
+}
+
+% we have these possibilities:
+% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap
+% @float Foo,lbl & no caption: Foo 1.1
+% @float Foo & @caption{Cap}: Foo: Cap
+% @float Foo & no caption: Foo
+% @float ,lbl & Caption{Cap}: 1.1: Cap
+% @float ,lbl & no caption: 1.1
+% @float & @caption{Cap}: Cap
+% @float & no caption:
+%
+\def\Efloat{%
+ \let\floatident = \empty
+ %
+ % In all cases, if we have a float type, it comes first.
+ \ifx\floattype\empty \else \def\floatident{\floattype}\fi
+ %
+ % If we have an xref label, the number comes next.
+ \ifx\floatlabel\empty \else
+ \ifx\floattype\empty \else % if also had float type, need tie first.
+ \appendtomacro\floatident{\tie}%
+ \fi
+ % the number.
+ \appendtomacro\floatident{\chaplevelprefix\the\floatno}%
+ \fi
+ %
+ % Start the printed caption with what we've constructed in
+ % \floatident, but keep it separate; we need \floatident again.
+ \let\captionline = \floatident
+ %
+ \ifx\thiscaption\empty \else
+ \ifx\floatident\empty \else
+ \appendtomacro\captionline{: }% had ident, so need a colon between
+ \fi
+ %
+ % caption text.
+ \appendtomacro\captionline{\scanexp\thiscaption}%
+ \fi
+ %
+ % If we have anything to print, print it, with space before.
+ % Eventually this needs to become an \insert.
+ \ifx\captionline\empty \else
+ \vskip.5\parskip
+ \captionline
+ %
+ % Space below caption.
+ \vskip\parskip
+ \fi
+ %
+ % If have an xref label, write the list of floats info. Do this
+ % after the caption, to avoid chance of it being a breakpoint.
+ \ifx\floatlabel\empty \else
+ % Write the text that goes in the lof to the aux file as
+ % \floatlabel-lof. Besides \floatident, we include the short
+ % caption if specified, else the full caption if specified, else nothing.
+ {%
+ \atdummies
+ %
+ % since we read the caption text in the macro world, where ^^M
+ % is turned into a normal character, we have to scan it back, so
+ % we don't write the literal three characters "^^M" into the aux file.
+ \scanexp{%
+ \xdef\noexpand\gtemp{%
+ \ifx\thisshortcaption\empty
+ \thiscaption
+ \else
+ \thisshortcaption
+ \fi
+ }%
+ }%
+ \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident
+ \ifx\gtemp\empty \else : \gtemp \fi}}%
+ }%
+ \fi
+ \egroup % end of \vtop
+ %
+ % place the captured inserts
+ %
+ % BEWARE: when the floats start floating, we have to issue warning
+ % whenever an insert appears inside a float which could possibly
+ % float. --kasal, 26may04
+ %
+ \checkinserts
+}
+
+% Append the tokens #2 to the definition of macro #1, not expanding either.
+%
+\def\appendtomacro#1#2{%
+ \expandafter\def\expandafter#1\expandafter{#1#2}%
+}
+
+% @caption, @shortcaption
+%
+\def\caption{\docaption\thiscaption}
+\def\shortcaption{\docaption\thisshortcaption}
+\def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption}
+\def\defcaption#1#2{\egroup \def#1{#2}}
+
+% The parameter is the control sequence identifying the counter we are
+% going to use. Create it if it doesn't exist and assign it to \floatno.
+\def\getfloatno#1{%
+ \ifx#1\relax
+ % Haven't seen this figure type before.
+ \csname newcount\endcsname #1%
+ %
+ % Remember to reset this floatno at the next chap.
+ \expandafter\gdef\expandafter\resetallfloatnos
+ \expandafter{\resetallfloatnos #1=0 }%
+ \fi
+ \let\floatno#1%
+}
+
+% \setref calls this to get the XREFLABEL-snt value. We want an @xref
+% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we
+% first read the @float command.
+%
+\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}%
+
+% Magic string used for the XREFLABEL-title value, so \xrefX can
+% distinguish floats from other xref types.
+\def\floatmagic{!!float!!}
+
+% #1 is the control sequence we are passed; we expand into a conditional
+% which is true if #1 represents a float ref. That is, the magic
+% \lastsection value which we \setref above.
+%
+\def\iffloat#1{\expandafter\doiffloat#1==\finish}
+%
+% #1 is (maybe) the \floatmagic string. If so, #2 will be the
+% (safe) float type for this float. We set \iffloattype to #2.
+%
+\def\doiffloat#1=#2=#3\finish{%
+ \def\temp{#1}%
+ \def\iffloattype{#2}%
+ \ifx\temp\floatmagic
+}
+
+% @listoffloats FLOATTYPE - print a list of floats like a table of contents.
+%
+\parseargdef\listoffloats{%
+ \def\floattype{#1}% floattype
+ {%
+ % the floattype might have accents or other special characters,
+ % but we need to use it in a control sequence name.
+ \indexnofonts
+ \turnoffactive
+ \xdef\safefloattype{\floattype}%
+ }%
+ %
+ % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE.
+ \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax
+ \ifhavexrefs
+ % if the user said @listoffloats foo but never @float foo.
+ \message{\linenumber No `\safefloattype' floats to list.}%
+ \fi
+ \else
+ \begingroup
+ \leftskip=\tocindent % indent these entries like a toc
+ \let\do=\listoffloatsdo
+ \csname floatlist\safefloattype\endcsname
+ \endgroup
+ \fi
+}
+
+% This is called on each entry in a list of floats. We're passed the
+% xref label, in the form LABEL-title, which is how we save it in the
+% aux file. We strip off the -title and look up \XRLABEL-lof, which
+% has the text we're supposed to typeset here.
+%
+% Figures without xref labels will not be included in the list (since
+% they won't appear in the aux file).
+%
+\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish}
+\def\listoffloatsdoentry#1-title\finish{{%
+ % Can't fully expand XR#1-lof because it can contain anything. Just
+ % pass the control sequence. On the other hand, XR#1-pg is just the
+ % page number, and we want to fully expand that so we can get a link
+ % in pdf output.
+ \toksA = \expandafter{\csname XR#1-lof\endcsname}%
+ %
+ % use the same \entry macro we use to generate the TOC and index.
+ \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}%
+ \writeentry
+}}
+
+
+\message{localization,}
+
+% @documentlanguage is usually given very early, just after
+% @setfilename. If done too late, it may not override everything
+% properly. Single argument is the language (de) or locale (de_DE)
+% abbreviation. It would be nice if we could set up a hyphenation file.
+%
+{
+ \catcode`\_ = \active
+ \globaldefs=1
+\parseargdef\documentlanguage{\begingroup
+ \let_=\normalunderscore % normal _ character for filenames
+ \tex % read txi-??.tex file in plain TeX.
+ % Read the file by the name they passed if it exists.
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \documentlanguagetrywithoutunderscore{#1_\finish}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+ \endgroup
+\endgroup}
+}
+%
+% If they passed de_DE, and txi-de_DE.tex doesn't exist,
+% try txi-de.tex.
+%
+\def\documentlanguagetrywithoutunderscore#1_#2\finish{%
+ \openin 1 txi-#1.tex
+ \ifeof 1
+ \errhelp = \nolanghelp
+ \errmessage{Cannot read language file txi-#1.tex}%
+ \else
+ \input txi-#1.tex
+ \fi
+ \closein 1
+}
+%
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty. Maybe you need to install it? In the current directory
+should work if nowhere else does.}
+
+% Set the catcode of characters 128 through 255 to the specified number.
+%
+\def\setnonasciicharscatcode#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \global\catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+\def\setnonasciicharscatcodenonglobal#1{%
+ \count255=128
+ \loop\ifnum\count255<256
+ \catcode\count255=#1\relax
+ \advance\count255 by 1
+ \repeat
+}
+
+% @documentencoding sets the definition of non-ASCII characters
+% according to the specified encoding.
+%
+\parseargdef\documentencoding{%
+ % Encoding being declared for the document.
+ \def\declaredencoding{\csname #1.enc\endcsname}%
+ %
+ % Supported encodings: names converted to tokens in order to be able
+ % to compare them with \ifx.
+ \def\ascii{\csname US-ASCII.enc\endcsname}%
+ \def\latnine{\csname ISO-8859-15.enc\endcsname}%
+ \def\latone{\csname ISO-8859-1.enc\endcsname}%
+ \def\lattwo{\csname ISO-8859-2.enc\endcsname}%
+ \def\utfeight{\csname UTF-8.enc\endcsname}%
+ %
+ \ifx \declaredencoding \ascii
+ \asciichardefs
+ %
+ \else \ifx \declaredencoding \lattwo
+ \setnonasciicharscatcode\active
+ \lattwochardefs
+ %
+ \else \ifx \declaredencoding \latone
+ \setnonasciicharscatcode\active
+ \latonechardefs
+ %
+ \else \ifx \declaredencoding \latnine
+ \setnonasciicharscatcode\active
+ \latninechardefs
+ %
+ \else \ifx \declaredencoding \utfeight
+ \setnonasciicharscatcode\active
+ \utfeightchardefs
+ %
+ \else
+ \message{Unknown document encoding #1, ignoring.}%
+ %
+ \fi % utfeight
+ \fi % latnine
+ \fi % latone
+ \fi % lattwo
+ \fi % ascii
+}
+
+% A message to be logged when using a character that isn't available
+% the default font encoding (OT1).
+%
+\def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}}
+
+% Take account of \c (plain) vs. \, (Texinfo) difference.
+\def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi}
+
+% First, make active non-ASCII characters in order for them to be
+% correctly categorized when TeX reads the replacement text of
+% macros containing the character definitions.
+\setnonasciicharscatcode\active
+%
+% Latin1 (ISO-8859-1) character definitions.
+\def\latonechardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\exclamdown}
+ \gdef^^a2{\missingcharmsg{CENT SIGN}}
+ \gdef^^a3{{\pounds}}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\missingcharmsg{YEN SIGN}}
+ \gdef^^a6{\missingcharmsg{BROKEN BAR}}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\copyright}
+ \gdef^^aa{\ordf}
+ \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+ \gdef^^ac{$\lnot$}
+ \gdef^^ad{\-}
+ \gdef^^ae{\registeredsymbol}
+ \gdef^^af{\={}}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{$\pm$}
+ \gdef^^b2{$^2$}
+ \gdef^^b3{$^3$}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{$\mu$}
+ \gdef^^b6{\P}
+ %
+ \gdef^^b7{$^.$}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{$^1$}
+ \gdef^^ba{\ordm}
+ %
+ \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+ \gdef^^bc{$1\over4$}
+ \gdef^^bd{$1\over2$}
+ \gdef^^be{$3\over4$}
+ \gdef^^bf{\questiondown}
+ %
+ \gdef^^c0{\`A}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\~A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\ringaccent A}
+ \gdef^^c6{\AE}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\`E}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\^E}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\`I}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\"I}
+ %
+ \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}}
+ \gdef^^d1{\~N}
+ \gdef^^d2{\`O}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\~O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\O}
+ \gdef^^d9{\`U}
+ \gdef^^da{\'U}
+ \gdef^^db{\^U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\`a}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\~a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\ringaccent a}
+ \gdef^^e6{\ae}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\`e}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\^e}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\`{\dotless i}}
+ \gdef^^ed{\'{\dotless i}}
+ \gdef^^ee{\^{\dotless i}}
+ \gdef^^ef{\"{\dotless i}}
+ %
+ \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}}
+ \gdef^^f1{\~n}
+ \gdef^^f2{\`o}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\~o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\o}
+ \gdef^^f9{\`u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\^u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}}
+ \gdef^^ff{\"y}
+}
+
+% Latin9 (ISO-8859-15) encoding character definitions.
+\def\latninechardefs{%
+ % Encoding is almost identical to Latin1.
+ \latonechardefs
+ %
+ \gdef^^a4{\euro}
+ \gdef^^a6{\v S}
+ \gdef^^a8{\v s}
+ \gdef^^b4{\v Z}
+ \gdef^^b8{\v z}
+ \gdef^^bc{\OE}
+ \gdef^^bd{\oe}
+ \gdef^^be{\"Y}
+}
+
+% Latin2 (ISO-8859-2) character definitions.
+\def\lattwochardefs{%
+ \gdef^^a0{~}
+ \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}}
+ \gdef^^a2{\u{}}
+ \gdef^^a3{\L}
+ \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
+ \gdef^^a5{\v L}
+ \gdef^^a6{\'S}
+ \gdef^^a7{\S}
+ \gdef^^a8{\"{}}
+ \gdef^^a9{\v S}
+ \gdef^^aa{\cedilla S}
+ \gdef^^ab{\v T}
+ \gdef^^ac{\'Z}
+ \gdef^^ad{\-}
+ \gdef^^ae{\v Z}
+ \gdef^^af{\dotaccent Z}
+ %
+ \gdef^^b0{\textdegree}
+ \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}}
+ \gdef^^b2{\missingcharmsg{OGONEK}}
+ \gdef^^b3{\l}
+ \gdef^^b4{\'{}}
+ \gdef^^b5{\v l}
+ \gdef^^b6{\'s}
+ \gdef^^b7{\v{}}
+ \gdef^^b8{\cedilla\ }
+ \gdef^^b9{\v s}
+ \gdef^^ba{\cedilla s}
+ \gdef^^bb{\v t}
+ \gdef^^bc{\'z}
+ \gdef^^bd{\H{}}
+ \gdef^^be{\v z}
+ \gdef^^bf{\dotaccent z}
+ %
+ \gdef^^c0{\'R}
+ \gdef^^c1{\'A}
+ \gdef^^c2{\^A}
+ \gdef^^c3{\u A}
+ \gdef^^c4{\"A}
+ \gdef^^c5{\'L}
+ \gdef^^c6{\'C}
+ \gdef^^c7{\cedilla C}
+ \gdef^^c8{\v C}
+ \gdef^^c9{\'E}
+ \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}}
+ \gdef^^cb{\"E}
+ \gdef^^cc{\v E}
+ \gdef^^cd{\'I}
+ \gdef^^ce{\^I}
+ \gdef^^cf{\v D}
+ %
+ \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER D WITH STROKE}}
+ \gdef^^d1{\'N}
+ \gdef^^d2{\v N}
+ \gdef^^d3{\'O}
+ \gdef^^d4{\^O}
+ \gdef^^d5{\H O}
+ \gdef^^d6{\"O}
+ \gdef^^d7{$\times$}
+ \gdef^^d8{\v R}
+ \gdef^^d9{\ringaccent U}
+ \gdef^^da{\'U}
+ \gdef^^db{\H U}
+ \gdef^^dc{\"U}
+ \gdef^^dd{\'Y}
+ \gdef^^de{\cedilla T}
+ \gdef^^df{\ss}
+ %
+ \gdef^^e0{\'r}
+ \gdef^^e1{\'a}
+ \gdef^^e2{\^a}
+ \gdef^^e3{\u a}
+ \gdef^^e4{\"a}
+ \gdef^^e5{\'l}
+ \gdef^^e6{\'c}
+ \gdef^^e7{\cedilla c}
+ \gdef^^e8{\v c}
+ \gdef^^e9{\'e}
+ \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}}
+ \gdef^^eb{\"e}
+ \gdef^^ec{\v e}
+ \gdef^^ed{\'\i}
+ \gdef^^ee{\^\i}
+ \gdef^^ef{\v d}
+ %
+ \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER D WITH STROKE}}
+ \gdef^^f1{\'n}
+ \gdef^^f2{\v n}
+ \gdef^^f3{\'o}
+ \gdef^^f4{\^o}
+ \gdef^^f5{\H o}
+ \gdef^^f6{\"o}
+ \gdef^^f7{$\div$}
+ \gdef^^f8{\v r}
+ \gdef^^f9{\ringaccent u}
+ \gdef^^fa{\'u}
+ \gdef^^fb{\H u}
+ \gdef^^fc{\"u}
+ \gdef^^fd{\'y}
+ \gdef^^fe{\cedilla t}
+ \gdef^^ff{\dotaccent{}}
+}
+
+% UTF-8 character definitions.
+%
+% This code to support UTF-8 is based on LaTeX's utf8.def, with some
+% changes for Texinfo conventions. It is included here under the GPL by
+% permission from Frank Mittelbach and the LaTeX team.
+%
+\newcount\countUTFx
+\newcount\countUTFy
+\newcount\countUTFz
+
+\gdef\UTFviiiTwoOctets#1#2{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\endcsname}
+%
+\gdef\UTFviiiThreeOctets#1#2#3{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname}
+%
+\gdef\UTFviiiFourOctets#1#2#3#4{\expandafter
+ \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname}
+
+\gdef\UTFviiiDefined#1{%
+ \ifx #1\relax
+ \message{\linenumber Unicode char \string #1 not defined for Texinfo}%
+ \else
+ \expandafter #1%
+ \fi
+}
+
+\begingroup
+ \catcode`\~13
+ \catcode`\"12
+
+ \def\UTFviiiLoop{%
+ \global\catcode\countUTFx\active
+ \uccode`\~\countUTFx
+ \uppercase\expandafter{\UTFviiiTmp}%
+ \advance\countUTFx by 1
+ \ifnum\countUTFx < \countUTFy
+ \expandafter\UTFviiiLoop
+ \fi}
+
+ \countUTFx = "C2
+ \countUTFy = "E0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiTwoOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "E0
+ \countUTFy = "F0
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiThreeOctets\string~}}
+ \UTFviiiLoop
+
+ \countUTFx = "F0
+ \countUTFy = "F4
+ \def\UTFviiiTmp{%
+ \xdef~{\noexpand\UTFviiiFourOctets\string~}}
+ \UTFviiiLoop
+\endgroup
+
+\begingroup
+ \catcode`\"=12
+ \catcode`\<=12
+ \catcode`\.=12
+ \catcode`\,=12
+ \catcode`\;=12
+ \catcode`\!=12
+ \catcode`\~=13
+
+ \gdef\DeclareUnicodeCharacter#1#2{%
+ \countUTFz = "#1\relax
+ \wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}%
+ \begingroup
+ \parseXMLCharref
+ \def\UTFviiiTwoOctets##1##2{%
+ \csname u8:##1\string ##2\endcsname}%
+ \def\UTFviiiThreeOctets##1##2##3{%
+ \csname u8:##1\string ##2\string ##3\endcsname}%
+ \def\UTFviiiFourOctets##1##2##3##4{%
+ \csname u8:##1\string ##2\string ##3\string ##4\endcsname}%
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter
+ \gdef\UTFviiiTmp{#2}%
+ \endgroup}
+
+ \gdef\parseXMLCharref{%
+ \ifnum\countUTFz < "A0\relax
+ \errhelp = \EMsimple
+ \errmessage{Cannot define Unicode char value < 00A0}%
+ \else\ifnum\countUTFz < "800\relax
+ \parseUTFviiiA,%
+ \parseUTFviiiB C\UTFviiiTwoOctets.,%
+ \else\ifnum\countUTFz < "10000\relax
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiB E\UTFviiiThreeOctets.{,;}%
+ \else
+ \parseUTFviiiA;%
+ \parseUTFviiiA,%
+ \parseUTFviiiA!%
+ \parseUTFviiiB F\UTFviiiFourOctets.{!,;}%
+ \fi\fi\fi
+ }
+
+ \gdef\parseUTFviiiA#1{%
+ \countUTFx = \countUTFz
+ \divide\countUTFz by 64
+ \countUTFy = \countUTFz
+ \multiply\countUTFz by 64
+ \advance\countUTFx by -\countUTFz
+ \advance\countUTFx by 128
+ \uccode `#1\countUTFx
+ \countUTFz = \countUTFy}
+
+ \gdef\parseUTFviiiB#1#2#3#4{%
+ \advance\countUTFz by "#10\relax
+ \uccode `#3\countUTFz
+ \uppercase{\gdef\UTFviiiTmp{#2#3#4}}}
+\endgroup
+
+\def\utfeightchardefs{%
+ \DeclareUnicodeCharacter{00A0}{\tie}
+ \DeclareUnicodeCharacter{00A1}{\exclamdown}
+ \DeclareUnicodeCharacter{00A3}{\pounds}
+ \DeclareUnicodeCharacter{00A8}{\"{ }}
+ \DeclareUnicodeCharacter{00A9}{\copyright}
+ \DeclareUnicodeCharacter{00AA}{\ordf}
+ \DeclareUnicodeCharacter{00AB}{\guillemetleft}
+ \DeclareUnicodeCharacter{00AD}{\-}
+ \DeclareUnicodeCharacter{00AE}{\registeredsymbol}
+ \DeclareUnicodeCharacter{00AF}{\={ }}
+
+ \DeclareUnicodeCharacter{00B0}{\ringaccent{ }}
+ \DeclareUnicodeCharacter{00B4}{\'{ }}
+ \DeclareUnicodeCharacter{00B8}{\cedilla{ }}
+ \DeclareUnicodeCharacter{00BA}{\ordm}
+ \DeclareUnicodeCharacter{00BB}{\guillemetright}
+ \DeclareUnicodeCharacter{00BF}{\questiondown}
+
+ \DeclareUnicodeCharacter{00C0}{\`A}
+ \DeclareUnicodeCharacter{00C1}{\'A}
+ \DeclareUnicodeCharacter{00C2}{\^A}
+ \DeclareUnicodeCharacter{00C3}{\~A}
+ \DeclareUnicodeCharacter{00C4}{\"A}
+ \DeclareUnicodeCharacter{00C5}{\AA}
+ \DeclareUnicodeCharacter{00C6}{\AE}
+ \DeclareUnicodeCharacter{00C7}{\cedilla{C}}
+ \DeclareUnicodeCharacter{00C8}{\`E}
+ \DeclareUnicodeCharacter{00C9}{\'E}
+ \DeclareUnicodeCharacter{00CA}{\^E}
+ \DeclareUnicodeCharacter{00CB}{\"E}
+ \DeclareUnicodeCharacter{00CC}{\`I}
+ \DeclareUnicodeCharacter{00CD}{\'I}
+ \DeclareUnicodeCharacter{00CE}{\^I}
+ \DeclareUnicodeCharacter{00CF}{\"I}
+
+ \DeclareUnicodeCharacter{00D1}{\~N}
+ \DeclareUnicodeCharacter{00D2}{\`O}
+ \DeclareUnicodeCharacter{00D3}{\'O}
+ \DeclareUnicodeCharacter{00D4}{\^O}
+ \DeclareUnicodeCharacter{00D5}{\~O}
+ \DeclareUnicodeCharacter{00D6}{\"O}
+ \DeclareUnicodeCharacter{00D8}{\O}
+ \DeclareUnicodeCharacter{00D9}{\`U}
+ \DeclareUnicodeCharacter{00DA}{\'U}
+ \DeclareUnicodeCharacter{00DB}{\^U}
+ \DeclareUnicodeCharacter{00DC}{\"U}
+ \DeclareUnicodeCharacter{00DD}{\'Y}
+ \DeclareUnicodeCharacter{00DF}{\ss}
+
+ \DeclareUnicodeCharacter{00E0}{\`a}
+ \DeclareUnicodeCharacter{00E1}{\'a}
+ \DeclareUnicodeCharacter{00E2}{\^a}
+ \DeclareUnicodeCharacter{00E3}{\~a}
+ \DeclareUnicodeCharacter{00E4}{\"a}
+ \DeclareUnicodeCharacter{00E5}{\aa}
+ \DeclareUnicodeCharacter{00E6}{\ae}
+ \DeclareUnicodeCharacter{00E7}{\cedilla{c}}
+ \DeclareUnicodeCharacter{00E8}{\`e}
+ \DeclareUnicodeCharacter{00E9}{\'e}
+ \DeclareUnicodeCharacter{00EA}{\^e}
+ \DeclareUnicodeCharacter{00EB}{\"e}
+ \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}
+ \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
+ \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{00F1}{\~n}
+ \DeclareUnicodeCharacter{00F2}{\`o}
+ \DeclareUnicodeCharacter{00F3}{\'o}
+ \DeclareUnicodeCharacter{00F4}{\^o}
+ \DeclareUnicodeCharacter{00F5}{\~o}
+ \DeclareUnicodeCharacter{00F6}{\"o}
+ \DeclareUnicodeCharacter{00F8}{\o}
+ \DeclareUnicodeCharacter{00F9}{\`u}
+ \DeclareUnicodeCharacter{00FA}{\'u}
+ \DeclareUnicodeCharacter{00FB}{\^u}
+ \DeclareUnicodeCharacter{00FC}{\"u}
+ \DeclareUnicodeCharacter{00FD}{\'y}
+ \DeclareUnicodeCharacter{00FF}{\"y}
+
+ \DeclareUnicodeCharacter{0100}{\=A}
+ \DeclareUnicodeCharacter{0101}{\=a}
+ \DeclareUnicodeCharacter{0102}{\u{A}}
+ \DeclareUnicodeCharacter{0103}{\u{a}}
+ \DeclareUnicodeCharacter{0106}{\'C}
+ \DeclareUnicodeCharacter{0107}{\'c}
+ \DeclareUnicodeCharacter{0108}{\^C}
+ \DeclareUnicodeCharacter{0109}{\^c}
+ \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
+ \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
+ \DeclareUnicodeCharacter{010C}{\v{C}}
+ \DeclareUnicodeCharacter{010D}{\v{c}}
+ \DeclareUnicodeCharacter{010E}{\v{D}}
+
+ \DeclareUnicodeCharacter{0112}{\=E}
+ \DeclareUnicodeCharacter{0113}{\=e}
+ \DeclareUnicodeCharacter{0114}{\u{E}}
+ \DeclareUnicodeCharacter{0115}{\u{e}}
+ \DeclareUnicodeCharacter{0116}{\dotaccent{E}}
+ \DeclareUnicodeCharacter{0117}{\dotaccent{e}}
+ \DeclareUnicodeCharacter{011A}{\v{E}}
+ \DeclareUnicodeCharacter{011B}{\v{e}}
+ \DeclareUnicodeCharacter{011C}{\^G}
+ \DeclareUnicodeCharacter{011D}{\^g}
+ \DeclareUnicodeCharacter{011E}{\u{G}}
+ \DeclareUnicodeCharacter{011F}{\u{g}}
+
+ \DeclareUnicodeCharacter{0120}{\dotaccent{G}}
+ \DeclareUnicodeCharacter{0121}{\dotaccent{g}}
+ \DeclareUnicodeCharacter{0124}{\^H}
+ \DeclareUnicodeCharacter{0125}{\^h}
+ \DeclareUnicodeCharacter{0128}{\~I}
+ \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}
+ \DeclareUnicodeCharacter{012A}{\=I}
+ \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}
+ \DeclareUnicodeCharacter{012C}{\u{I}}
+ \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}
+
+ \DeclareUnicodeCharacter{0130}{\dotaccent{I}}
+ \DeclareUnicodeCharacter{0131}{\dotless{i}}
+ \DeclareUnicodeCharacter{0132}{IJ}
+ \DeclareUnicodeCharacter{0133}{ij}
+ \DeclareUnicodeCharacter{0134}{\^J}
+ \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}
+ \DeclareUnicodeCharacter{0139}{\'L}
+ \DeclareUnicodeCharacter{013A}{\'l}
+
+ \DeclareUnicodeCharacter{0141}{\L}
+ \DeclareUnicodeCharacter{0142}{\l}
+ \DeclareUnicodeCharacter{0143}{\'N}
+ \DeclareUnicodeCharacter{0144}{\'n}
+ \DeclareUnicodeCharacter{0147}{\v{N}}
+ \DeclareUnicodeCharacter{0148}{\v{n}}
+ \DeclareUnicodeCharacter{014C}{\=O}
+ \DeclareUnicodeCharacter{014D}{\=o}
+ \DeclareUnicodeCharacter{014E}{\u{O}}
+ \DeclareUnicodeCharacter{014F}{\u{o}}
+
+ \DeclareUnicodeCharacter{0150}{\H{O}}
+ \DeclareUnicodeCharacter{0151}{\H{o}}
+ \DeclareUnicodeCharacter{0152}{\OE}
+ \DeclareUnicodeCharacter{0153}{\oe}
+ \DeclareUnicodeCharacter{0154}{\'R}
+ \DeclareUnicodeCharacter{0155}{\'r}
+ \DeclareUnicodeCharacter{0158}{\v{R}}
+ \DeclareUnicodeCharacter{0159}{\v{r}}
+ \DeclareUnicodeCharacter{015A}{\'S}
+ \DeclareUnicodeCharacter{015B}{\'s}
+ \DeclareUnicodeCharacter{015C}{\^S}
+ \DeclareUnicodeCharacter{015D}{\^s}
+ \DeclareUnicodeCharacter{015E}{\cedilla{S}}
+ \DeclareUnicodeCharacter{015F}{\cedilla{s}}
+
+ \DeclareUnicodeCharacter{0160}{\v{S}}
+ \DeclareUnicodeCharacter{0161}{\v{s}}
+ \DeclareUnicodeCharacter{0162}{\cedilla{t}}
+ \DeclareUnicodeCharacter{0163}{\cedilla{T}}
+ \DeclareUnicodeCharacter{0164}{\v{T}}
+
+ \DeclareUnicodeCharacter{0168}{\~U}
+ \DeclareUnicodeCharacter{0169}{\~u}
+ \DeclareUnicodeCharacter{016A}{\=U}
+ \DeclareUnicodeCharacter{016B}{\=u}
+ \DeclareUnicodeCharacter{016C}{\u{U}}
+ \DeclareUnicodeCharacter{016D}{\u{u}}
+ \DeclareUnicodeCharacter{016E}{\ringaccent{U}}
+ \DeclareUnicodeCharacter{016F}{\ringaccent{u}}
+
+ \DeclareUnicodeCharacter{0170}{\H{U}}
+ \DeclareUnicodeCharacter{0171}{\H{u}}
+ \DeclareUnicodeCharacter{0174}{\^W}
+ \DeclareUnicodeCharacter{0175}{\^w}
+ \DeclareUnicodeCharacter{0176}{\^Y}
+ \DeclareUnicodeCharacter{0177}{\^y}
+ \DeclareUnicodeCharacter{0178}{\"Y}
+ \DeclareUnicodeCharacter{0179}{\'Z}
+ \DeclareUnicodeCharacter{017A}{\'z}
+ \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}
+ \DeclareUnicodeCharacter{017C}{\dotaccent{z}}
+ \DeclareUnicodeCharacter{017D}{\v{Z}}
+ \DeclareUnicodeCharacter{017E}{\v{z}}
+
+ \DeclareUnicodeCharacter{01C4}{D\v{Z}}
+ \DeclareUnicodeCharacter{01C5}{D\v{z}}
+ \DeclareUnicodeCharacter{01C6}{d\v{z}}
+ \DeclareUnicodeCharacter{01C7}{LJ}
+ \DeclareUnicodeCharacter{01C8}{Lj}
+ \DeclareUnicodeCharacter{01C9}{lj}
+ \DeclareUnicodeCharacter{01CA}{NJ}
+ \DeclareUnicodeCharacter{01CB}{Nj}
+ \DeclareUnicodeCharacter{01CC}{nj}
+ \DeclareUnicodeCharacter{01CD}{\v{A}}
+ \DeclareUnicodeCharacter{01CE}{\v{a}}
+ \DeclareUnicodeCharacter{01CF}{\v{I}}
+
+ \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}
+ \DeclareUnicodeCharacter{01D1}{\v{O}}
+ \DeclareUnicodeCharacter{01D2}{\v{o}}
+ \DeclareUnicodeCharacter{01D3}{\v{U}}
+ \DeclareUnicodeCharacter{01D4}{\v{u}}
+
+ \DeclareUnicodeCharacter{01E2}{\={\AE}}
+ \DeclareUnicodeCharacter{01E3}{\={\ae}}
+ \DeclareUnicodeCharacter{01E6}{\v{G}}
+ \DeclareUnicodeCharacter{01E7}{\v{g}}
+ \DeclareUnicodeCharacter{01E8}{\v{K}}
+ \DeclareUnicodeCharacter{01E9}{\v{k}}
+
+ \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}
+ \DeclareUnicodeCharacter{01F1}{DZ}
+ \DeclareUnicodeCharacter{01F2}{Dz}
+ \DeclareUnicodeCharacter{01F3}{dz}
+ \DeclareUnicodeCharacter{01F4}{\'G}
+ \DeclareUnicodeCharacter{01F5}{\'g}
+ \DeclareUnicodeCharacter{01F8}{\`N}
+ \DeclareUnicodeCharacter{01F9}{\`n}
+ \DeclareUnicodeCharacter{01FC}{\'{\AE}}
+ \DeclareUnicodeCharacter{01FD}{\'{\ae}}
+ \DeclareUnicodeCharacter{01FE}{\'{\O}}
+ \DeclareUnicodeCharacter{01FF}{\'{\o}}
+
+ \DeclareUnicodeCharacter{021E}{\v{H}}
+ \DeclareUnicodeCharacter{021F}{\v{h}}
+
+ \DeclareUnicodeCharacter{0226}{\dotaccent{A}}
+ \DeclareUnicodeCharacter{0227}{\dotaccent{a}}
+ \DeclareUnicodeCharacter{0228}{\cedilla{E}}
+ \DeclareUnicodeCharacter{0229}{\cedilla{e}}
+ \DeclareUnicodeCharacter{022E}{\dotaccent{O}}
+ \DeclareUnicodeCharacter{022F}{\dotaccent{o}}
+
+ \DeclareUnicodeCharacter{0232}{\=Y}
+ \DeclareUnicodeCharacter{0233}{\=y}
+ \DeclareUnicodeCharacter{0237}{\dotless{j}}
+
+ \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
+ \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
+ \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
+ \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}
+ \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}
+ \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}
+ \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}
+ \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}
+ \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}
+ \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}
+ \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}
+ \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}
+
+ \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}
+ \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}
+
+ \DeclareUnicodeCharacter{1E20}{\=G}
+ \DeclareUnicodeCharacter{1E21}{\=g}
+ \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}
+ \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}
+ \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}
+ \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}
+ \DeclareUnicodeCharacter{1E26}{\"H}
+ \DeclareUnicodeCharacter{1E27}{\"h}
+
+ \DeclareUnicodeCharacter{1E30}{\'K}
+ \DeclareUnicodeCharacter{1E31}{\'k}
+ \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}
+ \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}
+ \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}
+ \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}
+ \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}
+ \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}
+ \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}
+ \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}
+ \DeclareUnicodeCharacter{1E3E}{\'M}
+ \DeclareUnicodeCharacter{1E3F}{\'m}
+
+ \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}
+ \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}
+ \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}
+ \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}
+ \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}
+ \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}
+ \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}
+ \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}
+ \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}
+ \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}
+
+ \DeclareUnicodeCharacter{1E54}{\'P}
+ \DeclareUnicodeCharacter{1E55}{\'p}
+ \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}
+ \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}
+ \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}
+ \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}
+ \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}
+ \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}
+ \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}
+ \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}
+
+ \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}
+ \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}
+ \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}
+ \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}
+ \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}
+ \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}
+ \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}
+ \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}
+ \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}
+ \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}
+
+ \DeclareUnicodeCharacter{1E7C}{\~V}
+ \DeclareUnicodeCharacter{1E7D}{\~v}
+ \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}
+ \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}
+
+ \DeclareUnicodeCharacter{1E80}{\`W}
+ \DeclareUnicodeCharacter{1E81}{\`w}
+ \DeclareUnicodeCharacter{1E82}{\'W}
+ \DeclareUnicodeCharacter{1E83}{\'w}
+ \DeclareUnicodeCharacter{1E84}{\"W}
+ \DeclareUnicodeCharacter{1E85}{\"w}
+ \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}
+ \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}
+ \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}
+ \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}
+ \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}
+ \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}
+ \DeclareUnicodeCharacter{1E8C}{\"X}
+ \DeclareUnicodeCharacter{1E8D}{\"x}
+ \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}
+ \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}
+
+ \DeclareUnicodeCharacter{1E90}{\^Z}
+ \DeclareUnicodeCharacter{1E91}{\^z}
+ \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}
+ \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}
+ \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}
+ \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}
+ \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}
+ \DeclareUnicodeCharacter{1E97}{\"t}
+ \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}
+ \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}
+
+ \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}
+ \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}
+
+ \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}
+ \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}
+ \DeclareUnicodeCharacter{1EBC}{\~E}
+ \DeclareUnicodeCharacter{1EBD}{\~e}
+
+ \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}
+ \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}
+ \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}
+ \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}
+
+ \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}
+ \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}
+
+ \DeclareUnicodeCharacter{1EF2}{\`Y}
+ \DeclareUnicodeCharacter{1EF3}{\`y}
+ \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}
+
+ \DeclareUnicodeCharacter{1EF8}{\~Y}
+ \DeclareUnicodeCharacter{1EF9}{\~y}
+
+ \DeclareUnicodeCharacter{2013}{--}
+ \DeclareUnicodeCharacter{2014}{---}
+ \DeclareUnicodeCharacter{2018}{\quoteleft}
+ \DeclareUnicodeCharacter{2019}{\quoteright}
+ \DeclareUnicodeCharacter{201A}{\quotesinglbase}
+ \DeclareUnicodeCharacter{201C}{\quotedblleft}
+ \DeclareUnicodeCharacter{201D}{\quotedblright}
+ \DeclareUnicodeCharacter{201E}{\quotedblbase}
+ \DeclareUnicodeCharacter{2022}{\bullet}
+ \DeclareUnicodeCharacter{2026}{\dots}
+ \DeclareUnicodeCharacter{2039}{\guilsinglleft}
+ \DeclareUnicodeCharacter{203A}{\guilsinglright}
+ \DeclareUnicodeCharacter{20AC}{\euro}
+
+ \DeclareUnicodeCharacter{2192}{\expansion}
+ \DeclareUnicodeCharacter{21D2}{\result}
+
+ \DeclareUnicodeCharacter{2212}{\minus}
+ \DeclareUnicodeCharacter{2217}{\point}
+ \DeclareUnicodeCharacter{2261}{\equiv}
+}% end of \utfeightchardefs
+
+
+% US-ASCII character definitions.
+\def\asciichardefs{% nothing need be done
+ \relax
+}
+
+% Make non-ASCII characters printable again for compatibility with
+% existing Texinfo documents that may use them, even without declaring a
+% document encoding.
+%
+\setnonasciicharscatcode \other
+
+
+\message{formatting,}
+
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything. We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize. We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+ \ifx\emergencystretch\thisisundefined
+ % Allow us to assign to \emergencystretch anyway.
+ \def\emergencystretch{\dimen0}%
+ \else
+ \emergencystretch = .15\hsize
+ \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth;
+% 3) voffset; 4) hoffset; 5) binding offset; 6) topskip;
+% 7) physical page height; 8) physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading. The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+ \voffset = #3\relax
+ \topskip = #6\relax
+ \splittopskip = \topskip
+ %
+ \vsize = #1\relax
+ \advance\vsize by \topskip
+ \outervsize = \vsize
+ \advance\outervsize by 2\topandbottommargin
+ \pageheight = \vsize
+ %
+ \hsize = #2\relax
+ \outerhsize = \hsize
+ \advance\outerhsize by 0.5in
+ \pagewidth = \hsize
+ %
+ \normaloffset = #4\relax
+ \bindingoffset = #5\relax
+ %
+ \ifpdf
+ \pdfpageheight #7\relax
+ \pdfpagewidth #8\relax
+ % if we don't reset these, they will remain at "1 true in" of
+ % whatever layout pdftex was dumped with.
+ \pdfhorigin = 1 true in
+ \pdfvorigin = 1 true in
+ \fi
+ %
+ \setleading{\textleading}
+ %
+ \parindent = \defaultparindent
+ \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % If page is nothing but text, make it come out even.
+ \internalpagesizes{607.2pt}{6in}% that's 46 lines
+ {\voffset}{.25in}%
+ {\bindingoffset}{36pt}%
+ {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.25 trim size.
+\def\smallbook{{\globaldefs = 1
+ \parskip = 2pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.5in}{5in}%
+ {-.2in}{0in}%
+ {\bindingoffset}{16pt}%
+ {9.25in}{7in}%
+ %
+ \lispnarrowing = 0.3in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .5cm
+}}
+
+% Use @smallerbook to reset parameters for 6x9 trim size.
+% (Just testing, parameters still in flux.)
+\def\smallerbook{{\globaldefs = 1
+ \parskip = 1.5pt plus 1pt
+ \textleading = 12pt
+ %
+ \internalpagesizes{7.4in}{4.8in}%
+ {-.2in}{-.4in}%
+ {0pt}{14pt}%
+ {9in}{6in}%
+ %
+ \lispnarrowing = 0.25in
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = .4cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+ \parskip = 3pt plus 2pt minus 1pt
+ \textleading = 13.2pt
+ %
+ % Double-side printing via postscript on Laserjet 4050
+ % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+ % To change the settings for a different printer or situation, adjust
+ % \normaloffset until the front-side and back-side texts align. Then
+ % do the same for \bindingoffset. You can set these for testing in
+ % your texinfo source file like this:
+ % @tex
+ % \global\normaloffset = -6mm
+ % \global\bindingoffset = 10mm
+ % @end tex
+ \internalpagesizes{673.2pt}{160mm}% that's 51 lines
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{44pt}%
+ {297mm}{210mm}%
+ %
+ \tolerance = 700
+ \hfuzz = 1pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+ \parskip = 2pt plus 1pt minus 0.1pt
+ \textleading = 12.5pt
+ %
+ \internalpagesizes{160mm}{120mm}%
+ {\voffset}{\hoffset}%
+ {\bindingoffset}{8pt}%
+ {210mm}{148mm}%
+ %
+ \lispnarrowing = 0.2in
+ \tolerance = 800
+ \hfuzz = 1.2pt
+ \contentsrightmargin = 0pt
+ \defbodyindent = 2mm
+ \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{237mm}{150mm}%
+ {\voffset}{4.6mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ %
+ % Must explicitly reset to 0 because we call \afourpaper.
+ \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+ \afourpaper
+ \internalpagesizes{241mm}{165mm}%
+ {\voffset}{-2.95mm}%
+ {\bindingoffset}{7mm}%
+ {297mm}{210mm}%
+ \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\parseargdef\pagesizes{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+ \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+ \globaldefs = 1
+ %
+ \parskip = 3pt plus 2pt minus 1pt
+ \setleading{\textleading}%
+ %
+ \dimen0 = #1\relax
+ \advance\dimen0 by \voffset
+ %
+ \dimen2 = \hsize
+ \advance\dimen2 by \normaloffset
+ %
+ \internalpagesizes{#1}{\hsize}%
+ {\voffset}{\normaloffset}%
+ {\bindingoffset}{44pt}%
+ {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in \tt
+% (where it can probably be output as-is), and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise. Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font. Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts. But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+\let\realunder=_
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+% Used sometimes to turn off (effectively) the active characters even after
+% parsing them.
+\def\turnoffactive{%
+ \normalturnoffactive
+ \otherbackslash
+}
+
+\catcode`\@=0
+
+% \backslashcurfont outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\backslashcurfont=`\\
+\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work
+
+% \realbackslash is an actual character `\' with catcode other, and
+% \doublebackslash is two of them (for the pdf outlines).
+{\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}}
+
+% In texinfo, backslash is an active character; it prints the backslash
+% in fixed width font.
+\catcode`\\=\active
+@def@normalbackslash{{@tt@backslashcurfont}}
+% On startup, @fixbackslash assigns:
+% @let \ = @normalbackslash
+
+% \rawbackslash defines an active \ to do \backslashcurfont.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+@gdef@rawbackslash{@let\=@backslashcurfont}
+@gdef@otherbackslash{@let\=@realbackslash}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.
+%
+@def@normalturnoffactive{%
+ @let\=@normalbackslash
+ @let"=@normaldoublequote
+ @let~=@normaltilde
+ @let^=@normalcaret
+ @let_=@normalunderscore
+ @let|=@normalverticalbar
+ @let<=@normalless
+ @let>=@normalgreater
+ @let+=@normalplus
+ @let$=@normaldollar %$ font-lock fix
+ @unsepspaces
+}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\' in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also turn back on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+ @ifx\@eatinput @let\ = @normalbackslash @fi
+ @catcode`+=@active
+ @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
+
+@c vim:sw=2:
+
+@ignore
+ arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115
+@end ignore