gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r9953 - Extractor/doc


From: gnunet
Subject: [GNUnet-SVN] r9953 - Extractor/doc
Date: Fri, 1 Jan 2010 20:39:46 +0100

Author: grothoff
Date: 2010-01-01 20:39:46 +0100 (Fri, 01 Jan 2010)
New Revision: 9953

Modified:
   Extractor/doc/extractor.texi
   Extractor/doc/mdate-sh
   Extractor/doc/texinfo.tex
   Extractor/doc/version.texi
Log:
docu

Modified: Extractor/doc/extractor.texi
===================================================================
--- Extractor/doc/extractor.texi        2010-01-01 16:00:27 UTC (rev 9952)
+++ Extractor/doc/extractor.texi        2010-01-01 19:39:46 UTC (rev 9953)
@@ -5,22 +5,23 @@
 @c %**start of header
 @setfilename extractor.info
 @include version.texi
address@hidden The libextractor Reference Manual
address@hidden The GNU libextractor Reference Manual
 @c Unify some of the indices.
 @c %**end of header
 @copying
-This manual is for libextractor
+This manual is for GNU libextractor
 (version @value{VERSION}, @value{UPDATED}),
 which is GNU's library for meta data extraction.
 
-Copyright @copyright{} 2007 Christian Grothoff
+Copyright @copyright{} 2007, 2010 Christian Grothoff
 
 @quotation
 Permission is granted to copy, distribute and/or modify this document
-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. The text of the license can be found in the
-section entitled ``Copying''.
+under the terms of the GNU Free Documentation License, Version 1.3
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+Texts.  A copy of the license is included in the section entitled "GNU
+Free Documentation License".
 @end quotation
 @end copying
 
@@ -36,7 +37,7 @@
 @c
 @setchapternewpage odd
 @titlepage
address@hidden The libextractor Reference Manual
address@hidden The GNU libextractor Reference Manual
 @subtitle Version @value{VERSION}
 @subtitle @value{UPDATED}
 @author Christian Grothoff (@email{christian@@grothoff.org})
@@ -52,29 +53,55 @@
 @page
 
 
address@hidden gnu{}
address@hidden
address@hidden macro
+
address@hidden gpl{}
address@hidden
address@hidden macro
+
address@hidden api{}
address@hidden
address@hidden macro
+
address@hidden cfunction{arg}
address@hidden()}
address@hidden macro
+
address@hidden mynull{}
address@hidden
address@hidden macro
+
address@hidden le{}
address@hidden libextractor}
address@hidden macro
+
+
 @ifnottex
 @node Top
address@hidden The libextractor Library
address@hidden The GNU libextractor Reference Manual
 @insertcopying
 @end ifnottex
 
+GNU libextractor is a GNU package.
 
 @menu
-* Introduction::                 What is @acronym{libextractor}.
+* Introduction::                 What is @le{}.
 * Preparation::                  What you should do before using the library.
 * Generalities::                 General library functions and data types.
-* Extracting meta data::         How to use @acronym{libextractor} to obtain 
meta data.
-* Language bindings::            How to use @acronym{libextractor} from 
languages other than C.
-* Utility functions::            Utility functions of @acronym{libextractor}.
+* Extracting meta data::         How to use @le{} to obtain meta data.
+* Language bindings::            How to use @le{} from languages other than C.
+* Utility functions::            Utility functions of @le{}.
 * Existing Plugins::             What plugins are available.
-* Writing new Plugins::          How to write new plugins for 
@acronym{libextractor}.
-* Internal utility functions::   Utility functions of @acronym{libextractor} 
for writing plugins.
+* Writing new Plugins::          How to write new plugins for @le{}.
+* Internal utility functions::   Utility functions of @le{} for writing 
plugins.
 * Reporting bugs::               How to report bugs or request new features.
 
 Appendices
 
 * Copying::                     The GNU General Public License says how you
-                                can copy and share some parts of 
`libextractor'.
+                                can copy and share some parts of @le{}.
 
 Indices
 
@@ -93,7 +120,7 @@
 @chapter Introduction
 
 @cindex error handling
address@hidden is GNU's library for extracting meta data from
address@hidden is GNU's library for extracting meta data from
 files.  Meta data includes format information (such as mime type,
 image dimensions, color depth, recording frequency), content
 descriptions (such as document title or document description) and
@@ -101,304 +128,431 @@
 Meta data extraction is an inherently uncertain business --- a parse
 error can be a corrupt file, an incompatibility in the file format
 version, an entirely different file format or a bug in the parser.  As
-a result of this uncertainty, @acronym{libextractor} deliberately
+a result of this uncertainty, @le{} deliberately
 avoids to ever report any errors.  Unexpected file contents simply
 result in less or possibly no meta data being extracted.  
 
 @cindex plugin
address@hidden uses plugins to handle various file formats.
address@hidden uses plugins to handle various file formats.
 Technically a plugin can support multiple file formats; however, most
-plugins only support one particular format.  @acronym{libextractor}
-uses a certain set of @emph{default} plugins.  Certain additional
-plugins are only used if specifically requested.  Optional plugins
-exist for computing various cryptographic hash functions (the hash of
-the file is returned as meta data), thumbnail creation for images and
-full-text extraction (based on language-specific dictionaries).  A few
-plugins exist to manipulate results from other plugins, such as
-splitting meta data into individual words at particular characters and
-converting the output to lower case letters.
+plugins only support one particular format.  By default,
address@hidden will use all plugins that are available and found
+in the plugin installation directory.  Applications can
+request the use of only specific plugins or the exclusion of
+certain plugins.
 
address@hidden is distributed with the @command{extract} 
address@hidden is distributed with the @command{extract} 
 address@hidden distributions ship @command{extract} in a
 seperate package.} which is a command-line tool for extracting
 meta data.  @command{extract} is given a list of filenames and 
 prints the resulting meta data to the console.  The @command{extract}
 source code also serves as an advanced example for how to use
address@hidden  
address@hidden  
 
 This manual focuses on providing documentation for writing software
-with @acronym{libextractor}.  The only relevant parts for end-users
-are the chapter on compiling and installing @acronym{libextractor}
+with @le{}.  The only relevant parts for end-users
+are the chapter on compiling and installing @le{}
 (@xref{Preparation}.).  Also, the chapter on existing plugins maybe of
 interest (@xref{Existing Plugins}.).  Additional documentation for
 end-users can be find in the man page on @command{extract} (using
 @verb{|man extract|}).
 
 @cindex license
address@hidden is licensed under the GNU Public License.  The
address@hidden is licensed under the GNU General Public License.  The
 developers have frequently received requests to license GNU
-libextractor under alternative terms.  However, @acronym{libextractor}
+libextractor under alternative terms.  However, @le{}
 borrows plenty of GPL-licensed code from various other projects.
 Hence we cannot change the license (even if we wanted to)address@hidden
 maybe possible to switch to GPLv3 in the future.  For this, an audit
 of the license status of our dependencies would be required.  The new
-code that was developed specifically for @acronym{libextractor} has
+code that was developed specifically for @le{} has
 always been licensed under GPLv2 @emph{or any later version}.}
 
 @node Preparation
 @chapter Preparation
 
-Compiling @acronym{libextractor} follows the standard GNU autotools
+Compiling @le{} follows the standard GNU autotools
 build process using @command{configure} and @command{make}.  For
 details, read the @file{INSTALL} file and query 
 @verb{|./configure --help|} for additional options.
 
address@hidden has various dependencies, some of which are
-optional.  You can find the current list specified in terms of Debian
-GNU/Linux packages in @file{README.debian}.  Note that transitive
-dependencies are @emph{not} listed.
address@hidden has various dependencies, some of which are optional. 
+Instead of specifying the names of the software packages, we
+will give the list in terms of the names of the respective
+Debian (unstable) packages that should be installed.
 
-Once you have compiled and installed @acronym{libextractor}, you
-should have a file @file{include/extractor.h} installed in your
-include directory.  This file should be the starting point for your C
-and C++ development with @acronym{libextractor}.  The build process
-also installs the @file{extract} binary and man pages for
address@hidden and @acronym{libextractor}.  The @file{extract} man
-page documents the @file{extract} tool.  The @acronym{libextractor}
-man page gives a brief summary of the C API for
address@hidden  
+You absolutely need:
 
address@hidden @bullet
address@hidden
+libtool
address@hidden
+gcc
address@hidden
+make
address@hidden
+g++ 
address@hidden
+libltdl7-dev
address@hidden
+zlib1g-dev
address@hidden
+libbz2-dev
address@hidden itemize
+
+Recommended dependencies are:
address@hidden @bullet
address@hidden
+libgtk2.0-dev
address@hidden
+libvorbis-dev
address@hidden
+libflac-dev
address@hidden
+libgsf-1-dev
address@hidden
+libmpeg2-4-dev
address@hidden
+libqt4-dev
address@hidden
+librpm-dev
address@hidden
+libpoppler-dev
address@hidden
+libexiv2-dev
address@hidden itemize
+
+Optional dependencies (you would need to additionally specify 
+the configure option @code{--enable-ffmpeg}) to make use of these
+are:
address@hidden @bullet
address@hidden
+libavformat-dev
address@hidden
+libswscale-dev
address@hidden itemize
+
+For Subversion access and compilation one also needs:
address@hidden @bullet
address@hidden
+subversion
address@hidden
+autoconf
address@hidden
+automake
address@hidden itemize
+
+Please notify us if we missed some dependencies (note that the list is
+supposed to only list direct dependencies, not transitive
+dependencies).
+
+Once you have compiled and installed @le{}, you should have a file
address@hidden installed in your @file{include/} directory.  This
+file should be the starting point for your C and C++ development with
address@hidden  The build process also installs the @file{extract} binary and
+man pages for @file{extract} and @le{}.  The @file{extract} man page
+documents the @file{extract} tool.  The @le{} man page gives a brief
+summary of the C API for @le{}.
+
 @cindex packageing
 @cindex directory structure
 @cindex plugin
 @cindex environment variables
 @vindex LIBEXTRACTOR_PREFIX
-When you install @acronym{libextractor}, various plugins will be
+When you install @le{}, various plugins will be
 installed in the @file{lib/libextractor/} directory.  The main library
 will be installed as @file{lib/libextractor.so}.  Note that
address@hidden will attempt to find the plugins relative to the
address@hidden will attempt to find the plugins relative to the
 path of the main library.  Consequently, a package manager can move
 the library and its plugins to a different location later --- as long
 as the relative path between the main library and the plugins is
 preserved.  As a method of last resort, the user can specify an
 environment variable @verb{|LIBEXTRACTOR_PREFIX|}.  If
address@hidden cannot locate a plugin, it will look in
address@hidden cannot locate a plugin, it will look in
 @verb{|LIBEXTRACTOR_PREFIX/lib/libextractor/|}.
 
address@hidden Note to package maintainers
 
+The suggested way to package GNU libextractor is to split it into
+roughly the following binary packages:@footnote{Debian policy
+furthermore requires a @file{-dev} (meta) package that would depend on
+all of the above packages.}
+
address@hidden @bullet
address@hidden
+libextractor (main library only, only hard dependency for other packages 
depending on GNU libextractor)
address@hidden
+extract (command-line tool and man page)
address@hidden
+libextractor-dev (extractor.h header and man page)
address@hidden
+libextractor-doc (this manual)
address@hidden
+libextractor-plugins (plugins without external dependencies; recommended but 
not required by extract and libextractor package)
address@hidden
+libextractor-plugin-XXX (plugin with dependency on libXXX, for example for 
XXX=mpeg this would be @file{libextractor_mpeg.so})
address@hidden
+libextractor-plugins-all (meta package that requires all plugins)
address@hidden itemize
+
+This would enable minimal installations (i.e. for embedded systems) to
+not include any plugins, as well as moderate-size installations (that
+do not trigger GTK, QT and X11) for systems that have limited
+resources.
+
+
 @node Generalities
 @chapter Generalities
 
-Each public symbol exported by @acronym{libextractor} has the prefix
+Each public symbol exported by @le{} has the prefix
 @verb{|EXTRACTOR_|}.  All-caps names are used for constants.  For the
-impatient, the minimal C code for using @acronym{libextractor} (on the
+impatient, the minimal C code for using @le{} (on the
 executing binary itself) looks like this:
 
 @verbatim
 #include <extractor.h>
 int main(int argc, char ** argv) {
-  EXTRACTOR_ExtractorList * plugins 
-    = EXTRACTOR_loadDefaultLibraries();
-  EXTRACTOR_KeywordList * keywords 
-    = EXTRACTOR_getKeywords(plugins, argv[0]);
-  EXTRACTOR_printKeywords(stdout, keywords);
-  EXTRACTOR_freeKeywords(keywords);
-  EXTRACTOR_removeAll(plugins);
+  struct EXTRACTOR_PluginList *plugins
+    = EXTRACTOR_plugin_add_defaults (EXTRACTOR_OPTION_DEFAULT_POLICY);
+  EXTRACTOR_extract (plugins, argv[1],
+                     NULL, 0, 
+                     &EXTRACTOR_meta_data_print, stdout);
+  EXTRACTOR_plugin_remove_all (plugins);
   return 0;
 }
 @end verbatim
 
address@hidden defines three main data types.  Understanding
-these types is key for programming with @acronym{libextractor}.
 
address@hidden EXTRACTOR_KeywordType
address@hidden EXTRACTOR_getHighestKeywordTypeNumber
-First, @verb{|EXTRACTOR_KeywordType|} is a C enum which defines a
-list of over 100 different types of meta data.  The total number can
-differ between different @acronym{libextractor} releases; the maximum
-value for the current release can be obtained using the
address@hidden|EXTRACTOR_getHighestKeywordTypeNumber|} function.
address@hidden Extracting meta data
address@hidden Extracting meta data
 
address@hidden EXTRACTOR_getKeywordTypeAsString
address@hidden gettext
address@hidden internationalization
-The function @verb{|EXTRACTOR_getKeywordTypeAsString|} can be used to
-obtain an English string @samp{s} describing the meta data type.  The
-string maybe translated into other languages using GNU gettext with
-the domain set to @acronym{libextractor}
-(@verb{|dgettext("libextractor", s)|}).
address@hidden
+* Plugin management::   How to load and unload plugins
+* Meta types::          About meta types
+* Meta formats::        About meta formats
+* Extracting::          How to use the extraction API
address@hidden menu
 
address@hidden EXTRACTOR_KeywordList
address@hidden UTF-8
address@hidden character set
address@hidden internationalization
-Second, @acronym{libextractor} uses a linked list
address@hidden|EXTRACTOR_KeywordList|} to store extracted meta data.  The
-structure is extremely simple, consisting of a field @samp{keyword}
-which holds the meta data as a zero terminated UTF-8 string, a field
address@hidden of type @verb{|EXTRACTOR_KeywordType|} which
-describes the type of the meta data and a @samp{next} pointer to the
-next meta data record (or @verb{|NULL|} for the last entry).
 
address@hidden EXTRACTOR_freeKeywords
-Clients are allowed to directly access the keyword list.  After
-returning the list to the client, @acronym{libextractor} makes no
-assumptions about how the client may process the list.  The client is
-responsible for freeing both the linked list and the keywords stored
-in the linked list.  The @verb{|EXTRACTOR_freeKeywords|} function
-provides a convenient way to do so.
address@hidden Plugin management
address@hidden Plugin management
 
address@hidden EXTRACTOR_ExtractorList
-Finally, the third data type used by @acronym{libextractor} is 
-the @verb{|EXTRACTOR_ExtractorList|}.  This linked list is used
-to store information about the plugins that @acronym{libextractor}
-is using to obtain meta data.  The struct contains information
-identifying the plugin, a pointer to the meta data extraction
-function provided by the plugin and options for the plugin.  
-Most clients should never be concerned with the internals of this
-type.  
-
address@hidden EXTRACTOR_loadDefaultLibraries
address@hidden EXTRACTOR_removeAll
-Clients should use the @verb{|EXTRACTOR_loadDefaultLibraries|}
-function to create an extractor list with the default set of plugins.
-Additional functions are provided for loading optional plugins.  Once
-the meta data extraction is complete, clients should call
address@hidden|EXTRACTOR_removeAll|} to unload the plugins and free the
-extractor list.  Note that loading and unloading the plugins is a
-relatively costly operation.  If possible, programmers should avoid
-needlessly loading and unloading the plugins. 
-
 @cindex reentrant
 @cindex concurrency
 @cindex threads
 @cindex thread-safety
address@hidden enum EXTRACTOR_Options
+
 All of the functions for loading and unloading plugins, including
address@hidden|EXTRACTOR_loadDefaultLibraries|} and 
@verb{|EXTRACTOR_removeAll|},
-are thread-safe, but not reentrant. The functions use operating system
-specific calls to dynamically load and unload objects, and in many cases,
-these calls are not thread-safe. In @acronym{libextractor} code, locking
-is used to protect access to these operating system specific calls. 
address@hidden|EXTRACTOR_plugin_add_defaults|} and 
@verb{|EXTRACTOR_plugin_remove_all|},
+are thread-safe and reentrant.  However, using the same plugin list
+from multiple threads at the same time is not safe.  Creating multiple
+plugin lists and using them concurrently is supported as long as
+the @code{EXTRACTOR_OPTION_IN_PROCESS} option is not used. 
 
-Generally, @acronym{libextractor} is fully thread-safe and mostly reentrant.
-All plugin code is required to be reentrant, so the same set of plugins
-can be safely used concurrently by multiple threads. Reentrant functions, 
-naturally, do not protect their arguments (plugin or keyword lists) against
-concurrent access. For further information on @acronym{libextractor}'s
-thread-safety and reentrancy, also see the following chapters on
address@hidden usage.
+Generally, @le{} is fully thread-safe and mostly reentrant.
+All plugin code is expected required to be reentrant and state-less,
+but due to the extensive use of 3rd party libraries this cannot
+be guaranteed.  Hence plugins are executed (by default) out of
+process.  This also ensures that plugins that crash do not cause
+the main application to fail as well.  
 
address@hidden Extracting meta data
address@hidden Extracting meta data
+Plugins can be executed in-process by giving the option
address@hidden when loading the plugin.  This
+option is only recommended when debugging plugins and not for
+production use.  Due to the use of shared-memory IPC the
+out-of-process execution of plugins should not be a concern for
+performance.
 
address@hidden EXTRACTOR_getKeywords
address@hidden EXTRACTOR_getKeywords2
address@hidden reentrant
address@hidden concurrency
address@hidden threads
address@hidden thread-safety
-The main functions for extracting keywords with @acronym{libextractor}
-are @verb{|EXTRACTOR_getKeywords|} and
address@hidden|EXTRACTOR_getKeywords2|}.  The first argument to both functions
-is an extractor list which specifies the set of plugins that should be
-used for extracting meta data.   Both functions return a linked list
-of keywords (of type @verb{|EXTRACTOR_KeywordList|}). Also, both
-functions are reentrant.
 
-The difference between the two functions is in how the file from which
-the meta data should be obtained is specified. The
address@hidden|EXTRACTOR_getKeywords|} function simply takes the name of the
-file as its second argument.  The @verb{|EXTRACTOR_getKeywords2|}
-function takes a (read-only) buffer and its size (in bytes) as
-arguments, allowing meta data extraction from memory.
address@hidden {C Struct} EXTRACTOR_PluginList
address@hidden struct EXTRACTOR_PluginList
 
address@hidden SIGBUS
address@hidden bus error
-Meta data extraction should never really fail -- at worst,
address@hidden should return a @verb{|NULL|} pointer
-indicating that no meta data was found.  By design,
address@hidden should never crash or leak memory, even given
-corrupt files as input.  Note however, that running
address@hidden on a corrupt file system (or incorrectly
address@hidden|mmap|}ed files) can result in the operating system sending a
-SIGBUS (bus error) to the process.  @acronym{libextractor} will
address@hidden attempt to catch this signal and your application is likely
-to crash.  Note again that this should only happen if the file
address@hidden is corrupt (not if individual files are corrupt).  If
-this is not acceptable, you might want to consider running
address@hidden out-of-process (as done, for example, by
address@hidden://gnunet.org/doodle/,doodle}).
+A plugin list represents a set of GNU libextractor plugins.  Most of
+the GNU libextractor API is concerned with either constructing a
+plugin list or using it to extract meta data.  The internal representation
+of the plugin list is of no concern to users or plugin developers.
address@hidden deftp
 
 
address@hidden
-* Customizing the Plugins::      Customizing the Plugins
address@hidden menu
address@hidden void EXTRACTOR_plugin_remove_all (struct EXTRACTOR_PluginList 
*plugins)
address@hidden EXTRACTOR_plugin_remove_all
 
address@hidden Customizing the Plugins
address@hidden Customizing the Plugins
+Unload all of the plugins in the given list.
address@hidden deftypefun
 
-The functions described in this section can be used to control which
-plugins are loaded and in which order they are executed.  This provides
-more control than simply sticking to the default list.  It is recommended
-that clients start by loading the default plugins and then allow the user
-to perform further customizations using command-line options or a
-configuration file.
address@hidden {struct EXTRACTOR_PluginList *} EXTRACTOR_plugin_remove (struct 
EXTRACTOR_PluginList *plugins, const char*name)
address@hidden EXTRACTOR_plugin_remove
 
+Unloads a particular plugin.  The given name should be the short name of the 
plugin, for example ``mime'' for the mime-type extractor or ``mpeg'' for the 
MPEG extractor.
address@hidden deftypefun
+
address@hidden {struct EXTRACTOR_PluginList *} EXTRACTOR_plugin_add (struct 
EXTRACTOR_PluginList *plugins, const char* name,const char* options, enum 
EXTRACTOR_Options flags)
address@hidden EXTRACTOR_plugin_add
+
+Loads a particular plugin.  The plugin is added to the existing list, which 
can be NULL.  The second argument specifies the name of the plugin (i.e. 
``ogg'').  The third argument can be NULL and specifies plugin-specific 
options.  Finally, the last argument specifies if the plugin should be executed 
out-of-process (@code{EXTRACTOR_OPTION_DEFAULT_POLICY}) or not.
address@hidden deftypefun
+
address@hidden {struct EXTRACTOR_PluginList *} EXTRACTOR_plugin_add_config 
(struct EXTRACTOR_PluginList *plugins, const char* config, enum 
EXTRACTOR_Options flags)
address@hidden EXTRACTOR_plugin_add_config
+
+Loads and unloads plugins based on a configuration string, modifying the 
existing list, which can be NULL.  The string has the format 
``[-]NAME(OPTIONS)@{:[-]NAME(OPTIONS)@}*''.  Prefixing the plugin name with a 
``-'' means that the plugin should be unloaded.
address@hidden deftypefun
+
address@hidden {struct EXTRACTOR_PluginList *} EXTRACTOR_plugin_add_defaults 
(enum EXTRACTOR_Options flags)
address@hidden EXTRACTOR_plugin_add_defaults
+
+Loads all of the plugins in the plugin directory.  This function is what most 
@le{} applications should use to setup the plugins.
address@hidden deftypefun
+
+
+
address@hidden Meta types
address@hidden Meta types
+
+
address@hidden enum EXTRACTOR_MetaType
address@hidden EXTRACTOR_metatype_get_max
+
address@hidden|enum EXTRACTOR_MetaType|} is a C enum which defines a list of 
over 100 different types of meta data.  The total number can differ between 
different @le{} releases; the maximum value for the current release can be 
obtained using the @verb{|EXTRACTOR_metatype_get_max|} function.  All values in 
this enumeration are of the form @verb{|EXTRACTOR_METATYPE_XXX|}.
+
address@hidden {const char *} EXTRACTOR_metatype_to_string (enum 
EXTRACTOR_MetaType type)
address@hidden EXTRACTOR_metatype_to_string
address@hidden gettext
address@hidden internationalization
+
+The function @verb{|EXTRACTOR_metatype_to_string|} can be used to obtain a 
short English string @samp{s} describing the meta data type.  The string can be 
translated into other languages using GNU gettext with the domain set to @le{} 
(@verb{|dgettext("libextractor", s)|}).  
address@hidden deftypefun
+
address@hidden {const char *} EXTRACTOR_metatype_to_description (enum 
EXTRACTOR_MetaType type)
address@hidden EXTRACTOR_metatype_to_description
address@hidden gettext
address@hidden internationalization
+
+The function @verb{|EXTRACTOR_metatype_to_description|} can be used to obtain 
a longer English string @samp{s} describing the meta data type.  The 
description may be empty if the short description returned by 
@code{EXTRACTOR_metatype_to_string} is already comprehensive.  The string can 
be translated into other languages using GNU gettext with the domain set to 
@le{} (@verb{|dgettext("libextractor", s)|}).  
address@hidden deftypefun
+
+
+
address@hidden Meta formats
address@hidden Meta formats
+
address@hidden enum EXTRACTOR_MetaFormat
+
address@hidden|enum EXTRACTOR_MetaFormat|} is a C enum which defines on a high 
level how the extracted meta data is represented.  Currently, the library uses 
three formats: UTF-8 strings, C strings and binary data.  A fourth value, 
@code{EXTRACTOR_METAFORMAT_UNKNOWN} is defined but not used.  UTF-8 strings are 
0-terminated strings that have been converted to UTF-8.  The format code is 
@code{EXTRACTOR_METAFORMAT_UTF8}. Ideally, most text meta data will be of this 
format.  Some file formats fail to specify the encoding used for the text.  In 
this case, the text cannot be converted to UTF-8.  However, the meta data is 
still known to be 0-terminated and presumably human-readable.  In this case, 
the format code used is @code{EXTRACTOR_METAFORMAT_C_STRING}; however, this 
should not be understood to mean that the encoding is the same as that used by 
the C compiler.  Finally, for binary data (mostly images), the format 
@code{EXTRACTOR_METAFORMAT_BINARY} is used.
+
+Naturally this is not a precise description of the meta format. Plugins can 
provide a more precise description (if known) by providing the respective mime 
type of the meta data.  For example, binary image meta data could be also 
tagged as ``image/png'' and normal text would typically be tagged as 
``text/plain''.  
+
+
+
address@hidden Extracting
address@hidden Extracting
+
address@hidden {Function Pointer} int (*EXTRACTOR_MetaDataProcessor)(void *cls, 
const char *plugin_name, enum EXTRACTOR_MetaType type, enum 
EXTRACTOR_MetaFormat format, const char *data_mime_type, const char *data, 
size_t data_len)
address@hidden EXTRACTOR_MetaDataProcessor
+
+Type of a function that libextractor calls for each meta data item found.
+
address@hidden @var
+
address@hidden cls 
+closure (user-defined)
+
address@hidden plugin_name 
+name of the plugin that produced this value; special values can be used (i.e. 
'<zlib>' for zlib being used in the main libextractor library and yielding meta 
data);
+
address@hidden type 
+libextractor-type describing the meta data;
+
address@hidden format basic 
+format information about data
+
address@hidden data_mime_type 
+mime-type of data (not of the original file); can be NULL (if mime-type is not 
known);
+
address@hidden data 
+actual meta-data found
+
address@hidden data_len 
+number of bytes in data
+
address@hidden table
+
+Return 0 to continue extracting, 1 to abort.
address@hidden deftypefn
+
+
+
address@hidden void EXTRACTOR_extract(struct EXTRACTOR_PluginList *plugins, 
const char *filename, const void *data, size_t size, 
EXTRACTOR_MetaDataProcessor proc, void *proc_cls)
address@hidden EXTRACTOR_extract
 @cindex reentrant
 @cindex concurrency
 @cindex threads
 @cindex thread-safety
-Like @verb{|EXTRACTOR_loadDefaultLibraries|} and 
address@hidden|EXTRACTOR_removeAll|}, these functions are thread-safe, but not
-reentrant. 
 
address@hidden EXTRACTOR_addLibrary
-The @verb{|EXTRACTOR_addLibrary|} function can be used to add a
-single plugin to the front of the list of already loaded plugins.
+This is the main function for extracting keywords with @le{}.  The first 
argument is a plugin list which specifies the set of plugins that should be 
used for extracting meta data.  The @samp{filename} argument is optional and 
can be used to specify the name of a file to process.  If @samp{filename} is 
NULL, then the @samp{data} argument must point to the in-memory data to extract 
meta data from.  If @samp{filename} is non-NULL, @samp{data} can be NULL.  If 
@samp{data} is non-null, then @samp{size} is the size of @samp{data} in bytes.  
Otherwise @samp{size} should be zero.  For each meta data item found, GNU 
libextractor will call the @samp{proc} function, passing @samp{proc_cls} as the 
first argument to @samp{proc}.  The other arguments to @samp{proc} depend on 
the specific meta data found.  
 
address@hidden EXTRACTOR_addLibraryLast
-Use @verb{|EXTRACTOR_addLibraryLast|} to add a plugin to the end of
-the list of plugins.  Plugins at the end can benefit from analyses
-performed by plugins earlier (such as mime-type detection).  This can
-be useful to avoid more expensive processing.  Some plugins need to be
-loaded last since they transform the keyword list.  For example, the
address@hidden|split|} plugin tokenizes the meta data returned by other
-plugins.  Since this plugin needs the keywords generated by the other
-plugins as its' input, it must be run last in order to ensure that it
-is applied to all keywords.
address@hidden SIGBUS
address@hidden bus error
+Meta data extraction should never really fail --- at worst, @le{} should not 
call @samp{proc} with any meta data. By design, @le{} should never crash or 
leak memory, even given corrupt files as input.  Note however, that running 
@le{} on a corrupt file system (or incorrectly @verb{|mmap|}ed files) can 
result in the operating system sending a SIGBUS (bus error) to the process.  
While @le{} runs plugins out-of-process, it first maps the file into memory and 
then attempts to decompress it.  During decompression it is possible to 
encounter a SIGBUS.   @le{} will @emph{not} attempt to catch this signal and 
your application is likely to crash.  Note again that this should only happen 
if the file @emph{system} is corrupt (not if individual files are corrupt).  If 
this is not acceptable, you might want to consider running @le{} itself also 
out-of-process (as done, for example, by 
@url{http://grothoff.org/christian/doodle/,doodle}).
 
address@hidden EXTRACTOR_removeLibrary
-The @verb{|EXTRACTOR_removeLibrary|} function can be used to unload
-a specific plugin.  
address@hidden deftypefun
 
address@hidden EXTRACTOR_loadConfigLibraries
-The @verb{|EXTRACTOR_loadConfigLibraries|} provides a simple interface
-for highly customized loading of plugins.  The provided configuration
-string can specify multiple plugins (seperated by colons) with
-optional arguments to the plugins (in parenteses after the plugin
-name).  By default the plugins are pre-pended to the plugin list in
-the order that the plugins are processed; however, by prefixing the
-plugin name with a minus-sign that particular library will be
-appended to the list.
 
-
-
 @node Language bindings
 @chapter Language bindings
 
 @cindex Java
address@hidden Mono
 @cindex Perl
 @cindex Python
 @cindex PHP
 @cindex Ruby
address@hidden works immediately with C and C++ code.
-Bindings for Java, Ruby, Perl, PHP and Python are available for download
-from the main @acronym{libextractor} website.  Documentation for these
-bindings (if available) is part of the downloads for the respective
-binding.  In all cases, a full installation of the C library is
-required before the binding can be installed.
 
address@hidden works immediately with C and C++ code. Bindings for Java, Mono, 
Ruby, Perl, PHP and Python are available for download from the main @le{} 
website.  Documentation for these bindings (if available) is part of the 
downloads for the respective binding.  In all cases, a full installation of the 
C library is required before the binding can be installed.
 
address@hidden Java
+
+Compiling the GNU libextractor Java binding follows the usual process of
+running @command{configure} and @command{make}.  The result will be a
+shared C library @file{libextractor_java.so} with the native code and
+a JAR file (installed to @file{$PREFIX/share/java/libextractor.java}).
+
+A minimal example for using GNU libextractor's Java binding would look
+like this:
address@hidden
+import org.gnu.libextractor.*;
+import java.util.ArrayList;
+
+public static void main(String[] args) {
+  Extractor ex = Extractor.getDefault();
+  for (int i=0;i<args.length;i++) {
+    ArrayList keywords = ex.extract(args[i]);
+    System.out.println("Keywords for " + args[i] + ":");
+    for (int j=0;j<keywords.size();j++)
+      System.out.println(keywords.get(j));
+  }
+}
address@hidden verbatim
+
+The GNU libextractor library and the @file{libextractor_java.so} JNI binding
+have to be in the library search path for this to work.  Furthermore, the
address@hidden file should be on the classpath.  
+
+Note that the API does not use Java 5 style generics in order to work
+with older versions of Java.
+
address@hidden Mono
+
address@hidden Perl
+
address@hidden Python
+
address@hidden PHP
+
address@hidden Ruby
+
+
 @node Utility functions
 @chapter Utility functions
 
@@ -406,15 +560,11 @@
 @cindex concurrency
 @cindex threads
 @cindex thread-safety
-This chapter describes various utility functions for
address@hidden usage. All of the functions are reentrant.
+This chapter describes various utility functions for @le{} usage. All of the 
functions are reentrant.
 
 @menu
-* Utility Constants::            Constants
-* Misc Keyword List::            Keyword List Functions
-* Cleaning up the Keyword List:: Keyword List Remove Functions
-* Finding Keywords::             Keyword List Search Functions
-* Binary Meta data::             Handling of binary meta data
+* Utility Constants::
+* Meta data printing::
 @end menu
 
 @node Utility Constants
@@ -431,154 +581,91 @@
 or higher.
 
 
address@hidden EXTRACTOR_getDefaultLibraries
-If your code needs to find out what the set of default
-plugins that would be loaded with
address@hidden|EXTRACTOR_loadDefaultLibraries|} is, the function
address@hidden|EXTRACTOR_getDefaultLibraries|} returns a constant
-string which follows the format of 
address@hidden|EXTRACTOR_loadConfigLibraries|} and specifies
-the set of default plugins for this version of 
-libextractor.
address@hidden Meta data printing
address@hidden Meta data printing
 
 
address@hidden EXTRACTOR_meta_data_print
+The @verb{|EXTRACTOR_meta_data_print|} is a simple function which prints the 
meta data found with libextractor to a file.  The function is mostly useful for 
debugging and as an example for how to manipulate the keyword list and can be 
passed as the @samp{proc} argument to @code{EXTRACTOR_extract}.  The file to 
print to should be passed as @samp{proc_cls} (which must be of type @code{FILE 
*}), for example @code{stdout}.
 
address@hidden Misc Keyword List
address@hidden Misc Keyword List
 
-This section describes a couple of convenience functions for
-manipulating the keyword list.
 
address@hidden EXTRACTOR_printKeywords
-The @verb{|EXTRACTOR_printKeywords|} is a simple function which
-prints the meta data found with libextractor to a file.  The
-function is mostly useful for debugging and as an example for
-how to manipulate the keyword list.
-
address@hidden EXTRACTOR_countKeywords
-The @verb{|EXTRACTOR_countKeywords|} returns the number of 
-keywords found.  It simply traverses the linked list and
-determines its length.
-
-
address@hidden Cleaning up the Keyword List
address@hidden Cleaning up the Keyword List
-
-
address@hidden EXTRACTOR_removeDuplicateKeywords
-The @verb{|EXTRACTOR_removeDuplicateKeywords|} function can be used to
-remove duplicate keywords.  This is useful since the same keyword can
-be extracted by multiple plugins.  In addition to the keyword list,
-the function requires an argument options which is used to specify
-what should be considered a duplicate.  The value zero should be used
-if only exact matches (same keyword string and same meta data type)
-should be removed.  Use @verb{|EXTRACTOR_DUPLICATES_TYPELESS|} in
-order to remove duplicate keywords even if the meta data types are
-different.  Use @verb{|EXTRACTOR_DUPLICATES_REMOVE_UNKNOWN|} to remove
-entries where the keywords match exactly and one of the keyword types
-is @verb{|EXTRACTOR_UNKNOWN|}.  Given the choice,
address@hidden|EXTRACTOR_removeDuplicateKeywords|} will always prefer to
-remove the duplicate keyword with the @verb{|EXTRACTOR_UNKNOWN|} and
address@hidden|EXTRACTOR_SPLIT|} types.
-
address@hidden EXTRACTOR_removeEmptyKeywords
-The @verb{|EXTRACTOR_removeEmptyKeywords|} simply removes meta data
-entries that are empty strings.
-
address@hidden EXTRACTOR_removeKeywordsOfType
-The @verb{|EXTRACTOR_removeKeywordsOfType|} function can be used to
-remove all keywords of a particular meta data type.
-
-
address@hidden Finding Keywords
address@hidden Finding Keywords
-
-
address@hidden EXTRACTOR_extractLast
-The @verb{|EXTRACTOR_extractLast|} function returns the
-last keyword value in the linked list that has the given
-meta data type.
-
address@hidden EXTRACTOR_extractLastByString
-The @verb{|EXTRACTOR_extractLastByString|} works exactly
-like @verb{|EXTRACTOR_extractLast|} except that the meta
-data type is specified using the corresponding string
-value.
-
-
-
address@hidden Binary Meta data
address@hidden Binary Meta data
-
-libextractor supports binary meta data.  At this point, binary
-meta data is rarely encountered -- the default meta data plugins
-do not generate binary meta data.  However, you can load one of
-the thumbnail-plugins to generate thumbnails for various images.
-These thumbnails are binary meta data.  In the future it is 
-conceivable that additional binary meta data extractors will be
-implemented.  
-
-Since the simple linked list of keywords that is used by the
-libextractor API only contains 0-terminated strings, binary 
-meta data cannot be directly returned as-is by the plugins.
-Also, if binary meta data is returned, the keyword string does
-not point to the usual UTF-8 encoded string.  Applications must
-be aware of this in order to avoid printing binary meta data
-by accident as if it was UTF-8.
-
address@hidden EXTRACTOR_isBinaryType
-The @verb{|EXTRACTOR_isBinaryType|} function is used to test if a
-particular meta data type contains binary meta data.  If this function
-returns 0, the client can be certain that the keyword is UTF-8 and not
-binary.  
-
address@hidden EXTRACTOR_binaryDecode
-In order to handle zero-bytes in binary data, libextractor
-encodes binary data in a particular format.  The function
address@hidden|EXTRACTOR_binaryDecode|} can be used to convert the
-0-terminated string back to the standard binary format.
-
address@hidden EXTRACTOR_binaryEncode
-The @verb{|EXTRACTOR_binaryEncode|} function converts binary data into
-libextractor's internal 0-terminated binary format.  This function is
-mostly useful for writing plugins that need to return binary meta
-data.
-
-
-
 @node Existing Plugins
 @chapter Existing Plugins
 
-HTML,
-PDF,
-PS,
-OLE2 (DOC, XLS, PPT),
-OpenOffice (sxw),
-StarOffice (sdw),
-DVI,
-MAN,
-MP3 (ID3v1 and ID3v2),
-NSF (NES Sound Format),
-SID,
-OGG,
-WAV,
-EXIV2,
-JPEG,
-GIF,
-PNG,
-TIFF,
-DEB,
-RPM,
-TAR(.GZ),
-ZIP,
-ELF,
-REAL,
-RIFF (AVI),
-MPEG,
-QT
-and
-ASF.
address@hidden
address@hidden
+APPLEFILE
address@hidden
+ASF
address@hidden
+DEB
address@hidden
+DVI
address@hidden
+ELF
address@hidden
+EXIV2
address@hidden
+FLAC
address@hidden
+FLV
address@hidden
+GIF
address@hidden
+HTML
address@hidden
+ID3 (v2.0, v2.3, v2.4)
address@hidden
+IT
address@hidden
+JPEG
address@hidden
+OLE2
address@hidden
+thumbnail (GTK, QT or FFMPEG-based)
address@hidden
+MAN
address@hidden
+MIME
address@hidden
+MP3 (ID3v1)
address@hidden
+MPEG
address@hidden
+NSF and NSFE
address@hidden
+ODF
address@hidden
+PNG
address@hidden
+PS (PostScript)
address@hidden
+QT (QuickTime)
address@hidden
+REAL
address@hidden
+RIFF
address@hidden
+RPM
address@hidden 
+S3M
address@hidden
+SID
address@hidden
+TAR
address@hidden
+TIFF
address@hidden
+WAV
address@hidden
+XM
address@hidden
+ZIP
address@hidden itemize
 
address@hidden and @file{bzip2} compressed versions of these formats are 
+also supported (as well as meta data embedded by @file{gzip} itself).
 
 @node Writing new Plugins
 @chapter Writing new Plugins
@@ -600,60 +687,66 @@
 method @verb{|libextractor_XXX_extract|}, with the following 
 signature:
 @verbatim
-struct EXTRACTOR_Keywords *
-libextractor_XXX_extract
-   (const char * filename,
-    const char * data,
-    size_t size,
-    struct EXTRACTOR_Keywords * prev,
+int
+EXTRACTOR_XXX_extract
+   (const char *data,
+    size_t data_size,
+    EXTRACTOR_MetaDataProcessor proc,
+    void *proc_cls,
     const char * options);
 @end verbatim
 
-The argument @samp{filename} specifies the name of the file being
-processed and maybe @verb{|NULL|}.  @samp{data} is a pointer to 
-the typically memory mapped contents of the file.  Note that 
-plugins cannot ignore the @verb{|const|} annotation since the
-memory mapping may have been done read-only (and thus writes 
-to this page will result in an error).  The @samp{size} argument
-specifies the size of the @samp{data} buffer in bytes.  
address@hidden is a pointer to the typically memory mapped contents of
+the file.  Note that plugins cannot ignore the @verb{|const|}
+annotation since the memory mapping may have been done read-only (and
+thus writes to this page will result in an error).  The @samp{data_size}
+argument specifies the size of the @samp{data} buffer in bytes.
 
address@hidden is the list of keywords extracted so far by other 
-plugins for the file.  The function is expected to return an 
-updated list of keywords.  If the format does not match the 
-expectations of the plugin, @samp{prev} is returned.  Most 
-plugins use a function such as @verb{|addKeyword|} to extend the list:
address@hidden should be called on each meta data item found.  If @samp{proc} 
+returns non-zero, processing should be aborted and the @code{extract}
+function must return 1.  Otherwise @code{extract} should always return zero.
 
address@hidden
-static void addKeyword
-   (struct EXTRACTOR_Keywords ** list,
-    const char * keyword,
-    EXTRACTOR_KeywordType type)
-{
-  EXTRACTOR_KeywordList * next;
-  next = malloc(sizeof(EXTRACTOR_KeywordList));
-  next->next = *list;
-  next->keyword = strdup(keyword);
-  next->keywordType = type;
-  *list = next;
-}
address@hidden verbatim
 
-A typical use of @verb{|addKeyword|} is to add the MIME type once the
-file format has been established (beyond reasonable doubt).
+In order to test new plugins, the @file{extract} command can be run
+with the options ``-ni'' and ``-l XXX'' .  This will run the plugin
+in-process (making it easier to debug) and without any of the other
+plugins.
 
 
-
 @node Internal utility functions
 @chapter Internal utility functions
 
+Some plugins link against the @code{libextractor_common} library which
+provides common abstractions needed by many plugins.  This section
+documents this internal API for plugin developers.  Note that the headers
+for this library are (intentionally) not installed: we do not consider
+this API stable and it should hence only be used by plugins that are 
+build and shipped with GNU libextractor.  Third-party plugins should
+not use it.
+
address@hidden defines various conversion functions for
+numbers (in particular, byte-order conversion for floating point
+numbers).  
+
address@hidden defines an API for accessing compressed files.
+
address@hidden provides an interpreter for unpacking structs of integer
+numbers from streams and converting from big or little endian to host
+byte order at the same time.
+
address@hidden provides a function for character set conversion described
+below.
+
address@hidden {char *} EXTRACTOR_common_convert_to_utf8(const char *input, 
size_t len, const char * charset)
 @cindex UTF-8
 @cindex character set
 @findex EXTRACTOR_common_convert_to_utf8
-Various @acronym{libextractor} plugins make use of the internal
+Various @le{} plugins make use of the internal
 @file{convert.h} header which defines a function
+
 @verb{|EXTRACTOR_common_convert_to_utf8|} which can be used to easily convert 
text from
 any character set to UTF-8.  This conversion is important since the
-linked list of keywords that is returned by @acronym{libextractor} is
+linked list of keywords that is returned by @le{} is
 expected to contain only UTF-8 strings.  Naturally, proper conversion
 may not always be possible since some file formats fail to specify the
 character set.  In that case, it is often better to not convert at
@@ -667,16 +760,19 @@
 return value from @verb{|EXTRACTOR_common_convert_to_utf8|} is a 
zero-terminated string
 in UTF-8 format.  The responsibility to free the string is with the
 caller, so storing the string in the keyword list is acceptable.
address@hidden deftypefun
 
 
+
+
+
 @node Reporting bugs
 @chapter Reporting bugs
 
 @cindex bug
address@hidden uses the @url{http://gnunet.org/mantis/,Mantis
-bugtracking system}.  If possible, please report bugs there.  You can
-also e-mail the @acronym{libextractor} mailinglist at
address@hidden@@gnu.org}.
address@hidden uses the @url{http://gnunet.org/bugs/,Mantis bugtracking
+system}.  If possible, please report bugs there.  You can also e-mail
+the @le{} mailinglist at @url{libextractor@@gnu.org}.
 
 
 
@@ -702,113 +798,3 @@
 @printindex tp
 
 @bye
-
-
-
-
-Memory allocation functions are of the following types:
address@hidden {Data type} gcry_handler_alloc_t
-This type is defined as: @code{void *(*gcry_handler_alloc_t) (size_t n)}.
address@hidden deftp
address@hidden {Data type} gcry_handler_secure_check_t
-This type is defined as: @code{int *(*gcry_handler_secure_check_t) (const void 
*)}.
address@hidden deftp
address@hidden {Data type} gcry_handler_realloc_t
-This type is defined as: @code{void *(*gcry_handler_realloc_t) (void *p, 
size_t n)}.
address@hidden deftp
address@hidden {Data type} gcry_handler_free_t
-This type is defined as: @code{void *(*gcry_handler_free_t) (void *)}.
address@hidden deftp
-
-
-
-
-
-Example code:
address@hidden
address@hidden
-  gcry_ac_key_pair_t key_pair;
-  gcry_ac_key_spec_rsa  rsa_spec;
-
-  rsa_spec.e = gcry_mpi_new (0);
-  gcry_mpi_set_ui (rsa_spec.e, 1)
-
-  err = gcry_ac_open  (&handle, GCRY_AC_RSA, 0);
-  assert (! err);
-
-  err = gcry_ac_key_pair_generate (handle, &key_pair, 1024, (void *) 
&rsa_spec);
-  assert (! err);
address@hidden
address@hidden example
-
-
-
address@hidden gcry_ac_key_t gcry_ac_key_pair_extract (gcry_ac_key_pair_t 
@var{key_pair}, gcry_ac_key_type_t @var{which})
-Returns the key of type @var{which} out of the key pair
address@hidden
address@hidden deftypefun
-
-
-
-
-Basic arithmetic operations:
-
address@hidden void gcry_mpi_add (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t 
@var{u}}, @w{gcry_mpi_t @var{v}})
-
address@hidden@var{w} = @var{u} + @var{v}}.
address@hidden deftypefun
-
-
-Memory allocation functions are of the following types:
address@hidden {Data type} gcry_handler_alloc_t
-This type is defined as: @code{void *(*gcry_handler_alloc_t) (size_t n)}.
address@hidden deftp
address@hidden {Data type} gcry_handler_secure_check_t
-This type is defined as: @code{int *(*gcry_handler_secure_check_t) (const void 
*)}.
address@hidden deftp
address@hidden {Data type} gcry_handler_realloc_t
-This type is defined as: @code{void *(*gcry_handler_realloc_t) (void *p, 
size_t n)}.
address@hidden deftp
address@hidden {Data type} gcry_handler_free_t
-This type is defined as: @code{void *(*gcry_handler_free_t) (void *)}.
address@hidden deftp
-
-
-
-
-
-Example code:
address@hidden
address@hidden
-  gcry_ac_key_pair_t key_pair;
-  gcry_ac_key_spec_rsa  rsa_spec;
-
-  rsa_spec.e = gcry_mpi_new (0);
-  gcry_mpi_set_ui (rsa_spec.e, 1)
-
-  err = gcry_ac_open  (&handle, GCRY_AC_RSA, 0);
-  assert (! err);
-
-  err = gcry_ac_key_pair_generate (handle, &key_pair, 1024, (void *) 
&rsa_spec);
-  assert (! err);
address@hidden
address@hidden example
-
-
-
address@hidden gcry_ac_key_t gcry_ac_key_pair_extract (gcry_ac_key_pair_t 
@var{key_pair}, gcry_ac_key_type_t @var{which})
-Returns the key of type @var{which} out of the key pair
address@hidden
address@hidden deftypefun
-
-
-
-
-Basic arithmetic operations:
-
address@hidden void gcry_mpi_add (@w{gcry_mpi_t @var{w}}, @w{gcry_mpi_t 
@var{u}}, @w{gcry_mpi_t @var{v}})
-
address@hidden@var{w} = @var{u} + @var{v}}.
address@hidden deftypefun
-
-

Modified: Extractor/doc/mdate-sh
===================================================================
--- Extractor/doc/mdate-sh      2010-01-01 16:00:27 UTC (rev 9952)
+++ Extractor/doc/mdate-sh      2010-01-01 19:39:46 UTC (rev 9953)
@@ -1,10 +1,10 @@
 #!/bin/sh
 # Get modification time of a file or directory and pretty-print it.
 
-scriptversion=2007-03-30.02
+scriptversion=2009-04-28.21; # UTC
 
-# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007 Free Software
-# Foundation, Inc.
+# Copyright (C) 1995, 1996, 1997, 2003, 2004, 2005, 2007, 2009 Free
+# Software Foundation, Inc.
 # written by Ulrich Drepper <address@hidden>, June 1995
 #
 # This program is free software; you can redistribute it and/or modify
@@ -18,8 +18,7 @@
 # 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.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -201,5 +200,6 @@
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
 # End:

Modified: Extractor/doc/texinfo.tex
===================================================================
--- Extractor/doc/texinfo.tex   2010-01-01 16:00:27 UTC (rev 9952)
+++ Extractor/doc/texinfo.tex   2010-01-01 19:39:46 UTC (rev 9953)
@@ -3,11 +3,11 @@
 % 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}
+\def\texinfoversion{2009-05-16.16}
 %
-% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, 2007,
+% Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-% 2007 Free Software Foundation, Inc.
+% 2007, 2008, 2009 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
@@ -97,6 +97,10 @@
 \let\ptexslash=\/
 \let\ptexstar=\*
 \let\ptext=\t
+\let\ptextop=\top
+{\catcode`\'=\active
+\global\let\ptexquoteright'}% Math-mode def from plain.tex.
+\let\ptexraggedright=\raggedright
 
 % If this character appears in an error message or help string, it
 % starts a new line in the output.
@@ -354,7 +358,7 @@
                % 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 
+               % it needs to be
                % {\code {{\tt \backslashcurfont }acronym}
     \shipout\vbox{%
       % Do this early so pdf references go to the beginning of the page.
@@ -460,7 +464,7 @@
 \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.
+% Each occurrence of `\^^M' or `<space>\^^M' is replaced by a single space.
 %
 % \argremovec might leave us with trailing space, e.g.,
 %    @end itemize  @c foo
@@ -485,7 +489,7 @@
 % 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
+% (Similarly, 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.
 %
@@ -542,12 +546,12 @@
 % 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
+% are not treated as environments; 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:
+% At run-time, environments start with this:
 \def\startenvironment#1{\begingroup\def\thisenv{#1}}
 % initialize
 \let\thisenv\empty
@@ -565,7 +569,7 @@
   \fi
 }
 
-% Evironment mismatch, #1 expected:
+% Environment mismatch, #1 expected:
 \def\badenverr{%
   \errhelp = \EMsimple
   \errmessage{This command can appear only \inenvironment\temp,
@@ -649,8 +653,8 @@
 \def\jmacro{j}
 \def\dotless#1{%
   \def\temp{#1}%
-  \ifx\temp\imacro \ptexi
-  \else\ifx\temp\jmacro \j
+  \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi
+  \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi
   \else address@hidden can be used only with i or j}%
   \fi\fi
 }
@@ -705,7 +709,7 @@
 \def\?{?\spacefactor=\endofsentencespacefactor\space}
 
 % @frenchspacing on|off  says whether to put extra space after punctuation.
-% 
+%
 \def\onword{on}
 \def\offword{off}
 %
@@ -916,15 +920,20 @@
   \temp
 }
 
-% @include file    insert text of that file as input.
+% @include FILE -- \input text of FILE.
 %
 \def\include{\parseargusing\filenamecatcodes\includezzz}
 \def\includezzz#1{%
   \pushthisfilestack
   \def\thisfile{#1}%
   {%
-    \makevalueexpandable
-    \def\temp{\input #1 }%
+    \makevalueexpandable  % we want to expand any @value in FILE.
+    \turnoffactive        % and allow special characters in the expansion
+    \indexnofonts         % Allow `@@' and other weird things in file names.
+    \edef\temp{\noexpand\input #1 }%
+    %
+    % This trickery is to read FILE outside of a group, in case it makes
+    % definitions, etc.
     \expandafter
   }\temp
   \popthisfilestack
@@ -939,6 +948,8 @@
   \catcode`>=\other
   \catcode`+=\other
   \catcode`-=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
 }
 
 \def\pushthisfilestack{%
@@ -1114,6 +1125,16 @@
   \mathunderscore
   \let\\ = \mathbackslash
   \mathactive
+  % make the texinfo accent commands work in math mode
+  \let\"=\ddot
+  \let\'=\acute
+  \let\==\bar
+  \let\^=\hat
+  \let\`=\grave
+  \let\u=\breve
+  \let\v=\check
+  \let\~=\tilde
+  \let\dotaccent=\dot
   $\finishmath
 }
 \def\finishmath#1{#1$\endgroup}  % Close the group opened by \tex.
@@ -1127,17 +1148,21 @@
   \catcode`< = \active
   \catcode`> = \active
   \catcode`+ = \active
+  \catcode`' = \active
   \gdef\mathactive{%
     \let^ = \ptexhat
     \let< = \ptexless
     \let> = \ptexgtr
     \let+ = \ptexplus
+    \let' = \ptexquoteright
   }
 }
 
-% @bullet and @minus need the same treatment as @math, just above.
+% Some math mode symbols.
 \def\bullet{$\ptexbullet$}
-\def\minus{$-$}
+\def\geq{\ifmmode \ge\else $\ge$\fi}
+\def\leq{\ifmmode \le\else $\le$\fi}
+\def\minus{\ifmmode -\else $-$\fi}
 
 % @dots{} outputs an ellipsis using the current font.
 % We do .5em per period so that it has the same spacing in the cm
@@ -1260,7 +1285,7 @@
 % that's what we do).
 
 % double active backslashes.
-% 
+%
 address@hidden \catcode`\\=\active
  @address@hidden
    @address@hidden@active
@@ -1272,11 +1297,11 @@
 % 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%
@@ -1311,7 +1336,10 @@
   \def\cmykDarkRed{0.28 1 1 0.35}
   \def\cmykBlack{0 0 0 1}
   %
-  \def\pdfsetcolor#1{\pdfliteral{#1 k}}
+  % k sets the color for filling (usual text, etc.);
+  % K sets the color for stroking (thin rules, e.g., normal _'s).
+  \def\pdfsetcolor#1{\pdfliteral{#1 k  #1 K}}
+  %
   % Set color, and create a mark which defines \thiscolor accordingly,
   % so that \makeheadline knows which color to restore.
   \def\setcolor#1{%
@@ -1362,8 +1390,11 @@
           \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}%
+                \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{pdf}%
               \fi
             \else \gdef\pdfimgext{JPG}%
@@ -1377,7 +1408,7 @@
       \closein 1
     \endgroup
     %
-    % without \immediate, pdftex seg faults when the same image is
+    % without \immediate, ancient pdftex seg faults when the same image is
     % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
     \ifnum\pdftexversion < 14
       \immediate\pdfimage
@@ -1542,11 +1573,15 @@
       % 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
       address@hidden@}%
       \let\/=\empty
       \makevalueexpandable
+      % do we want to go so far as to use \indexnofonts instead of just
+      % special-casing \var here?
+      \def\var##1{##1}%
+      %
       \leavevmode\setcolor{\urlcolor}%
       \startlink attr{/Border [0 0 0]}%
         user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
@@ -1577,6 +1612,7 @@
     \setcolor{\linkcolor}#1\endlink}
   \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
 \else
+  % non-pdf mode
   \let\pdfmkdest = \gobble
   \let\pdfurl = \gobble
   \let\endlink = \relax
@@ -1607,6 +1643,10 @@
 \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf}
 \def\tt{\fam=\ttfam \setfontstyle{tt}}
 
+% Unfortunately, we have to override this for titles and the like, since
+% in those cases "rm" is bold.  Sigh.
+\def\rmisbold{\rm\def\curfontstyle{bf}}
+
 % Texinfo sort of supports the sans serif font style, which plain TeX does not.
 % So we set up a \sf.
 \newfam\sffam
@@ -1941,7 +1981,7 @@
 
 % Definitions for a main text size of 11pt.  This is the default in
 % Texinfo.
-% 
+%
 \def\definetextfontsizexi{%
 % Text fonts (11.2pt, magstep1).
 \def\textnominalsize{11pt}
@@ -2004,8 +2044,6 @@
 \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).
@@ -2074,7 +2112,7 @@
 % 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}
@@ -2137,8 +2175,6 @@
 \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).
@@ -2165,7 +2201,7 @@
 \setfont\secsf\sfbshape{12}{1000}{OT1}
 \let\secbf\secrm
 \setfont\secsc\scbshape{10}{\magstep1}{OT1}
-\font\seci=cmmi12 
+\font\seci=cmmi12
 \font\secsy=cmsy10 scaled \magstep1
 \def\sececsize{1200}
 
@@ -2209,7 +2245,7 @@
 % 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}
 %
@@ -2219,7 +2255,7 @@
   %
   % 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
@@ -2270,7 +2306,7 @@
   \def\curfontsize{title}%
   \def\lsize{chap}\def\lllsize{subsec}%
   \resetmathfonts \setleading{25pt}}
-\def\titlefont#1{{\titlefonts\rm #1}}
+\def\titlefont#1{{\titlefonts\rmisbold #1}}
 \def\chapfonts{%
   \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
   \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
@@ -2321,6 +2357,16 @@
   \def\lsize{smaller}\def\lllsize{smaller}%
   \resetmathfonts \setleading{9.5pt}}
 
+% 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}
+
+% Define these just so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
 % Set the fonts to use with the @small... environments.
 \let\smallexamplefonts = \smallfonts
 
@@ -2334,28 +2380,128 @@
 %
 % 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$}
 
+\message{markup,}
+
+% 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 }
+
+% Markup style infrastructure.  \defmarkupstylesetup\INITMACRO will
+% define and register \INITMACRO to be called on markup style changes.
+% \INITMACRO can check \currentmarkupstyle for the innermost
+% style and the set of \ifmarkupSTYLE switches for all styles
+% currently in effect.
+\newif\ifmarkupvar
+\newif\ifmarkupsamp
+\newif\ifmarkupkey
+%\newif\ifmarkupfile % @file == @samp.
+%\newif\ifmarkupoption % @option == @samp.
+\newif\ifmarkupcode
+\newif\ifmarkupkbd
+%\newif\ifmarkupenv % @env == @code.
+%\newif\ifmarkupcommand % @command == @code.
+\newif\ifmarkuptex % @tex (and part of @math, for now).
+\newif\ifmarkupexample
+\newif\ifmarkupverb
+\newif\ifmarkupverbatim
+
+\let\currentmarkupstyle\empty
+
+\def\setupmarkupstyle#1{%
+  \csname markup#1true\endcsname
+  \def\currentmarkupstyle{#1}%
+  \markupstylesetup
+}
+
+\let\markupstylesetup\empty
+
+\def\defmarkupstylesetup#1{%
+  \expandafter\def\expandafter\markupstylesetup
+    \expandafter{\markupstylesetup #1}%
+  \def#1%
+}
+
+% Markup style setup for left and right quotes.
+\defmarkupstylesetup\markupsetuplq{%
+  \expandafter\let\expandafter \temp \csname 
markupsetuplq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuplqdefault \else \temp \fi
+}
+
+\defmarkupstylesetup\markupsetuprq{%
+  \expandafter\let\expandafter \temp \csname 
markupsetuprq\currentmarkupstyle\endcsname
+  \ifx\temp\relax \markupsetuprqdefault \else \temp \fi
+}
+
+{
+\catcode`\'=\active
+\catcode`\`=\active
+
+\gdef\markupsetuplqdefault{\let`\lq}
+\gdef\markupsetuprqdefault{\let'\rq}
+
+\gdef\markupsetcodequoteleft{\let`\codequoteleft}
+\gdef\markupsetcodequoteright{\let'\codequoteright}
+
+\gdef\markupsetnoligaturesquoteleft{\let`\noligaturesquoteleft}
+}
+
+\let\markupsetuplqcode \markupsetcodequoteleft
+\let\markupsetuprqcode \markupsetcodequoteright
+\let\markupsetuplqexample \markupsetcodequoteleft
+\let\markupsetuprqexample \markupsetcodequoteright
+\let\markupsetuplqverb \markupsetcodequoteleft
+\let\markupsetuprqverb \markupsetcodequoteright
+\let\markupsetuplqverbatim \markupsetcodequoteleft
+\let\markupsetuprqverbatim \markupsetcodequoteright
+
+\let\markupsetuplqsamp \markupsetnoligaturesquoteleft
+\let\markupsetuplqkbd \markupsetnoligaturesquoteleft
+
+% 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
+      % [Knuth] pp. 380,381,391
+      % \relax disables Spanish ligatures ?` and !` of \tt font.
+      \relax`%
+    \else \char'22 \fi
+  \else \char'22 \fi
+}
+
+% [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font.
+\def\noligaturesquoteleft{\relax\lq}
+
 % 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
 
@@ -2370,17 +2516,22 @@
 % @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
+% @cite is 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
+\def\var#1{{\setupmarkupstyle{var}\smartslanted{#1}}}
 \let\dfn=\smartslanted
 \let\emph=\smartitalic
 
-% @b, explicit bold.
+% 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
+
+% @b, explicit bold.  Also @strong.
 \def\b#1{{\bf #1}}
 \let\strong=\b
 
@@ -2412,22 +2563,35 @@
 address@hidden
 \def\endofsentencespacefactor{3000}% default
 
+% @t, explicit typewriter.
 \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}
+
+% @samp.
+\def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}}
+
+% definition of @key that produces a lozenge.  Doesn't adjust to text size.
+%\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}}}}
+
+% definition of @key with no lozenge.  If the current font is already
+% monospace, don't change it; that way, we respect @kbdinputstyle.  But
+% if it isn't monospace, then use \tt.
+%
+\def\key#1{{\setupmarkupstyle{key}%
+  \nohyphenation
+  \ifmonospace\else\tt\fi
+  #1}\null}
+
+% ctrl is no longer a Texinfo command.
 \def\ctrl #1{{\tt \rawbackslash \hat}#1}
 
 % @file, @option are the same as @samp.
@@ -2469,11 +2633,11 @@
 {
   \catcode`\-=\active \catcode`\_=\active
   \catcode`\'=\active \catcode`\`=\active
+  \global\let'=\rq \global\let`=\lq  % default definitions
   %
   \global\def\code{\begingroup
-    \catcode\rquoteChar=\active \catcode\lquoteChar=\active
-    \let'\codequoteright \let`\codequoteleft
-    %
+    \setupmarkupstyle{code}%
+    % The following should really be moved into \setupmarkupstyle handlers.
     \catcode\dashChar=\active  \catcode\underChar=\active
     \ifallowcodebreaks
      \let-\codedash
@@ -2505,7 +2669,7 @@
 % 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}
@@ -2525,6 +2689,7 @@
 
 % @kbd is like @code, except that if the argument is just one @key command,
 % then @kbd has no effect.
+\def\kbd#1{{\setupmarkupstyle{kbd}\def\look{#1}\expandafter\kbdfoo\look??\par}}
 
 % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
 %   `example' (@kbd uses ttsl only inside of @example and friends),
@@ -2546,20 +2711,27 @@
 \def\wordexample{example}
 \def\wordcode{code}
 
-% Default is `distinct.'
+% 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}
+\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi
+\else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi}
 
 % For @indicateurl, @env, @command quotes seem unnecessary, so use \code.
 \let\indicateurl=\code
 \let\env=\code
 \let\command=\code
 
+% @clicksequence{File @click{} Open ...}
+\def\clicksequence#1{\begingroup #1\endgroup}
+
+% @clickstyle @arrow   (by default)
+\parseargdef\clickstyle{\def\click{#1}}
+\def\click{\arrow}
+
 % @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
@@ -2609,34 +2781,20 @@
   \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}%
@@ -2648,7 +2806,7 @@
 
 % @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}%
@@ -2658,6 +2816,44 @@
   \fi
 }
 
+
+\message{glyphs,}
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, they should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}}
+\def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\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}
+
 % @pounds{} is a sterling sign, which Knuth put in the CM italic font.
 %
 \def\pounds{{\it\$}}
@@ -2667,52 +2863,59 @@
 % 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 
+  \ifx\curfontstyle\bfstylename
     % bold:
     \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize
-  \else 
+  \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.
+% Glyphs from the EC fonts.  We don't use \let for the aliases, because
+% sometimes we redefine the original macro, and the alias should reflect
+% the redefinition.
+%
+% Use LaTeX names for the Icelandic letters.
+\def\DH{{\ecfont \char"D0}} % Eth
+\def\dh{{\ecfont \char"F0}} % eth
+\def\TH{{\ecfont \char"DE}} % Thorn
+\def\th{{\ecfont \char"FE}} % thorn
+%
 \def\guillemetleft{{\ecfont \char"13}}
 \def\guillemotleft{\guillemetleft}
 \def\guillemetright{{\ecfont \char"14}}
@@ -2722,8 +2925,36 @@
 \def\quotedblbase{{\ecfont \char"12}}
 \def\quotesinglbase{{\ecfont \char"0D}}
 %
+% This positioning is not perfect (see the ogonek LaTeX package), but
+% we have the precomposed glyphs for the most common cases.  We put the
+% tests to use those glyphs in the single \ogonek macro so we have fewer
+% dummy definitions to worry about for index entries, etc.
+%
+% ogonek is also used with other letters in Lithuanian (IOU), but using
+% the precomposed glyphs for those is not so easy since they aren't in
+% the same EC font.
+\def\ogonek#1{{%
+  \def\temp{#1}%
+  \ifx\temp\macrocharA\Aogonek
+  \else\ifx\temp\macrochara\aogonek
+  \else\ifx\temp\macrocharE\Eogonek
+  \else\ifx\temp\macrochare\eogonek
+  \else
+    \ecfont \setbox0=\hbox{#1}%
+    \ifdim\ht0=1ex\accent"0C #1%
+    \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}%
+    \fi
+  \fi\fi\fi\fi
+  }%
+}
+\def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A}
+\def\aogonek{{\ecfont \char"A1}}\def\macrochara{a}
+\def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E}
+\def\eogonek{{\ecfont \char"A6}}\def\macrochare{e}
+%
+% Use the ec* fonts (cm-super in outline format) for non-CM glyphs.
 \def\ecfont{%
-  % We can't distinguish serif/sanserif and italic/slanted, but this
+  % We can't distinguish serif/sans 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.
@@ -2756,7 +2987,7 @@
 % 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
@@ -2851,12 +3082,9 @@
 \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}
+  \leftline{\titlefonts\rmisbold #1}
   % print a rule at the page bottom also.
   \finishedtitlepagefalse
   \vskip4pt \hrule height 4pt width \hsize \vskip4pt
@@ -2877,7 +3105,7 @@
   \else
     \checkenv\titlepage
     \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi
-    {\authorfont \leftline{#1}}%
+    {\secfonts\rmisbold \leftline{#1}}%
   \fi
 }
 
@@ -3105,7 +3333,7 @@
     % 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
@@ -3199,9 +3427,18 @@
   \parindent=0pt
   \parskip=\smallskipamount
   \ifdim\parskip=0pt \parskip=2pt \fi
+  %
+  % Try typesetting the item mark that if the document erroneously says
+  % something like @itemize @samp (intending @table), there's an error
+  % right away at the @itemize.  It's not the best error message in the
+  % world, but it's better than leaving it to the @item.  This means if
+  % the user wants an empty mark, they have to say @w{} not just @w.
   \def\itemcontents{#1}%
+  \setbox0 = \hbox{\itemcontents}%
+  %
   % @itemize with no arg is equivalent to @itemize @bullet.
   \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  %
   \let\item=\itemizeitem
 }
 
@@ -3222,6 +3459,7 @@
    \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
 }
@@ -3443,12 +3681,19 @@
 %
 % @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}%
+% of an alignment entry.  \everycr resets \everytab so we don't have to
+% undo it ourselves.
+\def\headitemfont{\b}% for people to use in the template row; not changeable
+\def\headitem{%
+  \checkenv\multitable
+  \crcr
+  \global\everytab={\bf}% can't use \headitemfont since the parsing differs
+  \the\everytab % for the first item
+}%
 %
 % 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.
+% we again encounter the problem the 1sp was intended to solve.
 %                                      --karl, address@hidden, 20apr99.
 \def\tab{\checkenv\multitable &\the\everytab}%
 
@@ -3847,11 +4092,11 @@
 \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
+  \expandafter \ifx\csname donesynindex#2\endcsname \relax
     % 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
+    \expandafter\let\csname donesynindex#2\endcsname = 1
   \fi
   % redefine \fooindfile:
   \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
@@ -3901,7 +4146,7 @@
   % 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}
@@ -3909,12 +4154,12 @@
   % @end macro
   % ...
   % @funindex commtest
-  % 
+  %
   % The above is not enough to reproduce the bug, but it gives the flavor.
-  % 
+  %
   % Sample whatsit resulting:
   % address@hidden@folio address@hidden address@hidden }}}
-  % 
+  %
   % So:
   \let\endinput = \empty
   %
@@ -3966,19 +4211,23 @@
   % Non-English letters.
   \definedummyword\AA
   \definedummyword\AE
+  \definedummyword\DH
   \definedummyword\L
+  \definedummyword\O
   \definedummyword\OE
-  \definedummyword\O
+  \definedummyword\TH
   \definedummyword\aa
   \definedummyword\ae
+  \definedummyword\dh
+  \definedummyword\exclamdown
   \definedummyword\l
+  \definedummyword\o
   \definedummyword\oe
-  \definedummyword\o
-  \definedummyword\ss
-  \definedummyword\exclamdown
-  \definedummyword\questiondown
   \definedummyword\ordf
   \definedummyword\ordm
+  \definedummyword\questiondown
+  \definedummyword\ss
+  \definedummyword\th
   %
   % Although these internal commands shouldn't show up, sometimes they do.
   \definedummyword\bf
@@ -4009,6 +4258,7 @@
   \definedummyword\guilsinglright
   \definedummyword\expansion
   \definedummyword\minus
+  \definedummyword\ogonek
   \definedummyword\pounds
   \definedummyword\point
   \definedummyword\print
@@ -4052,6 +4302,7 @@
   \definedummyword\v
   \definedummyword\H
   \definedummyword\dotaccent
+  \definedummyword\ogonek
   \definedummyword\ringaccent
   \definedummyword\tieaccent
   \definedummyword\ubaraccent
@@ -4119,19 +4370,23 @@
   % Non-English letters.
   \def\AA{AA}%
   \def\AE{AE}%
+  \def\DH{DZZ}%
   \def\L{L}%
   \def\OE{OE}%
   \def\O{O}%
+  \def\TH{ZZZ}%
   \def\aa{aa}%
   \def\ae{ae}%
+  \def\dh{dzz}%
+  \def\exclamdown{!}%
   \def\l{l}%
   \def\oe{oe}%
+  \def\ordf{a}%
+  \def\ordm{o}%
   \def\o{o}%
+  \def\questiondown{?}%
   \def\ss{ss}%
-  \def\exclamdown{!}%
-  \def\questiondown{?}%
-  \def\ordf{a}%
-  \def\ordm{o}%
+  \def\th{zzz}%
   %
   \def\LaTeX{LaTeX}%
   \def\TeX{TeX}%
@@ -4141,20 +4396,19 @@
   \def\bullet{bullet}%
   \def\comma{,}%
   \def\copyright{copyright}%
-  \def\registeredsymbol{R}%
   \def\dots{...}%
   \def\enddots{...}%
   \def\equiv{==}%
   \def\error{error}%
   \def\euro{euro}%
+  \def\expansion{==>}%
   \def\guillemetleft{<<}%
   \def\guillemetright{>>}%
   \def\guilsinglleft{<}%
   \def\guilsinglright{>}%
-  \def\expansion{==>}%
   \def\minus{-}%
+  \def\point{.}%
   \def\pounds{pounds}%
-  \def\point{.}%
   \def\print{-|}%
   \def\quotedblbase{"}%
   \def\quotedblleft{"}%
@@ -4162,19 +4416,20 @@
   \def\quoteleft{`}%
   \def\quoteright{'}%
   \def\quotesinglbase{,}%
+  \def\registeredsymbol{R}%
   \def\result{=>}%
-  \def\textdegree{degrees}%
+  \def\textdegree{o}%
   %
   % 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
 }
 
@@ -4302,7 +4557,7 @@
     % 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.
@@ -4432,7 +4687,7 @@
 %
 % A straightforward implementation would start like this:
 %      \def\entry#1#2{...
-% But this frozes the catcodes in the argument, and can cause problems to
+% But this freezes 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.
 %
@@ -4883,7 +5138,9 @@
   \gdef\chaplevelprefix{\the\chapno.}%
   \resetallfloatnos
   %
-  \message{\putwordChapter\space \the\chapno}%
+  % \putwordChapter can contain complex things in translations.
+  \toks0=\expandafter{\putwordChapter}%
+  \message{\the\toks0 \space \the\chapno}%
   %
   % Write the actual heading.
   \chapmacro{#1}{Ynumbered}{\the\chapno}%
@@ -4894,15 +5151,17 @@
   \global\let\subsubsection = \numberedsubsubsec
 }
 
-\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls 
appendixzzz
+\outer\parseargdef\appendix{\apphead0{#1}} % normally 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}%
+  % \putwordAppendix can contain complex things in translations.
+  \toks0=\expandafter{\putwordAppendix}%
+  \message{\the\toks0 \space \appendixletter}%
   %
   \chapmacro{#1}{Yappendix}{\appendixletter}%
   %
@@ -5034,7 +5293,6 @@
 %       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
@@ -5043,8 +5301,8 @@
 \def\chapheading{\chapbreak \parsearg\chapheadingzzz}
 \def\chapheadingzzz#1{%
   {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                    \parindent=0pt\raggedright
-                    \rm #1\hfill}}%
+                    \parindent=0pt\ptexraggedright
+                    \rmisbold #1\hfill}}%
   \bigskip \par\penalty 200\relax
   \suppressfirstparagraphindent
 }
@@ -5136,7 +5394,10 @@
     \xdef\lastchapterdefs{%
       \gdef\noexpand\thischaptername{\the\toks0}%
       \gdef\noexpand\thischapternum{\appendixletter}%
-      \gdef\noexpand\thischapter{\putwordAppendix{} \noexpand\thischapternum:
+      % \noexpand\putwordAppendix avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordAppendix{}
+                                 \noexpand\thischapternum:
                                  \noexpand\thischaptername}%
     }%
   \else
@@ -5144,7 +5405,10 @@
     \xdef\lastchapterdefs{%
       \gdef\noexpand\thischaptername{\the\toks0}%
       \gdef\noexpand\thischapternum{\the\chapno}%
-      \gdef\noexpand\thischapter{\putwordChapter{} \noexpand\thischapternum:
+      % \noexpand\putwordChapter avoids expanding indigestible
+      % commands in some of the translations.
+      \gdef\noexpand\thischapter{\noexpand\putwordChapter{}
+                                 \noexpand\thischapternum:
                                  \noexpand\thischaptername}%
     }%
   \fi\fi\fi
@@ -5163,7 +5427,7 @@
   \domark
   %
   {%
-    \chapfonts \rm
+    \chapfonts \rmisbold
     %
     % Have to define \lastsection before calling \donoderef, because the
     % xref code eventually uses it.  On the other hand, it has to be called
@@ -5200,7 +5464,7 @@
     %
     % Typeset the actual heading.
     \nobreak % Avoid page breaks at the interline glue.
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
           \hangindent=\wd0 \centerparametersmaybe
           \unhbox0 #1\par}%
   }%
@@ -5224,8 +5488,8 @@
 %
 \def\unnchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
-                       \parindent=0pt\raggedright
-                       \rm #1\hfill}}\bigskip \par\nobreak
+                       \parindent=0pt\ptexraggedright
+                       \rmisbold #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}}%
@@ -5234,7 +5498,7 @@
 \def\centerchfopen #1{%
 \chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
                        \parindent=0pt
-                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+                       \hfill {\rmisbold #1}\hfill}}\bigskip \par\nobreak
 }
 \def\CHAPFopen{%
   \global\let\chapmacro=\chfopen
@@ -5267,7 +5531,7 @@
 \def\sectionheading#1#2#3#4{%
   {%
     % Switch to the right set of fonts.
-    \csname #2fonts\endcsname \rm
+    \csname #2fonts\endcsname \rmisbold
     %
     \def\sectionlevel{#2}%
     \def\temptype{#3}%
@@ -5287,7 +5551,10 @@
         \xdef\lastsectiondefs{%
           \gdef\noexpand\thissectionname{\the\toks0}%
           \gdef\noexpand\thissectionnum{#4}%
-          \gdef\noexpand\thissection{\putwordSection{} 
\noexpand\thissectionnum:
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
                                      \noexpand\thissectionname}%
         }%
       \fi
@@ -5297,12 +5564,20 @@
         \xdef\lastsectiondefs{%
           \gdef\noexpand\thissectionname{\the\toks0}%
           \gdef\noexpand\thissectionnum{#4}%
-          \gdef\noexpand\thissection{\putwordSection{} 
\noexpand\thissectionnum:
+          % \noexpand\putwordSection avoids expanding indigestible
+          % commands in some of the translations.
+          \gdef\noexpand\thissection{\noexpand\putwordSection{}
+                                     \noexpand\thissectionnum:
                                      \noexpand\thissectionname}%
         }%
       \fi
     \fi\fi\fi
     %
+    % Go into vertical mode.  Usually we'll already be there, but we
+    % don't want the following whatsit to end up in a preceding paragraph
+    % if the document didn't happen to have a blank line.
+    \par
+    %
     % Output the mark.  Pass it through \safewhatsit, to take care of
     % the preceding space.
     \safewhatsit\domark
@@ -5352,7 +5627,7 @@
     \nobreak
     %
     % Output the actual section heading.
-    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright
           \hangindent=\wd0  % zero if no section number
           \unhbox0 #1}%
   }%
@@ -5368,11 +5643,11 @@
   % 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
@@ -5430,7 +5705,7 @@
 % 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
@@ -5480,7 +5755,7 @@
 
 % redefined for the two-volume lispref.  We always output on
 % \jobname.toc even if this is redefined.
-% 
+%
 \def\tocreadfilename{\jobname.toc}
 
 % Normal (long) toc.
@@ -5650,45 +5925,12 @@
 \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{%
+  \setupmarkupstyle{tex}%
   \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
   \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
   \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
@@ -5698,6 +5940,8 @@
   \catcode `\|=\other
   \catcode `\<=\other
   \catcode `\>=\other
+  \catcode`\`=\other
+  \catcode`\'=\other
   \escapechar=`\\
   %
   \let\b=\ptexb
@@ -5717,6 +5961,7 @@
   \let\/=\ptexslash
   \let\*=\ptexstar
   \let\t=\ptext
+  \expandafter \let\csname top\endcsname=\ptextop  % outer
   \let\frenchspacing=\plainfrenchspacing
   %
   \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
@@ -5832,6 +6077,7 @@
 
 % This macro is called at the beginning of all the @example variants,
 % inside a group.
+\newdimen\nonfillparindent
 \def\nonfillstart{%
   \aboveenvbreak
   \hfuzz = 12pt % Don't be fussy
@@ -5839,7 +6085,12 @@
   \let\par = \lisppar % don't ignore blank lines
   \obeylines % each line of input is a line of output
   \parskip = 0pt
+  % Turn off paragraph indentation but redefine \indent to emulate
+  % the normal \indent.
+  \nonfillparindent=\parindent
   \parindent = 0pt
+  \let\indent\nonfillindent
+  %
   \emergencystretch = 0pt % don't try to avoid overfull boxes
   \ifx\nonarrowing\relax
     \advance \leftskip by \lispnarrowing
@@ -5850,6 +6101,24 @@
   \let\exdent=\nofillexdent
 }
 
+\begingroup
+\obeyspaces
+% We want to swallow spaces (but not other tokens) after the fake
+% @indent in our nonfill-environments, where spaces are normally
+% active and set to @tie, resulting in them not being ignored after
+% @indent.
+\gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}%
+\gdef\nonfillindentcheck{%
+\ifx\temp %
+\expandafter\nonfillindentgobble%
+\else%
+\leavevmode\nonfillindentbox%
+\fi%
+}%
+\endgroup
+\def\nonfillindentgobble#1{\nonfillindent}
+\def\nonfillindentbox{\hbox to \nonfillparindent{\hss}}
+
 % 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:
@@ -5898,7 +6167,7 @@
 %
 \maketwodispenvs {lisp}{example}{%
   \nonfillstart
-  \tt\quoteexpand
+  \tt\setupmarkupstyle{example}%
   \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
   \gobble       % eat return
 }
@@ -5936,12 +6205,36 @@
 \let\Eflushright = \afterenvbreak
 
 
+% @raggedright does more-or-less normal line breaking but no right
+% justification.  From plain.tex.
+\envdef\raggedright{%
+  \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax
+}
+\let\Eraggedright\par
+
+\envdef\raggedleft{%
+  \parindent=0pt \leftskip0pt plus2em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedleft\par
+
+\envdef\raggedcenter{%
+  \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em
+  \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt
+  \hbadness=10000 % Last line will usually be underfull, so turn off
+                  % badness reporting.
+}
+\let\Eraggedcenter\par
+
+
 % @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{%
+\def\quotationstart{%
   {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
   \parindent=0pt
   %
@@ -5956,6 +6249,17 @@
   \parsearg\quotationlabel
 }
 
+\envdef\quotation{%
+  \setnormaldispenv
+  \quotationstart
+}
+
+\envdef\smallquotation{%
+  \setsmalldispenv
+  \quotationstart
+}
+\let\Esmallquotation = \Equotation
+
 % We have retained a nonzero parskip for the environment, since we're
 % doing normal filling.
 %
@@ -5991,18 +6295,16 @@
   \do\ \do\\\do\{\do\}\do\$\do\&%
   \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
   \do\<\do\>\do\|address@hidden"%
+  % Don't do the quotes -- if we do, @set txicodequoteundirected and
+  % @set txicodequotebacktick will not have effect on @verb and
+  % @verbatim, and ?` and !` ligatures won't get disabled.
+  %\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
@@ -6014,7 +6316,7 @@
 \def\setupverb{%
   \tt  % easiest (and conventionally used) font for verbatim
   \def\par{\leavevmode\endgraf}%
-  \catcode`\`=\active
+  \setupmarkupstyle{verb}%
   \tabeightspaces
   % Respect line breaks,
   % print special symbols as themselves, and
@@ -6029,34 +6331,7 @@
 \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{%
@@ -6069,13 +6344,6 @@
       \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.
@@ -6085,9 +6353,8 @@
   % Easiest (and conventionally used) font for verbatim
   \tt
   \def\par{\leavevmode\egroup\box0\endgraf}%
-  \catcode`\`=\active
   \tabexpand
-  \quoteexpand
+  \setupmarkupstyle{verbatim}%
   % Respect line breaks,
   % print special symbols as themselves, and
   % make each space count
@@ -6147,6 +6414,7 @@
   {%
     \makevalueexpandable
     \setupverbatim
+    \indexnofonts       % Allow `@@' and other weird things in file names.
     \input #1
     \afterenvbreak
   }%
@@ -6246,7 +6514,7 @@
 \def\Edefun{\endgraf\medbreak}
 
 % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn;
-% the only thing remainnig is to define \deffnheader.
+% the only thing remaining is to define \deffnheader.
 %
 \def\makedefun#1{%
   \expandafter\let\csname E#1\endcsname = \Edefun
@@ -6425,7 +6693,7 @@
   %
   % 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
+  \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}%
   #1%
   \sl\hyphenchar\font=45
 }
@@ -6579,7 +6847,7 @@
 % 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
@@ -6953,20 +7221,22 @@
   %
   % Make link in pdf output.
   \ifpdf
-    \leavevmode
-    \getfilename{#4}%
     {\indexnofonts
      \turnoffactive
+     % This expands tokens, so do it after making catcode changes, so _
+     % etc. don't get their TeX definitions.
+     \getfilename{#4}%
+     %
      % See comments at \activebackslashdouble.
      {\activebackslashdouble \xdef\pdfxrefdest{#1}%
       \backslashparens\pdfxrefdest}%
      %
+     \leavevmode
+     \startlink attr{/Border [0 0 0]}%
      \ifnum\filenamelength>0
-       \startlink attr{/Border [0 0 0]}%
-         goto file{\the\filename.pdf} name{\pdfxrefdest}%
+       goto file{\the\filename.pdf} name{\pdfxrefdest}%
      \else
-       \startlink attr{/Border [0 0 0]}%
-         goto name{\pdfmkpgn{\pdfxrefdest}}%
+       goto name{\pdfmkpgn{\pdfxrefdest}}%
      \fi
     }%
     \setcolor{\linkcolor}%
@@ -7317,7 +7587,7 @@
 % 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
+% Similarly, 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.
 
@@ -7421,15 +7691,19 @@
   % If the image is by itself, center it.
   \ifvmode
     \imagevmodetrue
-    \nobreak\bigskip
+    \nobreak\medskip
     % 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
   %
+  % Leave vertical mode so that indentation from an enclosing
+  % environment such as @quotation is respected.  On the other hand, if
+  % it's at the top level, we don't want the normal paragraph indentation.
+  \noindent
+  %
   % Output the image.
   \ifpdf
     \dopdfimage{#1}{#2}{#3}%
@@ -7440,7 +7714,7 @@
     \epsfbox{#1.eps}%
   \fi
   %
-  \ifimagevmode \egroup \bigbreak \fi  % space after the image
+  \ifimagevmode \medskip \fi  % space after the standalone image
 \endgroup}
 
 
@@ -7712,10 +7986,9 @@
 
 \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.
+% For single-language documents, @documentlanguage is usually given very
+% early, just after @documentencoding.  Single argument is the language
+% (de) or locale (de_DE) abbreviation.
 %
 {
   \catcode`\_ = \active
@@ -7728,31 +8001,60 @@
     \ifeof 1
       \documentlanguagetrywithoutunderscore{#1_\finish}%
     \else
+      \globaldefs = 1  % everything in the txi-LL files needs to persist
       \input txi-#1.tex
     \fi
     \closein 1
-  \endgroup
+  \endgroup % end raw TeX
 \endgroup}
-}
 %
 % If they passed de_DE, and txi-de_DE.tex doesn't exist,
 % try txi-de.tex.
-% 
-\def\documentlanguagetrywithoutunderscore#1_#2\finish{%
+%
+\gdef\documentlanguagetrywithoutunderscore#1_#2\finish{%
   \openin 1 txi-#1.tex
   \ifeof 1
     \errhelp = \nolanghelp
     \errmessage{Cannot read language file txi-#1.tex}%
   \else
+    \globaldefs = 1  % everything in the txi-LL files needs to persist
     \input txi-#1.tex
   \fi
   \closein 1
 }
+}% end of special _ catcode
 %
 \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.}
+is empty.  Maybe you need to install it?  Putting it in the current
+directory should work if nowhere else does.}
 
+% This macro is called from txi-??.tex files; the first argument is the
+% \language name to set (without the "\lang@" prefix), the second and
+% third args are \{left,right}hyphenmin.
+%
+% The language names to pass are determined when the format is built.
+% See the etex.log file created at that time, e.g.,
+% /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log.
+%
+% With TeX Live 2008, etex now includes hyphenation patterns for all
+% available languages.  This means we can support hyphenation in
+% Texinfo, at least to some extent.  (This still doesn't solve the
+% accented characters problem.)
+%
address@hidden
+\def\txisetlanguage#1#2#3{%
+  % do not set the language if the name is undefined in the current TeX.
+  \expandafter\ifx\csname address@hidden \relax
+    \message{no patterns for #1}%
+  \else
+    \global\language = \csname address@hidden
+  \fi
+  % but there is no harm in adjusting the hyphenmin values regardless.
+  \global\lefthyphenmin = #2\relax
+  \global\righthyphenmin = #3\relax
+}
+
+% Helpers for encodings.
 % Set the catcode of characters 128 through 255 to the specified number.
 %
 \def\setnonasciicharscatcode#1{%
@@ -7793,7 +8095,7 @@
      \setnonasciicharscatcode\active
      \lattwochardefs
   %
-  \else \ifx \declaredencoding \latone 
+  \else \ifx \declaredencoding \latone
      \setnonasciicharscatcode\active
      \latonechardefs
   %
@@ -7805,7 +8107,7 @@
      \setnonasciicharscatcode\active
      \utfeightchardefs
   %
-  \else 
+  \else
     \message{Unknown document encoding #1, ignoring.}%
   %
   \fi % utfeight
@@ -7817,7 +8119,7 @@
 
 % 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.
@@ -7830,21 +8132,21 @@
 %
 % Latin1 (ISO-8859-1) character definitions.
 \def\latonechardefs{%
-  \gdef^^a0{~} 
+  \gdef^^a0{~}
   \gdef^^a1{\exclamdown}
-  \gdef^^a2{\missingcharmsg{CENT SIGN}} 
+  \gdef^^a2{\missingcharmsg{CENT SIGN}}
   \gdef^^a3{{\pounds}}
   \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
   \gdef^^a5{\missingcharmsg{YEN SIGN}}
-  \gdef^^a6{\missingcharmsg{BROKEN BAR}} 
+  \gdef^^a6{\missingcharmsg{BROKEN BAR}}
   \gdef^^a7{\S}
-  \gdef^^a8{\"{}} 
-  \gdef^^a9{\copyright} 
+  \gdef^^a8{\"{}}
+  \gdef^^a9{\copyright}
   \gdef^^aa{\ordf}
-  \gdef^^ab{\missingcharmsg{LEFT-POINTING DOUBLE ANGLE QUOTATION MARK}} 
+  \gdef^^ab{\guillemetleft}
   \gdef^^ac{$\lnot$}
-  \gdef^^ad{\-} 
-  \gdef^^ae{\registeredsymbol} 
+  \gdef^^ad{\-}
+  \gdef^^ae{\registeredsymbol}
   \gdef^^af{\={}}
   %
   \gdef^^b0{\textdegree}
@@ -7860,7 +8162,7 @@
   \gdef^^b9{$^1$}
   \gdef^^ba{\ordm}
   %
-  \gdef^^bb{\missingcharmsg{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK}}
+  \gdef^^bb{\guilletright}
   \gdef^^bc{$1\over4$}
   \gdef^^bd{$1\over2$}
   \gdef^^be{$3\over4$}
@@ -7871,7 +8173,7 @@
   \gdef^^c2{\^A}
   \gdef^^c3{\~A}
   \gdef^^c4{\"A}
-  \gdef^^c5{\ringaccent A} 
+  \gdef^^c5{\ringaccent A}
   \gdef^^c6{\AE}
   \gdef^^c7{\cedilla C}
   \gdef^^c8{\`E}
@@ -7883,7 +8185,7 @@
   \gdef^^ce{\^I}
   \gdef^^cf{\"I}
   %
-  \gdef^^d0{\missingcharmsg{LATIN CAPITAL LETTER ETH}}
+  \gdef^^d0{\DH}
   \gdef^^d1{\~N}
   \gdef^^d2{\`O}
   \gdef^^d3{\'O}
@@ -7897,7 +8199,7 @@
   \gdef^^db{\^U}
   \gdef^^dc{\"U}
   \gdef^^dd{\'Y}
-  \gdef^^de{\missingcharmsg{LATIN CAPITAL LETTER THORN}}
+  \gdef^^de{\TH}
   \gdef^^df{\ss}
   %
   \gdef^^e0{\`a}
@@ -7917,7 +8219,7 @@
   \gdef^^ee{\^{\dotless i}}
   \gdef^^ef{\"{\dotless i}}
   %
-  \gdef^^f0{\missingcharmsg{LATIN SMALL LETTER ETH}}
+  \gdef^^f0{\dh}
   \gdef^^f1{\~n}
   \gdef^^f2{\`o}
   \gdef^^f3{\'o}
@@ -7931,7 +8233,7 @@
   \gdef^^fb{\^u}
   \gdef^^fc{\"u}
   \gdef^^fd{\'y}
-  \gdef^^fe{\missingcharmsg{LATIN SMALL LETTER THORN}}
+  \gdef^^fe{\th}
   \gdef^^ff{\"y}
 }
 
@@ -7953,7 +8255,7 @@
 % Latin2 (ISO-8859-2) character definitions.
 \def\lattwochardefs{%
   \gdef^^a0{~}
-  \gdef^^a1{\missingcharmsg{LATIN CAPITAL LETTER A WITH OGONEK}}
+  \gdef^^a1{\ogonek{A}}
   \gdef^^a2{\u{}}
   \gdef^^a3{\L}
   \gdef^^a4{\missingcharmsg{CURRENCY SIGN}}
@@ -7970,8 +8272,8 @@
   \gdef^^af{\dotaccent Z}
   %
   \gdef^^b0{\textdegree}
-  \gdef^^b1{\missingcharmsg{LATIN SMALL LETTER A WITH OGONEK}}
-  \gdef^^b2{\missingcharmsg{OGONEK}}
+  \gdef^^b1{\ogonek{a}}
+  \gdef^^b2{\ogonek{ }}
   \gdef^^b3{\l}
   \gdef^^b4{\'{}}
   \gdef^^b5{\v l}
@@ -7996,14 +8298,14 @@
   \gdef^^c7{\cedilla C}
   \gdef^^c8{\v C}
   \gdef^^c9{\'E}
-  \gdef^^ca{\missingcharmsg{LATIN CAPITAL LETTER E WITH OGONEK}}
+  \gdef^^ca{\ogonek{E}}
   \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^^d0{\DH}
   \gdef^^d1{\'N}
   \gdef^^d2{\v N}
   \gdef^^d3{\'O}
@@ -8012,7 +8314,7 @@
   \gdef^^d6{\"O}
   \gdef^^d7{$\times$}
   \gdef^^d8{\v R}
-  \gdef^^d9{\ringaccent U} 
+  \gdef^^d9{\ringaccent U}
   \gdef^^da{\'U}
   \gdef^^db{\H U}
   \gdef^^dc{\"U}
@@ -8030,14 +8332,14 @@
   \gdef^^e7{\cedilla c}
   \gdef^^e8{\v c}
   \gdef^^e9{\'e}
-  \gdef^^ea{\missingcharmsg{LATIN SMALL LETTER E WITH OGONEK}}
+  \gdef^^ea{\ogonek{e}}
   \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^^f0{\dh}
   \gdef^^f1{\'n}
   \gdef^^f2{\v n}
   \gdef^^f3{\'o}
@@ -8056,11 +8358,11 @@
 }
 
 % 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
@@ -8210,6 +8512,7 @@
   \DeclareUnicodeCharacter{00CE}{\^I}
   \DeclareUnicodeCharacter{00CF}{\"I}
 
+  \DeclareUnicodeCharacter{00D0}{\DH}
   \DeclareUnicodeCharacter{00D1}{\~N}
   \DeclareUnicodeCharacter{00D2}{\`O}
   \DeclareUnicodeCharacter{00D3}{\'O}
@@ -8222,6 +8525,7 @@
   \DeclareUnicodeCharacter{00DB}{\^U}
   \DeclareUnicodeCharacter{00DC}{\"U}
   \DeclareUnicodeCharacter{00DD}{\'Y}
+  \DeclareUnicodeCharacter{00DE}{\TH}
   \DeclareUnicodeCharacter{00DF}{\ss}
 
   \DeclareUnicodeCharacter{00E0}{\`a}
@@ -8241,6 +8545,7 @@
   \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}
   \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}
 
+  \DeclareUnicodeCharacter{00F0}{\dh}
   \DeclareUnicodeCharacter{00F1}{\~n}
   \DeclareUnicodeCharacter{00F2}{\`o}
   \DeclareUnicodeCharacter{00F3}{\'o}
@@ -8253,16 +8558,21 @@
   \DeclareUnicodeCharacter{00FB}{\^u}
   \DeclareUnicodeCharacter{00FC}{\"u}
   \DeclareUnicodeCharacter{00FD}{\'y}
+  \DeclareUnicodeCharacter{00FE}{\th}
   \DeclareUnicodeCharacter{00FF}{\"y}
 
   \DeclareUnicodeCharacter{0100}{\=A}
   \DeclareUnicodeCharacter{0101}{\=a}
   \DeclareUnicodeCharacter{0102}{\u{A}}
   \DeclareUnicodeCharacter{0103}{\u{a}}
+  \DeclareUnicodeCharacter{0104}{\ogonek{A}}
+  \DeclareUnicodeCharacter{0105}{\ogonek{a}}
   \DeclareUnicodeCharacter{0106}{\'C}
   \DeclareUnicodeCharacter{0107}{\'c}
   \DeclareUnicodeCharacter{0108}{\^C}
   \DeclareUnicodeCharacter{0109}{\^c}
+  \DeclareUnicodeCharacter{0118}{\ogonek{E}}
+  \DeclareUnicodeCharacter{0119}{\ogonek{e}}
   \DeclareUnicodeCharacter{010A}{\dotaccent{C}}
   \DeclareUnicodeCharacter{010B}{\dotaccent{c}}
   \DeclareUnicodeCharacter{010C}{\v{C}}
@@ -8410,6 +8720,8 @@
   \DeclareUnicodeCharacter{0233}{\=y}
   \DeclareUnicodeCharacter{0237}{\dotless{j}}
 
+  \DeclareUnicodeCharacter{02DB}{\ogonek{ }}
+
   \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}
   \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}
   \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}
@@ -8791,6 +9103,9 @@
 
 \message{and turning on texinfo input format.}
 
+% DEL is a comment character, in case @c does not suffice.
+\catcode`\^^? = 14
+
 % Define macros to output various characters with catcode for normal text.
 \catcode`\"=\other
 \catcode`\~=\other
@@ -8900,7 +9215,7 @@
 
 % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
 % the literal character `\'.
-% 
+%
 @address@hidden
   @address@hidden
   @let"address@hidden
@@ -8912,6 +9227,8 @@
   @let>address@hidden
   @address@hidden
   @address@hidden %$ font-lock fix
+  @markupsetuplqdefault
+  @markupsetuprqdefault
   @unsepspaces
 }
 
@@ -8946,9 +9263,21 @@
 @address@hidden = @other
 @address@hidden = @other
 
address@hidden Finally, make ` and ' active, so that txicodequoteundirected and
address@hidden txicodequotebacktick work right in, e.g., @address@hidden'}}.  
If we
address@hidden don't make ` and ' active, @code will not get them as active 
chars.
address@hidden Do this last of all since we use ` in the previous @catcode 
assignments.
address@hidden@'address@hidden
address@hidden@address@hidden
address@hidden
address@hidden
 
address@hidden Gnulib now utterly and painfully insists on no trailing 
whitespace.
address@hidden So we have to nuke it.
+
 @c Local variables:
 @c eval: (add-hook 'write-file-hooks 'time-stamp)
address@hidden eval: (add-hook 'write-file-hooks 'nuke-trailing-whitespace)
 @c page-delimiter: "^\\\\message"
 @c time-stamp-start: "def\\\\texinfoversion{"
 @c time-stamp-format: "%:y-%02m-%02d.%02H"

Modified: Extractor/doc/version.texi
===================================================================
--- Extractor/doc/version.texi  2010-01-01 16:00:27 UTC (rev 9952)
+++ Extractor/doc/version.texi  2010-01-01 19:39:46 UTC (rev 9953)
@@ -1,4 +1,4 @@
address@hidden UPDATED 1 October 2009
address@hidden UPDATED-MONTH October 2009
address@hidden UPDATED 1 January 2010
address@hidden UPDATED-MONTH January 2010
 @set EDITION 0.6.0
 @set VERSION 0.6.0





reply via email to

[Prev in Thread] Current Thread [Next in Thread]